From f57dc90669208914f97188acc699a1fb251f8079 Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Sat, 6 Jul 2024 03:50:26 -0700 Subject: [PATCH] Refactor Default class to use pointers instead of indices. This in order to make it easier to append the default tree to another tree. PiperOrigin-RevId: 649812975 Change-Id: I2915ac7e37957e45eadc24d6caaf7beea236bf29 --- src/user/user_api.cc | 4 ++-- src/user/user_composite.cc | 22 +++++++++++----------- src/user/user_flexcomp.cc | 2 +- src/user/user_mesh.cc | 2 +- src/user/user_model.cc | 14 ++++++-------- src/user/user_model.h | 2 +- src/user/user_objects.cc | 28 ++++++++++++++-------------- src/user/user_objects.h | 4 ++-- src/xml/xml_native_writer.cc | 14 +++++++------- 9 files changed, 45 insertions(+), 47 deletions(-) diff --git a/src/user/user_api.cc b/src/user/user_api.cc index dfef94a5..9d3e2907 100644 --- a/src/user/user_api.cc +++ b/src/user/user_api.cc @@ -440,7 +440,7 @@ mjsPlugin* mjs_addPlugin(mjSpec* s) { mjsDefault* mjs_addDefault(mjSpec* s, const char* classname, const mjsDefault* parent) { mjCModel* modelC = static_cast(s->element); mjCDef* parentC = parent ? static_cast(parent->element) : - static_cast(s->element)->Defaults(0); + static_cast(s->element)->Default(); mjCDef* def = modelC->AddDefault(classname, parentC); if (def) { return &def->spec; @@ -480,7 +480,7 @@ mjsDefault* mjs_findDefault(mjSpec* s, const char* classname) { // get default[0] from model mjsDefault* mjs_getSpecDefault(mjSpec* s) { mjCModel* modelC = static_cast(s->element); - mjCDef* def = modelC->Defaults(0); + mjCDef* def = modelC->Default(); if (!def) { return nullptr; } diff --git a/src/user/user_composite.cc b/src/user/user_composite.cc index 891ce675..7c11ff2d 100644 --- a/src/user/user_composite.cc +++ b/src/user/user_composite.cc @@ -560,7 +560,7 @@ bool mjCComposite::MakeParticle(mjCModel* model, mjsBody* body, char* error, int // create tendon mjsTendon* ten = mjs_addTendon(&model->spec, &def[mjCOMPKIND_TENDON].spec); - mjs_setDefault(ten->element, &model->Defaults(0)->spec); + mjs_setDefault(ten->element, &model->Default()->spec); mjs_setString(ten->name, txt0); ten->group = 4; mjs_wrapSite(ten, txt1); @@ -568,7 +568,7 @@ bool mjCComposite::MakeParticle(mjCModel* model, mjsBody* body, char* error, int // add equality constraint mjsEquality* eq = mjs_addEquality(&model->spec, &def[mjCOMPKIND_TENDON].spec); - mjs_setDefault(eq->element, &model->Defaults(0)->spec); + mjs_setDefault(eq->element, &model->Default()->spec); eq->type = mjEQ_TENDON; mjs_setString(eq->name1, mjs_getString(ten->name)); } @@ -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->Defaults(0); + ten->def = model->Default(); mju::sprintf_arr(txt, "%sT%d_%d_%d", prefix.c_str(), i, ix, iy); ten->name = txt; ten->WrapSite(txt1); @@ -682,7 +682,7 @@ bool mjCComposite::MakeGrid(mjCModel* model, mjsBody* body, char* error, int err // add equality constraint mjsEquality* eq = mjs_addEquality(&model->spec, &def[mjCOMPKIND_TENDON].spec); - mjs_setDefault(eq->element, &model->Defaults(0)->spec); + mjs_setDefault(eq->element, &model->Default()->spec); eq->type = mjEQ_TENDON; mjs_setString(eq->name1, ten->name.c_str()); } @@ -1045,7 +1045,7 @@ mjsBody* mjCComposite::AddRopeBody(mjCModel* model, mjsBody* body, int ix, int i // add constraint mjsEquality* eq = mjs_addEquality(&model->spec, &def[mjCOMPKIND_TWIST].spec); - mjs_setDefault(eq->element, &model->Defaults(0)->spec); + mjs_setDefault(eq->element, &model->Default()->spec); eq->type = mjEQ_JOINT; mjs_setString(eq->name1, mjs_getString(jnt->name)); } @@ -1063,7 +1063,7 @@ mjsBody* mjCComposite::AddRopeBody(mjCModel* model, mjsBody* body, int ix, int i // add constraint mjsEquality* eq = mjs_addEquality(&model->spec, &def[mjCOMPKIND_STRETCH].spec); - mjs_setDefault(eq->element, &model->Defaults(0)->spec); + mjs_setDefault(eq->element, &model->Default()->spec); eq->type = mjEQ_JOINT; mjs_setString(eq->name1, mjs_getString(jnt->name)); } @@ -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->Defaults(0); + ten->def = model->Default(); mju::sprintf_arr(txt, "%sT", prefix.c_str()); ten->name = txt; @@ -1185,7 +1185,7 @@ bool mjCComposite::MakeBox(mjCModel* model, mjsBody* body, char* error, int erro // add fix constraint mjsEquality* eq = mjs_addEquality(&model->spec, &def[mjCOMPKIND_JOINT].spec); - mjs_setDefault(eq->element, &model->Defaults(0)->spec); + mjs_setDefault(eq->element, &model->Default()->spec); eq->type = mjEQ_JOINT; mjs_setString(eq->name1, mjs_getString(jnt->name)); @@ -1219,7 +1219,7 @@ bool mjCComposite::MakeBox(mjCModel* model, mjsBody* body, char* error, int erro // finalize fixed tendon mjsEquality* eqt = mjs_addEquality(&model->spec, &def[mjCOMPKIND_TENDON].spec); - mjs_setDefault(eqt->element, &model->Defaults(0)->spec); + mjs_setDefault(eqt->element, &model->Default()->spec); eqt->type = mjEQ_TENDON; mjs_setString(eqt->name1, ten->name.c_str()); @@ -1245,7 +1245,7 @@ void mjCComposite::MakeShear(mjCModel* model) { // create tendon mjCTendon* ten = model->AddTendon(def + mjCOMPKIND_SHEAR); - ten->def = model->Defaults(0); + ten->def = model->Default(); ten->WrapSite(txt1); ten->WrapSite(txt2); @@ -1255,7 +1255,7 @@ void mjCComposite::MakeShear(mjCModel* model) { // equality constraint mjsEquality* eq = mjs_addEquality(&model->spec, &def[mjCOMPKIND_SHEAR].spec); - mjs_setDefault(eq->element, &model->Defaults(0)->spec); + mjs_setDefault(eq->element, &model->Default()->spec); eq->type = mjEQ_TENDON; mjs_setString(eq->name1, txt); } diff --git a/src/user/user_flexcomp.cc b/src/user/user_flexcomp.cc index aad6a8a2..1662fbd8 100644 --- a/src/user/user_flexcomp.cc +++ b/src/user/user_flexcomp.cc @@ -517,7 +517,7 @@ bool mjCFlexcomp::Make(mjSpec* spec, mjsBody* body, char* error, int error_sz) { // create edge equality constraint if (equality) { mjsEquality* pe = mjs_addEquality(&model->spec, &def.spec); - mjs_setDefault(pe->element, &model->Defaults(0)->spec); + mjs_setDefault(pe->element, &model->Default()->spec); pe->type = mjEQ_FLEX; pe->active = true; mjs_setString(pe->name1, name.c_str()); diff --git a/src/user/user_mesh.cc b/src/user/user_mesh.cc index 026cd46e..f1c4f733 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->Defaults(0) : 0)); + def = (_def ? _def : (_model ? _model->Default() : 0)); // in case this body is not compiled CopyFromSpec(); diff --git a/src/user/user_model.cc b/src/user/user_model.cc index c1b1b3ae..3eac695b 100644 --- a/src/user/user_model.cc +++ b/src/user/user_model.cc @@ -807,8 +807,6 @@ mjCDef* mjCModel::FindDefault(string name) { // add default class to array mjCDef* mjCModel::AddDefault(string name, mjCDef* parent) { - int parentid = parent ? parent->id : 0; - // check for repeated name int thisid = (int)defaults_.size(); for (int i=0; iid = thisid; // initialize contents - if (parentid>=0 && parentidCopyFromSpec(); - *def = *defaults_[parentid]; - defaults_[parentid]->childid.push_back(thisid); + if (parent && parent->idCopyFromSpec(); + *def = *parent; + parent->child.push_back(def); } - def->parentid = parentid; + def->parent = parent; def->name = name; - def->childid.clear(); + def->child.clear(); return def; } diff --git a/src/user/user_model.h b/src/user/user_model.h index 06a52b8f..9e6a8366 100644 --- a/src/user/user_model.h +++ b/src/user/user_model.h @@ -223,7 +223,7 @@ class mjCModel : public mjCModel_, private mjSpec { std::string get_meshdir() const { return meshdir_; } std::string get_texturedir() const { return texturedir_; } - mjCDef* Defaults(int i) const { return defaults_[i]; } + mjCDef* Default() const { return defaults_[0]; } int NumDefaults() const { return defaults_.size(); } const std::vector>& ActivePlugins() const { diff --git a/src/user/user_objects.cc b/src/user/user_objects.cc index 1ea9eda7..d9c31a93 100644 --- a/src/user/user_objects.cc +++ b/src/user/user_objects.cc @@ -518,8 +518,8 @@ int mjCBoundingVolumeHierarchy::MakeBVH( mjCDef::mjCDef() { name.clear(); id = 0; - parentid = -1; - childid.clear(); + parent = nullptr; + child.clear(); mjs_defaultJoint(&joint_.spec); mjs_defaultGeom(&geom_.spec); mjs_defaultSite(&site_.spec); @@ -565,8 +565,8 @@ void mjCDef::Compile(const mjCModel* model) { mjCDef& mjCDef::operator=(const mjCDef& other) { if (this != &other) { name = other.name; - parentid = other.parentid; - childid = other.childid; + parent = other.parent; + child = other.child; joint_ = other.joint_; geom_ = other.geom_; site_ = other.site_; @@ -1691,7 +1691,7 @@ mjCJoint::mjCJoint(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Defaults(0) : 0)); + def = (_def ? _def : (_model ? _model->Default() : 0)); classname = def ? def->name : ""; // point to local @@ -1899,7 +1899,7 @@ mjCGeom::mjCGeom(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Defaults(0) : 0)); + def = (_def ? _def : (_model ? _model->Default() : 0)); classname = def ? def->name : ""; // point to local @@ -2542,7 +2542,7 @@ mjCSite::mjCSite(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Defaults(0) : 0)); + def = (_def ? _def : (_model ? _model->Default() : 0)); classname = def ? def->name : ""; } @@ -2688,7 +2688,7 @@ mjCCamera::mjCCamera(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Defaults(0) : 0)); + def = (_def ? _def : (_model ? _model->Default() : 0)); classname = def ? def->name : ""; // point to local @@ -2842,7 +2842,7 @@ mjCLight::mjCLight(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Defaults(0) : 0)); + def = (_def ? _def : (_model ? _model->Default() : 0)); classname = def ? def->name : ""; PointToLocal(); @@ -3887,7 +3887,7 @@ mjCMaterial::mjCMaterial(mjCModel* _model, mjCDef* _def) { } model = _model; - def = (_def ? _def : (_model ? _model->Defaults(0) : 0)); + def = (_def ? _def : (_model ? _model->Default() : 0)); classname = def ? def->name : ""; PointToLocal(); @@ -3974,7 +3974,7 @@ mjCPair::mjCPair(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Defaults(0) : 0)); + def = (_def ? _def : (_model ? _model->Default() : 0)); classname = def ? def->name : ""; // point to local @@ -4335,7 +4335,7 @@ mjCEquality::mjCEquality(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Defaults(0) : 0)); + def = (_def ? _def : (_model ? _model->Default() : 0)); classname = def ? def->name : ""; // point to local @@ -4497,7 +4497,7 @@ mjCTendon::mjCTendon(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Defaults(0) : 0)); + def = (_def ? _def : (_model ? _model->Default() : 0)); classname = def ? def->name : ""; // point to local @@ -4975,7 +4975,7 @@ mjCActuator::mjCActuator(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->Defaults(0) : 0)); + def = (_def ? _def : (_model ? _model->Default() : 0)); classname = def ? def->name : ""; // in case this actuator is not compiled diff --git a/src/user/user_objects.h b/src/user/user_objects.h index e6545e57..03043a94 100644 --- a/src/user/user_objects.h +++ b/src/user/user_objects.h @@ -1635,8 +1635,8 @@ class mjCDef : public mjsElement { // identifiers std::string name; // class name int id; // id of this default - int parentid; // id of parent class - std::vector childid; // ids of child classes + mjCDef* parent; // id of parent class + std::vector child; // child classes mjsDefault spec; diff --git a/src/xml/xml_native_writer.cc b/src/xml/xml_native_writer.cc index 7b3bf798..19c19fcf 100644 --- a/src/xml/xml_native_writer.cc +++ b/src/xml/xml_native_writer.cc @@ -862,7 +862,7 @@ string mjXWriter::Write(char *error, size_t error_sz) { Visual(root); Statistic(root); writingdefaults = true; - Default(root, model->Defaults(0)); + Default(root, model->Default()); writingdefaults = false; Extension(root); Custom(root); @@ -1192,8 +1192,8 @@ void mjXWriter::Default(XMLElement* root, mjCDef* def) { // pointer to parent defaults mjCDef* par; - if (def->parentid>=0) { - par = model->Defaults(def->parentid); + if (def->parent) { + par = def->parent; } else { par = new mjCDef; } @@ -1260,19 +1260,19 @@ void mjXWriter::Default(XMLElement* root, mjCDef* def) { if (!elem->FirstAttribute()) section->DeleteChild(elem); // if top-level class has no members or children, delete it and return - if (def->parentid<0 && section->NoChildren() && def->childid.empty()) { + if (!def->parent && section->NoChildren() && def->child.empty()) { root->DeleteChild(section); delete par; return; } // add children recursively - for (int i=0; i<(int)def->childid.size(); i++) { - Default(section, model->Defaults(def->childid[i])); + for (int i=0; i<(int)def->child.size(); i++) { + Default(section, def->child[i]); } // delete parent defaults if allocated here - if (def->parentid<0) { + if (!def->parent) { delete par; } }