ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
FilamentGeometryBuffersBuilder.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 <cstdint>
11 
15 
16 // clang-format off
17 // NOTE: This header must precede the Filament headers otherwise a conflict
18 // occurs between Filament and standard headers
20 
21 // 4068: Filament has some clang-specific vectorizing pragma's that MSVC flags
22 // 4146: Filament's utils/algorithm.h utils::details::ctz() tries to negate
23 // an unsigned int.
24 // 4293: Filament's utils/algorithm.h utils::details::clz() does strange
25 // things with MSVC. Somehow sizeof(unsigned int) > 4, but its size is
26 // 32 so that x >> 32 gives a warning. (Or maybe the compiler can't
27 // determine the if statement does not run.)
28 #ifdef _MSC_VER
29 #pragma warning(push)
30 #pragma warning(disable : 4068 4146 4293)
31 // Filament uses OPAQUE and TRANSPARENT as enums which conflicts with windows.h
32 #undef OPAQUE
33 #undef TRANSPARENT
34 #endif // _MSC_VER
35 
36 #include <filament/Box.h>
37 #include <filament/RenderableManager.h>
38 
39 #ifdef _MSC_VER
40 #pragma warning(pop)
41 #endif // _MSC_VER
42 // clang-format on
43 
44 #include <memory>
45 #include <tuple>
46 
47 class ccMesh;
48 class ccHObject;
49 class ccPointCloud;
50 
51 namespace cloudViewer {
52 
53 namespace geometry {
54 class LineSet;
55 } // namespace geometry
56 
57 namespace visualization {
58 namespace rendering {
59 
61 public:
62  // Note that the downsampled index buffer may be kBadId if a downsampled
63  // buffer was not requested, failed, or cannot be created (e.g. if not
64  // a point cloud).
65  using Buffers = std::tuple<VertexBufferHandle, // vertex buffer
66  IndexBufferHandle, // index buffer
67  IndexBufferHandle>; // downsampled buffer
68  using IndexType = std::uint32_t;
69 
70  static std::unique_ptr<GeometryBuffersBuilder> GetBuilder(
71  const ccHObject& geometry);
72  static std::unique_ptr<GeometryBuffersBuilder> GetBuilder(
73  const t::geometry::Geometry& geometry);
74 
75  virtual ~GeometryBuffersBuilder() = default;
76 
77  virtual filament::RenderableManager::PrimitiveType GetPrimitiveType()
78  const = 0;
79 
80  // Defaults to infinity (that is, no downsampling). If threshold is
81  // set and the number of points exceeds the threshold, ConstructBuffers()
82  // will return a downsampled index buffer. Certain builders may ignore
83  // this threshold.
84  virtual void SetDownsampleThreshold(size_t min_points) {
85  downsample_threshold_ = min_points;
86  }
87 
88  // Instructs LineSetBuffersBuilder to build lines out of triangles for wide
89  // lines shader.
90  virtual void SetWideLines() { wide_lines_ = true; }
91 
92  virtual void SetAdjustColorsForSRGBToneMapping(bool adjust) {
94  }
95 
96  virtual Buffers ConstructBuffers() = 0;
97  virtual filament::Box ComputeAABB() = 0;
98 
99 protected:
101  bool wide_lines_ = false;
103 
104  static void DeallocateBuffer(void* buffer, size_t size, void* user_ptr);
105 
106  static IndexBufferHandle CreateIndexBuffer(size_t max_index,
107  size_t n_subsamples = SIZE_MAX);
108 };
109 
111 public:
112  explicit TriangleMeshBuffersBuilder(const ccMesh& geometry);
113 
114  filament::RenderableManager::PrimitiveType GetPrimitiveType()
115  const override;
116 
117  Buffers ConstructBuffers() override;
118  filament::Box ComputeAABB() override;
119 
120 private:
121  const ccMesh& geometry_;
122 };
123 
125 public:
126  explicit PointCloudBuffersBuilder(const ccPointCloud& geometry);
127 
128  filament::RenderableManager::PrimitiveType GetPrimitiveType()
129  const override;
130 
131  Buffers ConstructBuffers() override;
132  filament::Box ComputeAABB() override;
133 
134 private:
135  const ccPointCloud& geometry_;
136 };
137 
139 public:
140  explicit LineSetBuffersBuilder(const geometry::LineSet& geometry);
141 
142  filament::RenderableManager::PrimitiveType GetPrimitiveType()
143  const override;
144 
145  Buffers ConstructBuffers() override;
146  filament::Box ComputeAABB() override;
147 
148 private:
149  Buffers ConstructThinLines();
150 
151  const geometry::LineSet& geometry_;
152 };
153 
155 public:
156  explicit TMeshBuffersBuilder(const t::geometry::TriangleMesh& geometry);
157 
158  filament::RenderableManager::PrimitiveType GetPrimitiveType()
159  const override;
160 
161  Buffers ConstructBuffers() override;
162  filament::Box ComputeAABB() override;
163 
164 private:
165  t::geometry::TriangleMesh geometry_;
166 };
167 
169 public:
170  explicit TPointCloudBuffersBuilder(const t::geometry::PointCloud& geometry);
171 
172  filament::RenderableManager::PrimitiveType GetPrimitiveType()
173  const override;
174 
175  Buffers ConstructBuffers() override;
176  filament::Box ComputeAABB() override;
177 
178 protected:
180 };
181 
183 public:
193  const t::geometry::PointCloud& geometry);
194 
212  Buffers ConstructBuffers() override;
213 };
214 
216 public:
217  explicit TLineSetBuffersBuilder(const t::geometry::LineSet& geometry);
218 
219  filament::RenderableManager::PrimitiveType GetPrimitiveType()
220  const override;
221 
222  Buffers ConstructBuffers() override;
223  filament::Box ComputeAABB() override;
224 
225 private:
228  void ConstructThinLines(uint32_t& n_vertices,
229  float** vertex_data,
230  uint32_t& n_indices,
231  uint32_t& indices_bytes,
232  uint32_t** line_indices);
235  void ConstructWideLines(uint32_t& n_vertices,
236  float** vertex_data,
237  uint32_t& n_indices,
238  uint32_t& indices_bytes,
239  uint32_t** line_indices);
240  t::geometry::LineSet geometry_;
241 };
242 
243 } // namespace rendering
244 } // namespace visualization
245 } // namespace cloudViewer
int size
Hierarchical CLOUDVIEWER Object.
Definition: ecvHObject.h:25
Triangular mesh.
Definition: ecvMesh.h:35
A 3D cloud and its associated features (color, normals, scalar fields, etc.)
LineSet define a sets of lines in 3D. A typical application is to display the point cloud corresponde...
Definition: LineSet.h:29
The base geometry class.
Definition: Geometry.h:23
A LineSet contains points and lines joining them and optionally attributes on the points and lines.
Definition: LineSet.h:85
A point cloud contains a list of 3D points.
Definition: PointCloud.h:82
A triangle mesh contains vertices and triangles.
Definition: TriangleMesh.h:98
virtual filament::RenderableManager::PrimitiveType GetPrimitiveType() const =0
static IndexBufferHandle CreateIndexBuffer(size_t max_index, size_t n_subsamples=SIZE_MAX)
static void DeallocateBuffer(void *buffer, size_t size, void *user_ptr)
std::tuple< VertexBufferHandle, IndexBufferHandle, IndexBufferHandle > Buffers
static std::unique_ptr< GeometryBuffersBuilder > GetBuilder(const ccHObject &geometry)
filament::RenderableManager::PrimitiveType GetPrimitiveType() const override
filament::RenderableManager::PrimitiveType GetPrimitiveType() const override
Buffers ConstructBuffers() override
Constructs vertex and index buffers for Gaussian Splat rendering.
TGaussianSplatBuffersBuilder(const t::geometry::PointCloud &geometry)
Constructs a TGaussianSplatBuffersBuilder object.
TLineSetBuffersBuilder(const t::geometry::LineSet &geometry)
filament::RenderableManager::PrimitiveType GetPrimitiveType() const override
filament::RenderableManager::PrimitiveType GetPrimitiveType() const override
TMeshBuffersBuilder(const t::geometry::TriangleMesh &geometry)
filament::RenderableManager::PrimitiveType GetPrimitiveType() const override
TPointCloudBuffersBuilder(const t::geometry::PointCloud &geometry)
filament::RenderableManager::PrimitiveType GetPrimitiveType() const override
#define SIZE_MAX
REHandle< EntityType::VertexBuffer > VertexBufferHandle
REHandle< EntityType::IndexBuffer > IndexBufferHandle
Generic file read and write utility for python interface.