Loading...
Searching...
No Matches
ParticleSystemSolver3.hpp
Go to the documentation of this file.
1// This code is based on Jet framework.
2// Copyright (c) 2018 Doyub Kim
3// CubbyFlow is voxel-based fluid simulation engine for computer games.
4// Copyright (c) 2020 CubbyFlow Team
5// Core Part: Chris Ohk, Junwoo Hwang, Jihong Sin, Seungwoo Yoo
6// AI Part: Dongheon Cho, Minseo Kim
7// We are making my contributions/submissions to this project solely in our
8// personal capacity and are not conveying any rights to any intellectual
9// property of any third parties.
10
11#ifndef CUBBYFLOW_PARTICLE_SYSTEM_SOLVER3_HPP
12#define CUBBYFLOW_PARTICLE_SYSTEM_SOLVER3_HPP
13
21
22namespace CubbyFlow
23{
37{
38 public:
39 class Builder;
40
43
45 ParticleSystemSolver3(double radius, double mass);
46
49
52
55
58
61
64
74
77
88
91
94
104
107
110
113
116
119
129
132
133 protected:
136
139
142
145
148
151
156
159
160 private:
161 void BeginAdvanceTimeStep(double timeStepInSeconds);
162
163 void EndAdvanceTimeStep(double timeStepInSeconds);
164
165 void AccumulateExternalForces();
166
167 void TimeIntegration(double timeStepInSeconds);
168
169 void UpdateCollider(double timeStepInSeconds) const;
170
171 void UpdateEmitter(double timeStepInSeconds) const;
172
173 double m_dragCoefficient = 1e-4;
174 double m_restitutionCoefficient = 0.0;
175 Vector3D m_gravity = Vector3D{ 0.0, GRAVITY, 0.0 };
176
177 ParticleSystemData3Ptr m_particleSystemData;
178 ParticleSystemData3::VectorData m_newPositions;
179 ParticleSystemData3::VectorData m_newVelocities;
180 Collider3Ptr m_collider;
181 ParticleEmitter3Ptr m_emitter;
182 VectorField3Ptr m_wind;
183};
184
186using ParticleSystemSolver3Ptr = std::shared_ptr<ParticleSystemSolver3>;
187
191template <typename DerivedBuilder>
193{
194 public:
197
200
201 protected:
202 double m_radius = 1e-3;
203 double m_mass = 1e-3;
204};
205
206template <typename T>
208{
209 m_radius = radius;
210 return static_cast<T&>(*this);
211}
212
213template <typename T>
215{
216 m_mass = mass;
217 return static_cast<T&>(*this);
218}
219
233} // namespace CubbyFlow
234
235#endif
Generic N-dimensional array class interface.
Definition ArrayView.hpp:26
Definition Matrix.hpp:30
Front-end to create ParticleSystemSolver3 objects step by step.
Definition ParticleSystemSolver3.hpp:225
ParticleSystemSolver3 Build() const
Builds ParticleSystemSolver3.
ParticleSystemSolver3Ptr MakeShared() const
Builds shared pointer of ParticleSystemSolver3 instance.
Basic 3-D particle system solver.
Definition ParticleSystemSolver3.hpp:37
static Builder GetBuilder()
Returns builder fox ParticleSystemSolver3.
ParticleSystemSolver3(double radius, double mass)
Constructs a solver with particle parameters.
ParticleSystemSolver3(ParticleSystemSolver3 &&) noexcept=delete
Deleted move constructor.
double GetDragCoefficient() const
Returns the drag coefficient.
void OnInitialize() override
Initializes the simulator.
void SetDragCoefficient(double newDragCoefficient)
Sets the drag coefficient.
void ResolveCollision()
Resolves any collisions occurred by the particles.
void SetRestitutionCoefficient(double newRestitutionCoefficient)
Sets the restitution coefficient.
void SetParticleSystemData(const ParticleSystemData3Ptr &newParticles)
Assign a new particle system data.
double GetRestitutionCoefficient() const
Gets the restitution coefficient.
virtual void OnBeginAdvanceTimeStep(double timeStepInSeconds)
Called when a time-step is about to begin.
ParticleSystemSolver3()
Constructs an empty solver.
ParticleSystemSolver3(const ParticleSystemSolver3 &)=delete
Deleted copy constructor.
const VectorField3Ptr & GetWind() const
Returns the wind field.
const Vector3D & GetGravity() const
Returns the gravity.
void SetEmitter(const ParticleEmitter3Ptr &newEmitter)
Sets the emitter.
void SetCollider(const Collider3Ptr &newCollider)
Sets the collider.
const ParticleEmitter3Ptr & GetEmitter() const
Returns the emitter.
void SetGravity(const Vector3D &newGravity)
Sets the gravity.
const Collider3Ptr & GetCollider() const
Returns the collider.
virtual void AccumulateForces(double timeStepInSeconds)
Accumulates forces applied to the particles.
void OnAdvanceTimeStep(double timeStepInSeconds) override
Called to advance a single time-step.
const ParticleSystemData3Ptr & GetParticleSystemData() const
Returns the particle system data.
void SetWind(const VectorField3Ptr &newWind)
Sets the wind.
virtual void OnEndAdvanceTimeStep(double timeStepInSeconds)
Called after a time-step is completed.
Base class for particle-based solver builder.
Definition ParticleSystemSolver3.hpp:193
DerivedBuilder & WithMass(double mass)
Returns builder with mass per particle.
Definition ParticleSystemSolver3.hpp:214
double m_mass
Definition ParticleSystemSolver3.hpp:203
double m_radius
Definition ParticleSystemSolver3.hpp:202
DerivedBuilder & WithRadius(double radius)
Returns builder with particle radius.
Definition ParticleSystemSolver3.hpp:207
Abstract base class for physics-based animation.
Definition PhysicsAnimation.hpp:25
Definition pybind11Utils.hpp:21
std::shared_ptr< ParticleSystemData3 > ParticleSystemData3Ptr
Shared pointer type of ParticleSystemData3.
Definition ParticleSystemData.hpp:284
constexpr double GRAVITY
Definition Constants.hpp:299
std::shared_ptr< ParticleSystemSolver3 > ParticleSystemSolver3Ptr
Shared pointer type for the ParticleSystemSolver3.
Definition ParticleSystemSolver3.hpp:186
Matrix< T, Rows, 1 > Vector
Definition Matrix.hpp:738
std::shared_ptr< Collider3 > Collider3Ptr
Shared pointer type for the Collider3.
Definition Collider.hpp:144
std::shared_ptr< ParticleEmitter3 > ParticleEmitter3Ptr
Shared pointer for the ParticleEmitter3 type.
Definition ParticleEmitter3.hpp:94
std::shared_ptr< VectorField3 > VectorField3Ptr
Shared pointer for the VectorField3 type.
Definition VectorField.hpp:90