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
47 ConstArrayView1<std::shared_ptr<Surface<N>>> surfaces,
49 bool _isNormalFlipped = false);
50
52 ~ImplicitSurfaceSet() override = default;
53
56
59
62
65
67 void UpdateQueryEngine() override;
68
69 [[nodiscard]] bool IsBounded() const override;
70
72 [[nodiscard]] bool IsValidGeometry() const override;
73
75 [[nodiscard]] size_t NumberOfSurfaces() const;
76
78 [[nodiscard]] const std::shared_ptr<ImplicitSurface<N>>& SurfaceAt(
79 size_t i) const;
80
82 void AddExplicitSurface(const std::shared_ptr<Surface<N>>& surface);
83
85 void AddSurface(const std::shared_ptr<ImplicitSurface<N>>& surface);
86
89
90 private:
91 [[nodiscard]] Vector<double, N> ClosestPointLocal(
92 const Vector<double, N>& otherPoint) const override;
93
94 [[nodiscard]] BoundingBox<double, N> BoundingBoxLocal() const override;
95
96 [[nodiscard]] bool IsInsideLocal(
97 const Vector<double, N>& otherPoint) const override;
98
99 [[nodiscard]] double ClosestDistanceLocal(
100 const Vector<double, N>& otherPoint) const override;
101
102 [[nodiscard]] bool IntersectsLocal(
103 const Ray<double, N>& ray) const override;
104
105 [[nodiscard]] Vector<double, N> ClosestNormalLocal(
106 const Vector<double, N>& otherPoint) const override;
107
108 [[nodiscard]] SurfaceRayIntersection<N> ClosestIntersectionLocal(
109 const Ray<double, N>& ray) const override;
110
111 [[nodiscard]] double SignedDistanceLocal(
112 const Vector<double, N>& otherPoint) const override;
113
114 void InvalidateBVH() const;
115
116 void BuildBVH() const;
117
119 Array1<std::shared_ptr<ImplicitSurface<N>>> m_unboundedSurfaces;
121 mutable bool m_bvhInvalidated = true;
122};
123
126
129
131using ImplicitSurfaceSet2Ptr = std::shared_ptr<ImplicitSurfaceSet2>;
132
134using ImplicitSurfaceSet3Ptr = std::shared_ptr<ImplicitSurfaceSet3>;
135
139template <size_t N>
141 : public SurfaceBuilderBase<N, typename ImplicitSurfaceSet<N>::Builder>
142{
143 public:
146 const ConstArrayView1<std::shared_ptr<ImplicitSurface<N>>>& surfaces);
147
150 const ConstArrayView1<std::shared_ptr<Surface<N>>>& surfaces);
151
154
156 std::shared_ptr<ImplicitSurfaceSet<N>> MakeShared() const;
157
158 private:
160 using Base::m_isNormalFlipped;
161 using Base::m_transform;
162
164};
165} // namespace CubbyFlow
166
167#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:142
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:22
Matrix< T, Rows, 1 > Vector
Definition Matrix.hpp:719
std::shared_ptr< ImplicitSurfaceSet2 > ImplicitSurfaceSet2Ptr
Shared pointer type for the ImplicitSurfaceSet2.
Definition ImplicitSurfaceSet.hpp:131
std::shared_ptr< ImplicitSurfaceSet3 > ImplicitSurfaceSet3Ptr
Shared pointer type for the ImplicitSurfaceSet3.
Definition ImplicitSurfaceSet.hpp:134