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 must 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.
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 handler 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 initial 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 initial 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 ( )