Jet  v1.3.3
volume_particle_emitter2.h
Go to the documentation of this file.
1 // Copyright (c) 2019 Doyub Kim
2 //
3 // I am making my contributions/submissions to this project solely in my
4 // personal capacity and am not conveying any rights to any intellectual
5 // property of any third parties.
6 
7 #ifndef INCLUDE_JET_VOLUME_PARTICLE_EMITTER2_H_
8 #define INCLUDE_JET_VOLUME_PARTICLE_EMITTER2_H_
9 
10 #include <jet/constants.h>
11 #include <jet/bounding_box2.h>
12 #include <jet/implicit_surface2.h>
13 #include <jet/particle_emitter2.h>
14 #include <jet/point_generator2.h>
15 
16 #include <limits>
17 #include <memory>
18 #include <random>
19 
20 namespace jet {
21 
28  public:
29  class Builder;
30 
49  const ImplicitSurface2Ptr& implicitSurface,
50  const BoundingBox2D& maxRegion,
51  double spacing,
52  const Vector2D& initialVel = Vector2D(),
53  const Vector2D& linearVel = Vector2D(),
54  double angularVel = 0.0,
56  double jitter = 0.0,
57  bool isOneShot = true,
58  bool allowOverlapping = false,
59  uint32_t seed = 0);
60 
69  void setPointGenerator(const PointGenerator2Ptr& newPointsGen);
70 
72  const ImplicitSurface2Ptr& surface() const;
73 
75  void setSurface(const ImplicitSurface2Ptr& newSurface);
76 
78  const BoundingBox2D& maxRegion() const;
79 
81  void setMaxRegion(const BoundingBox2D& newBox);
82 
84  double jitter() const;
85 
87  void setJitter(double newJitter);
88 
90  bool isOneShot() const;
91 
101  void setIsOneShot(bool newValue);
102 
104  bool allowOverlapping() const;
105 
115  void setAllowOverlapping(bool newValue);
116 
118  size_t maxNumberOfParticles() const;
119 
121  void setMaxNumberOfParticles(size_t newMaxNumberOfParticles);
122 
124  double spacing() const;
125 
127  void setSpacing(double newSpacing);
128 
131 
133  void setInitialVelocity(const Vector2D& newInitialVel);
134 
137 
139  void setLinearVelocity(const Vector2D& newLinearVel);
140 
142  double angularVelocity() const;
143 
145  void setAngularVelocity(double newAngularVel);
146 
148  static Builder builder();
149 
150  private:
151  std::mt19937 _rng;
152 
153  ImplicitSurface2Ptr _implicitSurface;
154  BoundingBox2D _bounds;
155  double _spacing;
156  Vector2D _initialVel;
157  Vector2D _linearVel;
158  double _angularVel = 0.0;
159  PointGenerator2Ptr _pointsGen;
160 
161  size_t _maxNumberOfParticles = kMaxSize;
162  size_t _numberOfEmittedParticles = 0;
163 
164  double _jitter = 0.0;
165  bool _isOneShot = true;
166  bool _allowOverlapping = false;
167 
174  void onUpdate(
175  double currentTimeInSeconds,
176  double timeIntervalInSeconds) override;
177 
178  void emit(
179  const ParticleSystemData2Ptr& particles,
180  Array1<Vector2D>* newPositions,
181  Array1<Vector2D>* newVelocities);
182 
183  double random();
184 
185  Vector2D velocityAt(const Vector2D& point) const;
186 };
187 
189 typedef std::shared_ptr<VolumeParticleEmitter2> VolumeParticleEmitter2Ptr;
190 
191 
196  public:
199 
202 
205 
208 
210  Builder& withInitialVelocity(const Vector2D& initialVel);
211 
213  Builder& withLinearVelocity(const Vector2D& linearVel);
214 
216  Builder& withAngularVelocity(double angularVel);
217 
220 
223 
226 
229 
231  Builder& withRandomSeed(uint32_t seed);
232 
235 
238 
239  private:
240  ImplicitSurface2Ptr _implicitSurface;
241  bool _isBoundSet = false;
242  BoundingBox2D _bounds;
243  double _spacing = 0.1;
244  Vector2D _initialVel;
245  Vector2D _linearVel;
246  double _angularVel = 0.0;
247  size_t _maxNumberOfParticles = kMaxSize;
248  double _jitter = 0.0;
249  bool _isOneShot = true;
250  bool _allowOverlapping = false;
251  uint32_t _seed = 0;
252 };
253 
254 } // namespace jet
255 
256 #endif // INCLUDE_JET_VOLUME_PARTICLE_EMITTER2_H_
jet::VolumeParticleEmitter2::Builder::withSurface
Builder & withSurface(const Surface2Ptr &surface)
Returns builder with surface defining volume shape.
jet::VolumeParticleEmitter2::Builder::withAllowOverlapping
Builder & withAllowOverlapping(bool allowOverlapping)
Returns builder with overlapping flag.
jet::Array< T, 1 >
1-D array class.
Definition: array1.h:31
jet::ParticleEmitter2
Abstract base class for 2-D particle emitter.
Definition: particle_emitter2.h:18
jet::VolumeParticleEmitter2::setJitter
void setJitter(double newJitter)
Sets jitter amount between 0 and 1.
jet::VolumeParticleEmitter2::jitter
double jitter() const
Returns jitter amount.
jet::VolumeParticleEmitter2::Builder::withSpacing
Builder & withSpacing(double spacing)
Returns builder with spacing.
jet::Vector2D
Vector2< double > Vector2D
Double-type 2D vector.
Definition: vector2.h:340
jet::VolumeParticleEmitter2::Builder::withMaxRegion
Builder & withMaxRegion(const BoundingBox2D &bounds)
Returns builder with max region.
jet::VolumeParticleEmitter2::setLinearVelocity
void setLinearVelocity(const Vector2D &newLinearVel)
Sets the linear velocity of the emitter.
jet::VolumeParticleEmitter2::setMaxNumberOfParticles
void setMaxNumberOfParticles(size_t newMaxNumberOfParticles)
Sets the max number of particles to be emitted.
jet::VolumeParticleEmitter2
2-D volumetric particle emitter.
Definition: volume_particle_emitter2.h:27
jet::VolumeParticleEmitter2::surface
const ImplicitSurface2Ptr & surface() const
Returns source surface.
jet::VolumeParticleEmitter2Ptr
std::shared_ptr< VolumeParticleEmitter2 > VolumeParticleEmitter2Ptr
Shared pointer for the VolumeParticleEmitter2 type.
Definition: volume_particle_emitter2.h:189
jet::kMaxSize
constexpr size_t kMaxSize
Max size_t.
Definition: constants.h:79
jet::VolumeParticleEmitter2::Builder::withRandomSeed
Builder & withRandomSeed(uint32_t seed)
Returns builder with random seed.
jet::VolumeParticleEmitter2::maxRegion
const BoundingBox2D & maxRegion() const
Returns max particle gen region.
jet::VolumeParticleEmitter2::isOneShot
bool isOneShot() const
Returns true if particles should be emitted just once.
jet::VolumeParticleEmitter2::Builder::withIsOneShot
Builder & withIsOneShot(bool isOneShot)
Returns builder with one-shot flag.
implicit_surface2.h
jet::VolumeParticleEmitter2::Builder::build
VolumeParticleEmitter2 build() const
Builds VolumeParticleEmitter2.
jet::VolumeParticleEmitter2::Builder::withInitialVelocity
Builder & withInitialVelocity(const Vector2D &initialVel)
Returns builder with initial velocity.
jet
Definition: advection_solver2.h:18
point_generator2.h
jet::ImplicitSurface2Ptr
std::shared_ptr< ImplicitSurface2 > ImplicitSurface2Ptr
Shared pointer type for the ImplicitSurface2.
Definition: implicit_surface2.h:43
particle_emitter2.h
jet::VolumeParticleEmitter2::initialVelocity
Vector2D initialVelocity() const
Sets the initial velocity of the particles.
jet::Surface2Ptr
std::shared_ptr< Surface2 > Surface2Ptr
Shared pointer for the Surface2 type.
Definition: surface2.h:109
jet::VolumeParticleEmitter2::Builder::withMaxNumberOfParticles
Builder & withMaxNumberOfParticles(size_t maxNumberOfParticles)
Returns builder with max number of particles.
jet::VolumeParticleEmitter2::setPointGenerator
void setPointGenerator(const PointGenerator2Ptr &newPointsGen)
Sets the point generator.
jet::Vector< T, 2 >
2-D vector class.
Definition: vector2.h:24
jet::VolumeParticleEmitter2::setAngularVelocity
void setAngularVelocity(double newAngularVel)
Sets the linear velocity of the emitter.
jet::VolumeParticleEmitter2::linearVelocity
Vector2D linearVelocity() const
Returns the linear velocity of the emitter.
jet::VolumeParticleEmitter2::setAllowOverlapping
void setAllowOverlapping(bool newValue)
Sets the flag to true if particles can overlap each other.
jet::VolumeParticleEmitter2::setSpacing
void setSpacing(double newSpacing)
Sets the spacing between particles.
jet::VolumeParticleEmitter2::angularVelocity
double angularVelocity() const
Returns the angular velocity of the emitter.
bounding_box2.h
jet::VolumeParticleEmitter2::VolumeParticleEmitter2
VolumeParticleEmitter2(const ImplicitSurface2Ptr &implicitSurface, const BoundingBox2D &maxRegion, double spacing, const Vector2D &initialVel=Vector2D(), const Vector2D &linearVel=Vector2D(), double angularVel=0.0, size_t maxNumberOfParticles=kMaxSize, double jitter=0.0, bool isOneShot=true, bool allowOverlapping=false, uint32_t seed=0)
jet::VolumeParticleEmitter2::spacing
double spacing() const
Returns the spacing between particles.
jet::VolumeParticleEmitter2::Builder::withImplicitSurface
Builder & withImplicitSurface(const ImplicitSurface2Ptr &implicitSurface)
Returns builder with implicit surface defining volume shape.
jet::BoundingBox< T, 2 >
2-D axis-aligned bounding box class.
Definition: bounding_box2.h:41
jet::VolumeParticleEmitter2::setMaxRegion
void setMaxRegion(const BoundingBox2D &newBox)
Sets the max particle gen region.
jet::VolumeParticleEmitter2::Builder::withLinearVelocity
Builder & withLinearVelocity(const Vector2D &linearVel)
Returns builder with linear velocity.
jet::VolumeParticleEmitter2::allowOverlapping
bool allowOverlapping() const
Returns trhe if particles can be overlapped.
jet::VolumeParticleEmitter2::Builder
Front-end to create VolumeParticleEmitter2 objects step by step.
Definition: volume_particle_emitter2.h:195
constants.h
jet::PointGenerator2Ptr
std::shared_ptr< PointGenerator2 > PointGenerator2Ptr
Shared pointer for the PointGenerator2 type.
Definition: point_generator2.h:56
jet::ParticleSystemData2Ptr
std::shared_ptr< ParticleSystemData2 > ParticleSystemData2Ptr
Shared pointer type of ParticleSystemData2.
Definition: particle_system_data2.h:250
jet::VolumeParticleEmitter2::Builder::withJitter
Builder & withJitter(double jitter)
Returns builder with jitter amount.
jet::VolumeParticleEmitter2::Builder::makeShared
VolumeParticleEmitter2Ptr makeShared() const
Builds shared pointer of VolumeParticleEmitter2 instance.
jet::VolumeParticleEmitter2::builder
static Builder builder()
Returns builder fox VolumeParticleEmitter2.
jet::VolumeParticleEmitter2::setIsOneShot
void setIsOneShot(bool newValue)
Sets the flag to true if particles are emitted just once.
jet::VolumeParticleEmitter2::setInitialVelocity
void setInitialVelocity(const Vector2D &newInitialVel)
Returns the initial velocity of the particles.
jet::VolumeParticleEmitter2::Builder::withAngularVelocity
Builder & withAngularVelocity(double angularVel)
Returns builder with angular velocity.
jet::VolumeParticleEmitter2::setSurface
void setSurface(const ImplicitSurface2Ptr &newSurface)
Sets the source surface.
jet::VolumeParticleEmitter2::maxNumberOfParticles
size_t maxNumberOfParticles() const
Returns max number of particles to be emitted.