Expose a handle for the Python viewer.

This change also requires user scripts to explicitly synchronize changes to physics state to the viewer. The Simulate class was reconfigured so that certain UI events are handled during this sync operation, outside of the render loop on the main thread. These correspond to operations that require access to the full mjModel/mjData.

To support other, more interactive operations (e.g. camera movements), a new mjvSceneState struct is introduced which captures only the portion of the physics state required for scene re-rendering. The mjvSceneState is updated from mjModel/mjData during the viewer sync operation, and is significantly cheaper than a full mj_copyModel and mj_copyData.

Fixes https://github.com/deepmind/mujoco/issues/796

PiperOrigin-RevId: 525723636
Change-Id: Id08d0210a2c067d5afe85e2bf104f276aeddd75e
This commit is contained in:
Saran Tunyasuvunakool
2023-04-20 05:58:32 -07:00
committed by Copybara-Service
parent 4f5da9c554
commit b362cb4972
34 changed files with 4644 additions and 1088 deletions
-1
View File
@@ -447,7 +447,6 @@ struct mjVisual_ { // visualization options
float realtime; // initial real-time factor (1: real time)
int offwidth; // width of offscreen buffer
int offheight; // height of offscreen buffer
int treedepth; // depth of the bounding volume hierarchy
int ellipsoidinertia; // geom for inertia visualization (0: box, 1: ellipsoid)
} global;
+220
View File
@@ -15,6 +15,8 @@
#ifndef MUJOCO_MJVISUALIZE_H_
#define MUJOCO_MJVISUALIZE_H_
#include <mujoco/mjdata.h>
#include <mujoco/mjmodel.h>
#include <mujoco/mjtnum.h>
@@ -265,6 +267,7 @@ struct mjvOption_ { // abstract visualization options
mjtByte actuatorgroup[mjNGROUP]; // actuator visualization by group
mjtByte skingroup[mjNGROUP]; // skin visualization by group
mjtByte flags[mjNVISFLAG]; // visualization flags (indexed by mjtVisFlag)
int bvh_depth; // depth of the bounding volume hierarchy to be visualized
};
typedef struct mjvOption_ mjvOption;
@@ -360,4 +363,221 @@ struct mjvFigure_ { // abstract 2D figure passed to OpenGL rendere
};
typedef struct mjvFigure_ mjvFigure;
//---------------------------------- mjvSceneState -------------------------------------------------
struct mjvSceneState_ {
int nbuffer; // size of the buffer in bytes
void* buffer; // heap-allocated memory for all arrays in this struct
int maxgeom; // maximum number of mjvGeom supported by this state object
mjvScene plugincache; // scratch space for vis geoms inserted by plugins
// fields in mjModel that are necessary to re-render a scene
struct {
int nu;
int na;
int nbody;
int nbvh;
int njnt;
int ngeom;
int nsite;
int ncam;
int nlight;
int nmesh;
int nskin;
int nskinvert;
int nskinface;
int nskinbone;
int nskinbonevert;
int nmat;
int neq;
int ntendon;
int nwrap;
int nsensor;
int nnames;
int nsensordata;
mjOption opt;
mjVisual vis;
mjStatistic stat;
int* body_parentid;
int* body_rootid;
int* body_weldid;
int* body_mocapid;
int* body_jntnum;
int* body_jntadr;
int* body_geomnum;
int* body_geomadr;
mjtNum* body_iquat;
mjtNum* body_mass;
mjtNum* body_inertia;
int* body_bvhadr;
int* body_bvhnum;
int* bvh_depth;
int* bvh_child;
int* bvh_geomid;
mjtNum* bvh_aabb;
int* jnt_type;
int* jnt_bodyid;
int* jnt_group;
int* geom_type;
int* geom_bodyid;
int* geom_dataid;
int* geom_matid;
int* geom_group;
mjtNum* geom_size;
mjtNum* geom_aabb;
mjtNum* geom_rbound;
float* geom_rgba;
int* site_type;
int* site_bodyid;
int* site_matid;
int* site_group;
mjtNum* site_size;
float* site_rgba;
mjtNum* cam_fovy;
mjtNum* cam_ipd;
mjtByte* light_directional;
mjtByte* light_castshadow;
mjtByte* light_active;
float* light_attenuation;
float* light_cutoff;
float* light_exponent;
float* light_ambient;
float* light_diffuse;
float* light_specular;
int* mesh_texcoordadr;
int* mesh_graphadr;
int* skin_matid;
int* skin_group;
float* skin_rgba;
float* skin_inflate;
int* skin_vertadr;
int* skin_vertnum;
int* skin_texcoordadr;
int* skin_faceadr;
int* skin_facenum;
int* skin_boneadr;
int* skin_bonenum;
float* skin_vert;
int* skin_face;
int* skin_bonevertadr;
int* skin_bonevertnum;
float* skin_bonebindpos;
float* skin_bonebindquat;
int* skin_bonebodyid;
int* skin_bonevertid;
float* skin_bonevertweight;
int* mat_texid;
mjtByte* mat_texuniform;
float* mat_texrepeat;
float* mat_emission;
float* mat_specular;
float* mat_shininess;
float* mat_reflectance;
float* mat_rgba;
int* eq_type;
int* eq_obj1id;
int* eq_obj2id;
mjtByte* eq_active;
mjtNum* eq_data;
int* tendon_num;
int* tendon_matid;
int* tendon_group;
mjtByte* tendon_limited;
mjtNum* tendon_width;
mjtNum* tendon_range;
mjtNum* tendon_stiffness;
mjtNum* tendon_damping;
mjtNum* tendon_frictionloss;
mjtNum* tendon_lengthspring;
float* tendon_rgba;
int* actuator_trntype;
int* actuator_dyntype;
int* actuator_trnid;
int* actuator_actadr;
int* actuator_actnum;
int* actuator_group;
mjtByte* actuator_ctrllimited;
mjtByte* actuator_actlimited;
mjtNum* actuator_ctrlrange;
mjtNum* actuator_actrange;
mjtNum* actuator_cranklength;
int* sensor_type;
int* sensor_objid;
int* sensor_adr;
int* name_bodyadr;
int* name_jntadr;
int* name_geomadr;
int* name_siteadr;
int* name_camadr;
int* name_lightadr;
int* name_eqadr;
int* name_tendonadr;
int* name_actuatoradr;
char* names;
} model;
// fields in mjData that are necessary to re-render a scene
struct {
mjWarningStat warning[mjNWARNING];
int nefc;
int ncon;
mjtNum time;
mjtNum* act;
mjtNum* ctrl;
mjtNum* xfrc_applied;
mjtNum* sensordata;
mjtNum* xpos;
mjtNum* xquat;
mjtNum* xmat;
mjtNum* xipos;
mjtNum* ximat;
mjtNum* xanchor;
mjtNum* xaxis;
mjtNum* geom_xpos;
mjtNum* geom_xmat;
mjtNum* site_xpos;
mjtNum* site_xmat;
mjtNum* cam_xpos;
mjtNum* cam_xmat;
mjtNum* light_xpos;
mjtNum* light_xdir;
mjtNum* subtree_com;
int* ten_wrapadr;
int* ten_wrapnum;
int* wrap_obj;
mjtNum* wrap_xpos;
mjtByte* bvh_active;
mjContact* contact;
mjtNum* efc_force;
} data;
};
typedef struct mjvSceneState_ mjvSceneState;
#endif // MUJOCO_MJVISUALIZE_H_
+451 -442
View File
@@ -62,71 +62,71 @@
// int fields of mjModel
#define MJMODEL_INTS \
X( nq ) \
X( nv ) \
X( nu ) \
X( na ) \
X( nbody ) \
X( nbvh ) \
X( njnt ) \
X( ngeom ) \
X( nsite ) \
X( ncam ) \
X( nlight ) \
X( nmesh ) \
X( nmeshvert ) \
X( nmeshnormal ) \
X( nmeshtexcoord ) \
X( nmeshface ) \
X( nmeshgraph ) \
X( nskin ) \
X( nskinvert ) \
X( nskintexvert ) \
X( nskinface ) \
X( nskinbone ) \
X( nskinbonevert ) \
X( nhfield ) \
X( nhfielddata ) \
X( ntex ) \
X( ntexdata ) \
X( nmat ) \
X( npair ) \
X( nexclude ) \
X( neq ) \
X( ntendon ) \
X( nwrap ) \
X( nsensor ) \
X( nnumeric ) \
X( nnumericdata ) \
X( ntext ) \
X( ntextdata ) \
X( ntuple ) \
X( ntupledata ) \
X( nkey ) \
X( nmocap ) \
X( nplugin ) \
X( npluginattr ) \
X( nuser_body ) \
X( nuser_jnt ) \
X( nuser_geom ) \
X( nuser_site ) \
X( nuser_cam ) \
X( nuser_tendon ) \
X( nuser_actuator ) \
X( nuser_sensor ) \
X( nnames ) \
X( nnames_map ) \
X( nM ) \
X( nD ) \
X( nB ) \
X( nemax ) \
X( njmax ) \
X( nconmax ) \
X( nstack ) \
X( nuserdata ) \
X( nsensordata ) \
X( npluginstate ) \
X( nbuffer )
X ( nq ) \
X ( nv ) \
XMJV( nu ) \
XMJV( na ) \
XMJV( nbody ) \
XMJV( nbvh ) \
XMJV( njnt ) \
XMJV( ngeom ) \
XMJV( nsite ) \
XMJV( ncam ) \
XMJV( nlight ) \
XMJV( nmesh ) \
X ( nmeshvert ) \
X ( nmeshnormal ) \
X ( nmeshtexcoord ) \
X ( nmeshface ) \
X ( nmeshgraph ) \
XMJV( nskin ) \
XMJV( nskinvert ) \
X ( nskintexvert ) \
XMJV( nskinface ) \
XMJV( nskinbone ) \
XMJV( nskinbonevert ) \
X ( nhfield ) \
X ( nhfielddata ) \
X ( ntex ) \
X ( ntexdata ) \
XMJV( nmat ) \
X ( npair ) \
X ( nexclude ) \
XMJV( neq ) \
XMJV( ntendon ) \
XMJV( nwrap ) \
XMJV( nsensor ) \
X ( nnumeric ) \
X ( nnumericdata ) \
X ( ntext ) \
X ( ntextdata ) \
X ( ntuple ) \
X ( ntupledata ) \
X ( nkey ) \
X ( nmocap ) \
X ( nplugin ) \
X ( npluginattr ) \
X ( nuser_body ) \
X ( nuser_jnt ) \
X ( nuser_geom ) \
X ( nuser_site ) \
X ( nuser_cam ) \
X ( nuser_tendon ) \
X ( nuser_actuator ) \
X ( nuser_sensor ) \
XMJV( nnames ) \
X ( nnames_map ) \
X ( nM ) \
X ( nD ) \
X ( nB ) \
X ( nemax ) \
X ( njmax ) \
X ( nconmax ) \
X ( nstack ) \
X ( nuserdata ) \
XMJV( nsensordata ) \
X ( npluginstate ) \
X ( nbuffer )
// define symbols needed in MJMODEL_POINTERS (corresponding to number of columns)
@@ -151,305 +151,307 @@
// pointer fields of mjModel
// XMJV means that the field is required to construct mjvScene
// (by default we define XMJV to be the same as X)
#define MJMODEL_POINTERS \
X( mjtNum, qpos0, nq, 1 ) \
X( mjtNum, qpos_spring, nq, 1 ) \
X( int, body_parentid, nbody, 1 ) \
X( int, body_rootid, nbody, 1 ) \
X( int, body_weldid, nbody, 1 ) \
X( int, body_mocapid, nbody, 1 ) \
X( int, body_jntnum, nbody, 1 ) \
X( int, body_jntadr, nbody, 1 ) \
X( int, body_dofnum, nbody, 1 ) \
X( int, body_dofadr, nbody, 1 ) \
X( int, body_geomnum, nbody, 1 ) \
X( int, body_geomadr, nbody, 1 ) \
X( mjtByte, body_simple, nbody, 1 ) \
X( mjtByte, body_sameframe, nbody, 1 ) \
X( mjtNum, body_pos, nbody, 3 ) \
X( mjtNum, body_quat, nbody, 4 ) \
X( mjtNum, body_ipos, nbody, 3 ) \
X( mjtNum, body_iquat, nbody, 4 ) \
X( mjtNum, body_mass, nbody, 1 ) \
X( mjtNum, body_subtreemass, nbody, 1 ) \
X( mjtNum, body_inertia, nbody, 3 ) \
X( mjtNum, body_invweight0, nbody, 2 ) \
X( mjtNum, body_gravcomp, nbody, 1 ) \
X( mjtNum, body_user, nbody, MJ_M(nuser_body) ) \
X( int, body_plugin, nbody, 1 ) \
X( int, body_bvhadr, nbody, 1 ) \
X( int, body_bvhnum, nbody, 1 ) \
X( int, bvh_depth, nbvh, 1 ) \
X( int, bvh_child, nbvh, 2 ) \
X( int, bvh_geomid, nbvh, 1 ) \
X( mjtNum, bvh_aabb, nbvh, 6 ) \
X( int, jnt_type, njnt, 1 ) \
X( int, jnt_qposadr, njnt, 1 ) \
X( int, jnt_dofadr, njnt, 1 ) \
X( int, jnt_bodyid, njnt, 1 ) \
X( int, jnt_group, njnt, 1 ) \
X( mjtByte, jnt_limited, njnt, 1 ) \
X( mjtNum, jnt_solref, njnt, mjNREF ) \
X( mjtNum, jnt_solimp, njnt, mjNIMP ) \
X( mjtNum, jnt_pos, njnt, 3 ) \
X( mjtNum, jnt_axis, njnt, 3 ) \
X( mjtNum, jnt_stiffness, njnt, 1 ) \
X( mjtNum, jnt_range, njnt, 2 ) \
X( mjtNum, jnt_margin, njnt, 1 ) \
X( mjtNum, jnt_user, njnt, MJ_M(nuser_jnt) ) \
X( int, dof_bodyid, nv, 1 ) \
X( int, dof_jntid, nv, 1 ) \
X( int, dof_parentid, nv, 1 ) \
X( int, dof_Madr, nv, 1 ) \
X( int, dof_simplenum, nv, 1 ) \
X( mjtNum, dof_solref, nv, mjNREF ) \
X( mjtNum, dof_solimp, nv, mjNIMP ) \
X( mjtNum, dof_frictionloss, nv, 1 ) \
X( mjtNum, dof_armature, nv, 1 ) \
X( mjtNum, dof_damping, nv, 1 ) \
X( mjtNum, dof_invweight0, nv, 1 ) \
X( mjtNum, dof_M0, nv, 1 ) \
X( int, geom_type, ngeom, 1 ) \
X( int, geom_contype, ngeom, 1 ) \
X( int, geom_conaffinity, ngeom, 1 ) \
X( int, geom_condim, ngeom, 1 ) \
X( int, geom_bodyid, ngeom, 1 ) \
X( int, geom_dataid, ngeom, 1 ) \
X( int, geom_matid, ngeom, 1 ) \
X( int, geom_group, ngeom, 1 ) \
X( int, geom_priority, ngeom, 1 ) \
X( mjtByte, geom_sameframe, ngeom, 1 ) \
X( mjtNum, geom_solmix, ngeom, 1 ) \
X( mjtNum, geom_solref, ngeom, mjNREF ) \
X( mjtNum, geom_solimp, ngeom, mjNIMP ) \
X( mjtNum, geom_size, ngeom, 3 ) \
X( mjtNum, geom_aabb, ngeom, 6 ) \
X( mjtNum, geom_rbound, ngeom, 1 ) \
X( mjtNum, geom_pos, ngeom, 3 ) \
X( mjtNum, geom_quat, ngeom, 4 ) \
X( mjtNum, geom_friction, ngeom, 3 ) \
X( mjtNum, geom_margin, ngeom, 1 ) \
X( mjtNum, geom_gap, ngeom, 1 ) \
X( mjtNum, geom_fluid, ngeom, mjNFLUID ) \
X( mjtNum, geom_user, ngeom, MJ_M(nuser_geom) ) \
X( float, geom_rgba, ngeom, 4 ) \
X( int, site_type, nsite, 1 ) \
X( int, site_bodyid, nsite, 1 ) \
X( int, site_matid, nsite, 1 ) \
X( int, site_group, nsite, 1 ) \
X( mjtByte, site_sameframe, nsite, 1 ) \
X( mjtNum, site_size, nsite, 3 ) \
X( mjtNum, site_pos, nsite, 3 ) \
X( mjtNum, site_quat, nsite, 4 ) \
X( mjtNum, site_user, nsite, MJ_M(nuser_site) ) \
X( float, site_rgba, nsite, 4 ) \
X( int, cam_mode, ncam, 1 ) \
X( int, cam_bodyid, ncam, 1 ) \
X( int, cam_targetbodyid, ncam, 1 ) \
X( mjtNum, cam_pos, ncam, 3 ) \
X( mjtNum, cam_quat, ncam, 4 ) \
X( mjtNum, cam_poscom0, ncam, 3 ) \
X( mjtNum, cam_pos0, ncam, 3 ) \
X( mjtNum, cam_mat0, ncam, 9 ) \
X( mjtNum, cam_fovy, ncam, 1 ) \
X( mjtNum, cam_ipd, ncam, 1 ) \
X( mjtNum, cam_user, ncam, MJ_M(nuser_cam) ) \
X( int, light_mode, nlight, 1 ) \
X( int, light_bodyid, nlight, 1 ) \
X( int, light_targetbodyid, nlight, 1 ) \
X( mjtByte, light_directional, nlight, 1 ) \
X( mjtByte, light_castshadow, nlight, 1 ) \
X( mjtByte, light_active, nlight, 1 ) \
X( mjtNum, light_pos, nlight, 3 ) \
X( mjtNum, light_dir, nlight, 3 ) \
X( mjtNum, light_poscom0, nlight, 3 ) \
X( mjtNum, light_pos0, nlight, 3 ) \
X( mjtNum, light_dir0, nlight, 3 ) \
X( float, light_attenuation, nlight, 3 ) \
X( float, light_cutoff, nlight, 1 ) \
X( float, light_exponent, nlight, 1 ) \
X( float, light_ambient, nlight, 3 ) \
X( float, light_diffuse, nlight, 3 ) \
X( float, light_specular, nlight, 3 ) \
X( int, mesh_vertadr, nmesh, 1 ) \
X( int, mesh_vertnum, nmesh, 1 ) \
X( int, mesh_normaladr, nmesh, 1 ) \
X( int, mesh_normalnum, nmesh, 1 ) \
X( int, mesh_texcoordadr, nmesh, 1 ) \
X( int, mesh_texcoordnum, nmesh, 1 ) \
X( int, mesh_faceadr, nmesh, 1 ) \
X( int, mesh_facenum, nmesh, 1 ) \
X( int, mesh_graphadr, nmesh, 1 ) \
X( float, mesh_vert, nmeshvert, 3 ) \
X( float, mesh_normal, nmeshnormal, 3 ) \
X( float, mesh_texcoord, nmeshtexcoord, 2 ) \
X( int, mesh_face, nmeshface, 3 ) \
X( int, mesh_facenormal, nmeshface, 3 ) \
X( int, mesh_facetexcoord, nmeshface, 3 ) \
X( int, mesh_graph, nmeshgraph, 1 ) \
X( int, skin_matid, nskin, 1 ) \
X( int, skin_group, nskin, 1 ) \
X( float, skin_rgba, nskin, 4 ) \
X( float, skin_inflate, nskin, 1 ) \
X( int, skin_vertadr, nskin, 1 ) \
X( int, skin_vertnum, nskin, 1 ) \
X( int, skin_texcoordadr, nskin, 1 ) \
X( int, skin_faceadr, nskin, 1 ) \
X( int, skin_facenum, nskin, 1 ) \
X( int, skin_boneadr, nskin, 1 ) \
X( int, skin_bonenum, nskin, 1 ) \
X( float, skin_vert, nskinvert, 3 ) \
X( float, skin_texcoord, nskintexvert, 2 ) \
X( int, skin_face, nskinface, 3 ) \
X( int, skin_bonevertadr, nskinbone, 1 ) \
X( int, skin_bonevertnum, nskinbone, 1 ) \
X( float, skin_bonebindpos, nskinbone, 3 ) \
X( float, skin_bonebindquat, nskinbone, 4 ) \
X( int, skin_bonebodyid, nskinbone, 1 ) \
X( int, skin_bonevertid, nskinbonevert, 1 ) \
X( float, skin_bonevertweight, nskinbonevert, 1 ) \
X( mjtNum, hfield_size, nhfield, 4 ) \
X( int, hfield_nrow, nhfield, 1 ) \
X( int, hfield_ncol, nhfield, 1 ) \
X( int, hfield_adr, nhfield, 1 ) \
X( float, hfield_data, nhfielddata, 1 ) \
X( int, tex_type, ntex, 1 ) \
X( int, tex_height, ntex, 1 ) \
X( int, tex_width, ntex, 1 ) \
X( int, tex_adr, ntex, 1 ) \
X( mjtByte, tex_rgb, ntexdata, 1 ) \
X( int, mat_texid, nmat, 1 ) \
X( mjtByte, mat_texuniform, nmat, 1 ) \
X( float, mat_texrepeat, nmat, 2 ) \
X( float, mat_emission, nmat, 1 ) \
X( float, mat_specular, nmat, 1 ) \
X( float, mat_shininess, nmat, 1 ) \
X( float, mat_reflectance, nmat, 1 ) \
X( float, mat_rgba, nmat, 4 ) \
X( int, pair_dim, npair, 1 ) \
X( int, pair_geom1, npair, 1 ) \
X( int, pair_geom2, npair, 1 ) \
X( int, pair_signature, npair, 1 ) \
X( mjtNum, pair_solref, npair, mjNREF ) \
X( mjtNum, pair_solimp, npair, mjNIMP ) \
X( mjtNum, pair_margin, npair, 1 ) \
X( mjtNum, pair_gap, npair, 1 ) \
X( mjtNum, pair_friction, npair, 5 ) \
X( int, exclude_signature, nexclude, 1 ) \
X( int, eq_type, neq, 1 ) \
X( int, eq_obj1id, neq, 1 ) \
X( int, eq_obj2id, neq, 1 ) \
X( mjtByte, eq_active, neq, 1 ) \
X( mjtNum, eq_solref, neq, mjNREF ) \
X( mjtNum, eq_solimp, neq, mjNIMP ) \
X( mjtNum, eq_data, neq, mjNEQDATA ) \
X( int, tendon_adr, ntendon, 1 ) \
X( int, tendon_num, ntendon, 1 ) \
X( int, tendon_matid, ntendon, 1 ) \
X( int, tendon_group, ntendon, 1 ) \
X( mjtByte, tendon_limited, ntendon, 1 ) \
X( mjtNum, tendon_width, ntendon, 1 ) \
X( mjtNum, tendon_solref_lim, ntendon, mjNREF ) \
X( mjtNum, tendon_solimp_lim, ntendon, mjNIMP ) \
X( mjtNum, tendon_solref_fri, ntendon, mjNREF ) \
X( mjtNum, tendon_solimp_fri, ntendon, mjNIMP ) \
X( mjtNum, tendon_range, ntendon, 2 ) \
X( mjtNum, tendon_margin, ntendon, 1 ) \
X( mjtNum, tendon_stiffness, ntendon, 1 ) \
X( mjtNum, tendon_damping, ntendon, 1 ) \
X( mjtNum, tendon_frictionloss, ntendon, 1 ) \
X( mjtNum, tendon_lengthspring, ntendon, 2 ) \
X( mjtNum, tendon_length0, ntendon, 1 ) \
X( mjtNum, tendon_invweight0, ntendon, 1 ) \
X( mjtNum, tendon_user, ntendon, MJ_M(nuser_tendon) ) \
X( float, tendon_rgba, ntendon, 4 ) \
X( int, wrap_type, nwrap, 1 ) \
X( int, wrap_objid, nwrap, 1 ) \
X( mjtNum, wrap_prm, nwrap, 1 ) \
X( int, actuator_trntype, nu, 1 ) \
X( int, actuator_dyntype, nu, 1 ) \
X( int, actuator_gaintype, nu, 1 ) \
X( int, actuator_biastype, nu, 1 ) \
X( int, actuator_trnid, nu, 2 ) \
X( int, actuator_actadr, nu, 1 ) \
X( int, actuator_actnum, nu, 1 ) \
X( int, actuator_group, nu, 1 ) \
X( mjtByte, actuator_ctrllimited, nu, 1 ) \
X( mjtByte, actuator_forcelimited, nu, 1 ) \
X( mjtByte, actuator_actlimited, nu, 1 ) \
X( mjtNum, actuator_dynprm, nu, mjNDYN ) \
X( mjtNum, actuator_gainprm, nu, mjNGAIN ) \
X( mjtNum, actuator_biasprm, nu, mjNBIAS ) \
X( mjtNum, actuator_ctrlrange, nu, 2 ) \
X( mjtNum, actuator_forcerange, nu, 2 ) \
X( mjtNum, actuator_actrange, nu, 2 ) \
X( mjtNum, actuator_gear, nu, 6 ) \
X( mjtNum, actuator_cranklength, nu, 1 ) \
X( mjtNum, actuator_acc0, nu, 1 ) \
X( mjtNum, actuator_length0, nu, 1 ) \
X( mjtNum, actuator_lengthrange, nu, 2 ) \
X( mjtNum, actuator_user, nu, MJ_M(nuser_actuator) ) \
X( int, actuator_plugin, nu, 1 ) \
X( int, sensor_type, nsensor, 1 ) \
X( int, sensor_datatype, nsensor, 1 ) \
X( int, sensor_needstage, nsensor, 1 ) \
X( int, sensor_objtype, nsensor, 1 ) \
X( int, sensor_objid, nsensor, 1 ) \
X( int, sensor_reftype, nsensor, 1 ) \
X( int, sensor_refid, nsensor, 1 ) \
X( int, sensor_dim, nsensor, 1 ) \
X( int, sensor_adr, nsensor, 1 ) \
X( mjtNum, sensor_cutoff, nsensor, 1 ) \
X( mjtNum, sensor_noise, nsensor, 1 ) \
X( mjtNum, sensor_user, nsensor, MJ_M(nuser_sensor) ) \
X( int, sensor_plugin, nsensor, 1 ) \
X( int, plugin, nplugin, 1 ) \
X( int, plugin_stateadr, nplugin, 1 ) \
X( int, plugin_statenum, nplugin, 1 ) \
X( char, plugin_attr, npluginattr, 1 ) \
X( int, plugin_attradr, nplugin, 1 ) \
X( int, numeric_adr, nnumeric, 1 ) \
X( int, numeric_size, nnumeric, 1 ) \
X( mjtNum, numeric_data, nnumericdata, 1 ) \
X( int, text_adr, ntext, 1 ) \
X( int, text_size, ntext, 1 ) \
X( char, text_data, ntextdata, 1 ) \
X( int, tuple_adr, ntuple, 1 ) \
X( int, tuple_size, ntuple, 1 ) \
X( int, tuple_objtype, ntupledata, 1 ) \
X( int, tuple_objid, ntupledata, 1 ) \
X( mjtNum, tuple_objprm, ntupledata, 1 ) \
X( mjtNum, key_time, nkey, 1 ) \
X( mjtNum, key_qpos, nkey, MJ_M(nq) ) \
X( mjtNum, key_qvel, nkey, MJ_M(nv) ) \
X( mjtNum, key_act, nkey, MJ_M(na) ) \
X( mjtNum, key_mpos, nkey, MJ_M(nmocap)*3 ) \
X( mjtNum, key_mquat, nkey, MJ_M(nmocap)*4 ) \
X( mjtNum, key_ctrl, nkey, MJ_M(nu) ) \
X( int, name_bodyadr, nbody, 1 ) \
X( int, name_jntadr, njnt, 1 ) \
X( int, name_geomadr, ngeom, 1 ) \
X( int, name_siteadr, nsite, 1 ) \
X( int, name_camadr, ncam, 1 ) \
X( int, name_lightadr, nlight, 1 ) \
X( int, name_meshadr, nmesh, 1 ) \
X( int, name_skinadr, nskin, 1 ) \
X( int, name_hfieldadr, nhfield, 1 ) \
X( int, name_texadr, ntex, 1 ) \
X( int, name_matadr, nmat, 1 ) \
X( int, name_pairadr, npair, 1 ) \
X( int, name_excludeadr, nexclude, 1 ) \
X( int, name_eqadr, neq, 1 ) \
X( int, name_tendonadr, ntendon, 1 ) \
X( int, name_actuatoradr, nu, 1 ) \
X( int, name_sensoradr, nsensor, 1 ) \
X( int, name_numericadr, nnumeric, 1 ) \
X( int, name_textadr, ntext, 1 ) \
X( int, name_tupleadr, ntuple, 1 ) \
X( int, name_keyadr, nkey, 1 ) \
X( int, name_pluginadr, nplugin, 1 ) \
X( char, names, nnames, 1 ) \
X( int, names_map, nnames_map, 1 ) \
X ( mjtNum, qpos0, nq, 1 ) \
X ( mjtNum, qpos_spring, nq, 1 ) \
XMJV( int, body_parentid, nbody, 1 ) \
XMJV( int, body_rootid, nbody, 1 ) \
XMJV( int, body_weldid, nbody, 1 ) \
XMJV( int, body_mocapid, nbody, 1 ) \
XMJV( int, body_jntnum, nbody, 1 ) \
XMJV( int, body_jntadr, nbody, 1 ) \
X ( int, body_dofnum, nbody, 1 ) \
X ( int, body_dofadr, nbody, 1 ) \
XMJV( int, body_geomnum, nbody, 1 ) \
XMJV( int, body_geomadr, nbody, 1 ) \
X ( mjtByte, body_simple, nbody, 1 ) \
X ( mjtByte, body_sameframe, nbody, 1 ) \
X ( mjtNum, body_pos, nbody, 3 ) \
X ( mjtNum, body_quat, nbody, 4 ) \
X ( mjtNum, body_ipos, nbody, 3 ) \
XMJV( mjtNum, body_iquat, nbody, 4 ) \
XMJV( mjtNum, body_mass, nbody, 1 ) \
X ( mjtNum, body_subtreemass, nbody, 1 ) \
XMJV( mjtNum, body_inertia, nbody, 3 ) \
X ( mjtNum, body_invweight0, nbody, 2 ) \
X ( mjtNum, body_gravcomp, nbody, 1 ) \
X ( mjtNum, body_user, nbody, MJ_M(nuser_body) ) \
X ( int, body_plugin, nbody, 1 ) \
XMJV( int, body_bvhadr, nbody, 1 ) \
XMJV( int, body_bvhnum, nbody, 1 ) \
XMJV( int, bvh_depth, nbvh, 1 ) \
XMJV( int, bvh_child, nbvh, 2 ) \
XMJV( int, bvh_geomid, nbvh, 1 ) \
XMJV( mjtNum, bvh_aabb, nbvh, 6 ) \
XMJV( int, jnt_type, njnt, 1 ) \
X ( int, jnt_qposadr, njnt, 1 ) \
X ( int, jnt_dofadr, njnt, 1 ) \
XMJV( int, jnt_bodyid, njnt, 1 ) \
XMJV( int, jnt_group, njnt, 1 ) \
X ( mjtByte, jnt_limited, njnt, 1 ) \
X ( mjtNum, jnt_solref, njnt, mjNREF ) \
X ( mjtNum, jnt_solimp, njnt, mjNIMP ) \
X ( mjtNum, jnt_pos, njnt, 3 ) \
X ( mjtNum, jnt_axis, njnt, 3 ) \
X ( mjtNum, jnt_stiffness, njnt, 1 ) \
X ( mjtNum, jnt_range, njnt, 2 ) \
X ( mjtNum, jnt_margin, njnt, 1 ) \
X ( mjtNum, jnt_user, njnt, MJ_M(nuser_jnt) ) \
X ( int, dof_bodyid, nv, 1 ) \
X ( int, dof_jntid, nv, 1 ) \
X ( int, dof_parentid, nv, 1 ) \
X ( int, dof_Madr, nv, 1 ) \
X ( int, dof_simplenum, nv, 1 ) \
X ( mjtNum, dof_solref, nv, mjNREF ) \
X ( mjtNum, dof_solimp, nv, mjNIMP ) \
X ( mjtNum, dof_frictionloss, nv, 1 ) \
X ( mjtNum, dof_armature, nv, 1 ) \
X ( mjtNum, dof_damping, nv, 1 ) \
X ( mjtNum, dof_invweight0, nv, 1 ) \
X ( mjtNum, dof_M0, nv, 1 ) \
XMJV( int, geom_type, ngeom, 1 ) \
X ( int, geom_contype, ngeom, 1 ) \
X ( int, geom_conaffinity, ngeom, 1 ) \
X ( int, geom_condim, ngeom, 1 ) \
XMJV( int, geom_bodyid, ngeom, 1 ) \
XMJV( int, geom_dataid, ngeom, 1 ) \
XMJV( int, geom_matid, ngeom, 1 ) \
XMJV( int, geom_group, ngeom, 1 ) \
X ( int, geom_priority, ngeom, 1 ) \
X ( mjtByte, geom_sameframe, ngeom, 1 ) \
X ( mjtNum, geom_solmix, ngeom, 1 ) \
X ( mjtNum, geom_solref, ngeom, mjNREF ) \
X ( mjtNum, geom_solimp, ngeom, mjNIMP ) \
XMJV( mjtNum, geom_size, ngeom, 3 ) \
XMJV( mjtNum, geom_aabb, ngeom, 6 ) \
XMJV( mjtNum, geom_rbound, ngeom, 1 ) \
X ( mjtNum, geom_pos, ngeom, 3 ) \
X ( mjtNum, geom_quat, ngeom, 4 ) \
X ( mjtNum, geom_friction, ngeom, 3 ) \
X ( mjtNum, geom_margin, ngeom, 1 ) \
X ( mjtNum, geom_gap, ngeom, 1 ) \
X ( mjtNum, geom_fluid, ngeom, mjNFLUID ) \
X ( mjtNum, geom_user, ngeom, MJ_M(nuser_geom) ) \
XMJV( float, geom_rgba, ngeom, 4 ) \
XMJV( int, site_type, nsite, 1 ) \
XMJV( int, site_bodyid, nsite, 1 ) \
XMJV( int, site_matid, nsite, 1 ) \
XMJV( int, site_group, nsite, 1 ) \
X ( mjtByte, site_sameframe, nsite, 1 ) \
XMJV( mjtNum, site_size, nsite, 3 ) \
X ( mjtNum, site_pos, nsite, 3 ) \
X ( mjtNum, site_quat, nsite, 4 ) \
X ( mjtNum, site_user, nsite, MJ_M(nuser_site) ) \
XMJV( float, site_rgba, nsite, 4 ) \
X ( int, cam_mode, ncam, 1 ) \
X ( int, cam_bodyid, ncam, 1 ) \
X ( int, cam_targetbodyid, ncam, 1 ) \
X ( mjtNum, cam_pos, ncam, 3 ) \
X ( mjtNum, cam_quat, ncam, 4 ) \
X ( mjtNum, cam_poscom0, ncam, 3 ) \
X ( mjtNum, cam_pos0, ncam, 3 ) \
X ( mjtNum, cam_mat0, ncam, 9 ) \
XMJV( mjtNum, cam_fovy, ncam, 1 ) \
XMJV( mjtNum, cam_ipd, ncam, 1 ) \
X ( mjtNum, cam_user, ncam, MJ_M(nuser_cam) ) \
X ( int, light_mode, nlight, 1 ) \
X ( int, light_bodyid, nlight, 1 ) \
X ( int, light_targetbodyid, nlight, 1 ) \
XMJV( mjtByte, light_directional, nlight, 1 ) \
XMJV( mjtByte, light_castshadow, nlight, 1 ) \
XMJV( mjtByte, light_active, nlight, 1 ) \
X ( mjtNum, light_pos, nlight, 3 ) \
X ( mjtNum, light_dir, nlight, 3 ) \
X ( mjtNum, light_poscom0, nlight, 3 ) \
X ( mjtNum, light_pos0, nlight, 3 ) \
X ( mjtNum, light_dir0, nlight, 3 ) \
XMJV( float, light_attenuation, nlight, 3 ) \
XMJV( float, light_cutoff, nlight, 1 ) \
XMJV( float, light_exponent, nlight, 1 ) \
XMJV( float, light_ambient, nlight, 3 ) \
XMJV( float, light_diffuse, nlight, 3 ) \
XMJV( float, light_specular, nlight, 3 ) \
X ( int, mesh_vertadr, nmesh, 1 ) \
X ( int, mesh_vertnum, nmesh, 1 ) \
X ( int, mesh_normaladr, nmesh, 1 ) \
X ( int, mesh_normalnum, nmesh, 1 ) \
XMJV( int, mesh_texcoordadr, nmesh, 1 ) \
X ( int, mesh_texcoordnum, nmesh, 1 ) \
X ( int, mesh_faceadr, nmesh, 1 ) \
X ( int, mesh_facenum, nmesh, 1 ) \
XMJV( int, mesh_graphadr, nmesh, 1 ) \
X ( float, mesh_vert, nmeshvert, 3 ) \
X ( float, mesh_normal, nmeshnormal, 3 ) \
X ( float, mesh_texcoord, nmeshtexcoord, 2 ) \
X ( int, mesh_face, nmeshface, 3 ) \
X ( int, mesh_facenormal, nmeshface, 3 ) \
X ( int, mesh_facetexcoord, nmeshface, 3 ) \
X ( int, mesh_graph, nmeshgraph, 1 ) \
XMJV( int, skin_matid, nskin, 1 ) \
XMJV( int, skin_group, nskin, 1 ) \
XMJV( float, skin_rgba, nskin, 4 ) \
XMJV( float, skin_inflate, nskin, 1 ) \
XMJV( int, skin_vertadr, nskin, 1 ) \
XMJV( int, skin_vertnum, nskin, 1 ) \
XMJV( int, skin_texcoordadr, nskin, 1 ) \
XMJV( int, skin_faceadr, nskin, 1 ) \
XMJV( int, skin_facenum, nskin, 1 ) \
XMJV( int, skin_boneadr, nskin, 1 ) \
XMJV( int, skin_bonenum, nskin, 1 ) \
XMJV( float, skin_vert, nskinvert, 3 ) \
X ( float, skin_texcoord, nskintexvert, 2 ) \
XMJV( int, skin_face, nskinface, 3 ) \
XMJV( int, skin_bonevertadr, nskinbone, 1 ) \
XMJV( int, skin_bonevertnum, nskinbone, 1 ) \
XMJV( float, skin_bonebindpos, nskinbone, 3 ) \
XMJV( float, skin_bonebindquat, nskinbone, 4 ) \
XMJV( int, skin_bonebodyid, nskinbone, 1 ) \
XMJV( int, skin_bonevertid, nskinbonevert, 1 ) \
XMJV( float, skin_bonevertweight, nskinbonevert, 1 ) \
X ( mjtNum, hfield_size, nhfield, 4 ) \
X ( int, hfield_nrow, nhfield, 1 ) \
X ( int, hfield_ncol, nhfield, 1 ) \
X ( int, hfield_adr, nhfield, 1 ) \
X ( float, hfield_data, nhfielddata, 1 ) \
X ( int, tex_type, ntex, 1 ) \
X ( int, tex_height, ntex, 1 ) \
X ( int, tex_width, ntex, 1 ) \
X ( int, tex_adr, ntex, 1 ) \
X ( mjtByte, tex_rgb, ntexdata, 1 ) \
XMJV( int, mat_texid, nmat, 1 ) \
XMJV( mjtByte, mat_texuniform, nmat, 1 ) \
XMJV( float, mat_texrepeat, nmat, 2 ) \
XMJV( float, mat_emission, nmat, 1 ) \
XMJV( float, mat_specular, nmat, 1 ) \
XMJV( float, mat_shininess, nmat, 1 ) \
XMJV( float, mat_reflectance, nmat, 1 ) \
XMJV( float, mat_rgba, nmat, 4 ) \
X ( int, pair_dim, npair, 1 ) \
X ( int, pair_geom1, npair, 1 ) \
X ( int, pair_geom2, npair, 1 ) \
X ( int, pair_signature, npair, 1 ) \
X ( mjtNum, pair_solref, npair, mjNREF ) \
X ( mjtNum, pair_solimp, npair, mjNIMP ) \
X ( mjtNum, pair_margin, npair, 1 ) \
X ( mjtNum, pair_gap, npair, 1 ) \
X ( mjtNum, pair_friction, npair, 5 ) \
X ( int, exclude_signature, nexclude, 1 ) \
XMJV( int, eq_type, neq, 1 ) \
XMJV( int, eq_obj1id, neq, 1 ) \
XMJV( int, eq_obj2id, neq, 1 ) \
XMJV( mjtByte, eq_active, neq, 1 ) \
X ( mjtNum, eq_solref, neq, mjNREF ) \
X ( mjtNum, eq_solimp, neq, mjNIMP ) \
XMJV( mjtNum, eq_data, neq, mjNEQDATA ) \
X ( int, tendon_adr, ntendon, 1 ) \
XMJV( int, tendon_num, ntendon, 1 ) \
XMJV( int, tendon_matid, ntendon, 1 ) \
XMJV( int, tendon_group, ntendon, 1 ) \
XMJV( mjtByte, tendon_limited, ntendon, 1 ) \
XMJV( mjtNum, tendon_width, ntendon, 1 ) \
X ( mjtNum, tendon_solref_lim, ntendon, mjNREF ) \
X ( mjtNum, tendon_solimp_lim, ntendon, mjNIMP ) \
X ( mjtNum, tendon_solref_fri, ntendon, mjNREF ) \
X ( mjtNum, tendon_solimp_fri, ntendon, mjNIMP ) \
XMJV( mjtNum, tendon_range, ntendon, 2 ) \
X ( mjtNum, tendon_margin, ntendon, 1 ) \
XMJV( mjtNum, tendon_stiffness, ntendon, 1 ) \
XMJV( mjtNum, tendon_damping, ntendon, 1 ) \
XMJV( mjtNum, tendon_frictionloss, ntendon, 1 ) \
XMJV( mjtNum, tendon_lengthspring, ntendon, 2 ) \
X ( mjtNum, tendon_length0, ntendon, 1 ) \
X ( mjtNum, tendon_invweight0, ntendon, 1 ) \
X ( mjtNum, tendon_user, ntendon, MJ_M(nuser_tendon) ) \
XMJV( float, tendon_rgba, ntendon, 4 ) \
X ( int, wrap_type, nwrap, 1 ) \
X ( int, wrap_objid, nwrap, 1 ) \
X ( mjtNum, wrap_prm, nwrap, 1 ) \
XMJV( int, actuator_trntype, nu, 1 ) \
XMJV( int, actuator_dyntype, nu, 1 ) \
X ( int, actuator_gaintype, nu, 1 ) \
X ( int, actuator_biastype, nu, 1 ) \
XMJV( int, actuator_trnid, nu, 2 ) \
XMJV( int, actuator_actadr, nu, 1 ) \
XMJV( int, actuator_actnum, nu, 1 ) \
XMJV( int, actuator_group, nu, 1 ) \
XMJV( mjtByte, actuator_ctrllimited, nu, 1 ) \
X ( mjtByte, actuator_forcelimited, nu, 1 ) \
XMJV( mjtByte, actuator_actlimited, nu, 1 ) \
X ( mjtNum, actuator_dynprm, nu, mjNDYN ) \
X ( mjtNum, actuator_gainprm, nu, mjNGAIN ) \
X ( mjtNum, actuator_biasprm, nu, mjNBIAS ) \
XMJV( mjtNum, actuator_ctrlrange, nu, 2 ) \
X ( mjtNum, actuator_forcerange, nu, 2 ) \
XMJV( mjtNum, actuator_actrange, nu, 2 ) \
X ( mjtNum, actuator_gear, nu, 6 ) \
XMJV( mjtNum, actuator_cranklength, nu, 1 ) \
X ( mjtNum, actuator_acc0, nu, 1 ) \
X ( mjtNum, actuator_length0, nu, 1 ) \
X ( mjtNum, actuator_lengthrange, nu, 2 ) \
X ( mjtNum, actuator_user, nu, MJ_M(nuser_actuator) ) \
X ( int, actuator_plugin, nu, 1 ) \
XMJV( int, sensor_type, nsensor, 1 ) \
X ( int, sensor_datatype, nsensor, 1 ) \
X ( int, sensor_needstage, nsensor, 1 ) \
X ( int, sensor_objtype, nsensor, 1 ) \
XMJV( int, sensor_objid, nsensor, 1 ) \
X ( int, sensor_reftype, nsensor, 1 ) \
X ( int, sensor_refid, nsensor, 1 ) \
X ( int, sensor_dim, nsensor, 1 ) \
XMJV( int, sensor_adr, nsensor, 1 ) \
X ( mjtNum, sensor_cutoff, nsensor, 1 ) \
X ( mjtNum, sensor_noise, nsensor, 1 ) \
X ( mjtNum, sensor_user, nsensor, MJ_M(nuser_sensor) ) \
X ( int, sensor_plugin, nsensor, 1 ) \
X ( int, plugin, nplugin, 1 ) \
X ( int, plugin_stateadr, nplugin, 1 ) \
X ( int, plugin_statenum, nplugin, 1 ) \
X ( char, plugin_attr, npluginattr, 1 ) \
X ( int, plugin_attradr, nplugin, 1 ) \
X ( int, numeric_adr, nnumeric, 1 ) \
X ( int, numeric_size, nnumeric, 1 ) \
X ( mjtNum, numeric_data, nnumericdata, 1 ) \
X ( int, text_adr, ntext, 1 ) \
X ( int, text_size, ntext, 1 ) \
X ( char, text_data, ntextdata, 1 ) \
X ( int, tuple_adr, ntuple, 1 ) \
X ( int, tuple_size, ntuple, 1 ) \
X ( int, tuple_objtype, ntupledata, 1 ) \
X ( int, tuple_objid, ntupledata, 1 ) \
X ( mjtNum, tuple_objprm, ntupledata, 1 ) \
X ( mjtNum, key_time, nkey, 1 ) \
X ( mjtNum, key_qpos, nkey, MJ_M(nq) ) \
X ( mjtNum, key_qvel, nkey, MJ_M(nv) ) \
X ( mjtNum, key_act, nkey, MJ_M(na) ) \
X ( mjtNum, key_mpos, nkey, MJ_M(nmocap)*3 ) \
X ( mjtNum, key_mquat, nkey, MJ_M(nmocap)*4 ) \
X ( mjtNum, key_ctrl, nkey, MJ_M(nu) ) \
XMJV( int, name_bodyadr, nbody, 1 ) \
XMJV( int, name_jntadr, njnt, 1 ) \
XMJV( int, name_geomadr, ngeom, 1 ) \
XMJV( int, name_siteadr, nsite, 1 ) \
XMJV( int, name_camadr, ncam, 1 ) \
XMJV( int, name_lightadr, nlight, 1 ) \
X ( int, name_meshadr, nmesh, 1 ) \
X ( int, name_skinadr, nskin, 1 ) \
X ( int, name_hfieldadr, nhfield, 1 ) \
X ( int, name_texadr, ntex, 1 ) \
X ( int, name_matadr, nmat, 1 ) \
X ( int, name_pairadr, npair, 1 ) \
X ( int, name_excludeadr, nexclude, 1 ) \
XMJV( int, name_eqadr, neq, 1 ) \
XMJV( int, name_tendonadr, ntendon, 1 ) \
XMJV( int, name_actuatoradr, nu, 1 ) \
X ( int, name_sensoradr, nsensor, 1 ) \
X ( int, name_numericadr, nnumeric, 1 ) \
X ( int, name_textadr, ntext, 1 ) \
X ( int, name_tupleadr, ntuple, 1 ) \
X ( int, name_keyadr, nkey, 1 ) \
X ( int, name_pluginadr, nplugin, 1 ) \
XMJV( char, names, nnames, 1 ) \
X ( int, names_map, nnames_map, 1 ) \
//-------------------------------- mjData ----------------------------------------------------------
@@ -459,85 +461,87 @@
// pointer fields of mjData
#define MJDATA_POINTERS \
X( mjtNum, qpos, nq, 1 ) \
X( mjtNum, qvel, nv, 1 ) \
X( mjtNum, act, na, 1 ) \
X( mjtNum, qacc_warmstart, nv, 1 ) \
X( mjtNum, plugin_state, npluginstate, 1 ) \
X( mjtNum, ctrl, nu, 1 ) \
X( mjtNum, qfrc_applied, nv, 1 ) \
X( mjtNum, xfrc_applied, nbody, 6 ) \
X( mjtNum, mocap_pos, nmocap, 3 ) \
X( mjtNum, mocap_quat, nmocap, 4 ) \
X( mjtNum, qacc, nv, 1 ) \
X( mjtNum, act_dot, na, 1 ) \
X( mjtNum, userdata, nuserdata, 1 ) \
X( mjtNum, sensordata, nsensordata, 1 ) \
X( int, plugin, nplugin, 1 ) \
X( uintptr_t, plugin_data, nplugin, 1 ) \
X( mjtNum, xpos, nbody, 3 ) \
X( mjtNum, xquat, nbody, 4 ) \
X( mjtNum, xmat, nbody, 9 ) \
X( mjtNum, xipos, nbody, 3 ) \
X( mjtNum, ximat, nbody, 9 ) \
X( mjtNum, xanchor, njnt, 3 ) \
X( mjtNum, xaxis, njnt, 3 ) \
X( mjtNum, geom_xpos, ngeom, 3 ) \
X( mjtNum, geom_xmat, ngeom, 9 ) \
X( mjtNum, site_xpos, nsite, 3 ) \
X( mjtNum, site_xmat, nsite, 9 ) \
X( mjtNum, cam_xpos, ncam, 3 ) \
X( mjtNum, cam_xmat, ncam, 9 ) \
X( mjtNum, light_xpos, nlight, 3 ) \
X( mjtNum, light_xdir, nlight, 3 ) \
X( mjtNum, subtree_com, nbody, 3 ) \
X( mjtNum, cdof, nv, 6 ) \
X( mjtNum, cinert, nbody, 10 ) \
X( int, ten_wrapadr, ntendon, 1 ) \
X( int, ten_wrapnum, ntendon, 1 ) \
X( int, ten_J_rownnz, ntendon, 1 ) \
X( int, ten_J_rowadr, ntendon, 1 ) \
X( int, ten_J_colind, ntendon, MJ_M(nv) ) \
X( mjtNum, ten_length, ntendon, 1 ) \
X( mjtNum, ten_J, ntendon, MJ_M(nv) ) \
X( int, wrap_obj, nwrap, 2 ) \
X( mjtNum, wrap_xpos, nwrap, 6 ) \
X( mjtNum, actuator_length, nu, 1 ) \
X( mjtNum, actuator_moment, nu, MJ_M(nv) ) \
X( mjtNum, crb, nbody, 10 ) \
X( mjtNum, qM, nM, 1 ) \
X( mjtNum, qLD, nM, 1 ) \
X( mjtNum, qLDiagInv, nv, 1 ) \
X( mjtNum, qLDiagSqrtInv, nv, 1 ) \
X( mjtByte, bvh_active, nbvh, 1 ) \
X( mjtNum, ten_velocity, ntendon, 1 ) \
X( mjtNum, actuator_velocity, nu, 1 ) \
X( mjtNum, cvel, nbody, 6 ) \
X( mjtNum, cdof_dot, nv, 6 ) \
X( mjtNum, qfrc_bias, nv, 1 ) \
X( mjtNum, qfrc_passive, nv, 1 ) \
X( mjtNum, subtree_linvel, nbody, 3 ) \
X( mjtNum, subtree_angmom, nbody, 3 ) \
X( mjtNum, qH, nM, 1 ) \
X( mjtNum, qHDiagInv, nv, 1 ) \
X( int, D_rownnz, nv, 1 ) \
X( int, D_rowadr, nv, 1 ) \
X( int, D_colind, nD, 1 ) \
X( int, B_rownnz, nbody, 1 ) \
X( int, B_rowadr, nbody, 1 ) \
X( int, B_colind, nB, 1 ) \
X( mjtNum, qDeriv, nD, 1 ) \
X( mjtNum, qLU, nD, 1 ) \
X( mjtNum, actuator_force, nu, 1 ) \
X( mjtNum, qfrc_actuator, nv, 1 ) \
X( mjtNum, qfrc_smooth, nv, 1 ) \
X( mjtNum, qacc_smooth, nv, 1 ) \
X( mjtNum, qfrc_constraint, nv, 1 ) \
X( mjtNum, qfrc_inverse, nv, 1 ) \
X( mjtNum, cacc, nbody, 6 ) \
X( mjtNum, cfrc_int, nbody, 6 ) \
X( mjtNum, cfrc_ext, nbody, 6 )
// XMJV means that the field is required to construct mjvScene
// (by default we define XMJV to be the same as X)
#define MJDATA_POINTERS \
X ( mjtNum, qpos, nq, 1 ) \
X ( mjtNum, qvel, nv, 1 ) \
XMJV( mjtNum, act, na, 1 ) \
X ( mjtNum, qacc_warmstart, nv, 1 ) \
X ( mjtNum, plugin_state, npluginstate, 1 ) \
XMJV( mjtNum, ctrl, nu, 1 ) \
X ( mjtNum, qfrc_applied, nv, 1 ) \
XMJV( mjtNum, xfrc_applied, nbody, 6 ) \
X ( mjtNum, mocap_pos, nmocap, 3 ) \
X ( mjtNum, mocap_quat, nmocap, 4 ) \
X ( mjtNum, qacc, nv, 1 ) \
X ( mjtNum, act_dot, na, 1 ) \
X ( mjtNum, userdata, nuserdata, 1 ) \
XMJV( mjtNum, sensordata, nsensordata, 1 ) \
X ( int, plugin, nplugin, 1 ) \
X ( uintptr_t, plugin_data, nplugin, 1 ) \
XMJV( mjtNum, xpos, nbody, 3 ) \
XMJV( mjtNum, xquat, nbody, 4 ) \
XMJV( mjtNum, xmat, nbody, 9 ) \
XMJV( mjtNum, xipos, nbody, 3 ) \
XMJV( mjtNum, ximat, nbody, 9 ) \
XMJV( mjtNum, xanchor, njnt, 3 ) \
XMJV( mjtNum, xaxis, njnt, 3 ) \
XMJV( mjtNum, geom_xpos, ngeom, 3 ) \
XMJV( mjtNum, geom_xmat, ngeom, 9 ) \
XMJV( mjtNum, site_xpos, nsite, 3 ) \
XMJV( mjtNum, site_xmat, nsite, 9 ) \
XMJV( mjtNum, cam_xpos, ncam, 3 ) \
XMJV( mjtNum, cam_xmat, ncam, 9 ) \
XMJV( mjtNum, light_xpos, nlight, 3 ) \
XMJV( mjtNum, light_xdir, nlight, 3 ) \
XMJV( mjtNum, subtree_com, nbody, 3 ) \
X ( mjtNum, cdof, nv, 6 ) \
X ( mjtNum, cinert, nbody, 10 ) \
XMJV( int, ten_wrapadr, ntendon, 1 ) \
XMJV( int, ten_wrapnum, ntendon, 1 ) \
X ( int, ten_J_rownnz, ntendon, 1 ) \
X ( int, ten_J_rowadr, ntendon, 1 ) \
X ( int, ten_J_colind, ntendon, MJ_M(nv) ) \
X ( mjtNum, ten_length, ntendon, 1 ) \
X ( mjtNum, ten_J, ntendon, MJ_M(nv) ) \
XMJV( int, wrap_obj, nwrap, 2 ) \
XMJV( mjtNum, wrap_xpos, nwrap, 6 ) \
X ( mjtNum, actuator_length, nu, 1 ) \
X ( mjtNum, actuator_moment, nu, MJ_M(nv) ) \
X ( mjtNum, crb, nbody, 10 ) \
X ( mjtNum, qM, nM, 1 ) \
X ( mjtNum, qLD, nM, 1 ) \
X ( mjtNum, qLDiagInv, nv, 1 ) \
X ( mjtNum, qLDiagSqrtInv, nv, 1 ) \
XMJV( mjtByte, bvh_active, nbvh, 1 ) \
X ( mjtNum, ten_velocity, ntendon, 1 ) \
X ( mjtNum, actuator_velocity, nu, 1 ) \
X ( mjtNum, cvel, nbody, 6 ) \
X ( mjtNum, cdof_dot, nv, 6 ) \
X ( mjtNum, qfrc_bias, nv, 1 ) \
X ( mjtNum, qfrc_passive, nv, 1 ) \
X ( mjtNum, subtree_linvel, nbody, 3 ) \
X ( mjtNum, subtree_angmom, nbody, 3 ) \
X ( mjtNum, qH, nM, 1 ) \
X ( mjtNum, qHDiagInv, nv, 1 ) \
X ( int, D_rownnz, nv, 1 ) \
X ( int, D_rowadr, nv, 1 ) \
X ( int, D_colind, nD, 1 ) \
X ( int, B_rownnz, nbody, 1 ) \
X ( int, B_rowadr, nbody, 1 ) \
X ( int, B_colind, nB, 1 ) \
X ( mjtNum, qDeriv, nD, 1 ) \
X ( mjtNum, qLU, nD, 1 ) \
X ( mjtNum, actuator_force, nu, 1 ) \
X ( mjtNum, qfrc_actuator, nv, 1 ) \
X ( mjtNum, qfrc_smooth, nv, 1 ) \
X ( mjtNum, qacc_smooth, nv, 1 ) \
X ( mjtNum, qfrc_constraint, nv, 1 ) \
X ( mjtNum, qfrc_inverse, nv, 1 ) \
X ( mjtNum, cacc, nbody, 6 ) \
X ( mjtNum, cfrc_int, nbody, 6 ) \
X ( mjtNum, cfrc_ext, nbody, 6 )
// macro for annotating that an array size in an X macro is a member of mjData
@@ -623,4 +627,9 @@
X( mjtNum, energy, 2, 1 )
// alias XMJV to be the same as X
// to obtain only X macros for fields that are relevant for mjvScene creation,
// redefine X to expand to nothing, and XMJV to do what's required
#define XMJV X
#endif // MUJOCO_MJXMACRO_H_
+31
View File
@@ -546,10 +546,20 @@ MJAPI void mjv_alignToCamera(mjtNum res[3], const mjtNum vec[3], const mjtNum fo
MJAPI void mjv_moveCamera(const mjModel* m, int action, mjtNum reldx, mjtNum reldy,
const mjvScene* scn, mjvCamera* cam);
// Move camera with mouse given a scene state; action is mjtMouse.
MJAPI void mjv_moveCameraFromState(const mjvSceneState* scnstate, int action,
mjtNum reldx, mjtNum reldy,
const mjvScene* scn, mjvCamera* cam);
// Move perturb object with mouse; action is mjtMouse.
MJAPI void mjv_movePerturb(const mjModel* m, const mjData* d, int action, mjtNum reldx,
mjtNum reldy, const mjvScene* scn, mjvPerturb* pert);
// Move perturb object with mouse given a scene state; action is mjtMouse.
MJAPI void mjv_movePerturbFromState(const mjvSceneState* scnstate, int action,
mjtNum reldx, mjtNum reldy,
const mjvScene* scn, mjvPerturb* pert);
// Move model with mouse; action is mjtMouse.
MJAPI void mjv_moveModel(const mjModel* m, int action, mjtNum reldx, mjtNum reldy,
const mjtNum roomup[3], mjvScene* scn);
@@ -606,6 +616,24 @@ MJAPI void mjv_freeScene(mjvScene* scn);
MJAPI void mjv_updateScene(const mjModel* m, mjData* d, const mjvOption* opt,
const mjvPerturb* pert, mjvCamera* cam, int catmask, mjvScene* scn);
// Update entire scene from a scene state, return the number of new mjWARN_VGEOMFULL warnings.
MJAPI int mjv_updateSceneFromState(const mjvSceneState* scnstate, const mjvOption* opt,
const mjvPerturb* pert, mjvCamera* cam, int catmask,
mjvScene* scn);
// Set default scene state.
MJAPI void mjv_defaultSceneState(mjvSceneState* scnstate);
// Allocate resources and initialize a scene state object.
MJAPI void mjv_makeSceneState(const mjModel* m, const mjData* d,
mjvSceneState* scnstate, int maxgeom);
// Free scene state.
MJAPI void mjv_freeSceneState(mjvSceneState* scnstate);
// Update a scene state from model and data.
MJAPI void mjv_updateSceneState(const mjModel* m, mjData* d, mjvSceneState* scnstate);
// Add geoms from selected categories.
MJAPI void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* opt,
const mjvPerturb* pert, int catmask, mjvScene* scn);
@@ -637,6 +665,9 @@ MJAPI void mjr_addAux(int index, int width, int height, int samples, mjrContext*
// Free resources in custom OpenGL context, set to default.
MJAPI void mjr_freeContext(mjrContext* con);
// Resize offscreen buffers.
MJAPI void mjr_resizeOffscreen(int width, int height, mjrContext* con);
// Upload texture to GPU, overwriting previous upload if any.
MJAPI void mjr_uploadTexture(const mjModel* m, const mjrContext* con, int texid);