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
This commit is contained in:
Alessio Quaglino
2024-07-06 03:50:26 -07:00
committed by Copybara-Service
parent 9d0812911c
commit f57dc90669
9 changed files with 45 additions and 47 deletions
+2 -2
View File
@@ -440,7 +440,7 @@ mjsPlugin* mjs_addPlugin(mjSpec* s) {
mjsDefault* mjs_addDefault(mjSpec* s, const char* classname, const mjsDefault* parent) {
mjCModel* modelC = static_cast<mjCModel*>(s->element);
mjCDef* parentC = parent ? static_cast<mjCDef*>(parent->element) :
static_cast<mjCModel*>(s->element)->Defaults(0);
static_cast<mjCModel*>(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<mjCModel*>(s->element);
mjCDef* def = modelC->Defaults(0);
mjCDef* def = modelC->Default();
if (!def) {
return nullptr;
}
+11 -11
View File
@@ -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);
}
+1 -1
View File
@@ -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());
+1 -1
View File
@@ -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();
+6 -8
View File
@@ -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; i<thisid; i++) {
@@ -823,14 +821,14 @@ mjCDef* mjCModel::AddDefault(string name, mjCDef* parent) {
def->id = thisid;
// initialize contents
if (parentid>=0 && parentid<thisid) {
defaults_[parentid]->CopyFromSpec();
*def = *defaults_[parentid];
defaults_[parentid]->childid.push_back(thisid);
if (parent && parent->id<thisid) {
parent->CopyFromSpec();
*def = *parent;
parent->child.push_back(def);
}
def->parentid = parentid;
def->parent = parent;
def->name = name;
def->childid.clear();
def->child.clear();
return def;
}
+1 -1
View File
@@ -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<std::pair<const mjpPlugin*, int>>& ActivePlugins() const {
+14 -14
View File
@@ -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
+2 -2
View File
@@ -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<int> childid; // ids of child classes
mjCDef* parent; // id of parent class
std::vector<mjCDef*> child; // child classes
mjsDefault spec;
+7 -7
View File
@@ -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;
}
}