スクリプト化された Position テストの例
説明:
次の例は、Script_Test テスト アクションを使って、スクリプト化された Position テストと、相対オフセットおよび絶対位置オプションを実装します。
用途:
2 つのスクリプトは、Script_Test: ヘルパー アクション内で使用します。
効果:
-
PF_Source から生成されたパーティクルは、Z 軸方向の発生位置について相対オフセット -100 のテストを受けます。
-
スクリプト化されたオフセット テストの条件を満たすパーティクルは、次のイベントに渡され、エージが 30 を超えるかどうかのテストを受けます。
-
エージ テストの条件を満たすパーティクルは、3 番目のイベントに渡され、2 番目のスクリプトを使って、ワールド Z 軸方向の絶対オフセット -200 のテストを受けます。
-
スクリプト化された位置テストの条件を満たすパーティクルは、最後のイベントに渡され、停止します。
スクリプト:
|
--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
(
)
|
スクリプト 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
(
)
|