image_framework_ymj/include/open3d/visualization/rendering/filament/FilamentRenderer.h

130 lines
4.7 KiB
C
Raw Permalink Normal View History

2024-12-06 16:25:16 +08:00
// ----------------------------------------------------------------------------
// - Open3D: www.open3d.org -
// ----------------------------------------------------------------------------
// Copyright (c) 2018-2023 www.open3d.org
// SPDX-License-Identifier: MIT
// ----------------------------------------------------------------------------
#pragma once
#include <memory>
#include <unordered_map>
#include <unordered_set>
#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<void(std::shared_ptr<core::Tensor>)>
callback) override;
void EndFrame() override;
void SetOnAfterDraw(std::function<void()> 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<geometry::Image> image,
bool srgb = false) override;
TextureHandle AddTexture(const t::geometry::Image& image,
bool srgb = false) override;
bool UpdateTexture(TextureHandle texture,
const std::shared_ptr<geometry::Image> 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<visualization::rendering::RenderToBuffer>
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<REHandle_abstract, std::unique_ptr<FilamentScene>>
scenes_;
std::unique_ptr<FilamentScene> gui_scene_;
std::unique_ptr<FilamentMaterialModifier> materials_modifier_;
FilamentResourceManager& resource_mgr_;
std::unordered_set<std::shared_ptr<FilamentRenderToBuffer>>
buffer_renderers_;
bool frame_started_ = false;
std::function<void()> on_after_draw_;
bool needs_wait_after_draw_ = false;
};
} // namespace rendering
} // namespace visualization
} // namespace open3d