Remove goto statement from engine collision code.
PiperOrigin-RevId: 688539516 Change-Id: I29b5dd39acccde59df2dbcaf5e866eb6a0406c43
This commit is contained in:
committed by
Copybara-Service
parent
bfa78614c8
commit
708fd83a49
@@ -1243,48 +1243,43 @@ int mj_broadphase(const mjModel* m, mjData* d, int* bfpair, int maxpair) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// nothing collidable
|
if (ncollide > 1) {
|
||||||
if (ncollide < 2) {
|
// allocate and construct AAMMs for collidable only
|
||||||
goto endbroad;
|
mjtNum* aamm = mj_stackAllocNum(d, 6*ncollide);
|
||||||
}
|
for (int i=0; i < ncollide; i++) {
|
||||||
|
makeAAMM(m, d, aamm+6*i, bfid[i], frame);
|
||||||
// allocate and construct AAMMs for collidable only
|
|
||||||
mjtNum* aamm = mj_stackAllocNum(d, 6*ncollide);
|
|
||||||
for (int i=0; i < ncollide; i++) {
|
|
||||||
makeAAMM(m, d, aamm+6*i, bfid[i], frame);
|
|
||||||
}
|
|
||||||
|
|
||||||
// call SAP
|
|
||||||
int maxsappair = ncollide*(ncollide-1)/2;
|
|
||||||
int* sappair = mj_stackAllocInt(d, maxsappair);
|
|
||||||
int nsappair = mj_SAP(d, aamm, ncollide, 0, sappair, maxsappair);
|
|
||||||
if (nsappair < 0) {
|
|
||||||
mjERROR("SAP failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
// filter SAP pairs, convert to bodyflex pairs
|
|
||||||
for (int i=0; i < nsappair; i++) {
|
|
||||||
int bf1 = bfid[sappair[i] >> 16];
|
|
||||||
int bf2 = bfid[sappair[i] & 0xFFFF];
|
|
||||||
|
|
||||||
// body pair: prune based on weld filter
|
|
||||||
if (bf1 < nbody && bf2 < nbody) {
|
|
||||||
int weld1 = m->body_weldid[bf1];
|
|
||||||
int weld2 = m->body_weldid[bf2];
|
|
||||||
int parent_weld1 = m->body_weldid[m->body_parentid[weld1]];
|
|
||||||
int parent_weld2 = m->body_weldid[m->body_parentid[weld2]];
|
|
||||||
|
|
||||||
if (filterBodyPair(weld1, parent_weld1, weld2, parent_weld2,
|
|
||||||
dsbl_filterparent)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// add bodyflex pair if there is room in buffer
|
// call SAP
|
||||||
add_pair(m, bf1, bf2, &npair, bfpair, maxpair);
|
int maxsappair = ncollide*(ncollide-1)/2;
|
||||||
}
|
int* sappair = mj_stackAllocInt(d, maxsappair);
|
||||||
|
int nsappair = mj_SAP(d, aamm, ncollide, 0, sappair, maxsappair);
|
||||||
|
if (nsappair < 0) {
|
||||||
|
mjERROR("SAP failed");
|
||||||
|
}
|
||||||
|
|
||||||
endbroad:
|
// filter SAP pairs, convert to bodyflex pairs
|
||||||
|
for (int i=0; i < nsappair; i++) {
|
||||||
|
int bf1 = bfid[sappair[i] >> 16];
|
||||||
|
int bf2 = bfid[sappair[i] & 0xFFFF];
|
||||||
|
|
||||||
|
// body pair: prune based on weld filter
|
||||||
|
if (bf1 < nbody && bf2 < nbody) {
|
||||||
|
int weld1 = m->body_weldid[bf1];
|
||||||
|
int weld2 = m->body_weldid[bf2];
|
||||||
|
int parent_weld1 = m->body_weldid[m->body_parentid[weld1]];
|
||||||
|
int parent_weld2 = m->body_weldid[m->body_parentid[weld2]];
|
||||||
|
|
||||||
|
if (filterBodyPair(weld1, parent_weld1, weld2, parent_weld2,
|
||||||
|
dsbl_filterparent)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// add bodyflex pair if there is room in buffer
|
||||||
|
add_pair(m, bf1, bf2, &npair, bfpair, maxpair);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// sort bodyflex pairs by signature
|
// sort bodyflex pairs by signature
|
||||||
if (npair > 1) {
|
if (npair > 1) {
|
||||||
|
|||||||
Reference in New Issue
Block a user