Remove mjCBase::def and use mjCBase::classname instead.

PiperOrigin-RevId: 650629741
Change-Id: I10a9955b99e4a5ff0b5a742e22635ccad1455f1a
This commit is contained in:
Alessio Quaglino
2024-07-09 08:01:38 -07:00
committed by Copybara-Service
parent c5f958bdff
commit e0d33eb1d0
8 changed files with 56 additions and 75 deletions
+4 -2
View File
@@ -460,7 +460,9 @@ mjSpec* mjs_getSpec(mjsBody* body) {
// get default
mjsDefault* mjs_getDefault(mjsElement* element) {
return &(static_cast<mjCBase*>(element)->def->spec);
mjCModel* model = static_cast<mjCBase*>(element)->model;
std::string classname = static_cast<mjCBase*>(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<mjCBase*>(element);
baseC->def = static_cast<mjCDef*>(defspec->element);
baseC->classname = static_cast<mjCDef*>(defspec->element)->name;
}
+3 -3
View File
@@ -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);
+3 -3
View File
@@ -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;
+7 -23
View File
@@ -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<mjNOBJECT; i++) {
ids[i] = other.ids[i];
@@ -179,7 +183,6 @@ void mjCModel::CopyList(std::vector<T*>& 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 <class T>
T* mjCModel::AddObjectDefault(vector<T*>& 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;
}
+3
View File
@@ -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<std::string, mjCDef*> def_map;
private:
// settings for each defaults class
std::vector<mjCDef*> defaults_;
+17 -31
View File
@@ -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<T*>& dst, const std::vector<T*>& 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();
-1
View File
@@ -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
+19 -12
View File
@@ -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; i<num; i++) {
mjCEquality* peq = (mjCEquality*)model->GetObject(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]);
}
}