diff --git a/src/experimental/filament/CMakeLists.txt b/src/experimental/filament/CMakeLists.txt index 139daf8d..ca8f3f07 100644 --- a/src/experimental/filament/CMakeLists.txt +++ b/src/experimental/filament/CMakeLists.txt @@ -53,8 +53,8 @@ target_sources(${MUJOCO_FILAMENT_TARGET_NAME} filament/model_util.h filament/object_manager.cc filament/object_manager.h - filament/render_target_util.cc - filament/render_target_util.h + filament/render_target.cc + filament/render_target.h filament/renderables.cc filament/renderables.h filament/scene_view.cc diff --git a/src/experimental/filament/filament/filament_context.cc b/src/experimental/filament/filament/filament_context.cc index cbd06da2..b960eb49 100644 --- a/src/experimental/filament/filament/filament_context.cc +++ b/src/experimental/filament/filament/filament_context.cc @@ -43,7 +43,7 @@ #include "experimental/filament/filament/imgui_editor.h" #include "experimental/filament/filament/model_util.h" #include "experimental/filament/filament/object_manager.h" -#include "experimental/filament/filament/render_target_util.h" +#include "experimental/filament/filament/render_target.h" #include "experimental/filament/filament/scene_view.h" #include "experimental/filament/filament/texture.h" #include "experimental/filament/render_context_filament.h" @@ -185,12 +185,12 @@ void FilamentContext::SetFrameBuffer(int framebuffer) { } void FilamentContext::PrepareRenderTargets(int width, int height) { - color_target_ = std::make_unique( + color_target_ = std::make_unique( engine_, RenderTargetTextureType::kColor, RenderTargetTextureType::kDepth); color_target_->Prepare(width, height); - depth_target_ = std::make_unique( + depth_target_ = std::make_unique( engine_, RenderTargetTextureType::kDepthColor, RenderTargetTextureType::kDepth); depth_target_->Prepare(width, height); @@ -202,23 +202,25 @@ void FilamentContext::DestroyRenderTargets() { } static void ReadColorPixels(filament::Renderer* renderer, - filament::RenderTarget* target, mjrRect viewport, + RenderTarget* target, mjrRect viewport, unsigned char* buffer, size_t num_bytes) { filament::backend::PixelBufferDescriptor descriptor( buffer, num_bytes, filament::backend::PixelDataFormat::RGB, filament::backend::PixelDataType::UBYTE); - renderer->readPixels(target, viewport.left, viewport.bottom, viewport.width, - viewport.height, std::move(descriptor)); + renderer->readPixels(target->GetFilamentRenderTarget(), viewport.left, + viewport.bottom, viewport.width, viewport.height, + std::move(descriptor)); } static void ReadDepthPixels(filament::Renderer* renderer, - filament::RenderTarget* target, mjrRect viewport, + RenderTarget* target, mjrRect viewport, float* buffer, size_t num_bytes) { filament::backend::PixelBufferDescriptor descriptor( buffer, num_bytes, filament::backend::PixelDataFormat::R, filament::backend::PixelDataType::FLOAT); - renderer->readPixels(target, viewport.left, viewport.bottom, viewport.width, - viewport.height, std::move(descriptor)); + renderer->readPixels(target->GetFilamentRenderTarget(), viewport.left, + viewport.bottom, viewport.width, viewport.height, + std::move(descriptor)); } void FilamentContext::ReadPixels(mjrRect viewport, unsigned char* rgb, @@ -238,17 +240,15 @@ void FilamentContext::ReadPixels(mjrRect viewport, unsigned char* rgb, if (rgb) { if (renderer_->beginFrame(offscreen_swap_chain_)) { - scene_view_->Render(renderer_, last_render_mode_, - color_target_->GetRenderTarget()); + scene_view_->Render(renderer_, last_render_mode_, color_target_.get()); // Render the GUI to the texture as well if requested. if (gui_view_ && gui_swap_chain_target_ == kOffscreenSwapChain) { - gui_view_->Render(renderer_, color_target_->GetRenderTarget()); + gui_view_->Render(renderer_, color_target_.get()); } const size_t num_bytes = viewport.width * viewport.height * 3; - ReadColorPixels(renderer_, color_target_->GetRenderTarget(), viewport, - rgb, num_bytes); + ReadColorPixels(renderer_, color_target_.get(), viewport, rgb, num_bytes); renderer_->endFrame(); } @@ -257,11 +257,11 @@ void FilamentContext::ReadPixels(mjrRect viewport, unsigned char* rgb, if (depth) { if (renderer_->beginFrame(offscreen_swap_chain_)) { scene_view_->Render(renderer_, SceneView::DrawMode::kDepth, - depth_target_->GetRenderTarget()); + depth_target_.get()); const size_t num_bytes = viewport.width * viewport.height * sizeof(float); - ReadDepthPixels(renderer_, depth_target_->GetRenderTarget(), viewport, - depth, num_bytes); + ReadDepthPixels(renderer_, depth_target_.get(), viewport, depth, + num_bytes); renderer_->endFrame(); } diff --git a/src/experimental/filament/filament/filament_context.h b/src/experimental/filament/filament/filament_context.h index 7e2e2a9a..8de07824 100644 --- a/src/experimental/filament/filament/filament_context.h +++ b/src/experimental/filament/filament/filament_context.h @@ -26,7 +26,7 @@ #include #include "experimental/filament/filament/gui_view.h" #include "experimental/filament/filament/object_manager.h" -#include "experimental/filament/filament/render_target_util.h" +#include "experimental/filament/filament/render_target.h" #include "experimental/filament/filament/scene_view.h" #include "experimental/filament/render_context_filament.h" @@ -82,8 +82,8 @@ class FilamentContext { SceneView::DrawMode last_render_mode_ = SceneView::DrawMode::kNormal; SwapChainType scene_swap_chain_target_ = kWindowSwapChain; SwapChainType gui_swap_chain_target_ = kWindowSwapChain; - std::unique_ptr color_target_; - std::unique_ptr depth_target_; + std::unique_ptr color_target_; + std::unique_ptr depth_target_; std::unique_ptr object_manager_; std::unique_ptr scene_view_; std::unique_ptr gui_view_; diff --git a/src/experimental/filament/filament/gui_view.cc b/src/experimental/filament/filament/gui_view.cc index 9c522325..a6572366 100644 --- a/src/experimental/filament/filament/gui_view.cc +++ b/src/experimental/filament/filament/gui_view.cc @@ -32,6 +32,7 @@ #include #include #include "experimental/filament/filament/mesh.h" +#include "experimental/filament/filament/render_target.h" #include "experimental/filament/filament/texture.h" namespace mujoco { @@ -352,13 +353,12 @@ filament::MaterialInstance* GuiView::GetMaterialInstance(int index, return instance; } -void GuiView::Render(filament::Renderer* renderer, - filament::RenderTarget* target) { +void GuiView::Render(filament::Renderer* renderer, RenderTarget* target) { if (num_elements_ == 0) { return; } - view_->setRenderTarget(target); + view_->setRenderTarget(target ? target->GetFilamentRenderTarget() : nullptr); renderer->render(view_); view_->setRenderTarget(nullptr); } diff --git a/src/experimental/filament/filament/gui_view.h b/src/experimental/filament/filament/gui_view.h index 5ba9fdd9..0346ca57 100644 --- a/src/experimental/filament/filament/gui_view.h +++ b/src/experimental/filament/filament/gui_view.h @@ -30,6 +30,7 @@ #include #include #include "experimental/filament/filament/mesh.h" +#include "experimental/filament/filament/render_target.h" #include "experimental/filament/filament/texture.h" namespace mujoco { @@ -45,8 +46,7 @@ class GuiView { // correctly synced. void UpdateRenderable(); - void Render(filament::Renderer* renderer, - filament::RenderTarget* target = nullptr); + void Render(filament::Renderer* renderer, 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/render_target_util.cc b/src/experimental/filament/filament/render_target.cc similarity index 79% rename from src/experimental/filament/filament/render_target_util.cc rename to src/experimental/filament/filament/render_target.cc index 2e4ce391..dec68a82 100644 --- a/src/experimental/filament/filament/render_target_util.cc +++ b/src/experimental/filament/filament/render_target.cc @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "experimental/filament/filament/render_target_util.h" +#include "experimental/filament/filament/render_target.h" #include @@ -23,16 +23,16 @@ namespace mujoco { -RenderTargetAndTextures::RenderTargetAndTextures(filament::Engine* engine, +RenderTarget::RenderTarget(filament::Engine* engine, RenderTargetTextureType color, RenderTargetTextureType depth) : engine_(engine), color_type_(color), depth_type_(depth) {} -RenderTargetAndTextures::~RenderTargetAndTextures() noexcept { +RenderTarget::~RenderTarget() noexcept { Destroy(); } -void RenderTargetAndTextures::Prepare(int width, int height) { +void RenderTarget::Prepare(int width, int height) { if (width == width_ && height == height_) { return; } @@ -53,7 +53,7 @@ void RenderTargetAndTextures::Prepare(int width, int height) { render_target_ = builder.build(*engine_); } -void RenderTargetAndTextures::Destroy() { +void RenderTarget::Destroy() { if (render_target_) { engine_->destroy(render_target_); render_target_ = nullptr; @@ -62,15 +62,15 @@ void RenderTargetAndTextures::Destroy() { depth_texture_.reset(); } -Texture* RenderTargetAndTextures::GetColorTexture() const { +Texture* RenderTarget::GetColorTexture() const { return color_texture_.get(); } -Texture* RenderTargetAndTextures::GetDepthTexture() const { +Texture* RenderTarget::GetDepthTexture() const { return depth_texture_.get(); } -filament::RenderTarget* RenderTargetAndTextures::GetRenderTarget() const { +filament::RenderTarget* RenderTarget::GetFilamentRenderTarget() const { return render_target_; } diff --git a/src/experimental/filament/filament/render_target_util.h b/src/experimental/filament/filament/render_target.h similarity index 83% rename from src/experimental/filament/filament/render_target_util.h rename to src/experimental/filament/filament/render_target.h index ce6b96dc..3e5530cc 100644 --- a/src/experimental/filament/filament/render_target_util.h +++ b/src/experimental/filament/filament/render_target.h @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -#ifndef MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_RENDER_TARGET_UTIL_H_ -#define MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_RENDER_TARGET_UTIL_H_ +#ifndef MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_RENDER_TARGET_H_ +#define MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_RENDER_TARGET_H_ #include @@ -24,17 +24,17 @@ namespace mujoco { // Manages a filament RenderTarget and the textures which are bound to it. -class RenderTargetAndTextures { +class RenderTarget { public: // Defines the types of textures to create for the color and depth // attachments. - RenderTargetAndTextures(filament::Engine* engine, + RenderTarget(filament::Engine* engine, RenderTargetTextureType color, RenderTargetTextureType depth); - ~RenderTargetAndTextures() noexcept; + ~RenderTarget() noexcept; - RenderTargetAndTextures(const RenderTargetAndTextures&) = delete; - RenderTargetAndTextures& operator=(const RenderTargetAndTextures&) = delete; + RenderTarget(const RenderTarget&) = delete; + RenderTarget& operator=(const RenderTarget&) = delete; // Creates the textures and render target if the width of height differ from // the last time the render target was prepared. @@ -46,8 +46,8 @@ class RenderTargetAndTextures { // Returns the depth texture. Texture* GetDepthTexture() const; - // Returns the render target. - filament::RenderTarget* GetRenderTarget() const; + // Returns the underlying filament render target. + filament::RenderTarget* GetFilamentRenderTarget() const; private: void Destroy(); @@ -64,4 +64,4 @@ class RenderTargetAndTextures { } // namespace mujoco -#endif // MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_RENDER_TARGET_UTIL_H_ +#endif // MUJOCO_SRC_EXPERIMENTAL_FILAMENT_FILAMENT_RENDER_TARGET_H_ diff --git a/src/experimental/filament/filament/scene_view.cc b/src/experimental/filament/filament/scene_view.cc index 7009dd17..4f6f1ceb 100644 --- a/src/experimental/filament/filament/scene_view.cc +++ b/src/experimental/filament/filament/scene_view.cc @@ -49,7 +49,7 @@ #include "experimental/filament/filament/model_objects.h" #include "experimental/filament/filament/model_util.h" #include "experimental/filament/filament/object_manager.h" -#include "experimental/filament/filament/render_target_util.h" +#include "experimental/filament/filament/render_target.h" #include "experimental/filament/filament/texture.h" namespace mujoco { @@ -253,7 +253,7 @@ SceneView::~SceneView() { } void SceneView::Render(filament::Renderer* renderer, DrawMode draw_mode, - filament::RenderTarget* target) { + RenderTarget* target) { filament::View* view = PrepareRenderView(draw_mode); filament::MultiSampleAntiAliasingOptions options = view->getMultiSampleAntiAliasingOptions(); @@ -274,7 +274,8 @@ void SceneView::Render(filament::Renderer* renderer, DrawMode draw_mode, drawable->SetLayerMask(0x00); // Render the reflection to its render target. - reflect_view_->setRenderTarget(reflect_targets_[i]->GetRenderTarget()); + reflect_view_->setRenderTarget( + reflect_targets_[i]->GetFilamentRenderTarget()); renderer->render(reflect_view_); // Unhide the reflective surface. @@ -282,7 +283,7 @@ void SceneView::Render(filament::Renderer* renderer, DrawMode draw_mode, } } - view->setRenderTarget(target); + view->setRenderTarget(target ? target->GetFilamentRenderTarget() : nullptr); renderer->render(view); view->setRenderTarget(nullptr); @@ -516,7 +517,7 @@ void SceneView::AddReflectiveDrawable(Drawable* drawable) { // drawables. filament::Engine* engine = object_mgr_->GetEngine(); while (reflect_targets_.size() < reflectives_.size()) { - reflect_targets_.push_back(std::make_unique( + reflect_targets_.push_back(std::make_unique( engine, RenderTargetTextureType::kReflectionColor, RenderTargetTextureType::kDepth)); } diff --git a/src/experimental/filament/filament/scene_view.h b/src/experimental/filament/filament/scene_view.h index 8ced8be1..8fb686e1 100644 --- a/src/experimental/filament/filament/scene_view.h +++ b/src/experimental/filament/filament/scene_view.h @@ -38,7 +38,7 @@ #include "experimental/filament/filament/material.h" #include "experimental/filament/filament/model_objects.h" #include "experimental/filament/filament/object_manager.h" -#include "experimental/filament/filament/render_target_util.h" +#include "experimental/filament/filament/render_target.h" namespace mujoco { @@ -71,7 +71,7 @@ class SceneView { using DrawMode = Material::DrawMode; void Render(filament::Renderer* renderer, DrawMode draw_mode, - filament::RenderTarget* target = nullptr); + RenderTarget* target = nullptr); void UploadMesh(const mjModel* model, int id); void UploadTexture(const mjModel* model, int id); @@ -128,7 +128,7 @@ class SceneView { // Each reflective drawable has its own render target which is used to render // the reflected image. - std::vector> reflect_targets_; + std::vector> reflect_targets_; }; } // namespace mujoco