From 4e7b2f21249086e5d5d5f7ead7c36a7ccd093688 Mon Sep 17 00:00:00 2001 From: Haroon Qureshi Date: Wed, 29 Apr 2026 09:12:58 -0700 Subject: [PATCH] Allow dimensions to be specified when creating a render target. PiperOrigin-RevId: 907622395 Change-Id: I0f806f4d77afa6a178a20d36dae3e96b81359494 --- .../filament/compat/mjr_filament_renderer.cc | 3 ++- src/experimental/filament/filament/render_target.cc | 11 ++++++++++- src/experimental/filament/render_context_filament.cc | 1 + src/experimental/filament/render_context_filament.h | 6 ++++++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/experimental/filament/compat/mjr_filament_renderer.cc b/src/experimental/filament/compat/mjr_filament_renderer.cc index c7f74ecf..fcd8f31e 100644 --- a/src/experimental/filament/compat/mjr_filament_renderer.cc +++ b/src/experimental/filament/compat/mjr_filament_renderer.cc @@ -134,11 +134,12 @@ void MjrFilamentRenderer::ReadPixels(mjrRect viewport, unsigned char* rgb, if (rgb) { mjrRenderTargetConfig config; mjr_defaultRenderTargetConfig(&config); + config.width = viewport.width; + config.height = viewport.height; config.color_format = mjPIXEL_FORMAT_RGB8; config.depth_format = mjPIXEL_FORMAT_DEPTH32F; auto target = std::make_unique(filament_context_.get(), config); - target->Prepare(viewport.width, viewport.height); render_requests_[0].target = target.get(); render_requests_[1].target = target.get(); diff --git a/src/experimental/filament/filament/render_target.cc b/src/experimental/filament/filament/render_target.cc index 8b6afb3e..d8919a96 100644 --- a/src/experimental/filament/filament/render_target.cc +++ b/src/experimental/filament/filament/render_target.cc @@ -34,7 +34,11 @@ namespace mujoco { RenderTarget::RenderTarget(FilamentContext* ctx, const mjrRenderTargetConfig& config) - : ctx_(ctx), config_(config) {} + : ctx_(ctx), config_(config) { + if (config_.width > 0 && config_.height > 0) { + Prepare(config_.width, config_.height); + } +} RenderTarget::~RenderTarget() noexcept { Destroy(); @@ -47,6 +51,11 @@ void RenderTarget::Prepare(int width, int height) { Destroy(); width_ = width; height_ = height; + if (width_ <= 0 || height_ <= 0) { + width_ = 0; + height_ = 0; + return; + } mjrTextureConfig color_config; mjr_defaultTextureConfig(&color_config); diff --git a/src/experimental/filament/render_context_filament.cc b/src/experimental/filament/render_context_filament.cc index 74c1d3e1..322118a1 100644 --- a/src/experimental/filament/render_context_filament.cc +++ b/src/experimental/filament/render_context_filament.cc @@ -116,6 +116,7 @@ void mjr_defaultRenderableParams(mjrRenderableParams* params) { } void mjr_defaultRenderTargetConfig(mjrRenderTargetConfig* config) { + memset(config, 0, sizeof(mjrRenderTargetConfig)); config->color_format = mjPIXEL_FORMAT_RGBA8; config->depth_format = mjPIXEL_FORMAT_DEPTH32F; } diff --git a/src/experimental/filament/render_context_filament.h b/src/experimental/filament/render_context_filament.h index 577b11a6..0f5ee16a 100644 --- a/src/experimental/filament/render_context_filament.h +++ b/src/experimental/filament/render_context_filament.h @@ -326,7 +326,13 @@ void mjr_defaultLightParams(mjrLightParams* params); // Defines the basic properties of a render target. struct mjrRenderTargetConfig { + // The width of the render target. + int width; + // The height of the render target. + int height; + // The format of the color buffer in the render target. mjrPixelFormat color_format; + // The format of the depth buffer in the render target. mjrPixelFormat depth_format; };