MAXScript Extensions > MAXScript Extensions for Particle Flow > Particle Flow Script Examples > Script Operators >

# Script Operator Example

| Particle Flow - Quick Navigation

Description:

The following example shows the default Script Operator script with detailed comments.

Can Be Used With:

Used by the Script_Operator as default script.

Effect:

The script slows particles down, and then, when they are slow enough, splits off the first 50 particles into a stream traveling in a negative direction on the world X axis, and the remainder traveling in the opposite direction.

EXAMPLE
    --The ChannelsUsed handler defines the channels
    --to be made available to the script.
    --For the list of all channels, see
    --Interface: MaxscriptParticleContainer
    --The parameter pCont passed to the handler
    --contains the Particle Container the script is applied to
    on ChannelsUsed pCont do
    (
    pCont.useTime = true--enable the Time channel
    pCont.useSpeed = true--enable the Speed channel
    )

    --The Init handler is called on initialization.
    --It is not used in this case.
    on Init pCont do
    (
    )

    --The Proceed handler contains the main script
    --applied to the Particles.
    --The parameter pCont passed to the handler
    --contains the Particle Container the script is applied to:
    on Proceed pCont do
    (
    --Get the total number of particles:
    count = pCont.NumParticles()
    --Define slow speed as one unit per frame:
    slowSpeed = 1/160.0
    --Define very slow speed as 0.01 units per frame:
    verySlowSpeed = 0.01/160.0
    --Define random angular deviation per frame
    divAngle = 12.0
    --Get the start time in ticks
    --(when conerting time values to float, the result is ticks)
    tStart = pCont.getTimeStart() as float
    --Get the end time in ticks
    tEnd = pCont.getTimeEnd() as float
    --Calculate the length of the time interval in ticks
    timeDif = tEnd - tStart
    --Then convert to frames (160 ticks/frame when using 30 fps NTSC)
    timeDif /= 160.0
    --Define a drag coefficient
    dragCoef = 0.08

    --Loop from 1 to the number of particles...
    for i in 1 to count do
    (
    --Set the particle index in the container to the current i value.
    --This makes the i-th particle in the container the current one:
    pCont.particleIndex = i

    --If the particle is faster, then slow it down
    if length (pCont.particleSpeed) > slowSpeed then
    pCont.particleSpeed -= dragCoef*timeDif*pCont.particleSpeed

    --Calculate the length of the particle speed vector
    newLen = length(pCont.particleSpeed)
    --If the current speed is higher than the defined very slow speed
    --then calculate a random divergence using the deviation angle.
    --If it is slower (very slow!), then don’t use the angle but a
    --fixed value.
    if newLen > verySlowSpeed then
    pCont.particleSpeed = pCont.randDivergeVector(pCont.particleSpeed)(divAngle/(160*newLen))
    else
    pCont.particleSpeed = pCont.randDivergeVector(pCont.particleSpeed)(180.0)

    --If slow enough, the first 50 particles go to the left.
    --The particles with ID above 50 go to the right.
    if length(pCont.particleSpeed) < 1.5*slowSpeed then
    (
    if pCont.particleID < 50 then
    pCont.particleSpeed += [-0.005*timeDif, 0, 0]
    else
    pCont.particleSpeed += [0.005*timeDif, 0, 0]
    )
    )
    )

    --The Release handler is used to do cleanup work.
    --Not used in this case.
    on Release pCont do
    (
    )

#### See Also

- Interface: MaxscriptParticleContainer

- Script_Operator : Helper

- Using MAXScript in Script Actions

- Particle Flow Sample Scripts