image_framework_ymj/include/open3d/visualization/rendering/filament/FilamentResourceManager.h
2024-12-06 16:25:16 +08:00

189 lines
7.7 KiB
C++
Executable File

// ----------------------------------------------------------------------------
// - 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/geometry/TriangleMesh.h"
#include "open3d/visualization/rendering/Renderer.h"
#include "open3d/visualization/rendering/RendererHandle.h"
/// @cond
namespace filament {
class Engine;
class IndexBuffer;
class IndirectLight;
class Material;
class MaterialInstance;
class Skybox;
class Texture;
class RenderTarget;
class VertexBuffer;
} // namespace filament
/// @endcond
namespace open3d {
namespace t {
namespace geometry {
class Image;
}
} // namespace t
namespace geometry {
class Image;
}
namespace visualization {
namespace rendering {
// Centralized storage of allocated resources.
// Used for convenient access from various components of render.
// Owns all added resources.
class FilamentResourceManager {
public:
static const MaterialHandle kDefaultLit;
static const MaterialHandle kDefaultLitWithTransparency;
static const MaterialHandle kDefaultLitSSR;
static const MaterialHandle kDefaultUnlit;
static const MaterialHandle kDefaultUnlitWithTransparency;
static const MaterialHandle kDefaultNormalShader;
static const MaterialHandle kDefaultDepthShader;
static const MaterialHandle kDefaultDepthValueShader;
static const MaterialHandle kDefaultUnlitGradientShader;
static const MaterialHandle kDefaultUnlitSolidColorShader;
static const MaterialHandle kDefaultUnlitBackgroundShader;
static const MaterialHandle kInfinitePlaneShader;
static const MaterialHandle kDefaultLineShader;
static const MaterialHandle kDefaultUnlitPolygonOffsetShader;
static const MaterialInstanceHandle kDepthMaterial;
static const MaterialInstanceHandle kNormalsMaterial;
static const MaterialInstanceHandle kColorMapMaterial;
static const TextureHandle kDefaultTexture;
static const TextureHandle kDefaultColorMap;
static const TextureHandle kDefaultNormalMap;
explicit FilamentResourceManager(filament::Engine& engine);
~FilamentResourceManager();
// \param materialData must remain valid for the duration of the call to
// CreateMaterial(), and may be freed afterwards.
MaterialHandle CreateMaterial(const void* material_data, size_t data_size);
MaterialHandle CreateMaterial(const ResourceLoadRequest& request);
MaterialInstanceHandle CreateMaterialInstance(const MaterialHandle& id);
TextureHandle CreateTexture(const char* path, bool srgb);
TextureHandle CreateTexture(const std::shared_ptr<geometry::Image>& image,
bool srgb);
// Slow, will make copy of image data and free it after.
TextureHandle CreateTexture(const geometry::Image& image, bool srgb);
TextureHandle CreateTexture(const t::geometry::Image& image, bool srgb);
// Creates texture of size 'dimension' filled with color 'color'
TextureHandle CreateTextureFilled(const Eigen::Vector3f& color,
size_t dimension);
// Creates a texture for use as a color attachment to a RenderTarget
TextureHandle CreateColorAttachmentTexture(int width, int height);
// Creates a texture for use as a depth attachment to a RenderTarget
TextureHandle CreateDepthAttachmentTexture(int width, int height);
RenderTargetHandle CreateRenderTarget(TextureHandle color,
TextureHandle depth);
// Replaces the contents of the texture with the image. Returns false if
// the image is not the same size of the texture.
bool UpdateTexture(TextureHandle texture,
const std::shared_ptr<geometry::Image> image,
bool srgb);
bool UpdateTexture(TextureHandle texture,
const t::geometry::Image& image,
bool srgb);
IndirectLightHandle CreateIndirectLight(const ResourceLoadRequest& request);
SkyboxHandle CreateColorSkybox(const Eigen::Vector3f& color);
SkyboxHandle CreateSkybox(const ResourceLoadRequest& request);
// Since rendering uses not all Open3D geometry/filament features, we don't
// know which arguments pass to CreateVB(...). Thus creation of VB is
// managed by FilamentGeometryBuffersBuilder class
VertexBufferHandle AddVertexBuffer(filament::VertexBuffer* vertex_buffer);
void ReuseVertexBuffer(VertexBufferHandle vb);
IndexBufferHandle CreateIndexBuffer(size_t indices_count,
size_t index_stride);
std::weak_ptr<filament::Material> GetMaterial(const MaterialHandle& id);
std::weak_ptr<filament::MaterialInstance> GetMaterialInstance(
const MaterialInstanceHandle& id);
std::weak_ptr<filament::Texture> GetTexture(const TextureHandle& id);
std::weak_ptr<filament::RenderTarget> GetRenderTarget(
const RenderTargetHandle& id);
std::weak_ptr<filament::IndirectLight> GetIndirectLight(
const IndirectLightHandle& id);
std::weak_ptr<filament::Skybox> GetSkybox(const SkyboxHandle& id);
std::weak_ptr<filament::VertexBuffer> GetVertexBuffer(
const VertexBufferHandle& id);
std::weak_ptr<filament::IndexBuffer> GetIndexBuffer(
const IndexBufferHandle& id);
void DestroyAll();
void Destroy(const REHandle_abstract& id);
public:
// Only public so that .cpp file can use this
template <class ResourceType>
struct BoxedResource {
std::shared_ptr<ResourceType> ptr;
size_t use_count = 0;
BoxedResource() {}
BoxedResource(std::shared_ptr<ResourceType> p) : ptr(p), use_count(1) {}
std::shared_ptr<ResourceType> operator->() { return ptr; }
};
private:
filament::Engine& engine_;
template <class ResourceType>
using ResourcesContainer =
std::unordered_map<REHandle_abstract, BoxedResource<ResourceType>>;
ResourcesContainer<filament::MaterialInstance> material_instances_;
ResourcesContainer<filament::Material> materials_;
ResourcesContainer<filament::Texture> textures_;
ResourcesContainer<filament::RenderTarget> render_targets_;
ResourcesContainer<filament::IndirectLight> ibls_;
ResourcesContainer<filament::Skybox> skyboxes_;
ResourcesContainer<filament::VertexBuffer> vertex_buffers_;
ResourcesContainer<filament::IndexBuffer> index_buffers_;
// Stores dependent resources, which should be deallocated when
// resource referred by map key is deallocated.
// WARNING: Don't put in dependent list resources which are available
// publicly
std::unordered_map<REHandle_abstract, std::unordered_set<REHandle_abstract>>
dependencies_;
// Cache for GPU
std::unordered_map<uint64_t, TextureHandle> texture_cache_;
filament::Texture* LoadTextureFromImage(
const std::shared_ptr<geometry::Image>& image, bool srgb);
filament::Texture* LoadTextureFromImage(const t::geometry::Image& image,
bool srgb);
filament::Texture* LoadFilledTexture(const Eigen::Vector3f& color,
size_t dimension);
void LoadDefaults();
};
} // namespace rendering
} // namespace visualization
} // namespace open3d