From 7a98038e88e48aad3fef4f47038eb8d5112fde51 Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Wed, 31 Jan 2024 08:06:50 -0800 Subject: [PATCH] Move mjCSite attributes to mjmSite struct. PiperOrigin-RevId: 603051589 Change-Id: I31eeeccffa15b96e7393b8e64f6be8c964fc5948 --- src/user/user_composite.cc | 10 +++++----- src/user/user_model.cc | 5 +++-- src/user/user_model.h | 4 ++++ src/user/user_objects.cc | 34 +++++++++++++++++++++++----------- src/user/user_objects.h | 22 +++++++++++++--------- src/xml/xml_native_reader.cc | 18 ++++++++++-------- 6 files changed, 58 insertions(+), 35 deletions(-) diff --git a/src/user/user_composite.cc b/src/user/user_composite.cc index b82fb680..806593df 100644 --- a/src/user/user_composite.cc +++ b/src/user/user_composite.cc @@ -137,7 +137,7 @@ void mjCComposite::SetDefault(void) { // set all deafult groups to 3 for (int i=0; iAddSite(def); s->def = body->def; - s->type = mjGEOM_SPHERE; + s->spec.type = mjGEOM_SPHERE; mju::sprintf_arr(txt, "%sS%d", prefix.c_str(), i); s->name = txt; @@ -607,7 +607,7 @@ bool mjCComposite::MakeGrid(mjCModel* model, mjCBody* body, char* error, int err // add site mjCSite* s = b->AddSite(def); s->def = body->def; - s->type = mjGEOM_SPHERE; + s->spec.type = mjGEOM_SPHERE; mju::sprintf_arr(txt, "%sS%d_%d", prefix.c_str(), ix, iy); s->name = txt; @@ -871,8 +871,8 @@ mjCBody* mjCComposite::AddCableBody(mjCModel* model, mjCBody* body, int ix, mjtN mjCSite* site = body->AddSite(def); site->def = body->def; site->name = txt_site; - mjuu_setvec(site->pos, last ? length : 0, 0, 0); - mjuu_setvec(site->quat, 1, 0, 0, 0); + mjuu_setvec(site->spec.pos, last ? length : 0, 0, 0); + mjuu_setvec(site->spec.quat, 1, 0, 0, 0); } return body; diff --git a/src/user/user_model.cc b/src/user/user_model.cc index 95f671a6..d504eabc 100644 --- a/src/user/user_model.cc +++ b/src/user/user_model.cc @@ -651,7 +651,7 @@ void mjCModel::MakeLists(mjCBody* body) { // delete material with given name or all materials if the name is omitted template -static void DeleteMaterial(std::vector& list, std::string_view name = "") { +void mjCModel::DeleteMaterial(std::vector& list, std::string_view name) { for (T* plist : list) { if (name.empty() || plist->material == name) { plist->material.clear(); @@ -660,6 +660,7 @@ static void DeleteMaterial(std::vector& list, std::string_view name = "") { } + // delete texture with given name or all textures if the name is omitted template static void DeleteTexture(std::vector& list, std::string_view name = "") { @@ -2900,7 +2901,7 @@ void mjCModel::TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs) { if (nuser_site == -1) { nuser_site = 0; for (int i=0; iuserdata.size()); + nuser_site = mjMAX(nuser_site, sites[i]->spec.userdata.size()); } } if (nuser_cam == -1) { diff --git a/src/user/user_model.h b/src/user/user_model.h index 082f4644..5287eb2c 100644 --- a/src/user/user_model.h +++ b/src/user/user_model.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -192,6 +193,9 @@ class mjCModel { template // if asset name is missing, set to filename void SetDefaultNames(std::vector& assets); + template // delete material from object + void DeleteMaterial(std::vector& list, std::string_view name = ""); + //------------------------ compile phases void MakeLists(mjCBody* body); // make lists of bodies, geoms, joints, sites void IndexAssets(bool discard); // convert asset names into indices diff --git a/src/user/user_objects.cc b/src/user/user_objects.cc index 6c30e7d2..6db1c8f1 100644 --- a/src/user/user_objects.cc +++ b/src/user/user_objects.cc @@ -1926,24 +1926,28 @@ void mjCGeom::Compile(void) { // initialize default site mjCSite::mjCSite(mjCModel* _model, mjCDef* _def) { // set defaults - type = mjGEOM_SPHERE; - mjuu_setvec(size, 0.005, 0.005, 0.005); - group = 0; - mjuu_setvec(quat, 1, 0, 0, 0); - mjuu_setvec(pos, 0, 0, 0); - material.clear(); - rgba[0] = rgba[1] = rgba[2] = 0.5f; - rgba[3] = 1.0f; - fromto[0] = mjNAN; - userdata.clear(); + spec.type = mjGEOM_SPHERE; + mjuu_setvec(spec.size, 0.005, 0.005, 0.005); + spec.group = 0; + mjuu_setvec(spec.quat, 1, 0, 0, 0); + mjuu_setvec(spec.pos, 0, 0, 0); + spec.material.clear(); + spec.rgba[0] = spec.rgba[1] = spec.rgba[2] = 0.5f; + spec.rgba[3] = 1.0f; + spec.fromto[0] = mjNAN; + spec.userdata.clear(); // clear internal variables - material.clear(); + spec.material.clear(); body = 0; matid = -1; + // initialize private attributes + CopyFromSpec(); + // reset to default if given if (_def) { + _def->site.CopyFromSpec(); *this = _def->site; } @@ -1954,8 +1958,16 @@ mjCSite::mjCSite(mjCModel* _model, mjCDef* _def) { +void mjCSite::CopyFromSpec() { + *static_cast(this) = spec; +} + + + // compiler void mjCSite::Compile(void) { + CopyFromSpec(); + // resize userdata if (userdata.size() > model->nuser_site) { throw mjCError(this, "user has more values than nuser_site in site '%s' (id = %d)", diff --git a/src/user/user_objects.h b/src/user/user_objects.h index 7b5fb265..5d0daff3 100644 --- a/src/user/user_objects.h +++ b/src/user/user_objects.h @@ -455,15 +455,7 @@ class mjCGeom : public mjCBase { //------------------------- class mjCSite ---------------------------------------------------------- // Describes a site on a body -class mjCSite : public mjCBase { - friend class mjCDef; - friend class mjCBody; - friend class mjCModel; - friend class mjXWriter; - friend class mjXURDF; - - public: - // variables set by user +typedef struct _mjmSite { mjtGeom type; // geom type for rendering int group; // group id, used for visualization double size[3]; // geom size for rendering @@ -474,11 +466,23 @@ class mjCSite : public mjCBase { float rgba[4]; // rgba when material is omitted double fromto[6]; // alternative for capsule, cylinder, box, ellipsoid mjCAlternative alt; // alternative orientation specification +} mjmSite; + +class mjCSite : public mjCBase, private mjmSite { + friend class mjCDef; + friend class mjCBody; + friend class mjCModel; + friend class mjXWriter; + friend class mjXURDF; + + public: + mjmSite spec; // variables set by user // variables computed by 'compile' and 'mjCBody::addSite' private: mjCSite(mjCModel* = 0, mjCDef* = 0); // constructor void Compile(void); // compiler + void CopyFromSpec(); // copy spec into attributes mjCBody* body; // site's body int matid; // material id for rendering diff --git a/src/xml/xml_native_reader.cc b/src/xml/xml_native_reader.cc index 79cfdbf5..6df5e7a5 100644 --- a/src/xml/xml_native_reader.cc +++ b/src/xml/xml_native_reader.cc @@ -1563,13 +1563,14 @@ void mjXReader::OneGeom(XMLElement* elem, mjCGeom* pgeom) { // site element parser -void mjXReader::OneSite(XMLElement* elem, mjCSite* psite) { +void mjXReader::OneSite(XMLElement* elem, mjCSite* site) { int n; string text; + mjmSite* psite = &site->spec; // read attributes - ReadAttrTxt(elem, "name", psite->name); - ReadAttrTxt(elem, "class", psite->classname); + ReadAttrTxt(elem, "name", site->name); + ReadAttrTxt(elem, "class", site->classname); if (MapValue(elem, "type", &n, geom_map, mjNGEOMTYPES)) { psite->type = (mjtGeom)n; } @@ -1585,7 +1586,7 @@ void mjXReader::OneSite(XMLElement* elem, mjCSite* psite) { // read userdata ReadVector(elem, "user", psite->userdata, text); - GetXMLPos(elem, psite); + GetXMLPos(elem, site); } @@ -2166,10 +2167,11 @@ void mjXReader::OneComposite(XMLElement* elem, mjCBody* pbody, mjCDef* def) { // site XMLElement* esite = elem->FirstChildElement("site"); if (esite) { - ReadAttr(esite, "size", 3, comp.def[0].site.size, text, false, false); - ReadAttrInt(esite, "group", &comp.def[0].site.group); - ReadAttrTxt(esite, "material", comp.def[0].site.material); - ReadAttr(esite, "rgba", 4, comp.def[0].site.rgba, text); + mjmSite& dsite = comp.def[0].site.spec; + ReadAttr(esite, "size", 3, dsite.size, text, false, false); + ReadAttrInt(esite, "group", &dsite.group); + ReadAttrTxt(esite, "material", dsite.material); + ReadAttr(esite, "rgba", 4, dsite.rgba, text); } // joint