Remove all visual-only assets if discardvisual is selected, not only the geoms.

PiperOrigin-RevId: 598598250
Change-Id: I12e60ce41ad436d037b4877d197decf6bdce0fc8
This commit is contained in:
Alessio Quaglino
2024-01-15 06:38:11 -08:00
committed by Copybara-Service
parent acf698e2df
commit 1e2e0b3053
11 changed files with 557 additions and 65 deletions
+68 -27
View File
@@ -314,6 +314,7 @@ int mjCBoundingVolumeHierarchy::MakeBVH(std::vector<const mjCBoundingVolume*>& e
return -1;
}
bool is_visual = true;
int nelements = elements.size();
mjtNum AAMM[6] = {mjMAXVAL, mjMAXVAL, mjMAXVAL, -mjMAXVAL, -mjMAXVAL, -mjMAXVAL};
@@ -325,6 +326,8 @@ int mjCBoundingVolumeHierarchy::MakeBVH(std::vector<const mjCBoundingVolume*>& e
// skip visual objects
if (elements[i]->conaffinity==0 && elements[i]->contype==0) {
continue;
} else {
is_visual = false;
}
// transform element aabb to aamm format
@@ -360,6 +363,11 @@ int mjCBoundingVolumeHierarchy::MakeBVH(std::vector<const mjCBoundingVolume*>& e
}
}
// a body with only visual geoms does not have a bvh
if (is_visual) {
return nbvh;
}
// inflate flat AABBs
for (int i=0; i<3; i++) {
if (mju_abs(AAMM[i]-AAMM[i+3])<mjEPS) {
@@ -1088,6 +1096,18 @@ void mjCBody::Compile(void) {
throw mjCError(this, "plugin '%s' does not support passive forces", plugin->name);
}
}
if (!model->discardvisual) {
return;
}
// set inertial to explicit for bodies containing visual geoms
for (int j=0; j<geoms.size(); j++) {
if (geoms[j]->IsVisual()) {
explicitinertial = true;
break;
}
}
}
@@ -1350,6 +1370,7 @@ mjCGeom::mjCGeom(mjCModel* _model, mjCDef* _def) {
matid = -1;
mesh = nullptr;
hfield = nullptr;
visual_ = false;
// reset to default if given
if (_def) {
@@ -1737,6 +1758,9 @@ void mjCGeom::Compile(void) {
name.c_str(), id);
}
// check if can collide
visual_ = !contype && !conaffinity;
// normalize quaternion
mjuu_normvec(quat, 4);
@@ -3145,7 +3169,9 @@ mjCPair::mjCPair(mjCModel* _model, mjCDef* _def) {
friction[4] = 0.0001;
// clear internal variables
geom1 = geom2 = signature = -1;
geom1 = nullptr;
geom2 = nullptr;
signature = -1;
// reset to default if given
if (_def) {
@@ -3167,46 +3193,48 @@ void mjCPair::Compile(void) {
}
// find geom 1
mjCGeom* pg1 = (mjCGeom*)model->FindObject(mjOBJ_GEOM, geomname1);
if (!pg1) {
geom1 = (mjCGeom*)model->FindObject(mjOBJ_GEOM, geomname1);
if (!geom1) {
throw mjCError(this, "geom '%s' not found in collision %d", geomname1.c_str(), id);
}
// find geom 2
mjCGeom* pg2 = (mjCGeom*)model->FindObject(mjOBJ_GEOM, geomname2);
if (!pg2) {
geom2 = (mjCGeom*)model->FindObject(mjOBJ_GEOM, geomname2);
if (!geom2) {
throw mjCError(this, "geom '%s' not found in collision %d", geomname2.c_str(), id);
}
// mark geoms as not visual
geom1->SetNotVisual();
geom2->SetNotVisual();
// swap if body1 > body2
if (pg1->body->id > pg2->body->id) {
if (geom1->body->id > geom2->body->id) {
string nametmp = geomname1;
geomname1 = geomname2;
geomname2 = nametmp;
mjCGeom* geomtmp = pg1;
pg1 = pg2;
pg2 = geomtmp;
mjCGeom* geomtmp = geom1;
geom1 = geom2;
geom2 = geomtmp;
}
// get geom ids and body signature
geom1 = pg1->id;
geom2 = pg2->id;
signature = ((pg1->body->id)<<16) + pg2->body->id;
signature = ((geom1->body->id)<<16) + geom2->body->id;
// set undefined margin: max
if (!mjuu_defined(margin)) {
margin = mjMAX(pg1->margin, pg2->margin);
margin = mjMAX(geom1->margin, geom2->margin);
}
// set undefined gap: max
if (!mjuu_defined(gap)) {
gap = mjMAX(pg1->gap, pg2->gap);
gap = mjMAX(geom1->gap, geom2->gap);
}
// set undefined condim, friction, solref, solimp: different priority
if (pg1->priority!=pg2->priority) {
mjCGeom* pgh = (pg1->priority>pg2->priority ? pg1 : pg2);
if (geom1->priority!=geom2->priority) {
mjCGeom* pgh = (geom1->priority>geom2->priority ? geom1 : geom2);
// condim
if (condim<0) {
@@ -3239,23 +3267,23 @@ void mjCPair::Compile(void) {
else {
// condim: max
if (condim<0) {
condim = mjMAX(pg1->condim, pg2->condim);
condim = mjMAX(geom1->condim, geom2->condim);
}
// friction: max
if (!mjuu_defined(friction[0])) {
friction[0] = friction[1] = mju_max(pg1->friction[0], pg2->friction[0]);
friction[2] = mju_max(pg1->friction[1], pg2->friction[1]);
friction[3] = friction[4] = mju_max(pg1->friction[2], pg2->friction[2]);
friction[0] = friction[1] = mju_max(geom1->friction[0], geom2->friction[0]);
friction[2] = mju_max(geom1->friction[1], geom2->friction[1]);
friction[3] = friction[4] = mju_max(geom1->friction[2], geom2->friction[2]);
}
// solver mix factor
double mix;
if (pg1->solmix>=mjMINVAL && pg2->solmix>=mjMINVAL) {
mix = pg1->solmix / (pg1->solmix + pg2->solmix);
} else if (pg1->solmix<mjMINVAL && pg2->solmix<mjMINVAL) {
if (geom1->solmix>=mjMINVAL && geom2->solmix>=mjMINVAL) {
mix = geom1->solmix / (geom1->solmix + geom2->solmix);
} else if (geom1->solmix<mjMINVAL && geom2->solmix<mjMINVAL) {
mix = 0.5;
} else if (pg1->solmix<mjMINVAL) {
} else if (geom1->solmix<mjMINVAL) {
mix = 0.0;
} else {
mix = 1.0;
@@ -3266,14 +3294,14 @@ void mjCPair::Compile(void) {
// standard: mix
if (solref[0]>0) {
for (int i=0; i<mjNREF; i++) {
solref[i] = mix*pg1->solref[i] + (1-mix)*pg2->solref[i];
solref[i] = mix*geom1->solref[i] + (1-mix)*geom2->solref[i];
}
}
// direct: min
else {
for (int i=0; i<mjNREF; i++) {
solref[i] = mju_min(pg1->solref[i], pg2->solref[i]);
solref[i] = mju_min(geom1->solref[i], geom2->solref[i]);
}
}
}
@@ -3281,7 +3309,7 @@ void mjCPair::Compile(void) {
// impedance
if (!mjuu_defined(solimp[0])) {
for (int i=0; i<mjNIMP; i++) {
solimp[i] = mix*pg1->solimp[i] + (1-mix)*pg2->solimp[i];
solimp[i] = mix*geom1->solimp[i] + (1-mix)*geom2->solimp[i];
}
}
}
@@ -3666,6 +3694,9 @@ void mjCTendon::Compile(void) {
"tendon '%s' (id = %d): geom at pos %d not bracketed by sites",
name.c_str(), id, i);
}
// mark geoms as non visual
model->geoms[path[i]->obj->id]->SetNotVisual();
break;
case mjWRAP_JOINT:
@@ -4107,6 +4138,11 @@ void mjCSensor::Compile(void) {
name.c_str(), id);
}
// if geom mark it as non visual
if (objtype == mjOBJ_GEOM) {
((mjCGeom*)obj)->SetNotVisual();
}
// get sensorized object id
} else if (type != mjSENS_CLOCK && type != mjSENS_PLUGIN && type != mjSENS_USER) {
throw mjCError(this, "invalid type in sensor '%s' (id = %d)", name.c_str(), id);
@@ -4579,6 +4615,11 @@ void mjCTuple::Compile(void) {
throw mjCError(this, "unrecognized object '%s' in tuple %d", objname[i].c_str(), id);
}
// if geom mark it as non visual
if (objtype[i] == mjOBJ_GEOM) {
((mjCGeom*)res)->SetNotVisual();
}
// assign id
obj[i] = res;
}