From e0d33eb1d08c5030adaed8873af1b92e0aee92e7 Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Tue, 9 Jul 2024 08:01:38 -0700 Subject: [PATCH] Remove mjCBase::def and use mjCBase::classname instead. PiperOrigin-RevId: 650629741 Change-Id: I10a9955b99e4a5ff0b5a742e22635ccad1455f1a --- src/user/user_api.cc | 6 +++-- src/user/user_composite.cc | 6 ++--- src/user/user_mesh.cc | 6 ++--- src/user/user_model.cc | 30 ++++++---------------- src/user/user_model.h | 3 +++ src/user/user_objects.cc | 48 +++++++++++++----------------------- src/user/user_objects.h | 1 - src/xml/xml_native_writer.cc | 31 ++++++++++++++--------- 8 files changed, 56 insertions(+), 75 deletions(-) diff --git a/src/user/user_api.cc b/src/user/user_api.cc index 9d3e2907..674e034a 100644 --- a/src/user/user_api.cc +++ b/src/user/user_api.cc @@ -460,7 +460,9 @@ mjSpec* mjs_getSpec(mjsBody* body) { // get default mjsDefault* mjs_getDefault(mjsElement* element) { - return &(static_cast(element)->def->spec); + mjCModel* model = static_cast(element)->model; + std::string classname = static_cast(element)->classname; + return &(model->def_map[classname]->spec); } @@ -569,7 +571,7 @@ int mjs_getId(mjsElement* element) { // set default void mjs_setDefault(mjsElement* element, mjsDefault* defspec) { mjCBase* baseC = static_cast(element); - baseC->def = static_cast(defspec->element); + baseC->classname = static_cast(defspec->element)->name; } diff --git a/src/user/user_composite.cc b/src/user/user_composite.cc index 7c11ff2d..de6742e8 100644 --- a/src/user/user_composite.cc +++ b/src/user/user_composite.cc @@ -674,7 +674,7 @@ bool mjCComposite::MakeGrid(mjCModel* model, mjsBody* body, char* error, int err // create tendon mjCTendon* ten = model->AddTendon(def + mjCOMPKIND_TENDON); - ten->def = model->Default(); + ten->classname = model->Default()->name; mju::sprintf_arr(txt, "%sT%d_%d_%d", prefix.c_str(), i, ix, iy); ten->name = txt; ten->WrapSite(txt1); @@ -1131,7 +1131,7 @@ bool mjCComposite::MakeBox(mjCModel* model, mjsBody* body, char* error, int erro // fixed tendon for all joints mjCTendon* ten = model->AddTendon(def + mjCOMPKIND_TENDON); - ten->def = model->Default(); + ten->classname = model->Default()->name; mju::sprintf_arr(txt, "%sT", prefix.c_str()); ten->name = txt; @@ -1245,7 +1245,7 @@ void mjCComposite::MakeShear(mjCModel* model) { // create tendon mjCTendon* ten = model->AddTendon(def + mjCOMPKIND_SHEAR); - ten->def = model->Default(); + ten->classname = model->Default()->name; ten->WrapSite(txt1); ten->WrapSite(txt2); diff --git a/src/user/user_mesh.cc b/src/user/user_mesh.cc index f1c4f733..8b954612 100644 --- a/src/user/user_mesh.cc +++ b/src/user/user_mesh.cc @@ -149,7 +149,7 @@ mjCMesh::mjCMesh(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Default() : 0)); + classname = (_def ? _def->name : (_model ? "main" : "")); // in case this body is not compiled CopyFromSpec(); @@ -1424,7 +1424,7 @@ void mjCMesh::Process() { // apply formula, accumulate GetVolumeRef(type) += vol; for (int j=0; j<6; j++) { - P[j] += def->Geom().density*vol / + P[j] += model->def_map[classname]->Geom().density*vol / (type==mjINERTIA_SHELL ? 12 : 20) * ( 2*(D[k[j][0]] * D[k[j][1]] + E[k[j][0]] * E[k[j][1]] + @@ -1465,7 +1465,7 @@ void mjCMesh::Process() { } // compute sizes of equivalent inertia box - double mass = GetVolumeRef(type) * def->Geom().density; + double mass = GetVolumeRef(type) * model->def_map[classname]->Geom().density; double* boxsz = GetInertiaBoxPtr(type); boxsz[0] = sqrt(6*(eigval[1]+eigval[2]-eigval[0])/mass)/2; boxsz[1] = sqrt(6*(eigval[0]+eigval[2]-eigval[1])/mass)/2; diff --git a/src/user/user_model.cc b/src/user/user_model.cc index 04ce63a4..ac5773b0 100644 --- a/src/user/user_model.cc +++ b/src/user/user_model.cc @@ -110,7 +110,8 @@ mjCModel::mjCModel() { world->parentid = 0; world->weldid = 0; world->name = "world"; - world->def = defaults_[0]; + world->classname = "main"; + def_map["main"] = Default(); bodies_.push_back(world); // create mjCBase lists from children lists @@ -146,6 +147,9 @@ mjCModel& mjCModel::operator=(const mjCModel& other) { // add everything else *this += other; + // update the default map + def_map["main"] = Default(); + // copy name maps for (int i=0; i& dest, // copy the element from the other model to this model dest.push_back(candidate); dest.back()->model = this; - dest.back()->def = defaults[def_map[candidate->def]]; dest.back()->id = -1; } if (!dest.empty()) { @@ -250,26 +253,6 @@ mjCModel& mjCModel::operator+=(const mjCModel& other) { plugins_ = other.plugins_; active_plugins_ = other.active_plugins_; - // update defaults for the copied objects - for (int i = 1; i < other.bodies_.size(); i++) { - bodies_[i]->def = defaults_[def_map[other.bodies_[i]->def]]; - } - for (int i = 0; i < other.joints_.size(); i++) { - joints_[i]->def = defaults_[def_map[other.joints_[i]->def]]; - } - for (int i = 0; i < other.geoms_.size(); i++) { - geoms_[i]->def = defaults_[def_map[other.geoms_[i]->def]]; - } - for (int i = 0; i < other.sites_.size(); i++) { - sites_[i]->def = defaults_[def_map[other.sites_[i]->def]]; - } - for (int i = 0; i < other.cameras_.size(); i++) { - cameras_[i]->def = defaults_[def_map[other.cameras_[i]->def]]; - } - for (int i = 0; i < other.lights_.size(); i++) { - lights_[i]->def= defaults_[def_map[other.lights_[i]->def]]; - } - // restore to the original state if (!compiled) { resetlist(bodies_); @@ -573,7 +556,7 @@ template T* mjCModel::AddObjectDefault(vector& list, string type, mjCDef* def) { T* obj = new T(this, def ? def : defaults_[0]); obj->id = (int)list.size(); - obj->def = def ? def : defaults_[0]; + obj->classname = def ? def->name : "main"; list.push_back(obj); return obj; } @@ -829,6 +812,7 @@ mjCDef* mjCModel::AddDefault(string name, mjCDef* parent) { def->parent = parent; def->name = name; def->child.clear(); + def_map[name] = def; return def; } diff --git a/src/user/user_model.h b/src/user/user_model.h index 9e6a8366..260913b1 100644 --- a/src/user/user_model.h +++ b/src/user/user_model.h @@ -269,6 +269,9 @@ class mjCModel : public mjCModel_, private mjSpec { void SaveState(const mjData* d); void RestoreState(const mjModel* m, mjData** dest); + // map from default class name to default class pointer + std::map def_map; + private: // settings for each defaults class std::vector defaults_; diff --git a/src/user/user_objects.cc b/src/user/user_objects.cc index d9c31a93..034aafbd 100644 --- a/src/user/user_objects.cc +++ b/src/user/user_objects.cc @@ -643,7 +643,6 @@ mjCBase::mjCBase() { id = -1; info = ""; model = 0; - def = 0; frame = nullptr; } @@ -774,9 +773,6 @@ mjCBody& mjCBody::operator=(const mjCBody& other) { lights.clear(); id = other.id; - // copy defaults - def = other.def; - // add elements to lists *this += other; } @@ -884,7 +880,7 @@ void mjCBody::CopyList(std::vector& dst, const std::vector& src, dst.back()->body = this; dst.back()->model = model; dst.back()->id = -1; - dst.back()->def = src[i]->def; + dst.back()->classname = src[i]->classname; // assign dst frame to src frame dst.back()->frame = src[i]->frame ? frames[fmap[src[i]->frame]] : nullptr; @@ -1007,7 +1003,7 @@ mjCBody* mjCBody::AddBody(mjCDef* _def) { mjCBody* obj = new mjCBody(model); // handle def recursion (i.e. childclass) - obj->def = _def ? _def : def; + obj->classname = _def ? _def->name : classname; bodies.push_back(obj); return obj; @@ -1042,7 +1038,7 @@ mjCJoint* mjCBody::AddFreeJoint() { // create new joint and add it to body mjCJoint* mjCBody::AddJoint(mjCDef* _def) { // create joint - mjCJoint* obj = new mjCJoint(model, _def ? _def : def); + mjCJoint* obj = new mjCJoint(model, _def ? _def : model->def_map[classname]); // set body pointer, add obj->body = this; @@ -1056,7 +1052,7 @@ mjCJoint* mjCBody::AddJoint(mjCDef* _def) { // create new geom and add it to body mjCGeom* mjCBody::AddGeom(mjCDef* _def) { // create geom - mjCGeom* obj = new mjCGeom(model, _def ? _def : def); + mjCGeom* obj = new mjCGeom(model, _def ? _def : model->def_map[classname]); // set body pointer, add obj->body = this; @@ -1070,7 +1066,7 @@ mjCGeom* mjCBody::AddGeom(mjCDef* _def) { // create new site and add it to body mjCSite* mjCBody::AddSite(mjCDef* _def) { // create site - mjCSite* obj = new mjCSite(model, _def ? _def : def); + mjCSite* obj = new mjCSite(model, _def ? _def : model->def_map[classname]); // set body pointer, add obj->body = this; @@ -1084,7 +1080,7 @@ mjCSite* mjCBody::AddSite(mjCDef* _def) { // create new camera and add it to body mjCCamera* mjCBody::AddCamera(mjCDef* _def) { // create camera - mjCCamera* obj = new mjCCamera(model, _def ? _def : def); + mjCCamera* obj = new mjCCamera(model, _def ? _def : model->def_map[classname]); // set body pointer, add obj->body = this; @@ -1098,7 +1094,7 @@ mjCCamera* mjCBody::AddCamera(mjCDef* _def) { // create new light and add it to body mjCLight* mjCBody::AddLight(mjCDef* _def) { // create light - mjCLight* obj = new mjCLight(model, _def ? _def : def); + mjCLight* obj = new mjCLight(model, _def ? _def : model->def_map[classname]); // set body pointer, add obj->body = this; @@ -1691,8 +1687,7 @@ mjCJoint::mjCJoint(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Default() : 0)); - classname = def ? def->name : ""; + classname = _def ? _def->name : "main"; // point to local PointToLocal(); @@ -1899,8 +1894,7 @@ mjCGeom::mjCGeom(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Default() : 0)); - classname = def ? def->name : ""; + classname = _def ? _def->name : "main"; // point to local PointToLocal(); @@ -2542,8 +2536,7 @@ mjCSite::mjCSite(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Default() : 0)); - classname = def ? def->name : ""; + classname = _def ? _def->name : "main"; } @@ -2688,8 +2681,7 @@ mjCCamera::mjCCamera(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Default() : 0)); - classname = def ? def->name : ""; + classname = _def ? _def->name : "main"; // point to local PointToLocal(); @@ -2842,8 +2834,7 @@ mjCLight::mjCLight(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Default() : 0)); - classname = def ? def->name : ""; + classname = _def ? _def->name : "main"; PointToLocal(); CopyFromSpec(); @@ -3887,8 +3878,7 @@ mjCMaterial::mjCMaterial(mjCModel* _model, mjCDef* _def) { } model = _model; - def = (_def ? _def : (_model ? _model->Default() : 0)); - classname = def ? def->name : ""; + classname = _def ? _def->name : "main"; PointToLocal(); @@ -3974,8 +3964,7 @@ mjCPair::mjCPair(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Default() : 0)); - classname = def ? def->name : ""; + classname = _def ? _def->name : "main"; // point to local PointToLocal(); @@ -4335,8 +4324,7 @@ mjCEquality::mjCEquality(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Default() : 0)); - classname = def ? def->name : ""; + classname = _def ? _def->name : "main"; // point to local PointToLocal(); @@ -4497,8 +4485,7 @@ mjCTendon::mjCTendon(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Default() : 0)); - classname = def ? def->name : ""; + classname = _def ? _def->name : "main"; // point to local PointToLocal(); @@ -4975,8 +4962,7 @@ mjCActuator::mjCActuator(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Default() : 0)); - classname = def ? def->name : ""; + classname = _def ? _def->name : "main"; // in case this actuator is not compiled CopyFromSpec(); diff --git a/src/user/user_objects.h b/src/user/user_objects.h index 03043a94..4e2c99e3 100644 --- a/src/user/user_objects.h +++ b/src/user/user_objects.h @@ -202,7 +202,6 @@ class mjCBase : public mjCBase_ { // Copy assignment mjCBase& operator=(const mjCBase& other); - mjCDef* def; // defaults class used to init this object mjCFrame* frame; // pointer to frame transformation mjCModel* model; // pointer to model that created object diff --git a/src/xml/xml_native_writer.cc b/src/xml/xml_native_writer.cc index 19c19fcf..d826e08d 100644 --- a/src/xml/xml_native_writer.cc +++ b/src/xml/xml_native_writer.cc @@ -1472,7 +1472,7 @@ void mjXWriter::Asset(XMLElement* root) { // create element and write mjCMaterial* pmat = (mjCMaterial*)model->GetObject(mjOBJ_MATERIAL, i); elem = InsertEnd(section, "material"); - OneMaterial(elem, pmat, pmat->def); + OneMaterial(elem, pmat, model->def_map[pmat->classname]); } // write meshes @@ -1485,7 +1485,7 @@ void mjXWriter::Asset(XMLElement* root) { OnePlugin(InsertEnd(elem, "plugin"), &pmesh->plugin); } else{ elem = InsertEnd(section, "mesh"); - OneMesh(elem, pmesh, pmesh->def); + OneMesh(elem, pmesh, model->def_map[pmesh->classname]); } } @@ -1543,7 +1543,9 @@ void mjXWriter::Body(XMLElement* elem, mjCBody* body, std::string_view childclas // write body attributes and inertial else if (body!=model->GetWorld()) { WriteAttrTxt(elem, "name", body->name); - WriteAttrTxt(elem, "childclass", body->classname); + if (childclass != body->classname && body->classname != "main") { + WriteAttrTxt(elem, "childclass", body->classname); + } // write pos if it's not {0, 0, 0} if (body->pos[0] || body->pos[1] || body->pos[2]) { @@ -1578,7 +1580,8 @@ void mjXWriter::Body(XMLElement* elem, mjCBody* body, std::string_view childclas std::string classname = body->joints[i]->frame && !body->joints[i]->frame->classname.empty() ? body->joints[i]->frame->classname : body->classname; - OneJoint(InsertEnd(celem, "joint"), body->joints[i], body->joints[i]->def, + OneJoint(InsertEnd(celem, "joint"), body->joints[i], + model->def_map[body->joints[i]->classname], classname.empty() ? childclass : classname); } @@ -1588,7 +1591,8 @@ void mjXWriter::Body(XMLElement* elem, mjCBody* body, std::string_view childclas std::string classname = body->geoms[i]->frame && !body->geoms[i]->frame->classname.empty() ? body->geoms[i]->frame->classname : body->classname; - OneGeom(InsertEnd(celem, "geom"), body->geoms[i], body->geoms[i]->def, + OneGeom(InsertEnd(celem, "geom"), body->geoms[i], + model->def_map[body->geoms[i]->classname], classname.empty() ? childclass : classname); } @@ -1598,7 +1602,8 @@ void mjXWriter::Body(XMLElement* elem, mjCBody* body, std::string_view childclas std::string classname = body->sites[i]->frame && !body->sites[i]->frame->classname.empty() ? body->sites[i]->frame->classname : body->classname; - OneSite(InsertEnd(celem, "site"), body->sites[i], body->sites[i]->def, + OneSite(InsertEnd(celem, "site"), body->sites[i], + model->def_map[body->sites[i]->classname], classname.empty() ? childclass : classname); } @@ -1608,7 +1613,8 @@ void mjXWriter::Body(XMLElement* elem, mjCBody* body, std::string_view childclas std::string classname = body->cameras[i]->frame && !body->cameras[i]->frame->classname.empty() ? body->cameras[i]->frame->classname : body->classname; - OneCamera(InsertEnd(celem, "camera"), body->cameras[i], body->cameras[i]->def, + OneCamera(InsertEnd(celem, "camera"), body->cameras[i], + model->def_map[body->cameras[i]->classname], classname.empty() ? childclass : classname); } @@ -1618,7 +1624,8 @@ void mjXWriter::Body(XMLElement* elem, mjCBody* body, std::string_view childclas std::string classname = body->lights[i]->frame && !body->lights[i]->frame->classname.empty() ? body->lights[i]->frame->classname : body->classname; - OneLight(InsertEnd(celem, "light"), body->lights[i], body->lights[i]->def, + OneLight(InsertEnd(celem, "light"), body->lights[i], + model->def_map[body->lights[i]->classname], classname.empty() ? childclass : classname); } @@ -1660,7 +1667,7 @@ void mjXWriter::Contact(XMLElement* root) { // create element and write mjCPair* ppair = (mjCPair*)model->GetObject(mjOBJ_PAIR, i); elem = InsertEnd(section, "pair"); - OnePair(elem, ppair, ppair->def); + OnePair(elem, ppair, model->def_map[ppair->classname]); } // write all exclude pairs @@ -1693,7 +1700,7 @@ void mjXWriter::Equality(XMLElement* root) { for (int i=0; iGetObject(mjOBJ_EQUALITY, i); XMLElement* elem = InsertEnd(section, FindValue(equality_map, equality_sz, peq->type).c_str()); - OneEquality(elem, peq, peq->def); + OneEquality(elem, peq, model->def_map[peq->classname]); } } @@ -1754,7 +1761,7 @@ void mjXWriter::Tendon(XMLElement* root) { } XMLElement* elem = InsertEnd(section, pten->GetWrap(0)->type==mjWRAP_JOINT ? "fixed" : "spatial"); - OneTendon(elem, pten, pten->def); + OneTendon(elem, pten, model->def_map[pten->classname]); // write wraps XMLElement* wrap; @@ -1815,7 +1822,7 @@ void mjXWriter::Actuator(XMLElement* root) { } else { elem = InsertEnd(section, "general"); } - OneActuator(elem, pact, pact->def); + OneActuator(elem, pact, model->def_map[pact->classname]); } }