Commit: e2aa1018fbb4161e0f0217398c5209d385cb7f17
Author: mattoverby
Date:   Tue Aug 11 15:09:29 2020 -0500
Branches: soc-2020-soft-body
https://developer.blender.org/rBe2aa1018fbb4161e0f0217398c5209d385cb7f17

fixed segfail if ctrl z

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

M       extern/softbody/src/admmpd_bvh.h
M       extern/softbody/src/admmpd_bvh_traverse.cpp
M       extern/softbody/src/admmpd_bvh_traverse.h
M       extern/softbody/src/admmpd_geom.cpp
M       extern/softbody/src/admmpd_geom.h
M       extern/softbody/src/admmpd_linsolve.h
M       intern/softbody/admmpd_api.h
M       source/blender/blenkernel/intern/softbody.c

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

diff --git a/extern/softbody/src/admmpd_bvh.h b/extern/softbody/src/admmpd_bvh.h
index bf26d14cdd5..56844a056fb 100644
--- a/extern/softbody/src/admmpd_bvh.h
+++ b/extern/softbody/src/admmpd_bvh.h
@@ -99,11 +99,8 @@ public:
        // Removes all BVH data
        void clear();
 
-       // Creates the Octree up to depth with smart subdivision
-       // (only create children if it contains prims) and does not
-       // create a cell if it is outside the mesh.
-       // ** Assumes a closed mesh and only defined for 3D
-       // eps is added to the min and max of the boxes.
+       // Creates the Octree up to stopdepth. Only boxes containing
+       // faces are subdivided up to the depth.
        void init(const MatrixXT *V, const Eigen::MatrixXi *F, int stopdepth);
 
        // Returns bounding box of the root node
diff --git a/extern/softbody/src/admmpd_bvh_traverse.cpp 
b/extern/softbody/src/admmpd_bvh_traverse.cpp
index 310042fcf05..6d55241d793 100644
--- a/extern/softbody/src/admmpd_bvh_traverse.cpp
+++ b/extern/softbody/src/admmpd_bvh_traverse.cpp
@@ -12,80 +12,6 @@
 namespace admmpd {
 using namespace Eigen;
 
-template <typename T>
-RayClosestHit<T>::RayClosestHit(
-               const VecType &orig_,
-               const VecType &dir_,
-               const MatrixXType *prim_verts_,
-               const Eigen::MatrixXi *tri_inds_,
-               T eps_,
-               T t_min_,
-               T t_max_) :
-       o(orig_),
-       d(dir_),
-       prim_verts(prim_verts_),
-       tri_inds(tri_inds_),
-       eps(eps_),
-       t_min(t_min_)
-{
-       output.t_max = t_max_;
-       BLI_assert(prim_verts != NULL);
-       BLI_assert(tri_inds != NULL);
-       BLI_assert(prim_verts->cols()==3);
-       BLI_assert(tri_inds->cols()==3);
-}
-
-template <typename T>
-void RayClosestHit<T>::traverse(
-       const AABB &left_aabb, bool &go_left,
-       const AABB &right_aabb, bool &go_right,
-       bool &go_left_first)
-{
-       go_left = geom::ray_aabb<T>(o,d,left_aabb,t_min,output.t_max) ||
-               (eps > 0 ? left_aabb.exteriorDistance(o) < eps : false);
-       go_right = geom::ray_aabb<T>(o,d,right_aabb,t_min,output.t_max) ||
-               (eps > 0 ? right_aabb.exteriorDistance(o) < eps : false);
-       (void)(go_left_first);
-}
-
-template <typename T>
-bool RayClosestHit<T>::stop_traversing(const AABB &aabb, int prim)
-{
-       BLI_assert(prim > 0);
-       BLI_assert(prim < tri_inds->rows());
-       if (!geom::ray_aabb<T>(o,d,aabb,t_min,output.t_max))
-               return true;
-       RowVector3i p = tri_inds->row(prim);
-       VecType v[3] = {
-               prim_verts->row(p[0]),
-               prim_verts->row(p[1]),
-               prim_verts->row(p[2])
-       };
-       T t_max = output.t_max;
-       VecType bary;
-       bool hit = geom::ray_triangle<T>(o,d,v[0],v[1],v[2],t_min,t_max,&bary);
-       if (hit)
-       {
-               output.prim = prim;
-               output.t_max = t_max;
-               output.barys = bary;
-               return false;
-       }
-       if (eps > 0)
-       {
-               VecType o_on_tri = geom::point_on_triangle<T>(o,v[0],v[1],v[2]);
-               T dist = (o-o_on_tri).norm();
-               if (dist < eps)
-               {
-                       output.prim = prim;
-                       output.t_max = dist;
-                       output.barys = 
geom::point_triangle_barys<T>(o_on_tri,v[0],v[1],v[2]);
-               }
-       }
-       return false;
-}
-
-
 template <typename T>
 void PointInTetMeshTraverse<T>::traverse(
        const AABB &left_aabb, bool &go_left,
@@ -132,12 +58,7 @@ bool PointInTetMeshTraverse<T>::stop_traversing(
                prim_verts->row(t[3])
        };
 
-       bool hit = geom::point_in_tet(
-               point.template cast<double>(),
-               v[0].template cast<double>(),
-               v[1].template cast<double>(),
-               v[2].template cast<double>(),
-               v[3].template cast<double>());
+       bool hit = geom::point_in_tet<T>(point, v[0], v[1], v[2], v[3]);
 
        if (hit)
                output.prim = prim;
@@ -377,8 +298,6 @@ bool TetIntersectsMeshTraverse<T>::stop_traversing(
 } // end point in mesh stop traversing
 
 // Compile template types
-template class admmpd::RayClosestHit<double>;
-template class admmpd::RayClosestHit<float>;
 template class admmpd::PointInTetMeshTraverse<double>;
 template class admmpd::PointInTetMeshTraverse<float>;
 template class admmpd::PointInTriangleMeshTraverse<double>;
diff --git a/extern/softbody/src/admmpd_bvh_traverse.h 
b/extern/softbody/src/admmpd_bvh_traverse.h
index ae122525d0a..a1e217e9ff8 100644
--- a/extern/softbody/src/admmpd_bvh_traverse.h
+++ b/extern/softbody/src/admmpd_bvh_traverse.h
@@ -33,51 +33,6 @@ public:
        virtual bool stop_traversing(const AABB &aabb, int prim) = 0;
 };
 
-// Closest hit BVH traversal.
-template <typename T>
-class RayClosestHit : public Traverser<T,3>
-{
-protected:
-       using typename Traverser<T,3>::AABB;
-       typedef Eigen::Matrix<T,3,1> VecType;
-       typedef Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> MatrixXType;
-
-       VecType o, d;
-       const MatrixXType *prim_verts;
-       const Eigen::MatrixXi *tri_inds;
-       T eps;
-       T t_min;
-
-public:
-       struct Output {
-               int prim; // -1 if no intersections
-               T t_max;
-               VecType barys;
-               Output() :
-                       prim(-1),
-                       t_max(std::numeric_limits<T>::max()),
-                       barys(VecType::Zero())
-                       {}
-       } output;
-
-       RayClosestHit(
-                       const VecType &orig_, // ray origin
-                       const VecType &dir_,  // normalized ray direction
-                       const MatrixXType *prim_verts_,
-                       const Eigen::MatrixXi *tri_inds_,
-                       T eps_, // if dist(0,tri) < eps, is a hit. eps<=0 skips 
this test
-                       T t_min_=0,
-                       T t_max_=std::numeric_limits<T>::max());
-
-       void traverse(
-               const AABB &left_aabb, bool &go_left,
-               const AABB &right_aabb, bool &go_right,
-               bool &go_left_first);
-
-       // Searches for closest hit, so always returns false
-       bool stop_traversing(const AABB &aabb, int prim);
-};
-
 // Point in tet mesh traversal
 template <typename T>
 class PointInTetMeshTraverse : public Traverser<T,3>
diff --git a/extern/softbody/src/admmpd_geom.cpp 
b/extern/softbody/src/admmpd_geom.cpp
index 839e4ebd581..3947ec06c76 100644
--- a/extern/softbody/src/admmpd_geom.cpp
+++ b/extern/softbody/src/admmpd_geom.cpp
@@ -39,21 +39,22 @@ Matrix<T,4,1> geom::point_tet_barys(
 
 // Checks that it's on the "correct" side of the normal
 // for each face of the tet. Assumes winding points inward.
+template <typename T>
 bool geom::point_in_tet(
-       const Vector3d &p,
-       const Vector3d &a,
-       const Vector3d &b,
-       const Vector3d &c,
-       const Vector3d &d)
+       const Matrix<T,3,1> &p,
+       const Matrix<T,3,1> &a,
+       const Matrix<T,3,1> &b,
+       const Matrix<T,3,1> &c,
+       const Matrix<T,3,1> &d)
 {
        auto check_face = [](
-               const Vector3d &point,
-               const Vector3d &p0,
-               const Vector3d &p1,
-               const Vector3d &p2,
-               const Vector3d &p3 )
+               const Matrix<T,3,1> &point,
+               const Matrix<T,3,1> &p0,
+               const Matrix<T,3,1> &p1,
+               const Matrix<T,3,1> &p2,
+               const Matrix<T,3,1> &p3 )
        {
-               Vector3d n = (p1-p0).cross(p2-p0);
+               Matrix<T,3,1> n = (p1-p0).cross(p2-p0);
                double dp3 = n.dot(p3-p0);
                double dp = n.dot(point-p0);
                return (dp3*dp >= 0);
@@ -65,23 +66,24 @@ bool geom::point_in_tet(
                check_face(p, d, a, b, c);
 }
 
+template <typename T>
 void geom::create_tets_from_box(
-    const Eigen::Vector3d &bmin,
-    const Eigen::Vector3d &bmax,
-    std::vector<Eigen::Vector3d> &verts,
+    const Eigen::Matrix<T,3,1> &bmin,
+    const Eigen::Matrix<T,3,1> &bmax,
+    std::vector<Eigen::Matrix<T,3,1> > &verts,
     std::vector<Eigen::RowVector4i> &tets)
 {
-       std::vector<Vector3d> v = {
+       std::vector<Matrix<T,3,1>> v = {
                // Top plane, clockwise looking down
                bmax,
-               Vector3d(bmin[0], bmax[1], bmax[2]),
-               Vector3d(bmin[0], bmax[1], bmin[2]),
-               Vector3d(bmax[0], bmax[1], bmin[2]),
+               Matrix<T,3,1>(bmin[0], bmax[1], bmax[2]),
+               Matrix<T,3,1>(bmin[0], bmax[1], bmin[2]),
+               Matrix<T,3,1>(bmax[0], bmax[1], bmin[2]),
                // Bottom plane, clockwise looking down
-               Vector3d(bmax[0], bmin[1], bmax[2]),
-               Vector3d(bmin[0], bmin[1], bmax[2]),
+               Matrix<T,3,1>(bmax[0], bmin[1], bmax[2]),
+               Matrix<T,3,1>(bmin[0], bmin[1], bmax[2]),
                bmin,
-               Vector3d(bmax[0], bmin[1], bmin[2])
+               Matrix<T,3,1>(bmax[0], bmin[1], bmin[2])
        };
        // Add vertices and get indices of the box
        std::vector<int> b;
@@ -470,36 +472,36 @@ bool geom::ray_triangle(
        return true;
 } // end ray - triangle test
 
+template <typename T>
 void geom::merge_close_vertices(
-       std::vector<Vector3d> &verts,
+       std::vector<Matrix<T,3,1> > &verts,
        std::vector<RowVector4i> &tets,
-       double eps)
+       T eps)
 {
        int nv = verts.size();
-       std::vector<Vector3d> new_v(nv); // new verts
+       std::vector<Matrix<T,3,1> > new_v(nv); // new verts
        std::vector<int> idx(nv,0); // index mapping
        std::vector<int> visited(nv,0);
-       int count = 0;
+       int curr_idx = 0;
        for (int i=0; i<nv; ++i)
        {
                if(!visited[i])
                {
+                       new_v[curr_idx] = verts[i];
                        visited[i] = 1;
-                       new_v[count] = verts[i];
-                       idx[i] = count;
-                       Vector3d vi = verts[i];
+                       idx[i] = curr_idx;
                        for (int j = i+1; j<nv; ++j)
                        {
-                               if((verts[j]-vi).norm() < eps)
+                               if((verts[j]-verts[i]).norm() < eps)
                                {
                                        visited[j] = 1;
-                                       idx[j] = count;
+                                       idx[j] = curr_idx;
                                }
                        }
-                       count++;
+                       curr_idx++;
                }
        }
-       new_v.resize(count);
+       new_v.resize(curr_idx);
        verts = new_v;
        int nt = tets.size();
        for (int i=0; i<nt; ++i)
@@ -539,26 +541,48 @@ void geom::make_n3(
 //
 template Eigen::Matrix<double,4,1>
        admmpd::geom::point_tet_barys<double>(
-       const Eigen::Vector3d&,
-       const Eigen::Vector3d&, const Eigen::Vector3d&,
-       const Eigen::Vector3d&, const Eigen::Vector3d&);
+       const Eigen::Matrix<double,3,1>&,
+       const Eigen::Matrix<double,3,1>&, const Eigen::Matrix<double,3,1>&,
+       const Eigen::Matrix<double,3,1>&, const Eigen::Matrix<double,3,1>&);
 template Eigen::Matrix<float,4,1>
        admmpd::geom::point_tet_barys<float>(
        const Eigen::Vector3f&,
        const Eigen::Vector3f&, const Eigen::Vector3f&,
        const Eigen::Vector3f&, const Eigen::Vector3f&);
+template bool admmpd::geom::point_in_tet<double>(
+       const Matrix<double,3,1>&,
+       const Matrix<double,3,1>&,
+       const Matrix<double,3,1>&,
+       const Matrix<double,3,1>&,
+       const Matrix<double,3,1>&);
+template bool admmpd::geom::point_in_tet<float>(
+       const Matrix<float,3,1>&,
+       const Matrix<float,3,1>&,
+       const Matrix<float,3,1>&,
+       const Matrix<float,3,1>&,
+       const Matrix<float,3,1>&);
+template void geom::create_tets_from_box<double>(
+    const Eigen::Matrix<double,3,1>&,
+    const Eigen::Matrix<double,3,1>&,
+    std::vector<Eigen::Matrix<double,3,1> >&,
+    std::vector<Eigen::RowVector4i>&);
+template void geom::create_tets_from_box<float>(
+    const Eigen::Matrix<float,3,1>&,
+    const Eigen::Matrix<float,3,1>&,
+    std::vector<Eigen::Matrix<float,3,1> >&,
+    std::vector<Eigen::RowVector4i>&);


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