#include "screen_space_selection.h" #include "AABB.h" #include "winding_number.h" #include "project.h" #include "unproject.h" #include "Hit.h" #include "parallel_for.h" template < typename DerivedV, typename DerivedF, typename DerivedM, typename DerivedN, typename DerivedO, typename Ltype, typename DerivedW, typename Deriveda> IGL_INLINE void igl::screen_space_selection( const Eigen::MatrixBase & V, const Eigen::MatrixBase & F, const igl::AABB & tree, const Eigen::MatrixBase& model, const Eigen::MatrixBase& proj, const Eigen::MatrixBase& viewport, const std::vector > & L, Eigen::PlainObjectBase & W, Eigen::PlainObjectBase & and_visible) { typedef typename DerivedV::Scalar Scalar; screen_space_selection(V,model,proj,viewport,L,W); const Eigen::RowVector3d origin = (model.inverse().col(3)).head(3).template cast(); igl::parallel_for(V.rows(),[&](const int i) { // Skip unselected points if(W(i)<0.5){ return; } igl::Hit hit; tree.intersect_ray(V,F,origin,V.row(i)-origin,hit); and_visible(i) = !(hit.t>1e-5 && hit.t<(1-1e-5)); }); } template < typename DerivedV, typename DerivedM, typename DerivedN, typename DerivedO, typename Ltype, typename DerivedW> IGL_INLINE void igl::screen_space_selection( const Eigen::MatrixBase & V, const Eigen::MatrixBase& model, const Eigen::MatrixBase& proj, const Eigen::MatrixBase& viewport, const std::vector > & L, Eigen::PlainObjectBase & W) { typedef typename DerivedV::Scalar Scalar; Eigen::Matrix P(L.size(),2); Eigen::Matrix E(L.size(),2); for(int i = 0;i(); E(i,0) = i; E(i,1) = (i+1)%E.rows(); } return screen_space_selection(V,model,proj,viewport,P,E,W); } template < typename DerivedV, typename DerivedM, typename DerivedN, typename DerivedO, typename DerivedP, typename DerivedE, typename DerivedW> IGL_INLINE void igl::screen_space_selection( const Eigen::MatrixBase & V, const Eigen::MatrixBase& model, const Eigen::MatrixBase& proj, const Eigen::MatrixBase& viewport, const Eigen::MatrixBase & P, const Eigen::MatrixBase & E, Eigen::PlainObjectBase & W) { // project all mesh vertices to 2D DerivedV V2; igl::project(V,model,proj,viewport,V2); // In 2D this uses O(N*M) naive algorithm. igl::winding_number(P,E,V2,W); W = W.array().abs().eval(); } #ifdef IGL_STATIC_LIBRARY // Explicit template instantiation template void igl::screen_space_selection, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, float, Eigen::Matrix, Eigen::Array >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, igl::AABB, 3> const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, std::vector, std::allocator > > const&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template void igl::screen_space_selection, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, float, Eigen::Matrix >(Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, Eigen::MatrixBase > const&, std::vector, std::allocator > > const&, Eigen::PlainObjectBase >&); #endif