Commit: 72c78837ee280b281cf728aba11c5cbd23a675c2
Author: mattoverby
Date:   Tue Jul 28 17:09:50 2020 -0500
Branches: soc-2020-soft-body
https://developer.blender.org/rB72c78837ee280b281cf728aba11c5cbd23a675c2

disabling self collision until detection is better

===================================================================

M       extern/softbody/src/admmpd_collision.cpp
M       extern/softbody/src/admmpd_collision.h
M       extern/softbody/src/admmpd_solver.cpp
M       extern/softbody/src/admmpd_types.h
M       intern/softbody/admmpd_api.cpp
M       release/scripts/startup/bl_ui/properties_physics_softbody.py

===================================================================

diff --git a/extern/softbody/src/admmpd_collision.cpp 
b/extern/softbody/src/admmpd_collision.cpp
index cf36c3ce009..ee982cb3f26 100644
--- a/extern/softbody/src/admmpd_collision.cpp
+++ b/extern/softbody/src/admmpd_collision.cpp
@@ -100,6 +100,7 @@ 
EmbeddedMeshCollision::EmbeddedMeshCollision(std::shared_ptr<EmbeddedMesh> mesh_
 
 
 int EmbeddedMeshCollision::detect(
+       const admmpd::Options *options,
        const Eigen::MatrixXd *x0,
        const Eigen::MatrixXd *x1)
 {
@@ -107,10 +108,9 @@ int EmbeddedMeshCollision::detect(
                return 0;
 
        // Do we even need to process collisions?
-       if ((!this->settings.obs_collision || !obsdata.has_obs()) &&
-               !this->settings.self_collision)
+       if (!this->obsdata.has_obs() && !options->self_collision)
        {
-               if (x1->col(1).minCoeff() > this->settings.floor_z)
+               if (x1->col(1).minCoeff() > options->floor)
                {
                        return 0;
                }
@@ -129,7 +129,7 @@ int EmbeddedMeshCollision::detect(
        // Thread data for detection
        //
        typedef struct {
-               const Collision::Settings *settings;
+               const Options *options;
                const Collision *collision;
                const EmbeddedMesh *embmesh;
                const Collision::ObstacleData *obsdata;
@@ -156,23 +156,20 @@ int EmbeddedMeshCollision::detect(
                Vector3d pt_t1 = 
td->embmesh->get_mapped_facet_vertex(*td->x1,vi);
 
                // Special case, check if we are below the floor
-               if (td->settings->floor_collision)
+               if (pt_t1[2] < td->options->floor)
                {
-                       if (pt_t1[2] < td->settings->floor_z)
-                       {
-                               vi_pairs.emplace_back();
-                               VFCollisionPair &pair = vi_pairs.back();
-                               pair.p_idx = vi;
-                               pair.p_is_obs = false;
-                               pair.q_idx = -1;
-                               pair.q_is_obs = 1;
-                               pair.q_bary.setZero();
-                               pair.q_pt = 
Vector3d(pt_t1[0],pt_t1[1],td->settings->floor_z);
-                       }
+                       vi_pairs.emplace_back();
+                       VFCollisionPair &pair = vi_pairs.back();
+                       pair.p_idx = vi;
+                       pair.p_is_obs = false;
+                       pair.q_idx = -1;
+                       pair.q_is_obs = 1;
+                       pair.q_bary.setZero();
+                       pair.q_pt = 
Vector3d(pt_t1[0],pt_t1[1],td->options->floor);
                }
 
                // Detect against obstacles
-               if (td->settings->obs_collision)
+               if (td->obsdata->has_obs())
                {
                        std::pair<bool,VFCollisionPair> pt_hit_obs =
                                
td->collision->detect_against_obs(pt_t1,td->obsdata);
@@ -185,7 +182,7 @@ int EmbeddedMeshCollision::detect(
                }
 
                // Detect against self
-               if (td->settings->self_collision)
+               if (td->options->self_collision)
                {
                        std::pair<bool,VFCollisionPair> pt_hit_self =
                                td->collision->detect_against_self(vi, pt_t1, 
td->x1);
@@ -198,7 +195,7 @@ int EmbeddedMeshCollision::detect(
        }; // end detect for a single embedded vertex
 
        DetectThreadData thread_data = {
-               .settings = &settings,
+               .options = options,
                .collision = this,
                .embmesh = mesh.get(),
                .obsdata = &obsdata,
diff --git a/extern/softbody/src/admmpd_collision.h 
b/extern/softbody/src/admmpd_collision.h
index 53ac3078641..632b8f8ca2c 100644
--- a/extern/softbody/src/admmpd_collision.h
+++ b/extern/softbody/src/admmpd_collision.h
@@ -24,21 +24,6 @@ struct VFCollisionPair {
 class Collision {
 public:
 
-    struct Settings {
-        double collision_eps;
-        double floor_z;
-        bool floor_collision;
-        bool obs_collision;
-        bool self_collision;
-        Settings() :
-            collision_eps(1e-10),
-            floor_z(-std::numeric_limits<double>::max()),
-            floor_collision(true),
-            obs_collision(true),
-            self_collision(false)
-            {}
-    } settings;
-
     struct ObstacleData {
         bool has_obs() const { return F.rows()>0; }
         Eigen::MatrixXd V;
@@ -68,6 +53,7 @@ public:
     // Performs collision detection.
     // Returns the number of active constraints.
     virtual int detect(
+        const admmpd::Options *options,
         const Eigen::MatrixXd *x0,
         const Eigen::MatrixXd *x1) = 0;
 
@@ -86,10 +72,6 @@ public:
         const unsigned int *faces,
         int nf);
 
-    // Special case for floor since it's common.
-    virtual void set_floor(double z) { settings.floor_z=z; }
-    virtual double get_floor() const { return settings.floor_z; }
-
     // Linearize the constraints about x and return Jacobian.
     virtual void linearize(
         const Eigen::MatrixXd *x,
@@ -117,6 +99,7 @@ public:
 
     // Performs collision detection and stores pairs
     int detect(
+        const admmpd::Options *options,
         const Eigen::MatrixXd *x0,
         const Eigen::MatrixXd *x1);
 
diff --git a/extern/softbody/src/admmpd_solver.cpp 
b/extern/softbody/src/admmpd_solver.cpp
index 263faac393d..d524a783b8b 100644
--- a/extern/softbody/src/admmpd_solver.cpp
+++ b/extern/softbody/src/admmpd_solver.cpp
@@ -62,11 +62,14 @@ int Solver::solve(
 
        update_pin_matrix(mesh,options,data);
        update_global_matrix(options,data);
+
        ConjugateGradients cg;
        cg.init_solve(options,data);
 
+       int substeps = std::max(1,options->substeps);
+       double dt = options->timestep_s / double(substeps);
+
        int iters = 0;
-       int substeps = 1;//std::max(1,options->substeps);
        for (int i=0; i<substeps; ++i)
        {
                // Init the solve which computes
@@ -89,7 +92,6 @@ int Solver::solve(
                } // end solver iters
 
                // Update velocity (if not static solve)
-               double dt = options->timestep_s / double(substeps);
                if (dt > 0.0)
                        data->v.noalias() = (data->x-data->x_start)*(1.0/dt);
 
@@ -119,7 +121,7 @@ void Solver::init_solve(
        // - update pin constraint matrix (goal positions)
        // - set x init guess
        double dt = std::max(0.0, options->timestep_s) /
-               std::max(1.0, double(options->substeps));
+               double(std::max(1, options->substeps));
        data->x_start = data->x;
        for (int i=0; i<nx; ++i)
        {
@@ -195,7 +197,7 @@ void Solver::update_collisions(
        if (collision==NULL)
                return;
 
-       collision->detect(&data->x_start, &data->x);
+       collision->detect(options, &data->x_start, &data->x);
 
        std::vector<double> d_coeffs;
        std::vector<Eigen::Triplet<double> > trips;
@@ -354,7 +356,9 @@ void Solver::update_global_matrix(
        if (data->P.cols() != nx*3)
                throw_err("update_global_matrix","no pin matrix");
 
-       double dt2 = options->timestep_s * options->timestep_s;
+       double dt = options->timestep_s /
+               double(std::max(1,options->substeps));
+       double dt2 = dt*dt;
        if (dt2 < 0) // static solve
                dt2 = 1.0;
 
diff --git a/extern/softbody/src/admmpd_types.h 
b/extern/softbody/src/admmpd_types.h
index 9b9792d6a85..0d3016f4aeb 100644
--- a/extern/softbody/src/admmpd_types.h
+++ b/extern/softbody/src/admmpd_types.h
@@ -36,6 +36,7 @@ struct Options {
     double poisson; // Poisson ratio // TODO variable per-tet
     double density_kgm3; // density of mesh
     double floor; // floor location
+    double collision_thickness;
     bool self_collision; // process self collisions
     Eigen::Vector3d grav;
     Options() :
@@ -46,12 +47,13 @@ struct Options {
         max_gs_iters(100),
         gs_omega(1),
         mult_ck(3),
-        mult_pk(1),
+        mult_pk(3),
         min_res(1e-8),
         youngs(1000000),
         poisson(0.399),
         density_kgm3(1522),
         floor(-std::numeric_limits<double>::max()),
+        collision_thickness(1e-6),
         self_collision(false),
         grav(0,0,-9.8)
         {}
diff --git a/intern/softbody/admmpd_api.cpp b/intern/softbody/admmpd_api.cpp
index 980ecc20e34..9eef0552b5a 100644
--- a/intern/softbody/admmpd_api.cpp
+++ b/intern/softbody/admmpd_api.cpp
@@ -74,6 +74,7 @@ static inline void options_from_object(Object *ob, 
admmpd::Options *op)
   op->poisson = std::max(0.f,std::min(0.499f,sb->admmpd_poisson));
   op->floor = sb->admmpd_floor_z;
   op->self_collision = sb->admmpd_self_collision;
+  op->substeps = sb->admmpd_substeps;
 
   switch(sb->admmpd_material)
   {
diff --git a/release/scripts/startup/bl_ui/properties_physics_softbody.py 
b/release/scripts/startup/bl_ui/properties_physics_softbody.py
index fcf31cd5112..f42cc5132e0 100644
--- a/release/scripts/startup/bl_ui/properties_physics_softbody.py
+++ b/release/scripts/startup/bl_ui/properties_physics_softbody.py
@@ -337,7 +337,6 @@ class 
PHYSICS_PT_softbody_admmpdcollision(PhysicButtonsPanel, Panel):
         layout.use_property_split = True
         md = context.soft_body
         softbody = md.settings
-        layout.prop(softbody, "admmpd_self_collision")
         layout.prop(softbody, "admmpd_collisionstiff")
         layout.prop(softbody, "admmpd_floor_z")

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to