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.