ParticleAPI 3.0.0
Performant particle system API in C++ for interactive graphics
pInlineActionsAPI.h
Go to the documentation of this file.
1/// PInlineActionsAPI.h
2///
3/// Copyright 1997-2007, 2022 by David K. McAllister
4///
5/// Only application code should include this.
6/// This file contains the host interface definitions to the inline particle actions.
7/// It is a header file so that the action implementations are inlined.
8/// The intended usage is as follows:
9///
10/// P.ParticleLoop(std::execution::par_unseq, [&](Particle_t& m) {
11/// P.I.Gravity(Efx.GravityVec);
12/// P.I.Bounce(0.f, 0.5f, 0.f, PDDisc(pVec(0, 0, 1.f), pVec(0, 0, 1.f), 5));
13/// P.I.Move(true, false);
14/// });
15
16// TODO: Fix PInternalState.
17//#include "PInternalState.h"
18#include "Particle/pAPI.h"
19#include "Particle/pActionImpls.h"
20
21namespace PAPI {
22
23#ifdef _DEBUG
24#define P_CHECK_ERR
25 PASSERT(!PSh.get_in_new_list(), "Can't call inline action while making action list");
26 PASSERT(PSh.get_in_particle_loop(), "Can only call inline action while inside ParticleLoop")
27#else
28#define P_CHECK_ERR
29#endif
30
31PINLINE void PContextActions_t::Avoid(Particle_t& m, const float magnitude, const float epsilon, const float look_ahead, const pDomain& dom)
32{
34 switch (dom.Which) {
35 case PDDisc_e: PAAvoidDisc_Impl(m, PSh.get_dt(), *dynamic_cast<const PDDisc*>(&dom), look_ahead, magnitude, epsilon); return;
36 case PDPlane_e: PAAvoidPlane_Impl(m, PSh.get_dt(), *dynamic_cast<const PDPlane*>(&dom), look_ahead, magnitude, epsilon); return;
37 case PDRectangle_e: PAAvoidRectangle_Impl(m, PSh.get_dt(), *dynamic_cast<const PDRectangle*>(&dom), look_ahead, magnitude, epsilon); return;
38 case PDSphere_e: PAAvoidSphere_Impl(m, PSh.get_dt(), *dynamic_cast<const PDSphere*>(&dom), look_ahead, magnitude, epsilon); return;
39 case PDTriangle_e: PAAvoidTriangle_Impl(m, PSh.get_dt(), *dynamic_cast<const PDTriangle*>(&dom), look_ahead, magnitude, epsilon); return;
40 default: return;
41 }
42}
43
44PINLINE void PContextActions_t::Bounce(Particle_t& m, const float friction, const float resilience, const float fric_min_vel, const pDomain& dom)
45{
47 switch (dom.Which) {
48 case PDBox_e: PABounceBox_Impl(m, PSh.get_dt(), *static_cast<const PDBox*>(&dom), friction, resilience, fric_min_vel); return;
49 case PDDisc_e: PABounceDisc_Impl(m, PSh.get_dt(), *static_cast<const PDDisc*>(&dom), friction, resilience, fric_min_vel); return;
50 case PDPlane_e: PABouncePlane_Impl(m, PSh.get_dt(), *static_cast<const PDPlane*>(&dom), friction, resilience, fric_min_vel); return;
51 case PDRectangle_e: PABounceRectangle_Impl(m, PSh.get_dt(), *static_cast<const PDRectangle*>(&dom), friction, resilience, fric_min_vel); return;
52 case PDSphere_e: PABounceSphere_Impl(m, PSh.get_dt(), *static_cast<const PDSphere*>(&dom), friction, resilience, fric_min_vel); return;
53 case PDTriangle_e: PABounceTriangle_Impl(m, PSh.get_dt(), *static_cast<const PDTriangle*>(&dom), friction, resilience, fric_min_vel); return;
54 default: return;
55 }
56}
57
58PINLINE void PContextActions_t::CopyVertexB(Particle_t& m, const bool copy_pos, const bool copy_vel)
59{
61 PACopyVertexB_Impl(m, PSh.get_dt(), copy_pos, copy_vel);
62}
63
64PINLINE void PContextActions_t::Damping(Particle_t& m, const pVec& damping, const float min_vel, const float max_vel)
65{
67 PADamping_Impl(m, PSh.get_dt(), damping, min_vel, max_vel);
68}
69
70PINLINE void PContextActions_t::RotDamping(Particle_t& m, const pVec& damping, const float min_vel, const float max_vel)
71{
73 PARotDamping_Impl(m, PSh.get_dt(), damping, min_vel, max_vel);
74}
75
76PINLINE void PContextActions_t::Explosion(Particle_t& m, const pVec& center, const float radius, const float magnitude, const float stdev, const float epsilon)
77{
79 PAExplosion_Impl(m, PSh.get_dt(), center, radius, magnitude, stdev, epsilon);
80}
81
83{
85 PAGravity_Impl(m, PSh.get_dt(), dir);
86}
87
88PINLINE void PContextActions_t::Jet(Particle_t& m, const pDomain& dom, const pDomain& accel)
89{
91 PAJet_Impl(m, PSh.get_dt(), dom, accel);
92}
93
94PINLINE void PContextActions_t::Move(Particle_t& m, const bool move_velocity, const bool move_rotational_velocity)
95{
97 PAMove_Impl(m, PSh.get_dt(), move_velocity, move_rotational_velocity);
98}
99
100PINLINE void PContextActions_t::OrbitLine(Particle_t& m, const pVec& p, const pVec& axis, const float magnitude, const float epsilon, const float max_radius)
101{
103 PAOrbitLine_Impl(m, PSh.get_dt(), p, axis, magnitude, epsilon, max_radius);
104}
105
106PINLINE void PContextActions_t::OrbitPoint(Particle_t& m, const pVec& center, const float magnitude, const float epsilon, const float max_radius)
107{
109 PAOrbitPoint_Impl(m, PSh.get_dt(), center, magnitude, epsilon, max_radius);
110}
111
113{
115 PARandomAccel_Impl(m, PSh.get_dt(), gen_acc);
116}
117
119{
121 PARandomDisplace_Impl(m, PSh.get_dt(), gen_disp);
122}
123
125{
127 PARandomVelocity_Impl(m, PSh.get_dt(), gen_vel);
128}
129
131{
133 PARandomRotVelocity_Impl(m, PSh.get_dt(), gen_vel);
134}
135
136PINLINE void PContextActions_t::Restore(Particle_t& m, const float time_left, const bool vel, const bool rvel)
137{
139 PARestore_Impl(m, PSh.get_dt(), time_left, vel, rvel);
140}
141
142PINLINE void PContextActions_t::SpeedClamp(Particle_t& m, const float min_speed, const float max_speed)
143{
145 PASpeedClamp_Impl(m, PSh.get_dt(), min_speed, max_speed);
146}
147
148PINLINE void PContextActions_t::TargetColor(Particle_t& m, const pVec& color, const float alpha, const float scale)
149{
151 PATargetColor_Impl(m, PSh.get_dt(), color, alpha, scale);
152}
153
154PINLINE void PContextActions_t::TargetSize(Particle_t& m, const pVec& size, const pVec& scale)
155{
157 PATargetSize_Impl(m, PSh.get_dt(), size, scale);
158}
159
160PINLINE void PContextActions_t::TargetVelocity(Particle_t& m, const pVec& vel, const float scale)
161{
163 PATargetVelocity_Impl(m, PSh.get_dt(), vel, scale);
164}
165
166PINLINE void PContextActions_t::TargetRotVelocity(Particle_t& m, const pVec& rot_velocity, const float scale)
167{
169 PATargetRotVelocity_Impl(m, PSh.get_dt(), rot_velocity, scale);
170}
171
172PINLINE void PContextActions_t::Vortex(Particle_t& m, const pVec& tip, const pVec& axis, const float tightnessExponent, const float max_radius,
173 const float inSpeed, const float upSpeed, const float aroundSpeed)
174{
176 PAVortex_Impl(m, PSh.get_dt(), tip, axis, tightnessExponent, max_radius, inSpeed, upSpeed, aroundSpeed);
177}
178
179//////////////////////////////////////////////////////////////////
180// Inter-particle actions
181
182PINLINE void PContextActions_t::Follow(Particle_t& m, const float magnitude, const float epsilon, const float max_radius)
183{
185 PAFollow_Impl(m, PSh.get_dt(), magnitude, epsilon, max_radius, PSh.get_const_pgroup_begin(), PSh.get_const_pgroup_end());
186}
187
188PINLINE void PContextActions_t::Gravitate(Particle_t& m, const float magnitude, const float epsilon, const float max_radius)
189{
191 PAGravitate_Impl(m, PSh.get_dt(), magnitude, epsilon, max_radius, PSh.get_const_pgroup_begin(), PSh.get_const_pgroup_end());
192}
193
194PINLINE void PContextActions_t::MatchVelocity(Particle_t& m, const float magnitude, const float epsilon, const float max_radius)
195{
197 PAMatchVelocity_Impl(m, PSh.get_dt(), magnitude, epsilon, max_radius, PSh.get_const_pgroup_begin(), PSh.get_const_pgroup_end());
198}
199
200PINLINE void PContextActions_t::MatchRotVelocity(Particle_t& m, const float magnitude, const float epsilon, const float max_radius)
201{
203 PAMatchRotVelocity_Impl(m, PSh.get_dt(), magnitude, epsilon, max_radius, PSh.get_const_pgroup_begin(), PSh.get_const_pgroup_end());
204}
205
206//////////////////////////////////////////////////////////////////
207// Other exceptional actions
208
210{
212 (*callbackFunc)(m, call_data, PSh.get_dt());
213}
214
215PINLINE void PContextActions_t::KillOld(Particle_t& m, const float age_limit, const bool kill_less_than)
216{
218 PAKillOld_Impl(m, PSh.get_dt(), age_limit, kill_less_than);
219}
220
221PINLINE void PContextActions_t::Sink(Particle_t& m, const bool kill_inside, const pDomain& kill_pos_dom)
222{
224 PASink_Impl(m, PSh.get_dt(), kill_inside, kill_pos_dom);
225}
226
227PINLINE void PContextActions_t::SinkVelocity(Particle_t& m, const bool kill_inside, const pDomain& kill_vel_dom)
228{
230 PASinkVelocity_Impl(m, PSh.get_dt(), kill_inside, kill_vel_dom);
231}
232
233#undef P_CHECK_ERR
234}; // namespace PAPI
This class contains the Action API.
Definition: pAPIContext.h:332
void RandomDisplace(Particle_t &m, const pDomain &dom)
Immediately displace position by a random amount.
Definition: pInlineActionsAPI.h:118
void TargetRotVelocity(Particle_t &m, const pVec &rvel, const float scale)
Change rotational velocity of all particles toward the specified rotational velocity.
Definition: pInlineActionsAPI.h:166
void RandomAccel(Particle_t &m, const pDomain &dom)
Accelerate particles in random directions.
Definition: pInlineActionsAPI.h:112
void SinkVelocity(Particle_t &m, const bool kill_inside, const pDomain &kill_vel_dom)
Kill particles that have velocities on wrong side of the specified domain.
Definition: pInlineActionsAPI.h:227
void MatchVelocity(Particle_t &m, const float magnitude=1.0f, const float epsilon=P_EPS, const float max_radius=P_MAXFLOAT)
Modify each particle's velocity to be similar to that of its neighbors.
Definition: pInlineActionsAPI.h:194
void Restore(Particle_t &m, const float time, const bool vel=true, const bool rvel=true)
Over time, restore particles to their target positionB and upB.
Definition: pInlineActionsAPI.h:136
void Callback(Particle_t &m, P_PARTICLE_CALLBACK_ACTION callbackFunc, const pdata_t call_data=0)
Call an arbitrary user-provided function on each particle in the group.
Definition: pInlineActionsAPI.h:209
void Move(Particle_t &m, const bool move_velocity=true, const bool move_rotational_velocity=true)
Apply the particles' velocities to their positions, and age the particles.
Definition: pInlineActionsAPI.h:94
void Jet(Particle_t &m, const pDomain &dom, const pDomain &acc)
For particles in the domain of influence, accelerate them with a domain.
Definition: pInlineActionsAPI.h:88
void OrbitLine(Particle_t &m, const pVec &p, const pVec &axis, const float magnitude=1.0f, const float epsilon=P_EPS, const float max_radius=P_MAXFLOAT)
Accelerate particles toward the closest point on the given line.
Definition: pInlineActionsAPI.h:100
void KillOld(Particle_t &m, const float age_limit, const bool kill_less_than=false)
Get rid of older particles.
Definition: pInlineActionsAPI.h:215
void Bounce(Particle_t &m, const float friction, const float resilience, const float fric_min_vel, const pDomain &dom)
Bounce particles off an object defined by a domain.
Definition: pInlineActionsAPI.h:44
void Damping(Particle_t &m, const pVec &damping, const float min_vel=0.0f, const float max_vel=P_MAXFLOAT)
Simulate air by dampening particle velocities.
Definition: pInlineActionsAPI.h:64
void TargetVelocity(Particle_t &m, const pVec &vel, const float scale)
Change velocity of all particles toward the specified velocity.
Definition: pInlineActionsAPI.h:160
void Explosion(Particle_t &m, const pVec &center, const float radius, const float magnitude, const float sigma, const float epsilon=P_EPS)
Exert force on each particle away from explosion center.
Definition: pInlineActionsAPI.h:76
void Gravity(Particle_t &m, const pVec &dir)
Accelerate particles in the given direction.
Definition: pInlineActionsAPI.h:82
void Gravitate(Particle_t &m, const float magnitude=1.0f, const float epsilon=P_EPS, const float max_radius=P_MAXFLOAT)
Accelerate each particle toward each other particle.
Definition: pInlineActionsAPI.h:188
PInternalShadow_t PSh
Definition: pAPIContext.h:1097
void Follow(Particle_t &m, const float magnitude=1.0f, const float epsilon=P_EPS, const float max_radius=P_MAXFLOAT)
Accelerate toward the next particle in the list.
Definition: pInlineActionsAPI.h:182
void Avoid(Particle_t &m, const float magnitude, const float epsilon, const float look_ahead, const pDomain &dom)
Steer particles away from a domain of space.
Definition: pInlineActionsAPI.h:31
void Vortex(Particle_t &m, const pVec &tip, const pVec &axis, const float tightnessExponent, const float max_radius, const float inSpeed, const float upSpeed, const float aroundSpeed)
Accelerate particles in a vortex-like way.
Definition: pInlineActionsAPI.h:172
void OrbitPoint(Particle_t &m, const pVec &center, const float magnitude=1.0f, const float epsilon=P_EPS, const float max_radius=P_MAXFLOAT)
Accelerate particles toward the given center point.
Definition: pInlineActionsAPI.h:106
void Sink(Particle_t &m, const bool kill_inside, const pDomain &kill_pos_dom)
Kill particles that have positions on wrong side of the specified domain.
Definition: pInlineActionsAPI.h:221
void SpeedClamp(Particle_t &m, const float min_speed, const float max_speed)
Clamp particle velocities to the given range.
Definition: pInlineActionsAPI.h:142
void MatchRotVelocity(Particle_t &m, const float magnitude=1.0f, const float epsilon=P_EPS, const float max_radius=P_MAXFLOAT)
Modify each particle's rotational velocity to be similar to that of its neighbors.
Definition: pInlineActionsAPI.h:200
void CopyVertexB(Particle_t &m, const bool copy_pos=true, const bool copy_vel=false)
Set the secondary position and velocity from current.
Definition: pInlineActionsAPI.h:58
void TargetSize(Particle_t &m, const pVec &size, const pVec &scale)
Change sizes of all particles toward the specified size.
Definition: pInlineActionsAPI.h:154
void RotDamping(Particle_t &m, const pVec &damping, const float min_vel=0.0f, const float max_vel=P_MAXFLOAT)
Simulate air by dampening rotational velocities.
Definition: pInlineActionsAPI.h:70
void RandomRotVelocity(Particle_t &m, const pDomain &dom)
Immediately assign a random rotational velocity.
Definition: pInlineActionsAPI.h:130
void RandomVelocity(Particle_t &m, const pDomain &dom)
Replace particle velocity with a random velocity.
Definition: pInlineActionsAPI.h:124
void TargetColor(Particle_t &m, const pVec &color, const float alpha, const float scale)
Change color of all particles toward the specified color.
Definition: pInlineActionsAPI.h:148
A representation of a region of space.
Definition: pDomain.h:55
pDomainType_E Which
Definition: pDomain.h:58
A single-precision floating point three-vector.
Definition: pVec.h:63
PAPIClasses.h.
Definition: pAPIContext.h:16
@ PDPlane_e
Definition: pDomain.h:29
@ PDTriangle_e
Definition: pDomain.h:26
@ PDDisc_e
Definition: pDomain.h:28
@ PDSphere_e
Definition: pDomain.h:33
@ PDRectangle_e
Definition: pDomain.h:27
@ PDBox_e
Definition: pDomain.h:30
void(* P_PARTICLE_CALLBACK_ACTION)(struct Particle_t &particle, const pdata_t data, const float dt)
This is the type of the callback functions that you can register for the Callback() action.
Definition: pDeclarations.h:28
unsigned int pdata_t
Definition: pDeclarations.h:16
#define P_CHECK_ERR
Definition: pInlineActionsAPI.h:28
#define PINLINE
Definition: pVec.h:20
Axis-aligned bounding box (AABB)
Definition: pDomain.h:523
Arbitrarily-oriented disc.
Definition: pDomain.h:392
Arbitrarily-oriented plane.
Definition: pDomain.h:478
Rhombus-shaped planar region.
Definition: pDomain.h:325
Sphere.
Definition: pDomain.h:808
A Triangle.
Definition: pDomain.h:252
Definition: pParticle.h:18