19 #pragma warning(disable : 4068 4146 4293)
22 #include <filament/Engine.h>
23 #include <filament/RenderableManager.h>
24 #include <filament/Renderer.h>
25 #include <filament/Scene.h>
26 #include <filament/SwapChain.h>
27 #include <filament/Texture.h>
28 #include <filament/View.h>
29 #include <filament/Viewport.h>
43 namespace visualization {
48 renderer_ = engine_.createRenderer();
52 if (view_)
delete view_;
54 engine_.destroy(swapchain_);
55 engine_.destroy(renderer_);
74 "No Scene object was provided for rendering into buffer");
75 cb({0, 0, 0,
nullptr, 0});
81 "Render to buffer can process only one request at time");
82 cb({0, 0, 0,
nullptr, 0});
86 if (!depth_image && (n_channels != 3 && n_channels != 4)) {
88 "Render to buffer must have either 3 or 4 channels");
89 cb({0, 0, 0,
nullptr, 0});
96 n_channels_ = n_channels;
98 depth_image_ = depth_image;
105 if (downcast_scene) {
107 scene_ = downcast_scene;
113 const std::uint32_t
height) {
115 engine_.destroy(swapchain_);
118 swapchain_ = engine_.createSwapChain(
width,
height,
119 filament::SwapChain::CONFIG_READABLE);
128 buffer_size_ =
width *
height * n_channels_ *
sizeof(std::uint8_t);
131 buffer_ =
static_cast<std::uint8_t*
>(realloc(buffer_, buffer_size_));
133 buffer_ =
static_cast<std::uint8_t*
>(malloc(buffer_size_));
137 void FilamentRenderToBuffer::CopySettings(
const View* view) {
139 auto* downcast =
static_cast<const FilamentView*
>(view);
160 void FilamentRenderToBuffer::ReadPixelsCallback(
void*,
size_t,
void* user) {
166 callback({
self->width_,
self->height_,
self->n_channels_,
self->buffer_,
167 self->buffer_size_});
171 self->callback_ =
nullptr;
173 self->frame_done_ =
true;
180 if (renderer_->beginFrame(swapchain_)) {
184 using namespace backend;
186 auto format = (n_channels_ == 3 ? PixelDataFormat::RGB
187 : PixelDataFormat::RGBA);
188 auto type = PixelDataType::UBYTE;
190 format = PixelDataFormat::DEPTH_COMPONENT;
191 type = PixelDataType::FLOAT;
193 auto user_param =
new PBDParams(
this, callback_);
194 PixelBufferDescriptor pd(buffer_, buffer_size_,
format,
type,
196 auto vp = view_->GetNativeView()->getViewport();
198 renderer_->readPixels(vp.left, vp.bottom, vp.width, vp.height,
201 renderer_->endFrame();
203 scene_->HideRefractedMaterials(
false);
209 if (renderer_->beginFrame(swapchain_)) {
210 renderer_->endFrame();
std::function< void(std::shared_ptr< core::Tensor >)> callback
filament::Texture::InternalFormat format
cmdLineReadable * params[]
static FilamentResourceManager & GetResourceManager()
FilamentRenderToBuffer(filament::Engine &engine)
void Configure(const View *view, Scene *scene, int width, int height, int n_channels, bool depth_image, BufferReadyCallback cb) override
View & GetView() override
void SetDimensions(std::uint32_t width, std::uint32_t height) override
~FilamentRenderToBuffer() override
void HideRefractedMaterials(bool hide=true)
void SetViewport(std::int32_t x, std::int32_t y, std::uint32_t w, std::uint32_t h) override
void CopySettingsFrom(const FilamentView &other)
void ConfigureForColorPicking() override
void SetShadowing(bool enabled, ShadowType type) override
void SetScene(FilamentScene &scene)
filament::View * GetNativeView() const
std::function< void(const Buffer &)> BufferReadyCallback
void ReadPixelsCallback(void *buffer, size_t buffer_size, void *user)
std::tuple< FilamentRenderToBuffer *, FilamentRenderToBuffer::BufferReadyCallback > PBDParams
Generic file read and write utility for python interface.