Refactor duplicated frame drawing logic into a utility function.

PiperOrigin-RevId: 813675737
Change-Id: I7f9094852f26b2ddc08534bf87cf2f71476d99ec
This commit is contained in:
Haroon Qureshi
2025-10-01 03:35:12 -07:00
committed by Copybara-Service
parent f9d0bedb44
commit b1ae44d10f
+40 -162
View File
@@ -362,7 +362,39 @@ static void markselected(const mjVisual* vis, mjvGeom* geom) {
//----------------------------- camera functions ---------------------------------------------------
// draw 3 cylinders representing a "frame" decor element
void addFrameGeoms(mjvScene* scn, int i, mjtNum* pos, mjtNum* rot, float length, float width) {
// draw separate geoms for each axis
for (int j=0; j < 3; j++) {
mjtNum axis[3];
for (int k=0; k < 3; k++) {
axis[k] = (j == k ? length : 0);
}
mjtNum vec[3];
mju_mulMatVec(vec, rot, axis, 3, 3);
// create a cylinder
mjtNum to[3];
mju_add3(to, pos, vec);
mjvGeom* thisgeom = acquireGeom(scn, i, mjCAT_DECOR, mjOBJ_UNKNOWN);
if (!thisgeom) {
return;
}
mjv_connector(thisgeom, mjGEOM_CYLINDER, width, pos, to);
for (int k=0; k < 3; k++) {
thisgeom->rgba[k] = (j == k ? 0.9 : 0);
}
thisgeom->rgba[3] = 1;
releaseGeom(&thisgeom, scn);
}
}
//----------------------------- camera functions --------------------------------------------------
// computes the camera frustum
static void getFrustum(float zver[2], float zhor[2], float znear,
@@ -509,7 +541,7 @@ void mjv_cameraFrustum(float zver[2], float zhor[2], float zclip[2], const mjMod
static void addContactGeom(const mjModel* m, mjData* d, const mjtByte* flags,
const mjvOption* vopt, mjvScene* scn) {
int objtype = mjOBJ_UNKNOWN, category = mjCAT_DECOR;
mjtNum mat[9], tmp[9], vec[3], frc[3], confrc[6], axis[3];
mjtNum mat[9], tmp[9], vec[3], frc[3], confrc[6];
mjtNum framewidth, framelength, scl = m->stat.meansize;
mjContact* con;
mjvGeom* thisgeom;
@@ -614,34 +646,7 @@ static void addContactGeom(const mjModel* m, mjData* d, const mjtByte* flags,
// set length and width of axis cylinders using half regular frame scaling
framelength = m->vis.scale.framelength * scl / 2;
framewidth = m->vis.scale.framewidth * scl / 2;
// draw the three axes (separate geoms)
for (int j=0; j < 3; j++) {
thisgeom = acquireGeom(scn, i, category, objtype);
if (!thisgeom) {
return;
}
// prepare axis
for (int k=0; k < 3; k++) {
axis[k] = (j == k ? framelength : 0);
}
mju_mulMatVec(vec, mat, axis, 3, 3);
// create a cylinder
mjtNum* from = con->pos;
mjtNum to[3];
mju_add3(to, from, vec);
mjv_connector(thisgeom, mjGEOM_CYLINDER, framewidth, from, to);
// set color: R, G or B depending on axis
for (int k=0; k < 3; k++) {
thisgeom->rgba[k] = (j == k ? 0.9 : 0);
}
thisgeom->rgba[3] = 1;
releaseGeom(&thisgeom, scn);
}
addFrameGeoms(scn, i, con->pos, mat, framelength, framewidth);
}
// nothing else to do for excluded contacts
@@ -1302,34 +1307,7 @@ void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* vopt,
mjtNum* xmat = vopt->flags[mjVIS_INERTIA] ? d->ximat+9*i : d->xmat+9*i;
mjtNum* xpos = vopt->flags[mjVIS_INERTIA] ? d->xipos+3*i : d->xpos+3*i;
// draw the three axes (separate geoms)
for (int j=0; j < 3; j++) {
thisgeom = acquireGeom(scn, i, category, objtype);
if (!thisgeom) {
return;
}
// prepare axis
for (int k=0; k < 3; k++) {
axis[k] = (j == k ? sz[1] : 0);
}
mju_mulMatVec(vec, xmat, axis, 3, 3);
// create a cylinder
mjtNum* from = xpos;
mjtNum to[3];
mju_add3(to, from, vec);
mjv_connector(thisgeom, mjGEOM_CYLINDER, sz[0], from, to);
// set color: R, G or B depending on axis
for (int k=0; k < 3; k++) {
thisgeom->rgba[k] = (j == k ? 0.9 : 0);
}
thisgeom->rgba[3] = 1;
releaseGeom(&thisgeom, scn);
}
addFrameGeoms(scn, i, xpos, xmat, sz[1], sz[0]);
}
}
@@ -1839,32 +1817,7 @@ void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* vopt,
objtype = mjOBJ_UNKNOWN;
sz[0] = m->vis.scale.framewidth * scl;
sz[1] = m->vis.scale.framelength * scl;
for (int j=0; j < 3; j++) {
thisgeom = acquireGeom(scn, i, category, objtype);
if (!thisgeom) {
return;
}
// prepare axis
for (int k=0; k < 3; k++) {
axis[k] = (j == k ? sz[1] : 0);
}
mju_mulMatVec(vec, d->geom_xmat+9*i, axis, 3, 3);
// create a cylinder
mjtNum* from = d->geom_xpos+3*i;
mjtNum to[3];
mju_add3(to, from, vec);
mjv_connector(thisgeom, mjGEOM_CYLINDER, sz[0], from, to);
// set color: R, G or B depending on axis
for (int k=0; k < 3; k++) {
thisgeom->rgba[k] = (j == k ? 0.9 : 0);
}
thisgeom->rgba[3] = 1;
releaseGeom(&thisgeom, scn);
}
addFrameGeoms(scn, i, d->geom_xpos+3*i, d->geom_xmat+9*i, sz[1], sz[0]);
}
}
@@ -1920,32 +1873,7 @@ void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* vopt,
objtype = mjOBJ_UNKNOWN;
sz[0] = m->vis.scale.framewidth * scl;
sz[1] = m->vis.scale.framelength * scl;
for (int j=0; j < 3; j++) {
thisgeom = acquireGeom(scn, i, category, objtype);
if (!thisgeom) {
return;
}
// prepare axis
for (int k=0; k < 3; k++) {
axis[k] = (j == k ? sz[1] : 0);
}
mju_mulMatVec(vec, d->site_xmat+9*i, axis, 3, 3);
// create a cylinder
mjtNum* from = d->site_xpos+3*i;
mjtNum to[3];
mju_add3(to, from, vec);
mjv_connector(thisgeom, mjGEOM_CYLINDER, sz[0], from, to);
// set color: R, G or B depending on axis
for (int k=0; k < 3; k++) {
thisgeom->rgba[k] = (j == k ? 0.9 : 0);
}
thisgeom->rgba[3] = 1;
releaseGeom(&thisgeom, scn);
}
addFrameGeoms(scn, i, d->site_xpos+3*i, d->site_xmat+9*i, sz[1], sz[0]);
}
}
@@ -2105,32 +2033,7 @@ void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* vopt,
objtype = mjOBJ_UNKNOWN;
sz[0] = m->vis.scale.framewidth * scl;
sz[1] = m->vis.scale.framelength * scl;
for (int j=0; j < 3; j++) {
thisgeom = acquireGeom(scn, i, category, objtype);
if (!thisgeom) {
return;
}
// prepare axis
for (int k=0; k < 3; k++) {
axis[k] = (j == k ? sz[1] : 0);
}
mju_mulMatVec(vec, d->cam_xmat+9*i, axis, 3, 3);
// create a cylinder
mjtNum* from = d->cam_xpos+3*i;
mjtNum to[3];
mju_add3(to, from, vec);
mjv_connector(thisgeom, mjGEOM_CYLINDER, sz[0], from, to);
// set color: R, G or B depending on axis
for (int k=0; k < 3; k++) {
thisgeom->rgba[k] = (j == k ? 0.9 : 0);
}
thisgeom->rgba[3] = 1;
releaseGeom(&thisgeom, scn);
}
addFrameGeoms(scn, i, d->cam_xpos+3*i, d->cam_xmat+9*i, sz[1], sz[0]);
}
}
@@ -2178,32 +2081,7 @@ void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* vopt,
objtype = mjOBJ_UNKNOWN;
sz[0] = m->vis.scale.framewidth * scl;
sz[1] = m->vis.scale.framelength * scl;
for (int j=0; j < 3; j++) {
thisgeom = acquireGeom(scn, i, category, objtype);
if (!thisgeom) {
return;
}
// prepare axis
for (int k=0; k < 3; k++) {
axis[k] = (j == k ? sz[1] : 0);
}
mju_mulMatVec(vec, mat, axis, 3, 3);
// create a cylinder
mjtNum* from = d->light_xpos+3*i;
mjtNum to[3];
mju_add3(to, from, vec);
mjv_connector(thisgeom, mjGEOM_CYLINDER, sz[0], from, to);
// set color: R, G or B depending on axis
for (int k=0; k < 3; k++) {
thisgeom->rgba[k] = (j == k ? 0.9 : 0);
}
thisgeom->rgba[3] = 1;
releaseGeom(&thisgeom, scn);
}
addFrameGeoms(scn, i, d->light_xpos+3*i, mat, sz[1], sz[0]);
}
}