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:
committed by
Copybara-Service
parent
57bdf89d07
commit
7c63bcc8f3
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user