Commit: 9819c3576cdce6c5f9efca1a821997a856ad66d7
Author: over0219
Date:   Tue Jun 9 18:13:56 2020 -0500
Branches: soc-2020-soft-body
https://developer.blender.org/rB9819c3576cdce6c5f9efca1a821997a856ad66d7

working on interface

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

M       extern/softbody/src/admmpd_collision.cpp
M       extern/softbody/src/admmpd_energy.cpp
M       extern/softbody/src/admmpd_solver.cpp
M       extern/softbody/src/admmpd_solver.h
M       intern/softbody/CMakeLists.txt
M       intern/softbody/admmpd_api.cpp
M       intern/softbody/admmpd_api.h
M       intern/tetgen/tetgen_api.cpp
M       source/blender/blenkernel/BKE_mesh_remesh_voxel.h
M       source/blender/blenkernel/intern/mesh_remesh_voxel.c
M       source/blender/blenkernel/intern/softbody.c
M       source/blender/editors/object/object_remesh.c
M       source/blender/makesdna/DNA_object_force_types.h

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

diff --git a/extern/softbody/src/admmpd_collision.cpp 
b/extern/softbody/src/admmpd_collision.cpp
index 2bce56fa9f0..0cd828011ad 100644
--- a/extern/softbody/src/admmpd_collision.cpp
+++ b/extern/softbody/src/admmpd_collision.cpp
@@ -17,16 +17,18 @@ void FloorCollider::jacobian(
        std::vector<Eigen::Triplet<double> > *trips_z,
        std::vector<double> *l)
 {
+       const double floor_z = -2.0;
+
        int nx = x->rows();
        for (int i=0; i<nx; ++i)
        {
-               Eigen::Vector3d p = x->row(i);
-               if (p[2]>0)
+               Eigen::Vector3d xi = x->row(i);
+               if (xi[2]>floor_z)
                        continue;
-       
+
                int c_idx = l->size();
                trips_z->emplace_back(c_idx,i,1.0);
-               l->emplace_back(0);
+               l->emplace_back(floor_z);
        }
 } // end floor collider Jacobian
 
diff --git a/extern/softbody/src/admmpd_energy.cpp 
b/extern/softbody/src/admmpd_energy.cpp
index ea7c68b6dca..3b90d506a2a 100644
--- a/extern/softbody/src/admmpd_energy.cpp
+++ b/extern/softbody/src/admmpd_energy.cpp
@@ -2,6 +2,7 @@
 
 
 #include "admmpd_energy.h"
+#include <iostream>
 
 namespace admmpd {
 using namespace Eigen;
diff --git a/extern/softbody/src/admmpd_solver.cpp 
b/extern/softbody/src/admmpd_solver.cpp
index 052008121b9..008db80720e 100644
--- a/extern/softbody/src/admmpd_solver.cpp
+++ b/extern/softbody/src/admmpd_solver.cpp
@@ -19,8 +19,8 @@ template <typename T> using RowSparseMatrix = 
SparseMatrix<T,RowMajor>;
 bool Solver::init(
     const Eigen::MatrixXd &V,
        const Eigen::MatrixXi &T,
-    const ADMMPD_Options *options,
-    ADMMPD_Data *data)
+    const Options *options,
+    Data *data)
 {
        if (!data || !options)
                throw std::runtime_error("init: data/options null");
@@ -32,9 +32,10 @@ bool Solver::init(
 } // end init
 
 int Solver::solve(
-       const ADMMPD_Options *options,
-       ADMMPD_Data *data)
+       const Options *options,
+       Data *data)
 {
+
        // Init the solve which computes
        // quantaties like M_xbar and makes sure
        // the variables are sized correctly.
@@ -77,8 +78,8 @@ int Solver::solve(
 } // end solve
 
 void Solver::init_solve(
-       const ADMMPD_Options *options,
-       ADMMPD_Data *data)
+       const Options *options,
+       Data *data)
 {
        int nx = data->x.rows();
        if (data->M_xbar.rows() != nx)
@@ -87,7 +88,7 @@ void Solver::init_solve(
        // velocity and position
        double dt = std::max(0.0, options->timestep_s);
        data->x_start = data->x;
-       for( int i=0; i<nx; ++i )
+       for (int i=0; i<nx; ++i)
        {
                data->v.row(i) += options->grav;
                data->M_xbar.row(i) =
@@ -103,8 +104,8 @@ void Solver::init_solve(
 } // end init solve
 
 void Solver::update_constraints(
-       const ADMMPD_Options *options,
-       ADMMPD_Data *data)
+       const Options *options,
+       Data *data)
 {
 
        std::vector<double> l_coeffs;
@@ -145,8 +146,8 @@ void Solver::update_constraints(
 } // end update constraints
 
 void Solver::solve_conjugate_gradients(
-       const ADMMPD_Options *options,
-       ADMMPD_Data *data)
+       const Options *options,
+       Data *data)
 {
        // If we don't have any constraints,
        // we don't need to perform CG
@@ -220,8 +221,8 @@ void Solver::solve_conjugate_gradients(
 } // end solve conjugate gradients
 
 void Solver::compute_matrices(
-       const ADMMPD_Options *options,
-       ADMMPD_Data *data)
+       const Options *options,
+       Data *data)
 {
        // Allocate per-vertex data
        int nx = data->x.rows();
@@ -245,20 +246,29 @@ void Solver::compute_matrices(
        // Add per-element energies to data
        std::vector< Triplet<double> > trips;
        append_energies(options,data,trips);
-       int nw = trips.back().row()+1;
-       double dt2 = std::max(0.0, options->timestep_s * options->timestep_s);
+       int n_row_D = trips.back().row()+1;
+       double dt2 = options->timestep_s * options->timestep_s;
+       if (dt2 <= 0)
+               dt2 = 1.0; // static solve
+
+       // Weight matrix
+       RowSparseMatrix<double> W2(n_row_D,n_row_D);
+       VectorXi W_nnz = VectorXi::Ones(n_row_D);
+       W2.reserve(W_nnz);
+       int ne = data->indices.size();
+       for (int i=0; i<ne; ++i)
+       {
+               const Vector2i &idx = data->indices[i];
+               for (int j=0; j<idx[1]; ++j)
+               {
+                       W2.coeffRef(idx[0]+j,idx[0]+j) = 
data->weights[i]*data->weights[i];
+               }
+       }
 
-       // Global matrix
-       data->D.resize(nw,nx);
+       // Weighted Laplacian
+       data->D.resize(n_row_D,nx);
        data->D.setFromTriplets(trips.begin(), trips.end());
        data->Dt = data->D.transpose();
-       VectorXd wd = Map<VectorXd>(data->weights.data(), data->weights.size());
-       RowSparseMatrix<double> W2(nw,nw);
-       VectorXi W_nnz = VectorXi::Ones(nw);
-       W2.reserve(W_nnz);
-       for(int i=0; i<nw; ++i)
-               W2.coeffRef(i,i) = data->weights[i]*data->weights[i];
-
        data->DtW2 = dt2 * data->Dt * W2;
        data->A = data->DtW2 * data->D;
        for (int i=0; i<nx; ++i)
@@ -274,16 +284,16 @@ void Solver::compute_matrices(
                data->K[i].resize(1,nx);
 
        // ADMM variables
-       data->z.resize(nw,3);
+       data->z.resize(n_row_D,3);
        data->z.setZero();
-       data->u.resize(nw,3);
+       data->u.resize(n_row_D,3);
        data->u.setZero();
 
 } // end compute matrices
 
 void Solver::append_energies(
-       const ADMMPD_Options *options,
-       ADMMPD_Data *data,
+       const Options *options,
+       Data *data,
        std::vector<Triplet<double> > &D_triplets)
 {
        int nt = data->tets.rows();
diff --git a/extern/softbody/src/admmpd_solver.h 
b/extern/softbody/src/admmpd_solver.h
index ec836d3c466..6b397bee406 100644
--- a/extern/softbody/src/admmpd_solver.h
+++ b/extern/softbody/src/admmpd_solver.h
@@ -11,24 +11,24 @@
 
 namespace admmpd {
 
-struct ADMMPD_Options {
+struct Options {
     double timestep_s;
     int max_admm_iters;
     int max_cg_iters;
     double mult_k; // stiffness multiplier for constraints
     double min_res; // min residual for CG solver
     Eigen::Vector3d grav;
-    ADMMPD_Options() :
+    Options() :
         timestep_s(1.0/100.0), // TODO: Figure out delta time from blender api
         max_admm_iters(20),
         max_cg_iters(10),
-        mult_k(3.0),
+        mult_k(1.0),
         min_res(1e-4),
         grav(0,0,-9.8)
         {}
 };
 
-struct ADMMPD_Data {
+struct Data {
     // Input:
     Eigen::MatrixXi tets; // elements t x 4
     Eigen::MatrixXd x; // vertices, n x 3
@@ -65,42 +65,42 @@ public:
     bool init(
         const Eigen::MatrixXd &V, // vertices
         const Eigen::MatrixXi &T, // tets
-        const ADMMPD_Options *options,
-        ADMMPD_Data *data);
+        const Options *options,
+        Data *data);
 
     // Solve a single time step.
     // Returns number of iterations.
     int solve(
-        const ADMMPD_Options *options,
-        ADMMPD_Data *data);
+        const Options *options,
+        Data *data);
 
 protected:
 
     void update_constraints(
-        const ADMMPD_Options *options,
-        ADMMPD_Data *data);
+        const Options *options,
+        Data *data);
 
     void init_solve(
-        const ADMMPD_Options *options,
-        ADMMPD_Data *data);
+        const Options *options,
+        Data *data);
 
     // Global step with CG:
     // 1/2||Ax-b||^2 + k/2||Kx-l||^2
        void solve_conjugate_gradients(
-        const ADMMPD_Options *options,
-        ADMMPD_Data *data);
+        const Options *options,
+        Data *data);
 
     void compute_lattice(
-        const ADMMPD_Options *options,
-        ADMMPD_Data *data);
+        const Options *options,
+        Data *data);
 
     void compute_matrices(
-        const ADMMPD_Options *options,
-        ADMMPD_Data *data);
+        const Options *options,
+        Data *data);
 
        void append_energies(
-               const ADMMPD_Options *options,
-               ADMMPD_Data *data,
+               const Options *options,
+               Data *data,
                std::vector<Eigen::Triplet<double> > &D_triplets);
 
 }; // class ADMMPD_solver
diff --git a/intern/softbody/CMakeLists.txt b/intern/softbody/CMakeLists.txt
index 5c8a2da0e44..1bb705e1d1e 100644
--- a/intern/softbody/CMakeLists.txt
+++ b/intern/softbody/CMakeLists.txt
@@ -24,8 +24,11 @@ set(INC
 
 set(INC_SYS
   ../../extern/softbody/src
+  ../tetgen
   ../../source/blender/makesdna
   ../../source/blender/blenkernel
+  ../../source/blender/blenlib
+  ../../intern/guardedalloc
   ${EIGEN3_INCLUDE_DIRS}
 )
 
diff --git a/intern/softbody/admmpd_api.cpp b/intern/softbody/admmpd_api.cpp
index 5963c4f71c8..21e21c4cb9d 100644
--- a/intern/softbody/admmpd_api.cpp
+++ b/intern/softbody/admmpd_api.cpp
@@ -24,77 +24,173 @@
 #include "admmpd_api.h"
 #include "admmpd_solver.h"
 #include "admmpd_lattice.h"
-#include "DNA_object_types.h" // Object
-#include "BKE_softbody.h"
+#include "tetgen_api.h"
+#include "DNA_mesh_types.h" // Mesh
+#include "DNA_meshdata_types.h" // MVert
+#include "BKE_mesh_remesh_voxel.h" // TetGen
+#include "BKE_mesh.h" // BKE_mesh_free
+#include "MEM_guardedalloc.h" // 
+
 #include <iostream>
 
-struct ADMMPD_Data {
-  admmpd::ADMMPD_Options *options;
-  admmpd::ADMMPD_Data *data;
-  admmpd::Lattice *lattice;
+
+struct ADMMPDInternalData {
+  admmpd::Options *options;
+  admmpd::Data *data;
+//  admmpd::Lattice *lattice;
 };
 
-ADMMPD_Data* admmpd_init(
-    BodyPoint *bp,
-    int numVerts)
+
+void admmpd_alloc(ADMMPDInterfaceData *iface, int in_verts, int in_faces)
+{
+  if (iface==NULL)
+    return;
+
+  iface->in_totverts = in_verts;
+  iface->in_verts = (float *)MEM_mallocN(in_verts*3*sizeof(float), 
"admmpd_verts");
+  iface->in_vel = (float *)MEM_mallocN(in_verts*3*sizeof(float), "admmpd_vel");
+
+  iface->in_totfaces = in_faces;
+  iface->in_faces = (unsigned int *)MEM_mallocN(in_faces*3*sizeof(unsigned 
int), "admmpd_faces");
+}
+
+void admmpd_dealloc(ADMMPDInterfaceData *iface)
 {
-  if (!bp)
-    return NULL;
-
-  ADMMPD_Data *admmpd_data = new ADMMPD_Data();
-  admmpd_data->options = new admmpd::ADMMPD_Options();
-  admmpd::ADMMPD_Options *options = admmpd_data->options;
-  admmpd_data->data = new admmpd::ADMMPD_Data();
-  admmpd::ADMMPD_Data *data = admmpd_data->data;
-  admmpd_data->lattice = new admmpd::Lattice();
-  admmpd::Lattice *lattice = admmpd_data->lattice;
-
-  // Create initializer
-  Eigen::MatrixXd V(numVerts,3);
+  if (iface==NULL)
+    return;
+
+  iface->in_totverts = 0;
+  if (iface->in_verts != NULL)
+    MEM_freeN(iface->in_verts);
+  if (iface->in_vel != NULL)
+    MEM_freeN(iface->in_vel);
+
+  iface->in_totfaces = 0;
+  if (iface->in_faces != NULL)
+    MEM_freeN(iface->in_faces);
+
+  iface->out_totverts = 0;
+  if (iface->out_verts != NULL)
+    MEM_freeN(iface->out_verts);
+  if (iface->out_vel != NULL)
+    MEM_f

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to