Remove mjCBase::def and use mjCBase::classname instead.
PiperOrigin-RevId: 650629741 Change-Id: I10a9955b99e4a5ff0b5a742e22635ccad1455f1a
This commit is contained in:
committed by
Copybara-Service
parent
c5f958bdff
commit
e0d33eb1d0
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user