diff --git a/src/experimental/filament/compat/model_objects.cc b/src/experimental/filament/compat/model_objects.cc index 989cc781..20d51231 100644 --- a/src/experimental/filament/compat/model_objects.cc +++ b/src/experimental/filament/compat/model_objects.cc @@ -599,7 +599,13 @@ void ModelObjects::CreateSkinFlexMesh(const mjvScene* scene, const mjvGeom& geom mjrMeshData data; mjr_defaultMeshData(&data); UpdateSkinFlexMeshData(&data, model_, scene, geom); - dynamic_meshes_.insert_or_assign(geom.objid, CreateMesh(ctx_, data)); + if (geom.type == mjGEOM_FLEX) { + flexes_.insert_or_assign(geom.objid, CreateMesh(ctx_, data)); + } else if (geom.type == mjGEOM_SKIN) { + skins_.insert_or_assign(geom.objid, CreateMesh(ctx_, data)); + } else { + mju_error("Unsupported dynamic mesh type: %d", geom.type); + } } const mjrMesh* ModelObjects::GetMesh(int data_id) const { @@ -624,11 +630,19 @@ const mjrMesh* ModelObjects::GetHeightField(int hfield_id) const { return nullptr; } -const mjrMesh* ModelObjects::GetFlexSkinMesh(int geom_id) const { - if (auto it = dynamic_meshes_.find(geom_id); it != dynamic_meshes_.end()) { +const mjrMesh* ModelObjects::GetFlexMesh(int geom_id) const { + if (auto it = flexes_.find(geom_id); it != flexes_.end()) { return it->second.get(); } - mju_error("Unknown dynamic mesh %d", geom_id); + mju_error("Unknown flex mesh %d", geom_id); + return nullptr; +} + +const mjrMesh* ModelObjects::GetSkinMesh(int geom_id) const { + if (auto it = skins_.find(geom_id); it != skins_.end()) { + return it->second.get(); + } + mju_error("Unknown skin mesh %d", geom_id); return nullptr; } diff --git a/src/experimental/filament/compat/model_objects.h b/src/experimental/filament/compat/model_objects.h index 0cee9ad8..b1aa7a49 100644 --- a/src/experimental/filament/compat/model_objects.h +++ b/src/experimental/filament/compat/model_objects.h @@ -40,7 +40,8 @@ class ModelObjects { // Returns the cached instance of a filament object created from the mjModel. const mjrMesh* GetMesh(int data_id) const; const mjrMesh* GetHeightField(int hfield_id) const; - const mjrMesh* GetFlexSkinMesh(int geom_id) const; + const mjrMesh* GetSkinMesh(int geom_id) const; + const mjrMesh* GetFlexMesh(int geom_id) const; const mjrTexture* GetTexture(int tex_id) const; const mjrTexture* GetSkyboxTexture() const; @@ -59,7 +60,8 @@ class ModelObjects { std::unordered_map> meshes_; std::unordered_map> convex_hulls_; std::unordered_map> height_fields_; - std::unordered_map> dynamic_meshes_; + std::unordered_map> skins_; + std::unordered_map> flexes_; std::unordered_map> textures_; float specular_multiplier_ = 0.2f; float shininess_multiplier_ = 0.1f; diff --git a/src/experimental/filament/compat/scene_geom_util.cc b/src/experimental/filament/compat/scene_geom_util.cc index a2c11a65..83622ff1 100644 --- a/src/experimental/filament/compat/scene_geom_util.cc +++ b/src/experimental/filament/compat/scene_geom_util.cc @@ -130,7 +130,7 @@ static void PrepareGeomMeshes(mjrRenderable* renderable, const mjvGeom& geom, mjrf_setRenderableSize(renderable, geom.size); break; case mjGEOM_FLEX: - mjrf_setRenderableMesh(renderable, model_objs->GetFlexSkinMesh(geom.objid), 0, 0); + mjrf_setRenderableMesh(renderable, model_objs->GetFlexMesh(geom.objid), 0, 0); // Flexes are defined in global space. std::memset(position, 0, sizeof(position)); std::memset(rotation, 0, sizeof(rotation)); @@ -139,7 +139,7 @@ static void PrepareGeomMeshes(mjrRenderable* renderable, const mjvGeom& geom, rotation[8] = 1.f; break; case mjGEOM_SKIN: - mjrf_setRenderableMesh(renderable, model_objs->GetFlexSkinMesh(geom.objid), 0, 0); + mjrf_setRenderableMesh(renderable, model_objs->GetSkinMesh(geom.objid), 0, 0); // Skins are defined in global space. std::memset(position, 0, sizeof(position)); std::memset(rotation, 0, sizeof(rotation));