Scripted Position Test Example

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:

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
   (
   )