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 = [©_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