From 13bf9ae6bd8f3d6d2091075622e34954bd1412db Mon Sep 17 00:00:00 2001 From: Kyle Bayes Date: Wed, 8 May 2024 05:01:13 -0700 Subject: [PATCH] Encapsulate mjCModel internal lists. PiperOrigin-RevId: 631760335 Change-Id: I9b67f6ed2e65a01877de15a92a04a1b31a6b3ff4 --- src/user/user_api.cc | 10 +- src/user/user_composite.cc | 22 +- src/user/user_flexcomp.cc | 2 +- src/user/user_mesh.cc | 10 +- src/user/user_model.cc | 1194 ++++++++++++++++------------------ src/user/user_model.h | 140 ++-- src/user/user_objects.cc | 30 +- src/user/user_objects.h | 198 +++--- src/xml/xml_native_writer.cc | 24 +- 9 files changed, 809 insertions(+), 821 deletions(-) diff --git a/src/user/user_api.cc b/src/user/user_api.cc index 158e35f1..7fd88e36 100644 --- a/src/user/user_api.cc +++ b/src/user/user_api.cc @@ -429,8 +429,8 @@ mjsPlugin* mjs_addPlugin(mjSpec* s) { // add default to model mjsDefault* mjs_addDefault(mjSpec* s, const char* classname, int parentid, int* id) { mjCModel* modelC = static_cast(s->element); - *id = (int)modelC->defaults.size(); - mjCDef* def = modelC->AddDef(classname, parentid); + *id = (int)modelC->Defaults().size(); + mjCDef* def = modelC->AddDefault(classname, parentid); if (def) { return &def->spec; } else { @@ -457,7 +457,7 @@ mjsDefault* mjs_getDefault(mjElement* element) { // Find default with given name in model. mjsDefault* mjs_findDefault(mjSpec* s, const char* classname) { mjCModel* modelC = static_cast(s->element); - mjCDef* cdef = modelC->FindDef(classname); + mjCDef* cdef = modelC->FindDefault(classname); if (!cdef) { return nullptr; } @@ -469,7 +469,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->Defaults()[0]; if (!def) { return nullptr; } @@ -677,7 +677,7 @@ void mjs_setActivePlugins(mjSpec* s, void* activeplugins) { mjCModel* modelC = static_cast(s->element); std::vector>* active_plugins = reinterpret_cast>*>(activeplugins); - modelC->active_plugins = std::move(*active_plugins); + modelC->SetActivePlugins(std::move(*active_plugins)); } diff --git a/src/user/user_composite.cc b/src/user/user_composite.cc index 21c3cb6d..01bbcf20 100644 --- a/src/user/user_composite.cc +++ b/src/user/user_composite.cc @@ -561,7 +561,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->Defaults()[0]->spec); mjs_setString(ten->name, txt0); ten->group = 4; mjs_wrapSite(ten, txt1); @@ -569,7 +569,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->Defaults()[0]->spec); eq->type = mjEQ_TENDON; mjs_setString(eq->name1, mjs_getString(ten->name)); } @@ -675,7 +675,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->Defaults()[0]; mju::sprintf_arr(txt, "%sT%d_%d_%d", prefix.c_str(), i, ix, iy); ten->name = txt; ten->WrapSite(txt1); @@ -683,7 +683,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->Defaults()[0]->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->Defaults()[0]->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->Defaults()[0]->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->Defaults()[0]; mju::sprintf_arr(txt, "%sT", prefix.c_str()); ten->name = txt; @@ -1184,7 +1184,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->Defaults()[0]->spec); eq->type = mjEQ_JOINT; mjs_setString(eq->name1, mjs_getString(jnt->name)); @@ -1218,7 +1218,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->Defaults()[0]->spec); eqt->type = mjEQ_TENDON; mjs_setString(eqt->name1, ten->name.c_str()); @@ -1244,7 +1244,7 @@ void mjCComposite::MakeShear(mjCModel* model) { // create tendon mjCTendon* ten = model->AddTendon(def + mjCOMPKIND_SHEAR); - ten->def = model->defaults[0]; + ten->def = model->Defaults()[0]; ten->WrapSite(txt1); ten->WrapSite(txt2); @@ -1254,7 +1254,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->Defaults()[0]->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 9d8bc0ca..bd5b9e53 100644 --- a/src/user/user_flexcomp.cc +++ b/src/user/user_flexcomp.cc @@ -521,7 +521,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->Defaults()[0]->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 d7cb49c7..c61bbdba 100644 --- a/src/user/user_mesh.cc +++ b/src/user/user_mesh.cc @@ -151,7 +151,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->Defaults()[0] : 0)); // in case this body is not compiled CopyFromSpec(); @@ -2560,12 +2560,12 @@ void mjCFlex::Compile(const mjVFS* vfs) { for (int i=0; i < nvert; i++) { // get body id, set vertxpos = body.xpos0 int b = rigid ? vertbodyid[0] : vertbodyid[i]; - mju_copy3(vertxpos.data()+3*i, model->bodies[b]->xpos0); + mju_copy3(vertxpos.data()+3*i, model->Bodies()[b]->xpos0); // add vertex offset within body if not centered if (!centered) { mjtNum offset[3]; - mju_rotVecQuat(offset, vert_.data()+3*i, model->bodies[b]->xquat0); + mju_rotVecQuat(offset, vert_.data()+3*i, model->Bodies()[b]->xquat0); mju_addTo3(vertxpos.data()+3*i, offset); } } @@ -2631,9 +2631,9 @@ void mjCFlex::Compile(const mjVFS* vfs) { mjXUtil::Vector2String(useredge, edgeidx); for (const auto& vbodyid : vertbodyid) { - if (model->bodies[vbodyid]->plugin.instance) { + if (model->Bodies()[vbodyid]->plugin.instance) { mjCPlugin* plugin_instance = - static_cast(model->bodies[vbodyid]->plugin.instance); + static_cast(model->Bodies()[vbodyid]->plugin.instance); plugin_instance->config_attribs["face"] = userface; plugin_instance->config_attribs["edge"] = useredge; } diff --git a/src/user/user_model.cc b/src/user/user_model.cc index cf525376..2a2e29ac 100644 --- a/src/user/user_model.cc +++ b/src/user/user_model.cc @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -102,33 +101,12 @@ mjCModel::mjCModel() { #endif nplugin = 0; - //------------------------ private variables - cameras.clear(); - lights.clear(); - flexes.clear(); - meshes.clear(); - skins.clear(); - hfields.clear(); - textures.clear(); - materials.clear(); - pairs.clear(); - excludes.clear(); - equalities.clear(); - tendons.clear(); - actuators.clear(); - numerics.clear(); - texts.clear(); - tuples.clear(); - keys.clear(); - defaults.clear(); - prefix = ""; - suffix = ""; Clear(); //------------------------ master default set - defaults.push_back(new mjCDef); + defaults_.push_back(new mjCDef); - //------------------------ world body + // world body mjCBody* world = new mjCBody(this); mjuu_zerovec(world->pos, 3); mjuu_setvec(world->quat, 1, 0, 0, 0); @@ -138,8 +116,8 @@ mjCModel::mjCModel() { world->parentid = 0; world->weldid = 0; world->name = "world"; - world->def = defaults[0]; - bodies.push_back(world); + world->def = defaults_[0]; + bodies_.push_back(world); // create mjCBase lists from children lists CreateObjectLists(); @@ -167,8 +145,8 @@ mjCModel& mjCModel::operator=(const mjCModel& other) { *static_cast(this) = static_cast(other); // the world copy constructor takes care of copying the tree - mjCBody* world = new mjCBody(*other.bodies[0], this); - bodies.push_back(world); + mjCBody* world = new mjCBody(*other.bodies_[0], this); + bodies_.push_back(world); // add everything else *this += other; @@ -228,75 +206,76 @@ static void resetlist(std::vector& list) { mjCModel& mjCModel::operator+=(const mjCModel& other) { // create global lists - MakeLists(bodies[0]); + MakeLists(bodies_[0]); CreateObjectLists(); ProcessLists(/*checkrepeat=*/false); // copy all elements not in the tree std::map def_map; - int ndefaults = (int)other.defaults.size(); + int ndefaults = (int)other.defaults_.size(); for (int i = 0; i < ndefaults; i++) { if (this != &other) { - defaults.push_back(new mjCDef(*other.defaults[i])); + defaults_.push_back(new mjCDef(*other.defaults_[i])); } - def_map[other.defaults[i]] = i; + def_map[other.defaults_[i]] = i; } + if (this != &other) { // do not copy assets for self-attach - CopyList(meshes, other.meshes, def_map, defaults); - CopyList(skins, other.skins, def_map, defaults); - CopyList(hfields, other.hfields, def_map, defaults); - CopyList(textures, other.textures, def_map, defaults); - CopyList(materials, other.materials, def_map, defaults); - CopyList(keys, other.keys, def_map, defaults); + CopyList(meshes_, other.meshes_, def_map, defaults_); + CopyList(skins_, other.skins_, def_map, defaults_); + CopyList(hfields_, other.hfields_, def_map, defaults_); + CopyList(textures_, other.textures_, def_map, defaults_); + CopyList(materials_, other.materials_, def_map, defaults_); + CopyList(keys_, other.keys_, def_map, defaults_); } - CopyList(flexes, other.flexes, def_map, defaults); - CopyList(pairs, other.pairs, def_map, defaults); - CopyList(excludes, other.excludes, def_map, defaults); - CopyList(tendons, other.tendons, def_map, defaults); - CopyList(equalities, other.equalities, def_map, defaults); - CopyList(actuators, other.actuators, def_map, defaults); - CopyList(sensors, other.sensors, def_map, defaults); - CopyList(numerics, other.numerics, def_map, defaults); - CopyList(texts, other.texts, def_map, defaults); - CopyList(tuples, other.tuples, def_map, defaults); + CopyList(flexes_, other.flexes_, def_map, defaults_); + CopyList(pairs_, other.pairs_, def_map, defaults_); + CopyList(excludes_, other.excludes_, def_map, defaults_); + CopyList(tendons_, other.tendons_, def_map, defaults_); + CopyList(equalities_, other.equalities_, def_map, defaults_); + CopyList(actuators_, other.actuators_, def_map, defaults_); + CopyList(sensors_, other.sensors_, def_map, defaults_); + CopyList(numerics_, other.numerics_, def_map, defaults_); + CopyList(texts_, other.texts_, def_map, defaults_); + CopyList(tuples_, other.tuples_, def_map, defaults_); // plugins are global - plugins = other.plugins; - active_plugins = other.active_plugins; + 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 = 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.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.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.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.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]]; + for (int i = 0; i < other.lights_.size(); i++) { + lights_[i]->def= defaults_[def_map[other.lights_[i]->def]]; } // restore to the same state as other if (!compiled) { - mjCBody* world = bodies[0]; - resetlist(bodies); - resetlist(joints); - resetlist(geoms); - resetlist(sites); - resetlist(cameras); - resetlist(lights); - resetlist(frames); + mjCBody *world = bodies_[0]; + resetlist(bodies_); + resetlist(joints_); + resetlist(geoms_); + resetlist(sites_); + resetlist(cameras_); + resetlist(lights_); + resetlist(frames_); world->id = 0; - bodies.push_back(world); + bodies_.push_back(world); } PointToLocal(); @@ -338,38 +317,38 @@ void mjCModel::RemoveFromList(std::vector& list, const mjCModel& other) { mjCModel& mjCModel::operator-=(const mjCBody& subtree) { mjCModel oldmodel(*this); - oldmodel.MakeLists(oldmodel.bodies[0]); + oldmodel.MakeLists(oldmodel.bodies_[0]); oldmodel.CreateObjectLists(); oldmodel.ProcessLists(/*checkrepeat=*/false); // remove body from tree - *bodies[0] -= subtree; + *bodies_[0] -= subtree; // create global lists - MakeLists(bodies[0]); + MakeLists(bodies_[0]); CreateObjectLists(); ProcessLists(/*checkrepeat=*/false); // check if we have to remove anything else - RemoveFromList(pairs, oldmodel); - RemoveFromList(excludes, oldmodel); - RemoveFromList(tendons, oldmodel); - RemoveFromList(equalities, oldmodel); - RemoveFromList(actuators, oldmodel); - RemoveFromList(sensors, oldmodel); + RemoveFromList(pairs_, oldmodel); + RemoveFromList(excludes_, oldmodel); + RemoveFromList(tendons_, oldmodel); + RemoveFromList(equalities_, oldmodel); + RemoveFromList(actuators_, oldmodel); + RemoveFromList(sensors_, oldmodel); // restore to the same state as before call if (!compiled) { - mjCBody* world = bodies[0]; - resetlist(bodies); - resetlist(joints); - resetlist(geoms); - resetlist(sites); - resetlist(cameras); - resetlist(lights); - resetlist(frames); + mjCBody* world = bodies_[0]; + resetlist(bodies_); + resetlist(joints_); + resetlist(geoms_); + resetlist(sites_); + resetlist(cameras_); + resetlist(lights_); + resetlist(frames_); world->id = 0; - bodies.push_back(world); + bodies_.push_back(world); } PointToLocal(); @@ -381,33 +360,33 @@ mjCModel& mjCModel::operator-=(const mjCBody& subtree) { // TODO: we should not use C-type casting with multiple C++ inheritance void mjCModel::CreateObjectLists() { for (int i = 0; i < mjNOBJECT; ++i) { - object_lists[i] = nullptr; + object_lists_[i] = nullptr; } - object_lists[mjOBJ_BODY] = (std::vector*) &bodies; - object_lists[mjOBJ_XBODY] = (std::vector*) &bodies; - object_lists[mjOBJ_JOINT] = (std::vector*) &joints; - object_lists[mjOBJ_GEOM] = (std::vector*) &geoms; - object_lists[mjOBJ_SITE] = (std::vector*) &sites; - object_lists[mjOBJ_CAMERA] = (std::vector*) &cameras; - object_lists[mjOBJ_LIGHT] = (std::vector*) &lights; - object_lists[mjOBJ_FLEX] = (std::vector*) &flexes; - object_lists[mjOBJ_MESH] = (std::vector*) &meshes; - object_lists[mjOBJ_SKIN] = (std::vector*) &skins; - object_lists[mjOBJ_HFIELD] = (std::vector*) &hfields; - object_lists[mjOBJ_TEXTURE] = (std::vector*) &textures; - object_lists[mjOBJ_MATERIAL] = (std::vector*) &materials; - object_lists[mjOBJ_PAIR] = (std::vector*) &pairs; - object_lists[mjOBJ_EXCLUDE] = (std::vector*) &excludes; - object_lists[mjOBJ_EQUALITY] = (std::vector*) &equalities; - object_lists[mjOBJ_TENDON] = (std::vector*) &tendons; - object_lists[mjOBJ_ACTUATOR] = (std::vector*) &actuators; - object_lists[mjOBJ_SENSOR] = (std::vector*) &sensors; - object_lists[mjOBJ_NUMERIC] = (std::vector*) &numerics; - object_lists[mjOBJ_TEXT] = (std::vector*) &texts; - object_lists[mjOBJ_TUPLE] = (std::vector*) &tuples; - object_lists[mjOBJ_KEY] = (std::vector*) &keys; - object_lists[mjOBJ_PLUGIN] = (std::vector*) &plugins; + object_lists_[mjOBJ_BODY] = (std::vector*) &bodies_; + object_lists_[mjOBJ_XBODY] = (std::vector*) &bodies_; + object_lists_[mjOBJ_JOINT] = (std::vector*) &joints_; + object_lists_[mjOBJ_GEOM] = (std::vector*) &geoms_; + object_lists_[mjOBJ_SITE] = (std::vector*) &sites_; + object_lists_[mjOBJ_CAMERA] = (std::vector*) &cameras_; + object_lists_[mjOBJ_LIGHT] = (std::vector*) &lights_; + object_lists_[mjOBJ_FLEX] = (std::vector*) &flexes_; + object_lists_[mjOBJ_MESH] = (std::vector*) &meshes_; + object_lists_[mjOBJ_SKIN] = (std::vector*) &skins_; + object_lists_[mjOBJ_HFIELD] = (std::vector*) &hfields_; + object_lists_[mjOBJ_TEXTURE] = (std::vector*) &textures_; + object_lists_[mjOBJ_MATERIAL] = (std::vector*) &materials_; + object_lists_[mjOBJ_PAIR] = (std::vector*) &pairs_; + object_lists_[mjOBJ_EXCLUDE] = (std::vector*) &excludes_; + object_lists_[mjOBJ_EQUALITY] = (std::vector*) &equalities_; + object_lists_[mjOBJ_TENDON] = (std::vector*) &tendons_; + object_lists_[mjOBJ_ACTUATOR] = (std::vector*) &actuators_; + object_lists_[mjOBJ_SENSOR] = (std::vector*) &sensors_; + object_lists_[mjOBJ_NUMERIC] = (std::vector*) &numerics_; + object_lists_[mjOBJ_TEXT] = (std::vector*) &texts_; + object_lists_[mjOBJ_TUPLE] = (std::vector*) &tuples_; + object_lists_[mjOBJ_KEY] = (std::vector*) &keys_; + object_lists_[mjOBJ_PLUGIN] = (std::vector*) &plugins_; } @@ -442,51 +421,31 @@ void mjCModel::CopyFromSpec() { // destructor mjCModel::~mjCModel() { // delete kinematic tree and all objects allocated in it - delete bodies[0]; + delete bodies_[0]; // delete objects allocated in mjCModel - for (int i=0; i& list, string type) { } -// add object of any type, with def parameter +// add object of any type, with default parameter template -T* mjCModel::AddObjectDef(vector& list, string type, mjCDef* def) { - T* obj = new T(this, def ? def : defaults[0]); +T* mjCModel::AddObjectDefault(vector& 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->def = def ? def : defaults_[0]; list.push_back(obj); return obj; } // add flex -mjCFlex* mjCModel::AddFlex(void) { - return AddObject(flexes, "flex"); +mjCFlex* mjCModel::AddFlex() { + return AddObject(flexes_, "flex"); } // add mesh mjCMesh* mjCModel::AddMesh(mjCDef* def) { - return AddObjectDef(meshes, "mesh", def); + return AddObjectDefault(meshes_, "mesh", def); } // add skin -mjCSkin* mjCModel::AddSkin(void) { - return AddObject(skins, "skin"); +mjCSkin* mjCModel::AddSkin() { + return AddObject(skins_, "skin"); } // add hfield -mjCHField* mjCModel::AddHField(void) { - return AddObject(hfields, "hfield"); +mjCHField* mjCModel::AddHField() { + return AddObject(hfields_, "hfield"); } // add texture -mjCTexture* mjCModel::AddTexture(void) { - return AddObject(textures, "texture"); +mjCTexture* mjCModel::AddTexture() { + return AddObject(textures_, "texture"); } // add material mjCMaterial* mjCModel::AddMaterial(mjCDef* def) { - return AddObjectDef(materials, "material", def); + return AddObjectDefault(materials_, "material", def); } // add geom pair to include in collisions mjCPair* mjCModel::AddPair(mjCDef* def) { - return AddObjectDef(pairs, "pair", def); + return AddObjectDefault(pairs_, "pair", def); } // add body pair to exclude from collisions -mjCBodyPair* mjCModel::AddExclude(void) { - return AddObject(excludes, "exclude"); +mjCBodyPair* mjCModel::AddExclude() { + return AddObject(excludes_, "exclude"); } // add constraint mjCEquality* mjCModel::AddEquality(mjCDef* def) { - return AddObjectDef(equalities, "equality", def); + return AddObjectDefault(equalities_, "equality", def); } // add tendon mjCTendon* mjCModel::AddTendon(mjCDef* def) { - return AddObjectDef(tendons, "tendon", def); + return AddObjectDefault(tendons_, "tendon", def); } // add actuator mjCActuator* mjCModel::AddActuator(mjCDef* def) { - return AddObjectDef(actuators, "actuator", def); + return AddObjectDefault(actuators_, "actuator", def); } // add sensor -mjCSensor* mjCModel::AddSensor(void) { - return AddObject(sensors, "sensor"); +mjCSensor* mjCModel::AddSensor() { + return AddObject(sensors_, "sensor"); } // add custom -mjCNumeric* mjCModel::AddNumeric(void) { - return AddObject(numerics, "numeric"); +mjCNumeric* mjCModel::AddNumeric() { + return AddObject(numerics_, "numeric"); } // add text -mjCText* mjCModel::AddText(void) { - return AddObject(texts, "text"); +mjCText* mjCModel::AddText() { + return AddObject(texts_, "text"); } // add tuple -mjCTuple* mjCModel::AddTuple(void) { - return AddObject(tuples, "tuple"); +mjCTuple* mjCModel::AddTuple() { + return AddObject(tuples_, "tuple"); } // add keyframe -mjCKey* mjCModel::AddKey(void) { - return AddObject(keys, "key"); +mjCKey* mjCModel::AddKey() { + return AddObject(keys_, "key"); } // add plugin instance -mjCPlugin* mjCModel::AddPlugin(void) { - return AddObject(plugins, "plugin"); +mjCPlugin* mjCModel::AddPlugin() { + return AddObject(plugins_, "plugin"); } @@ -710,10 +669,10 @@ mjCPlugin* mjCModel::AddPlugin(void) { // get number of objects of specified type int mjCModel::NumObjects(mjtObj type) { - if (!object_lists[type]) { + if (!object_lists_[type]) { return 0; } - return (int) object_lists[type]->size(); + return (int) object_lists_[type]->size(); } @@ -723,7 +682,7 @@ mjCBase* mjCModel::GetObject(mjtObj type, int id) { if (id < 0 || id >= NumObjects(type)) { return nullptr; } - return (*object_lists[type])[id]; + return (*object_lists_[type])[id]; } @@ -731,58 +690,57 @@ mjCBase* mjCModel::GetObject(mjtObj type, int id) { //------------------------ API FOR ACCESS TO PRIVATE VARIABLES ------------------------------------- // compiled flag -bool mjCModel::IsCompiled(void) const { +bool mjCModel::IsCompiled() const { return compiled; } // get reference of error object -const mjCError& mjCModel::GetError(void) const { +const mjCError& mjCModel::GetError() const { return errInfo; } // pointer to world body -mjCBody* mjCModel::GetWorld(void) const { - return bodies[0]; +mjCBody* mjCModel::GetWorld() { + return bodies_[0]; } // find default class name in array -mjCDef* mjCModel::FindDef(string name) const { - for (int i=0; i<(int)defaults.size(); i++) { - if (defaults[i]->name==name) { - return defaults[i]; +mjCDef* mjCModel::FindDefault(string name) { + for (int i=0; i<(int)defaults_.size(); i++) { + if (defaults_[i]->name == name) { + return defaults_[i]; } } - - return 0; + return nullptr; } // add default class to array -mjCDef* mjCModel::AddDef(string name, int parentid) { +mjCDef* mjCModel::AddDefault(string name, int parentid) { // check for repeated name - int thisid = (int)defaults.size(); + int thisid = (int)defaults_.size(); for (int i=0; iname==name) { + if (defaults_[i]->name==name) { return 0; } } // create new object mjCDef* def = new mjCDef; - defaults.push_back(def); + defaults_.push_back(def); // initialize contents if (parentid>=0 && parentidCopyFromSpec(); - *def = *defaults[parentid]; - defaults[parentid]->childid.push_back(thisid); + defaults_[parentid]->CopyFromSpec(); + *def = *defaults_[parentid]; + defaults_[parentid]->childid.push_back(thisid); } def->parentid = parentid; def->name = name; @@ -819,16 +777,16 @@ static T* findobject(std::string_view name, const vector& list, const mjKeyM // find object in global lists given string type and name mjCBase* mjCModel::FindObject(mjtObj type, string name) const { - if (!object_lists[type]) { + if (!object_lists_[type]) { return nullptr; } - return findobject(name, *object_lists[type], ids[type]); + return findobject(name, *object_lists_[type], ids[type]); } // find body by name -mjCBody* mjCModel::FindBody(mjCBody* body, std::string name) const { +mjCBody* mjCModel::FindBody(mjCBody* body, std::string name) { if (body->name == name) { return body; } @@ -893,20 +851,20 @@ bool mjCModel::IsNullPose(const mjtNum* pos, const mjtNum* quat) const { // make lists of objects in tree: bodies, geoms, joints, sites, cameras, lights void mjCModel::MakeLists(mjCBody* body) { // add this body if not world - if (body!=bodies[0]) { - bodies.push_back(body); + if (body != bodies_[0]) { + bodies_.push_back(body); } // add body's geoms, joints, sites, cameras, lights - for (int i=0; igeoms.size(); i++) geoms.push_back(body->geoms[i]); - for (int i=0; ijoints.size(); i++) joints.push_back(body->joints[i]); - for (int i=0; isites.size(); i++) sites.push_back(body->sites[i]); - for (int i=0; icameras.size(); i++) cameras.push_back(body->cameras[i]); - for (int i=0; ilights.size(); i++) lights.push_back(body->lights[i]); - for (int i=0; iframes.size(); i++) frames.push_back(body->frames[i]); + for (mjCGeom *geom : body->geoms) geoms_.push_back(geom); + for (mjCJoint *joint : body->joints) joints_.push_back(joint); + for (mjCSite *site : body->sites) sites_.push_back(site); + for (mjCCamera *camera : body->cameras) cameras_.push_back(camera); + for (mjCLight *light : body->lights) lights_.push_back(light); + for (mjCFrame *frame : body->frames) frames_.push_back(frame); // recursive call to all child bodies - for (int i=0; ibodies.size(); i++) MakeLists(body->bodies[i]); + for (mjCBody* body : body->bodies) MakeLists(body); } @@ -987,7 +945,7 @@ template <> void mjCModel::Delete(std::vector& elements, const std::vector& discard) { // update bodies - for (mjCBody* body : bodies) { + for (mjCBody* body : bodies_) { body->geoms.erase( std::remove_if(body->geoms.begin(), body->geoms.end(), [&discard](mjCGeom* geom) { return discard[geom->id]; }), @@ -1008,10 +966,10 @@ void mjCModel::Delete(std::vector& elements, template <> void mjCModel::DeleteAll(std::vector& elements) { - DeleteMaterial(geoms); - DeleteMaterial(skins); - DeleteMaterial(sites); - DeleteMaterial(tendons); + DeleteMaterial(geoms_); + DeleteMaterial(skins_); + DeleteMaterial(sites_); + DeleteMaterial(tendons_); for (mjCMaterial* element : elements) { delete element; } @@ -1021,7 +979,7 @@ void mjCModel::DeleteAll(std::vector& elements) { template <> void mjCModel::DeleteAll(std::vector& elements) { - DeleteTexture(materials); + DeleteTexture(materials_); for (mjCTexture* element : elements) { delete element; } @@ -1029,53 +987,53 @@ void mjCModel::DeleteAll(std::vector& elements) { } // set nuser fields -void mjCModel::SetNuser(){ +void mjCModel::SetNuser() { if (nuser_body == -1) { nuser_body = 0; - for (int i=0; ispec_userdata_.size()); + for (int i = 0; i < bodies_.size(); i++) { + nuser_body = mjMAX(nuser_body, bodies_[i]->spec_userdata_.size()); } } if (nuser_jnt == -1) { nuser_jnt = 0; - for (int i=0; ispec_userdata_.size()); + for (int i = 0; i < joints_.size(); i++) { + nuser_jnt = mjMAX(nuser_jnt, joints_[i]->spec_userdata_.size()); } } if (nuser_geom == -1) { nuser_geom = 0; - for (int i=0; ispec_userdata_.size()); + for (int i = 0; i < geoms_.size(); i++) { + nuser_geom = mjMAX(nuser_geom, geoms_[i]->spec_userdata_.size()); } } if (nuser_site == -1) { nuser_site = 0; - for (int i=0; ispec_userdata_.size()); + for (int i = 0; i < sites_.size(); i++) { + nuser_site = mjMAX(nuser_site, sites_[i]->spec_userdata_.size()); } } if (nuser_cam == -1) { nuser_cam = 0; - for (int i=0; ispec_userdata_.size()); + for (int i = 0; i < cameras_.size(); i++) { + nuser_cam = mjMAX(nuser_cam, cameras_[i]->spec_userdata_.size()); } } if (nuser_tendon == -1) { nuser_tendon = 0; - for (int i=0; ispec_userdata_.size()); + for (int i = 0; i < tendons_.size(); i++) { + nuser_tendon = mjMAX(nuser_tendon, tendons_[i]->spec_userdata_.size()); } } if (nuser_actuator == -1) { nuser_actuator = 0; - for (int i=0; ispec_userdata_.size()); + for (int i = 0; i < actuators_.size(); i++) { + nuser_actuator = mjMAX(nuser_actuator, actuators_[i]->spec_userdata_.size()); } } if (nuser_sensor == -1) { nuser_sensor = 0; - for (int i=0; ispec_userdata_.size()); + for (int i = 0; i < sensors_.size(); i++) { + nuser_sensor = mjMAX(nuser_sensor, sensors_[i]->spec_userdata_.size()); } } } @@ -1083,8 +1041,8 @@ void mjCModel::SetNuser(){ // index assets void mjCModel::IndexAssets(bool discard) { // assets referenced in geoms - for (int i=0; iget_material().empty()) { @@ -1121,8 +1079,8 @@ void mjCModel::IndexAssets(bool discard) { } // assets referenced in skins - for (int i=0; imaterial_.empty()) { @@ -1136,8 +1094,8 @@ void mjCModel::IndexAssets(bool discard) { } // materials referenced in sites - for (int i=0; imaterial_.empty()) { @@ -1151,8 +1109,8 @@ void mjCModel::IndexAssets(bool discard) { } // materials referenced in tendons - for (int i=0; imaterial_.empty()) { @@ -1166,8 +1124,8 @@ void mjCModel::IndexAssets(bool discard) { } // textures referenced in materials - for (int i=0; itexture_.empty()) { @@ -1182,16 +1140,16 @@ void mjCModel::IndexAssets(bool discard) { // discard visual meshes and geoms if (discard) { - std::vector discard_mesh(meshes.size(), false); - std::vector discard_geom(geoms.size(), false); + std::vector discard_mesh(meshes_.size(), false); + std::vector discard_geom(geoms_.size(), false); - std::transform(meshes.begin(), meshes.end(), discard_mesh.begin(), + std::transform(meshes_.begin(), meshes_.end(), discard_mesh.begin(), [](const mjCMesh* mesh) { return mesh->IsVisual(); }); - std::transform(geoms.begin(), geoms.end(), discard_geom.begin(), + std::transform(geoms_.begin(), geoms_.end(), discard_geom.begin(), [](const mjCGeom* geom) { return geom->IsVisual(); }); - Delete(meshes, discard_mesh); - Delete(geoms, discard_geom); + Delete(meshes_, discard_mesh); + Delete(geoms_, discard_geom); } } @@ -1228,30 +1186,30 @@ void mjCModel::SetDefaultNames(std::vector& assets) { // throw error if a name is missing void mjCModel::CheckEmptyNames(void) { // meshes - for (int i=0; iname.empty()) { - throw mjCError(meshes[i], "empty name in mesh"); + for (int i=0; iname.empty()) { + throw mjCError(meshes_[i], "empty name in mesh"); } } // hfields - for (int i=0; iname.empty()) { - throw mjCError(hfields[i], "empty name in height field"); + for (int i=0; iname.empty()) { + throw mjCError(hfields_[i], "empty name in height field"); } } // textures - for (int i=0; iname.empty() && textures[i]->type!=mjTEXTURE_SKYBOX) { - throw mjCError(textures[i], "empty name in texture"); + for (int i=0; i < textures_.size(); i++) { + if (textures_[i]->name.empty() && textures_[i]->type!=mjTEXTURE_SKYBOX) { + throw mjCError(textures_[i], "empty name in texture"); } } // materials - for (int i=0; iname.empty()) { - throw mjCError(materials[i], "empty name in material"); + for (int i=0; i < materials_.size(); i++) { + if (materials_[i]->name.empty()) { + throw mjCError(materials_[i], "empty name in material"); } } } @@ -1275,150 +1233,150 @@ static size_t getpathslength(std::vector list) { } // set array sizes -void mjCModel::SetSizes(void) { +void mjCModel::SetSizes() { // set from object list sizes - nbody = (int)bodies.size(); - njnt = (int)joints.size(); - ngeom = (int)geoms.size(); - nsite = (int)sites.size(); - ncam = (int)cameras.size(); - nlight = (int)lights.size(); - nflex = (int)flexes.size(); - nmesh = (int)meshes.size(); - nskin = (int)skins.size(); - nhfield = (int)hfields.size(); - ntex = (int)textures.size(); - nmat = (int)materials.size(); - npair = (int)pairs.size(); - nexclude = (int)excludes.size(); - neq = (int)equalities.size(); - ntendon = (int)tendons.size(); - nsensor = (int)sensors.size(); - nnumeric = (int)numerics.size(); - ntext = (int)texts.size(); - ntuple = (int)tuples.size(); - nkey = (int)keys.size(); - nplugin = (int)plugins.size(); + nbody = (int)bodies_.size(); + njnt = (int)joints_.size(); + ngeom = (int)geoms_.size(); + nsite = (int)sites_.size(); + ncam = (int)cameras_.size(); + nlight = (int)lights_.size(); + nflex = (int)flexes_.size(); + nmesh = (int)meshes_.size(); + nskin = (int)skins_.size(); + nhfield = (int)hfields_.size(); + ntex = (int)textures_.size(); + nmat = (int)materials_.size(); + npair = (int)pairs_.size(); + nexclude = (int)excludes_.size(); + neq = (int)equalities_.size(); + ntendon = (int)tendons_.size(); + nsensor = (int)sensors_.size(); + nnumeric = (int)numerics_.size(); + ntext = (int)texts_.size(); + ntuple = (int)tuples_.size(); + nkey = (int)keys_.size(); + nplugin = (int)plugins_.size(); // nq, nv for (int i=0; itype]; - nv += nVEL[joints[i]->type]; + nq += nPOS[joints_[i]->type]; + nv += nVEL[joints_[i]->type]; } // nu, na - for (int i=0; iactdim + actuators[i]->plugin_actdim; + na += actuators_[i]->actdim + actuators_[i]->plugin_actdim; } // nbvh, nbvhstatic, nbvhdynamic for (int i=0; itree.nbvh; + nbvhstatic += bodies_[i]->tree.nbvh; } for (int i=0; itree().nbvh; + nbvhstatic += meshes_[i]->tree().nbvh; } for (int i=0; itree.nbvh; + nbvhdynamic += flexes_[i]->tree.nbvh; } nbvh = nbvhstatic + nbvhdynamic; // flex counts for (int i=0; invert; - nflexedge += flexes[i]->nedge; - nflexelem += flexes[i]->nelem; - nflexelemdata += flexes[i]->nelem * (flexes[i]->dim + 1); - nflexshelldata += (int)flexes[i]->shell.size(); - nflexevpair += (int)flexes[i]->evpair.size()/2; + nflexvert += flexes_[i]->nvert; + nflexedge += flexes_[i]->nedge; + nflexelem += flexes_[i]->nelem; + nflexelemdata += flexes_[i]->nelem * (flexes_[i]->dim + 1); + nflexshelldata += (int)flexes_[i]->shell.size(); + nflexevpair += (int)flexes_[i]->evpair.size()/2; } // mesh counts for (int i=0; invert(); - nmeshnormal += meshes[i]->nnormal(); - nmeshface += meshes[i]->nface(); - nmeshtexcoord += (meshes[i]->HasTexcoord() ? meshes[i]->ntexcoord() : 0); - nmeshgraph += meshes[i]->szgraph(); + nmeshvert += meshes_[i]->nvert(); + nmeshnormal += meshes_[i]->nnormal(); + nmeshface += meshes_[i]->nface(); + nmeshtexcoord += (meshes_[i]->HasTexcoord() ? meshes_[i]->ntexcoord() : 0); + nmeshgraph += meshes_[i]->szgraph(); } // skin counts for (int i=0; iget_vert().size()/3; - nskintexvert += skins[i]->get_texcoord().size()/2; - nskinface += skins[i]->get_face().size()/3; - nskinbone += skins[i]->bodyid.size(); - for (int j=0; jbodyid.size(); j++) { - nskinbonevert += skins[i]->get_vertid()[j].size(); + nskinvert += skins_[i]->get_vert().size()/3; + nskintexvert += skins_[i]->get_texcoord().size()/2; + nskinface += skins_[i]->get_face().size()/3; + nskinbone += skins_[i]->bodyid.size(); + for (int j=0; jbodyid.size(); j++) { + nskinbonevert += skins_[i]->get_vertid()[j].size(); } } // nhfielddata - for (int i=0; inrow * hfields[i]->ncol; + for (int i=0; inrow * hfields_[i]->ncol; // ntexdata - for (int i=0; iwidth * textures[i]->height; + for (int i=0; iwidth * textures_[i]->height; // nwrap - for (int i=0; ipath.size(); + for (int i=0; ipath.size(); // nsensordata - for (int i=0; idim; + for (int i=0; idim; // nnumericdata - for (int i=0; isize; + for (int i=0; isize; // ntextdata - for (int i=0; idata_.size() + 1; + for (int i=0; idata_.size() + 1; // ntupledata - for (int i=0; iobjtype_.size(); + for (int i=0; iobjtype_.size(); // npluginattr - for (int i=0; iflattened_attributes.size(); + for (int i=0; iflattened_attributes.size(); // nnames nnames = (int)modelname_.size() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; - for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; + for (int i=0; iname.length() + 1; // npaths npaths = 0; - npaths += getpathslength(hfields); - npaths += getpathslength(meshes); - npaths += getpathslength(skins); - npaths += getpathslength(textures); + npaths += getpathslength(hfields_); + npaths += getpathslength(meshes_); + npaths += getpathslength(skins_); + npaths += getpathslength(textures_); if (npaths == 0) { npaths = 1; } // nemax for (int i=0; itype==mjEQ_CONNECT) { + if (equalities_[i]->type==mjEQ_CONNECT) { nemax += 3; - } else if (equalities[i]->type==mjEQ_WELD) { + } else if (equalities_[i]->type==mjEQ_WELD) { nemax += 7; } else { nemax += 1; @@ -1437,8 +1395,8 @@ void mjCModel::AutoSpringDamper(mjModel* m) { int ndim = nVEL[m->jnt_type[n]]; // get timeconst and dampratio from joint specificatin - mjtNum timeconst = (mjtNum)joints[n]->springdamper[0]; - mjtNum dampratio = (mjtNum)joints[n]->springdamper[1]; + mjtNum timeconst = (mjtNum)joints_[n]->springdamper[0]; + mjtNum dampratio = (mjtNum)joints_[n]->springdamper[1]; // skip joint if either parameter is non-positive if (timeconst<=0 || dampratio<=0) { @@ -1664,73 +1622,73 @@ void mjCModel::CopyNames(mjModel* m) { memset(m->names_map, -1, sizeof(int) * m->nnames_map); // process all lists - adr = namelist(bodies, adr, m->name_bodyadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*bodies.size(); + adr = namelist(bodies_, adr, m->name_bodyadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*bodies_.size(); - adr = namelist(joints, adr, m->name_jntadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*joints.size(); + adr = namelist(joints_, adr, m->name_jntadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*joints_.size(); - adr = namelist(geoms, adr, m->name_geomadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*geoms.size(); + adr = namelist(geoms_, adr, m->name_geomadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*geoms_.size(); - adr = namelist(sites, adr, m->name_siteadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*sites.size(); + adr = namelist(sites_, adr, m->name_siteadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*sites_.size(); - adr = namelist(cameras, adr, m->name_camadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*cameras.size(); + adr = namelist(cameras_, adr, m->name_camadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*cameras_.size(); - adr = namelist(lights, adr, m->name_lightadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*lights.size(); + adr = namelist(lights_, adr, m->name_lightadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*lights_.size(); - adr = namelist(flexes, adr, m->name_flexadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*flexes.size(); + adr = namelist(flexes_, adr, m->name_flexadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*flexes_.size(); - adr = namelist(meshes, adr, m->name_meshadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*meshes.size(); + adr = namelist(meshes_, adr, m->name_meshadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*meshes_.size(); - adr = namelist(skins, adr, m->name_skinadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*skins.size(); + adr = namelist(skins_, adr, m->name_skinadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*skins_.size(); - adr = namelist(hfields, adr, m->name_hfieldadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*hfields.size(); + adr = namelist(hfields_, adr, m->name_hfieldadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*hfields_.size(); - adr = namelist(textures, adr, m->name_texadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*textures.size(); + adr = namelist(textures_, adr, m->name_texadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*textures_.size(); - adr = namelist(materials, adr, m->name_matadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*materials.size(); + adr = namelist(materials_, adr, m->name_matadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*materials_.size(); - adr = namelist(pairs, adr, m->name_pairadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*pairs.size(); + adr = namelist(pairs_, adr, m->name_pairadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*pairs_.size(); - adr = namelist(excludes, adr, m->name_excludeadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*excludes.size(); + adr = namelist(excludes_, adr, m->name_excludeadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*excludes_.size(); - adr = namelist(equalities, adr, m->name_eqadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*equalities.size(); + adr = namelist(equalities_, adr, m->name_eqadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*equalities_.size(); - adr = namelist(tendons, adr, m->name_tendonadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*tendons.size(); + adr = namelist(tendons_, adr, m->name_tendonadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*tendons_.size(); - adr = namelist(actuators, adr, m->name_actuatoradr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*actuators.size(); + adr = namelist(actuators_, adr, m->name_actuatoradr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*actuators_.size(); - adr = namelist(sensors, adr, m->name_sensoradr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*sensors.size(); + adr = namelist(sensors_, adr, m->name_sensoradr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*sensors_.size(); - adr = namelist(numerics, adr, m->name_numericadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*numerics.size(); + adr = namelist(numerics_, adr, m->name_numericadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*numerics_.size(); - adr = namelist(texts, adr, m->name_textadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*texts.size(); + adr = namelist(texts_, adr, m->name_textadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*texts_.size(); - adr = namelist(tuples, adr, m->name_tupleadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*tuples.size(); + adr = namelist(tuples_, adr, m->name_tupleadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*tuples_.size(); - adr = namelist(keys, adr, m->name_keyadr, m->names, map_adr); - map_adr += mjLOAD_MULTIPLE*keys.size(); + adr = namelist(keys_, adr, m->name_keyadr, m->names, map_adr); + map_adr += mjLOAD_MULTIPLE*keys_.size(); - adr = namelist(plugins, adr, m->name_pluginadr, m->names, map_adr); + adr = namelist(plugins_, adr, m->name_pluginadr, m->names, map_adr); // check size, SHOULD NOT OCCUR if (adr != nnames) { @@ -1756,10 +1714,10 @@ void mjCModel::CopyPaths(mjModel* m) { // start with 0 address, unlike m->names m->paths might be empty size_t adr = 0; m->paths[0] = 0; - adr = pathlist(hfields, adr, m->hfield_pathadr, m->paths); - adr = pathlist(meshes, adr, m->mesh_pathadr, m->paths); - adr = pathlist(skins, adr, m->skin_pathadr, m->paths); - adr = pathlist(textures, adr, m->tex_pathadr, m->paths); + adr = pathlist(hfields_, adr, m->hfield_pathadr, m->paths); + adr = pathlist(meshes_, adr, m->mesh_pathadr, m->paths); + adr = pathlist(skins_, adr, m->skin_pathadr, m->paths); + adr = pathlist(textures_, adr, m->tex_pathadr, m->paths); } @@ -1774,8 +1732,8 @@ void mjCModel::CopyTree(mjModel* m) { // main loop over bodies for (int i=0; iparentid]; + mjCBody* pb = bodies_[i]; + mjCBody* par = bodies_[pb->parentid]; // set body fields m->body_parentid[i] = pb->parentid; @@ -2141,14 +2099,14 @@ void mjCModel::CopyTree(mjModel* m) { // compute subtreedofs in backward pass over bodies for (int i = nbody - 1; i > 0; i--) { // add body dofs to self count - bodies[i]->subtreedofs += bodies[i]->dofnum; + bodies_[i]->subtreedofs += bodies_[i]->dofnum; // add to parent count - bodies[bodies[i]->parentid]->subtreedofs += bodies[i]->subtreedofs; + bodies_[bodies_[i]->parentid]->subtreedofs += bodies_[i]->subtreedofs; } // make sure all dofs are in world "subtree", SHOULD NOT OCCUR - if (bodies[0]->subtreedofs != nv) { + if (bodies_[0]->subtreedofs != nv) { throw mjCError(0, "all DOFs should be in world subtree"); } @@ -2156,13 +2114,13 @@ void mjCModel::CopyTree(mjModel* m) { nB = 0; for (int i = 0; i < nbody; i++) { // add subtree dofs (including self) - nB += bodies[i]->subtreedofs; + nB += bodies_[i]->subtreedofs; // add dofs in ancestor bodies - int j = bodies[i]->parentid; + int j = bodies_[i]->parentid; while (j > 0) { - nB += bodies[j]->dofnum; - j = bodies[j]->parentid; + nB += bodies_[j]->dofnum; + j = bodies_[j]->parentid; } } m->nB = nB; @@ -2209,7 +2167,7 @@ void mjCModel::CopyObjects(mjModel* m) { graph_adr = 0; for (int i=0; imesh_vertadr[i] = vert_adr; @@ -2271,7 +2229,7 @@ void mjCModel::CopyObjects(mjModel* m) { texcoord_adr = 0; for (int i=0; iflex_contype[i] = pfl->contype; @@ -2333,8 +2291,8 @@ void mjCModel::CopyObjects(mjModel* m) { // find equality constraint referencing this flex m->flex_edgeequality[i] = 0; - for (int k=0; k<(int)equalities.size(); k++) { - if (equalities[k]->type==mjEQ_FLEX && equalities[k]->name1_==pfl->name) { + for (int k=0; k<(int)equalities_.size(); k++) { + if (equalities_[k]->type==mjEQ_FLEX && equalities_[k]->name1_==pfl->name) { m->flex_edgeequality[i] = 1; break; } @@ -2378,7 +2336,7 @@ void mjCModel::CopyObjects(mjModel* m) { // check if vertex body weldids are the same int b1 = pfl->vertbodyid[pfl->edge[k].first]; int b2 = pfl->vertbodyid[pfl->edge[k].second]; - m->flexedge_rigid[edge_adr+k] = (bodies[b1]->weldid == bodies[b2]->weldid); + m->flexedge_rigid[edge_adr+k] = (bodies_[b1]->weldid == bodies_[b2]->weldid); } } @@ -2401,7 +2359,7 @@ void mjCModel::CopyObjects(mjModel* m) { bonevert_adr = 0; for (int i=0; iskin_matid[i] = psk->matid; @@ -2458,7 +2416,7 @@ void mjCModel::CopyObjects(mjModel* m) { data_adr = 0; for (int i=0; ihfield_size+4*i, phf->size, 4); @@ -2477,7 +2435,7 @@ void mjCModel::CopyObjects(mjModel* m) { data_adr = 0; for (int i=0; itex_type[i] = ptex->type; @@ -2495,7 +2453,7 @@ void mjCModel::CopyObjects(mjModel* m) { // materials for (int i=0; imat_texid[i] = pmat->texid; @@ -2512,27 +2470,27 @@ void mjCModel::CopyObjects(mjModel* m) { // geom pairs to include for (int i=0; ipair_dim[i] = pairs[i]->condim; - m->pair_geom1[i] = pairs[i]->geom1->id; - m->pair_geom2[i] = pairs[i]->geom2->id; - m->pair_signature[i] = pairs[i]->signature; - copyvec(m->pair_solref+mjNREF*i, pairs[i]->solref, mjNREF); - copyvec(m->pair_solreffriction+mjNREF*i, pairs[i]->solreffriction, mjNREF); - copyvec(m->pair_solimp+mjNIMP*i, pairs[i]->solimp, mjNIMP); - m->pair_margin[i] = (mjtNum)pairs[i]->margin; - m->pair_gap[i] = (mjtNum)pairs[i]->gap; - copyvec(m->pair_friction+5*i, pairs[i]->friction, 5); + m->pair_dim[i] = pairs_[i]->condim; + m->pair_geom1[i] = pairs_[i]->geom1->id; + m->pair_geom2[i] = pairs_[i]->geom2->id; + m->pair_signature[i] = pairs_[i]->signature; + copyvec(m->pair_solref+mjNREF*i, pairs_[i]->solref, mjNREF); + copyvec(m->pair_solreffriction+mjNREF*i, pairs_[i]->solreffriction, mjNREF); + copyvec(m->pair_solimp+mjNIMP*i, pairs_[i]->solimp, mjNIMP); + m->pair_margin[i] = (mjtNum)pairs_[i]->margin; + m->pair_gap[i] = (mjtNum)pairs_[i]->gap; + copyvec(m->pair_friction+5*i, pairs_[i]->friction, 5); } // body pairs to exclude for (int i=0; iexclude_signature[i] = excludes[i]->signature; + m->exclude_signature[i] = excludes_[i]->signature; } // equality constraints for (int i=0; ieq_type[i] = peq->type; @@ -2548,7 +2506,7 @@ void mjCModel::CopyObjects(mjModel* m) { adr = 0; for (int i=0; itendon_adr[i] = adr; @@ -2590,7 +2548,7 @@ void mjCModel::CopyObjects(mjModel* m) { adr = 0; for (int i=0; iactuator_trntype[i] = pac->trntype; @@ -2623,7 +2581,7 @@ void mjCModel::CopyObjects(mjModel* m) { adr = 0; for (int i=0; isensor_type[i] = psen->type; @@ -2647,7 +2605,7 @@ void mjCModel::CopyObjects(mjModel* m) { adr = 0; for (int i=0; inumeric_adr[i] = adr; @@ -2667,7 +2625,7 @@ void mjCModel::CopyObjects(mjModel* m) { adr = 0; for (int i=0; itext_adr[i] = adr; @@ -2682,7 +2640,7 @@ void mjCModel::CopyObjects(mjModel* m) { adr = 0; for (int i=0; ituple_adr[i] = adr; @@ -2700,15 +2658,15 @@ void mjCModel::CopyObjects(mjModel* m) { // copy keyframe data for (int i=0; ikey_time[i] = (mjtNum)keys[i]->time; - copyvec(m->key_qpos+i*nq, keys[i]->qpos_.data(), nq); - copyvec(m->key_qvel+i*nv, keys[i]->qvel_.data(), nv); + m->key_time[i] = (mjtNum)keys_[i]->time; + copyvec(m->key_qpos+i*nq, keys_[i]->qpos_.data(), nq); + copyvec(m->key_qvel+i*nv, keys_[i]->qvel_.data(), nv); if (na) { - copyvec(m->key_act+i*na, keys[i]->act_.data(), na); + copyvec(m->key_act+i*na, keys_[i]->act_.data(), na); } if (nmocap) { - copyvec(m->key_mpos + i*3*nmocap, keys[i]->mpos_.data(), 3*nmocap); - copyvec(m->key_mquat + i*4*nmocap, keys[i]->mquat_.data(), 4*nmocap); + copyvec(m->key_mpos + i*3*nmocap, keys_[i]->mpos_.data(), 3*nmocap); + copyvec(m->key_mquat + i*4*nmocap, keys_[i]->mquat_.data(), 4*nmocap); } // normalize quaternions in m->key_qpos @@ -2723,7 +2681,7 @@ void mjCModel::CopyObjects(mjModel* m) { mju_normalize4(m->key_mquat+i*4*nmocap+4*j); } - copyvec(m->key_ctrl+i*nu, keys[i]->ctrl_.data(), nu); + copyvec(m->key_ctrl+i*nu, keys_[i]->ctrl_.data(), nu); } // save qpos0 in user model (to recognize changed key_qpos in write) @@ -2765,9 +2723,9 @@ void mjCModel::FuseReindex(mjCBody* body) { body->bodies[i]->id : body->weldid); } - makelistid(joints, body->joints); - makelistid(geoms, body->geoms); - makelistid(sites, body->sites); + makelistid(joints_, body->joints); + makelistid(geoms_, body->geoms); + makelistid(sites_, body->sites); // process children recursively for (int i=0; ibodies.size(); i++) { @@ -2780,24 +2738,24 @@ void mjCModel::FuseReindex(mjCBody* body) { // fuse static bodies with their parent void mjCModel::FuseStatic(void) { // skip if model has potential to reference elements with changed ids - if (!skins.empty() || - !pairs.empty() || - !excludes.empty() || - !equalities.empty() || - !tendons.empty() || - !actuators.empty() || - !sensors.empty() || - !tuples.empty() || - !cameras.empty() || - !lights.empty()) { + if (!skins_.empty() || + !pairs_.empty() || + !excludes_.empty() || + !equalities_.empty() || + !tendons_.empty() || + !actuators_.empty() || + !sensors_.empty() || + !tuples_.empty() || + !cameras_.empty() || + !lights_.empty()) { return; } // process fusable bodies - for (int i=1; iparentid]; + mjCBody* body = bodies_[i]; + mjCBody* par = bodies_[body->parentid]; // skip if body has joints or mocap if (!body->joints.empty() || body->mocap) { @@ -2938,9 +2896,9 @@ void mjCModel::FuseStatic(void) { // find in global and erase found = false; - for (auto iter=bodies.begin(); iter!=bodies.end(); iter++) { + for (auto iter=bodies_.begin(); iter!=bodies_.end(); iter++) { if (*iter==body) { - bodies.erase(iter); + bodies_.erase(iter); found = true; break; } @@ -2956,15 +2914,15 @@ void mjCModel::FuseStatic(void) { //------------- re-index bodies, joints, geoms, sites // body ids - for (int j=0; jid = j; + for (int j=0; jid = j; } // everything else - joints.clear(); - geoms.clear(); - sites.clear(); - FuseReindex(bodies[0]); + joints_.clear(); + geoms_.clear(); + sites_.clear(); + FuseReindex(bodies_[0]); // recompute parent contype, conaffinity, and margin par->contype = par->conaffinity = 0; @@ -3063,14 +3021,14 @@ static void processlist(mjListKeyMap& ids, vector& list, // set object ids, check for repeated names void mjCModel::ProcessLists(bool checkrepeat) { for (int i = 0; i < mjNOBJECT; i++) { - if (i != mjOBJ_XBODY && object_lists[i]) { + if (i != mjOBJ_XBODY && object_lists_[i]) { ids[i].clear(); - processlist(ids, *object_lists[i], (mjtObj) i, checkrepeat); + processlist(ids, *object_lists_[i], (mjtObj) i, checkrepeat); } } // check repeated names in meta elements - processlist(ids, frames, mjOBJ_FRAME, checkrepeat); + processlist(ids, frames_, mjOBJ_FRAME, checkrepeat); } @@ -3095,12 +3053,12 @@ static void warninghandler(const char* msg) { mjModel* mjCModel::Compile(const mjVFS* vfs) { if (compiled) { // clear kinematic tree - for (int i=0; isubtreedofs = 0; + for (int i=0; isubtreedofs = 0; } - mjCBody* world = bodies[0]; + mjCBody* world = bodies_[0]; Clear(); - bodies.push_back(world); + bodies_.push_back(world); } CopyFromSpec(); @@ -3140,9 +3098,9 @@ mjModel* mjCModel::Compile(const mjVFS* vfs) { // deallocate everything allocated in Compile mj_deleteModel(m); mj_deleteData(data); - mjCBody* world = bodies[0]; + mjCBody* world = bodies_[0]; Clear(); - bodies.push_back(world); + bodies_.push_back(world); // save error info errInfo = err; @@ -3169,12 +3127,12 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) { } // check for joints in world body - if (!bodies[0]->joints.empty()) { + if (!bodies_[0]->joints.empty()) { throw mjCError(0, "joint found in world body"); } // check for too many body+flex - if (bodies.size()+flexes.size()>=65534) { + if (bodies_.size()+flexes_.size()>=65534) { throw mjCError(0, "number of bodies plus flexes must be less than 65534"); } @@ -3193,18 +3151,18 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) { } // add missing keyframes - for (int i=keys.size(); imesh && - (geoms[i]->spec.type==mjGEOM_MESH || geoms[i]->spec.type==mjGEOM_SDF) && - (geoms[i]->spec.contype || geoms[i]->spec.conaffinity)) { - geoms[i]->mesh->set_needhull(true); + for (int i=0; imesh && + (geoms_[i]->spec.type==mjGEOM_MESH || geoms_[i]->spec.type==mjGEOM_SDF) && + (geoms_[i]->spec.contype || geoms_[i]->spec.conaffinity)) { + geoms_[i]->mesh->set_needhull(true); } } @@ -3234,42 +3192,42 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) { SetNuser(); // compile meshes (needed for geom compilation) - for (int i=0; iCompile(vfs); + for (int i=0; iCompile(vfs); } // compile objects in kinematic tree - for (int i=0; iCompile(); // also compiles joints, geoms, sites, cameras, lights, frames + for (int i=0; iCompile(); // also compiles joints, geoms, sites, cameras, lights, frames } // compile all other objects except for keyframes - for (int i=0; iCompile(vfs); - for (int i=0; iCompile(vfs); - for (int i=0; iCompile(vfs); - for (int i=0; iCompile(vfs); - for (int i=0; iCompile(); - for (int i=0; iCompile(); - for (int i=0; iCompile(); - for (int i=0; iCompile(); - for (int i=0; iCompile(); - for (int i=0; iCompile(); - for (int i=0; iCompile(); - for (int i=0; iCompile(); - for (int i=0; iCompile(); - for (int i=0; iCompile(); - for (int i=0; iCompile(); + for (auto flex : flexes_) flex->Compile(vfs); + for (auto skin : skins_) skin->Compile(vfs); + for (auto hfield : hfields_) hfield->Compile(vfs); + for (auto texture : textures_) texture->Compile(vfs); + for (auto material : materials_) material->Compile(); + for (auto pair : pairs_) pair->Compile(); + for (auto exclude : excludes_) exclude->Compile(); + for (auto equality : equalities_) equality->Compile(); + for (auto tendon : tendons_) tendon->Compile(); + for (auto actuator : actuators_) actuator->Compile(); + for (auto sensor : sensors_) sensor->Compile(); + for (auto numeric : numerics_) numeric->Compile(); + for (auto text : texts_) text->Compile(); + for (auto tuple : tuples_) tuple->Compile(); + for (auto plugin : plugins_) plugin->Compile(); - // compile defaults: to enforce userdata length for writer - for (int i=0; iCompile(this); + // compile def: to enforce userdata length for writer + for (mjCDef* def : defaults_) { + def->Compile(this); } // sort pair, exclude in increasing signature order; reassign ids - std::stable_sort(pairs.begin(), pairs.end(), comparePair); - std::stable_sort(excludes.begin(), excludes.end(), compareBodyPair); - reassignid(pairs); - reassignid(excludes); + std::stable_sort(pairs_.begin(), pairs_.end(), comparePair); + std::stable_sort(excludes_.begin(), excludes_.end(), compareBodyPair); + reassignid(pairs_); + reassignid(excludes_); // resolve asset references, compute sizes IndexAssets(discardvisual); @@ -3280,18 +3238,18 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) { } // set nmocap and body.mocapid - for (int i=0; imocap) { - bodies[i]->mocapid = nmocap; + for (mjCBody* body : bodies_) { + if (body->mocap) { + body->mocapid = nmocap; nmocap++; } else { - bodies[i]->mocapid = -1; + body->mocapid = -1; } } // check body mass and inertia - for (int i=1; ijoints.empty() && @@ -3345,10 +3303,10 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) { { int adr = 0; for (int i = 0; i < nplugin; ++i) { - m->plugin[i] = plugins[i]->spec.plugin_slot; - const int size = plugins[i]->flattened_attributes.size(); + m->plugin[i] = plugins_[i]->spec.plugin_slot; + const int size = plugins_[i]->flattened_attributes.size(); std::memcpy(m->plugin_attr + adr, - plugins[i]->flattened_attributes.data(), size); + plugins_[i]->flattened_attributes.data(), size); m->plugin_attradr[i] = adr; adr += size; } @@ -3359,8 +3317,8 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) { // set actuator_plugin to the plugin instance ID std::vector> plugin_to_actuators(nplugin); for (int i = 0; i < nu; ++i) { - if (actuators[i]->plugin.active) { - int actuator_plugin = static_cast(actuators[i]->plugin.instance)->id; + if (actuators_[i]->plugin.active) { + int actuator_plugin = static_cast(actuators_[i]->plugin.instance)->id; m->actuator_plugin[i] = actuator_plugin; plugin_to_actuators[actuator_plugin].push_back(i); } else { @@ -3369,16 +3327,16 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) { } for (int i = 0; i < nbody; ++i) { - if (bodies[i]->plugin.active) { - m->body_plugin[i] = static_cast(bodies[i]->plugin.instance)->id; + if (bodies_[i]->plugin.active) { + m->body_plugin[i] = static_cast(bodies_[i]->plugin.instance)->id; } else { m->body_plugin[i] = -1; } } for (int i = 0; i < ngeom; ++i) { - if (geoms[i]->plugin.active) { - m->geom_plugin[i] = static_cast(geoms[i]->plugin.instance)->id; + if (geoms_[i]->plugin.active) { + m->geom_plugin[i] = static_cast(geoms_[i]->plugin.instance)->id; } else { m->geom_plugin[i] = -1; } @@ -3386,8 +3344,8 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) { std::vector> plugin_to_sensors(nplugin); for (int i = 0; i < nsensor; ++i) { - if (sensors[i]->type == mjSENS_PLUGIN) { - int sensor_plugin = static_cast(sensors[i]->plugin.instance)->id; + if (sensors_[i]->type == mjSENS_PLUGIN) { + int sensor_plugin = static_cast(sensors_[i]->plugin.instance)->id; m->sensor_plugin[i] = sensor_plugin; plugin_to_sensors[sensor_plugin].push_back(i); } else { @@ -3413,8 +3371,8 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) { mju_error("`nsensordata` is null for plugin at slot %d", m->plugin[i]); } int nsensordata = plugin->nsensordata(m, i, sensor_id); - sensors[sensor_id]->dim = nsensordata; - sensors[sensor_id]->needstage = + sensors_[sensor_id]->dim = nsensordata; + sensors_[sensor_id]->needstage = static_cast(plugin->needstage); this->nsensordata += nsensordata; } @@ -3422,7 +3380,7 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) { if ((plugin->capabilityflags & mjPLUGIN_ACTUATOR) && plugin->actuator_actdim) { for (int actuator_id : plugin_to_actuators[i]) { int plugin_actdim = plugin->actuator_actdim(m, i, actuator_id); - actuators[actuator_id]->plugin_actdim = plugin_actdim; + actuators_[actuator_id]->plugin_actdim = plugin_actdim; this->na += plugin_actdim; } } @@ -3431,8 +3389,8 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) { } // keyframe compilation needs access to nq, nv, na, nmocap, qpos0 - for (int i=0; iCompile(m); + for (int i=0; iCompile(m); } // copy objects outsite kinematic tree (including keyframes) @@ -3598,16 +3556,16 @@ bool mjCModel::CopyBack(const mjModel* m) { // qpos0, qpos_spring for (int i=0; itype) { + switch (joints_[i]->type) { case mjJNT_FREE: - copyvec(bodies[m->jnt_bodyid[i]]->pos, m->qpos0+m->jnt_qposadr[i], 3); - copyvec(bodies[m->jnt_bodyid[i]]->quat, m->qpos0+m->jnt_qposadr[i]+3, 4); + copyvec(bodies_[m->jnt_bodyid[i]]->pos, m->qpos0+m->jnt_qposadr[i], 3); + copyvec(bodies_[m->jnt_bodyid[i]]->quat, m->qpos0+m->jnt_qposadr[i]+3, 4); break; case mjJNT_SLIDE: case mjJNT_HINGE: - joints[i]->ref = (double)m->qpos0[m->jnt_qposadr[i]]; - joints[i]->springref = (double)m->qpos_spring[m->jnt_qposadr[i]]; + joints_[i]->ref = (double)m->qpos0[m->jnt_qposadr[i]]; + joints_[i]->springref = (double)m->qpos_spring[m->jnt_qposadr[i]]; break; case mjJNT_BALL: @@ -3620,7 +3578,7 @@ bool mjCModel::CopyBack(const mjModel* m) { // body mjCBody* pb; for (int i=0; ipos, m->body_pos+3*i, 3); copyvec(pb->quat, m->body_quat+4*i, 4); @@ -3637,7 +3595,7 @@ bool mjCModel::CopyBack(const mjModel* m) { // joint and dof mjCJoint* pj; for (int i=0; ipos, m->jnt_pos+3*i, 3); @@ -3664,7 +3622,7 @@ bool mjCModel::CopyBack(const mjModel* m) { // geom mjCGeom* pg; for (int i=0; isize, m->geom_size+3*i, 3); copyvec(pg->pos, m->geom_pos+3*i, 3); @@ -3685,7 +3643,7 @@ bool mjCModel::CopyBack(const mjModel* m) { // mesh mjCMesh* pm; for (int i=0; iGetOffsetPosPtr(), m->mesh_pos+3*i, 3); copyvec(pm->GetOffsetQuatPtr(), m->mesh_quat+4*i, 4); } @@ -3693,7 +3651,7 @@ bool mjCModel::CopyBack(const mjModel* m) { // heightfield mjCHField* phf; for (int i=0; iget_userdata().size(); if (size) { int nrow = m->hfield_nrow[i]; @@ -3710,92 +3668,92 @@ bool mjCModel::CopyBack(const mjModel* m) { // sites for (int i=0; isize, m->site_size + 3 * i, 3); - copyvec(sites[i]->pos, m->site_pos+3*i, 3); - copyvec(sites[i]->quat, m->site_quat+4*i, 4); - copyvec(sites[i]->rgba, m->site_rgba+4*i, 4); + copyvec(sites_[i]->size, m->site_size + 3 * i, 3); + copyvec(sites_[i]->pos, m->site_pos+3*i, 3); + copyvec(sites_[i]->quat, m->site_quat+4*i, 4); + copyvec(sites_[i]->rgba, m->site_rgba+4*i, 4); if (nuser_site) { - copyvec(sites[i]->userdata_.data(), m->site_user + nuser_site*i, nuser_site); + copyvec(sites_[i]->userdata_.data(), m->site_user + nuser_site*i, nuser_site); } } // cameras for (int i=0; ipos, m->cam_pos+3*i, 3); - copyvec(cameras[i]->quat, m->cam_quat+4*i, 4); - cameras[i]->fovy = (double)m->cam_fovy[i]; - cameras[i]->ipd = (double)m->cam_ipd[i]; - copyvec(cameras[i]->resolution, m->cam_resolution+2*i, 2); - copyvec(cameras[i]->intrinsic, m->cam_intrinsic+4*i, 4); + copyvec(cameras_[i]->pos, m->cam_pos+3*i, 3); + copyvec(cameras_[i]->quat, m->cam_quat+4*i, 4); + cameras_[i]->fovy = (double)m->cam_fovy[i]; + cameras_[i]->ipd = (double)m->cam_ipd[i]; + copyvec(cameras_[i]->resolution, m->cam_resolution+2*i, 2); + copyvec(cameras_[i]->intrinsic, m->cam_intrinsic+4*i, 4); if (nuser_cam) { - copyvec(cameras[i]->userdata_.data(), m->cam_user + nuser_cam*i, nuser_cam); + copyvec(cameras_[i]->userdata_.data(), m->cam_user + nuser_cam*i, nuser_cam); } } // lights for (int i=0; ipos, m->light_pos+3*i, 3); - copyvec(lights[i]->dir, m->light_dir+3*i, 3); - copyvec(lights[i]->attenuation, m->light_attenuation+3*i, 3); - lights[i]->cutoff = m->light_cutoff[i]; - lights[i]->exponent = m->light_exponent[i]; - copyvec(lights[i]->ambient, m->light_ambient+3*i, 3); - copyvec(lights[i]->diffuse, m->light_diffuse+3*i, 3); - copyvec(lights[i]->specular, m->light_specular+3*i, 3); + copyvec(lights_[i]->pos, m->light_pos+3*i, 3); + copyvec(lights_[i]->dir, m->light_dir+3*i, 3); + copyvec(lights_[i]->attenuation, m->light_attenuation+3*i, 3); + lights_[i]->cutoff = m->light_cutoff[i]; + lights_[i]->exponent = m->light_exponent[i]; + copyvec(lights_[i]->ambient, m->light_ambient+3*i, 3); + copyvec(lights_[i]->diffuse, m->light_diffuse+3*i, 3); + copyvec(lights_[i]->specular, m->light_specular+3*i, 3); } // materials for (int i=0; itexrepeat, m->mat_texrepeat+2*i, 2); - materials[i]->emission = m->mat_emission[i]; - materials[i]->specular = m->mat_specular[i]; - materials[i]->shininess = m->mat_shininess[i]; - materials[i]->reflectance = m->mat_reflectance[i]; - copyvec(materials[i]->rgba, m->mat_rgba+4*i, 4); + copyvec(materials_[i]->texrepeat, m->mat_texrepeat+2*i, 2); + materials_[i]->emission = m->mat_emission[i]; + materials_[i]->specular = m->mat_specular[i]; + materials_[i]->shininess = m->mat_shininess[i]; + materials_[i]->reflectance = m->mat_reflectance[i]; + copyvec(materials_[i]->rgba, m->mat_rgba+4*i, 4); } // pairs for (int i=0; isolref, m->pair_solref+mjNREF*i, mjNREF); - copyvec(pairs[i]->solreffriction, m->pair_solreffriction+mjNREF*i, mjNREF); - copyvec(pairs[i]->solimp, m->pair_solimp+mjNIMP*i, mjNIMP); - pairs[i]->margin = (double)m->pair_margin[i]; - pairs[i]->gap = (double)m->pair_gap[i]; - copyvec(pairs[i]->friction, m->pair_friction+5*i, 5); + copyvec(pairs_[i]->solref, m->pair_solref+mjNREF*i, mjNREF); + copyvec(pairs_[i]->solreffriction, m->pair_solreffriction+mjNREF*i, mjNREF); + copyvec(pairs_[i]->solimp, m->pair_solimp+mjNIMP*i, mjNIMP); + pairs_[i]->margin = (double)m->pair_margin[i]; + pairs_[i]->gap = (double)m->pair_gap[i]; + copyvec(pairs_[i]->friction, m->pair_friction+5*i, 5); } // equality constraints for (int i=0; idata, m->eq_data+mjNEQDATA*i, mjNEQDATA); - copyvec(equalities[i]->solref, m->eq_solref+mjNREF*i, mjNREF); - copyvec(equalities[i]->solimp, m->eq_solimp+mjNIMP*i, mjNIMP); + copyvec(equalities_[i]->data, m->eq_data+mjNEQDATA*i, mjNEQDATA); + copyvec(equalities_[i]->solref, m->eq_solref+mjNREF*i, mjNREF); + copyvec(equalities_[i]->solimp, m->eq_solimp+mjNIMP*i, mjNIMP); } // tendons for (int i=0; irange, m->tendon_range+2*i, 2); - copyvec(tendons[i]->solref_limit, m->tendon_solref_lim+mjNREF*i, mjNREF); - copyvec(tendons[i]->solimp_limit, m->tendon_solimp_lim+mjNIMP*i, mjNIMP); - copyvec(tendons[i]->solref_friction, m->tendon_solref_fri+mjNREF*i, mjNREF); - copyvec(tendons[i]->solimp_friction, m->tendon_solimp_fri+mjNIMP*i, mjNIMP); - copyvec(tendons[i]->rgba, m->tendon_rgba+4*i, 4); - tendons[i]->width = (double)m->tendon_width[i]; - tendons[i]->margin = (double)m->tendon_margin[i]; - tendons[i]->stiffness = (double)m->tendon_stiffness[i]; - tendons[i]->damping = (double)m->tendon_damping[i]; - tendons[i]->frictionloss = (double)m->tendon_frictionloss[i]; + copyvec(tendons_[i]->range, m->tendon_range+2*i, 2); + copyvec(tendons_[i]->solref_limit, m->tendon_solref_lim+mjNREF*i, mjNREF); + copyvec(tendons_[i]->solimp_limit, m->tendon_solimp_lim+mjNIMP*i, mjNIMP); + copyvec(tendons_[i]->solref_friction, m->tendon_solref_fri+mjNREF*i, mjNREF); + copyvec(tendons_[i]->solimp_friction, m->tendon_solimp_fri+mjNIMP*i, mjNIMP); + copyvec(tendons_[i]->rgba, m->tendon_rgba+4*i, 4); + tendons_[i]->width = (double)m->tendon_width[i]; + tendons_[i]->margin = (double)m->tendon_margin[i]; + tendons_[i]->stiffness = (double)m->tendon_stiffness[i]; + tendons_[i]->damping = (double)m->tendon_damping[i]; + tendons_[i]->frictionloss = (double)m->tendon_frictionloss[i]; if (nuser_tendon) { - copyvec(tendons[i]->userdata_.data(), m->tendon_user + nuser_tendon*i, nuser_tendon); + copyvec(tendons_[i]->userdata_.data(), m->tendon_user + nuser_tendon*i, nuser_tendon); } } // actuators mjCActuator* pa; for (int i=0; idynprm, m->actuator_dynprm+i*mjNDYN, mjNDYN); copyvec(pa->gainprm, m->actuator_gainprm+i*mjNGAIN, mjNGAIN); @@ -3814,31 +3772,31 @@ bool mjCModel::CopyBack(const mjModel* m) { // sensors for (int i=0; icutoff = (double)m->sensor_cutoff[i]; - sensors[i]->noise = (double)m->sensor_noise[i]; + sensors_[i]->cutoff = (double)m->sensor_cutoff[i]; + sensors_[i]->noise = (double)m->sensor_noise[i]; if (nuser_sensor) { - copyvec(sensors[i]->userdata_.data(), m->sensor_user + nuser_sensor*i, nuser_sensor); + copyvec(sensors_[i]->userdata_.data(), m->sensor_user + nuser_sensor*i, nuser_sensor); } } // numeric data for (int i=0; inumeric_size[i]; j++) { - numerics[i]->data_[j] = (double)m->numeric_data[m->numeric_adr[i]+j]; + numerics_[i]->data_[j] = (double)m->numeric_data[m->numeric_adr[i]+j]; } } // tuple data for (int i=0; ituple_size[i]; j++) { - tuples[i]->objprm_[j] = (double)m->tuple_objprm[m->tuple_adr[i]+j]; + tuples_[i]->objprm_[j] = (double)m->tuple_objprm[m->tuple_adr[i]+j]; } } // keyframes for (int i=0; inkey; i++) { - mjCKey* pk = keys[i]; + mjCKey* pk = keys_[i]; pk->time = (double)m->key_time[i]; copyvec(pk->qpos_.data(), m->key_qpos + i*nq, nq); @@ -3864,9 +3822,9 @@ void mjCModel::ResolvePlugin(mjCBase* obj, const std::string& plugin_name, // (in XML, active plugins are those declared as ) int plugin_slot = -1; if (!plugin_name.empty()) { - for (int i = 0; i < active_plugins.size(); ++i) { - if (active_plugins[i].first->name == plugin_name) { - plugin_slot = active_plugins[i].second; + for (int i = 0; i < active_plugins_.size(); ++i) { + if (active_plugins_[i].first->name == plugin_name) { + plugin_slot = active_plugins_[i].second; break; } } diff --git a/src/user/user_model.h b/src/user/user_model.h index 61511d4f..1138bc45 100644 --- a/src/user/user_model.h +++ b/src/user/user_model.h @@ -192,14 +192,6 @@ class mjCModel : public mjCModel_, private mjSpec { mjCKey* AddKey(); mjCPlugin* AddPlugin(); - // copy vector of elements to this model - template void CopyList(std::vector& dest, - const std::vector& source, - std::map& def_map, - const std::vector& defaults); - - // delete from list the elements that are compatible with other but not this model - template void RemoveFromList(std::vector& list, const mjCModel& other); // delete elements marked as discard=true template void Delete(std::vector& elements, @@ -214,43 +206,58 @@ class mjCModel : public mjCModel_, private mjSpec { // API for access to other variables bool IsCompiled() const; // is model already compiled - const mjCError& GetError(void) const; // get reference of error object - mjCBody* GetWorld() const; // pointer to world body - mjCDef* FindDef(std::string name) const; // find default class name - mjCDef* AddDef(std::string name, int parentid); // add default class to array + const mjCError& GetError() const; // get reference of error object + mjCBody* GetWorld(); // pointer to world body + mjCDef* FindDefault(std::string name); // find defaults class name + mjCDef* AddDefault(std::string name, int parentid); // add defaults class to array mjCBase* FindObject(mjtObj type, std::string name) const; // find object given type and name - mjCBody* FindBody(mjCBody* body, std::string name) const; // find body given name + mjCBody* FindBody(mjCBody* body, std::string name); // find body given name mjCFrame* FindFrame(mjCBody* body, std::string name) const; // find frame given name bool IsNullPose(const mjtNum* pos, const mjtNum* quat) const; // detect null pose + void SetActivePlugins(const std::vector>&& active_plugins) { + active_plugins_ = std::move(active_plugins); + } // accessors - std::string get_meshdir(void) const { return meshdir_; } - std::string get_texturedir(void) const { return texturedir_; } + std::string get_meshdir() const { return meshdir_; } + std::string get_texturedir() const { return texturedir_; } + + const std::vector& Defaults() const { return defaults_; } + + const std::vector>& ActivePlugins() const { + return active_plugins_; + }; + + const std::vector& Flexes() const { return flexes_; } + const std::vector& Meshes() const {return meshes_; } + const std::vector& Skins() const { return skins_; } + const std::vector& HFields() const { return hfields_; } + const std::vector& Textures() const { return textures_; } + const std::vector& Materials() const { return materials_; } + const std::vector& Pairs() const { return pairs_; } + const std::vector& Excludes() const { return excludes_; } + const std::vector& Equalities() const { return equalities_; } + const std::vector& Tendons() const { return tendons_; } + const std::vector& Actuators() const { return actuators_; } + const std::vector& Sensors() const { return sensors_; } + const std::vector& Numerics() const { return numerics_; } + const std::vector& Texts() const { return texts_; } + const std::vector& Tuples() const { return tuples_; } + const std::vector& Keys() const { return keys_; } + const std::vector& Plugins() const { return plugins_; } + const std::vector& Bodies() const { return bodies_; } + const std::vector& Geoms() const { return geoms_; } // resolve plugin instance, create a new one if needed void ResolvePlugin(mjCBase* obj, const std::string& plugin_name, const std::string& plugin_instance_name, mjCPlugin** plugin_instance); - // settings for each defaults class - std::vector defaults; - - // list of active plugins - std::vector> active_plugins; - - private: void TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs); mjModel* _Compile(const mjVFS* vfs); // clear objects allocated by Compile - void Clear(void); - - // add object of any type - template T* AddObject(std::vector& list, std::string type); - - // add object of any type, with def parameter - template T* AddObjectDef(std::vector& list, std::string type, - mjCDef* def); + void Clear(); // if asset name is missing, set to filename template void SetDefaultNames(std::vector& assets); @@ -259,6 +266,13 @@ class mjCModel : public mjCModel_, private mjSpec { template void DeleteMaterial(std::vector& list, std::string_view name = ""); + private: + // settings for each defaults class + std::vector defaults_; + + // list of active plugins + std::vector> active_plugins_; + // compile phases void MakeLists(mjCBody* body); // make lists of bodies, geoms, joints, sites void SetNuser(); // set nuser fields @@ -273,35 +287,51 @@ class mjCModel : public mjCModel_, private mjSpec { void CopyTree(mjModel*); // copy objects inside kinematic tree // objects created here - std::vector flexes; // list of flexes - std::vector meshes; // list of meshes - std::vector skins; // list of skins - std::vector hfields; // list of height fields - std::vector textures; // list of textures - std::vector materials; // list of materials - std::vector pairs; // list of geom pairs to include - std::vector excludes; // list of body pairs to exclude - std::vector equalities; // list of equality constraints - std::vector tendons; // list of tendons - std::vector actuators; // list of actuators - std::vector sensors; // list of sensors - std::vector numerics; // list of numeric fields - std::vector texts; // list of text fields - std::vector tuples; // list of tuple fields - std::vector keys; // list of keyframe fields - std::vector plugins; // list of plugin instances + std::vector flexes_; // list of flexes + std::vector meshes_; // list of meshes + std::vector skins_; // list of skins + std::vector hfields_; // list of height fields + std::vector textures_; // list of textures + std::vector materials_; // list of materials + std::vector pairs_; // list of geom pairs to include + std::vector excludes_; // list of body pairs to exclude + std::vector equalities_; // list of equality constraints + std::vector tendons_; // list of tendons + std::vector actuators_; // list of actuators + std::vector sensors_; // list of sensors + std::vector numerics_; // list of numeric fields + std::vector texts_; // list of text fields + std::vector tuples_; // list of tuple fields + std::vector keys_; // list of keyframe fields + std::vector plugins_; // list of plugin instances // pointers to objects created inside kinematic tree - std::vector bodies; // list of bodies - std::vector joints; // list of joints allowing motion relative to parent - std::vector geoms; // list of geoms attached to this body - std::vector sites; // list of sites attached to this body - std::vector cameras; // list of cameras - std::vector lights; // list of lights - std::vector frames; // list of frames + std::vector bodies_; // list of bodies + std::vector joints_; // list of joints allowing motion relative to parent + std::vector geoms_; // list of geoms attached to this body + std::vector sites_; // list of sites attached to this body + std::vector cameras_; // list of cameras + std::vector lights_; // list of lights + std::vector frames_; // list of frames // array of pointers to each object list (enumerated by type) - std::array*, mjNOBJECT> object_lists; + std::array*, mjNOBJECT> object_lists_; + + // add object of any type + template T* AddObject(std::vector& list, std::string type); + + // add object of any type, with defaults parameter + template T* AddObjectDefault(std::vector& list, std::string type, + mjCDef* def); + + // copy vector of elements to this model + template void CopyList(std::vector& dest, + const std::vector& sources, + std::map& def_map, + const std::vector& defaults); + + // delete from list the elements that are compatible with other but not this model + template void RemoveFromList(std::vector& list, const mjCModel& other); // create mjCBase lists from children lists void CreateObjectLists(); diff --git a/src/user/user_objects.cc b/src/user/user_objects.cc index 438b5e7b..8a27ed76 100644 --- a/src/user/user_objects.cc +++ b/src/user/user_objects.cc @@ -1497,7 +1497,7 @@ void mjCBody::Compile(void) { // compute body global pose (no joint transformations in qpos0) if (id>0) { - mjCBody* par = model->bodies[parentid]; + mjCBody* par = model->Bodies()[parentid]; mju_rotVecQuat(xpos0, pos, par->xquat0); mju_addTo3(xpos0, par->xpos0); mju_mulQuat(xquat0, par->xquat0, quat); @@ -1679,7 +1679,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->Defaults()[0] : 0)); // point to local PointToLocal(); @@ -1883,7 +1883,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->Defaults()[0] : 0)); // point to local PointToLocal(); @@ -1969,7 +1969,7 @@ double mjCGeom::GetVolume(void) { // get from mesh if (type==mjGEOM_MESH || type==mjGEOM_SDF) { - if (mesh->id<0 || !((std::size_t) mesh->id <= model->meshes.size())) { + if (mesh->id<0 || !((std::size_t) mesh->id <= model->Meshes().size())) { throw mjCError(this, "invalid mesh id in mesh geom"); } @@ -2022,7 +2022,7 @@ void mjCGeom::SetInertia(void) { // get from mesh if (type==mjGEOM_MESH || type==mjGEOM_SDF) { - if (mesh->id<0 || !((std::size_t) mesh->id <= model->meshes.size())) { + if (mesh->id<0 || !((std::size_t) mesh->id <= model->Meshes().size())) { throw mjCError(this, "invalid mesh id in mesh geom"); } @@ -2523,7 +2523,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->Defaults()[0] : 0)); } @@ -2669,7 +2669,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->Defaults()[0] : 0)); // point to local PointToLocal(); @@ -2823,7 +2823,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->Defaults()[0] : 0)); PointToLocal(); CopyFromSpec(); @@ -3860,7 +3860,7 @@ mjCMaterial::mjCMaterial(mjCModel* _model, mjCDef* _def) { // set model, def model = _model; - def = (_def ? _def : (_model ? _model->defaults[0] : 0)); + def = (_def ? _def : (_model ? _model->Defaults()[0] : 0)); // point to local PointToLocal(); @@ -3948,7 +3948,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->Defaults()[0] : 0)); // point to local PointToLocal(); @@ -4309,7 +4309,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->Defaults()[0] : 0)); // point to local PointToLocal(); @@ -4444,7 +4444,7 @@ void mjCEquality::Compile(void) { ResolveReferences(model); // make sure flex is not rigid - if (type==mjEQ_FLEX && model->flexes[obj1id]->rigid) { + if (type==mjEQ_FLEX && model->Flexes()[obj1id]->rigid) { throw mjCError(this, "rigid flex '%s' in equality constraint %d", name1_.c_str(), id); } } @@ -4471,7 +4471,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->Defaults()[0] : 0)); // point to local PointToLocal(); @@ -4763,7 +4763,7 @@ void mjCTendon::Compile(void) { } // mark geoms as non visual - model->geoms[path[i]->obj->id]->SetNotVisual(); + model->Geoms()[path[i]->obj->id]->SetNotVisual(); break; case mjWRAP_JOINT: @@ -4950,7 +4950,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->Defaults()[0] : 0)); // in case this actuator is not compiled CopyFromSpec(); diff --git a/src/user/user_objects.h b/src/user/user_objects.h index 644f8898..f6df07b6 100644 --- a/src/user/user_objects.h +++ b/src/user/user_objects.h @@ -107,8 +107,8 @@ class mjCBoundingVolume { void SetId(int val) { idval_ = val; } private: - int idval_; // local id copy for nodes not storing their id's (e.g. faces) - const int* id_; // pointer to object id + int idval_; // local id copy for nodes not storing their id's (e.g. faces) + const int* id_; // pointer to object id }; @@ -354,6 +354,10 @@ class mjCFrame : public mjCFrame_, private mjsFrame { friend class mjCModel; public: + mjCFrame(mjCModel* = 0, mjCFrame* = 0); + mjCFrame(const mjCFrame& other); + mjCFrame& operator=(const mjCFrame& other); + mjsFrame spec; using mjCBase::name; using mjCBase::classname; @@ -368,9 +372,6 @@ class mjCFrame : public mjCFrame_, private mjsFrame { bool IsAncestor(const mjCFrame* child) const; // true if child is contained in this frame private: - mjCFrame(mjCModel* = 0, mjCFrame* = 0); // constructor - mjCFrame(const mjCFrame& other); // copy constructor - mjCFrame& operator=(const mjCFrame& other); // copy assignment void Compile(void); // compiler mjCBody* body; // body that owns the frame @@ -400,6 +401,10 @@ class mjCJoint : public mjCJoint_, private mjsJoint { friend class mjXURDF; public: + mjCJoint(mjCModel* = nullptr, mjCDef* = nullptr); + mjCJoint(const mjCJoint& other); + mjCJoint& operator=(const mjCJoint& other); + mjsJoint spec; using mjCBase::name; using mjCBase::classname; @@ -416,10 +421,6 @@ class mjCJoint : public mjCJoint_, private mjsJoint { private: - mjCJoint(mjCModel* = 0, mjCDef* = 0); - mjCJoint(const mjCJoint& other); // copy constructor - mjCJoint& operator=(const mjCJoint& other); // copy assignment - int Compile(void); // compiler; return dofnum void PointToLocal(void); }; @@ -468,6 +469,10 @@ class mjCGeom : public mjCGeom_, private mjsGeom { friend class mjXURDF; public: + mjCGeom(mjCModel* = nullptr, mjCDef* = nullptr); + mjCGeom(const mjCGeom& other); + mjCGeom& operator=(const mjCGeom& other); + using mjCBase::name; mjsGeom spec; // variables set by user double GetVolume(void); // compute geom volume @@ -491,10 +496,6 @@ class mjCGeom : public mjCGeom_, private mjsGeom { void del_material() { spec_material_.clear(); } private: - mjCGeom(mjCModel* = 0, mjCDef* = 0); - mjCGeom(const mjCGeom& other); // copy constructor - mjCGeom& operator=(const mjCGeom& other); // copy assignment - void Compile(void); // compiler double GetRBound(void); // compute bounding sphere radius void ComputeAABB(void); // compute axis-aligned bounding box @@ -533,6 +534,10 @@ class mjCSite : public mjCSite_, private mjsSite { friend class mjXURDF; public: + mjCSite(mjCModel* = nullptr, mjCDef* = nullptr); + mjCSite(const mjCSite& other); + mjCSite& operator=(const mjCSite& other); + mjsSite spec; // variables set by user // use strings from mjCBase rather than mjStrings from mjsSite @@ -546,10 +551,6 @@ class mjCSite : public mjCSite_, private mjsSite { void del_material() { material_.clear(); } private: - mjCSite(mjCModel* = 0, mjCDef* = 0); // constructor - mjCSite(const mjCSite& other); // copy constructor - mjCSite& operator=(const mjCSite& other); // copy assignment - void Compile(void); // compiler void CopyFromSpec(); // copy spec into attributes void PointToLocal(void); @@ -578,6 +579,10 @@ class mjCCamera : public mjCCamera_, private mjsCamera { friend class mjXWriter; public: + mjCCamera(mjCModel* = nullptr, mjCDef* = nullptr); + mjCCamera(const mjCCamera& other); + mjCCamera& operator=(const mjCCamera& other); + mjsCamera spec; using mjCBase::name; using mjCBase::classname; @@ -588,10 +593,6 @@ class mjCCamera : public mjCCamera_, private mjsCamera { const std::vector& get_userdata() { return userdata_; } private: - mjCCamera(mjCModel* = 0, mjCDef* = 0); // constructor - mjCCamera(const mjCCamera& other); // copy constructor - mjCCamera& operator=(const mjCCamera& other); // copy assignment - void Compile(void); // compiler void CopyFromSpec(void); void PointToLocal(void); @@ -618,6 +619,10 @@ class mjCLight : public mjCLight_, private mjsLight { friend class mjXWriter; public: + mjCLight(mjCModel* = nullptr, mjCDef* = nullptr); + mjCLight(const mjCLight& other); + mjCLight& operator=(const mjCLight& other); + mjsLight spec; using mjCBase::name; using mjCBase::classname; @@ -627,10 +632,6 @@ class mjCLight : public mjCLight_, private mjsLight { const std::string& get_targetbody() { return targetbody_; } private: - mjCLight(mjCModel* = 0, mjCDef* = 0); // constructor - mjCLight(const mjCLight& other); // copy constructor - mjCLight& operator=(const mjCLight& other); // copy assignment - void Compile(void); // compiler void CopyFromSpec(void); void PointToLocal(void); @@ -681,6 +682,10 @@ class mjCFlex: public mjCFlex_, private mjsFlex { friend class mjXWriter; public: + mjCFlex(mjCModel* = nullptr); + mjCFlex(const mjCFlex& other); + mjCFlex& operator=(const mjCFlex& other); + mjsFlex spec; using mjCBase::name; using mjCBase::classname; @@ -703,10 +708,6 @@ class mjCFlex: public mjCFlex_, private mjsFlex { void DelTexcoord(); // delete texcoord private: - mjCFlex(mjCModel* = 0); - mjCFlex(const mjCFlex& other); // copy constructor - mjCFlex& operator=(const mjCFlex& other); // copy assignment - void Compile(const mjVFS* vfs); // compiler void CreateBVH(void); // create flex BVH void CreateShellPair(void); // create shells and evpairs @@ -779,9 +780,9 @@ class mjCMesh: public mjCMesh_, private mjsMesh { friend class mjCFlexcomp; friend class mjXWriter; public: - mjCMesh(mjCModel* = 0, mjCDef* = 0); - mjCMesh(const mjCMesh& other); // copy constructor - mjCMesh& operator=(const mjCMesh& other); // copy assignment + mjCMesh(mjCModel* = nullptr, mjCDef* = nullptr); + mjCMesh(const mjCMesh& other); + mjCMesh& operator=(const mjCMesh& other); ~mjCMesh(); mjsMesh spec; @@ -910,6 +911,11 @@ class mjCSkin: public mjCSkin_, private mjsSkin { friend class mjXWriter; public: + mjCSkin(mjCModel* = nullptr); + mjCSkin(const mjCSkin& other); + mjCSkin& operator=(const mjCSkin& other); + ~mjCSkin(); + mjsSkin spec; using mjCBase::name; using mjCBase::classname; @@ -931,11 +937,6 @@ class mjCSkin: public mjCSkin_, private mjsSkin { void PointToLocal(); private: - mjCSkin(mjCModel* = 0); // constructor - mjCSkin(const mjCSkin& other); // copy constructor - mjCSkin& operator=(const mjCSkin& other); // copy assignment - ~mjCSkin(); // destructor - void ResolveReferences(const mjCModel* m); void NameSpace(const mjCModel* m); void Compile(const mjVFS* vfs); // compiler @@ -965,6 +966,11 @@ class mjCHField : public mjCHField_, private mjsHField { friend class mjXWriter; public: + mjCHField(mjCModel* model); + mjCHField(const mjCHField& other); + mjCHField& operator=(const mjCHField& other); + ~mjCHField(); + mjsHField spec; using mjCBase::name; using mjCBase::info; @@ -978,11 +984,6 @@ class mjCHField : public mjCHField_, private mjsHField { std::vector& get_userdata() { return userdata_; } private: - mjCHField(mjCModel* model); // constructor - mjCHField(const mjCHField& other); // copy constructor - mjCHField& operator=(const mjCHField& other); // copy assignment - ~mjCHField(); // destructor - void Compile(const mjVFS* vfs); // compiler void LoadCustom(mjResource* resource); // load from custom format @@ -1012,7 +1013,10 @@ class mjCTexture : public mjCTexture_, private mjsTexture { friend class mjXWriter; public: - ~mjCTexture(); // destructor + mjCTexture(mjCModel*); + mjCTexture(const mjCTexture& other); + mjCTexture& operator=(const mjCTexture& other); + ~mjCTexture(); mjsTexture spec; using mjCBase::name; @@ -1027,10 +1031,6 @@ class mjCTexture : public mjCTexture_, private mjsTexture { std::vector get_cubefiles() const { return cubefiles_; } private: - mjCTexture(mjCModel*); // constructor - mjCTexture(const mjCTexture& other); // copy constructor - mjCTexture& operator=(const mjCTexture& other); // copy assignment - void Compile(const mjVFS* vfs); // compiler void Builtin2D(void); // make builtin 2D @@ -1069,6 +1069,10 @@ class mjCMaterial : public mjCMaterial_, private mjsMaterial { friend class mjXWriter; public: + mjCMaterial(mjCModel* = nullptr, mjCDef* = nullptr); + mjCMaterial(const mjCMaterial& other); + mjCMaterial& operator=(const mjCMaterial& other); + mjsMaterial spec; using mjCBase::name; using mjCBase::classname; @@ -1082,10 +1086,6 @@ class mjCMaterial : public mjCMaterial_, private mjsMaterial { void del_texture() { texture_.clear(); } private: - mjCMaterial(mjCModel* = 0, mjCDef* = 0); // constructor - mjCMaterial(const mjCMaterial& other); // copy constructor - mjCMaterial& operator=(const mjCMaterial& other); // copy assignment - void Compile(void); // compiler }; @@ -1110,6 +1110,10 @@ class mjCPair : public mjCPair_, private mjsPair { friend class mjXWriter; public: + mjCPair(mjCModel* = nullptr, mjCDef* = nullptr); + mjCPair(const mjCPair& other); + mjCPair& operator=(const mjCPair& other); + mjsPair spec; using mjCBase::name; using mjCBase::classname; @@ -1128,10 +1132,6 @@ class mjCPair : public mjCPair_, private mjsPair { } private: - mjCPair(mjCModel* = 0, mjCDef* = 0); // constructor - mjCPair(const mjCPair& other); // copy constructor - mjCPair& operator=(const mjCPair& other); // copy assignment - void Compile(void); // compiler mjCGeom* geom1; // geom1 @@ -1160,6 +1160,10 @@ class mjCBodyPair : public mjCBodyPair_, private mjsExclude { friend class mjCModel; public: + mjCBodyPair(mjCModel*); + mjCBodyPair(const mjCBodyPair& other); + mjCBodyPair& operator=(const mjCBodyPair& other); + mjsExclude spec; using mjCBase::name; using mjCBase::info; @@ -1177,9 +1181,6 @@ class mjCBodyPair : public mjCBodyPair_, private mjsExclude { } private: - mjCBodyPair(mjCModel*); // constructor - mjCBodyPair(const mjCBodyPair& other); // copy constructor - mjCBodyPair& operator=(const mjCBodyPair& other); // copy assignment void Compile(void); // compiler }; @@ -1206,6 +1207,10 @@ class mjCEquality : public mjCEquality_, private mjsEquality { friend class mjXWriter; public: + mjCEquality(mjCModel* = 0, mjCDef* = 0); + mjCEquality(const mjCEquality& other); + mjCEquality& operator=(const mjCEquality& other); + mjsEquality spec; using mjCBase::name; using mjCBase::classname; @@ -1217,10 +1222,6 @@ class mjCEquality : public mjCEquality_, private mjsEquality { void NameSpace(const mjCModel* m); private: - mjCEquality(mjCModel* = 0, mjCDef* = 0); // constructor - mjCEquality(const mjCEquality& other); // copy constructor - mjCEquality& operator=(const mjCEquality& other); // copy assignment - void Compile(void); // compiler }; @@ -1246,6 +1247,11 @@ class mjCTendon : public mjCTendon_, private mjsTendon { friend class mjXWriter; public: + mjCTendon(mjCModel* = nullptr, mjCDef* = nullptr); + mjCTendon(const mjCTendon& other); + mjCTendon& operator=(const mjCTendon& other); + ~mjCTendon(); + mjsTendon spec; using mjCBase::name; using mjCBase::classname; @@ -1279,11 +1285,6 @@ class mjCTendon : public mjCTendon_, private mjsTendon { bool is_limited() const; private: - mjCTendon(mjCModel* = 0, mjCDef* = 0); // constructor - mjCTendon(const mjCTendon& other); // copy constructor - mjCTendon& operator=(const mjCTendon& other); // copy assignment - ~mjCTendon(); // destructor - void Compile(void); // compiler }; @@ -1342,14 +1343,13 @@ class mjCPlugin : public mjCPlugin_ { friend class mjXWriter; public: + mjCPlugin(mjCModel*); + mjCPlugin(const mjCPlugin& other); + mjCPlugin& operator=(const mjCPlugin& other); mjsPlugin spec; mjCBase* parent; // parent object (only used when generating error message) - mjCPlugin(const mjCPlugin& other); // copy constructor private: - mjCPlugin(mjCModel*); // constructor - mjCPlugin& operator=(const mjCPlugin& other); // copy assignment - void Compile(void); // compiler }; @@ -1381,6 +1381,10 @@ class mjCActuator : public mjCActuator_, private mjsActuator { friend class mjXWriter; public: + mjCActuator(mjCModel* = nullptr, mjCDef* = nullptr); + mjCActuator(const mjCActuator& other); + mjCActuator& operator=(const mjCActuator& other); + mjsActuator spec; using mjCBase::name; using mjCBase::classname; @@ -1397,10 +1401,6 @@ class mjCActuator : public mjCActuator_, private mjsActuator { bool is_actlimited() const; private: - mjCActuator(mjCModel* = 0, mjCDef* = 0); // constructor - mjCActuator(const mjCActuator& other); // copy constructor - mjCActuator& operator=(const mjCActuator& other); // copy assignment - void Compile(void); // compiler void CopyFromSpec(); void PointToLocal(); @@ -1436,6 +1436,10 @@ class mjCSensor : public mjCSensor_, private mjsSensor { friend class mjXWriter; public: + mjCSensor(mjCModel*); + mjCSensor(const mjCSensor& other); + mjCSensor& operator=(const mjCSensor& other); + mjsSensor spec; using mjCBase::name; using mjCBase::classname; @@ -1447,10 +1451,6 @@ class mjCSensor : public mjCSensor_, private mjsSensor { const std::string& get_refname() { return spec_refname_; } private: - mjCSensor(mjCModel*); // constructor - mjCSensor(const mjCSensor& other); // copy constructor - mjCSensor& operator=(const mjCSensor& other); // copy assignment - void Compile(void); // compiler void CopyFromSpec(); void PointToLocal(); @@ -1477,6 +1477,11 @@ class mjCNumeric : public mjCNumeric_, private mjsNumeric { friend class mjXWriter; public: + mjCNumeric(mjCModel*); + mjCNumeric(const mjCNumeric& other); + mjCNumeric& operator=(const mjCNumeric& other); + ~mjCNumeric(); + mjsNumeric spec; using mjCBase::name; using mjCBase::info; @@ -1485,11 +1490,6 @@ class mjCNumeric : public mjCNumeric_, private mjsNumeric { void CopyFromSpec(); private: - mjCNumeric(mjCModel*); // constructor - mjCNumeric(const mjCNumeric& other); // copy constructor - mjCNumeric& operator=(const mjCNumeric& other); // copy assignment - ~mjCNumeric(); // destructor - void Compile(void); // compiler }; @@ -1509,6 +1509,11 @@ class mjCText : public mjCText_, private mjsText { friend class mjXWriter; public: + mjCText(mjCModel*); + mjCText(const mjCText& other); + mjCText& operator=(const mjCText& other); + ~mjCText(); + mjsText spec; using mjCBase::name; using mjCBase::info; @@ -1517,11 +1522,6 @@ class mjCText : public mjCText_, private mjsText { void CopyFromSpec(); private: - mjCText(mjCModel*); // constructor - mjCText(const mjCText& other); // copy constructor - mjCText& operator=(const mjCText& other); // copy assignment - ~mjCText(); // destructor - void Compile(void); // compiler }; @@ -1546,6 +1546,11 @@ class mjCTuple : public mjCTuple_, private mjsTuple { friend class mjXWriter; public: + mjCTuple(mjCModel*); + mjCTuple(const mjCTuple& other); + mjCTuple& operator=(const mjCTuple& other); + ~mjCTuple(); + mjsTuple spec; using mjCBase::name; using mjCBase::info; @@ -1556,11 +1561,6 @@ class mjCTuple : public mjCTuple_, private mjsTuple { void NameSpace(const mjCModel* m); private: - mjCTuple(mjCModel*); // constructor - mjCTuple(const mjCTuple& other); // copy constructor - mjCTuple& operator=(const mjCTuple& other); // copy assignment - ~mjCTuple(); // destructor - void Compile(void); // compiler }; @@ -1590,6 +1590,11 @@ class mjCKey : public mjCKey_, private mjsKey { friend class mjXWriter; public: + mjCKey(mjCModel*); + mjCKey(const mjCKey& other); + mjCKey& operator=(const mjCKey& other); + ~mjCKey(); + mjsKey spec; using mjCBase::name; using mjCBase::info; @@ -1598,11 +1603,6 @@ class mjCKey : public mjCKey_, private mjsKey { void CopyFromSpec(); private: - mjCKey(mjCModel*); // constructor - mjCKey(const mjCKey& other); // copy constructor - mjCKey& operator=(const mjCKey& other); // copy assignment - ~mjCKey(); // destructor - void Compile(const mjModel* m); // compiler }; diff --git a/src/xml/xml_native_writer.cc b/src/xml/xml_native_writer.cc index b24a6824..3ebc2718 100644 --- a/src/xml/xml_native_writer.cc +++ b/src/xml/xml_native_writer.cc @@ -806,7 +806,7 @@ string mjXWriter::Write(char *error, size_t error_sz) { Visual(root); Statistic(root); writingdefaults = true; - Default(root, model->defaults[0]); + Default(root, model->Defaults()[0]); writingdefaults = false; Extension(root); Custom(root); @@ -1136,7 +1136,7 @@ void mjXWriter::Default(XMLElement* root, mjCDef* def) { // pointer to parent defaults mjCDef* par; if (def->parentid>=0) { - par = model->defaults[def->parentid]; + par = model->Defaults()[def->parentid]; } else { par = new mjCDef; } @@ -1209,7 +1209,7 @@ void mjXWriter::Default(XMLElement* root, mjCDef* def) { // add children recursively for (int i=0; i<(int)def->childid.size(); i++) { - Default(section, model->defaults[def->childid[i]]); + Default(section, model->Defaults()[def->childid[i]]); } // delete parent defaults if allocated here @@ -1223,7 +1223,7 @@ void mjXWriter::Default(XMLElement* root, mjCDef* def) { // extension section void mjXWriter::Extension(XMLElement* root) { // skip section if there is no required plugin - if (model->active_plugins.empty()) { + if (model->ActivePlugins().empty()) { return; } @@ -1236,7 +1236,7 @@ void mjXWriter::Extension(XMLElement* root) { // write all plugins const mjpPlugin* last_plugin = nullptr; XMLElement* plugin_elem = nullptr; - for (int i = 0; i < model->plugins.size(); ++i) { + for (int i = 0; i < model->Plugins().size(); ++i) { mjCPlugin* pp = static_cast(model->GetObject(mjOBJ_PLUGIN, i)); if (pp->name.empty()) { @@ -1273,7 +1273,7 @@ void mjXWriter::Extension(XMLElement* root) { } // write elements for plugins without explicit instances - for (const auto& [plugin, slot] : model->active_plugins) { + for (const auto& [plugin, slot] : model->ActivePlugins()) { if (seen_plugins.find(plugin) == seen_plugins.end()) { plugin_elem = InsertEnd(section, "plugin"); WriteAttrTxt(plugin_elem, "plugin", plugin->name); @@ -1755,7 +1755,7 @@ void mjXWriter::Sensor(XMLElement* root) { // write all sensors for (int i=0; isensors[i]; + mjCSensor* psen = model->Sensors()[i]; std::string instance_name = ""; std::string plugin_name = ""; @@ -1994,7 +1994,7 @@ void mjXWriter::Keyframe(XMLElement* root) { XMLElement* elem = InsertEnd(section, "key"); bool change = false; - mjCKey* pk = model->keys[i]; + mjCKey* pk = model->Keys()[i]; // check name and write if (!pk->name.empty()) { @@ -2038,8 +2038,8 @@ void mjXWriter::Keyframe(XMLElement* root) { // check mpos and write if (model->nmocap) { for (int j=0; jnbody; j++) { - if (model->bodies[j]->mocap) { - mjCBody* pb = model->bodies[j]; + if (model->Bodies()[j]->mocap) { + mjCBody* pb = model->Bodies()[j]; int id = pb->mocapid; if (pb->pos[0] != pk->mpos_[3*id] || pb->pos[1] != pk->mpos_[3*id+1] || @@ -2055,8 +2055,8 @@ void mjXWriter::Keyframe(XMLElement* root) { // check mquat and write if (model->nmocap) { for (int j=0; jnbody; j++) { - if (model->bodies[j]->mocap) { - mjCBody* pb = model->bodies[j]; + if (model->Bodies()[j]->mocap) { + mjCBody* pb = model->Bodies()[j]; int id = pb->mocapid; if (pb->quat[0] != pk->mquat_[4*id] || pb->quat[1] != pk->mquat_[4*id+1] ||