Commit: 6eadc5e0f8551d1e0773462263a51af6bf9cb6fc
Author: mattoverby
Date:   Thu Aug 6 14:14:07 2020 -0500
Branches: soc-2020-soft-body
https://developer.blender.org/rB6eadc5e0f8551d1e0773462263a51af6bf9cb6fc

I've made ADMMPD data copyable to interface with CoW. However, free is getting 
called before the copy. What's going on with that?

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

M       
extern/discregrid/discregrid/include/Discregrid/cubic_lagrange_discrete_grid.hpp
M       extern/softbody/CMakeLists.txt
M       extern/softbody/src/admmpd_bvh.cpp
M       extern/softbody/src/admmpd_bvh.h
M       extern/softbody/src/admmpd_collision.cpp
M       extern/softbody/src/admmpd_collision.h
M       extern/softbody/src/admmpd_linsolve.cpp
M       extern/softbody/src/admmpd_linsolve.h
A       extern/softbody/src/admmpd_log.cpp
A       extern/softbody/src/admmpd_log.h
M       extern/softbody/src/admmpd_mesh.cpp
M       extern/softbody/src/admmpd_mesh.h
M       extern/softbody/src/admmpd_solver.cpp
M       extern/softbody/src/admmpd_solver.h
M       extern/softbody/src/admmpd_types.h
M       intern/softbody/admmpd_api.cpp
M       intern/softbody/admmpd_api.h
M       source/blender/blenkernel/BKE_softbody.h
M       source/blender/blenkernel/intern/object.c
M       source/blender/blenkernel/intern/softbody.c
M       source/blender/makesdna/DNA_object_force_types.h

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

diff --git 
a/extern/discregrid/discregrid/include/Discregrid/cubic_lagrange_discrete_grid.hpp
 
b/extern/discregrid/discregrid/include/Discregrid/cubic_lagrange_discrete_grid.hpp
index 8e413e8ee20..6682875604b 100755
--- 
a/extern/discregrid/discregrid/include/Discregrid/cubic_lagrange_discrete_grid.hpp
+++ 
b/extern/discregrid/discregrid/include/Discregrid/cubic_lagrange_discrete_grid.hpp
@@ -9,6 +9,7 @@ class CubicLagrangeDiscreteGrid : public DiscreteGrid
 {
 public:
 
+       CubicLagrangeDiscreteGrid(){}
        CubicLagrangeDiscreteGrid(std::string const& filename);
        CubicLagrangeDiscreteGrid(Eigen::AlignedBox3d const& domain,
                std::array<unsigned int, 3> const& resolution);
diff --git a/extern/softbody/CMakeLists.txt b/extern/softbody/CMakeLists.txt
index ce7cdd5fe8e..9f5440b285c 100644
--- a/extern/softbody/CMakeLists.txt
+++ b/extern/softbody/CMakeLists.txt
@@ -44,6 +44,8 @@ set(SRC
        src/admmpd_linsolve.cpp
        src/admmpd_solver.h
        src/admmpd_solver.cpp
+       src/admmpd_log.h
+       src/admmpd_log.cpp
        src/admmpd_mesh.h
        src/admmpd_mesh.cpp
        src/admmpd_timer.h
diff --git a/extern/softbody/src/admmpd_bvh.cpp 
b/extern/softbody/src/admmpd_bvh.cpp
index 190d086aa3c..42313efa642 100644
--- a/extern/softbody/src/admmpd_bvh.cpp
+++ b/extern/softbody/src/admmpd_bvh.cpp
@@ -9,6 +9,26 @@
 
 namespace admmpd {
 
+template <typename T, int DIM>
+AABBTree<T,DIM>::AABBTree(const AABBTree<T,DIM> &other_tree)
+{
+    m_root = std::make_shared<Node>();
+    std::function<void(const Node*, Node*)> copy_children;
+    copy_children = [&copy_children](const Node *src, Node *dest)->void
+    {
+        if (src==nullptr)
+        {
+            dest = nullptr;
+            return;
+        }
+        dest->aabb = src->aabb;
+        dest->prims = src->prims;
+        copy_children(dest->left, src->left);
+        copy_children(dest->right, src->right);
+    };
+    copy_children(other_tree.m_root.get(), m_root.get());
+}
+
 template <typename T, int DIM>
 void AABBTree<T,DIM>::clear()
 {
diff --git a/extern/softbody/src/admmpd_bvh.h b/extern/softbody/src/admmpd_bvh.h
index 5905b676adb..bf26d14cdd5 100644
--- a/extern/softbody/src/admmpd_bvh.h
+++ b/extern/softbody/src/admmpd_bvh.h
@@ -18,6 +18,11 @@ protected:
        typedef Eigen::AlignedBox<T,DIM> AABB;
        typedef Eigen::Matrix<T,DIM,1> VecType;
 public:
+       AABBTree() {}
+
+       // Performs a deep copy of another tree
+       AABBTree(const AABBTree<T,DIM> &other_tree);
+
        // Removes all BVH data
        void clear();
 
@@ -47,14 +52,12 @@ public:
                AABB aabb;
                Node *left, *right;
                std::vector<int> prims;
-               VecType normal;
-               T angle;
                bool is_leaf() const { return prims.size()>0; }
                Node() : left(nullptr), right(nullptr) {}
                ~Node()
                {
-                       if(left){ delete left; }
-                       if(right){ delete right; }
+                       if (left) { delete left; }
+                       if (right) { delete right; }
                }
        };
 
diff --git a/extern/softbody/src/admmpd_collision.cpp 
b/extern/softbody/src/admmpd_collision.cpp
index ddae43c017b..0ef217b0c99 100644
--- a/extern/softbody/src/admmpd_collision.cpp
+++ b/extern/softbody/src/admmpd_collision.cpp
@@ -71,22 +71,29 @@ void Collision::set_obstacles(
                domain.min() -= 1e-3 * domain.diagonal().norm() * 
Eigen::Vector3d::Ones();
                std::array<unsigned int, 3> resolution;
                resolution[0] = 30; resolution[1] = 30; resolution[2] = 30;
-               obsdata.sdf = 
std::make_unique<SDFType>(Discregrid::CubicLagrangeDiscreteGrid(domain, 
resolution));
+               obsdata.sdf = Discregrid::CubicLagrangeDiscreteGrid(domain, 
resolution);
                auto func = Discregrid::DiscreteGrid::ContinuousFunction{};
                func = [&md](Eigen::Vector3d const& xi) {
                        return md.signedDistanceCached(xi);
                };
-               obsdata.sdf->addFunction(func, false);
+               obsdata.sdf.addFunction(func, false);
        }
 
 } // end add obstacle
 
 std::pair<bool,VFCollisionPair>
 Collision::detect_against_obs(
+           const admmpd::Mesh *mesh,
+           const admmpd::Options *options,
+        const admmpd::SolverData *data,
         const Eigen::Vector3d &pt_t0,
                const Eigen::Vector3d &pt_t1,
         const ObstacleData *obs) const
 {
+       (void)(mesh);
+       (void)(options);
+       (void)(data);
+
        std::pair<bool,VFCollisionPair> ret = 
                std::make_pair(false, VFCollisionPair());
 
@@ -99,7 +106,7 @@ Collision::detect_against_obs(
        // the interpolate function won't return the nearest
        // face at the gradient + distance.
        Vector3d n;
-       double dist = obs->sdf->interpolate(0, pt_t1, &n);
+       double dist = obs->sdf.interpolate(0, pt_t1, &n);
        if (dist > 0)
                return ret;
 
@@ -112,16 +119,17 @@ Collision::detect_against_obs(
        return ret;
 }
 
-EmbeddedMeshCollision::EmbeddedMeshCollision(std::shared_ptr<EmbeddedMesh> 
mesh_)
-       { meshdata.mesh = mesh_; }
-
-
 int EmbeddedMeshCollision::detect(
+       const admmpd::Mesh *mesh,
        const admmpd::Options *options,
+       const admmpd::SolverData *data,
        const Eigen::MatrixXd *x0,
        const Eigen::MatrixXd *x1)
 {
-       if (!meshdata.mesh)
+       if (!mesh)
+               return 0;
+
+       if (mesh->type() != MESHTYPE_EMBEDDED)
                return 0;
 
        // Do we even need to process collisions?
@@ -135,7 +143,7 @@ int EmbeddedMeshCollision::detect(
 
        // We store the results of the collisions in a per-vertex buffer.
        // This is a workaround so we can create them in threads.
-       int nev = meshdata.mesh->rest_facet_verts()->rows();
+       int nev = mesh->rest_facet_verts()->rows();
        if ((int)per_vertex_pairs.size() != nev)
                per_vertex_pairs.resize(nev, std::vector<VFCollisionPair>());
 
@@ -143,9 +151,10 @@ int EmbeddedMeshCollision::detect(
        // Thread data for detection
        //
        typedef struct {
+               const Mesh *mesh;
                const Options *options;
+               const SolverData *data;
                const Collision *collision;
-               const EmbeddedMesh *embmesh;
                const Collision::ObstacleData *obsdata;
                const Eigen::MatrixXd *x0;
                const Eigen::MatrixXd *x1;
@@ -167,14 +176,14 @@ int EmbeddedMeshCollision::detect(
        {
 //             (void)(tls);
 //             DetectThreadData *td = (DetectThreadData*)userdata;
-               if (td->embmesh == nullptr)
+               if (!td->mesh)
                        return;
 
                std::vector<Eigen::Vector2i> &pt_res = 
td->per_thread_results->at(thread_idx);
                std::vector<VFCollisionPair> &vi_pairs = 
td->per_vertex_pairs->at(vi);
                vi_pairs.clear();
-               Vector3d pt_t0 = 
td->embmesh->get_mapped_facet_vertex(td->x0,vi);
-               Vector3d pt_t1 = 
td->embmesh->get_mapped_facet_vertex(td->x1,vi);
+               Vector3d pt_t0 = td->mesh->get_mapped_facet_vertex(td->x0,vi);
+               Vector3d pt_t1 = td->mesh->get_mapped_facet_vertex(td->x1,vi);
 
                // Special case, check if we are below the floor
                if (pt_t1[2] < td->options->floor)
@@ -195,7 +204,13 @@ int EmbeddedMeshCollision::detect(
                if (td->obsdata->has_obs())
                {
                        std::pair<bool,VFCollisionPair> pt_hit_obs =
-                               
td->collision->detect_against_obs(pt_t0,pt_t1,td->obsdata);
+                               td->collision->detect_against_obs(
+                                       td->mesh,
+                                       td->options,
+                                       td->data,
+                                       pt_t0,
+                                       pt_t1,
+                                       td->obsdata);
                        if (pt_hit_obs.first)
                        {
                                pt_hit_obs.second.p_idx = vi;
@@ -209,7 +224,15 @@ int EmbeddedMeshCollision::detect(
                if (td->options->self_collision)
                {
                        std::pair<bool,VFCollisionPair> pt_hit_self =
-                               td->collision->detect_against_self(vi, pt_t0, 
pt_t1, td->x0, td->x1);
+                               td->collision->detect_against_self(
+                                       td->mesh,
+                                       td->options,
+                                       td->data,
+                                       vi,
+                                       pt_t0,
+                                       pt_t1,
+                                       td->x0,
+                                       td->x1);
                        if (pt_hit_self.first)
                        {
                                pt_res.emplace_back(vi,vi_pairs.size());
@@ -221,9 +244,10 @@ int EmbeddedMeshCollision::detect(
 
        std::vector<std::vector<Eigen::Vector2i> > per_thread_results;
        DetectThreadData thread_data = {
+               .mesh = mesh,
                .options = options,
+               .data = data,
                .collision = this,
-               .embmesh = meshdata.mesh.get(),
                .obsdata = &obsdata,
                .x0 = x0,
                .x1 = x1,
@@ -289,18 +313,27 @@ int EmbeddedMeshCollision::detect(
 } // end detect
 
 void EmbeddedMeshCollision::update_bvh(
+       const admmpd::Mesh *mesh,
+       const admmpd::Options *options,
+       admmpd::SolverData *data,
        const Eigen::MatrixXd *x0,
        const Eigen::MatrixXd *x1,
        bool sort)
 {
-       int nt = meshdata.mesh->prims()->rows();
-       if ((int)meshdata.tet_boxes.size() != nt)
-               meshdata.tet_boxes.resize(nt);
+       if (!mesh)
+               return;
+
+       if (mesh->type() != MESHTYPE_EMBEDDED)
+               return;
+
+       int nt = mesh->prims()->rows();
+       if ((int)data->col.prim_boxes.size() != nt)
+               data->col.prim_boxes.resize(nt);
 
        for (int i=0; i<nt; ++i)
        {
-               RowVector4i tet = meshdata.mesh->prims()->row(i);
-               AlignedBox<double,3> &box = meshdata.tet_boxes[i];
+               RowVector4i tet = mesh->prims()->row(i);
+               AlignedBox<double,3> &box = data->col.prim_boxes[i];
                box.setEmpty();
                box.extend(x1->row(tet[0]).transpose());
                box.extend(x1->row(tet[1]).transpose());
@@ -308,43 +341,53 @@ void EmbeddedMeshCollision::update_bvh(
                box.extend(x1->row(tet[3]).transpose());
        }
 
-       if (!meshdata.tet_tree.root() || sort)
-               { meshdata.tet_tree.init(meshdata.tet_boxes); } // sort
+       if (!data->col.prim_tree.root() || sort)
+               { data->col.prim_tree.init(data->col.prim_boxes); } // sort
        else
-               { meshdata.tet_tree.update(meshdata.tet_boxes); } // grow
+               { data->col.prim_tree.update(data->col.prim_boxes); } // grow
 
 } // end update bvh
 
 // Self collisions
 std::pair<bool,VFCollisionPair>
 EmbeddedMeshCollision::detect_against_self(
+       const admmpd::Mesh *mesh_,
+       const admmpd::Options *options,
+       const admmpd::SolverData *data,
        int pt_idx,
        const Eigen::Vector3d &pt_t0,
        const Eigen::Vector3d &pt_t1,
        const Eigen::MatrixXd *x0,
        const Eigen::MatrixXd *x1) const
 {
-
        (void)(pt_t0); (void)(x0);
        std::pair<bool,VFCollisionPair> ret = 
                std::make_pair(false, VFCollisionPair());
 
+       if (!mesh_)
+               return ret;
+
+       if (mesh_->type() != MESHTYPE_EMBEDDED)
+               return ret;
+
+       const EmbeddedMesh* mesh = dynamic_cast<const EmbeddedMesh*>(mesh_);
+
        // Are we in the (deforming) tet mesh?
-       int self_tet_idx = meshdata.mesh->emb_vtx_to_tet()->operator[](pt_idx);
+       int self_tet_idx = mesh->emb_vtx_to_tet()->operator[](pt_idx);
        std::vector<int> skip_tet_inds = {self_tet_idx};
        PointInTetMeshTraverse<double> pt_in_tet(
                pt_t1,
                x1,
-               meshdata.mesh->prims(), // tets
+               mesh->prims(), // tets
                std::vector<int>(), // skip tets that contain these verts
                skip_tet_inds); // skip tet that is this index
-       bool in_mesh = meshdata.tet_tree.traverse(pt_in_tet)

@@ 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