Jet  v1.3.3
volume_particle_emitter3.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_EMITTER3_H_
8 #define INCLUDE_JET_VOLUME_PARTICLE_EMITTER3_H_
9 
10 #include <jet/bounding_box3.h>
11 #include <jet/implicit_surface3.h>
12 #include <jet/particle_emitter3.h>
13 #include <jet/point_generator3.h>
14 
15 #include <limits>
16 #include <memory>
17 #include <random>
18 
19 namespace jet {
20 
27  public:
28  class Builder;
29 
49  const ImplicitSurface3Ptr& implicitSurface,
50  const BoundingBox3D& maxRegion,
51  double spacing,
52  const Vector3D& initialVel = Vector3D(),
53  const Vector3D& linearVel = Vector3D(),
54  const Vector3D& angularVel = Vector3D(),
56  double jitter = 0.0,
57  bool isOneShot = true,
58  bool allowOverlapping = false,
59  uint32_t seed = 0);
60 
69  void setPointGenerator(const PointGenerator3Ptr& newPointsGen);
70 
72  const ImplicitSurface3Ptr& surface() const;
73 
75  void setSurface(const ImplicitSurface3Ptr& newSurface);
76 
78  const BoundingBox3D& maxRegion() const;
79 
81  void setMaxRegion(const BoundingBox3D& 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 Vector3D& newInitialVel);
134 
137 
139  void setLinearVelocity(const Vector3D& newLinearVel);
140 
143 
145  void setAngularVelocity(const Vector3D& newAngularVel);
146 
148  static Builder builder();
149 
150  private:
151  std::mt19937 _rng;
152 
153  ImplicitSurface3Ptr _implicitSurface;
154  BoundingBox3D _bounds;
155  double _spacing;
156  Vector3D _initialVel;
157  Vector3D _linearVel;
158  Vector3D _angularVel;
159  PointGenerator3Ptr _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 ParticleSystemData3Ptr& particles,
180  Array1<Vector3D>* newPositions,
181  Array1<Vector3D>* newVelocities);
182 
183  double random();
184 
185  Vector3D velocityAt(const Vector3D& point) const;
186 };
187 
189 typedef std::shared_ptr<VolumeParticleEmitter3> VolumeParticleEmitter3Ptr;
190 
191 
196  public:
199 
202 
205 
208 
210  Builder& withInitialVelocity(const Vector3D& initialVel);
211 
213  Builder& withLinearVelocity(const Vector3D& linearVel);
214 
216  Builder& withAngularVelocity(const Vector3D& angularVel);
217 
220 
223 
226 
229 
231  Builder& withRandomSeed(uint32_t seed);
232 
235 
238 
239  private:
240  ImplicitSurface3Ptr _implicitSurface;
241  bool _isBoundSet = false;
242  BoundingBox3D _bounds;
243  double _spacing = 0.1;
244  Vector3D _initialVel;
245  Vector3D _linearVel;
246  Vector3D _angularVel;
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_EMITTER3_H_
jet::VolumeParticleEmitter3::setMaxRegion
void setMaxRegion(const BoundingBox3D &newBox)
Sets the max particle gen region.
jet::Array< T, 1 >
1-D array class.
Definition: array1.h:31
jet::VolumeParticleEmitter3::Builder
Front-end to create VolumeParticleEmitter3 objects step by step.
Definition: volume_particle_emitter3.h:195
jet::VolumeParticleEmitter3::Builder::withIsOneShot
Builder & withIsOneShot(bool isOneShot)
Returns builder with one-shot flag.
jet::ImplicitSurface3Ptr
std::shared_ptr< ImplicitSurface3 > ImplicitSurface3Ptr
Shared pointer type for the ImplicitSurface3.
Definition: implicit_surface3.h:43
jet::ParticleSystemData3Ptr
std::shared_ptr< ParticleSystemData3 > ParticleSystemData3Ptr
Shared pointer type of ParticleSystemData3.
Definition: particle_system_data3.h:250
particle_emitter3.h
jet::VolumeParticleEmitter3::Builder::withAllowOverlapping
Builder & withAllowOverlapping(bool allowOverlapping)
Returns builder with overlapping flag.
jet::VolumeParticleEmitter3::initialVelocity
Vector3D initialVelocity() const
Sets the initial velocity of the particles.
jet::VolumeParticleEmitter3::maxRegion
const BoundingBox3D & maxRegion() const
Returns max particle gen region.
jet::BoundingBox< T, 3 >
3-D axis-aligned bounding box class.
Definition: bounding_box3.h:41
jet::VolumeParticleEmitter3::Builder::withJitter
Builder & withJitter(double jitter)
Returns builder with jitter amount.
jet::ParticleEmitter3
Abstract base class for 3-D particle emitter.
Definition: particle_emitter3.h:18
jet::VolumeParticleEmitter3::Builder::withImplicitSurface
Builder & withImplicitSurface(const ImplicitSurface3Ptr &implicitSurface)
Returns builder with implicit surface defining volume shape.
jet::VolumeParticleEmitter3::VolumeParticleEmitter3
VolumeParticleEmitter3(const ImplicitSurface3Ptr &implicitSurface, const BoundingBox3D &maxRegion, double spacing, const Vector3D &initialVel=Vector3D(), const Vector3D &linearVel=Vector3D(), const Vector3D &angularVel=Vector3D(), size_t maxNumberOfParticles=kMaxSize, double jitter=0.0, bool isOneShot=true, bool allowOverlapping=false, uint32_t seed=0)
jet::VolumeParticleEmitter3::Builder::build
VolumeParticleEmitter3 build() const
Builds VolumeParticleEmitter3.
jet::VolumeParticleEmitter3::Builder::withSurface
Builder & withSurface(const Surface3Ptr &surface)
Returns builder with surface defining volume shape.
jet::VolumeParticleEmitter3::Builder::makeShared
VolumeParticleEmitter3Ptr makeShared() const
Builds shared pointer of VolumeParticleEmitter3 instance.
jet::VolumeParticleEmitter3::builder
static Builder builder()
Returns builder fox VolumeParticleEmitter3.
jet::VolumeParticleEmitter3::Builder::withInitialVelocity
Builder & withInitialVelocity(const Vector3D &initialVel)
Returns builder with initial velocity.
jet::VolumeParticleEmitter3::setInitialVelocity
void setInitialVelocity(const Vector3D &newInitialVel)
Returns the initial velocity of the particles.
jet::kMaxSize
constexpr size_t kMaxSize
Max size_t.
Definition: constants.h:79
jet::Surface3Ptr
std::shared_ptr< Surface3 > Surface3Ptr
Shared pointer for the Surface3 type.
Definition: surface3.h:109
jet::VolumeParticleEmitter3::Builder::withMaxNumberOfParticles
Builder & withMaxNumberOfParticles(size_t maxNumberOfParticles)
Returns builder with max number of particles.
jet::VolumeParticleEmitter3::setAllowOverlapping
void setAllowOverlapping(bool newValue)
Sets the flag to true if particles can overlap each other.
jet::VolumeParticleEmitter3::setPointGenerator
void setPointGenerator(const PointGenerator3Ptr &newPointsGen)
Sets the point generator.
jet
Definition: advection_solver2.h:18
jet::VolumeParticleEmitter3::setMaxNumberOfParticles
void setMaxNumberOfParticles(size_t newMaxNumberOfParticles)
Sets the max number of particles to be emitted.
jet::VolumeParticleEmitter3
3-D volumetric particle emitter.
Definition: volume_particle_emitter3.h:26
jet::VolumeParticleEmitter3::Builder::withSpacing
Builder & withSpacing(double spacing)
Returns builder with spacing.
jet::VolumeParticleEmitter3::setSurface
void setSurface(const ImplicitSurface3Ptr &newSurface)
Sets the source surface.
jet::VolumeParticleEmitter3::setIsOneShot
void setIsOneShot(bool newValue)
Sets the flag to true if particles are emitted just once.
jet::VolumeParticleEmitter3::setJitter
void setJitter(double newJitter)
Sets jitter amount between 0 and 1.
jet::VolumeParticleEmitter3::Builder::withLinearVelocity
Builder & withLinearVelocity(const Vector3D &linearVel)
Returns builder with linear velocity.
jet::PointGenerator3Ptr
std::shared_ptr< PointGenerator3 > PointGenerator3Ptr
Shared pointer for the PointGenerator3 type.
Definition: point_generator3.h:56
jet::VolumeParticleEmitter3::surface
const ImplicitSurface3Ptr & surface() const
Returns source surface.
jet::VolumeParticleEmitter3::Builder::withMaxRegion
Builder & withMaxRegion(const BoundingBox3D &bounds)
Returns builder with max region.
jet::VolumeParticleEmitter3::setAngularVelocity
void setAngularVelocity(const Vector3D &newAngularVel)
Sets the linear velocity of the emitter.
point_generator3.h
jet::Vector3D
Vector3< double > Vector3D
Double-type 3D vector.
Definition: vector3.h:349
jet::VolumeParticleEmitter3::Builder::withRandomSeed
Builder & withRandomSeed(uint32_t seed)
Returns builder with random seed.
implicit_surface3.h
jet::Vector< T, 3 >
3-D vector class.
Definition: vector3.h:25
jet::VolumeParticleEmitter3::setLinearVelocity
void setLinearVelocity(const Vector3D &newLinearVel)
Sets the linear velocity of the emitter.
jet::VolumeParticleEmitter3::jitter
double jitter() const
Returns jitter amount.
jet::VolumeParticleEmitter3::angularVelocity
Vector3D angularVelocity() const
Returns the angular velocity of the emitter.
jet::VolumeParticleEmitter3::isOneShot
bool isOneShot() const
Returns true if particles should be emitted just once.
bounding_box3.h
jet::VolumeParticleEmitter3::allowOverlapping
bool allowOverlapping() const
Returns true if particles can be overlapped.
jet::VolumeParticleEmitter3::Builder::withAngularVelocity
Builder & withAngularVelocity(const Vector3D &angularVel)
Returns builder with angular velocity.
jet::VolumeParticleEmitter3::maxNumberOfParticles
size_t maxNumberOfParticles() const
Returns max number of particles to be emitted.
jet::VolumeParticleEmitter3::linearVelocity
Vector3D linearVelocity() const
Returns the linear velocity of the emitter.
jet::VolumeParticleEmitter3::setSpacing
void setSpacing(double newSpacing)
Sets the spacing between particles.
jet::VolumeParticleEmitter3::spacing
double spacing() const
Returns the spacing between particles.
jet::VolumeParticleEmitter3Ptr
std::shared_ptr< VolumeParticleEmitter3 > VolumeParticleEmitter3Ptr
Shared pointer for the VolumeParticleEmitter3 type.
Definition: volume_particle_emitter3.h:189