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_)) {
|
||||
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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user