diff --git a/src/user/user_model.h b/src/user/user_model.h index d6610a60..730c9dd1 100644 --- a/src/user/user_model.h +++ b/src/user/user_model.h @@ -15,6 +15,7 @@ #ifndef MUJOCO_SRC_USER_USER_MODEL_H_ #define MUJOCO_SRC_USER_USER_MODEL_H_ +#include #include #include #include @@ -32,16 +33,12 @@ typedef std::map > mjKeyMap; typedef std::array mjListKeyMap; - - -//---------------------------------- class mjCModel ------------------------------------------------ // mjCModel contains everything needed to generate the low-level model. // It can be constructed manually by calling 'Add' functions and setting // the public fields of the various objects. Alternatively it can constructed // by loading an XML file via mjCXML. Once an mjCModel object is // constructed, 'Compile' can be called to generate the corresponding mjModel object // (which is the low-level model). The mjCModel object can then be deleted. - class mjCModel : private mjmModel { friend class mjCBody; friend class mjCCamera; @@ -63,98 +60,99 @@ class mjCModel : private mjmModel { friend class mjXWriter; public: - mjCModel(); // constructor - ~mjCModel(); // destructor - void CopyFromSpec(); // copy spec to private attributes + mjCModel(); + ~mjCModel(); + void CopyFromSpec(); // copy spec to private attributes void PointToLocal(); mjmModel spec; - mjModel* Compile(const mjVFS* vfs = 0); // COMPILER: construct mjModel - bool CopyBack(const mjModel*); // DECOMPILER: copy numeric back - void FuseStatic(void); // fuse static bodies with parent - void FuseReindex(mjCBody* body); // reindex elements during fuse + mjModel* Compile(const mjVFS* vfs = nullptr); // construct mjModel + bool CopyBack(const mjModel*); // DECOMPILER: copy numeric back + void FuseStatic(); // fuse static bodies with parent + void FuseReindex(mjCBody* body); // reindex elements during fuse + // API for adding model elements + mjCFlex* AddFlex(); + mjCMesh* AddMesh(mjCDef* def = nullptr); + mjCSkin* AddSkin(); + mjCHField* AddHField(); + mjCTexture* AddTexture(); + mjCMaterial* AddMaterial(mjCDef* def = nullptr); + mjCPair* AddPair(mjCDef* def = nullptr); // geom pair for inclusion + mjCBodyPair* AddExclude(); // body pair for exclusion + mjCEquality* AddEquality(mjCDef* def = nullptr); // equality constraint + mjCTendon* AddTendon(mjCDef* def = nullptr); + mjCActuator* AddActuator(mjCDef* def = nullptr); + mjCSensor* AddSensor(); + mjCNumeric* AddNumeric(); + mjCText* AddText(); + mjCTuple* AddTuple(); + mjCKey* AddKey(); + mjCPlugin* AddPlugin(); - //------------------------ API for adding model elements - mjCFlex* AddFlex(void); // flex - mjCMesh* AddMesh(mjCDef* def = 0); // mesh - mjCSkin* AddSkin(void); // skin - mjCHField* AddHField(void); // heightfield - mjCTexture* AddTexture(void); // texture - mjCMaterial* AddMaterial(mjCDef* def = 0); // material - mjCPair* AddPair(mjCDef* def = 0); // geom pair for inclusion - mjCBodyPair* AddExclude(void); // body pair for exclusion - mjCEquality* AddEquality(mjCDef* def = 0); // equality constraint - mjCTendon* AddTendon(mjCDef* def = 0); // tendon - mjCActuator* AddActuator(mjCDef* def = 0); // actuator - mjCSensor* AddSensor(void); // sensor - mjCNumeric* AddNumeric(void); // custom numeric - mjCText* AddText(void); // custom text - mjCTuple* AddTuple(void); // custom tuple - mjCKey* AddKey(void); // keyframe - mjCPlugin* AddPlugin(void); // plugin instance + // delete elements marked as discard=true + template void Delete(std::vector& elements, + const std::vector& discard); - //------------------------ API for deleting model elements - template - void Delete(std::vector& elements, - const std::vector& discard); // delete elements marked as discard=true + // delete all elements + template void DeleteAll(std::vector& elements); - template - void DeleteAll(std::vector& elements); // delete all elements + // API for access to model elements (outside tree) + int NumObjects(mjtObj type); // number of objects in specified list + mjCBase* GetObject(mjtObj type, int id); // pointer to specified object - //------------------------ API for access to model elements (outside tree) - int NumObjects(mjtObj type); // number of objects in specified list - mjCBase* GetObject(mjtObj type, int id); // pointer to specified object + // API for access to other variables + bool IsCompiled(); // is model already compiled + int GetFixed(); // number of fixed massless bodies + mjCError GetError(); // copy of error object + mjCBody* GetWorld(); // pointer to world body + mjCDef* FindDef(std::string name); // find default class name + mjCDef* AddDef(std::string name, int parentid); // add default class to array + mjCBase* FindObject(mjtObj type, std::string name); // find object given type and name + bool IsNullPose(const mjtNum* pos, const mjtNum* quat); // detect null pose - //------------------------ API for access to other variables - bool IsCompiled(void); // is model already compiled - int GetFixed(void); // number of fixed massless bodies - mjCError GetError(void); // copy of error object - mjCBody* GetWorld(void); // pointer to world body - mjCDef* FindDef(std::string name); // find default class name - mjCDef* AddDef(std::string name, int parentid); // add default class to array - mjCBase* FindObject(mjtObj type, std::string name); // find object given type and name - bool IsNullPose(const mjtNum* pos, const mjtNum* quat); // detect null pose - - //------------------------ getters + // accessors std::string get_meshdir(void) const { return meshdir_; } std::string get_texturedir(void) const { return texturedir_; } - //------------------------ API for plugins - void ResolvePlugin(mjCBase* obj, // resolve plugin instance, create a new one if needed - const std::string& plugin_name, - const std::string& plugin_instance_name, - mjCPlugin** plugin_instance); + // 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; - //------------------------ global data - std::vector defaults; // settings for each defaults class - std::vector> active_plugins; // list of active plugins + // list of active plugins + std::vector> active_plugins; private: void TryCompile(mjModel*& m, mjData*& d, const mjVFS* vfs); mjModel* _Compile(const mjVFS* vfs); - void Clear(void); // clear objects allocated by Compile + // clear objects allocated by Compile + void Clear(void); - template // add object of any type - T* AddObject(std::vector& list, std::string type); + // add object of any type + template T* AddObject(std::vector& list, std::string type); - template // add object of any type, with def parameter - T* AddObjectDef(std::vector& list, std::string type, mjCDef* def); + // add object of any type, with def parameter + template T* AddObjectDef(std::vector& list, std::string type, + mjCDef* def); - template // if asset name is missing, set to filename - void SetDefaultNames(std::vector& assets); + // if asset name is missing, set to filename + template void SetDefaultNames(std::vector& assets); - template // delete material from object - void DeleteMaterial(std::vector& list, std::string_view name = ""); + // delete material from object + template void DeleteMaterial(std::vector& list, + std::string_view name = ""); - //------------------------ compile phases + // compile phases void MakeLists(mjCBody* body); // make lists of bodies, geoms, joints, sites void IndexAssets(bool discard); // convert asset names into indices - void CheckEmptyNames(void); // check empty names - void SetSizes(void); // compute sizes + void CheckEmptyNames(); // check empty names + void SetSizes(); // compute sizes void AutoSpringDamper(mjModel*); // automatic stiffness and damping computation void LengthRange(mjModel*, mjData*); // compute actuator lengthrange void CopyNames(mjModel*); // copy names, compute name addresses @@ -162,71 +160,69 @@ class mjCModel : private mjmModel { void CopyObjects(mjModel*); // copy objects outside kinematic tree void CopyTree(mjModel*); // copy objects inside kinematic tree - //------------------------ sizes // sizes set from object list lengths - int nbody; // number of bodies - int njnt; // number of joints - int ngeom; // number of geoms - int nsite; // number of sites - int ncam; // number of cameras - int nlight; // number of lights - int nflex; // number of flexes - int nmesh; // number of meshes - int nskin; // number of skins - int nhfield; // number of height fields - int ntex; // number of textures - int nmat; // number of materials - int npair; // number of geom pairs in pair array - int nexclude; // number of excluded body pairs - int neq; // number of equality constraints - int ntendon; // number of tendons - int nsensor; // number of sensors - int nnumeric; // number of numeric fields - int ntext; // number of text fields - int ntuple; // number of tuple fields - int nmocap; // number of mocap bodies - int nplugin; // number of plugin instances + int nbody; // number of bodies + int njnt; // number of joints + int ngeom; // number of geoms + int nsite; // number of sites + int ncam; // number of cameras + int nlight; // number of lights + int nflex; // number of flexes + int nmesh; // number of meshes + int nskin; // number of skins + int nhfield; // number of height fields + int ntex; // number of textures + int nmat; // number of materials + int npair; // number of geom pairs in pair array + int nexclude; // number of excluded body pairs + int neq; // number of equality constraints + int ntendon; // number of tendons + int nsensor; // number of sensors + int nnumeric; // number of numeric fields + int ntext; // number of text fields + int ntuple; // number of tuple fields + int nmocap; // number of mocap bodies + int nplugin; // number of plugin instances // sizes computed by Compile - int nq; // number of generalized coordinates = dim(qpos) - int nv; // number of degrees of freedom = dim(qvel) - int nu; // number of actuators/controls - int na; // number of activation variables - int nbvh; // number of total boundary volume hierarchies - int nbvhstatic; // number of static boundary volume hierarchies - int nbvhdynamic; // number of dynamic boundary volume hierarchies - int nflexvert; // number of vertices in all flexes - int nflexedge; // number of edges in all flexes - int nflexelem; // number of elements in all flexes - int nflexelemdata; // number of element vertex ids in all flexes - int nflexshelldata; // number of shell fragment vertex ids in all flexes - int nflexevpair; // number of element-vertex pairs in all flexes - int nflextexcoord; // number of vertex texture coordinates in all flexes - int nmeshvert; // number of vertices in all meshes - int nmeshnormal; // number of normals in all meshes - int nmeshtexcoord; // number of texture coordinates in all meshes - int nmeshface; // number of triangular faces in all meshes - int nmeshgraph; // number of shorts in mesh auxiliary data - int nskinvert; // number of vertices in all skins - int nskintexvert; // number of vertices with texcoord in all skins - int nskinface; // number of faces in all skins - int nskinbone; // number of bones in all skins - int nskinbonevert; // number of vertices in all skins - int nhfielddata; // number of data points in all hfields - int ntexdata; // number of texture bytes - int nwrap; // number of wrap objects in all tendon paths - int nsensordata; // number of mjtNums in sensor data vector - int nnumericdata; // number of mjtNums in all custom fields - int ntextdata; // number of chars in all text fields, including 0 - int ntupledata; // number of objects in all tuple fields - int npluginattr; // number of chars in all plugin config attributes - int nnames; // number of chars in all names - int npaths; // number of chars in all paths - int nM; // number of non-zeros in sparse inertia matrix - int nD; // number of non-zeros in sparse dof-dof matrix - int nB; // number of non-zeros in sparse body-dof matrix + int nq; // number of generalized coordinates = dim(qpos) + int nv; // number of degrees of freedom = dim(qvel) + int nu; // number of actuators/controls + int na; // number of activation variables + int nbvh; // number of total boundary volume hierarchies + int nbvhstatic; // number of static boundary volume hierarchies + int nbvhdynamic; // number of dynamic boundary volume hierarchies + int nflexvert; // number of vertices in all flexes + int nflexedge; // number of edges in all flexes + int nflexelem; // number of elements in all flexes + int nflexelemdata; // number of element vertex ids in all flexes + int nflexshelldata; // number of shell fragment vertex ids in all flexes + int nflexevpair; // number of element-vertex pairs in all flexes + int nflextexcoord; // number of vertex texture coordinates in all flexes + int nmeshvert; // number of vertices in all meshes + int nmeshnormal; // number of normals in all meshes + int nmeshtexcoord; // number of texture coordinates in all meshes + int nmeshface; // number of triangular faces in all meshes + int nmeshgraph; // number of shorts in mesh auxiliary data + int nskinvert; // number of vertices in all skins + int nskintexvert; // number of vertices with texcoord in all skins + int nskinface; // number of faces in all skins + int nskinbone; // number of bones in all skins + int nskinbonevert; // number of vertices in all skins + int nhfielddata; // number of data points in all hfields + int ntexdata; // number of texture bytes + int nwrap; // number of wrap objects in all tendon paths + int nsensordata; // number of mjtNums in sensor data vector + int nnumericdata; // number of mjtNums in all custom fields + int ntextdata; // number of chars in all text fields, including 0 + int ntupledata; // number of objects in all tuple fields + int npluginattr; // number of chars in all plugin config attributes + int nnames; // number of chars in all names + int npaths; // number of chars in all paths + int nM; // number of non-zeros in sparse inertia matrix + int nD; // number of non-zeros in sparse dof-dof matrix + int nB; // number of non-zeros in sparse body-dof matrix - //------------------------ object lists // objects created here std::vector flexes; // list of flexes std::vector meshes; // list of meshes @@ -254,25 +250,24 @@ class mjCModel : private mjmModel { std::vector cameras; // list of cameras std::vector lights; // list of lights - //------------------------ internal variables - // array of pointers to each object list (enumerated by type) std::array*, mjNOBJECT> object_lists; // statistics, as computed by mj_setConst - double meaninertia_auto; // mean diagonal inertia, as computed by mj_setConst - double meanmass_auto; // mean body mass, as computed by mj_setConst - double meansize_auto; // mean body size, as computed by mj_setConst - double extent_auto; // spatial extent, as computed by mj_setConst - double center_auto[3]; // center of model, as computed by mj_setConst + double meaninertia_auto; // mean diagonal inertia, as computed by mj_setConst + double meanmass_auto; // mean body mass, as computed by mj_setConst + double meansize_auto; // mean body size, as computed by mj_setConst + double extent_auto; // spatial extent, as computed by mj_setConst + double center_auto[3]; // center of model, as computed by mj_setConst - // map from object names to ids - mjListKeyMap ids; - bool compiled; // already compiled flag (cannot be compiled again) - mjCError errInfo; // last error info - int fixCount; // how many bodies have been fixed - std::vector qpos0; // save qpos0, to recognize changed key_qpos in write + mjListKeyMap ids; // map from object names to ids + bool compiled; // already compiled flag (cannot be compiled again) + mjCError errInfo; // last error info + int fixCount; // how many bodies have been fixed + + // save qpos0, to recognize changed key_qpos in write + std::vector qpos0; // variable-size attributes std::string comment_; // comment at top of XML