ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
geometry_trampoline.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #pragma once
9 
10 #include <GenericTriangle.h>
11 #include <ecvBBox.h>
12 #include <ecvGenericPrimitive.h>
13 #include <ecvHObject.h>
14 #include <ecvMaterialSet.h>
15 #include <ecvMesh.h>
16 #include <ecvNormalVectors.h>
17 #include <ecvOrientedBBox.h>
19 #include <ecvScalarField.h>
20 #include <ecvSubMesh.h>
21 
24 
25 using namespace cloudViewer;
26 
27 template <class ObjectBase = ccObject>
28 class PyObjectBase : public ObjectBase {
29 public:
30  using ObjectBase::ObjectBase;
31  CV_CLASS_ENUM getClassID() const override {
32  PYBIND11_OVERLOAD_PURE(CV_CLASS_ENUM, ObjectBase, );
33  }
34 };
35 
36 template <class DrawableObjectBase = ccDrawableObject>
37 class PyDrawableObjectBase : public DrawableObjectBase {
38 public:
39  using DrawableObjectBase::DrawableObjectBase;
40  void draw(CC_DRAW_CONTEXT& context) override {
41  PYBIND11_OVERLOAD_PURE(void, DrawableObjectBase, context);
42  }
43 };
44 
45 template <class GeometryBase = ccHObject>
46 class PyGeometry : public PyObjectBase<GeometryBase> {
47 public:
49 
50  bool IsEmpty() const override {
51  PYBIND11_OVERLOAD_PURE(bool, GeometryBase, );
52  }
53 
54  Eigen::Vector3d GetMinBound() const override {
55  PYBIND11_OVERLOAD_PURE(Eigen::Vector3d, GeometryBase, );
56  }
57  Eigen::Vector2d GetMin2DBound() const override {
58  PYBIND11_OVERLOAD_PURE(Eigen::Vector2d, GeometryBase, );
59  }
60  Eigen::Vector3d GetMaxBound() const override {
61  PYBIND11_OVERLOAD_PURE(Eigen::Vector3d, GeometryBase, );
62  }
63  Eigen::Vector2d GetMax2DBound() const override {
64  PYBIND11_OVERLOAD_PURE(Eigen::Vector2d, GeometryBase, );
65  }
66  Eigen::Vector3d GetCenter() const override {
67  PYBIND11_OVERLOAD_PURE(Eigen::Vector3d, GeometryBase, );
68  }
69  ccBBox GetAxisAlignedBoundingBox() const override {
70  PYBIND11_OVERLOAD_PURE(ccBBox, GeometryBase, );
71  }
73  PYBIND11_OVERLOAD_PURE(ecvOrientedBBox, GeometryBase, );
74  }
75  GeometryBase& Transform(const Eigen::Matrix4d& transformation) override {
76  PYBIND11_OVERLOAD_PURE(GeometryBase&, GeometryBase, transformation);
77  }
78 };
79 
80 // MESH
81 template <class GenericMeshBase = cloudViewer::GenericMesh>
82 class PyGenericMesh : public GenericMeshBase {
83 public:
84  using GenericMeshBase::GenericMeshBase;
85 
86  unsigned size() const override {
87  PYBIND11_OVERLOAD_PURE(unsigned, GenericMeshBase, );
88  }
89  void forEach(std::function<void(cloudViewer::GenericTriangle&)> action)
90  override {
91  PYBIND11_OVERLOAD_PURE(void, GenericMeshBase, action);
92  }
93  void getBoundingBox(CCVector3& bbMin, CCVector3& bbMax) override {
94  PYBIND11_OVERLOAD_PURE(void, GenericMeshBase, bbMin, bbMax);
95  }
96  void placeIteratorAtBeginning() override {
97  PYBIND11_OVERLOAD_PURE(void, GenericMeshBase, );
98  }
100  PYBIND11_OVERLOAD_PURE(cloudViewer::GenericTriangle*,
101  GenericMeshBase, );
102  }
103 };
104 
105 template <class GenericIndexedMeshBase = cloudViewer::GenericIndexedMesh>
106 class PyGenericIndexedMesh : public PyGenericMesh<GenericIndexedMeshBase> {
107 public:
109 
111  unsigned triangleIndex) override {
112  PYBIND11_OVERLOAD_PURE(cloudViewer::GenericTriangle*,
113  GenericIndexedMeshBase, triangleIndex);
114  }
116  unsigned triangleIndex) override {
117  PYBIND11_OVERLOAD_PURE(cloudViewer::VerticesIndexes*,
118  GenericIndexedMeshBase, triangleIndex);
119  }
120  void getTriangleVertices(unsigned triangleIndex,
121  CCVector3& A,
122  CCVector3& B,
123  CCVector3& C) const override {
124  PYBIND11_OVERLOAD_PURE(void, GenericIndexedMeshBase, triangleIndex, A,
125  B, C);
126  }
127  void getTriangleVertices(unsigned triangleIndex,
128  double A[3],
129  double B[3],
130  double C[3]) const override {
131  PYBIND11_OVERLOAD_PURE(void, GenericIndexedMeshBase, triangleIndex, A,
132  B, C);
133  }
135  PYBIND11_OVERLOAD_PURE(cloudViewer::VerticesIndexes*,
136  GenericIndexedMeshBase, );
137  }
138 
139  bool interpolateNormals(unsigned triIndex,
140  const CCVector3& P,
141  CCVector3& N) override {
142  PYBIND11_OVERLOAD_PURE(bool, GenericIndexedMeshBase, triIndex, P, N);
143  }
144 
145  bool normalsAvailable() const override {
146  PYBIND11_OVERLOAD_PURE(bool, GenericIndexedMeshBase, );
147  }
148 };
149 
150 template <class GenericTriangleMesh = ccGenericMesh>
151 class PyGenericTriangleMesh : public PyGeometry<GenericTriangleMesh>,
152  public PyGenericIndexedMesh<GenericTriangleMesh> {
153 public:
155  // using PyGenericIndexedMesh<GenericTriangleMesh>::PyGenericIndexedMesh;
156 
158  PYBIND11_OVERLOAD_PURE(ccGenericPointCloud*, GenericTriangleMesh, );
159  }
160  void refreshBB() override {
161  PYBIND11_OVERLOAD_PURE(void, GenericTriangleMesh, );
162  }
163  unsigned capacity() const override {
164  PYBIND11_OVERLOAD_PURE(unsigned, GenericTriangleMesh, );
165  }
166  bool hasMaterials() const override {
167  PYBIND11_OVERLOAD_PURE(bool, GenericTriangleMesh, );
168  }
169  const ccMaterialSet* getMaterialSet() const override {
170  PYBIND11_OVERLOAD_PURE(const ccMaterialSet*, GenericTriangleMesh, );
171  }
172  bool hasTextures() const override {
173  PYBIND11_OVERLOAD_PURE(bool, GenericTriangleMesh, );
174  }
176  PYBIND11_OVERLOAD_PURE(TextureCoordsContainer*, GenericTriangleMesh, );
177  }
178  void getTriangleTexCoordinates(unsigned triIndex,
179  TexCoords2D*& tx1,
180  TexCoords2D*& tx2,
181  TexCoords2D*& tx3) const override {
182  PYBIND11_OVERLOAD_PURE(void, GenericTriangleMesh, triIndex, tx1, tx2,
183  tx3);
184  }
185  void getTexCoordinates(unsigned index, TexCoords2D*& tx) const override {
186  PYBIND11_OVERLOAD_PURE(void, GenericTriangleMesh, index, tx);
187  }
188  bool hasPerTriangleTexCoordIndexes() const override {
189  PYBIND11_OVERLOAD_PURE(bool, GenericTriangleMesh, );
190  }
191  void getTriangleTexCoordinatesIndexes(unsigned triangleIndex,
192  int& i1,
193  int& i2,
194  int& i3) const override {
195  PYBIND11_OVERLOAD_PURE(void, GenericTriangleMesh, triangleIndex, i1, i2,
196  i3);
197  }
198  bool hasTriNormals() const override {
199  PYBIND11_OVERLOAD_PURE(bool, GenericTriangleMesh, );
200  }
201  void getTriangleNormalIndexes(unsigned triangleIndex,
202  int& i1,
203  int& i2,
204  int& i3) const override {
205  PYBIND11_OVERLOAD_PURE(void, GenericTriangleMesh, triangleIndex, i1, i2,
206  i3);
207  }
208  bool getTriangleNormals(unsigned triangleIndex,
209  CCVector3& Na,
210  CCVector3& Nb,
211  CCVector3& Nc) const override {
212  PYBIND11_OVERLOAD_PURE(bool, GenericTriangleMesh, triangleIndex, Na, Nb,
213  Nc);
214  }
216  PYBIND11_OVERLOAD_PURE(NormsIndexesTableType*, GenericTriangleMesh, );
217  }
218  bool interpolateColors(unsigned triIndex,
219  const CCVector3& P,
220  ecvColor::Rgb& C) override {
221  PYBIND11_OVERLOAD_PURE(bool, GenericTriangleMesh, triIndex, P, C);
222  }
223  bool getColorFromMaterial(unsigned triIndex,
224  const CCVector3& P,
225  ecvColor::Rgb& C,
226  bool interpolateColorIfNoTexture) override {
227  PYBIND11_OVERLOAD_PURE(bool, GenericTriangleMesh, triIndex, P, C,
228  interpolateColorIfNoTexture);
229  }
230  bool getVertexColorFromMaterial(unsigned triIndex,
231  unsigned char vertIndex,
232  ecvColor::Rgb& C,
233  bool returnColorIfNoTexture) override {
234  PYBIND11_OVERLOAD_PURE(bool, GenericTriangleMesh, triIndex, vertIndex,
235  C, returnColorIfNoTexture);
236  }
237 
238  bool interpolateNormalsBC(unsigned triIndex,
239  const CCVector3d& w,
240  CCVector3& N) override {
241  PYBIND11_OVERLOAD_PURE(bool, GenericTriangleMesh, triIndex, w, N);
242  }
243 };
244 
245 template <class GenericPrimitive = ccGenericPrimitive>
246 class PyGenericPrimitive : public GenericPrimitive {
247 public:
248  using GenericPrimitive::GenericPrimitive;
249 
251  QString getTypeName() const override {
252  PYBIND11_OVERLOAD_PURE(QString, GenericPrimitive, );
253  }
254 
256  ccGenericPrimitive* clone() const override {
257  PYBIND11_OVERLOAD_PURE(ccGenericPrimitive*, GenericPrimitive, );
258  }
259 };
260 
261 template <class GenericPlanarEntityInterface = ccPlanarEntityInterface>
262 class PyPlanarEntityInterface : public GenericPlanarEntityInterface {
263 public:
264  using GenericPlanarEntityInterface::GenericPlanarEntityInterface;
265 
267  CCVector3 getNormal() const override {
268  PYBIND11_OVERLOAD_PURE(CCVector3, GenericPlanarEntityInterface, );
269  }
270 };
271 
272 template <class OrientedBBoxBase = cloudViewer::OrientedBoundingBox>
273 class PyOrientedBBoxBase : public OrientedBBoxBase {
274 public:
275  using OrientedBBoxBase::OrientedBBoxBase;
276 };
int64_t CV_CLASS_ENUM
Type of object type flags (64 bits)
Definition: CVTypes.h:97
Array of compressed 3D normals (single index)
void draw(CC_DRAW_CONTEXT &context) override
Draws entity and its children.
void getTriangleVertices(unsigned triangleIndex, double A[3], double B[3], double C[3]) const override
cloudViewer::GenericTriangle * _getTriangle(unsigned triangleIndex) override
Returns the ith triangle.
cloudViewer::VerticesIndexes * getTriangleVertIndexes(unsigned triangleIndex) override
Returns the indexes of the vertices of a given triangle.
bool normalsAvailable() const override
Returns whether normals are available.
bool interpolateNormals(unsigned triIndex, const CCVector3 &P, CCVector3 &N) override
Interpolates normal(s) inside a given triangle.
cloudViewer::VerticesIndexes * getNextTriangleVertIndexes() override
void getTriangleVertices(unsigned triangleIndex, CCVector3 &A, CCVector3 &B, CCVector3 &C) const override
Returns the vertices of a given triangle.
void getBoundingBox(CCVector3 &bbMin, CCVector3 &bbMax) override
Returns the mesh bounding-box.
unsigned size() const override
Returns the number of triangles.
void placeIteratorAtBeginning() override
Places the mesh iterator at the beginning.
void forEach(std::function< void(cloudViewer::GenericTriangle &)> action) override
cloudViewer::GenericTriangle * _getNextTriangle() override
Returns the next triangle (relatively to the global iterator position)
QString getTypeName() const override
Returns type name (sphere, cylinder, etc.)
ccGenericPrimitive * clone() const override
Clones primitive.
bool hasTextures() const override
TextureCoordsContainer * getTexCoordinatesTable() const override
bool hasMaterials() const override
ccGenericPointCloud * getAssociatedCloud() const override
unsigned capacity() const override
NormsIndexesTableType * getTriNormsTable() const override
bool getTriangleNormals(unsigned triangleIndex, CCVector3 &Na, CCVector3 &Nb, CCVector3 &Nc) const override
void getTriangleTexCoordinatesIndexes(unsigned triangleIndex, int &i1, int &i2, int &i3) const override
bool getVertexColorFromMaterial(unsigned triIndex, unsigned char vertIndex, ecvColor::Rgb &C, bool returnColorIfNoTexture) override
bool getColorFromMaterial(unsigned triIndex, const CCVector3 &P, ecvColor::Rgb &C, bool interpolateColorIfNoTexture) override
const ccMaterialSet * getMaterialSet() const override
void getTriangleNormalIndexes(unsigned triangleIndex, int &i1, int &i2, int &i3) const override
void getTexCoordinates(unsigned index, TexCoords2D *&tx) const override
bool interpolateColors(unsigned triIndex, const CCVector3 &P, ecvColor::Rgb &C) override
void getTriangleTexCoordinates(unsigned triIndex, TexCoords2D *&tx1, TexCoords2D *&tx2, TexCoords2D *&tx3) const override
bool interpolateNormalsBC(unsigned triIndex, const CCVector3d &w, CCVector3 &N) override
bool hasTriNormals() const override
bool hasPerTriangleTexCoordIndexes() const override
ecvOrientedBBox GetOrientedBoundingBox() const override
Eigen::Vector2d GetMin2DBound() const override
Eigen::Vector2d GetMax2DBound() const override
Eigen::Vector3d GetMinBound() const override
Returns min bounds for geometry coordinates.
ccBBox GetAxisAlignedBoundingBox() const override
Returns an axis-aligned bounding box of the geometry.
Eigen::Vector3d GetMaxBound() const override
Returns max bounds for geometry coordinates.
bool IsEmpty() const override
GeometryBase & Transform(const Eigen::Matrix4d &transformation) override
Apply transformation (4x4 matrix) to the geometry coordinates.
Eigen::Vector3d GetCenter() const override
Returns the center of the geometry coordinates.
CV_CLASS_ENUM getClassID() const override
Returns class ID.
CCVector3 getNormal() const override
Returns the entity normal.
Array of 2D texture coordinates.
Bounding box structure.
Definition: ecvBBox.h:25
A 3D cloud interface with associated features (color, normals, octree, etc.)
Generic primitive interface.
Mesh (triangle) material.
A generic triangle interface.
RGB color structure.
Definition: ecvColorTypes.h:49
ImGuiContext * context
Definition: Window.cpp:76
Generic file read and write utility for python interface.
2D texture coordinates
Display context.
Triangle described by the indexes of its 3 vertices.