diff --git a/src/engine/engine_collision_convex.c b/src/engine/engine_collision_convex.c index 5b3a7e2b..eeb92091 100644 --- a/src/engine/engine_collision_convex.c +++ b/src/engine/engine_collision_convex.c @@ -58,7 +58,7 @@ void mjccd_support(const void *obj, const ccd_vec3_t *_dir, ccd_vec3_t *vec) { mju_rotVecMatT(dir, _dir->v, d->geom_xmat+9*g); // compute result according to geom type - switch (m->geom_type[g]) { + switch ((mjtGeom) m->geom_type[g]) { case mjGEOM_SPHERE: mju_scl3(res, dir, size[0]); break; @@ -877,21 +877,21 @@ void mjc_fixNormal(const mjModel* m, const mjData* d, mjContact* con, int g1, in // get geom ids and types int gid[2] = {g1, g2}; - int type[2]; + mjtGeom type[2]; for (int i=0; i < 2; i++) { type[i] = m->geom_type[gid[i]]; - // set to -1 if type cannot be processed + // set to mjGEOM_NONE if type cannot be processed if (type[i] != mjGEOM_SPHERE && type[i] != mjGEOM_CAPSULE && type[i] != mjGEOM_ELLIPSOID && type[i] != mjGEOM_CYLINDER) { - type[i] = -1; + type[i] = mjGEOM_NONE; } } // neither type can be processed: nothing to do - if (type[0] < 0 && type[1] < 0) { + if (type[0] == mjGEOM_NONE && type[1] == mjGEOM_NONE) { return; } @@ -904,7 +904,7 @@ void mjc_fixNormal(const mjModel* m, const mjData* d, mjContact* con, int g1, in // process geoms in type range int processed[2] = {0, 0}; for (int i=0; i < 2; i++) { - if (type[i] >= 0) { + if (type[i] != mjGEOM_NONE) { // get geom mat and size mjtNum* mat = d->geom_xmat + 9*gid[i]; mjtNum* size = m->geom_size + 3*gid[i]; @@ -984,6 +984,9 @@ void mjc_fixNormal(const mjModel* m, const mjData* d, mjContact* con, int g1, in nrm[2] = 0; processed[i] = 1; break; + default: + // do nothing: only sphere, capsule, ellipsoid and cylinder are processed + break; } // normalize and map normal to global frame diff --git a/src/engine/engine_core_constraint.c b/src/engine/engine_core_constraint.c index 709843dd..0bf6a4a3 100644 --- a/src/engine/engine_core_constraint.c +++ b/src/engine/engine_core_constraint.c @@ -408,7 +408,7 @@ void mj_instantiateEquality(const mjModel* m, mjData* d) { NV2 = 0; // process according to type - switch (m->eq_type[i]) { + switch ((mjtEq) m->eq_type[i]) { case mjEQ_CONNECT: // connect bodies with ball joint // find global points for (int j=0; j < 2; j++) { @@ -898,7 +898,7 @@ void mj_diagApprox(const mjModel* m, mjData* d) { } // process according to constraint type - switch (d->efc_type[i]) { + switch ((mjtConstraint) d->efc_type[i]) { case mjCNSTR_EQUALITY: // process according to equality-constraint type switch (m->eq_type[id]) { @@ -1003,7 +1003,7 @@ static void getsolparam(const mjModel* m, const mjData* d, int i, mju_zero(solreffriction, mjNREF); // extract solver parameters from corresponding model element - switch (d->efc_type[i]) { + switch ((mjtConstraint) d->efc_type[i]) { case mjCNSTR_EQUALITY: mju_copy(solref, m->eq_solref+mjNREF*id, mjNREF); mju_copy(solimp, m->eq_solimp+mjNIMP*id, mjNIMP); @@ -1079,7 +1079,7 @@ static void getposdim(const mjModel* m, const mjData* d, int i, mjtNum* pos, int *pos = d->efc_pos[i]; // change (dim, distance) for special cases - switch (d->efc_type[i]) { + switch ((mjtConstraint) d->efc_type[i]) { case mjCNSTR_CONTACT_ELLIPTIC: *dim = d->contact[id].dim; break; @@ -1104,6 +1104,10 @@ static void getposdim(const mjModel* m, const mjData* d, int i, mjtNum* pos, int *dim = 3; *pos = mju_norm(d->efc_pos+i, 3); } + break; + default: + // already handled + break; } } @@ -1368,7 +1372,7 @@ static inline int mj_ne(const mjModel* m, mjData* d, int* nnz) { NV2 = 0; // process according to type - switch (m->eq_type[i]) { + switch ((mjtEq) m->eq_type[i]) { case mjEQ_CONNECT: size = 3; if (!nnz) { @@ -1419,6 +1423,9 @@ static inline int mj_ne(const mjModel* m, mjData* d, int* nnz) { NV = 2; } break; + default: + // might occur in case of the now-removed distance equality constraint + mjERROR("unknown constraint type type %d", m->eq_type[i]); // SHOULD NOT OCCUR } ne += mj_addConstraintCount(m, size, NV); nnze += size*NV; diff --git a/src/engine/engine_core_smooth.c b/src/engine/engine_core_smooth.c index 5c71f69e..53168dad 100644 --- a/src/engine/engine_core_smooth.c +++ b/src/engine/engine_core_smooth.c @@ -99,7 +99,7 @@ void mj_kinematics(const mjModel* m, mjData* d) { // get joint id, qpos address, joint type int jid = m->body_jntadr[i] + j; int qadr = m->jnt_qposadr[jid]; - int jtype = m->jnt_type[jid]; + mjtJoint jtype = m->jnt_type[jid]; // compute axis in global frame; ball jnt_axis is (0,0,1), set by compiler mju_rotVecQuat(xaxis, m->jnt_axis+3*jid, quat); @@ -228,7 +228,7 @@ void mj_comPos(const mjModel* m, mjData* d) { // create motion dof int skip = 0; - switch (m->jnt_type[j]) { + switch ((mjtJoint) m->jnt_type[j]) { case mjJNT_FREE: // translation components: x, y, z in global frame mju_zero(d->cdof+da, 18); @@ -281,7 +281,9 @@ void mj_camlight(const mjModel* m, mjData* d) { int id1 = m->cam_targetbodyid[i]; // adjust for mode - switch (m->cam_mode[i]) { + switch ((mjtCamLight) m->cam_mode[i]) { + case mjCAMLIGHT_FIXED: + break; case mjCAMLIGHT_TRACK: case mjCAMLIGHT_TRACKCOM: // fixed global orientation @@ -341,7 +343,9 @@ void mj_camlight(const mjModel* m, mjData* d) { int id1 = m->light_targetbodyid[i]; // adjust for mode - switch (m->light_mode[i]) { + switch ((mjtCamLight) m->light_mode[i]) { + case mjCAMLIGHT_FIXED: + break; case mjCAMLIGHT_TRACK: case mjCAMLIGHT_TRACKCOM: // fixed global orientation @@ -644,7 +648,7 @@ void mj_transmission(const mjModel* m, mjData* d) { gear = m->actuator_gear+6*i; // process according to transmission type - switch (m->actuator_trntype[i]) { + switch ((mjtTrn) m->actuator_trntype[i]) { case mjTRN_JOINT: // joint case mjTRN_JOINTINPARENT: // joint, force in parent frame // slide and hinge joint: scalar gear @@ -1269,7 +1273,7 @@ void mj_comVel(const mjModel* m, mjData* d) { // cvel = cvel_parent + cdof * qvel, cdofdot = cvel x cdof for (int j=0; j < m->body_dofnum[i]; j++) { // compute cvel and cdofdot - switch (m->jnt_type[m->dof_jntid[bda+j]]) { + switch ((mjtJoint) m->jnt_type[m->dof_jntid[bda+j]]) { case mjJNT_FREE: // cdofdot = 0 mju_zero(cdofdot, 18); @@ -1506,7 +1510,7 @@ void mj_rnePostConstraint(const mjModel* m, mjData* d) { mjtNum* eq_data = m->eq_data + mjNEQDATA*id; mjtNum pos[3]; int k; - switch (m->eq_type[id]) { + switch ((mjtEq) m->eq_type[id]) { case mjEQ_CONNECT: case mjEQ_WELD: // cfrc = world-oriented torque:force vector diff --git a/src/engine/engine_derivative.c b/src/engine/engine_derivative.c index fdc67b91..1710bdb8 100644 --- a/src/engine/engine_derivative.c +++ b/src/engine/engine_derivative.c @@ -344,7 +344,7 @@ static void mjd_comVel_vel_dense(const mjModel* m, mjData* d, mjtNum* Dcvel, mjt // Dcvel += D(cdof * qvel), Dcdofdot = D(cvel x cdof) for (int j=m->body_dofadr[i]; j < m->body_dofadr[i]+m->body_dofnum[i]; j++) { - switch (m->jnt_type[m->dof_jntid[j]]) { + switch ((mjtJoint) m->jnt_type[m->dof_jntid[j]]) { case mjJNT_FREE: // Dcdofdot = 0 mju_zero(Dcdofdot+j*6*nv, 18*nv); @@ -554,7 +554,7 @@ static void mjd_comVel_vel(const mjModel* m, mjData* d, mjtNum* Dcvel, mjtNum* D int Jadr = (j < nv - 1 ? m->dof_Madr[j + 1] : m->nM) - (m->dof_Madr[j] + 1); // Dcvel += D(cdof * qvel), Dcdofdot = D(cvel x cdof) - switch (m->jnt_type[m->dof_jntid[j]]) { + switch ((mjtJoint) m->jnt_type[m->dof_jntid[j]]) { case mjJNT_FREE: // Dcdofdot = 0 (already cleared) diff --git a/src/engine/engine_derivative_fd.c b/src/engine/engine_derivative_fd.c index 3b3fef06..7ef2d16f 100644 --- a/src/engine/engine_derivative_fd.c +++ b/src/engine/engine_derivative_fd.c @@ -153,7 +153,7 @@ void mj_stepSkip(const mjModel* m, mjData* d, int skipstage, int skipsensor) { } // use selected integrator - switch (m->opt.integrator) { + switch ((mjtIntegrator) m->opt.integrator) { case mjINT_EULER: mj_EulerSkip(m, d, skipstage >= mjSTAGE_POS); break; diff --git a/src/engine/engine_forward.c b/src/engine/engine_forward.c index 3ab41d1a..67b8cbe1 100644 --- a/src/engine/engine_forward.c +++ b/src/engine/engine_forward.c @@ -235,7 +235,7 @@ void mj_fwdActuation(const mjModel* m, mjData* d) { prm = m->actuator_dynprm + i*mjNDYN; // compute act_dot according to dynamics type - switch (m->actuator_dyntype[i]) { + switch ((mjtDyn) m->actuator_dyntype[i]) { case mjDYN_INTEGRATOR: // simple integrator d->act_dot[j] = ctrl[i]; break; @@ -276,7 +276,7 @@ void mj_fwdActuation(const mjModel* m, mjData* d) { prm = m->actuator_gainprm + mjNGAIN*i; // handle according to gain type - switch (m->actuator_gaintype[i]) { + switch ((mjtGain) m->actuator_gaintype[i]) { case mjGAIN_FIXED: // fixed gain: prm = gain gain = prm[0]; break; @@ -321,7 +321,7 @@ void mj_fwdActuation(const mjModel* m, mjData* d) { prm = m->actuator_biasprm + mjNBIAS*i; // handle according to bias type - switch (m->actuator_biastype[i]) { + switch ((mjtBias) m->actuator_biastype[i]) { case mjBIAS_NONE: // none bias = 0.0; break; @@ -511,7 +511,7 @@ void mj_fwdConstraint(const mjModel* m, mjData* d) { d->solver_iter = 0; // run main solver - switch (m->opt.solver) { + switch ((mjtSolver) m->opt.solver) { case mjSOL_PGS: // PGS mj_solPGS(m, d, m->opt.iterations); break; @@ -883,7 +883,7 @@ void mj_step(const mjModel* m, mjData* d) { } // use selected integrator - switch (m->opt.integrator) { + switch ((mjtIntegrator) m->opt.integrator) { case mjINT_EULER: mj_Euler(m, d); break; diff --git a/src/engine/engine_io.c b/src/engine/engine_io.c index f3741bed..2a08b779 100644 --- a/src/engine/engine_io.c +++ b/src/engine/engine_io.c @@ -1746,7 +1746,7 @@ const char* mj_validateReferences(const mjModel* m) { for (int i=0; i < m->neq; i++) { int obj1id = m->eq_obj1id[i]; int obj2id = m->eq_obj2id[i]; - switch (m->eq_type[i]) { + switch ((mjtEq) m->eq_type[i]) { case mjEQ_JOINT: if (obj1id >= m->njnt || obj1id < 0) { return "Invalid model: eq_obj1id out of bounds."; @@ -1778,12 +1778,13 @@ const char* mj_validateReferences(const mjModel* m) { break; default: + // might occur in case of the now-removed distance equality constraint mjERROR("unknown equality constraint type."); } } for (int i=0; i < m->nwrap; i++) { int wrap_objid = m->wrap_objid[i]; - switch (m->wrap_type[i]) { + switch ((mjtWrap) m->wrap_type[i]) { case mjWRAP_NONE: case mjWRAP_PULLEY: // wrap_objid not used. @@ -1810,7 +1811,7 @@ const char* mj_validateReferences(const mjModel* m) { int actuator_trntype = m->actuator_trntype[i]; int id = m->actuator_trnid[2*i]; int idslider = m->actuator_trnid[2*i+1]; - switch (actuator_trntype) { + switch ((mjtTrn) actuator_trntype) { case mjTRN_JOINT: case mjTRN_JOINTINPARENT: if (id < 0 || id >= m->njnt) { @@ -1835,6 +1836,11 @@ const char* mj_validateReferences(const mjModel* m) { return "Invalid model: actuator_trnid out of bounds."; } break; + case mjTRN_BODY: + if (id < 0 || id >= m->nbody) { + return "Invalid model: actuator_trnid out of bounds."; + } + break; case mjTRN_UNDEFINED: // actuator_trnid not used. break; diff --git a/src/engine/engine_passive.c b/src/engine/engine_passive.c index 95fa5b0a..a2ff8560 100644 --- a/src/engine/engine_passive.c +++ b/src/engine/engine_passive.c @@ -54,7 +54,7 @@ void mj_passive(const mjModel* m, mjData* d) { int padr = m->jnt_qposadr[i]; int dadr = m->jnt_dofadr[i]; - switch (m->jnt_type[i]) { + switch ((mjtJoint) m->jnt_type[i]) { case mjJNT_FREE: // apply force d->qfrc_passive[dadr+0] -= stiffness*(d->qpos[padr+0] - m->qpos_spring[padr+0]); diff --git a/src/engine/engine_ray.c b/src/engine/engine_ray.c index d892d72e..c6f8695d 100644 --- a/src/engine/engine_ray.c +++ b/src/engine/engine_ray.c @@ -742,7 +742,7 @@ mjtNum mj_rayMesh(const mjModel* m, const mjData* d, int id, // intersect ray with pure geom, no meshes or hfields mjtNum mju_rayGeom(const mjtNum* pos, const mjtNum* mat, const mjtNum* size, const mjtNum* pnt, const mjtNum* vec, int geomtype) { - switch (geomtype) { + switch ((mjtGeom) geomtype) { case mjGEOM_PLANE: return ray_plane(pos, mat, size, pnt, vec); diff --git a/src/engine/engine_sensor.c b/src/engine/engine_sensor.c index fb0d6f20..7b90ba2c 100644 --- a/src/engine/engine_sensor.c +++ b/src/engine/engine_sensor.c @@ -134,7 +134,7 @@ static void apply_cutoff(const mjModel* m, mjData* d, mjtStage stage) { // get xpos and xmat pointers to an object in mjData -static void get_xpos_xmat(const mjData* d, int type, int id, int sensor_id, +static void get_xpos_xmat(const mjData* d, mjtObj type, int id, int sensor_id, mjtNum **xpos, mjtNum **xmat) { switch (type) { case mjOBJ_XBODY: @@ -163,7 +163,7 @@ static void get_xpos_xmat(const mjData* d, int type, int id, int sensor_id, } // get global quaternion of an object in mjData -static void get_xquat(const mjModel* m, const mjData* d, int type, int id, int sensor_id, +static void get_xquat(const mjModel* m, const mjData* d, mjtObj type, int id, int sensor_id, mjtNum *quat) { switch (type) { case mjOBJ_XBODY: @@ -216,7 +216,7 @@ void mj_sensorPos(const mjModel* m, mjData* d) { adr = m->sensor_adr[i]; // process according to type - switch (m->sensor_type[i]) { + switch ((mjtSensor) m->sensor_type[i]) { case mjSENS_MAGNETOMETER: // magnetometer mju_mulMatTVec(d->sensordata+adr, d->site_xmat+9*objid, m->opt.magnetic, 3, 3); break; @@ -376,7 +376,7 @@ void mj_sensorPos(const mjModel* m, mjData* d) { // velocity-dependent sensors void mj_sensorVel(const mjModel* m, mjData* d) { - int type, objtype, objid, reftype, refid, adr, nusersensor = 0; + int objtype, objid, reftype, refid, adr, nusersensor = 0; int ne = d->ne, nf = d->nf, nefc = d->nefc; mjtNum xvel[6]; @@ -395,7 +395,7 @@ void mj_sensorVel(const mjModel* m, mjData* d) { if (m->sensor_needstage[i] == mjSTAGE_VEL) { // get sensor info - type = m->sensor_type[i]; + mjtSensor type = m->sensor_type[i]; objtype = m->sensor_objtype[i]; objid = m->sensor_objid[i]; refid = m->sensor_refid[i]; @@ -564,7 +564,7 @@ void mj_sensorVel(const mjModel* m, mjData* d) { // acceleration/force-dependent sensors void mj_sensorAcc(const mjModel* m, mjData* d) { - int rootid, bodyid, type, objtype, objid, body1, body2, adr, nusersensor = 0; + int rootid, bodyid, objtype, objid, body1, body2, adr, nusersensor = 0; int ne = d->ne, nf = d->nf, nefc = d->nefc; mjtNum tmp[6], conforce[6], conray[3]; mjContact* con; @@ -584,7 +584,7 @@ void mj_sensorAcc(const mjModel* m, mjData* d) { if (m->sensor_needstage[i] == mjSTAGE_ACC) { // get sensor info - type = m->sensor_type[i]; + mjtSensor type = m->sensor_type[i]; objtype = m->sensor_objtype[i]; objid = m->sensor_objid[i]; adr = m->sensor_adr[i]; @@ -803,7 +803,7 @@ void mj_energyPos(const mjModel* m, mjData* d) { stiffness = m->jnt_stiffness[i]; padr = m->jnt_qposadr[i]; - switch (m->jnt_type[i]) { + switch ((mjtJoint) m->jnt_type[i]) { case mjJNT_FREE: mju_sub3(dif, d->qpos+padr, m->qpos_spring+padr); d->energy[0] += 0.5*stiffness*mju_dot3(dif, dif); diff --git a/src/engine/engine_support.c b/src/engine/engine_support.c index cdb4770f..5951d67d 100644 --- a/src/engine/engine_support.c +++ b/src/engine/engine_support.c @@ -1342,7 +1342,7 @@ void mj_differentiatePos(const mjModel* m, mjtNum* qvel, mjtNum dt, int padr = m->jnt_qposadr[j]; int vadr = m->jnt_dofadr[j]; - switch (m->jnt_type[j]) { + switch ((mjtJoint) m->jnt_type[j]) { case mjJNT_FREE: for (int i=0; i < 3; i++) { qvel[vadr+i] = (qpos2[padr+i] - qpos1[padr+i]) / dt; @@ -1376,7 +1376,7 @@ void mj_integratePos(const mjModel* m, mjtNum* qpos, const mjtNum* qvel, mjtNum int padr = m->jnt_qposadr[j]; int vadr = m->jnt_dofadr[j]; - switch (m->jnt_type[j]) { + switch ((mjtJoint) m->jnt_type[j]) { case mjJNT_FREE: // position update for (int i=0; i < 3; i++) { diff --git a/src/engine/engine_util_misc.c b/src/engine/engine_util_misc.c index ab382299..27c3be80 100644 --- a/src/engine/engine_util_misc.c +++ b/src/engine/engine_util_misc.c @@ -423,7 +423,7 @@ mjtNum mju_wrap(mjtNum* wpnt, const mjtNum* x0, const mjtNum* x1, // all 3 semi-axes of a geom void mju_geomSemiAxes(const mjModel* m, int geom_id, mjtNum semiaxes[3]) { mjtNum* size = m->geom_size + 3*geom_id; - switch (m->geom_type[geom_id]) { + switch ((mjtGeom) m->geom_type[geom_id]) { case mjGEOM_SPHERE: semiaxes[0] = size[0]; semiaxes[1] = size[0]; @@ -782,7 +782,7 @@ int mju_round(mjtNum x) { // convert type id to type name const char* mju_type2Str(int type) { - switch (type) { + switch ((mjtObj) type) { case mjOBJ_BODY: return "body"; @@ -992,7 +992,7 @@ const char* mju_writeNumBytes(size_t nbytes) { const char* mju_warningText(int warning, size_t info) { static mjTHREADLOCAL char str[1000]; - switch (warning) { + switch ((mjtWarning) warning) { case mjWARN_INERTIA: mjSNPRINTF(str, "Inertia matrix is too close to singular at DOF %zu. Check model.", info); break; diff --git a/src/engine/engine_vis_init.c b/src/engine/engine_vis_init.c index a581c9c1..eebb2768 100644 --- a/src/engine/engine_vis_init.c +++ b/src/engine/engine_vis_init.c @@ -354,7 +354,7 @@ float mjv_rbound(const mjvGeom* geom) { // compute rbound according to type const float* s = geom->size; - switch (geom->type) { + switch ((mjtMouse) geom->type) { case mjGEOM_SPHERE: return s[0]; diff --git a/src/engine/engine_vis_interact.c b/src/engine/engine_vis_interact.c index 81d5a6e5..49ad50c6 100644 --- a/src/engine/engine_vis_interact.c +++ b/src/engine/engine_vis_interact.c @@ -266,7 +266,7 @@ static void convert2D(mjtNum* res, int action, mjtNum dx, mjtNum dy, const mjtNu mjtNum vec[3]; // construct 3D vector - switch (action) { + switch ((mjtMouse) action) { case mjMOUSE_ROTATE_V: vec[0] = dy; vec[1] = 0; @@ -316,7 +316,7 @@ void mjv_moveCamera(const mjModel* m, int action, mjtNum reldx, mjtNum reldy, } // process action - switch (action) { + switch ((mjtMouse) action) { case mjMOUSE_ROTATE_V: case mjMOUSE_ROTATE_H: cam->azimuth -= reldx * 180.0; @@ -384,7 +384,7 @@ void mjv_movePerturb(const mjModel* m, const mjData* d, int action, mjtNum reldx convert2D(vec, action, reldx, reldy, forward); // process action - switch (action) { + switch ((mjtMouse) action) { case mjMOUSE_MOVE_V: case mjMOUSE_MOVE_H: mju_addToScl3(pert->refpos, vec, pert->scale); @@ -463,7 +463,7 @@ void mjv_moveModel(const mjModel* m, int action, mjtNum reldx, mjtNum reldy, mju_normalize3(roomright); // process action - switch (action) { + switch ((mjtMouse) action) { case mjMOUSE_ROTATE_V: case mjMOUSE_ROTATE_H: // construct rotation vector diff --git a/src/engine/engine_vis_visualize.c b/src/engine/engine_vis_visualize.c index 3d308da6..d1a36964 100644 --- a/src/engine/engine_vis_visualize.c +++ b/src/engine/engine_vis_visualize.c @@ -343,7 +343,7 @@ void mjv_initGeom(mjvGeom* geom, int type, const mjtNum* size, // set size (for XYZ scaling) if (size) { - switch (type) { + switch ((mjtGeom) type) { case mjGEOM_SPHERE: geom->size[0] = (float)size[0]; geom->size[1] = (float)size[0]; @@ -869,7 +869,7 @@ void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* vopt, int j = m->jnt_bodyid[i]; mjtNum* from; mjtNum to[3]; - switch (m->jnt_type[i]) { + switch ((mjtJoint) m->jnt_type[i]) { case mjJNT_FREE: thisgeom->type = mjGEOM_BOX; thisgeom->size[0] = thisgeom->size[1] = thisgeom->size[2] = 0.3*sz[1];