[Bf-blender-cvs] [f757a36a0f1] soc-2020-soft-body: smart pointers (sue me)

over0219 noreply at git.blender.org
Wed Jul 22 04:23:49 CEST 2020


Commit: f757a36a0f121d75fdb5946104484685a6f37929
Author: over0219
Date:   Tue Jul 21 18:04:46 2020 -0500
Branches: soc-2020-soft-body
https://developer.blender.org/rBf757a36a0f121d75fdb5946104484685a6f37929

smart pointers (sue me)

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

M	extern/softbody/src/admmpd_collision.cpp
M	extern/softbody/src/admmpd_collision.h
M	extern/softbody/src/admmpd_mesh.cpp
M	extern/softbody/src/admmpd_mesh.h
M	intern/softbody/admmpd_api.cpp

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

diff --git a/extern/softbody/src/admmpd_collision.cpp b/extern/softbody/src/admmpd_collision.cpp
index 0c07ef441d0..e38df33df06 100644
--- a/extern/softbody/src/admmpd_collision.cpp
+++ b/extern/softbody/src/admmpd_collision.cpp
@@ -90,7 +90,14 @@ Collision::detect_against_obs(
 	return ret;
 }
 
-#if 0
+EmbeddedMeshCollision::EmbeddedMeshCollision(std::shared_ptr<EmbeddedMesh> mesh_) :
+	mesh(mesh_)
+{
+	mesh_emb_V0 = mesh->rest_facet_verts();
+	mesh_F = mesh->facets();
+	mesh_T = mesh->prims();
+}
+
 
 int EmbeddedMeshCollision::detect(
 	const Eigen::MatrixXd *x0,
@@ -110,7 +117,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 = mesh->emb_rest_x.rows();
+	int nev = mesh->rest_facet_verts().rows();
 	if ((int)per_vertex_pairs.size() != nev)
 		per_vertex_pairs.resize(nev, std::vector<VFCollisionPair>());
 
@@ -143,7 +150,7 @@ int EmbeddedMeshCollision::detect(
 
 		std::vector<VFCollisionPair> &vi_pairs = td->per_vertex_pairs->at(vi);
 		vi_pairs.clear();
-		Vector3d pt_t1 = td->embmesh->get_mapped_vertex(td->x1,vi);
+		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)
@@ -191,7 +198,7 @@ int EmbeddedMeshCollision::detect(
 		.settings = &settings,
 		.collision = this,
 		.tetmesh = nullptr,
-		.embmesh = mesh,
+		.embmesh = mesh.get(),
 		.obsdata = &obsdata,
 		.x0 = x0,
 		.x1 = x1,
@@ -219,7 +226,7 @@ void EmbeddedMeshCollision::init_bvh(
 {
 
 	(void)(x0);
-	int nt = mesh->lat_tets.rows();
+	int nt = mesh->prims().rows();
 	if (nt==0)
 		throw std::runtime_error("EmbeddedMeshCollision::init_bvh: No tets");
 
@@ -229,7 +236,7 @@ void EmbeddedMeshCollision::init_bvh(
 	// Update leaf boxes
 	for (int i=0; i<nt; ++i)
 	{
-		RowVector4i tet = mesh->lat_tets.row(i);
+		RowVector4i tet = mesh->prims().row(i);
 		tet_boxes[i].setEmpty();
 		tet_boxes[i].extend(x1->row(tet[0]).transpose());
 		tet_boxes[i].extend(x1->row(tet[1]).transpose());
@@ -250,14 +257,14 @@ void EmbeddedMeshCollision::update_bvh(
 		return;
 	}
 
-	int nt = mesh->lat_tets.rows();
+	int nt = mesh->prims().rows();
 	if ((int)tet_boxes.size() != nt)
 		tet_boxes.resize(nt);
 
 	// Update leaf boxes
 	for (int i=0; i<nt; ++i)
 	{
-		RowVector4i tet = mesh->lat_tets.row(i);
+		RowVector4i tet = mesh->prims().row(i);
 		tet_boxes[i].setEmpty();
 		tet_boxes[i].extend(x1->row(tet[0]).transpose());
 		tet_boxes[i].extend(x1->row(tet[1]).transpose());
@@ -302,17 +309,18 @@ EmbeddedMeshCollision::detect_against_self(
 	std::pair<bool,VFCollisionPair> ret = 
 		std::make_pair(false, VFCollisionPair());
 
-	int self_tet_idx = mesh->emb_vtx_to_tet[pt_idx];
-	RowVector4i self_tet = mesh->lat_tets.row(self_tet_idx);
+	int self_tet_idx = mesh->emb_vtx_to_tet()[pt_idx];
+	RowVector4i self_tet = mesh->prims().row(self_tet_idx);
 	std::vector<int> skip_tet_inds = {self_tet[0],self_tet[1],self_tet[2],self_tet[3]};
-	PointInTetMeshTraverse<double> pt_in_tet(pt,x,&mesh->lat_tets,skip_tet_inds);
+	
+	PointInTetMeshTraverse<double> pt_in_tet(pt,x,&mesh_T,skip_tet_inds);
 	bool in_mesh = tet_tree.traverse(pt_in_tet);
 	if (!in_mesh)
 		return ret;
 
 	// Transform point to rest shape
 	int tet_idx = pt_in_tet.output.prim;
-	RowVector4i tet = mesh->lat_tets.row(tet_idx);
+	RowVector4i tet = mesh->prims().row(tet_idx);
 	Vector4d barys = geom::point_tet_barys(pt,
 		x->row(tet[0]), x->row(tet[1]),
 		x->row(tet[2]), x->row(tet[3]));
@@ -323,28 +331,28 @@ EmbeddedMeshCollision::detect_against_self(
 	}
 
 	Vector3d rest_pt =
-		barys[0]*mesh->lat_rest_x.row(tet[0])+
-		barys[1]*mesh->lat_rest_x.row(tet[1])+
-		barys[2]*mesh->lat_rest_x.row(tet[2])+
-		barys[3]*mesh->lat_rest_x.row(tet[3]);
+		barys[0]*mesh->rest_prim_verts().row(tet[0])+
+		barys[1]*mesh->rest_prim_verts().row(tet[1])+
+		barys[2]*mesh->rest_prim_verts().row(tet[2])+
+		barys[3]*mesh->rest_prim_verts().row(tet[3]);
 
 	// Find triangle surface projection that doesn't
 	// include the penetration vertex
 	std::vector<int> skip_tri_inds = {pt_idx};
 	NearestTriangleTraverse<double> nearest_tri(rest_pt,
-		&mesh->emb_rest_x,&mesh->emb_faces,skip_tri_inds);
-	mesh->emb_rest_tree.traverse(nearest_tri);
+		&mesh_emb_V0,&mesh_F,skip_tri_inds);
+	mesh->emb_rest_tree().traverse(nearest_tri);
 
 	if (nearest_tri.output.prim<0)
 		throw std::runtime_error("EmbeddedMeshCollision: Failed to find triangle");
 
 	// If we're on the "wrong" side of the nearest
 	// triangle, we're probably outside the mesh.
-	RowVector3i hit_face = mesh->emb_faces.row(nearest_tri.output.prim);
+	RowVector3i hit_face = mesh->facets().row(nearest_tri.output.prim);
 	Vector3d tri_v[3] = {
-		mesh->emb_rest_x.row(hit_face[0]),
-		mesh->emb_rest_x.row(hit_face[1]),
-		mesh->emb_rest_x.row(hit_face[2])
+		mesh->rest_facet_verts().row(hit_face[0]),
+		mesh->rest_facet_verts().row(hit_face[1]),
+		mesh->rest_facet_verts().row(hit_face[2])
 	};
 
 	Vector3d tri_n = (tri_v[1]-tri_v[0]).cross(tri_v[2]-tri_v[0]);
@@ -362,11 +370,11 @@ EmbeddedMeshCollision::detect_against_self(
 	ret.second.q_pt = nearest_tri.output.pt_on_tri;
 
 	// Compute barycoords of projection
-	RowVector3i f = mesh->emb_faces.row(nearest_tri.output.prim);
+	RowVector3i f = mesh->facets().row(nearest_tri.output.prim);
 	Vector3d v3[3] = {
-		mesh->emb_rest_x.row(f[0]),
-		mesh->emb_rest_x.row(f[1]),
-		mesh->emb_rest_x.row(f[2])};
+		mesh->rest_facet_verts().row(f[0]),
+		mesh->rest_facet_verts().row(f[1]),
+		mesh->rest_facet_verts().row(f[2])};
 	ret.second.q_bary = geom::point_triangle_barys<double>(
 		nearest_tri.output.pt_on_tri, v3[0], v3[1], v3[2]);
 	if (ret.second.q_bary.minCoeff()<-1e-8 || ret.second.q_bary.sum() > 1+1e-8)
@@ -386,7 +394,7 @@ void EmbeddedMeshCollision::graph(
 	if (np==0)
 		return;
 
-	int nv = mesh->lat_rest_x.rows();
+	int nv = mesh->rest_prim_verts().rows();
 	if ((int)g.size() < nv)
 		g.resize(nv, std::set<int>());
 
@@ -398,8 +406,8 @@ void EmbeddedMeshCollision::graph(
 
 		if (!pair.p_is_obs)
 		{
-			int tet_idx = mesh->emb_vtx_to_tet[pair.p_idx];
-			RowVector4i tet = mesh->lat_tets.row(tet_idx);
+			int tet_idx = mesh->emb_vtx_to_tet()[pair.p_idx];
+			RowVector4i tet = mesh->prims().row(tet_idx);
 			stencil.emplace(tet[0]);
 			stencil.emplace(tet[1]);
 			stencil.emplace(tet[2]);
@@ -407,11 +415,11 @@ void EmbeddedMeshCollision::graph(
 		}
 		if (!pair.q_is_obs)
 		{
-			RowVector3i emb_face = mesh->emb_faces.row(pair.q_idx);
+			RowVector3i emb_face = mesh->facets().row(pair.q_idx);
 			for (int j=0; j<3; ++j)
 			{
-				int tet_idx = mesh->emb_vtx_to_tet[emb_face[j]];
-				RowVector4i tet = mesh->lat_tets.row(tet_idx);
+				int tet_idx = mesh->emb_vtx_to_tet()[emb_face[j]];
+				RowVector4i tet = mesh->prims().row(tet_idx);
 				stencil.emplace(tet[0]);
 				stencil.emplace(tet[1]);
 				stencil.emplace(tet[2]);
@@ -454,7 +462,7 @@ void EmbeddedMeshCollision::linearize(
 		const Vector2i &pair_idx = vf_pairs[i];
 		VFCollisionPair &pair = per_vertex_pairs[pair_idx[0]][pair_idx[1]];
 		int emb_p_idx = pair.p_idx;
-		Vector3d p_pt = mesh->get_mapped_vertex(x,emb_p_idx);
+		Vector3d p_pt = mesh->get_mapped_facet_vertex(*x,emb_p_idx);
 
 		//
 		// If we collided with an obstacle
@@ -486,9 +494,9 @@ void EmbeddedMeshCollision::linearize(
 
 			// Get the four deforming verts that embed
 			// the surface vertices, and add constraints on those.
-			RowVector4d bary = mesh->emb_barys.row(emb_p_idx);
-			int tet_idx = mesh->emb_vtx_to_tet[emb_p_idx];
-			RowVector4i tet = mesh->lat_tets.row(tet_idx);
+			RowVector4d bary = mesh->emb_barycoords().row(emb_p_idx);
+			int tet_idx = mesh->emb_vtx_to_tet()[emb_p_idx];
+			RowVector4i tet = mesh->prims().row(tet_idx);
 			int c_idx = d->size();
 			d->emplace_back(q_n.dot(pair.q_pt));
 			for (int j=0; j<4; ++j)
@@ -505,18 +513,18 @@ void EmbeddedMeshCollision::linearize(
 			d->emplace_back(0);
 
 			// Compute the normal in the deformed space
-			RowVector3i q_face = mesh->emb_faces.row(pair.q_idx);
-			Vector3d q_v0 = mesh->get_mapped_vertex(x,q_face[0]);
-			Vector3d q_v1 = mesh->get_mapped_vertex(x,q_face[1]);
-			Vector3d q_v2 = mesh->get_mapped_vertex(x,q_face[2]);
+			RowVector3i q_face = mesh->facets().row(pair.q_idx);
+			Vector3d q_v0 = mesh->get_mapped_facet_vertex(*x,q_face[0]);
+			Vector3d q_v1 = mesh->get_mapped_facet_vertex(*x,q_face[1]);
+			Vector3d q_v2 = mesh->get_mapped_facet_vertex(*x,q_face[2]);
 			Vector3d q_n = (q_v1-q_v0).cross(q_v2-q_v0);
 			q_n.normalize();
 
 			// The penetrating vertex:
 			{
-				int tet_idx = mesh->emb_vtx_to_tet[emb_p_idx];
-				RowVector4d bary = mesh->emb_barys.row(emb_p_idx);
-				RowVector4i tet = mesh->lat_tets.row(tet_idx);
+				int tet_idx = mesh->emb_vtx_to_tet()[emb_p_idx];
+				RowVector4d bary = mesh->emb_barycoords().row(emb_p_idx);
+				RowVector4i tet = mesh->prims().row(tet_idx);
 				for (int j=0; j<4; ++j)
 				{
 					trips->emplace_back(c_idx, tet[j]*3+0, bary[j]*q_n[0]);
@@ -529,9 +537,9 @@ void EmbeddedMeshCollision::linearize(
 			for (int j=0; j<3; ++j)
 			{
 				int emb_q_idx = q_face[j];
-				RowVector4d bary = mesh->emb_barys.row(emb_q_idx);
-				int tet_idx = mesh->emb_vtx_to_tet[emb_q_idx];
-				RowVector4i tet = mesh->lat_tets.row(tet_idx);
+				RowVector4d bary = mesh->emb_barycoords().row(emb_q_idx);
+				int tet_idx = mesh->emb_vtx_to_tet()[emb_q_idx];
+				RowVector4i tet = mesh->prims().row(tet_idx);
 				for (int k=0; k<4; ++k)
 				{
 					trips->emplace_back(c_idx, tet[k]*3+0, -pair.q_bary[j]*bary[k]*q_n[0]);
@@ -546,73 +554,4 @@ void EmbeddedMeshCollision::linearize(
 
 } // end jacobian
 
-#endif
-
-} // namespace admmpd
-
-/*
-std::pair<bool,VFCollisionPair>
-Collision::detect_point_against_mesh(
-        int pt_idx,
-        bool pt_is_obs,
-        const Eigen::Vector3d &pt,
-        bool mesh_is_obs,
-        const EmbeddedMesh *emb_mesh,
-        const Eigen::MatrixXd *mesh_tets_x,
-        const AABBTree<double,3> *mesh_tets_tree) const
-{
-	std::pair<bool,VFCollisionPair> ret = 
-		std::make_pair(false, VFCollisionPair());
-
-	if (mesh_tets_x->rows()==0)
-		return ret;
-
-	// Point in 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list