Cache the render targets.
PiperOrigin-RevId: 929230223 Change-Id: I06571687ba0153c6ee8631685d1d37052419d2ac
This commit is contained in:
committed by
Copybara-Service
parent
b083ae487e
commit
ecb15a8d9e
@@ -62,6 +62,8 @@ class CompatContext {
|
|||||||
UniquePtr<mjrfContext> context_;
|
UniquePtr<mjrfContext> context_;
|
||||||
std::unique_ptr<SceneBridge> scene_bridge_;
|
std::unique_ptr<SceneBridge> scene_bridge_;
|
||||||
mjtFramebuffer framebuffer_ = mjFB_WINDOW;
|
mjtFramebuffer framebuffer_ = mjFB_WINDOW;
|
||||||
|
UniquePtr<mjrfRenderTarget> color_target_{nullptr, nullptr};
|
||||||
|
UniquePtr<mjrfRenderTarget> depth_target_{nullptr, nullptr};
|
||||||
};
|
};
|
||||||
|
|
||||||
CompatContext::CompatContext(const mjrFilamentConfig* config,
|
CompatContext::CompatContext(const mjrFilamentConfig* config,
|
||||||
@@ -104,14 +106,18 @@ void CompatContext::ReadPixels(mjrRect viewport, unsigned char* rgb,
|
|||||||
mju_error("ReadPixels is only supported for offscreen rendering.");
|
mju_error("ReadPixels is only supported for offscreen rendering.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const int width = viewport.width;
|
||||||
|
const int height = viewport.height;
|
||||||
|
|
||||||
if (rgb) {
|
if (rgb) {
|
||||||
mjrfRenderTargetConfig config;
|
if (!color_target_) {
|
||||||
mjrf_defaultRenderTargetConfig(&config);
|
mjrfRenderTargetConfig config;
|
||||||
config.width = viewport.width;
|
mjrf_defaultRenderTargetConfig(&config);
|
||||||
config.height = viewport.height;
|
config.color_format = mjPIXEL_FORMAT_RGB8;
|
||||||
config.color_format = mjPIXEL_FORMAT_RGB8;
|
config.depth_format = mjPIXEL_FORMAT_DEPTH32F;
|
||||||
config.depth_format = mjPIXEL_FORMAT_DEPTH32F;
|
color_target_ = CreateRenderTarget(context_.get(), config);
|
||||||
auto target = CreateRenderTarget(context_.get(), config);
|
}
|
||||||
|
mjrf_resizeRenderTarget(color_target_.get(), width, height);
|
||||||
|
|
||||||
mjrfRenderRequest req;
|
mjrfRenderRequest req;
|
||||||
mjrf_defaultRenderRequest(&req);
|
mjrf_defaultRenderRequest(&req);
|
||||||
@@ -119,11 +125,11 @@ void CompatContext::ReadPixels(mjrRect viewport, unsigned char* rgb,
|
|||||||
req.draw_mode = draw_mode_;
|
req.draw_mode = draw_mode_;
|
||||||
req.camera = scene_bridge_->GetCamera();
|
req.camera = scene_bridge_->GetCamera();
|
||||||
req.viewport = viewport;
|
req.viewport = viewport;
|
||||||
req.target = target.get();
|
req.target = color_target_.get();
|
||||||
|
|
||||||
mjrfReadPixelsRequest read_req;
|
mjrfReadPixelsRequest read_req;
|
||||||
mjrf_defaultReadPixelsRequest(&read_req);
|
mjrf_defaultReadPixelsRequest(&read_req);
|
||||||
read_req.target = target.get();
|
read_req.target = color_target_.get();
|
||||||
read_req.output = rgb;
|
read_req.output = rgb;
|
||||||
read_req.num_bytes = viewport.width * viewport.height * 3;
|
read_req.num_bytes = viewport.width * viewport.height * 3;
|
||||||
|
|
||||||
@@ -132,13 +138,14 @@ void CompatContext::ReadPixels(mjrRect viewport, unsigned char* rgb,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (depth) {
|
if (depth) {
|
||||||
mjrfRenderTargetConfig config;
|
if (!depth_target_) {
|
||||||
mjrf_defaultRenderTargetConfig(&config);
|
mjrfRenderTargetConfig config;
|
||||||
config.width = viewport.width;
|
mjrf_defaultRenderTargetConfig(&config);
|
||||||
config.height = viewport.height;
|
config.color_format = mjPIXEL_FORMAT_R32F;
|
||||||
config.color_format = mjPIXEL_FORMAT_R32F;
|
config.depth_format = mjPIXEL_FORMAT_DEPTH32F;
|
||||||
config.depth_format = mjPIXEL_FORMAT_DEPTH32F;
|
depth_target_ = CreateRenderTarget(context_.get(), config);
|
||||||
auto target = CreateRenderTarget(context_.get(), config);
|
}
|
||||||
|
mjrf_resizeRenderTarget(depth_target_.get(), width, height);
|
||||||
|
|
||||||
mjrfRenderRequest req;
|
mjrfRenderRequest req;
|
||||||
mjrf_defaultRenderRequest(&req);
|
mjrf_defaultRenderRequest(&req);
|
||||||
@@ -146,10 +153,11 @@ void CompatContext::ReadPixels(mjrRect viewport, unsigned char* rgb,
|
|||||||
req.draw_mode = mjDRAW_MODE_DEPTH;
|
req.draw_mode = mjDRAW_MODE_DEPTH;
|
||||||
req.camera = scene_bridge_->GetCamera();
|
req.camera = scene_bridge_->GetCamera();
|
||||||
req.viewport = viewport;
|
req.viewport = viewport;
|
||||||
req.target = target.get();
|
req.target = depth_target_.get();
|
||||||
|
|
||||||
mjrfReadPixelsRequest read_req;
|
mjrfReadPixelsRequest read_req;
|
||||||
mjrf_defaultReadPixelsRequest(&read_req);
|
mjrf_defaultReadPixelsRequest(&read_req);
|
||||||
|
read_req.target = depth_target_.get();
|
||||||
read_req.output = reinterpret_cast<uint8_t*>(depth);
|
read_req.output = reinterpret_cast<uint8_t*>(depth);
|
||||||
read_req.num_bytes = viewport.width * viewport.height * sizeof(float);
|
read_req.num_bytes = viewport.width * viewport.height * sizeof(float);
|
||||||
|
|
||||||
|
|||||||
@@ -292,6 +292,11 @@ void mjrf_configureSceneFromModel(mjrfScene* scene, const mjModel* model) {
|
|||||||
mujoco::SceneView::downcast(scene)->Configure(model);
|
mujoco::SceneView::downcast(scene)->Configure(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mjrf_resizeRenderTarget(mjrfRenderTarget* render_target, int width,
|
||||||
|
int height) {
|
||||||
|
mujoco::RenderTarget::downcast(render_target)->Prepare(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
mjrfFrameHandle mjrf_render(mjrfContext* ctx, const mjrfRenderRequest* req,
|
mjrfFrameHandle mjrf_render(mjrfContext* ctx, const mjrfRenderRequest* req,
|
||||||
int nreq, const mjrfReadPixelsRequest* read_req,
|
int nreq, const mjrfReadPixelsRequest* read_req,
|
||||||
int nread_req) {
|
int nread_req) {
|
||||||
|
|||||||
@@ -466,6 +466,9 @@ mjrfRenderTarget* mjrf_createRenderTarget(mjrfContext* ctx, const mjrfRenderTarg
|
|||||||
// Destroys the render target.
|
// Destroys the render target.
|
||||||
void mjrf_destroyRenderTarget(mjrfRenderTarget* render_target);
|
void mjrf_destroyRenderTarget(mjrfRenderTarget* render_target);
|
||||||
|
|
||||||
|
// Resizes the render target to the given width and height.
|
||||||
|
void mjrf_resizeRenderTarget(mjrfRenderTarget* render_target, int width, int height);
|
||||||
|
|
||||||
// ## Debug-only functions.
|
// ## Debug-only functions.
|
||||||
|
|
||||||
// Draws an ImGui editor for the given scene, exposing filament-specific settings.
|
// Draws an ImGui editor for the given scene, exposing filament-specific settings.
|
||||||
|
|||||||
Reference in New Issue
Block a user