diff --git a/include/mujoco/mjxmacro.h b/include/mujoco/mjxmacro.h index 1ee6bd97..29bb6187 100644 --- a/include/mujoco/mjxmacro.h +++ b/include/mujoco/mjxmacro.h @@ -181,9 +181,7 @@ // pointer fields of mjModel // XNV means that the field is not required to construct mjvScene // (by default we define XNV to be the same as X) -#define MJMODEL_POINTERS \ - X ( mjtNum, qpos0, nq, 1 ) \ - X ( mjtNum, qpos_spring, nq, 1 ) \ +#define MJMODEL_POINTERS_BODY \ X ( int, body_parentid, nbody, 1 ) \ X ( int, body_rootid, nbody, 1 ) \ X ( int, body_weldid, nbody, 1 ) \ @@ -212,15 +210,9 @@ X ( int, body_contype, nbody, 1 ) \ X ( int, body_conaffinity, 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_nodeid, nbvh, 1 ) \ - X ( mjtNum, bvh_aabb, nbvhstatic, 6 ) \ - X ( int, oct_depth, noct, 1 ) \ - X ( int, oct_child, noct, 8 ) \ - X ( mjtNum, oct_aabb, noct, 6 ) \ - X ( mjtNum, oct_coeff, noct, 8 ) \ + X ( int, body_bvhnum, nbody, 1 ) + +#define MJMODEL_POINTERS_JOINT \ X ( int, jnt_type, njnt, 1 ) \ X ( int, jnt_qposadr, njnt, 1 ) \ X ( int, jnt_dofadr, njnt, 1 ) \ @@ -237,7 +229,9 @@ X ( mjtNum, jnt_range, njnt, 2 ) \ X ( mjtNum, jnt_actfrcrange, njnt, 2 ) \ X ( mjtNum, jnt_margin, njnt, 1 ) \ - X ( mjtNum, jnt_user, njnt, MJ_M(nuser_jnt) ) \ + X ( mjtNum, jnt_user, njnt, MJ_M(nuser_jnt) ) + +#define MJMODEL_POINTERS_DOF \ X ( int, dof_bodyid, nv, 1 ) \ X ( int, dof_jntid, nv, 1 ) \ X ( int, dof_parentid, nv, 1 ) \ @@ -250,7 +244,9 @@ 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 ( mjtNum, dof_M0, nv, 1 ) + +#define MJMODEL_POINTERS_GEOM \ X ( int, geom_type, ngeom, 1 ) \ X ( int, geom_contype, ngeom, 1 ) \ X ( int, geom_conaffinity, ngeom, 1 ) \ @@ -275,7 +271,9 @@ X ( mjtNum, geom_gap, ngeom, 1 ) \ XNV ( mjtNum, geom_fluid, ngeom, mjNFLUID ) \ X ( mjtNum, geom_user, ngeom, MJ_M(nuser_geom) ) \ - X ( float, geom_rgba, ngeom, 4 ) \ + X ( float, geom_rgba, ngeom, 4 ) + +#define MJMODEL_POINTERS_SITE \ X ( int, site_type, nsite, 1 ) \ X ( int, site_bodyid, nsite, 1 ) \ X ( int, site_matid, nsite, 1 ) \ @@ -285,7 +283,9 @@ 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 ( float, site_rgba, nsite, 4 ) + +#define MJMODEL_POINTERS_CAMERA \ X ( int, cam_mode, ncam, 1 ) \ X ( int, cam_bodyid, ncam, 1 ) \ X ( int, cam_targetbodyid, ncam, 1 ) \ @@ -300,7 +300,9 @@ X ( int, cam_resolution, ncam, 2 ) \ X ( float, cam_sensorsize, ncam, 2 ) \ X ( float, cam_intrinsic, ncam, 4 ) \ - X ( mjtNum, cam_user, ncam, MJ_M(nuser_cam) ) \ + X ( mjtNum, cam_user, ncam, MJ_M(nuser_cam) ) + +#define MJMODEL_POINTERS_LIGHT \ X ( int, light_mode, nlight, 1 ) \ X ( int, light_bodyid, nlight, 1 ) \ X ( int, light_targetbodyid, nlight, 1 ) \ @@ -321,7 +323,9 @@ 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 ( float, light_specular, nlight, 3 ) + +#define MJMODEL_POINTERS_FLEX \ X ( int, flex_contype, nflex, 1 ) \ X ( int, flex_conaffinity, nflex, 1 ) \ X ( int, flex_condim, nflex, 1 ) \ @@ -385,7 +389,9 @@ X ( int, flex_bvhadr, nflex, 1 ) \ X ( int, flex_bvhnum, nflex, 1 ) \ X ( float, flex_rgba, nflex, 4 ) \ - X ( float, flex_texcoord, nflextexcoord, 2 ) \ + X ( float, flex_texcoord, nflextexcoord, 2 ) + +#define MJMODEL_POINTERS_MESH \ X ( int, mesh_vertadr, nmesh, 1 ) \ X ( int, mesh_vertnum, nmesh, 1 ) \ X ( int, mesh_faceadr, nmesh, 1 ) \ @@ -418,7 +424,9 @@ XNV ( int, mesh_polyvert, nmeshpolyvert, 1 ) \ XNV ( int, mesh_polymapadr, nmeshvert, 1 ) \ XNV ( int, mesh_polymapnum, nmeshvert, 1 ) \ - XNV ( int, mesh_polymap, nmeshpolymap, 1 ) \ + XNV ( int, mesh_polymap, nmeshpolymap, 1 ) + +#define MJMODEL_POINTERS_SKIN \ X ( int, skin_matid, nskin, 1 ) \ X ( int, skin_group, nskin, 1 ) \ X ( float, skin_rgba, nskin, 4 ) \ @@ -440,13 +448,17 @@ X ( int, skin_bonebodyid, nskinbone, 1 ) \ X ( int, skin_bonevertid, nskinbonevert, 1 ) \ X ( float, skin_bonevertweight, nskinbonevert, 1 ) \ - X ( int, skin_pathadr, nskin, 1 ) \ + X ( int, skin_pathadr, nskin, 1 ) + +#define MJMODEL_POINTERS_HFIELD \ X ( mjtNum, hfield_size, nhfield, 4 ) \ X ( int, hfield_nrow, nhfield, 1 ) \ X ( int, hfield_ncol, nhfield, 1 ) \ X ( int, hfield_adr, nhfield, 1 ) \ XNV ( float, hfield_data, nhfielddata, 1 ) \ - X ( int, hfield_pathadr, nhfield, 1 ) \ + X ( int, hfield_pathadr, nhfield, 1 ) + +#define MJMODEL_POINTERS_TEXTURE \ X ( int, tex_type, ntex, 1 ) \ X ( int, tex_colorspace, ntex, 1 ) \ X ( int, tex_height, ntex, 1 ) \ @@ -454,7 +466,9 @@ X ( int, tex_nchannel, ntex, 1 ) \ X ( int, tex_adr, ntex, 1 ) \ XNV ( mjtByte, tex_data, ntexdata, 1 ) \ - X ( int, tex_pathadr, ntex, 1 ) \ + X ( int, tex_pathadr, ntex, 1 ) + +#define MJMODEL_POINTERS_MATERIAL \ X ( int, mat_texid, nmat, mjNTEXROLE ) \ X ( mjtByte, mat_texuniform, nmat, 1 ) \ X ( float, mat_texrepeat, nmat, 2 ) \ @@ -464,7 +478,9 @@ X ( float, mat_reflectance, nmat, 1 ) \ X ( float, mat_metallic, nmat, 1 ) \ X ( float, mat_roughness, nmat, 1 ) \ - X ( float, mat_rgba, nmat, 4 ) \ + X ( float, mat_rgba, nmat, 4 ) + +#define MJMODEL_POINTERS_PAIR \ X ( int, pair_dim, npair, 1 ) \ X ( int, pair_geom1, npair, 1 ) \ X ( int, pair_geom2, npair, 1 ) \ @@ -474,8 +490,12 @@ 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 ( mjtNum, pair_friction, npair, 5 ) + +#define MJMODEL_POINTERS_EXCLUDE \ + X ( int, exclude_signature, nexclude, 1 ) + +#define MJMODEL_POINTERS_EQUALITY \ X ( int, eq_type, neq, 1 ) \ X ( int, eq_obj1id, neq, 1 ) \ X ( int, eq_obj2id, neq, 1 ) \ @@ -483,7 +503,9 @@ X ( mjtByte, eq_active0, neq, 1 ) \ X ( mjtNum, eq_solref, neq, mjNREF ) \ X ( mjtNum, eq_solimp, neq, mjNIMP ) \ - X ( mjtNum, eq_data, neq, mjNEQDATA ) \ + X ( mjtNum, eq_data, neq, mjNEQDATA ) + +#define MJMODEL_POINTERS_TENDON \ X ( int, tendon_adr, ntendon, 1 ) \ X ( int, tendon_num, ntendon, 1 ) \ X ( int, tendon_matid, ntendon, 1 ) \ @@ -506,10 +528,9 @@ 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 ( float, tendon_rgba, ntendon, 4 ) + +#define MJMODEL_POINTERS_ACTUATOR \ X ( int, actuator_trntype, nu, 1 ) \ X ( int, actuator_dyntype, nu, 1 ) \ X ( int, actuator_gaintype, nu, 1 ) \ @@ -534,7 +555,9 @@ 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, actuator_plugin, nu, 1 ) + +#define MJMODEL_POINTERS_SENSOR \ X ( int, sensor_type, nsensor, 1 ) \ X ( int, sensor_datatype, nsensor, 1 ) \ X ( int, sensor_needstage, nsensor, 1 ) \ @@ -548,7 +571,41 @@ 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, sensor_plugin, nsensor, 1 ) + +#define MJMODEL_POINTERS \ + X ( mjtNum, qpos0, nq, 1 ) \ + X ( mjtNum, qpos_spring, nq, 1 ) \ + MJMODEL_POINTERS_BODY \ + X ( int, bvh_depth, nbvh, 1 ) \ + X ( int, bvh_child, nbvh, 2 ) \ + X ( int, bvh_nodeid, nbvh, 1 ) \ + X ( mjtNum, bvh_aabb, nbvhstatic, 6 ) \ + X ( int, oct_depth, noct, 1 ) \ + X ( int, oct_child, noct, 8 ) \ + X ( mjtNum, oct_aabb, noct, 6 ) \ + X ( mjtNum, oct_coeff, noct, 8 ) \ + MJMODEL_POINTERS_JOINT \ + MJMODEL_POINTERS_DOF \ + MJMODEL_POINTERS_GEOM \ + MJMODEL_POINTERS_SITE \ + MJMODEL_POINTERS_CAMERA \ + MJMODEL_POINTERS_LIGHT \ + MJMODEL_POINTERS_FLEX \ + MJMODEL_POINTERS_MESH \ + MJMODEL_POINTERS_SKIN \ + MJMODEL_POINTERS_HFIELD \ + MJMODEL_POINTERS_TEXTURE \ + MJMODEL_POINTERS_MATERIAL \ + MJMODEL_POINTERS_PAIR \ + MJMODEL_POINTERS_EXCLUDE \ + MJMODEL_POINTERS_EQUALITY \ + MJMODEL_POINTERS_TENDON \ + X ( int, wrap_type, nwrap, 1 ) \ + X ( int, wrap_objid, nwrap, 1 ) \ + X ( mjtNum, wrap_prm, nwrap, 1 ) \ + MJMODEL_POINTERS_ACTUATOR \ + MJMODEL_POINTERS_SENSOR \ X ( int, plugin, nplugin, 1 ) \ X ( int, plugin_stateadr, nplugin, 1 ) \ X ( int, plugin_statenum, nplugin, 1 ) \ diff --git a/src/engine/engine_print.c b/src/engine/engine_print.c index b334426d..46480908 100644 --- a/src/engine/engine_print.c +++ b/src/engine/engine_print.c @@ -587,15 +587,17 @@ void mj_printFormattedModel(const mjModel* m, const char* filename, const char* // values used by MJMODEL_POINTERS macro MJMODEL_POINTERS_PREAMBLE(m) - // object_class points to the integer size identifying the class of arrays currently being printed - // used to organise the printout into category groups - // note that comparison is based on the integer address, not its value + // touch unused sizes to avoid unused variable warning + (void)nq; + (void)nv; + (void)na; + (void)nu; + (void)nmocap; + const int* object_class; #define X(type, name, num, sz) \ - if (&m->num == object_class && strncmp(#name, "name_", 5) && \ - strncmp(#name, "M_", 2) && strncmp(#name, "B_", 2) && \ - strncmp(#name, "D_", 2) && sz > 0) { \ + if (&m->num == object_class && sz > 0) { \ const char* format = _Generic(*m->name, \ double: float_format, \ float: float_format, \ @@ -612,92 +614,93 @@ void mj_printFormattedModel(const mjModel* m, const char* filename, const char* fprintf(fp, "\n"); \ } \ } +#define XNV X // bodies + object_class = &m->nbody; for (int i=0; i < m->nbody; i++) { fprintf(fp, "\nBODY %d:\n", i); fprintf(fp, " " NAME_FORMAT, "name"); fprintf(fp, " %s\n", m->names + m->name_bodyadr[i]); - object_class = &m->nbody; - MJMODEL_POINTERS + MJMODEL_POINTERS_BODY } if (m->nbody) fprintf(fp, "\n"); // joints + object_class = &m->njnt; for (int i=0; i < m->njnt; i++) { fprintf(fp, "\nJOINT %d:\n", i); fprintf(fp, " " NAME_FORMAT, "name"); fprintf(fp, " %s\n", m->names + m->name_jntadr[i]); - object_class = &m->njnt; - MJMODEL_POINTERS + MJMODEL_POINTERS_JOINT } if (m->njnt) fprintf(fp, "\n"); // dofs + object_class = &m->nv; for (int i=0; i < m->nv; i++) { fprintf(fp, "\nDOF %d:\n", i); - object_class = &m->nv; - MJMODEL_POINTERS + MJMODEL_POINTERS_DOF } if (m->nv) fprintf(fp, "\n"); // geoms + object_class = &m->ngeom; for (int i=0; i < m->ngeom; i++) { fprintf(fp, "\nGEOM %d:\n", i); fprintf(fp, " " NAME_FORMAT, "name"); fprintf(fp, " %s\n", m->names + m->name_geomadr[i]); - object_class = &m->ngeom; - MJMODEL_POINTERS + MJMODEL_POINTERS_GEOM } if (m->ngeom) fprintf(fp, "\n"); // sites + object_class = &m->nsite; for (int i=0; i < m->nsite; i++) { fprintf(fp, "\nSITE %d:\n", i); fprintf(fp, " " NAME_FORMAT, "name"); fprintf(fp, " %s\n", m->names + m->name_siteadr[i]); - object_class = &m->nsite; - MJMODEL_POINTERS + MJMODEL_POINTERS_SITE } if (m->nsite) fprintf(fp, "\n"); // cameras + object_class = &m->ncam; for (int i=0; i < m->ncam; i++) { fprintf(fp, "\nCAMERA %d:\n", i); fprintf(fp, " " NAME_FORMAT, "name"); fprintf(fp, " %s\n", m->names + m->name_camadr[i]); - object_class = &m->ncam; - MJMODEL_POINTERS + MJMODEL_POINTERS_CAMERA } if (m->ncam) fprintf(fp, "\n"); // lights + object_class = &m->nlight; for (int i=0; i < m->nlight; i++) { fprintf(fp, "\nLIGHT %d:\n", i); fprintf(fp, " " NAME_FORMAT, "name"); fprintf(fp, " %s\n", m->names + m->name_lightadr[i]); - object_class = &m->nlight; - MJMODEL_POINTERS + MJMODEL_POINTERS_LIGHT } if (m->nlight) fprintf(fp, "\n"); // flexes + object_class = &m->nflex; for (int i=0; i < m->nflex; i++) { fprintf(fp, "\nFLEX %d:\n", i); fprintf(fp, " " NAME_FORMAT, "name"); fprintf(fp, " %s\n", m->names + m->name_flexadr[i]); - object_class = &m->nflex; - MJMODEL_POINTERS + MJMODEL_POINTERS_FLEX } if (m->nflex) fprintf(fp, "\n"); // meshes + object_class = &m->nmesh; for (int i=0; i < m->nmesh; i++) { fprintf(fp, "\nMESH %d:\n", i); fprintf(fp, " " NAME_FORMAT, "name"); fprintf(fp, " %s\n", m->names + m->name_meshadr[i]); - object_class = &m->nmesh; - MJMODEL_POINTERS + MJMODEL_POINTERS_MESH if (m->mesh_graphadr[i] >= 0) { fprintf(fp, " " NAME_FORMAT, "qhull face"); fprintf(fp, " %d\n", m->mesh_graph[m->mesh_graphadr[i]+1]); @@ -708,82 +711,82 @@ void mj_printFormattedModel(const mjModel* m, const char* filename, const char* if (m->nmesh) fprintf(fp, "\n"); // skins + object_class = &m->nskin; for (int i=0; i < m->nskin; i++) { fprintf(fp, "\nSKIN %d:\n", i); fprintf(fp, " " NAME_FORMAT, "name"); fprintf(fp, " %s\n", m->names + m->name_skinadr[i]); - object_class = &m->nskin; - MJMODEL_POINTERS + MJMODEL_POINTERS_SKIN } if (m->nskin) fprintf(fp, "\n"); // hfields + object_class = &m->nhfield; for (int i=0; i < m->nhfield; i++) { fprintf(fp, "\nHEIGHTFIELD %d:\n", i); fprintf(fp, " " NAME_FORMAT, "name"); fprintf(fp, " %s\n", m->names + m->name_hfieldadr[i]); - object_class = &m->nhfield; - MJMODEL_POINTERS + MJMODEL_POINTERS_HFIELD } if (m->nhfield) fprintf(fp, "\n"); // textures + object_class = &m->ntex; for (int i=0; i < m->ntex; i++) { fprintf(fp, "\nTEXTURE %d:\n", i); fprintf(fp, " " NAME_FORMAT, "name"); fprintf(fp, " %s\n", m->names + m->name_texadr[i]); - object_class = &m->ntex; - MJMODEL_POINTERS + MJMODEL_POINTERS_TEXTURE } if (m->ntex) fprintf(fp, "\n"); // materials + object_class = &m->nmat; for (int i=0; i < m->nmat; i++) { fprintf(fp, "\nMATERIAL %d:\n", i); fprintf(fp, " " NAME_FORMAT, "name"); fprintf(fp, " %s\n", m->names + m->name_matadr[i]); - object_class = &m->nmat; - MJMODEL_POINTERS + MJMODEL_POINTERS_MATERIAL } if (m->nmat) fprintf(fp, "\n"); // pairs + object_class = &m->npair; for (int i=0; i < m->npair; i++) { fprintf(fp, "\nPAIR %d:\n", i); fprintf(fp, " " NAME_FORMAT, "name"); fprintf(fp, " %s\n", m->names + m->name_pairadr[i]); - object_class = &m->npair; - MJMODEL_POINTERS + MJMODEL_POINTERS_PAIR } if (m->npair) fprintf(fp, "\n"); // excludes + object_class = &m->nexclude; for (int i=0; i < m->nexclude; i++) { fprintf(fp, "\nEXCLUDE %d:\n", i); fprintf(fp, " " NAME_FORMAT, "name"); fprintf(fp, " %s\n", m->names + m->name_excludeadr[i]); - object_class = &m->nexclude; - MJMODEL_POINTERS + MJMODEL_POINTERS_EXCLUDE } if (m->nexclude) fprintf(fp, "\n"); // equality constraints + object_class = &m->neq; for (int i=0; i < m->neq; i++) { fprintf(fp, "\nEQUALITY %d:\n", i); fprintf(fp, " " NAME_FORMAT, "name"); fprintf(fp, " %s\n", m->names + m->name_eqadr[i]); - object_class = &m->neq; - MJMODEL_POINTERS + MJMODEL_POINTERS_EQUALITY } if (m->neq) fprintf(fp, "\n"); // tendons + object_class = &m->ntendon; for (int i=0; i < m->ntendon; i++) { fprintf(fp, "\nTENDON %d:\n", i); fprintf(fp, " " NAME_FORMAT, "name"); fprintf(fp, " %s\n", m->names + m->name_tendonadr[i]); - object_class = &m->ntendon; - MJMODEL_POINTERS + MJMODEL_POINTERS_TENDON fprintf(fp, " path\n"); fprintf(fp, " type objid prm\n"); for (int j=0; j < m->tendon_num[i]; j++) { @@ -797,22 +800,22 @@ void mj_printFormattedModel(const mjModel* m, const char* filename, const char* if (m->ntendon) fprintf(fp, "\n"); // actuators + object_class = &m->nu; for (int i=0; i < m->nu; i++) { fprintf(fp, "\nACTUATOR %d:\n", i); fprintf(fp, " " NAME_FORMAT, "name"); fprintf(fp, " %s\n", m->names + m->name_actuatoradr[i]); - object_class = &m->nu; - MJMODEL_POINTERS + MJMODEL_POINTERS_ACTUATOR } if (m->nu) fprintf(fp, "\n"); // sensors + object_class = &m->nsensor; for (int i=0; i < m->nsensor; i++) { fprintf(fp, "\nSENSOR %d:\n", i); fprintf(fp, " " NAME_FORMAT, "name"); fprintf(fp, " %s\n", m->names + m->name_sensoradr[i]); - object_class = &m->nsensor; - MJMODEL_POINTERS + MJMODEL_POINTERS_SENSOR } if (m->nsensor) fprintf(fp, "\n");