Declare loop variables inside for loop declaration where possible.

PiperOrigin-RevId: 518846098
Change-Id: Icdb2e5894bd80110552e29270472eeb242e6cf2c
This commit is contained in:
Nimrod Gileadi
2023-03-23 06:48:32 -07:00
committed by Copybara-Service
parent ce6c9053e2
commit 145fe7f354
9 changed files with 111 additions and 107 deletions
+5 -5
View File
@@ -517,7 +517,7 @@ typedef struct _mjtPrism mjtPrism;
// ccd prism support function // ccd prism support function
static void prism_support(const void *obj, const ccd_vec3_t *dir, ccd_vec3_t *vec) { static void prism_support(const void *obj, const ccd_vec3_t *dir, ccd_vec3_t *vec) {
int i, istart, ibest; int istart, ibest;
mjtNum best, tmp; mjtNum best, tmp;
const mjtPrism* p = (const mjtPrism*)obj; const mjtPrism* p = (const mjtPrism*)obj;
@@ -525,7 +525,7 @@ static void prism_support(const void *obj, const ccd_vec3_t *dir, ccd_vec3_t *ve
istart = dir->v[2]<0 ? 0 : 3; istart = dir->v[2]<0 ? 0 : 3;
ibest = istart; ibest = istart;
best = mju_dot3(p->v[istart], dir->v); best = mju_dot3(p->v[istart], dir->v);
for (i=istart+1; i<istart+3; i++) { for (int i=istart+1; i<istart+3; i++) {
if ((tmp = mju_dot3(p->v[i], dir->v)) > best) { if ((tmp = mju_dot3(p->v[i], dir->v)) > best) {
ibest = i; ibest = i;
best = tmp; best = tmp;
@@ -584,7 +584,7 @@ int mjc_ConvexHField(const mjModel* m, const mjData* d,
int hid = m->geom_dataid[g1]; int hid = m->geom_dataid[g1];
int nrow = m->hfield_nrow[hid]; int nrow = m->hfield_nrow[hid];
int ncol = m->hfield_ncol[hid]; int ncol = m->hfield_ncol[hid];
int r, c, dr[2], cnt, rmin, rmax, cmin, cmax, nvert; int dr[2], cnt, rmin, rmax, cmin, cmax, nvert;
const float* data = m->hfield_data + m->hfield_adr[hid]; const float* data = m->hfield_data + m->hfield_adr[hid];
mjtPrism prism; mjtPrism prism;
@@ -710,9 +710,9 @@ int mjc_ConvexHField(const mjModel* m, const mjData* d,
// process all prisms in sub-grid // process all prisms in sub-grid
cnt = 0; cnt = 0;
for (r=rmin; r<rmax; r++) { for (int r=rmin; r<rmax; r++) {
nvert = 0; nvert = 0;
for (c=cmin; c<=cmax; c++) { for (int c=cmin; c<=cmax; c++) {
for (int i=0; i<2; i++) { for (int i=0; i<2; i++) {
// send vertex to prism constructor // send vertex to prism constructor
addVert(&nvert, &prism, dx*c-size1[0], dy*(r+dr[i])-size1[1], addVert(&nvert, &prism, dx*c-size1[0], dy*(r+dr[i])-size1[1],
+20 -21
View File
@@ -664,7 +664,7 @@ int mj_broadphase(const mjModel* m, mjData* d, int* pair, int maxpair) {
// find center of non-world geoms; return if none // find center of non-world geoms; return if none
cnt = 0; cnt = 0;
mju_zero3(cen); mju_zero3(cen);
for (i=0; i<ngeom; i++) { for (int i=0; i<ngeom; i++) {
if (m->geom_bodyid[i]) { if (m->geom_bodyid[i]) {
mju_addTo3(cen, d->geom_xpos+3*i); mju_addTo3(cen, d->geom_xpos+3*i);
cnt++; cnt++;
@@ -673,14 +673,14 @@ int mj_broadphase(const mjModel* m, mjData* d, int* pair, int maxpair) {
if (cnt==0) { if (cnt==0) {
return npair; return npair;
} else { } else {
for (i=0; i<3; i++) { for (int i=0; i<3; i++) {
cen[i] /= cnt; cen[i] /= cnt;
} }
} }
// compute covariance // compute covariance
mju_zero(cov, 9); mju_zero(cov, 9);
for (i=0; i<ngeom; i++) { for (int i=0; i<ngeom; i++) {
if (m->geom_bodyid[i]) { if (m->geom_bodyid[i]) {
mju_sub3(dif, d->geom_xpos+3*i, cen); mju_sub3(dif, d->geom_xpos+3*i, cen);
mjtNum D00 = dif[0]*dif[0]; mjtNum D00 = dif[0]*dif[0];
@@ -700,7 +700,7 @@ int mj_broadphase(const mjModel* m, mjData* d, int* pair, int maxpair) {
cov[8] += D22; cov[8] += D22;
} }
} }
for (i=0; i<9; i++) { for (int i=0; i<9; i++) {
cov[i] /= cnt; cov[i] /= cnt;
} }
@@ -713,7 +713,7 @@ int mj_broadphase(const mjModel* m, mjData* d, int* pair, int maxpair) {
// construct body AABB for the aligned frame, count collidable // construct body AABB for the aligned frame, count collidable
int bufcnt = 0; int bufcnt = 0;
for (i=1; i<nbody; i++) { for (int i=1; i<nbody; i++) {
makeAABB(m, d, aabb+6*i, i, frame); makeAABB(m, d, aabb+6*i, i, frame);
if (can_collide(m, i)) { if (can_collide(m, i)) {
@@ -734,7 +734,7 @@ int mj_broadphase(const mjModel* m, mjData* d, int* pair, int maxpair) {
// init sortbuf with axis0 // init sortbuf with axis0
j = 0; j = 0;
for (i=1; i<nbody; i++) { for (int i=1; i<nbody; i++) {
// cannot colide // cannot colide
if (!can_collide(m, i)) { if (!can_collide(m, i)) {
continue; continue;
@@ -758,10 +758,10 @@ int mj_broadphase(const mjModel* m, mjData* d, int* pair, int maxpair) {
// sweep and prune // sweep and prune
cnt = 0; // size of active list cnt = 0; // size of active list
for (i=0; i<2*bufcnt; i++) { for (int i=0; i<2*bufcnt; i++) {
// min value: collide with all in list, add // min value: collide with all in list, add
if (!(sortbuf[i].body_ismax & 0x10000)) { if (!(sortbuf[i].body_ismax & 0x10000)) {
for (j=0; j<cnt; j++) { for (int j=0; j<cnt; j++) {
// get body ids: no need to mask ismax because activebuf entries never have the ismax bit, // get body ids: no need to mask ismax because activebuf entries never have the ismax bit,
// and sortbuf[i].body_ismax is tested above // and sortbuf[i].body_ismax is tested above
b1 = activebuf[j].body_ismax; b1 = activebuf[j].body_ismax;
@@ -797,7 +797,7 @@ int mj_broadphase(const mjModel* m, mjData* d, int* pair, int maxpair) {
// max value: remove corresponding min value from list // max value: remove corresponding min value from list
else { else {
toremove = sortbuf[i].body_ismax & 0xFFFF; toremove = sortbuf[i].body_ismax & 0xFFFF;
for (j=0; j<cnt; j++) { for (int j=0; j<cnt; j++) {
if (activebuf[j].body_ismax==toremove) { if (activebuf[j].body_ismax==toremove) {
if (j<cnt-1) { if (j<cnt-1) {
memmove(activebuf+j, activebuf+j+1, sizeof(mjtBroadphase)*(cnt-1-j)); memmove(activebuf+j, activebuf+j+1, sizeof(mjtBroadphase)*(cnt-1-j));
@@ -921,14 +921,13 @@ void mj_collideGeoms(const mjModel* m, mjData* d, int g1, int g2, int flg_user,
// remove repeated contacts in box-box // remove repeated contacts in box-box
if (type1==mjGEOM_BOX && type2==mjGEOM_BOX) { if (type1==mjGEOM_BOX && type2==mjGEOM_BOX) {
// use dim field to mark: -1: bad, 0: good // use dim field to mark: -1: bad, 0: good
for (i=0; i<num; i++) { for (int i=0; i<num; i++) {
con[i].dim = 0; con[i].dim = 0;
} }
// find bad // find bad
int j; for (int i=0; i<num-1; i++) {
for (i=0; i<num-1; i++) { for (int j=i+1; j<num; j++) {
for (j=i+1; j<num; j++) {
if (con[i].pos[0]==con[j].pos[0] && if (con[i].pos[0]==con[j].pos[0] &&
con[i].pos[1]==con[j].pos[1] && con[i].pos[1]==con[j].pos[1] &&
con[i].pos[2]==con[j].pos[2]) { con[i].pos[2]==con[j].pos[2]) {
@@ -940,7 +939,7 @@ void mj_collideGeoms(const mjModel* m, mjData* d, int g1, int g2, int flg_user,
// consolidate good // consolidate good
i = 0; i = 0;
for (j=0; j<num; j++) { for (int j=0; j<num; j++) {
if (con[j].dim==0) { if (con[j].dim==0) {
// different: copy // different: copy
if (i<j) { if (i<j) {
@@ -963,7 +962,7 @@ void mj_collideGeoms(const mjModel* m, mjData* d, int g1, int g2, int flg_user,
int gp = (m->geom_priority[g1]>m->geom_priority[g2] ? g1 : g2); int gp = (m->geom_priority[g1]>m->geom_priority[g2] ? g1 : g2);
// friction // friction
for (i=0; i<3; i++) { for (int i=0; i<3; i++) {
friction[2*i] = m->geom_friction[3*gp+i]; friction[2*i] = m->geom_friction[3*gp+i];
} }
@@ -977,7 +976,7 @@ void mj_collideGeoms(const mjModel* m, mjData* d, int g1, int g2, int flg_user,
// same priority // same priority
else { else {
// friction: max // friction: max
for (i=0; i<3; i++) { for (int i=0; i<3; i++) {
friction[2*i] = mju_max(m->geom_friction[3*g1+i], m->geom_friction[3*g2+i]); friction[2*i] = mju_max(m->geom_friction[3*g1+i], m->geom_friction[3*g2+i]);
} }
@@ -994,14 +993,14 @@ void mj_collideGeoms(const mjModel* m, mjData* d, int g1, int g2, int flg_user,
// reference standard: mix // reference standard: mix
if (m->geom_solref[mjNREF*g1]>0 && m->geom_solref[mjNREF*g2]>0) { if (m->geom_solref[mjNREF*g1]>0 && m->geom_solref[mjNREF*g2]>0) {
for (i=0; i<mjNREF; i++) { for (int i=0; i<mjNREF; i++) {
solref[i] = mix*m->geom_solref[mjNREF*g1+i] + (1-mix)*m->geom_solref[mjNREF*g2+i]; solref[i] = mix*m->geom_solref[mjNREF*g1+i] + (1-mix)*m->geom_solref[mjNREF*g2+i];
} }
} }
// reference direct: min // reference direct: min
else { else {
for (i=0; i<mjNREF; i++) { for (int i=0; i<mjNREF; i++) {
solref[i] = mju_min(m->geom_solref[mjNREF*g1+i], m->geom_solref[mjNREF*g2+i]); solref[i] = mju_min(m->geom_solref[mjNREF*g1+i], m->geom_solref[mjNREF*g2+i]);
} }
} }
@@ -1019,7 +1018,7 @@ void mj_collideGeoms(const mjModel* m, mjData* d, int g1, int g2, int flg_user,
// set friction, solref, solimp: pair // set friction, solref, solimp: pair
else { else {
// friction // friction
for (i=0; i<5; i++) { for (int i=0; i<5; i++) {
friction[i] = m->pair_friction[5*ipair+i]; friction[i] = m->pair_friction[5*ipair+i];
} }
@@ -1031,12 +1030,12 @@ void mj_collideGeoms(const mjModel* m, mjData* d, int g1, int g2, int flg_user,
} }
// clamp friction to mjMINMU // clamp friction to mjMINMU
for (i=0; i<5; i++) { for (int i=0; i<5; i++) {
friction[i] = mju_max(mjMINMU, friction[i]); friction[i] = mju_max(mjMINMU, friction[i]);
} }
// add contact returned by collision detector // add contact returned by collision detector
for (i=0; i<num; i++) { for (int i=0; i<num; i++) {
// set contact data // set contact data
if (condim > 6 || condim < 1) { // SHOULD NOT OCCUR if (condim > 6 || condim < 1) { // SHOULD NOT OCCUR
mju_error("Invalid condim value: %d", i); mju_error("Invalid condim value: %d", i);
+6 -4
View File
@@ -544,20 +544,22 @@ static void mj_advance(const mjModel* m, mjData* d,
// Euler integrator, semi-implicit in velocity, possibly skipping factorisation // Euler integrator, semi-implicit in velocity, possibly skipping factorisation
void mj_EulerSkip(const mjModel* m, mjData* d, int skipfactor) { void mj_EulerSkip(const mjModel* m, mjData* d, int skipfactor) {
int i, nv = m->nv, nM = m->nM; int nv = m->nv, nM = m->nM;
mjMARKSTACK; mjMARKSTACK;
mjtNum* qfrc = mj_stackAlloc(d, nv); mjtNum* qfrc = mj_stackAlloc(d, nv);
mjtNum* qacc = mj_stackAlloc(d, nv); mjtNum* qacc = mj_stackAlloc(d, nv);
// check for dof damping // check for dof damping
for (i=0; i<nv; i++) { int dof_damping = 0;
for (int i=0; i<nv; i++) {
if (m->dof_damping[i]>0) { if (m->dof_damping[i]>0) {
dof_damping = 1;
break; break;
} }
} }
// no damping: explicit velocity integration // no damping: explicit velocity integration
if (i>=nv) { if (!dof_damping) {
mju_copy(qacc, d->qacc, nv); mju_copy(qacc, d->qacc, nv);
} }
@@ -568,7 +570,7 @@ void mj_EulerSkip(const mjModel* m, mjData* d, int skipfactor) {
// MhB = M + h*diag(B) // MhB = M + h*diag(B)
mju_copy(MhB, d->qM, m->nM); mju_copy(MhB, d->qM, m->nM);
for (i=0; i<nv; i++) { for (int i=0; i<nv; i++) {
MhB[m->dof_Madr[i]] += m->opt.timestep * m->dof_damping[i]; MhB[m->dof_Madr[i]] += m->opt.timestep * m->dof_damping[i];
} }
+3 -3
View File
@@ -622,7 +622,7 @@ void mj_saveModel(const mjModel* m, const char* filename, void* buffer, int buff
// load model from binary MJB file // load model from binary MJB file
// if vfs is not NULL, look up file in vfs before reading from disk // if vfs is not NULL, look up file in vfs before reading from disk
mjModel* mj_loadModel(const char* filename, const mjVFS* vfs) { mjModel* mj_loadModel(const char* filename, const mjVFS* vfs) {
int i, header[4] = {0}; int header[4] = {0};
int expected_header[4] = {ID, sizeof(mjtNum), getnint(), getnptr()}; int expected_header[4] = {ID, sizeof(mjtNum), getnint(), getnptr()};
int info[2000]; int info[2000];
int ptrbuf = 0; int ptrbuf = 0;
@@ -633,7 +633,7 @@ mjModel* mj_loadModel(const char* filename, const mjVFS* vfs) {
const void* buffer = NULL; const void* buffer = NULL;
int buffer_sz = 0; int buffer_sz = 0;
if (vfs) { if (vfs) {
i = mj_findFileVFS(vfs, filename); int i = mj_findFileVFS(vfs, filename);
if (i>=0) { if (i>=0) {
buffer_sz = vfs->filesize[i]; buffer_sz = vfs->filesize[i];
buffer = vfs->filedata[i]; buffer = vfs->filedata[i];
@@ -660,7 +660,7 @@ mjModel* mj_loadModel(const char* filename, const mjVFS* vfs) {
} }
// check header // check header
for (i=0; i<4; i++) { for (int i=0; i<4; i++) {
if (header[i]!=expected_header[i]) { if (header[i]!=expected_header[i]) {
if (fp) { if (fp) {
fclose(fp); fclose(fp);
+2 -1
View File
@@ -105,7 +105,7 @@ static void ARdiaginv(const mjModel* m, mjData* d, mjtNum* res, int flg_subR) {
// extract diagonal block from AR, clamp diag to 1e-10 if flg_subR // extract diagonal block from AR, clamp diag to 1e-10 if flg_subR
static void extractBlock(const mjModel* m, mjData* d, mjtNum* Ac, static void extractBlock(const mjModel* m, mjData* d, mjtNum* Ac,
int start, int n, int flg_subR) { int start, int n, int flg_subR) {
int k, nefc = d->nefc; int nefc = d->nefc;
const mjtNum *AR = d->efc_AR; const mjtNum *AR = d->efc_AR;
const int *rownnz = d->efc_AR_rownnz, *rowadr = d->efc_AR_rowadr, *colind = d->efc_AR_colind; const int *rownnz = d->efc_AR_rownnz, *rowadr = d->efc_AR_rowadr, *colind = d->efc_AR_colind;
@@ -123,6 +123,7 @@ static void extractBlock(const mjModel* m, mjData* d, mjtNum* Ac,
} }
*/ */
// assume full sub-matrix, find starting k: same for all rows // assume full sub-matrix, find starting k: same for all rows
int k;
for (k=0; k<rownnz[start]; k++) { for (k=0; k<rownnz[start]; k++) {
if (colind[rowadr[start]+k]==start) { if (colind[rowadr[start]+k]==start) {
break; break;
+1 -1
View File
@@ -45,7 +45,7 @@ static void vfs_strippath(char* newname, const char* oldname) {
mju_strncpy(newname, oldname+i+1, mjMAXVFSNAME); mju_strncpy(newname, oldname+i+1, mjMAXVFSNAME);
// make lowercase // make lowercase
for (i=strlen(newname)-1; i>=0; i--) { for (int i=strlen(newname)-1; i>=0; i--) {
if (newname[i]>='A' && newname[i]<='Z') { if (newname[i]>='A' && newname[i]<='Z') {
newname[i] = (char)(((int)newname[i]) +'a' - 'A'); newname[i] = (char)(((int)newname[i]) +'a' - 'A');
} }
+3 -3
View File
@@ -1059,9 +1059,9 @@ void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* vopt,
} }
// get geom group and clamp // get geom group and clamp
int j = mjMAX(0, mjMIN(mjNGROUP-1, m->geom_group[i])); int geomgroup = mjMAX(0, mjMIN(mjNGROUP-1, m->geom_group[i]));
if (vopt->geomgroup[j]) { if (vopt->geomgroup[geomgroup]) {
START START
// construct geom // construct geom
@@ -1116,7 +1116,7 @@ void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* vopt,
// re-center infinite plane // re-center infinite plane
if (m->geom_size[3*i]<=0 || m->geom_size[3*i+1]<=0) { if (m->geom_size[3*i]<=0 || m->geom_size[3*i+1]<=0) {
// vec = headpos - geompos // vec = headpos - geompos
for (j=0; j<3; j++) { for (int j=0; j<3; j++) {
vec[j] = 0.5*(scn->camera[0].pos[j] + scn->camera[1].pos[j]) - d->geom_xpos[3*i+j]; vec[j] = 0.5*(scn->camera[0].pos[j] + scn->camera[1].pos[j]) - d->geom_xpos[3*i+j];
} }
+2 -2
View File
@@ -1428,7 +1428,7 @@ static void mjGlad_find_coreGL(void) {
* https://github.com/elmindreda/greg/blob/master/templates/greg.c.in#L176 * https://github.com/elmindreda/greg/blob/master/templates/greg.c.in#L176
* https://github.com/glfw/glfw/blob/master/src/context.c#L36 * https://github.com/glfw/glfw/blob/master/src/context.c#L36
*/ */
int i, major, minor; int major, minor;
const char* version; const char* version;
const char* prefixes[] = { const char* prefixes[] = {
@@ -1441,7 +1441,7 @@ static void mjGlad_find_coreGL(void) {
version = (const char*) glGetString(GL_VERSION); version = (const char*) glGetString(GL_VERSION);
if (!version) return; if (!version) return;
for (i = 0; prefixes[i]; i++) { for (int i = 0; prefixes[i]; i++) {
const size_t length = strlen(prefixes[i]); const size_t length = strlen(prefixes[i]);
if (strncmp(version, prefixes[i], length) == 0) { if (strncmp(version, prefixes[i], length) == 0) {
version += length; version += length;
+69 -67
View File
@@ -1656,7 +1656,6 @@ void mjui_update(int section, int item, const mjUI* ui,
} }
// draw section(s) // draw section(s)
int k;
mjtNum sel; mjtNum sel;
mjrRect r; mjrRect r;
char text[mjMAXUITEXT]; char text[mjMAXUITEXT];
@@ -1776,7 +1775,7 @@ void mjui_update(int section, int item, const mjUI* ui,
drawrectangle(r, rgbpane, rgbpane, con); drawrectangle(r, rgbpane, rgbpane, con);
// text lines // text lines
for (k=0; k<it->multi.nelem; k++) { for (int k=0; k<it->multi.nelem; k++) {
drawtext(it->multi.name[k], drawtext(it->multi.name[k],
r.left+g_texthor, r.left+g_texthor,
r.bottom+g_textver+(it->multi.nelem-k-1)*(con->charHeight+g_textver), r.bottom+g_textver+(it->multi.nelem-k-1)*(con->charHeight+g_textver),
@@ -1809,35 +1808,37 @@ void mjui_update(int section, int item, const mjUI* ui,
break; break;
case mjITEM_CHECKINT: case mjITEM_CHECKINT:
case mjITEM_CHECKBYTE: case mjITEM_CHECKBYTE: {
if (state) { if (state) {
rgbdecor = ui->color.check; rgbdecor = ui->color.check;
}
// get value according to type
int k;
if (it->type==mjITEM_CHECKINT) {
k = *(int*)it->pdata;
} else {
k = *(mjtByte*)it->pdata;
}
// filled or outline
if (k) {
drawrectangle(it->rect, rgbdecor, NULL, con);
} else {
drawrectangle(it->rect, rgbdecor, rgbpane, con);
}
// name
drawtext(it->name,
it->rect.left+g_texthor,
it->rect.bottom+g_textver,
maxwidth, rgbfont, con);
// shortcut
if (ui->mousehelp && it->single.shortcut)
shortcuthelp(it->rect, it->single.modifier, it->single.shortcut,
ui, con);
} }
// get value according to type
if (it->type==mjITEM_CHECKINT) {
k = *(int*)it->pdata;
} else {
k = *(mjtByte*)it->pdata;
}
// filled or outline
if (k) {
drawrectangle(it->rect, rgbdecor, NULL, con);
} else {
drawrectangle(it->rect, rgbdecor, rgbpane, con);
}
// name
drawtext(it->name,
it->rect.left+g_texthor,
it->rect.bottom+g_textver,
maxwidth, rgbfont, con);
// shortcut
if (ui->mousehelp && it->single.shortcut)
shortcuthelp(it->rect, it->single.modifier, it->single.shortcut,
ui, con);
break; break;
case mjITEM_RADIO: case mjITEM_RADIO:
@@ -1859,7 +1860,7 @@ void mjui_update(int section, int item, const mjUI* ui,
drawrectangle(r, rgbdecor, NULL, con); drawrectangle(r, rgbdecor, NULL, con);
// element names // element names
for (k=0; k<it->multi.nelem; k++) { for (int k=0; k<it->multi.nelem; k++) {
r = radioelement(it, k, ui, con); r = radioelement(it, k, ui, con);
drawtext(it->multi.name[k], drawtext(it->multi.name[k],
r.left+g_texthor, r.left+g_texthor,
@@ -1868,39 +1869,40 @@ void mjui_update(int section, int item, const mjUI* ui,
} }
break; break;
case mjITEM_RADIOLINE: case mjITEM_RADIOLINE: {
if (state) { if (state) {
rgbdecor = ui->color.radio; rgbdecor = ui->color.radio;
} }
// name // name
drawtext(it->name, drawtext(it->name,
s->rcontent.left+g_itemside+g_texthor, s->rcontent.left+g_itemside+g_texthor,
it->rect.bottom+g_textver, it->rect.bottom+g_textver,
g_label-2*g_texthor, rgbfont, con); g_label-2*g_texthor, rgbfont, con);
// outline // outline
drawrectangle(it->rect, rgbdecor, rgbpane, con); drawrectangle(it->rect, rgbdecor, rgbpane, con);
// make separators // make separators
makeradioline(it, con, sep); makeradioline(it, con, sep);
// fill selected // fill selected
k = *(int*)it->pdata; int k = *(int*)it->pdata;
r = it->rect;
r.left += sep[k];
r.width = sep[k+1] - sep[k];
drawrectangle(r, rgbdecor, NULL, con);
// element names
for (k=0; k<it->multi.nelem; k++) {
// compute rectangle for element
r = it->rect; r = it->rect;
r.left += sep[k]; r.left += sep[k];
r.width = sep[k+1] - sep[k]; r.width = sep[k+1] - sep[k];
drawrectangle(r, rgbdecor, NULL, con);
// draw centered // element names
drawtextrect(r, it->multi.name[k], rgbfont, con); for (int k=0; k<it->multi.nelem; k++) {
// compute rectangle for element
r = it->rect;
r.left += sep[k];
r.width = sep[k+1] - sep[k];
// draw centered
drawtextrect(r, it->multi.name[k], rgbfont, con);
}
} }
break; break;
@@ -1959,7 +1961,7 @@ void mjui_update(int section, int item, const mjUI* ui,
r.height = g_textver; r.height = g_textver;
// draw ticks // draw ticks
for (k=1; k<(int)it->slider.divisions; k++) { for (int k=1; k<(int)it->slider.divisions; k++) {
r.left = it->rect.left - r.width/2 + r.left = it->rect.left - r.width/2 +
it->rect.width*k/it->slider.divisions; it->rect.width*k/it->slider.divisions;
drawrectangle(r, rgbpane, NULL, con); drawrectangle(r, rgbpane, NULL, con);
@@ -2007,8 +2009,8 @@ void mjui_update(int section, int item, const mjUI* ui,
} }
// show cursor // show cursor
k = textwidth(ui->edittext + ui->editscroll, con, int k = textwidth(ui->edittext + ui->editscroll, con,
ui->editcursor - ui->editscroll); ui->editcursor - ui->editscroll);
r.left = it->rect.left + g_texthor + k - SCL(1, con); r.left = it->rect.left + g_texthor + k - SCL(1, con);
r.width = 2*SCL(1, con); r.width = 2*SCL(1, con);
r.bottom = it->rect.bottom + g_textver/2; r.bottom = it->rect.bottom + g_textver/2;
@@ -2064,7 +2066,7 @@ void mjui_update(int section, int item, const mjUI* ui,
drawrectangle(r, ui->color.select2, NULL, con); drawrectangle(r, ui->color.select2, NULL, con);
// hightlight row under mouse // hightlight row under mouse
k = findselect(it, ui, state, con); int k = findselect(it, ui, state, con);
if (k>=0) { if (k>=0) {
mjrRect r1 = r; mjrRect r1 = r;
r1.bottom = r.bottom + (it->multi.nelem-1-k)*cellheight; r1.bottom = r.bottom + (it->multi.nelem-1-k)*cellheight;
@@ -2073,7 +2075,7 @@ void mjui_update(int section, int item, const mjUI* ui,
} }
// values // values
for (k=0; k<it->multi.nelem; k++) { for (int k=0; k<it->multi.nelem; k++) {
drawtext(it->multi.name[k], drawtext(it->multi.name[k],
r.left+g_texthor, r.left+g_texthor,
r.bottom+g_textver+(it->multi.nelem-1-k)*cellheight, r.bottom+g_textver+(it->multi.nelem-1-k)*cellheight,
@@ -2223,7 +2225,7 @@ mjuiItem* mjui_event(mjUI* ui, mjuiState* state, const mjrContext* con) {
else if (sect_cur>0 && item_cur<0) { else if (sect_cur>0 && item_cur<0) {
// double-click: make all sections like this // double-click: make all sections like this
if (state->doubleclick) { if (state->doubleclick) {
for (i=0; i<ui->nsect; i++) { for (int i=0; i<ui->nsect; i++) {
if (ui->sect[i].state<2 && ui->sect[sect_cur-1].state<2) { if (ui->sect[i].state<2 && ui->sect[sect_cur-1].state<2) {
ui->sect[i].state = ui->sect[sect_cur-1].state; ui->sect[i].state = ui->sect[sect_cur-1].state;
} }
@@ -2445,7 +2447,7 @@ mjuiItem* mjui_event(mjUI* ui, mjuiState* state, const mjrContext* con) {
case mjKEY_BACKSPACE: // delete before cursor case mjKEY_BACKSPACE: // delete before cursor
if (ui->editcursor>0) { if (ui->editcursor>0) {
// shift chars after cursor to the left // shift chars after cursor to the left
for (i=ui->editcursor; i<=strlen(ui->edittext); i++) { for (int i=ui->editcursor; i<=strlen(ui->edittext); i++) {
ui->edittext[i-1] = ui->edittext[i]; ui->edittext[i-1] = ui->edittext[i];
} }
@@ -2457,7 +2459,7 @@ mjuiItem* mjui_event(mjUI* ui, mjuiState* state, const mjrContext* con) {
case mjKEY_DELETE: // delete after cursor case mjKEY_DELETE: // delete after cursor
if (ui->editcursor<strlen(ui->edittext)) { if (ui->editcursor<strlen(ui->edittext)) {
// shift chars after cursor to the left // shift chars after cursor to the left
for (i=ui->editcursor; i<=strlen(ui->edittext); i++) { for (int i=ui->editcursor; i<=strlen(ui->edittext); i++) {
ui->edittext[i] = ui->edittext[i+1]; ui->edittext[i] = ui->edittext[i+1];
} }
} }
@@ -2467,7 +2469,7 @@ mjuiItem* mjui_event(mjUI* ui, mjuiState* state, const mjrContext* con) {
key = validkey(key, strlen(ui->edittext), it_edit->type, state); key = validkey(key, strlen(ui->edittext), it_edit->type, state);
if (key) { if (key) {
// shift chars after cursor to the right // shift chars after cursor to the right
for (i=strlen(ui->edittext); i>=ui->editcursor; i--) { for (int i=strlen(ui->edittext); i>=ui->editcursor; i--) {
ui->edittext[i+1] = ui->edittext[i]; ui->edittext[i+1] = ui->edittext[i];
} }
@@ -2494,7 +2496,7 @@ mjuiItem* mjui_event(mjUI* ui, mjuiState* state, const mjrContext* con) {
for (int n=0; n<ui->nsect; n++) for (int n=0; n<ui->nsect; n++)
if (matchshortcut(state, ui->sect[n].modifier, ui->sect[n].shortcut)) { if (matchshortcut(state, ui->sect[n].modifier, ui->sect[n].shortcut)) {
// collapse all // collapse all
for (i=0; i<ui->nsect; i++) { for (int i=0; i<ui->nsect; i++) {
if (ui->sect[i].state<2) { if (ui->sect[i].state<2) {
ui->sect[i].state = 0; ui->sect[i].state = 0;
} }
@@ -2516,7 +2518,7 @@ mjuiItem* mjui_event(mjUI* ui, mjuiState* state, const mjrContext* con) {
// search item shortcuts // search item shortcuts
for (int n=0; n<ui->nsect; n++) { for (int n=0; n<ui->nsect; n++) {
for (i=0; i<ui->sect[n].nitem; i++) { for (int i=0; i<ui->sect[n].nitem; i++) {
// get pointer to item // get pointer to item
it = ui->sect[n].item + i;; it = ui->sect[n].item + i;;