VolumeGridEmitter3.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_VOLUME_GRID_EMITTER3_HPP
12 #define CUBBYFLOW_VOLUME_GRID_EMITTER3_HPP
13 
16 #include <Core/Grid/ScalarGrid.hpp>
17 #include <Core/Grid/VectorGrid.hpp>
18 #include <Core/Matrix/Matrix.hpp>
19 
20 #include <memory>
21 
22 namespace CubbyFlow
23 {
27 class VolumeGridEmitter3 final : public GridEmitter3
28 {
29  public:
30  class Builder;
31 
33  using ScalarMapper = std::function<double(double, const Vector3D&, double)>;
34 
36  using VectorMapper =
37  std::function<Vector3D(double, const Vector3D&, const Vector3D&)>;
38 
46  explicit VolumeGridEmitter3(ImplicitSurface3Ptr sourceRegion,
47  bool isOneShot = true);
48 
50  VolumeGridEmitter3(const VolumeGridEmitter3&) = default;
51 
53  VolumeGridEmitter3(VolumeGridEmitter3&&) noexcept = default;
54 
56  ~VolumeGridEmitter3() override = default;
57 
59  VolumeGridEmitter3& operator=(const VolumeGridEmitter3&) = default;
60 
62  VolumeGridEmitter3& operator=(VolumeGridEmitter3&&) noexcept = default;
63 
65  void AddSignedDistanceTarget(const ScalarGrid3Ptr& scalarGridTarget);
66 
74  void AddStepFunctionTarget(const ScalarGrid3Ptr& scalarGridTarget,
75  double minValue, double maxValue);
76 
91  void AddTarget(const ScalarGrid3Ptr& scalarGridTarget,
92  const ScalarMapper& customMapper);
93 
108  void AddTarget(const VectorGrid3Ptr& vectorGridTarget,
109  const VectorMapper& customMapper);
110 
112  [[nodiscard]] const ImplicitSurface3Ptr& GetSourceRegion() const;
113 
115  [[nodiscard]] bool GetIsOneShot() const;
116 
118  [[nodiscard]] static Builder GetBuilder();
119 
120  private:
121  using ScalarTarget = std::tuple<ScalarGrid3Ptr, ScalarMapper>;
122  using VectorTarget = std::tuple<VectorGrid3Ptr, VectorMapper>;
123 
124  void OnUpdate(double currentTimeInSeconds,
125  double timeIntervalInSeconds) override;
126 
127  void Emit();
128 
129  ImplicitSurface3Ptr m_sourceRegion;
130  std::vector<ScalarTarget> m_customScalarTargets;
131  std::vector<VectorTarget> m_customVectorTargets;
132  bool m_isOneShot = true;
133  bool m_hasEmitted = false;
134 };
135 
137 using VolumeGridEmitter3Ptr = std::shared_ptr<VolumeGridEmitter3>;
138 
142 class VolumeGridEmitter3::Builder final
143 {
144  public:
146  [[nodiscard]] Builder& WithSourceRegion(const Surface3Ptr& sourceRegion);
147 
149  [[nodiscard]] Builder& WithIsOneShot(bool isOneShot);
150 
152  [[nodiscard]] VolumeGridEmitter3 Build() const;
153 
155  [[nodiscard]] VolumeGridEmitter3Ptr MakeShared() const;
156 
157  private:
158  ImplicitSurface3Ptr m_sourceRegion;
159  bool m_isOneShot = true;
160 };
161 } // namespace CubbyFlow
162 
163 #endif
bool GetIsOneShot() const
Returns true if this emits only once.
Front-end to create VolumeGridEmitter3 objects step by step.
Definition: VolumeGridEmitter3.hpp:142
std::shared_ptr< ImplicitSurface3 > ImplicitSurface3Ptr
Shared pointer type for the ImplicitSurface3.
Definition: ImplicitSurface.hpp:70
std::shared_ptr< ScalarGrid3 > ScalarGrid3Ptr
Shared pointer for the ScalarGrid3 type.
Definition: ScalarGrid.hpp:269
VolumeGridEmitter3(ImplicitSurface3Ptr sourceRegion, bool isOneShot=true)
Constructs an emitter with a source and is-one-shot flag.
static Builder GetBuilder()
Returns builder fox VolumeGridEmitter3.
std::function< Vector3D(double, const Vector3D &, const Vector3D &)> VectorMapper
Maps to a vector value for given signed-dist, location, and old value.
Definition: VolumeGridEmitter3.hpp:37
Definition: pybind11Utils.hpp:20
std::shared_ptr< Surface3 > Surface3Ptr
Shared pointer for the Surface3 type.
Definition: Surface.hpp:147
std::function< double(double, const Vector3D &, double)> ScalarMapper
Maps to a scalar value for given signed-dist, location, and old value.
Definition: VolumeGridEmitter3.hpp:33
void AddStepFunctionTarget(const ScalarGrid3Ptr &scalarGridTarget, double minValue, double maxValue)
Adds step function target to the scalar grid.
const ImplicitSurface3Ptr & GetSourceRegion() const
Returns implicit surface which defines the source region.
3-D grid-based volumetric emitter.
Definition: VolumeGridEmitter3.hpp:27
std::shared_ptr< VectorGrid3 > VectorGrid3Ptr
Shared pointer for the VectorGrid3 type.
Definition: VectorGrid.hpp:113
Abstract base class for 3-D grid-based emitters.
Definition: GridEmitter3.hpp:22
void AddSignedDistanceTarget(const ScalarGrid3Ptr &scalarGridTarget)
Adds signed-distance target to the scalar grid.
void AddTarget(const ScalarGrid3Ptr &scalarGridTarget, const ScalarMapper &customMapper)
Adds a scalar grid target.
std::shared_ptr< VolumeGridEmitter3 > VolumeGridEmitter3Ptr
Shared pointer type for the VolumeGridEmitter3.
Definition: VolumeGridEmitter3.hpp:137