Switched to new AABB tree implementation for raycasting

This commit is contained in:
Lukas Matena 2020-05-22 13:27:00 +02:00
parent 6e716faa1c
commit cdf80c3b3f

View file

@ -7,6 +7,7 @@
#include <libslic3r/SLA/Contour3D.hpp>
#include <libslic3r/SLA/Clustering.hpp>
#include <libslic3r/SLA/Hollowing.hpp>
#include <libslic3r/AABBTreeIndirect.hpp>
// Workaround: IGL signed_distance.h will define PI in the igl namespace.
@ -23,11 +24,23 @@
#pragma warning(disable: 4244)
#pragma warning(disable: 4267)
#endif
#include <igl/ray_mesh_intersect.h>
#include <igl/point_mesh_squared_distance.h>
#define USE_AABB_INDIRECT // Vojta's AABB (defined) vs igl::AABB (undefined)
#ifdef SLIC3R_SLA_NEEDS_WINDTREE
#ifdef USE_AABB_INDIRECT
#error These two options contradict each other.
#endif
#include <igl/signed_distance.h>
#endif
#ifndef USE_AABB_INDIRECT
#include <igl/point_mesh_squared_distance.h>
#endif
#include <igl/remove_duplicate_vertices.h>
#include <igl/collapse_small_triangles.h>
#include <igl/signed_distance.h>
#ifdef _MSC_VER
#pragma warning(pop)
#endif
@ -40,7 +53,7 @@ namespace Slic3r {
namespace sla {
// Bring back PI from the igl namespace
using igl::PI;
//using igl::PI;
/* **************************************************************************
* PointIndex implementation
@ -188,8 +201,59 @@ void BoxIndex::foreach(std::function<void (const BoxIndexEl &)> fn)
* EigenMesh3D implementation
* ****************************************************************************/
#ifdef USE_AABB_INDIRECT
class EigenMesh3D::AABBImpl {
#else
class EigenMesh3D::AABBImpl: public igl::AABB<Eigen::MatrixXd, 3> {
#endif
public:
#ifdef USE_AABB_INDIRECT
private:
AABBTreeIndirect::Tree3f m_tree;
TriangleMesh m_triangle_mesh; // FIXME: There should be no extra copy
// maybe even the m_V and m_F are extra. This is just to see the new
// AABB tree in action
public:
void init(const TriangleMesh& tmesh)
{
m_triangle_mesh = tmesh;
m_tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(
m_triangle_mesh.its.vertices, m_triangle_mesh.its.indices);
}
void intersect_ray(const Eigen::MatrixXd&, const Eigen::MatrixXi&,
const Vec3d& s, const Vec3d& dir, igl::Hit& hit)
{
AABBTreeIndirect::intersect_ray_first_hit(m_triangle_mesh.its.vertices,
m_triangle_mesh.its.indices,
m_tree,
s, dir, hit);
}
void intersect_ray(const Eigen::MatrixXd&, const Eigen::MatrixXi&,
const Vec3d& s, const Vec3d& dir, std::vector<igl::Hit>& hits)
{
AABBTreeIndirect::intersect_ray_all_hits(m_triangle_mesh.its.vertices,
m_triangle_mesh.its.indices,
m_tree,
s, dir, hits);
}
double squared_distance(const Eigen::MatrixXd&, const Eigen::MatrixXi&,
const Vec3d& point, int& i, Eigen::Matrix<double, 1, 3>& closest) {
size_t idx_unsigned = 0;
Vec3d closest_vec3d(closest);
double dist = AABBTreeIndirect::squared_distance_to_indexed_triangle_set(
m_triangle_mesh.its.vertices,
m_triangle_mesh.its.indices,
m_tree, point, idx_unsigned, closest_vec3d);
i = int(idx_unsigned);
closest = closest_vec3d;
return dist;
}
#endif
#ifdef SLIC3R_SLA_NEEDS_WINDTREE
igl::WindingNumberAABB<Vec3d, Eigen::MatrixXd, Eigen::MatrixXi> windtree;
#endif /* SLIC3R_SLA_NEEDS_WINDTREE */
@ -225,7 +289,11 @@ void to_eigen_mesh(const TriangleMesh &tmesh, Eigen::MatrixXd &V, Eigen::MatrixX
}
}
void to_triangle_mesh(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, TriangleMesh &out)
void to_triangle_mesh(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, TriangleMesh &out);
#if 0
Does this function really work? There seems to be an issue with it.
Currently it is not used anywhere, this way it stays visible but
trigger linking error when attempting to use it.
{
Pointf3s points(size_t(V.rows()));
std::vector<Vec3i> facets(size_t(F.rows()));
@ -238,6 +306,7 @@ void to_triangle_mesh(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, Triang
out = {points, facets};
}
#endif
EigenMesh3D::EigenMesh3D(const TriangleMesh& tmesh): m_aabb(new AABBImpl()) {
auto&& bb = tmesh.bounding_box();
@ -246,7 +315,12 @@ EigenMesh3D::EigenMesh3D(const TriangleMesh& tmesh): m_aabb(new AABBImpl()) {
to_eigen_mesh(tmesh, m_V, m_F);
// Build the AABB accelaration tree
#ifdef USE_AABB_INDIRECT
m_aabb->init(tmesh);
#else
m_aabb->init(m_V, m_F);
#endif
#ifdef SLIC3R_SLA_NEEDS_WINDTREE
m_aabb->windtree.set_mesh(m_V, m_F);
#endif /* SLIC3R_SLA_NEEDS_WINDTREE */