PFlow
Cycle Active PFlow Emission
Any long time Particle Flow user knows when you send particles immediately out of the first Event (ie a Spawn Test, Send Out, Age Test, ect.) PFlow likes to have a little tizzy. One quick way to refresh it is to use a quick maxscript to Cycle any active Particle Flow Source events Enables Emission State (the little Light Bulb in the Event header). Just Copy Paste to a new script and evaluate, it will give you the standard customize dialog option to add to a button, keyboard shortcut, quad menu, ect.
macroScript CycleActivePFlowEmission category:"JRandom" toolTip:"Cycle Active PFlow Emission" ( for o in objects where classOf o == PF_Source do if o.Enable_Particles == true then ( o.Enable_Particles = false o.Enable_Particles = true ) )
Quick Tutorial on assign Controllers to Pflow
Just a super quick tutorial on how to assign a Waveform (or any controller for that matter) to the Emission Rate of a PFlow Birth Operator.
Waveform2EmissionRate AVI 6mb – Techsmith Codec TSCC (Here)
For some reason the quicktime has some crappy artifacting and it is twice the size. If anyone is interested: Waveform2EmissionRate QT 13mb
You can stack multiple Waveforms in the same controller to achieve varied rates of birth, for example a large burst of particles the tapers down in steps.
Of course you can keyframe all this by hand with a bezier float controller too if you want 
Musings with Physx Glue
I posted some simple examples of fracturing using PFtools Box#2 PhysX Glue.
They can be found Here
![]()
Fume Waterfall test
Still needs a bunch of work to get the look right. Just a quick render is too see how it looks in motion.

Couple More Fume Tests
First one planetary impacts. This use pflow to set the fume containers at the particle impact points on the planet. Messy, messy, messy maxscript way to get it to work will have to find a better approach. EDIT: And I found one
…
This version runs the final update script and another script operator for impact timing.
Final Update script: Clone your grids with a more unique name easy trackability…
global theGrids pf_node_current = particleFlow.scriptRunner() if (pf_node_current != undefined) then ( count = pf_node_current.NumParticles() theGrids = $CL_FumeFX* as array--the name of your copied fume containers theGrids.pos = [0,0,-10000] --set the positions so they are off screen when not in use minCount = amin #(count, theGrids.count) for i in 1 to minCount do ( pf_node_current.particleID = i theGrids[i].transform = pf_node_current.particleTM ) )
Then the script operator for impact timing: this should go in the event that the collision occurs. ie the next event wired to say a collision op. or find target.
on ChannelsUsed pCont do() on Init pCont do ( global rlTime global curTime ) on Proceed pCont do ( p = pCont.particleID count = pCont.NumParticles() for i = 1 to count do ( --print p theGrids[p].playFrom = 0 rlTime = slidertime as integer curTime = rlTime/ticksperframe theGrids[p].playFrom = curTime - (curtime*2) -- Impact time start playback --print theGrids[p].playFrom ) ) on Release pCont do()
Be sure to use a cache op. set to View/Render Intgration step, this will ensure that the grid impact times are correct. I noticed if I didn’t use a cache the impact times were off, which makes sense since the playFrom time isn’t initialized correctly until playback has run through the timeline at least once.

Not sure if you can write to the Final step update script through maxscript, you can turn it on/off but that’s about it AFAIK. You can create the script op through maxscript. Another note you cannot use a scale operator in the flow this will jack the grid transforms and the grids will not render properly.

An attemtp to get fumeFX to look like white water. Waiting to see what the krakatoa renders look like

Box#2 R&D
This thing is really getting there. Oleg is doing a fine job getting things rolling.
Simple test, kinda liked it so I thought I’d post it.
Coins QT 12mb

Birth Script Interval
A quick simple way to set the rate and interval of Particle Flow birth script.
on ChannelsUsed pCont do
(
pCont.useTime = true
)
on Init pCont do
(
)
on Proceed pCont do
(
t2 = pCont.getTimeEnd()
rate = 100 -- rate of emission
if (t2 < 20) do -- emit from 0 to 20
(
for i = 1 to rate do
(
pCont.AddParticle()
)
)
if (t2 > 40) and (t2 < 50) do -- emit from 40 to 50
(
for i = 1 to rate do
(
pCont.AddParticle()
)
)
if (t2 > 60) and (t2 < 70) do -- emit from 60 to 70
(
for i = 1 to rate do
(
pCont.AddParticle()
)
)
if (t2 > 90) and (t2 < 100) do -- emit from 90 to 100
(
for i = 1 to rate do
(
pCont.AddParticle()
)
)
)
on Release pCont do
(
)
Script – PFlow Viewport Multiplier Switcher
Well got real tired of clicking on every particle source and changing the multiplier to get the amount I wanted in the viewport, so I wrote this just for that.

Pflow Material ID Inheritance
Oops, How about I just leaked some of the new Particle Flow Tools functionality…Well something great to look forward to anyway…
Material Inheritance, get excited people the new PFTools is going to be great!


