18 #ifndef B2_PARTICLb2_SYSTEM_H
19 #define B2_PARTICLb2_SYSTEM_H
21 #include <Box2D/Particle/b2Particle.h>
22 #include <Box2D/Dynamics/b2TimeStep.h>
88 userSuppliedCapacity = 0;
91 int32 userSuppliedCapacity;
99 friend inline bool operator<(
const Proxy &a,
const Proxy &b)
101 return a.tag < b.tag;
103 friend inline bool operator<(uint32 a,
const Proxy &b)
107 friend inline bool operator<(
const Proxy &a, uint32 b)
116 int32 indexA, indexB;
125 int32 indexA, indexB, indexC;
129 float32 ka, kb, kc, s;
133 class CreateParticleGroupCallback
136 void operator()(int32 a, int32 b, int32 c)
const;
143 class JoinParticleGroupsCallback
146 void operator()(int32 a, int32 b, int32 c)
const;
153 static const int32 k_pairFlags =
156 static const int32 k_triadFlags =
159 static const int32 k_noPressureFlags =
165 template <
typename T> T* ReallocateBuffer(T* buffer, int32 oldCapacity, int32 newCapacity);
166 template <
typename T> T* ReallocateBuffer(T* buffer, int32 userSuppliedCapacity, int32 oldCapacity, int32 newCapacity,
bool deferred);
167 template <
typename T> T* ReallocateBuffer(ParticleBuffer<T>* buffer, int32 oldCapacity, int32 newCapacity,
bool deferred);
168 template <
typename T> T* RequestParticleBuffer(T* buffer);
171 void DestroyParticle(int32 index,
bool callDestructionListener);
176 bool callDestructionListener);
178 bool callDestructionListener);
184 void AddContact(int32 a, int32 b);
185 void UpdateContacts(
bool exceptZombie);
186 void UpdateBodyContacts();
200 void SolveColorMixing(
const b2TimeStep& step);
202 void RotateBuffer(int32 start, int32 mid, int32 end);
204 void SetParticleRadius(float32 radius);
205 float32 GetParticleRadius()
const;
206 void SetParticleDensity(float32 density);
207 float32 GetParticleDensity()
const;
208 void SetParticleGravityScale(float32 gravityScale);
209 float32 GetParticleGravityScale()
const;
210 void SetParticleDamping(float32 damping);
211 float32 GetParticleDamping()
const;
212 float32 GetCriticalVelocity(
const b2TimeStep& step)
const;
213 float32 GetCriticalVelocitySquared(
const b2TimeStep& step)
const;
214 float32 GetCriticalPressure(
const b2TimeStep& step)
const;
215 float32 GetParticleStride()
const;
216 float32 GetParticleMass()
const;
217 float32 GetParticleInvMass()
const;
221 int32 GetParticleGroupCount()
const;
222 int32 GetParticleCount()
const;
223 int32 GetParticleMaxCount()
const;
224 void SetParticleMaxCount(int32 count);
225 uint32* GetParticleFlagsBuffer();
226 b2Vec2* GetParticlePositionBuffer();
227 b2Vec2* GetParticleVelocityBuffer();
229 void** GetParticleUserDataBuffer();
230 const uint32* GetParticleFlagsBuffer()
const;
231 const b2Vec2* GetParticlePositionBuffer()
const;
232 const b2Vec2* GetParticleVelocityBuffer()
const;
235 void*
const* GetParticleUserDataBuffer()
const;
236 template <
typename T>
void SetParticleBuffer(ParticleBuffer<T>* buffer, T* newBufferData, int32 newCapacity);
237 void SetParticleFlagsBuffer(uint32* buffer, int32 capacity);
238 void SetParticlePositionBuffer(
b2Vec2* buffer, int32 capacity);
239 void SetParticleVelocityBuffer(
b2Vec2* buffer, int32 capacity);
242 void SetParticleUserDataBuffer(
void** buffer, int32 capacity);
246 float32 ComputeParticleCollisionEnergy()
const;
249 int32 m_allParticleFlags;
250 int32 m_allGroupFlags;
252 float32 m_inverseDensity;
253 float32 m_gravityScale;
254 float32 m_particleDiameter;
255 float32 m_inverseDiameter;
256 float32 m_squaredDiameter;
259 int32 m_internalAllocatedCapacity;
261 ParticleBuffer<uint32> m_flagsBuffer;
262 ParticleBuffer<b2Vec2> m_positionBuffer;
263 ParticleBuffer<b2Vec2> m_velocityBuffer;
264 float32* m_accumulationBuffer;
265 b2Vec2* m_accumulation2Buffer;
266 float32* m_depthBuffer;
267 ParticleBuffer<b2ParticleColor> m_colorBuffer;
269 ParticleBuffer<void*> m_userDataBuffer;
272 int32 m_proxyCapacity;
273 Proxy* m_proxyBuffer;
275 int32 m_contactCount;
276 int32 m_contactCapacity;
279 int32 m_bodyContactCount;
280 int32 m_bodyContactCapacity;
284 int32 m_pairCapacity;
288 int32 m_triadCapacity;
289 Triad* m_triadBuffer;
294 float32 m_pressureStrength;
295 float32 m_dampingStrength;
296 float32 m_elasticStrength;
297 float32 m_springStrength;
298 float32 m_viscousStrength;
299 float32 m_surfaceTensionStrengthA;
300 float32 m_surfaceTensionStrengthB;
301 float32 m_powderStrength;
302 float32 m_ejectionStrength;
303 float32 m_colorMixingStrength;
313 inline const b2ParticleGroup* b2ParticleSystem::GetParticleGroupList()
const
318 inline int32 b2ParticleSystem::GetParticleGroupCount()
const
323 inline int32 b2ParticleSystem::GetParticleCount()
const
Definition: b2ParticleGroup.h:37
uint32 flags
Definition: b2ParticleSystem.h:46
float32 weight
Definition: b2ParticleSystem.h:49
Definition: b2WorldCallbacks.h:160
float32 weight
Definition: b2ParticleSystem.h:65
Definition: b2StackAllocator.h:37
b2Vec2 normal
Definition: b2ParticleSystem.h:52
Definition: b2ParticleSystem.h:74
Definition: b2BlockAllocator.h:35
int32 index
Definition: b2ParticleSystem.h:59
Definition: b2Particle.h:85
b2Vec2 normal
Definition: b2ParticleSystem.h:68
float32 mass
Definition: b2ParticleSystem.h:71
A group of particles. These are created via b2World::CreateParticleGroup.
Definition: b2ParticleGroup.h:93
An axis aligned bounding box.
Definition: b2Collision.h:161
int32 indexA
Definition: b2ParticleSystem.h:43
This is an internal structure.
Definition: b2TimeStep.h:38
Definition: b2ParticleSystem.h:55
A rigid body. These are created via b2World::CreateBody.
Definition: b2Body.h:127
b2Body * body
Definition: b2ParticleSystem.h:62
Small color object for each particle.
Definition: b2Particle.h:42
Definition: b2ParticleSystem.h:39
A 2D column vector.
Definition: b2Math.h:64
Definition: b2WorldCallbacks.h:140