From 6294e77907fcbb29a9135f09706aaee3c2218361 Mon Sep 17 00:00:00 2001 From: Haroon Qureshi Date: Wed, 17 Jun 2026 02:53:26 -0700 Subject: [PATCH] Do not render flexes/skins with no geometry. PiperOrigin-RevId: 933604372 Change-Id: I80169ff09ec6908d101b5f10bbf8aa1a6e8b8249 --- src/experimental/filament/compat/scene_bridge.cc | 6 ++++-- src/experimental/filament/compat/scene_objects.cc | 14 +++++++++++--- src/experimental/filament/compat/scene_objects.h | 2 +- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/experimental/filament/compat/scene_bridge.cc b/src/experimental/filament/compat/scene_bridge.cc index c9d2250f..100d0fee 100644 --- a/src/experimental/filament/compat/scene_bridge.cc +++ b/src/experimental/filament/compat/scene_bridge.cc @@ -126,8 +126,10 @@ void SceneBridge::Update(const mjrRect& viewport, const mjvScene* scene) { } if (geom->type == mjGEOM_FLEX || geom->type == mjGEOM_SKIN) { - scene_objects_->CreateSkinFlexMesh(scene, model_objects_->GetModel(), - *geom); + if (!scene_objects_->CreateSkinFlexMesh(scene, model_objects_->GetModel(), + *geom)) { + continue; + } } UniquePtr renderable = CreateGeomRenderable( diff --git a/src/experimental/filament/compat/scene_objects.cc b/src/experimental/filament/compat/scene_objects.cc index b05daeb3..44a65378 100644 --- a/src/experimental/filament/compat/scene_objects.cc +++ b/src/experimental/filament/compat/scene_objects.cc @@ -103,9 +103,13 @@ static std::span GetIndices(const mjModel* model, } } -static void UpdateSkinFlexMeshData(mjrfMeshData* data, const mjModel* model, +static bool UpdateSkinFlexMeshData(mjrfMeshData* data, const mjModel* model, const mjvScene* scene, const mjvGeom& geom) { auto positions = GetPositions(model, scene, geom); + if (positions.empty()) { + return false; + } + auto normals = GetNormals(model, scene, geom); auto uvs = GetUvs(model, scene, geom); auto indices = GetIndices(model, scene, geom); @@ -133,16 +137,19 @@ static void UpdateSkinFlexMeshData(mjrfMeshData* data, const mjModel* model, data->compute_bounds = true; data->release = nullptr; data->user_data = nullptr; + return true; } SceneObjects::SceneObjects(mjrfContext* ctx) : ctx_(ctx) {} -void SceneObjects::CreateSkinFlexMesh(const mjvScene* scene, +bool SceneObjects::CreateSkinFlexMesh(const mjvScene* scene, const mjModel* model, const mjvGeom& geom) { mjrfMeshData data; mjrf_defaultMeshData(&data); - UpdateSkinFlexMeshData(&data, model, scene, geom); + if (!UpdateSkinFlexMeshData(&data, model, scene, geom)) { + return false; + } if (geom.type == mjGEOM_FLEX) { flexes_.insert_or_assign(geom.objid, CreateMesh(ctx_, data)); } else if (geom.type == mjGEOM_SKIN) { @@ -150,6 +157,7 @@ void SceneObjects::CreateSkinFlexMesh(const mjvScene* scene, } else { mju_error("Unsupported dynamic mesh type: %d", geom.type); } + return true; } const mjrfMesh* SceneObjects::GetFlexMesh(int geom_id) const { diff --git a/src/experimental/filament/compat/scene_objects.h b/src/experimental/filament/compat/scene_objects.h index d1a20ec4..7e45b523 100644 --- a/src/experimental/filament/compat/scene_objects.h +++ b/src/experimental/filament/compat/scene_objects.h @@ -30,7 +30,7 @@ class SceneObjects { explicit SceneObjects(mjrfContext* ctx); // Creates a skin or flex mesh from the given geom in the mjvScene. - void CreateSkinFlexMesh(const mjvScene* scene, const mjModel* model, + bool CreateSkinFlexMesh(const mjvScene* scene, const mjModel* model, const mjvGeom& geom); // Returns the mesh for the given geom id, as created by CreateSkinFlexMesh.