// ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- // Copyright (c) 2018-2023 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- #pragma once #include #include #include #include "open3d/visualization/rendering/Renderer.h" /// @cond namespace filament { class Engine; class Renderer; class Scene; class SwapChain; class VertexBuffer; } // namespace filament /// @endcond namespace open3d { namespace visualization { namespace rendering { class FilamentMaterialModifier; class FilamentRenderToBuffer; class FilamentResourceManager; class FilamentScene; class FilamentView; class FilamentRenderer : public Renderer { public: FilamentRenderer(filament::Engine& engine, void* native_drawable, FilamentResourceManager& resource_mgr); // This will create an offscreen renderer explicit FilamentRenderer(filament::Engine& engine, int width, int height, FilamentResourceManager& resource_mgr); ~FilamentRenderer() override; SceneHandle CreateScene() override; Scene* GetScene(const SceneHandle& id) const override; void DestroyScene(const SceneHandle& id) override; virtual void SetClearColor(const Eigen::Vector4f& color) override; void UpdateSwapChain() override; void UpdateBitmapSwapChain(int width, int height) override; void BeginFrame() override; void Draw() override; void RequestReadPixels(int width, int height, std::function)> callback) override; void EndFrame() override; void SetOnAfterDraw(std::function callback) override; MaterialHandle AddMaterial(const ResourceLoadRequest& request) override; MaterialInstanceHandle AddMaterialInstance( const MaterialHandle& material) override; MaterialModifier& ModifyMaterial(const MaterialHandle& id) override; MaterialModifier& ModifyMaterial(const MaterialInstanceHandle& id) override; void RemoveMaterialInstance(const MaterialInstanceHandle& id) override; TextureHandle AddTexture(const ResourceLoadRequest& request, bool srgb = false) override; TextureHandle AddTexture(const std::shared_ptr image, bool srgb = false) override; TextureHandle AddTexture(const t::geometry::Image& image, bool srgb = false) override; bool UpdateTexture(TextureHandle texture, const std::shared_ptr image, bool srgb) override; bool UpdateTexture(TextureHandle texture, const t::geometry::Image& image, bool srgb) override; void RemoveTexture(const TextureHandle& id) override; IndirectLightHandle AddIndirectLight( const ResourceLoadRequest& request) override; void RemoveIndirectLight(const IndirectLightHandle& id) override; SkyboxHandle AddSkybox(const ResourceLoadRequest& request) override; void RemoveSkybox(const SkyboxHandle& id) override; std::shared_ptr CreateBufferRenderer() override; // Removes scene from scenes list and draws it last // WARNING: will destroy previous gui scene if there was any void ConvertToGuiScene(const SceneHandle& id); FilamentScene* GetGuiScene() const { return gui_scene_.get(); } filament::Renderer* GetNative() { return renderer_; } private: friend class FilamentRenderToBuffer; filament::Engine& engine_; filament::Renderer* renderer_ = nullptr; filament::SwapChain* swap_chain_ = nullptr; filament::SwapChain* swap_chain_cached_ = nullptr; std::unordered_map> scenes_; std::unique_ptr gui_scene_; std::unique_ptr materials_modifier_; FilamentResourceManager& resource_mgr_; std::unordered_set> buffer_renderers_; bool frame_started_ = false; std::function on_after_draw_; bool needs_wait_after_draw_ = false; }; } // namespace rendering } // namespace visualization } // namespace open3d