Commit: d0e9fc30eea08649f38708d5f78a300567271a59
Author: mattoverby
Date: Fri Aug 14 15:21:53 2020 -0500
Branches: soc-2020-soft-body
https://developer.blender.org/rBd0e9fc30eea08649f38708d5f78a300567271a59
reduce obstacle sdf computatoin
===================================================================
M intern/softbody/admmpd_api.cpp
===================================================================
diff --git a/intern/softbody/admmpd_api.cpp b/intern/softbody/admmpd_api.cpp
index 539d0981e2a..f7bc5eefcd5 100644
--- a/intern/softbody/admmpd_api.cpp
+++ b/intern/softbody/admmpd_api.cpp
@@ -50,6 +50,7 @@ struct CollisionObstacle
{
Eigen::VectorXf x0, x1;
std::vector<unsigned int> F;
+ bool needs_sdf_recompute;
};
struct ADMMPDInternalData
@@ -520,18 +521,47 @@ void admmpd_update_obstacles(
if (!iface->idata) { return; }
if (!iface->idata->collision) { return; }
if (nf==0 || nv==0) { return; }
-
int nv3 = nv*3;
- iface->idata->obs.x0.resize(nv3);
- iface->idata->obs.x1.resize(nv3);
int nf3 = nf*3;
- iface->idata->obs.F.resize(nf3);
+ iface->idata->obs.needs_sdf_recompute = false;
+
+ if (iface->idata->obs.x0.size()!=nv3) {
+ iface->idata->obs.x0.resize(nv3);
+ iface->idata->obs.needs_sdf_recompute = true;
+ }
+
+ if (iface->idata->obs.x1.size()!=nv3) {
+ iface->idata->obs.x1.resize(nv3);
+ iface->idata->obs.needs_sdf_recompute = true;
+ }
+
+ if (iface->idata->obs.F.size()!=nf3) {
+ iface->idata->obs.F.resize(nf3);
+ iface->idata->obs.needs_sdf_recompute = true;
+ }
for (int i=0; i<nv3; ++i) {
+
+ // Change in x?
+ if (!iface->idata->obs.needs_sdf_recompute) {
+ if (std::abs(iface->idata->obs.x0[i]-in_verts_0[i])>1e-8 ||
+ std::abs(iface->idata->obs.x1[i]-in_verts_1[i])>1e-8 ) {
+ iface->idata->obs.needs_sdf_recompute = true;
+ }
+ }
+
iface->idata->obs.x0[i] = in_verts_0[i];
iface->idata->obs.x1[i] = in_verts_1[i];
}
for (int i=0; i<nf3; ++i) {
+
+ // Change in f?
+ if (!iface->idata->obs.needs_sdf_recompute) {
+ if (iface->idata->obs.F[i] != in_faces[i]) {
+ iface->idata->obs.needs_sdf_recompute = true;
+ }
+ }
+
iface->idata->obs.F[i] = in_faces[i];
}
@@ -647,10 +677,9 @@ int admmpd_solve(ADMMPDInterfaceData *iface, Object *ob,
float (*vertexCos)[3])
update_selfcollision_group(iface,ob);
// Changing the location of the obstacles requires a recompuation
- // of the SDF. So we'll only do that if we need to:
+ // of the SDF. So we'll only do that if:
// a) we are substepping (need to lerp)
- // b) the obstacle is actually moving
- // Otherwise, we'll use the end position.
+ // b) the obstacle positions have changed from the last frame
bool has_obstacles =
iface->idata->collision &&
iface->idata->obs.x0.size() > 0 &&
@@ -661,7 +690,7 @@ int admmpd_solve(ADMMPDInterfaceData *iface, Object *ob,
float (*vertexCos)[3])
iface->idata->options->substeps>1 &&
(iface->idata->obs.x0-iface->idata->obs.x1).lpNorm<Eigen::Infinity>()>1e-6;
- if (has_obstacles && !lerp_obstacles) {
+ if (has_obstacles && iface->idata->obs.needs_sdf_recompute &&
!lerp_obstacles) {
iface->idata->collision->set_obstacles(
iface->idata->obs.x0.data(),
iface->idata->obs.x1.data(),
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs