3
// Copyright 1997-1998 by David K. McAllister
5
// This file implements the action API calls by creating
6
// action class instances, which are either executed or
7
// added to an action list.
11
extern void _pAddActionToList(ParticleAction *S, int size);
12
extern void _pCallActionList(ParticleAction *pa, int num_actions,
15
// Do not call this function.
16
void _pSendAction(ParticleAction *S, PActionEnum type, int size)
18
_ParticleState &_ps = _GetPState();
24
_pAddActionToList(S, size);
28
// Immediate mode. Execute it.
29
// This is a hack to give them local access to dt.
31
_pCallActionList(S, 1, _ps.pgrp);
35
PARTICLEDLL_API void pAvoid(float magnitude, float epsilon, float look_ahead,
37
float a0, float a1, float a2,
38
float a3, float a4, float a5,
39
float a6, float a7, float a8)
43
S.position = pDomain(dtype, a0, a1, a2, a3, a4, a5, a6, a7, a8);
44
S.magnitude = magnitude;
46
S.look_ahead = look_ahead;
48
_pSendAction(&S, PAAvoidID, sizeof(PAAvoid));
51
PARTICLEDLL_API void pBounce(float friction, float resilience, float cutoff,
53
float a0, float a1, float a2,
54
float a3, float a4, float a5,
55
float a6, float a7, float a8)
59
S.position = pDomain(dtype, a0, a1, a2, a3, a4, a5, a6, a7, a8);
60
S.oneMinusFriction = 1.0f - friction;
61
S.resilience = resilience;
62
S.cutoffSqr = fsqr(cutoff);
64
_pSendAction(&S, PABounceID, sizeof(PABounce));
67
PARTICLEDLL_API void pCopyVertexB(bool copy_pos, bool copy_vel)
71
S.copy_pos = copy_pos;
72
S.copy_vel = copy_vel;
74
_pSendAction(&S, PACopyVertexBID, sizeof(PACopyVertexB));
77
PARTICLEDLL_API void pDamping(float damping_x, float damping_y, float damping_z,
78
float vlow, float vhigh)
82
S.damping = pVector(damping_x, damping_y, damping_z);
83
S.vlowSqr = fsqr(vlow);
84
S.vhighSqr = fsqr(vhigh);
86
_pSendAction(&S, PADampingID, sizeof(PADamping));
89
PARTICLEDLL_API void pExplosion(float center_x, float center_y, float center_z, float velocity,
90
float magnitude, float stdev, float epsilon, float age)
94
S.center = pVector(center_x, center_y, center_z);
95
S.velocity = velocity;
96
S.magnitude = magnitude;
104
_pSendAction(&S, PAExplosionID, sizeof(PAExplosion));
107
PARTICLEDLL_API void pFollow(float magnitude, float epsilon, float max_radius)
111
S.magnitude = magnitude;
113
S.max_radius = max_radius;
115
_pSendAction(&S, PAFollowID, sizeof(PAFollow));
118
PARTICLEDLL_API void pGravitate(float magnitude, float epsilon, float max_radius)
122
S.magnitude = magnitude;
124
S.max_radius = max_radius;
126
_pSendAction(&S, PAGravitateID, sizeof(PAGravitate));
129
PARTICLEDLL_API void pGravity(float dir_x, float dir_y, float dir_z)
133
S.direction = pVector(dir_x, dir_y, dir_z);
135
_pSendAction(&S, PAGravityID, sizeof(PAGravity));
138
PARTICLEDLL_API void pJet(float center_x, float center_y, float center_z,
139
float magnitude, float epsilon, float max_radius)
141
_ParticleState &_ps = _GetPState();
145
S.center = pVector(center_x, center_y, center_z);
147
S.magnitude = magnitude;
149
S.max_radius = max_radius;
151
_pSendAction(&S, PAJetID, sizeof(PAJet));
154
PARTICLEDLL_API void pKillOld(float age_limit, bool kill_less_than)
158
S.age_limit = age_limit;
159
S.kill_less_than = kill_less_than;
161
_pSendAction(&S, PAKillOldID, sizeof(PAKillOld));
164
PARTICLEDLL_API void pMatchVelocity(float magnitude, float epsilon, float max_radius)
168
S.magnitude = magnitude;
170
S.max_radius = max_radius;
172
_pSendAction(&S, PAMatchVelocityID, sizeof(PAMatchVelocity));
175
PARTICLEDLL_API void pMove()
179
_pSendAction(&S, PAMoveID, sizeof(PAMove));
182
PARTICLEDLL_API void pOrbitLine(float p_x, float p_y, float p_z,
183
float axis_x, float axis_y, float axis_z,
184
float magnitude, float epsilon, float max_radius)
188
S.p = pVector(p_x, p_y, p_z);
189
S.axis = pVector(axis_x, axis_y, axis_z);
191
S.magnitude = magnitude;
193
S.max_radius = max_radius;
195
_pSendAction(&S, PAOrbitLineID, sizeof(PAOrbitLine));
198
PARTICLEDLL_API void pOrbitPoint(float center_x, float center_y, float center_z,
199
float magnitude, float epsilon, float max_radius)
203
S.center = pVector(center_x, center_y, center_z);
204
S.magnitude = magnitude;
206
S.max_radius = max_radius;
208
_pSendAction(&S, PAOrbitPointID, sizeof(PAOrbitPoint));
211
PARTICLEDLL_API void pRandomAccel(PDomainEnum dtype,
212
float a0, float a1, float a2,
213
float a3, float a4, float a5,
214
float a6, float a7, float a8)
218
S.gen_acc = pDomain(dtype, a0, a1, a2, a3, a4, a5, a6, a7, a8);
220
_pSendAction(&S, PARandomAccelID, sizeof(PARandomAccel));
223
PARTICLEDLL_API void pRandomDisplace(PDomainEnum dtype,
224
float a0, float a1, float a2,
225
float a3, float a4, float a5,
226
float a6, float a7, float a8)
230
S.gen_disp = pDomain(dtype, a0, a1, a2, a3, a4, a5, a6, a7, a8);
232
_pSendAction(&S, PARandomDisplaceID, sizeof(PARandomDisplace));
235
PARTICLEDLL_API void pRandomVelocity(PDomainEnum dtype,
236
float a0, float a1, float a2,
237
float a3, float a4, float a5,
238
float a6, float a7, float a8)
242
S.gen_vel = pDomain(dtype, a0, a1, a2, a3, a4, a5, a6, a7, a8);
244
_pSendAction(&S, PARandomVelocityID, sizeof(PARandomVelocity));
247
PARTICLEDLL_API void pRestore(float time_left)
251
S.time_left = time_left;
253
_pSendAction(&S, PARestoreID, sizeof(PARestore));
256
PARTICLEDLL_API void pSink(bool kill_inside, PDomainEnum dtype,
257
float a0, float a1, float a2,
258
float a3, float a4, float a5,
259
float a6, float a7, float a8)
263
S.kill_inside = kill_inside;
264
S.position = pDomain(dtype, a0, a1, a2, a3, a4, a5, a6, a7, a8);
266
_pSendAction(&S, PASinkID, sizeof(PASink));
269
PARTICLEDLL_API void pSinkVelocity(bool kill_inside, PDomainEnum dtype,
270
float a0, float a1, float a2,
271
float a3, float a4, float a5,
272
float a6, float a7, float a8)
276
S.kill_inside = kill_inside;
277
S.velocity = pDomain(dtype, a0, a1, a2, a3, a4, a5, a6, a7, a8);
279
_pSendAction(&S, PASinkVelocityID, sizeof(PASinkVelocity));
282
PARTICLEDLL_API void pSource(float particle_rate, PDomainEnum dtype,
283
float a0, float a1, float a2,
284
float a3, float a4, float a5,
285
float a6, float a7, float a8)
287
_ParticleState &_ps = _GetPState();
291
S.particle_rate = particle_rate;
292
S.position = pDomain(dtype, a0, a1, a2, a3, a4, a5, a6, a7, a8);
293
S.positionB = _ps.VertexB;
295
S.velocity = _ps.Vel;
299
S.age_sigma = _ps.AgeSigma;
300
S.vertexB_tracks = _ps.vertexB_tracks;
302
_pSendAction(&S, PASourceID, sizeof(PASource));
305
PARTICLEDLL_API void pSpeedLimit(float min_speed, float max_speed)
309
S.min_speed = min_speed;
310
S.max_speed = max_speed;
312
_pSendAction(&S, PASpeedLimitID, sizeof(PASpeedLimit));
315
PARTICLEDLL_API void pTargetColor(float color_x, float color_y, float color_z,
316
float alpha, float scale)
320
S.color = pVector(color_x, color_y, color_z);
324
_pSendAction(&S, PATargetColorID, sizeof(PATargetColor));
327
PARTICLEDLL_API void pTargetSize(float size_x, float size_y, float size_z,
328
float scale_x, float scale_y, float scale_z)
332
S.size = pVector(size_x, size_y, size_z);
333
S.scale = pVector(scale_x, scale_y, scale_z);
335
_pSendAction(&S, PATargetSizeID, sizeof(PATargetSize));
338
PARTICLEDLL_API void pTargetVelocity(float vel_x, float vel_y, float vel_z, float scale)
342
S.velocity = pVector(vel_x, vel_y, vel_z);
345
_pSendAction(&S, PATargetVelocityID, sizeof(PATargetVelocity));
348
// If in immediate mode, quickly add a vertex.
349
// If building an action list, call pSource.
350
PARTICLEDLL_API void pVertex(float x, float y, float z)
352
_ParticleState &_ps = _GetPState();
356
pSource(1, PDPoint, x, y, z);
360
// Immediate mode. Quickly add the vertex.
364
pVector pos(x, y, z);
365
pVector siz, vel, col, posB;
366
if(_ps.vertexB_tracks)
369
_ps.VertexB.Generate(posB);
370
_ps.Size.Generate(siz);
371
_ps.Vel.Generate(vel);
372
_ps.Color.Generate(col);
373
_ps.pgrp->Add(pos, posB, siz, vel, col, _ps.Alpha, _ps.Age);
376
PARTICLEDLL_API void pVortex(float center_x, float center_y, float center_z,
377
float axis_x, float axis_y, float axis_z,
378
float magnitude, float epsilon, float max_radius)
382
S.center = pVector(center_x, center_y, center_z);
383
S.axis = pVector(axis_x, axis_y, axis_z);
385
S.magnitude = magnitude;
387
S.max_radius = max_radius;
389
_pSendAction(&S, PAVortexID, sizeof(PAVortex));