From 982e3be9ef056de0053f20feca21a9c6988d73c3 Mon Sep 17 00:00:00 2001 From: Haroon Qureshi Date: Mon, 8 Jun 2026 10:25:57 -0700 Subject: [PATCH] Add mjrfCallback type. PiperOrigin-RevId: 928640487 Change-Id: Iebf470caafe924a976e4a1b39b0c47727e22195b --- src/experimental/filament/compat/light_manager.cc | 2 +- src/experimental/filament/compat/model_objects.cc | 6 +++--- src/experimental/filament/filament/builtins.cc | 2 +- src/experimental/filament/filament/filament_context.cc | 4 ++-- src/experimental/filament/filament/mesh.cc | 4 ++-- src/experimental/filament/filament/texture.cc | 2 +- src/experimental/filament/render_context_filament.h | 9 ++++++--- src/experimental/platform/ux/imgui_bridge.cc | 4 ++-- 8 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/experimental/filament/compat/light_manager.cc b/src/experimental/filament/compat/light_manager.cc index c25984f0..9c2d7f97 100644 --- a/src/experimental/filament/compat/light_manager.cc +++ b/src/experimental/filament/compat/light_manager.cc @@ -63,7 +63,7 @@ static UniquePtr CreateFallbackIndirectLightTexture( mjrf_defaultTextureData(&payload); payload.bytes = bytes; payload.nbytes = nbytes; - payload.release_callback = +[](void* user_data) { + payload.release = +[](void* user_data) { mju_closeResource((mjResource*)user_data); }; payload.user_data = resource; diff --git a/src/experimental/filament/compat/model_objects.cc b/src/experimental/filament/compat/model_objects.cc index e5ed3013..fa04d0c6 100644 --- a/src/experimental/filament/compat/model_objects.cc +++ b/src/experimental/filament/compat/model_objects.cc @@ -414,7 +414,7 @@ static void UpdateMeshData(mjrfMeshData* data, const mjModel* model, int id, MeshBuilder* builder = new MeshBuilder(num_vertices); data->user_data = builder; - data->release_callback = [](void* user_data) { + data->release = [](void* user_data) { delete static_cast(user_data); }; @@ -485,7 +485,7 @@ void UpdateSkinFlexMeshData(mjrfMeshData* data, const mjModel* model, data->index_type = mjINDEX_TYPE_U32; data->primitive_type = mjMESH_PRIMITIVE_TYPE_TRIANGLES; data->compute_bounds = true; - data->release_callback = nullptr; + data->release = nullptr; data->user_data = nullptr; } @@ -572,7 +572,7 @@ void ModelObjects::UploadTexture(const mjModel* model, int id) { model->tex_width[id] * model->tex_height[id] * model->tex_nchannel[id]; // We assume that the model has the same lifetime as the engine. payload.user_data = nullptr; - payload.release_callback = nullptr; + payload.release = nullptr; auto texture = CreateTexture(ctx_, config); mjrf_setTextureData(texture.get(), &payload); diff --git a/src/experimental/filament/filament/builtins.cc b/src/experimental/filament/filament/builtins.cc index 97b0059f..95424920 100644 --- a/src/experimental/filament/filament/builtins.cc +++ b/src/experimental/filament/filament/builtins.cc @@ -69,7 +69,7 @@ class BuiltinBuilder : public mjrfMeshData { Args&&... args) { auto builder = new T(std::forward(args)...); mjrfMeshData* mesh_data = builder->PrepareMeshData(); - mesh_data->release_callback = +[](void* user_data) { + mesh_data->release = +[](void* user_data) { delete static_cast(user_data); }; mesh_data->user_data = builder; diff --git a/src/experimental/filament/filament/filament_context.cc b/src/experimental/filament/filament/filament_context.cc index eecac880..75189e1c 100644 --- a/src/experimental/filament/filament/filament_context.cc +++ b/src/experimental/filament/filament/filament_context.cc @@ -165,8 +165,8 @@ mjrfFrameHandle FilamentContext::Render( if (!read_requests.empty()) { engine_->flushAndWait(); - if (read_requests[0].read_completed_callback) { - read_requests[0].read_completed_callback(read_requests[0].user_data); + if (read_requests[0].read_completed) { + read_requests[0].read_completed(read_requests[0].user_data); } } diff --git a/src/experimental/filament/filament/mesh.cc b/src/experimental/filament/filament/mesh.cc index 0f38e606..35f8fe6e 100644 --- a/src/experimental/filament/filament/mesh.cc +++ b/src/experimental/filament/filament/mesh.cc @@ -110,9 +110,9 @@ Mesh::Mesh(filament::Engine* engine, const mjrfMeshData& data) // If the user has provided a release callback, then we need to ensure we // call is when filament is done with the mesh data. - if (data.release_callback) { + if (data.release) { shared_state_->callbacks.push_back([=]() { - data.release_callback(data.user_data); + data.release(data.user_data); }); } diff --git a/src/experimental/filament/filament/texture.cc b/src/experimental/filament/filament/texture.cc index f86fc9c1..1953fe4c 100644 --- a/src/experimental/filament/filament/texture.cc +++ b/src/experimental/filament/filament/texture.cc @@ -162,7 +162,7 @@ Texture::~Texture() { void Texture::Upload(const mjrfTextureData& data) { user_data_ = data.user_data; - release_callback_ = data.release_callback; + release_callback_ = data.release; if (data.bytes == nullptr || data.nbytes == 0) { ReleaseData(); diff --git a/src/experimental/filament/render_context_filament.h b/src/experimental/filament/render_context_filament.h index ec03ec79..677d7151 100644 --- a/src/experimental/filament/render_context_filament.h +++ b/src/experimental/filament/render_context_filament.h @@ -67,6 +67,9 @@ struct mjrfLight {}; struct mjrfRenderable {}; struct mjrfRenderTarget {}; +// Callback function type for rendering operations. +typedef void (*mjrfCallback)(void* user_data); + // ## Rendering Context (mjrfContext) // // The Context is the main entry point for the library. It manages all the @@ -194,7 +197,7 @@ struct mjrfReadPixelsRequest { // Callback when the read pixels operation is complete. This function can // optionally be used to free the output buffer if needed. - void (*read_completed_callback)(void* user_data); + mjrfCallback read_completed; // User data to pass to the completion callback. void* user_data; @@ -310,7 +313,7 @@ struct mjrfTextureData { // Because rendering may be multithreaded, we cannot make assumptions about // when the image data will finish uploading to the GPU. As such, we will use // this callback to notify callers when it is safe to free the image data. - void (*release_callback)(void* user_data); + mjrfCallback release; // User data to pass to the release callback. void* user_data; @@ -441,7 +444,7 @@ struct mjrfMeshData { // Because rendering may be multithreaded, we cannot make assumptions about // when the mesh data will finish uploading to the GPU. As such, we will use // this callback to notify callers when it is safe to free the mesh data. - void (*release_callback)(void* user_data); + mjrfCallback release; // User data to pass to the release callback. void* user_data; diff --git a/src/experimental/platform/ux/imgui_bridge.cc b/src/experimental/platform/ux/imgui_bridge.cc index 74634d84..60af6457 100644 --- a/src/experimental/platform/ux/imgui_bridge.cc +++ b/src/experimental/platform/ux/imgui_bridge.cc @@ -101,7 +101,7 @@ uintptr_t ImguiBridge::UploadImage(uintptr_t tex_id, const uint8_t* pixels, texture_data.bytes = bytes; texture_data.nbytes = num_bytes; texture_data.user_data = bytes; - texture_data.release_callback = callback; + texture_data.release = callback; std::memcpy(bytes, pixels, num_bytes); mjrf_setTextureData(texture, &texture_data); @@ -138,7 +138,7 @@ void ImguiBridge::UpdateTexture(ImTextureData* data) { texture_data.bytes = data->GetPixels(); texture_data.nbytes = data->Width * data->Height * 4; texture_data.user_data = nullptr; - texture_data.release_callback = nullptr; + texture_data.release = nullptr; mjrf_setTextureData(iter->second.get(), &texture_data); data->SetStatus(ImTextureStatus_OK); }