Jet  v1.3.3
implicit_surface_set3.h
Go to the documentation of this file.
1 // Copyright (c) 2018 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_IMPLICIT_SURFACE_SET3_H_
8 #define INCLUDE_JET_IMPLICIT_SURFACE_SET3_H_
9 
10 #include <jet/bvh3.h>
11 #include <jet/implicit_surface3.h>
12 
13 #include <vector>
14 
15 namespace jet {
16 
24 class ImplicitSurfaceSet3 final : public ImplicitSurface3 {
25  public:
26  class Builder;
27 
30 
32  ImplicitSurfaceSet3(const std::vector<ImplicitSurface3Ptr>& surfaces,
33  const Transform3& transform = Transform3(),
34  bool isNormalFlipped = false);
35 
37  ImplicitSurfaceSet3(const std::vector<Surface3Ptr>& surfaces,
38  const Transform3& transform = Transform3(),
39  bool isNormalFlipped = false);
40 
43 
45  void updateQueryEngine() override;
46 
48  bool isBounded() const override;
49 
51  bool isValidGeometry() const override;
52 
54  size_t numberOfSurfaces() const;
55 
57  const ImplicitSurface3Ptr& surfaceAt(size_t i) const;
58 
60  void addExplicitSurface(const Surface3Ptr& surface);
61 
63  void addSurface(const ImplicitSurface3Ptr& surface);
64 
66  static Builder builder();
67 
68  private:
69  std::vector<ImplicitSurface3Ptr> _surfaces;
70  std::vector<ImplicitSurface3Ptr> _unboundedSurfaces;
71  mutable Bvh3<ImplicitSurface3Ptr> _bvh;
72  mutable bool _bvhInvalidated = true;
73 
74  // Surface3 implementations
75 
76  Vector3D closestPointLocal(const Vector3D& otherPoint) const override;
77 
78  BoundingBox3D boundingBoxLocal() const override;
79 
80  double closestDistanceLocal(const Vector3D& otherPoint) const override;
81 
82  bool intersectsLocal(const Ray3D& ray) const override;
83 
84  Vector3D closestNormalLocal(const Vector3D& otherPoint) const override;
85 
86  SurfaceRayIntersection3 closestIntersectionLocal(
87  const Ray3D& ray) const override;
88 
89  bool isInsideLocal(const Vector3D& otherPoint) const override;
90 
91  // ImplicitSurface3 implementations
92 
93  double signedDistanceLocal(const Vector3D& otherPoint) const override;
94 
95  void invalidateBvh();
96 
97  void buildBvh() const;
98 };
99 
101 typedef std::shared_ptr<ImplicitSurfaceSet3> ImplicitSurfaceSet3Ptr;
102 
107  : public SurfaceBuilderBase3<ImplicitSurfaceSet3::Builder> {
108  public:
110  Builder& withSurfaces(const std::vector<ImplicitSurface3Ptr>& surfaces);
111 
113  Builder& withExplicitSurfaces(const std::vector<Surface3Ptr>& surfaces);
114 
117 
120 
121  private:
122  bool _isNormalFlipped = false;
123  std::vector<ImplicitSurface3Ptr> _surfaces;
124 };
125 
126 } // namespace jet
127 
128 #endif // INCLUDE_JET_IMPLICIT_SURFACE_SET3_H_
jet::ImplicitSurfaceSet3::addExplicitSurface
void addExplicitSurface(const Surface3Ptr &surface)
Adds an explicit surface instance.
jet::ImplicitSurfaceSet3::ImplicitSurfaceSet3
ImplicitSurfaceSet3()
Constructs an empty implicit surface set.
jet::ImplicitSurfaceSet3Ptr
std::shared_ptr< ImplicitSurfaceSet3 > ImplicitSurfaceSet3Ptr
Shared pointer type for the ImplicitSurfaceSet3.
Definition: implicit_surface_set3.h:101
jet::ImplicitSurface3Ptr
std::shared_ptr< ImplicitSurface3 > ImplicitSurface3Ptr
Shared pointer type for the ImplicitSurface3.
Definition: implicit_surface3.h:43
jet::ImplicitSurfaceSet3::Builder::withSurfaces
Builder & withSurfaces(const std::vector< ImplicitSurface3Ptr > &surfaces)
Returns builder with surfaces.
jet::ImplicitSurfaceSet3::Builder::build
ImplicitSurfaceSet3 build() const
Builds ImplicitSurfaceSet3.
jet::ImplicitSurfaceSet3::Builder::makeShared
ImplicitSurfaceSet3Ptr makeShared() const
Builds shared pointer of ImplicitSurfaceSet3 instance.
jet::BoundingBox< T, 3 >
3-D axis-aligned bounding box class.
Definition: bounding_box3.h:41
jet::ImplicitSurfaceSet3::ImplicitSurfaceSet3
ImplicitSurfaceSet3(const std::vector< Surface3Ptr > &surfaces, const Transform3 &transform=Transform3(), bool isNormalFlipped=false)
Constructs an implicit surface set using list of other surfaces.
jet::ImplicitSurface3
Abstract base class for 3-D implicit surface.
Definition: implicit_surface3.h:15
jet::ImplicitSurfaceSet3::ImplicitSurfaceSet3
ImplicitSurfaceSet3(const ImplicitSurfaceSet3 &other)
Copy constructor.
jet::ImplicitSurfaceSet3::numberOfSurfaces
size_t numberOfSurfaces() const
Returns the number of implicit surfaces.
jet::ImplicitSurfaceSet3::ImplicitSurfaceSet3
ImplicitSurfaceSet3(const std::vector< ImplicitSurface3Ptr > &surfaces, const Transform3 &transform=Transform3(), bool isNormalFlipped=false)
Constructs an implicit surface set using list of other surfaces.
jet::SurfaceBuilderBase3
Base class for 3-D surface builder.
Definition: surface3.h:115
jet::Surface3::isNormalFlipped
bool isNormalFlipped
Flips normal when calling Surface3::closestNormal(...).
Definition: surface3.h:33
jet::Surface3Ptr
std::shared_ptr< Surface3 > Surface3Ptr
Shared pointer for the Surface3 type.
Definition: surface3.h:109
jet
Definition: advection_solver2.h:18
jet::ImplicitSurfaceSet3::updateQueryEngine
void updateQueryEngine() override
Updates internal spatial query engine.
jet::ImplicitSurfaceSet3::isBounded
bool isBounded() const override
Returns true if bounding box can be defined.
jet::Bvh3< ImplicitSurface3Ptr >
bvh3.h
jet::ImplicitSurfaceSet3::isValidGeometry
bool isValidGeometry() const override
Returns true if the surface is a valid geometry.
jet::ImplicitSurfaceSet3::surfaceAt
const ImplicitSurface3Ptr & surfaceAt(size_t i) const
Returns the i-th implicit surface.
jet::Surface3::transform
Transform3 transform
Local-to-world transform.
Definition: surface3.h:30
jet::Ray< T, 3 >
Class for 2-D ray.
Definition: ray3.h:21
jet::ImplicitSurfaceSet3
3-D implicit surface set.
Definition: implicit_surface_set3.h:24
jet::ImplicitSurfaceSet3::Builder::withExplicitSurfaces
Builder & withExplicitSurfaces(const std::vector< Surface3Ptr > &surfaces)
Returns builder with explicit surfaces.
jet::SurfaceRayIntersection3
Struct that represents ray-surface intersection point.
Definition: surface3.h:19
jet::ImplicitSurfaceSet3::addSurface
void addSurface(const ImplicitSurface3Ptr &surface)
Adds an implicit surface instance.
jet::ImplicitSurfaceSet3::Builder
Front-end to create ImplicitSurfaceSet3 objects step by step.
Definition: implicit_surface_set3.h:107
implicit_surface3.h
jet::Vector< T, 3 >
3-D vector class.
Definition: vector3.h:25
jet::Transform3
Represents 3-D rigid body transform.
Definition: transform3.h:20
jet::ImplicitSurfaceSet3::builder
static Builder builder()
Returns builder fox ImplicitSurfaceSet3.