[Bf-blender-cvs] [dfeffa39b84] soc-2020-soft-body: merged from master

mattoverby noreply at git.blender.org
Thu Aug 13 01:21:28 CEST 2020


Commit: dfeffa39b848c3b54d6461c9a38c97f7dc7afd8c
Author: mattoverby
Date:   Wed Aug 12 18:21:23 2020 -0500
Branches: soc-2020-soft-body
https://developer.blender.org/rBdfeffa39b848c3b54d6461c9a38c97f7dc7afd8c

merged from master

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



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

diff --cc extern/softbody/src/admmpd_bvh_traverse.cpp
index 6d55241d793,00000000000..6f0ea41001c
mode 100644,000000..100644
--- a/extern/softbody/src/admmpd_bvh_traverse.cpp
+++ b/extern/softbody/src/admmpd_bvh_traverse.cpp
@@@ -1,313 -1,0 +1,215 @@@
 +// Copyright Matt Overby 2020.
 +// Distributed under the MIT License.
 +
 +#ifndef ADMMPD_BVH_H_
 +#define ADMMPD_BVH_H_ 1
 +
 +#include "admmpd_bvh_traverse.h"
 +#include "admmpd_geom.h"
 +#include "BLI_assert.h"
 +#include "BLI_math_geom.h"
 +
 +namespace admmpd {
 +using namespace Eigen;
 +
 +template <typename T>
 +void PointInTetMeshTraverse<T>::traverse(
 +	const AABB &left_aabb, bool &go_left,
 +	const AABB &right_aabb, bool &go_right,
 +	bool &go_left_first )
 +{
 +	if (left_aabb.contains(point))
 +		go_left = true;
 +	if (right_aabb.contains(point))
 +		go_right = true;
 +	(void)(go_left_first); // doesn't matter for point-in-tet
 +}
 +
 +template <typename T>
 +bool PointInTetMeshTraverse<T>::stop_traversing(
 +		const AABB &aabb, int prim )
 +{
 +	BLI_assert(prim_verts->cols()==3);
 +	BLI_assert(prim_inds->cols()==4);
 +
 +	if (!aabb.contains(point))
 +		return false;
 +
 +	int n_tet_skip = skip_tet_inds.size();
 +	for (int i=0; i<n_tet_skip; ++i)
 +	{
 +		if (skip_tet_inds[i]==prim) return false;
 +	}
 +
 +	RowVector4i t = prim_inds->row(prim);
 +	int n_skip = skip_vert_inds.size();
 +	for (int i=0; i<n_skip; ++i)
 +	{
 +		if (skip_vert_inds[i]==t[0]) return false;
 +		if (skip_vert_inds[i]==t[1]) return false;
 +		if (skip_vert_inds[i]==t[2]) return false;
 +		if (skip_vert_inds[i]==t[3]) return false;
 +	}
 +
 +	VecType v[4] = {
 +		prim_verts->row(t[0]),
 +		prim_verts->row(t[1]),
 +		prim_verts->row(t[2]),
 +		prim_verts->row(t[3])
 +	};
 +
 +	bool hit = geom::point_in_tet<T>(point, v[0], v[1], v[2], v[3]);
 +
 +	if (hit)
 +		output.prim = prim;
 +
 +	return hit; // stop traversing if hit
 +}
 +
 +template <typename T>
 +PointInTriangleMeshTraverse<T>::PointInTriangleMeshTraverse(
 +	const VecType &point_,
 +	const MatrixXType *prim_verts_,
 +	const Eigen::MatrixXi *prim_inds_,
 +	const std::vector<int> &skip_inds_) :
 +	point(point_),
 +	dir(0,0,1),
 +	prim_verts(prim_verts_),
 +	prim_inds(prim_inds_),
 +	skip_inds(skip_inds_)
 +{
 +	//dir = VecType::Random();
 +	BLI_assert(prim_verts->rows()>=0);
 +	BLI_assert(prim_inds->rows()>=0);
 +	BLI_assert(prim_inds->cols()==3);
 +	dir.normalize(); // TODO random unit vector
 +	for (int i=0; i<3; ++i)
 +	{
 +		o[i] = (float)point[i];
 +		d[i] = (float)dir[i];
 +	}
 +	isect_ray_tri_watertight_v3_precalc(&isect_precalc, d);
 +}
 +
 +template <typename T>
 +void PointInTriangleMeshTraverse<T>::traverse(
 +	const AABB &left_aabb, bool &go_left,
 +	const AABB &right_aabb, bool &go_right,
 +	bool &go_left_first )
 +{
 +	const T t_min = 0;
 +	const T t_max = std::numeric_limits<T>::max();
 +	go_left = geom::ray_aabb<T>(point,dir,left_aabb,t_min,t_max);
 +	go_right = geom::ray_aabb<T>(point,dir,right_aabb,t_min,t_max);
 +	go_left_first = go_left;
 +} // end point in mesh traverse
 +
 +template <typename T>
 +bool PointInTriangleMeshTraverse<T>::stop_traversing(
 +		const AABB &aabb, int prim )
 +{
 +	const T t_min = 0;
 +	T t_max = std::numeric_limits<T>::max();
 +
 +	// Check if the tet box doesn't intersect the triangle box
 +	if (!geom::ray_aabb<T>(point,dir,aabb,t_min,t_max))
 +		return false;
 +
 +	// Get the vertices of the face in float arrays
 +	// to interface with Blender kernels.
 +	BLI_assert(prim >= 0 && prim < prim_inds->rows());
 +	RowVector3i q_f = prim_inds->row(prim);
 +	int n_skip = skip_inds.size();
 +	for (int i=0; i<n_skip; ++i)
 +	{
 +		if (skip_inds[i]==q_f[0]) return false;
 +		if (skip_inds[i]==q_f[1]) return false;
 +		if (skip_inds[i]==q_f[2]) return false;
 +	}
 +	BLI_assert(q_f[0] < prim_verts->rows());
 +	BLI_assert(q_f[1] < prim_verts->rows());
 +	BLI_assert(q_f[2] < prim_verts->rows());
 +	float q0[3], q1[3], q2[3];
 +	for (int i=0; i<3; ++i)
 +	{
 +		q0[i] = (float)prim_verts->operator()(q_f[0],i);
 +		q1[i] = (float)prim_verts->operator()(q_f[1],i);
 +		q2[i] = (float)prim_verts->operator()(q_f[2],i);
 +	}
 +
 +	// If we didn't have a triangle-triangle intersection
 +	// then record if it was a ray-hit.
 +	float lambda = 0;
 +	float uv[2] = {0,0};
 +	bool hit = isect_ray_tri_watertight_v3(o, &isect_precalc, q0, q1, q2, &lambda, uv);
 +
 +	if (hit)
 +		output.hits.emplace_back(std::make_pair(prim,lambda));
 +
 +	return false; // multi-hit, so keep traversing
 +
 +} // end point in mesh stop traversing
 +
 +template <typename T>
 +void NearestTriangleTraverse<T>::traverse(
 +	const AABB &left_aabb, bool &go_left,
 +	const AABB &right_aabb, bool &go_right,
 +	bool &go_left_first)
 +{
 +	T l_d = left_aabb.exteriorDistance(point);
 +	go_left = l_d < output.dist;
 +	T r_d = right_aabb.exteriorDistance(point);
 +	go_right = r_d < output.dist;
 +	go_left_first = go_left <= go_right;
 +}
 +
 +template <typename T>
 +bool NearestTriangleTraverse<T>::stop_traversing(const AABB &aabb, int prim)
 +{
 +	BLI_assert(prim >= 0);
 +	BLI_assert(prim < prim_inds->rows());
 +	BLI_assert(prim_inds->cols()==3);
 +
 +	T b_dist = aabb.exteriorDistance(point);
 +	if (b_dist > output.dist)
 +		return false;
 +
 +	RowVector3i tri = prim_inds->row(prim);
 +
 +	int n_skip = skip_inds.size();
 +	for (int i=0; i<n_skip; ++i)
 +	{
 +		if (skip_inds[i]==tri[0]) return false;
 +		if (skip_inds[i]==tri[1]) return false;
 +		if (skip_inds[i]==tri[2]) return false;
 +	}
 +
 +	VecType v[3] = {
 +		prim_verts->row(tri[0]),
 +		prim_verts->row(tri[1]),
 +		prim_verts->row(tri[2])
 +	};
 +	VecType pt_on_tri = geom::point_on_triangle<T>(point,v[0],v[1],v[2]);
 +	double dist = (point-pt_on_tri).norm();
 +	if (dist < output.dist)
 +	{
 +		output.prim = prim;
 +		output.dist = dist;
 +		output.pt_on_tri = pt_on_tri;		
 +	}
 +
 +	return false;
 +}
 +
- template <typename T>
- TetIntersectsMeshTraverse<T>::TetIntersectsMeshTraverse(
- 	const VecType points_[4],
- 	const MatrixXType *prim_verts_,
- 	const Eigen::MatrixXi *prim_inds_) :
- 		prim_verts(prim_verts_),
- 		prim_inds(prim_inds_)
- {
- 	for (int i=0; i<4; ++i)
- 		points[i] = points_[i];
- 
- 	BLI_assert(prim_verts->cols()==3);
- 	BLI_assert(prim_inds->cols()==3);
- 
- 	for(int i=0; i<3; ++i)
- 	{
- 		p0[i] = (float)points[0][i];
- 		p1[i] = (float)points[1][i];
- 		p2[i] = (float)points[2][i];
- 		p3[i] = (float)points[3][i];
- 	}
- 
- 	tet_faces.resize(4,std::vector<float*>());
- 	tet_faces[0] = {p0,p1,p2};
- 	tet_faces[1] = {p0,p2,p3};
- 	tet_faces[2] = {p0,p3,p1};
- 	tet_faces[3] = {p1,p2,p3};
- 
- 	tet_aabb.setEmpty();
- 	for (int i=0; i<4; ++i)
- 		tet_aabb.extend(points[i]);
- 
- } // end point in mesh constructor
- 
- template <typename T>
- void TetIntersectsMeshTraverse<T>::traverse(
- 	const AABB &left_aabb, bool &go_left,
- 	const AABB &right_aabb, bool &go_right,
- 	bool &go_left_first )
- {
- 	go_left = false;
- 	go_right = false;
- 
- 	if (tet_aabb.intersects(left_aabb))
- 		go_left = true;
- 	if (tet_aabb.intersects(right_aabb))
- 		go_right = true;
- 
- 	go_left_first = true;
- 	if (go_right && !go_left)
- 		go_left_first = false;
- 
- } // end point in mesh traverse
- 
- template <typename T>
- bool TetIntersectsMeshTraverse<T>::stop_traversing(
- 		const AABB &aabb, int prim )
- {
- 	bool tet_hits_aabb = tet_aabb.intersects(aabb);
- 	if(!tet_hits_aabb)
- 	{
- 		return false;
- 	}
- 
- 	// Get the vertices of the face in float arrays
- 	// to interface with Blender kernels.
- 	BLI_assert(prim >= 0 && prim < prim_inds->rows());
- 	RowVector3i q_f = prim_inds->row(prim);
- 	float q0[3], q1[3], q2[3];
- 	for (int i=0; i<3; ++i)
- 	{
- 		q0[i] = (float)prim_verts->operator()(q_f[0],i);
- 		q1[i] = (float)prim_verts->operator()(q_f[1],i);
- 		q2[i] = (float)prim_verts->operator()(q_f[2],i);
- 	}
- 
- 	// If the tet-aabb intersects the triangle-aabb, then test
- 	// the four faces of the tet against the triangle.
- 	for (int i=0; i<4; ++i)
- 	{
- 		float r_i1[3] = {0,0,0};
- 		float r_i2[3] = {0,0,0};
- 		const std::vector<float*> &f = tet_faces[i];
- 		bool hit = isect_tri_tri_epsilon_v3(
- 			f[0], f[1], f[2], q0, q1, q2, r_i1, r_i2, 1e-8);
- 		if (hit)
- 		{
- 			output.hit_face = prim;
- 			return true;
- 		}
- 	}
- 
- 	return false; // multi-hit, so keep traversing
- 
- } // end point in mesh stop traversing
- 
 +// Compile template types
 +template class admmpd::PointInTetMeshTraverse<double>;
 +template class admmpd::PointInTetMeshTraverse<float>;
 +template class admmpd::PointInTriangleMeshTraverse<double>;
 +template class admmpd::PointInTriangleMeshTraverse<float>;
 +template class admmpd::NearestTriangleTraverse<double>;
 +template class admmpd::NearestTriangleTraverse<float>;
- template class admmpd::TetIntersectsMeshTraverse<double>;
- template class admmpd::TetIntersectsMeshTraverse<float>;
 +
 +} // namespace admmpd
 +
 +#endif // ADMMPD_BVH_H_
 +
diff --cc extern/softbody/src/admmpd_bvh_traverse.h
index a1e217e9ff8,00000000000..269713c5be6
mode 100644,000000..100644
--- a/extern/softbody/src/admmpd_bvh_traverse.h
+++ b/extern/softbody/src/admmpd_bvh_traverse.h
@@@ -1,206 -1,0 +1,168 @@@
 +// Copyright Matt Overby 2020.
 +// Distributed under the MIT License.
 +
 +#ifndef ADMMPD_BVH_TRAVERSE_H_
 +#define ADMMPD_BVH_TRAVERSE_H_ 1
 +
 +#include <Eigen/Geometry>
 +#include <vector>
 +#include "BLI_math_geom.h"
 +
 +namespace admmpd {
 +
 +
 +// Traverse class for traversing the structures.
 +template <typename T, int DIM>
 +class Traverser
 +{
 +protected:
 +	typedef Eigen::AlignedBox<T,DIM> AABB;
 +public:
 +	// Set the boolean flags if we should go left, right, or both.
 +	// Default for all booleans is true if left unchanged.
 +	// Note that if stop_traversing ever returns true, it may not
 +	// go left/right, even if you set go_left/go_right.
 +	virtual void traverse(
 +		const AABB &left_aabb, bool &go_left,
 +		const AABB &right_aabb, bool &go_right,
 +		bool &go_left_first) = 0;
 +
 +	// Return true to stop traversing.
 +	// I.e., returning true is equiv to "hit anything stop checking",
 +	// finding a closest object should return false (continue traversing).
 +	virtual bool stop_traversing(const AABB &aabb, int prim) = 0;
 +};
 +
 +// Point in tet mesh traversal
 +tem

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list