// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2013 Alec Jacobson // // This Source Code Form is subject to the terms of the Mozilla Public License // v. 2.0. If a copy of the MPL was not distributed with this file, You can // obtain one at http://mozilla.org/MPL/2.0/. #include "project.h" template Eigen::Matrix igl::project( const Eigen::Matrix& obj, const Eigen::Matrix& model, const Eigen::Matrix& proj, const Eigen::Matrix& viewport) { Eigen::Matrix tmp; tmp << obj,1; tmp = model * tmp; tmp = proj * tmp; tmp = tmp.array() / tmp(3); tmp = tmp.array() * 0.5f + 0.5f; tmp(0) = tmp(0) * viewport(2) + viewport(0); tmp(1) = tmp(1) * viewport(3) + viewport(1); return tmp.head(3); } template IGL_INLINE void igl::project( const Eigen::MatrixBase& V, const Eigen::MatrixBase& model, const Eigen::MatrixBase& proj, const Eigen::MatrixBase& viewport, Eigen::PlainObjectBase & P) { typedef typename DerivedP::Scalar PScalar; Eigen::Matrix HV(V.rows(),4); HV.leftCols(3) = V.template cast(); HV.col(3).setConstant(1); HV = (HV*model.template cast().transpose()* proj.template cast().transpose()).eval(); HV = (HV.array().colwise()/HV.col(3).array()).eval(); HV = (HV.array() * 0.5 + 0.5).eval(); HV.col(0) = (HV.array().col(0) * viewport(2) + viewport(0)).eval(); HV.col(1) = (HV.array().col(1) * viewport(3) + viewport(1)).eval(); P = HV.leftCols(3); } #ifdef IGL_STATIC_LIBRARY // Explicit template instantiation template Eigen::Matrix igl::project(Eigen::Matrix const&, Eigen::Matrix const&, Eigen::Matrix const&, Eigen::Matrix const&); template Eigen::Matrix igl::project(Eigen::Matrix const&, Eigen::Matrix const&, Eigen::Matrix const&, Eigen::Matrix const&); template void igl::project, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix>(const Eigen::MatrixBase>&, const Eigen::MatrixBase>&, const Eigen::MatrixBase>&, const Eigen::MatrixBase>&, Eigen::PlainObjectBase>&); template void igl::project, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix, Eigen::Matrix>(const Eigen::MatrixBase>&, const Eigen::MatrixBase>&, const Eigen::MatrixBase>&, const Eigen::MatrixBase>&, Eigen::PlainObjectBase>&); #endif