mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-12 17:27:52 -06:00
Switched to new AABB tree implementation for raycasting
This commit is contained in:
parent
6e716faa1c
commit
cdf80c3b3f
1 changed files with 80 additions and 6 deletions
|
@ -7,6 +7,7 @@
|
||||||
#include <libslic3r/SLA/Contour3D.hpp>
|
#include <libslic3r/SLA/Contour3D.hpp>
|
||||||
#include <libslic3r/SLA/Clustering.hpp>
|
#include <libslic3r/SLA/Clustering.hpp>
|
||||||
#include <libslic3r/SLA/Hollowing.hpp>
|
#include <libslic3r/SLA/Hollowing.hpp>
|
||||||
|
#include <libslic3r/AABBTreeIndirect.hpp>
|
||||||
|
|
||||||
|
|
||||||
// Workaround: IGL signed_distance.h will define PI in the igl namespace.
|
// Workaround: IGL signed_distance.h will define PI in the igl namespace.
|
||||||
|
@ -23,11 +24,23 @@
|
||||||
#pragma warning(disable: 4244)
|
#pragma warning(disable: 4244)
|
||||||
#pragma warning(disable: 4267)
|
#pragma warning(disable: 4267)
|
||||||
#endif
|
#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/remove_duplicate_vertices.h>
|
||||||
#include <igl/collapse_small_triangles.h>
|
|
||||||
#include <igl/signed_distance.h>
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
#endif
|
#endif
|
||||||
|
@ -40,7 +53,7 @@ namespace Slic3r {
|
||||||
namespace sla {
|
namespace sla {
|
||||||
|
|
||||||
// Bring back PI from the igl namespace
|
// Bring back PI from the igl namespace
|
||||||
using igl::PI;
|
//using igl::PI;
|
||||||
|
|
||||||
/* **************************************************************************
|
/* **************************************************************************
|
||||||
* PointIndex implementation
|
* PointIndex implementation
|
||||||
|
@ -188,8 +201,59 @@ void BoxIndex::foreach(std::function<void (const BoxIndexEl &)> fn)
|
||||||
* EigenMesh3D implementation
|
* EigenMesh3D implementation
|
||||||
* ****************************************************************************/
|
* ****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef USE_AABB_INDIRECT
|
||||||
|
class EigenMesh3D::AABBImpl {
|
||||||
|
#else
|
||||||
class EigenMesh3D::AABBImpl: public igl::AABB<Eigen::MatrixXd, 3> {
|
class EigenMesh3D::AABBImpl: public igl::AABB<Eigen::MatrixXd, 3> {
|
||||||
|
#endif
|
||||||
|
|
||||||
public:
|
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
|
#ifdef SLIC3R_SLA_NEEDS_WINDTREE
|
||||||
igl::WindingNumberAABB<Vec3d, Eigen::MatrixXd, Eigen::MatrixXi> windtree;
|
igl::WindingNumberAABB<Vec3d, Eigen::MatrixXd, Eigen::MatrixXi> windtree;
|
||||||
#endif /* SLIC3R_SLA_NEEDS_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()));
|
Pointf3s points(size_t(V.rows()));
|
||||||
std::vector<Vec3i> facets(size_t(F.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};
|
out = {points, facets};
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
EigenMesh3D::EigenMesh3D(const TriangleMesh& tmesh): m_aabb(new AABBImpl()) {
|
EigenMesh3D::EigenMesh3D(const TriangleMesh& tmesh): m_aabb(new AABBImpl()) {
|
||||||
auto&& bb = tmesh.bounding_box();
|
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);
|
to_eigen_mesh(tmesh, m_V, m_F);
|
||||||
|
|
||||||
// Build the AABB accelaration tree
|
// Build the AABB accelaration tree
|
||||||
|
#ifdef USE_AABB_INDIRECT
|
||||||
|
m_aabb->init(tmesh);
|
||||||
|
#else
|
||||||
m_aabb->init(m_V, m_F);
|
m_aabb->init(m_V, m_F);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef SLIC3R_SLA_NEEDS_WINDTREE
|
#ifdef SLIC3R_SLA_NEEDS_WINDTREE
|
||||||
m_aabb->windtree.set_mesh(m_V, m_F);
|
m_aabb->windtree.set_mesh(m_V, m_F);
|
||||||
#endif /* SLIC3R_SLA_NEEDS_WINDTREE */
|
#endif /* SLIC3R_SLA_NEEDS_WINDTREE */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue