Store skin and flex meshes separately.
PiperOrigin-RevId: 919490079 Change-Id: I45473ee59e22465732fb4b470a94c2944fed9c37
This commit is contained in:
committed by
Copybara-Service
parent
88b8b58429
commit
3499adacae
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user