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_)) {
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);
+10 -2
View File
@@ -23,6 +23,7 @@
#include <imgui.h>
#include <filament/Engine.h>
#include <filament/RenderableManager.h>
#include <filament/Renderer.h>
#include <filament/TextureSampler.h>
#include <filament/Viewport.h>
#include <math/vec4.h>
@@ -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) {
@@ -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,
@@ -26,6 +26,7 @@
#include <filament/Material.h>
#include <filament/Options.h>
#include <filament/RenderableManager.h>
#include <filament/Renderer.h>
#include <filament/Skybox.h>
#include <filament/TransformManager.h>
#include <filament/View.h>
@@ -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);
@@ -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();