ParticleSystemSolver2.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_SOLVER2_HPP
12 #define CUBBYFLOW_PARTICLE_SYSTEM_SOLVER2_HPP
13 
18 #include <Core/Matrix/Matrix.hpp>
20 #include <Core/Utils/Constants.hpp>
21 
22 namespace CubbyFlow
23 {
37 {
38  public:
39  class Builder;
40 
43 
45  ParticleSystemSolver2(double radius, double mass);
46 
49 
51  ParticleSystemSolver2(ParticleSystemSolver2&&) noexcept = delete;
52 
54  ~ParticleSystemSolver2() override = default;
55 
58 
61 
63  [[nodiscard]] double GetDragCoefficient() const;
64 
73  void SetDragCoefficient(double newDragCoefficient);
74 
76  [[nodiscard]] double GetRestitutionCoefficient() const;
77 
87  void SetRestitutionCoefficient(double newRestitutionCoefficient);
88 
90  [[nodiscard]] const Vector2D& GetGravity() const;
91 
93  void SetGravity(const Vector2D& newGravity);
94 
103  [[nodiscard]] const ParticleSystemData2Ptr& GetParticleSystemData() const;
104 
106  [[nodiscard]] const Collider2Ptr& GetCollider() const;
107 
109  void SetCollider(const Collider2Ptr& newCollider);
110 
112  [[nodiscard]] const ParticleEmitter2Ptr& GetEmitter() const;
113 
115  void SetEmitter(const ParticleEmitter2Ptr& newEmitter);
116 
118  [[nodiscard]] const VectorField2Ptr& GetWind() const;
119 
128  void SetWind(const VectorField2Ptr& newWind);
129 
131  [[nodiscard]] static Builder GetBuilder();
132 
133  protected:
135  void OnInitialize() override;
136 
138  void OnAdvanceTimeStep(double timeStepInSeconds) override;
139 
141  virtual void AccumulateForces(double timeStepInSeconds);
142 
144  virtual void OnBeginAdvanceTimeStep(double timeStepInSeconds);
145 
147  virtual void OnEndAdvanceTimeStep(double timeStepInSeconds);
148 
150  void ResolveCollision();
151 
154  void ResolveCollision(ArrayView1<Vector2D> newPositions,
155  ArrayView1<Vector2D> newVelocities);
156 
158  void SetParticleSystemData(const ParticleSystemData2Ptr& newParticles);
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  Vector2D m_gravity = Vector2D{ 0.0, GRAVITY };
176 
177  ParticleSystemData2Ptr m_particleSystemData;
178  ParticleSystemData2::VectorData m_newPositions;
179  ParticleSystemData2::VectorData m_newVelocities;
180  Collider2Ptr m_collider;
181  ParticleEmitter2Ptr m_emitter;
182  VectorField2Ptr m_wind;
183 };
184 
186 using ParticleSystemSolver2Ptr = std::shared_ptr<ParticleSystemSolver2>;
187 
191 template <typename DerivedBuilder>
193 {
194  public:
196  [[nodiscard]] DerivedBuilder& WithRadius(double radius);
197 
199  [[nodiscard]] DerivedBuilder& WithMass(double mass);
200 
201  protected:
202  double m_radius = 1e-3;
203  double m_mass = 1e-3;
204 };
205 
206 template <typename T>
208 {
209  m_radius = radius;
210  return static_cast<T&>(*this);
211 }
212 
213 template <typename T>
215 {
216  m_mass = mass;
217  return static_cast<T&>(*this);
218 }
219 
224  : public ParticleSystemSolverBuilderBase2<Builder>
225 {
226  public:
228  [[nodiscard]] ParticleSystemSolver2 Build() const;
229 
231  [[nodiscard]] ParticleSystemSolver2Ptr MakeShared() const;
232 };
233 } // namespace CubbyFlow
234 
235 #endif
virtual void AccumulateForces(double timeStepInSeconds)
Accumulates forces applied to the particles.
void SetCollider(const Collider2Ptr &newCollider)
Sets the collider.
void SetGravity(const Vector2D &newGravity)
Sets the gravity.
Base class for particle-based solver builder.
Definition: ParticleSystemSolver2.hpp:192
void ResolveCollision()
Resolves any collisions occurred by the particles.
virtual void OnEndAdvanceTimeStep(double timeStepInSeconds)
Called after a time-step is completed.
const ParticleEmitter2Ptr & GetEmitter() const
Returns the emitter.
static Builder GetBuilder()
Returns builder fox ParticleSystemSolver2.
Front-end to create ParticleSystemSolver2 objects step by step.
Definition: ParticleSystemSolver2.hpp:223
std::shared_ptr< ParticleSystemSolver2 > ParticleSystemSolver2Ptr
Shared pointer type for the ParticleSystemSolver2.
Definition: ParticleSystemSolver2.hpp:186
std::shared_ptr< Collider2 > Collider2Ptr
Shared pointer type for the Collider2.
Definition: Collider.hpp:141
double GetRestitutionCoefficient() const
Gets the restitution coefficient.
std::shared_ptr< ParticleEmitter2 > ParticleEmitter2Ptr
Shared pointer for the ParticleEmitter2 type.
Definition: ParticleEmitter2.hpp:94
const VectorField2Ptr & GetWind() const
Returns the wind field.
void OnAdvanceTimeStep(double timeStepInSeconds) override
Called to advance a single time-step.
constexpr double GRAVITY
Definition: Constants.hpp:299
void SetRestitutionCoefficient(double newRestitutionCoefficient)
Sets the restitution coefficient.
void SetEmitter(const ParticleEmitter2Ptr &newEmitter)
Sets the emitter.
void OnInitialize() override
Initializes the simulator.
std::shared_ptr< ParticleSystemData2 > ParticleSystemData2Ptr
Shared pointer type of ParticleSystemData2.
Definition: ParticleSystemData.hpp:281
Definition: Matrix.hpp:27
Abstract base class for physics-based animation.
Definition: PhysicsAnimation.hpp:24
Definition: pybind11Utils.hpp:20
Definition: Array-Impl.hpp:19
Basic 2-D particle system solver.
Definition: ParticleSystemSolver2.hpp:36
void SetWind(const VectorField2Ptr &newWind)
Sets the wind.
~ParticleSystemSolver2() override=default
Default virtual destructor.
const ParticleSystemData2Ptr & GetParticleSystemData() const
Returns the particle system data.
std::shared_ptr< VectorField2 > VectorField2Ptr
Shared pointer for the VectorField2 type.
Definition: VectorField.hpp:87
void SetParticleSystemData(const ParticleSystemData2Ptr &newParticles)
Assign a new particle system data.
const Collider2Ptr & GetCollider() const
Returns the collider.
Generic N-dimensional array class interface.
Definition: Array.hpp:32
virtual void OnBeginAdvanceTimeStep(double timeStepInSeconds)
Called when a time-step is about to begin.
void SetDragCoefficient(double newDragCoefficient)
Sets the drag coefficient.
const Vector2D & GetGravity() const
Returns the gravity.
DerivedBuilder & WithRadius(double radius)
Returns builder with particle radius.
Definition: ParticleSystemSolver2.hpp:207
ParticleSystemSolver2 & operator=(const ParticleSystemSolver2 &)=delete
Deleted copy assignment operator.
DerivedBuilder & WithMass(double mass)
Returns builder with mass per particle.
Definition: ParticleSystemSolver2.hpp:214
ParticleSystemSolver2()
Constructs an empty solver.
double GetDragCoefficient() const
Returns the drag coefficient.