Loading...
Searching...
No Matches
ImplicitSurfaceSet.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_IMPLICIT_SURFACE_SET_HPP
12#define CUBBYFLOW_IMPLICIT_SURFACE_SET_HPP
13
14#include <Core/Array/Array.hpp>
15#include <Core/Geometry/BVH.hpp>
17
18namespace CubbyFlow
19{
27template <size_t N>
29{
30 public:
31 class Builder;
32
35
37 ImplicitSurfaceSet() = default;
38
43 bool _isNormalFlipped = false);
44
48 bool _isNormalFlipped = false);
49
51 ~ImplicitSurfaceSet() override = default;
52
55
58
61
64
66 void UpdateQueryEngine() override;
67
68 [[nodiscard]] bool IsBounded() const override;
69
71 [[nodiscard]] bool IsValidGeometry() const override;
72
74 [[nodiscard]] size_t NumberOfSurfaces() const;
75
77 [[nodiscard]] const std::shared_ptr<ImplicitSurface<N>>& SurfaceAt(
78 size_t i) const;
79
81 void AddExplicitSurface(const std::shared_ptr<Surface<N>>& surface);
82
84 void AddSurface(const std::shared_ptr<ImplicitSurface<N>>& surface);
85
88
89 private:
90 [[nodiscard]] Vector<double, N> ClosestPointLocal(
91 const Vector<double, N>& otherPoint) const override;
92
93 [[nodiscard]] BoundingBox<double, N> BoundingBoxLocal() const override;
94
95 [[nodiscard]] bool IsInsideLocal(
96 const Vector<double, N>& otherPoint) const override;
97
98 [[nodiscard]] double ClosestDistanceLocal(
99 const Vector<double, N>& otherPoint) const override;
100
101 [[nodiscard]] bool IntersectsLocal(
102 const Ray<double, N>& ray) const override;
103
104 [[nodiscard]] Vector<double, N> ClosestNormalLocal(
105 const Vector<double, N>& otherPoint) const override;
106
107 [[nodiscard]] SurfaceRayIntersection<N> ClosestIntersectionLocal(
108 const Ray<double, N>& ray) const override;
109
110 [[nodiscard]] double SignedDistanceLocal(
111 const Vector<double, N>& otherPoint) const override;
112
113 void InvalidateBVH() const;
114
115 void BuildBVH() const;
116
118 Array1<std::shared_ptr<ImplicitSurface<N>>> m_unboundedSurfaces;
120 mutable bool m_bvhInvalidated = true;
121};
122
125
128
130using ImplicitSurfaceSet2Ptr = std::shared_ptr<ImplicitSurfaceSet2>;
131
133using ImplicitSurfaceSet3Ptr = std::shared_ptr<ImplicitSurfaceSet3>;
134
138template <size_t N>
140 : public SurfaceBuilderBase<N, typename ImplicitSurfaceSet<N>::Builder>
141{
142 public:
145 const ConstArrayView1<std::shared_ptr<ImplicitSurface<N>>>& surfaces);
146
149 const ConstArrayView1<std::shared_ptr<Surface<N>>>& surfaces);
150
153
155 std::shared_ptr<ImplicitSurfaceSet<N>> MakeShared() const;
156
157 private:
159 using Base::m_isNormalFlipped;
160 using Base::m_transform;
161
163};
164} // namespace CubbyFlow
165
166#endif
Generic N-dimensional array class interface.
Definition ArrayView.hpp:26
Abstract base class for N-D implicit surface.
Definition ImplicitSurface.hpp:21
Front-end to create ImplicitSurfaceSet objects step by step.
Definition ImplicitSurfaceSet.hpp:141
Builder & WithSurfaces(const ConstArrayView1< std::shared_ptr< ImplicitSurface< N > > > &surfaces)
Returns builder with surfaces.
Builder & WithExplicitSurfaces(const ConstArrayView1< std::shared_ptr< Surface< N > > > &surfaces)
Returns builder with explicit surfaces.
std::shared_ptr< ImplicitSurfaceSet< N > > MakeShared() const
Builds shared pointer of ImplicitSurfaceSet instance.
ImplicitSurfaceSet< N > Build() const
Builds ImplicitSurfaceSet.
N-D implicit surface set.
Definition ImplicitSurfaceSet.hpp:29
static Builder GetBuilder()
Returns builder fox ImplicitSurfaceSet.
ImplicitSurfaceSet & operator=(const ImplicitSurfaceSet &other)
Copy assignment operator.
ImplicitSurfaceSet()=default
Constructs an empty implicit surface set.
~ImplicitSurfaceSet() override=default
Default virtual destructor.
void UpdateQueryEngine() override
Updates internal spatial query engine.
ImplicitSurfaceSet & operator=(ImplicitSurfaceSet &&other) noexcept
Move assignment operator.
const std::shared_ptr< ImplicitSurface< N > > & SurfaceAt(size_t i) const
Returns the i-th implicit surface.
bool IsBounded() const override
Returns true if bounding box can be defined.
void AddExplicitSurface(const std::shared_ptr< Surface< N > > &surface)
Adds an explicit surface instance.
bool IsValidGeometry() const override
Returns true if the surface is a valid geometry.
ImplicitSurfaceSet(const ImplicitSurfaceSet &other)
Copy constructor.
ImplicitSurfaceSet(ImplicitSurfaceSet &&other) noexcept
Move constructor.
ImplicitSurfaceSet(ConstArrayView1< std::shared_ptr< Surface< N > > > surfaces, const Transform< N > &_transform=Transform< N >{}, bool _isNormalFlipped=false)
Constructs an implicit surface set using list of other surfaces.
ImplicitSurfaceSet(ConstArrayView1< std::shared_ptr< ImplicitSurface< N > > > surfaces, const Transform< N > &_transform=Transform< N >{}, bool _isNormalFlipped=false)
Constructs an implicit surface set using list of other surfaces.
void AddSurface(const std::shared_ptr< ImplicitSurface< N > > &surface)
Adds an implicit surface instance.
size_t NumberOfSurfaces() const
Returns the number of implicit surfaces.
Definition Matrix.hpp:30
Base class for N-D surface builder.
Definition Surface.hpp:154
bool isNormalFlipped
Flips normal.
Definition Surface.hpp:102
Transform< N > transform
Local-to-world transform.
Definition Surface.hpp:99
Definition pybind11Utils.hpp:21
Matrix< T, Rows, 1 > Vector
Definition Matrix.hpp:738
std::shared_ptr< ImplicitSurfaceSet2 > ImplicitSurfaceSet2Ptr
Shared pointer type for the ImplicitSurfaceSet2.
Definition ImplicitSurfaceSet.hpp:130
std::shared_ptr< ImplicitSurfaceSet3 > ImplicitSurfaceSet3Ptr
Shared pointer type for the ImplicitSurfaceSet3.
Definition ImplicitSurfaceSet.hpp:133