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:
committed by
Copybara-Service
parent
9d0812911c
commit
f57dc90669
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user