diff --git a/src/experimental/filament/filament/filament_context.cc b/src/experimental/filament/filament/filament_context.cc index 6d7f9a29..014fb13a 100644 --- a/src/experimental/filament/filament/filament_context.cc +++ b/src/experimental/filament/filament/filament_context.cc @@ -180,14 +180,10 @@ void FilamentContext::Render(const mjrRect& viewport, const mjvScene* scene, } if (renderer_->beginFrame(window_swap_chain_)) { - filament::View* fview = scene_view_->PrepareRenderView(last_render_mode_); - renderer_->render(fview); + scene_view_->Render(renderer_, last_render_mode_); - if (gui_swap_chain_target_ == kWindowSwapChain) { - fview = gui_view_ ? gui_view_->PrepareRenderView() : nullptr; - if (fview) { - renderer_->render(fview); - } + if (gui_view_ && gui_swap_chain_target_ == kWindowSwapChain) { + gui_view_->Render(renderer_); } renderer_->endFrame(); @@ -299,27 +295,11 @@ void FilamentContext::ReadPixels(mjrRect viewport, unsigned char* rgb, if (rgb) { if (renderer_->beginFrame(offscreen_swap_chain_)) { - filament::View* fview = - scene_view_->PrepareRenderView(last_render_mode_); - - // We need to disable msaa in order to render to texture. - auto options = fview->getMultiSampleAntiAliasingOptions(); - fview->setMultiSampleAntiAliasingOptions({ - .enabled = false, - }); - fview->setRenderTarget(color_target_); - renderer_->render(fview); - fview->setRenderTarget(nullptr); - fview->setMultiSampleAntiAliasingOptions(options); + scene_view_->Render(renderer_, last_render_mode_, color_target_); // Render the GUI to the texture as well if requested. - if (gui_swap_chain_target_ == kOffscreenSwapChain) { - fview = gui_view_ ? gui_view_->PrepareRenderView() : nullptr; - if (fview) { - fview->setRenderTarget(color_target_); - renderer_->render(fview); - fview->setRenderTarget(nullptr); - } + if (gui_view_ && gui_swap_chain_target_ == kOffscreenSwapChain) { + gui_view_->Render(renderer_, color_target_); } const size_t num_bytes = viewport.width * viewport.height * 3; @@ -331,11 +311,8 @@ void FilamentContext::ReadPixels(mjrRect viewport, unsigned char* rgb, if (depth) { if (renderer_->beginFrame(offscreen_swap_chain_)) { - filament::View* fview = - scene_view_->PrepareRenderView(SceneView::DrawMode::kDepth); - fview->setRenderTarget(depth_target_); - renderer_->render(fview); - fview->setRenderTarget(nullptr); + scene_view_->Render(renderer_, SceneView::DrawMode::kDepth, + depth_target_); const size_t num_bytes = viewport.width * viewport.height * sizeof(float); ReadDepthPixels(renderer_, depth_target_, viewport, depth, num_bytes); diff --git a/src/experimental/filament/filament/gui_view.cc b/src/experimental/filament/filament/gui_view.cc index d1fa69fc..ca3327be 100644 --- a/src/experimental/filament/filament/gui_view.cc +++ b/src/experimental/filament/filament/gui_view.cc @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -371,8 +372,15 @@ filament::MaterialInstance* GuiView::GetMaterialInstance(int index, return instance; } -filament::View* GuiView::PrepareRenderView() { - return num_elements_ > 0 ? view_ : nullptr; +void GuiView::Render(filament::Renderer* renderer, + filament::RenderTarget* target) { + if (num_elements_ == 0) { + return; + } + + view_->setRenderTarget(target); + renderer->render(view_); + view_->setRenderTarget(nullptr); } static ImVec2 ClipSpaceToWindowCoordinates(float x, float y) { diff --git a/src/experimental/filament/filament/gui_view.h b/src/experimental/filament/filament/gui_view.h index e0c377bf..f0039d66 100644 --- a/src/experimental/filament/filament/gui_view.h +++ b/src/experimental/filament/filament/gui_view.h @@ -44,8 +44,8 @@ class GuiView { // correctly synced. void UpdateRenderable(); - // Returns the filament::View used to render the UX scene. - filament::View* PrepareRenderView(); + void Render(filament::Renderer* renderer, + filament::RenderTarget* target = nullptr); // Uploads texture to be used with ImGui's Image and ImageButton functions. uintptr_t UploadImage(uintptr_t tex_id, const uint8_t* pixels, int width, diff --git a/src/experimental/filament/filament/scene_view.cc b/src/experimental/filament/filament/scene_view.cc index e30c342c..94d02c8a 100644 --- a/src/experimental/filament/filament/scene_view.cc +++ b/src/experimental/filament/filament/scene_view.cc @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -204,6 +205,26 @@ SceneView::~SceneView() { engine_->destroy(scene_); } +void SceneView::Render(filament::Renderer* renderer, DrawMode draw_mode, + filament::RenderTarget* target) { + filament::View* view = PrepareRenderView(draw_mode); + filament::MultiSampleAntiAliasingOptions options = + view->getMultiSampleAntiAliasingOptions(); + + if (target) { + // We need to disable msaa in order to render to texture. + view->setMultiSampleAntiAliasingOptions({.enabled = false}); + } + + view->setRenderTarget(target); + renderer->render(view); + view->setRenderTarget(nullptr); + + if (target) { + view->setMultiSampleAntiAliasingOptions(options); + } +} + filament::View* SceneView::PrepareRenderView(DrawMode mode) { for (auto& iter : drawables_) { iter->SetDrawMode(mode); diff --git a/src/experimental/filament/filament/scene_view.h b/src/experimental/filament/filament/scene_view.h index 4e746ce8..db96b846 100644 --- a/src/experimental/filament/filament/scene_view.h +++ b/src/experimental/filament/filament/scene_view.h @@ -67,8 +67,8 @@ class SceneView { using DrawMode = Material::DrawMode; - // Prepares and returns the filament View for the given draw mode. - filament::View* PrepareRenderView(DrawMode mode); + void Render(filament::Renderer* renderer, DrawMode draw_mode, + filament::RenderTarget* target = nullptr); // Accessors. filament::Engine* GetEngine() const; @@ -79,6 +79,9 @@ class SceneView { SceneView& operator=(const SceneView&) = delete; private: + // Prepares and returns the filament View for the given draw mode. + filament::View* PrepareRenderView(DrawMode mode); + void UpdateCamera(const mjvGLCamera* cameras); void PrepareLights();