Move Render logic into the Scene/Gui View classes.

This is in preparation for an upcoming change.

PiperOrigin-RevId: 886203890
Change-Id: I91eba35b394898d942f66f75e947c450b924a973
This commit is contained in:
Haroon Qureshi
2026-03-19 08:49:58 -07:00
committed by Copybara-Service
parent 57bdf89d07
commit 7c63bcc8f3
5 changed files with 46 additions and 37 deletions
@@ -180,14 +180,10 @@ void FilamentContext::Render(const mjrRect& viewport, const mjvScene* scene,
} }
if (renderer_->beginFrame(window_swap_chain_)) { if (renderer_->beginFrame(window_swap_chain_)) {
filament::View* fview = scene_view_->PrepareRenderView(last_render_mode_); scene_view_->Render(renderer_, last_render_mode_);
renderer_->render(fview);
if (gui_swap_chain_target_ == kWindowSwapChain) { if (gui_view_ && gui_swap_chain_target_ == kWindowSwapChain) {
fview = gui_view_ ? gui_view_->PrepareRenderView() : nullptr; gui_view_->Render(renderer_);
if (fview) {
renderer_->render(fview);
}
} }
renderer_->endFrame(); renderer_->endFrame();
@@ -299,27 +295,11 @@ void FilamentContext::ReadPixels(mjrRect viewport, unsigned char* rgb,
if (rgb) { if (rgb) {
if (renderer_->beginFrame(offscreen_swap_chain_)) { if (renderer_->beginFrame(offscreen_swap_chain_)) {
filament::View* fview = scene_view_->Render(renderer_, last_render_mode_, color_target_);
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);
// Render the GUI to the texture as well if requested. // Render the GUI to the texture as well if requested.
if (gui_swap_chain_target_ == kOffscreenSwapChain) { if (gui_view_ && gui_swap_chain_target_ == kOffscreenSwapChain) {
fview = gui_view_ ? gui_view_->PrepareRenderView() : nullptr; gui_view_->Render(renderer_, color_target_);
if (fview) {
fview->setRenderTarget(color_target_);
renderer_->render(fview);
fview->setRenderTarget(nullptr);
}
} }
const size_t num_bytes = viewport.width * viewport.height * 3; 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 (depth) {
if (renderer_->beginFrame(offscreen_swap_chain_)) { if (renderer_->beginFrame(offscreen_swap_chain_)) {
filament::View* fview = scene_view_->Render(renderer_, SceneView::DrawMode::kDepth,
scene_view_->PrepareRenderView(SceneView::DrawMode::kDepth); depth_target_);
fview->setRenderTarget(depth_target_);
renderer_->render(fview);
fview->setRenderTarget(nullptr);
const size_t num_bytes = viewport.width * viewport.height * sizeof(float); const size_t num_bytes = viewport.width * viewport.height * sizeof(float);
ReadDepthPixels(renderer_, depth_target_, viewport, depth, num_bytes); ReadDepthPixels(renderer_, depth_target_, viewport, depth, num_bytes);
+10 -2
View File
@@ -23,6 +23,7 @@
#include <imgui.h> #include <imgui.h>
#include <filament/Engine.h> #include <filament/Engine.h>
#include <filament/RenderableManager.h> #include <filament/RenderableManager.h>
#include <filament/Renderer.h>
#include <filament/TextureSampler.h> #include <filament/TextureSampler.h>
#include <filament/Viewport.h> #include <filament/Viewport.h>
#include <math/vec4.h> #include <math/vec4.h>
@@ -371,8 +372,15 @@ filament::MaterialInstance* GuiView::GetMaterialInstance(int index,
return instance; return instance;
} }
filament::View* GuiView::PrepareRenderView() { void GuiView::Render(filament::Renderer* renderer,
return num_elements_ > 0 ? view_ : nullptr; filament::RenderTarget* target) {
if (num_elements_ == 0) {
return;
}
view_->setRenderTarget(target);
renderer->render(view_);
view_->setRenderTarget(nullptr);
} }
static ImVec2 ClipSpaceToWindowCoordinates(float x, float y) { static ImVec2 ClipSpaceToWindowCoordinates(float x, float y) {
@@ -44,8 +44,8 @@ class GuiView {
// correctly synced. // correctly synced.
void UpdateRenderable(); void UpdateRenderable();
// Returns the filament::View used to render the UX scene. void Render(filament::Renderer* renderer,
filament::View* PrepareRenderView(); filament::RenderTarget* target = nullptr);
// Uploads texture to be used with ImGui's Image and ImageButton functions. // 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, uintptr_t UploadImage(uintptr_t tex_id, const uint8_t* pixels, int width,
@@ -26,6 +26,7 @@
#include <filament/Material.h> #include <filament/Material.h>
#include <filament/Options.h> #include <filament/Options.h>
#include <filament/RenderableManager.h> #include <filament/RenderableManager.h>
#include <filament/Renderer.h>
#include <filament/Skybox.h> #include <filament/Skybox.h>
#include <filament/TransformManager.h> #include <filament/TransformManager.h>
#include <filament/View.h> #include <filament/View.h>
@@ -204,6 +205,26 @@ SceneView::~SceneView() {
engine_->destroy(scene_); 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) { filament::View* SceneView::PrepareRenderView(DrawMode mode) {
for (auto& iter : drawables_) { for (auto& iter : drawables_) {
iter->SetDrawMode(mode); iter->SetDrawMode(mode);
@@ -67,8 +67,8 @@ class SceneView {
using DrawMode = Material::DrawMode; using DrawMode = Material::DrawMode;
// Prepares and returns the filament View for the given draw mode. void Render(filament::Renderer* renderer, DrawMode draw_mode,
filament::View* PrepareRenderView(DrawMode mode); filament::RenderTarget* target = nullptr);
// Accessors. // Accessors.
filament::Engine* GetEngine() const; filament::Engine* GetEngine() const;
@@ -79,6 +79,9 @@ class SceneView {
SceneView& operator=(const SceneView&) = delete; SceneView& operator=(const SceneView&) = delete;
private: private:
// Prepares and returns the filament View for the given draw mode.
filament::View* PrepareRenderView(DrawMode mode);
void UpdateCamera(const mjvGLCamera* cameras); void UpdateCamera(const mjvGLCamera* cameras);
void PrepareLights(); void PrepareLights();