ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
FilamentScene.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 
11 
12 // 4068: Filament has some clang-specific vectorizing pragma's that MSVC flags
13 // 4146: Filament's utils/algorithm.h utils::details::ctz() tries to negate
14 // an unsigned int.
15 // 4293: Filament's utils/algorithm.h utils::details::clz() does strange
16 // things with MSVC. Somehow sizeof(unsigned int) > 4, but its size is
17 // 32 so that x >> 32 gives a warning. (Or maybe the compiler can't
18 // determine the if statement does not run.)
19 // 4305: LightManager.h needs to specify some constants as floats
20 #ifdef _MSC_VER
21 #pragma warning(push)
22 #pragma warning(disable : 4068 4146 4293 4305)
23 #endif // _MSC_VER
24 
25 #include <filament/LightManager.h>
26 #include <filament/RenderableManager.h>
27 #include <utils/Entity.h>
28 
29 #ifdef _MSC_VER
30 #pragma warning(pop)
31 #endif // _MSC_VER
32 
33 #include <Eigen/Geometry>
34 #include <unordered_map>
35 #include <vector>
36 
37 #include "ecvBBox.h"
43 
45 namespace filament {
46 class Box;
47 class Engine;
48 class IndirectLight;
49 class Renderer;
50 class Scene;
51 class Skybox;
52 class TransformManager;
53 class VertexBuffer;
54 } // namespace filament
56 
57 namespace cloudViewer {
58 namespace visualization {
59 namespace rendering {
60 
61 class FilamentView;
62 class GeometryBuffersBuilder;
63 class Renderer;
64 class View;
65 
66 // Contains renderable objects like geometry and lights
67 // Can have multiple views
68 class FilamentScene : public Scene {
69 public:
70  FilamentScene(filament::Engine& engine,
71  FilamentResourceManager& resource_mgr,
72  Renderer& renderer);
74 
75  Scene* Copy() override;
76 
77  // NOTE: Temporarily needed to support old View interface for ImGUI
78  ViewHandle AddView(std::int32_t x,
79  std::int32_t y,
80  std::uint32_t w,
81  std::uint32_t h) override;
82 
83  View* GetView(const ViewHandle& view_id) const override;
84  void SetViewActive(const ViewHandle& view_id, bool is_active) override;
85  void SetRenderOnce(const ViewHandle& view_id) override;
86  void RemoveView(const ViewHandle& view_id) override;
87 
88  // Camera
89  void AddCamera(const std::string& camera_name,
90  std::shared_ptr<Camera> cam) override;
91  void RemoveCamera(const std::string& camera_name) override;
92  void SetActiveCamera(const std::string& camera_name) override;
93 
94  // Scene geometry
95  bool AddGeometry(const std::string& object_name,
96  const ccHObject& geometry,
97  const MaterialRecord& material,
98  const std::string& downsampled_name = "",
99  size_t downsample_threshold = SIZE_MAX) override;
100  bool AddGeometry(const std::string& object_name,
101  const t::geometry::Geometry& geometry,
102  const MaterialRecord& material,
103  const std::string& downsampled_name = "",
104  size_t downsample_threshold = SIZE_MAX) override;
105  bool AddGeometry(const std::string& object_name,
106  const TriangleMeshModel& model) override;
107  bool HasGeometry(const std::string& object_name) const override;
108  void UpdateGeometry(const std::string& object_name,
109  const t::geometry::PointCloud& point_cloud,
110  uint32_t update_flags) override;
111  void RemoveGeometry(const std::string& object_name) override;
112  void ShowGeometry(const std::string& object_name, bool show) override;
113  bool GeometryIsVisible(const std::string& object_name) override;
114  void SetGeometryTransform(const std::string& object_name,
115  const Transform& transform) override;
116  Transform GetGeometryTransform(const std::string& object_name) override;
117  ccBBox GetGeometryBoundingBox(const std::string& object_name) override;
118  void GeometryShadows(const std::string& object_name,
119  bool cast_shadows,
120  bool receive_shadows) override;
121  void SetGeometryCulling(const std::string& object_name,
122  bool enable) override;
123  void SetGeometryPriority(const std::string& object_name,
124  uint8_t priority) override;
125  void OverrideMaterial(const std::string& object_name,
126  const MaterialRecord& material) override;
127  void QueryGeometry(std::vector<std::string>& geometry) override;
128 
129  void OverrideMaterialAll(const MaterialRecord& material,
130  bool shader_only = true) override;
131 
132  // Lighting Environment
133  bool AddPointLight(const std::string& light_name,
134  const Eigen::Vector3f& color,
135  const Eigen::Vector3f& position,
136  float intensity,
137  float falloff,
138  bool cast_shadows) override;
139  bool AddSpotLight(const std::string& light_name,
140  const Eigen::Vector3f& color,
141  const Eigen::Vector3f& position,
142  const Eigen::Vector3f& direction,
143  float intensity,
144  float falloff,
145  float inner_cone_angle,
146  float outer_cone_angle,
147  bool cast_shadows) override;
148  bool AddDirectionalLight(const std::string& light_name,
149  const Eigen::Vector3f& color,
150  const Eigen::Vector3f& direction,
151  float intensity,
152  bool cast_shadows) override;
153  Light& GetLight(const std::string& light_name) override;
154  void RemoveLight(const std::string& light_name) override;
155  void UpdateLight(const std::string& light_name,
156  const Light& light) override;
157  void UpdateLightColor(const std::string& light_name,
158  const Eigen::Vector3f& color) override;
159  void UpdateLightPosition(const std::string& light_name,
160  const Eigen::Vector3f& position) override;
161  void UpdateLightDirection(const std::string& light_name,
162  const Eigen::Vector3f& direction) override;
163  void UpdateLightIntensity(const std::string& light_name,
164  float intensity) override;
165  void UpdateLightFalloff(const std::string& light_name,
166  float falloff) override;
167  void UpdateLightConeAngles(const std::string& light_name,
168  float inner_cone_angle,
169  float outer_cone_angle) override;
170  void EnableLightShadow(const std::string& light_name,
171  bool cast_shadows) override;
172 
173  void SetSunLight(const Eigen::Vector3f& direction,
174  const Eigen::Vector3f& color,
175  float intensity) override;
176  void EnableSunLight(bool enable) override;
177  void EnableSunLightShadows(bool enable) override;
178  void SetSunLightColor(const Eigen::Vector3f& color) override;
179  Eigen::Vector3f GetSunLightColor() override;
180  void SetSunLightIntensity(float intensity) override;
181  float GetSunLightIntensity() override;
182  void SetSunLightDirection(const Eigen::Vector3f& direction) override;
183  Eigen::Vector3f GetSunLightDirection() override;
184  void SetSunAngularRadius(float radius) override;
185  void SetSunHaloSize(float size) override;
186  void SetSunHaloFalloff(float falloff) override;
187 
188  bool SetIndirectLight(const std::string& ibl_name) override;
189  const std::string& GetIndirectLight() override;
190  void EnableIndirectLight(bool enable) override;
191  void SetIndirectLightIntensity(float intensity) override;
192  float GetIndirectLightIntensity() override;
193  void SetIndirectLightRotation(const Transform& rotation) override;
195  void ShowSkybox(bool show) override;
196  bool GetSkyboxVisible() const override;
197  void SetBackground(
198  const Eigen::Vector4f& color,
199  const std::shared_ptr<geometry::Image> image = nullptr) override;
200  void SetBackground(TextureHandle image) override;
201  void EnableGroundPlane(bool enable, GroundPlane plane) override;
202  void SetGroundPlaneColor(const Eigen::Vector4f& color) override;
203 
204  void RenderToImage(std::function<void(std::shared_ptr<geometry::Image>)>
205  callback) override;
206  void RenderToDepthImage(
207  std::function<void(std::shared_ptr<geometry::Image>)> callback)
208  override;
209 
210  void Draw(filament::Renderer& renderer);
211 
212  // NOTE: This method is to work around Filament limitation when rendering to
213  // depth buffer. Materials with SSR require multiple passes which causes a
214  // crash with render to depth since we must disable multiple passes (i.e.,
215  // post-processing) in order to get back valid, un-modified depth values.
216  void HideRefractedMaterials(bool hide = true);
217 
218  // NOTE: Can GetNativeScene be removed?
219  filament::Scene* GetNativeScene() const { return scene_; }
220 
221 private:
222  MaterialInstanceHandle AssignMaterialToFilamentGeometry(
223  filament::RenderableManager::Builder& builder,
224  const MaterialRecord& material);
225  enum BufferReuse { kNo, kYes };
226  bool CreateAndAddFilamentEntity(
227  const std::string& object_name,
228  GeometryBuffersBuilder& buffer_builder,
229  filament::Box& aabb,
232  const MaterialRecord& material,
233  BufferReuse reusing_vertex_buffer = BufferReuse::kNo);
234 
235  filament::Engine& engine_;
236  FilamentResourceManager& resource_mgr_;
237  filament::Scene* scene_ = nullptr;
238 
239  struct TextureMaps {
240  rendering::TextureHandle albedo_map =
242  rendering::TextureHandle normal_map =
244  rendering::TextureHandle ao_rough_metal_map =
246  rendering::TextureHandle reflectance_map =
248  rendering::TextureHandle clear_coat_map =
250  rendering::TextureHandle clear_coat_roughness_map =
252  rendering::TextureHandle anisotropy_map =
254  rendering::TextureHandle gradient_texture =
256  };
257 
258  struct GeometryMaterialInstance {
259  TextureMaps maps;
260  MaterialRecord properties;
261  MaterialInstanceHandle mat_instance;
262  };
263 
264  struct RenderableGeometry {
265  std::string name;
266  bool visible = true;
267  bool was_hidden_before_picking = false;
268  bool cast_shadows = true;
269  bool receive_shadows = true;
270  bool culling_enabled = true;
271  int priority = -1; // default priority
272 
273  GeometryMaterialInstance mat;
274 
275  // Filament resources
276  utils::Entity filament_entity;
277  filament::RenderableManager::PrimitiveType primitive_type;
280  void ReleaseResources(filament::Engine& engine,
281  FilamentResourceManager& manager);
282  };
283 
284  struct LightEntity {
285  bool enabled = true;
286  utils::Entity filament_entity;
287  };
288 
289  // NOTE: ViewContainer and views_ are temporary
290  struct ViewContainer {
291  std::unique_ptr<FilamentView> view;
292  bool is_active = true;
293  int render_count = -1;
294  };
295  std::unordered_map<REHandle_abstract, ViewContainer> views_;
296 
297  std::vector<RenderableGeometry*> GetGeometry(const std::string& object_name,
298  bool warn_if_not_found = true);
299  bool GeometryIsModel(const std::string& object_name) const;
300  LightEntity* GetLightInternal(const std::string& light_name,
301  bool warn_if_not_found = true);
302  void OverrideMaterialInternal(RenderableGeometry* geom,
303  const MaterialRecord& material,
304  bool shader_only = false);
305  void UpdateMaterialProperties(RenderableGeometry& geom);
306  void UpdateDefaultLit(GeometryMaterialInstance& geom_mi);
307  void UpdateGaussianSplat(GeometryMaterialInstance& geom_mi);
308  void UpdateDefaultLitSSR(GeometryMaterialInstance& geom_mi);
309  void UpdateDefaultUnlit(GeometryMaterialInstance& geom_mi);
310  void UpdateNormalShader(GeometryMaterialInstance& geom_mi);
311  void UpdateDepthShader(GeometryMaterialInstance& geom_mi);
312  void UpdateDepthValueShader(GeometryMaterialInstance& geom_mi);
313  void UpdateGradientShader(GeometryMaterialInstance& geom_mi);
314  void UpdateSolidColorShader(GeometryMaterialInstance& geom_mi);
315  void UpdateBackgroundShader(GeometryMaterialInstance& geom_mi);
316  void UpdateGroundPlaneShader(GeometryMaterialInstance& geom_mi);
317  void UpdateLineShader(GeometryMaterialInstance& geom_mi);
318  void UpdateUnlitPolygonOffsetShader(GeometryMaterialInstance& geom_mi);
319  utils::EntityInstance<filament::TransformManager>
320  GetGeometryTransformInstance(RenderableGeometry* geom);
321  void CreateSunDirectionalLight();
322  void CreateBackgroundGeometry();
323  void CreateGroundPlaneGeometry();
324 
325  std::unordered_map<std::string, RenderableGeometry> geometries_;
326  std::unordered_map<std::string, LightEntity> lights_;
327  std::unordered_map<std::string, std::vector<std::string>> model_geometries_;
328 
329  Eigen::Vector4f background_color_;
330  std::shared_ptr<geometry::Image> background_image_;
331  std::string ibl_name_;
332  bool ibl_enabled_ = false;
333  bool skybox_enabled_ = false;
334  std::weak_ptr<filament::IndirectLight> indirect_light_;
335  std::weak_ptr<filament::Skybox> skybox_;
336  IndirectLightHandle ibl_handle_;
337  SkyboxHandle skybox_handle_;
338  LightEntity sun_;
339 };
340 
341 } // namespace rendering
342 } // namespace visualization
343 } // namespace cloudViewer
std::shared_ptr< core::Tensor > image
std::function< void(std::shared_ptr< core::Tensor >)> callback
int size
std::string name
math::float4 color
math::float3 position
std::vector< UVAtlasVertex > vb
std::vector< uint8_t > ib
Bounding box structure.
Definition: ecvBBox.h:25
Hierarchical CLOUDVIEWER Object.
Definition: ecvHObject.h:25
The base geometry class.
Definition: Geometry.h:23
A point cloud contains a list of 3D points.
Definition: PointCloud.h:82
bool AddDirectionalLight(const std::string &light_name, const Eigen::Vector3f &color, const Eigen::Vector3f &direction, float intensity, bool cast_shadows) override
bool AddSpotLight(const std::string &light_name, const Eigen::Vector3f &color, const Eigen::Vector3f &position, const Eigen::Vector3f &direction, float intensity, float falloff, float inner_cone_angle, float outer_cone_angle, bool cast_shadows) override
void SetIndirectLightIntensity(float intensity) override
Transform GetGeometryTransform(const std::string &object_name) override
View * GetView(const ViewHandle &view_id) const override
void EnableGroundPlane(bool enable, GroundPlane plane) override
ViewHandle AddView(std::int32_t x, std::int32_t y, std::uint32_t w, std::uint32_t h) override
void OverrideMaterial(const std::string &object_name, const MaterialRecord &material) override
void SetRenderOnce(const ViewHandle &view_id) override
void RemoveGeometry(const std::string &object_name) override
void UpdateGeometry(const std::string &object_name, const t::geometry::PointCloud &point_cloud, uint32_t update_flags) override
void SetSunLight(const Eigen::Vector3f &direction, const Eigen::Vector3f &color, float intensity) override
void UpdateLightPosition(const std::string &light_name, const Eigen::Vector3f &position) override
bool GeometryIsVisible(const std::string &object_name) override
void RemoveCamera(const std::string &camera_name) override
void EnableLightShadow(const std::string &light_name, bool cast_shadows) override
bool HasGeometry(const std::string &object_name) const override
void UpdateLight(const std::string &light_name, const Light &light) override
void SetActiveCamera(const std::string &camera_name) override
void SetSunLightColor(const Eigen::Vector3f &color) override
void SetBackground(const Eigen::Vector4f &color, const std::shared_ptr< geometry::Image > image=nullptr) override
void AddCamera(const std::string &camera_name, std::shared_ptr< Camera > cam) override
void SetGeometryPriority(const std::string &object_name, uint8_t priority) override
void RenderToDepthImage(std::function< void(std::shared_ptr< geometry::Image >)> callback) override
Size of image is the size of the window.
Light & GetLight(const std::string &light_name) override
ccBBox GetGeometryBoundingBox(const std::string &object_name) override
void UpdateLightConeAngles(const std::string &light_name, float inner_cone_angle, float outer_cone_angle) override
void SetGroundPlaneColor(const Eigen::Vector4f &color) override
void SetGeometryTransform(const std::string &object_name, const Transform &transform) override
void GeometryShadows(const std::string &object_name, bool cast_shadows, bool receive_shadows) override
void UpdateLightColor(const std::string &light_name, const Eigen::Vector3f &color) override
void UpdateLightIntensity(const std::string &light_name, float intensity) override
bool SetIndirectLight(const std::string &ibl_name) override
void QueryGeometry(std::vector< std::string > &geometry) override
void OverrideMaterialAll(const MaterialRecord &material, bool shader_only=true) override
FilamentScene(filament::Engine &engine, FilamentResourceManager &resource_mgr, Renderer &renderer)
void ShowGeometry(const std::string &object_name, bool show) override
void RemoveLight(const std::string &light_name) override
void SetGeometryCulling(const std::string &object_name, bool enable) override
void RemoveView(const ViewHandle &view_id) override
void SetViewActive(const ViewHandle &view_id, bool is_active) override
bool AddGeometry(const std::string &object_name, const ccHObject &geometry, const MaterialRecord &material, const std::string &downsampled_name="", size_t downsample_threshold=SIZE_MAX) override
void UpdateLightDirection(const std::string &light_name, const Eigen::Vector3f &direction) override
void RenderToImage(std::function< void(std::shared_ptr< geometry::Image >)> callback) override
Size of image is the size of the window.
void SetIndirectLightRotation(const Transform &rotation) override
void UpdateLightFalloff(const std::string &light_name, float falloff) override
void SetSunLightDirection(const Eigen::Vector3f &direction) override
bool AddPointLight(const std::string &light_name, const Eigen::Vector3f &color, const Eigen::Vector3f &position, float intensity, float falloff, bool cast_shadows) override
Eigen::Transform< float, 3, Eigen::Affine > Transform
Definition: Scene.h:55
#define SIZE_MAX
REHandle< EntityType::VertexBuffer > VertexBufferHandle
REHandle< EntityType::IndirectLight > IndirectLightHandle
REHandle< EntityType::Skybox > SkyboxHandle
REHandle< EntityType::IndexBuffer > IndexBufferHandle
REHandle< EntityType::MaterialInstance > MaterialInstanceHandle
Generic file read and write utility for python interface.
constexpr Rgbaf light(0.66f, 0.66f, 0.66f, 1.00f)