Store skin and flex meshes separately.

PiperOrigin-RevId: 919490079
Change-Id: I45473ee59e22465732fb4b470a94c2944fed9c37
This commit is contained in:
Haroon Qureshi
2026-05-22 00:07:40 -07:00
committed by Copybara-Service
parent 88b8b58429
commit 3499adacae
3 changed files with 24 additions and 8 deletions
@@ -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;
}
@@ -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<int, UniquePtr<mjrMesh>> meshes_;
std::unordered_map<int, UniquePtr<mjrMesh>> convex_hulls_;
std::unordered_map<int, UniquePtr<mjrMesh>> height_fields_;
std::unordered_map<int, UniquePtr<mjrMesh>> dynamic_meshes_;
std::unordered_map<int, UniquePtr<mjrMesh>> skins_;
std::unordered_map<int, UniquePtr<mjrMesh>> flexes_;
std::unordered_map<int, UniquePtr<mjrTexture>> textures_;
float specular_multiplier_ = 0.2f;
float shininess_multiplier_ = 0.1f;
@@ -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));