Open3D (C++ API)  0.19.0
Loading...
Searching...
No Matches
FilamentRenderer.h
Go to the documentation of this file.
1// ----------------------------------------------------------------------------
2// - Open3D: www.open3d.org -
3// ----------------------------------------------------------------------------
4// Copyright (c) 2018-2024 www.open3d.org
5// SPDX-License-Identifier: MIT
6// ----------------------------------------------------------------------------
7
8#pragma once
9
10#include <memory>
11#include <unordered_map>
12#include <unordered_set>
13#if defined(__APPLE__)
14#include <vector>
15#endif
16
19
21namespace filament {
22class Engine;
23class Renderer;
24class Scene;
25class SwapChain;
26class VertexBuffer;
27} // namespace filament
29
30namespace open3d {
31namespace visualization {
32namespace rendering {
33
34class FilamentMaterialModifier;
35class FilamentRenderToBuffer;
36class FilamentResourceManager;
37class GaussianSplatRenderer;
38class FilamentScene;
39class FilamentView;
40
41class FilamentRenderer : public Renderer {
42public:
43 FilamentRenderer(filament::Engine& engine,
44 void* native_drawable,
45 FilamentResourceManager& resource_mgr);
46 // This will create an offscreen renderer
47 explicit FilamentRenderer(filament::Engine& engine,
48 int width,
49 int height,
50 FilamentResourceManager& resource_mgr);
51 ~FilamentRenderer() override;
52
53 SceneHandle CreateScene() override;
54 Scene* GetScene(const SceneHandle& id) const override;
55 void DestroyScene(const SceneHandle& id) override;
56
57 void SetClearColor(const Eigen::Vector4f& color) override;
58 void UpdateSwapChain() override;
59 void UpdateBitmapSwapChain(int width, int height) override;
60
61 void BeginFrame() override;
62 void Draw() override;
63 void RequestReadPixels(int width,
64 int height,
65 std::function<void(std::shared_ptr<core::Tensor>)>
66 callback) override;
67 void EndFrame() override;
68
69 void SetOnAfterDraw(std::function<void()> callback) override;
70
71 bool LastBeginFrameSubmitted() const override { return frame_started_; }
72
78 void SetOnAppleGaussianCompositeComplete(std::function<void()> callback);
79
80 MaterialHandle AddMaterial(const ResourceLoadRequest& request) override;
82 const MaterialHandle& material) override;
85 void RemoveMaterialInstance(const MaterialInstanceHandle& id) override;
86
88 bool srgb = false) override;
89 TextureHandle AddTexture(const std::shared_ptr<geometry::Image> image,
90 bool srgb = false) override;
92 bool srgb = false) override;
93 bool UpdateTexture(TextureHandle texture,
94 const std::shared_ptr<geometry::Image> image,
95 bool srgb) override;
96 bool UpdateTexture(TextureHandle texture,
98 bool srgb) override;
99 void RemoveTexture(const TextureHandle& id) override;
100
102 const ResourceLoadRequest& request) override;
103 void RemoveIndirectLight(const IndirectLightHandle& id) override;
104
105 SkyboxHandle AddSkybox(const ResourceLoadRequest& request) override;
106 void RemoveSkybox(const SkyboxHandle& id) override;
107
108 std::shared_ptr<visualization::rendering::RenderToBuffer>
109 CreateBufferRenderer() override;
110
111 // Removes scene from scenes list and draws it last
112 // WARNING: will destroy previous gui scene if there was any
113 void ConvertToGuiScene(const SceneHandle& id);
114 FilamentScene* GetGuiScene() const { return gui_scene_.get(); }
115
116 bool HasGaussianSplatOutput(const FilamentView& view) const;
119 int GetGaussianSplatMaxShDegree() const;
121 return gaussian_splat_renderer_.get();
122 }
127
128 filament::Renderer* GetNative() { return renderer_; }
129
133
134private:
136
137 filament::Engine& engine_;
138 filament::Renderer* renderer_ = nullptr;
139 filament::SwapChain* swap_chain_ = nullptr;
140 filament::SwapChain* swap_chain_cached_ = nullptr;
141
142 std::unordered_map<REHandle_abstract, std::unique_ptr<FilamentScene>>
143 scenes_;
144 std::unique_ptr<FilamentScene> gui_scene_;
145
146 std::unique_ptr<FilamentMaterialModifier> materials_modifier_;
147 std::unique_ptr<GaussianSplatRenderer> gaussian_splat_renderer_;
148 FilamentResourceManager& resource_mgr_;
149
150 std::unordered_set<std::shared_ptr<FilamentRenderToBuffer>>
151 buffer_renderers_;
152
153 bool frame_started_ = false;
154 std::function<void()> on_after_draw_;
155 std::function<void()> on_apple_gaussian_composite_complete_;
156 bool needs_wait_after_draw_ = false;
157#if defined(__APPLE__)
158 // Scratch buffer for RequestReadPixels' Metal RGBA readback workaround;
159 std::vector<uint8_t> read_pixels_rgba_buffer_;
160#endif
161};
162
163} // namespace rendering
164} // namespace visualization
165} // namespace open3d
std::shared_ptr< core::Tensor > image
Definition FilamentRenderer.cpp:328
std::function< void(std::shared_ptr< core::Tensor >)> callback
Definition FilamentRenderer.cpp:327
math::float4 color
Definition LineSetBuffers.cpp:45
The Image class stores image with customizable rows, cols, channels, dtype and device.
Definition Image.h:29
static RenderingType GetBackendType()
Definition FilamentEngine.h:46
Definition FilamentRenderToBuffer.h:30
void SetClearColor(const Eigen::Vector4f &color) override
Definition FilamentRenderer.cpp:159
SkyboxHandle AddSkybox(const ResourceLoadRequest &request) override
Definition FilamentRenderer.cpp:485
TextureHandle GetGaussianSplatColorTexture(const FilamentView &view) const
Definition FilamentRenderer.cpp:133
filament::Renderer * GetNative()
Definition FilamentRenderer.h:128
void InvalidateGaussianSplatOutput(FilamentView &view)
Definition FilamentRenderer.cpp:153
void SetOnAfterDraw(std::function< void()> callback) override
Definition FilamentRenderer.cpp:170
SceneHandle CreateScene() override
Definition FilamentRenderer.cpp:108
void RemoveSkybox(const SkyboxHandle &id) override
Definition FilamentRenderer.cpp:495
TextureHandle AddTexture(const ResourceLoadRequest &request, bool srgb=false) override
Definition FilamentRenderer.cpp:442
bool UpdateTexture(TextureHandle texture, const std::shared_ptr< geometry::Image > image, bool srgb) override
Definition FilamentRenderer.cpp:453
void BeginFrame() override
Definition FilamentRenderer.cpp:191
MaterialModifier & ModifyMaterial(const MaterialHandle &id) override
Definition FilamentRenderer.cpp:403
void UpdateSwapChain() override
Definition FilamentRenderer.cpp:179
void RequestReadPixels(int width, int height, std::function< void(std::shared_ptr< core::Tensor >)> callback) override
Definition FilamentRenderer.cpp:358
void UpdateBitmapSwapChain(int width, int height) override
Definition FilamentRenderer.cpp:185
TextureHandle GetGaussianSplatDepthTexture(const FilamentView &view) const
Definition FilamentRenderer.cpp:140
bool HasGaussianSplatOutput(const FilamentView &view) const
Definition FilamentRenderer.cpp:128
void ConvertToGuiScene(const SceneHandle &id)
Definition FilamentRenderer.cpp:508
MaterialInstanceHandle AddMaterialInstance(const MaterialHandle &material) override
Definition FilamentRenderer.cpp:398
std::shared_ptr< visualization::rendering::RenderToBuffer > CreateBufferRenderer() override
Definition FilamentRenderer.cpp:499
void RemoveTexture(const TextureHandle &id) override
Definition FilamentRenderer.cpp:466
void Draw() override
Definition FilamentRenderer.cpp:254
void EndFrame() override
Definition FilamentRenderer.cpp:292
FilamentScene * GetGuiScene() const
Definition FilamentRenderer.h:114
IndirectLightHandle AddIndirectLight(const ResourceLoadRequest &request) override
Definition FilamentRenderer.cpp:470
void SetOnAppleGaussianCompositeComplete(std::function< void()> callback)
Definition FilamentRenderer.cpp:174
int GetGaussianSplatMaxShDegree() const
Definition FilamentRenderer.cpp:147
bool LastBeginFrameSubmitted() const override
Definition FilamentRenderer.h:71
void RemoveIndirectLight(const IndirectLightHandle &id) override
Definition FilamentRenderer.cpp:481
GaussianSplatRenderer * GetGaussianSplatRenderer()
Definition FilamentRenderer.h:120
Scene * GetScene(const SceneHandle &id) const override
Definition FilamentRenderer.cpp:116
~FilamentRenderer() override
Definition FilamentRenderer.cpp:95
void RemoveMaterialInstance(const MaterialInstanceHandle &id) override
Definition FilamentRenderer.cpp:437
MaterialHandle AddMaterial(const ResourceLoadRequest &request) override
Definition FilamentRenderer.cpp:393
RenderingType GetBackendType() override
Return if the rendering backend is OpenGL, Vulkan or Metal.
Definition FilamentRenderer.h:130
void DestroyScene(const SceneHandle &id) override
Definition FilamentRenderer.cpp:124
Definition FilamentResourceManager.h:50
Definition GaussianSplatRenderer.h:38
int width
Definition FilePCD.cpp:53
int height
Definition FilePCD.cpp:54
Definition FilamentEngine.h:15
RenderingType
Definition Renderer.h:57
Definition PinholeCameraIntrinsic.cpp:16