Description:
The following example uses Script_Test actions to implement scripted position tests with both relative offset and absolute position options.
Can Be Used With:
The two scripts should be used inside the Script_Test : Helper actions.
Effect:
The PF_Source generates particles which get tested for relative offset of –100 to their birth position along the Z axis.
If they pass the scripted offset test, the particles are moved to the second Event which stops them and tests them for Age above 30.
If they pass the Age Test, the particles are moved to the Third event which tests them for absolute offset of –200 along the world Z axis using the second script.
If they pass the scripted position test, the particles are moved to the last Event which stops them.
Sample File:
[3dsmax5]\scenes\particle_flow\maxscript\ScriptedPositionTestExample.max
SCRIPT 1:
--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
pCont.usePosition = true
)
--The Init hander is called on initialization.
--In this case, it is used to define the offset parameters
on Init pCont do
(
--Data paramters definition
struct paramsStruct (cond_less, axis, testpos, offset)
global paramsData = paramsStruct()
--true means less than, false means greater then
paramsData_offset.cond_less = true
--Axis option: x=1, y=2, z=3
paramsData_offset.axis = 3
--When set to true, the offset test is relative
--When set to false, the offset test is absolute.
paramsData_offset.offset = true
--Set the offset value to test for
paramsData_offset.testpos = -100
-- collects inital pos of each particle for offset test
global pos_init_array =#()
)
--In the Proceed handler, the actual testing is performed
on Proceed pCont do
(
count = pCont.NumParticles()
for i in 1 to count do
(
pCont.particleIndex = i
-- get ID of active particle
id = pCont.getParticleID pCont.particleIndex
if paramsData.cond_less == true then
(
if paramsData.offset == true then
(
-- collect initial pos for new born particle
if pCont.particleNew == true then
append pos_init_array pCont.particlePosition[paramsData.axis]
pos_id = pCont.GetParticlePositionByID id
if pos_id[paramsData.axis] < (pos_init_array[id] + paramsData.testpos) then
testSatisfied = true
)
else
(
if pCont.particlePosition[paramsData.axis] < paramsData.testpos then
testSatisfied = true
)
)
else
(
if paramsData.offset == true then
(
-- collect initial pos for new born particle
if pCont.particleNew == true then
append pos_init_array pCont.particlePosition[paramsData.axis]
pos_id = pCont.GetParticlePositionByID id
if pos_id[paramsData.axis] > (pos_init_array[id] + paramsData.testpos) then
testSatisfied = true
)
else
(
if pCont.particlePosition[paramsData.axis] > paramsData.testpos then
testSatisfied = true
)
)
if testSatisfied == true then
(
pCont.particleTestStatus = true
pCont.particleTestTime = pCont.particleTime
)
)
)
on Release pCont do
(
)
SCRIPT 2:
on ChannelsUsed pCont do
(
pCont.useTime = true
pCont.usePosition = true
)
on Init pCont do
(
--Data paramters definition
struct paramsStruct (cond_less, axis, testpos, offset)
global paramsData = paramsStruct()
--true means less than, false means greater then
paramsData.cond_less = true
--Axis option: x=1, y=2, z=3
paramsData.axis = 3
--When set to false, the offset test is absolute.
--When set to true, the offset test is relative
paramsData.offset = false
--Set the position value to test
paramsData.testpos = -200
-- Collects inital pos of each particle for offset test:
global pos_init_array =#()
)
--The Proceed handler is identical to the one in the first script.
--Only the test parameters defined in the Init handler alter the
--behavior of the script!
on Proceed pCont do
(
count = pCont.NumParticles()
for i in 1 to count do
(
pCont.particleIndex = i
-- get ID of active particle
id = pCont.getParticleID pCont.particleIndex
if paramsData.cond_less == true then
(
if paramsData.offset == true then
(
-- collect initial pos for new born particle
if pCont.particleNew == true then
append pos_init_array pCont.particlePosition[paramsData.axis]
pos_id = pCont.GetParticlePositionByID id
if pos_id[paramsData.axis] < (pos_init_array[id] + paramsData.testpos) then
testSatisfied = true
)
else
(
if pCont.particlePosition[paramsData.axis] < paramsData.testpos then
testSatisfied = true
)
)
else
(
if paramsData.offset == true then
(
-- collect initial pos for new born particle
if pCont.particleNew == true then
append pos_init_array pCont.particlePosition[paramsData.axis]
pos_id = pCont.GetParticlePositionByID id
if pos_id[paramsData.axis] > (pos_init_array[id] + paramsData.testpos) then
testSatisfied = true
)
else
(
if pCont.particlePosition[paramsData.axis] > paramsData.testpos then
testSatisfied = true
)
)
if testSatisfied == true then
(
pCont.particleTestStatus = true
pCont.particleTestTime = pCont.particleTime
)
)
)
on Release pCont do
(
)