|
@@ -10,7 +10,6 @@
|
|
|
#include "diag.h"
|
|
#include "diag.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
-// ===== DEBUG: START
|
|
|
|
|
#include <Eigen/Geometry>
|
|
#include <Eigen/Geometry>
|
|
|
#include <Eigen/Sparse>
|
|
#include <Eigen/Sparse>
|
|
|
#include <Eigen/Dense>
|
|
#include <Eigen/Dense>
|
|
@@ -21,10 +20,9 @@
|
|
|
#include <iostream>
|
|
#include <iostream>
|
|
|
#include "Timer.h"
|
|
#include "Timer.h"
|
|
|
|
|
|
|
|
-using namespace std;
|
|
|
|
|
-// ===== DEBUG: END
|
|
|
|
|
-
|
|
|
|
|
-// TODOs:
|
|
|
|
|
|
|
+// TODOs
|
|
|
|
|
+// 1. U_precomputed, Psi, Omega should be #V by 10 instead of #V by 16
|
|
|
|
|
+// 2. Vectorize Psi computation.
|
|
|
|
|
|
|
|
template <
|
|
template <
|
|
|
typename DerivedV,
|
|
typename DerivedV,
|
|
@@ -36,14 +34,16 @@ template <
|
|
|
typename DerivedTAlloc,
|
|
typename DerivedTAlloc,
|
|
|
typename DerivedU>
|
|
typename DerivedU>
|
|
|
IGL_INLINE void igl::direct_delta_mush(
|
|
IGL_INLINE void igl::direct_delta_mush(
|
|
|
- const Eigen::MatrixBase<DerivedV> &V,
|
|
|
|
|
- const Eigen::MatrixBase<DerivedF> &F,
|
|
|
|
|
- const Eigen::MatrixBase<DerivedC> &C,
|
|
|
|
|
- const Eigen::MatrixBase<DerivedE> &E,
|
|
|
|
|
- const Eigen::SparseMatrix<DerivedW> &W,
|
|
|
|
|
- const std::vector<DerivedT, DerivedTAlloc> &T,
|
|
|
|
|
- Eigen::PlainObjectBase<DerivedU> &U)
|
|
|
|
|
|
|
+ const Eigen::MatrixBase<DerivedV> & V,
|
|
|
|
|
+ const Eigen::MatrixBase<DerivedF> & F,
|
|
|
|
|
+ const Eigen::MatrixBase<DerivedC> & C,
|
|
|
|
|
+ const Eigen::MatrixBase<DerivedE> & E,
|
|
|
|
|
+ const Eigen::SparseMatrix<DerivedW> & W,
|
|
|
|
|
+ const std::vector<DerivedT, DerivedTAlloc> & T,
|
|
|
|
|
+ Eigen::PlainObjectBase<DerivedU> & U)
|
|
|
{
|
|
{
|
|
|
|
|
+ using namespace std;
|
|
|
|
|
+ using namespace Eigen;
|
|
|
cout << "START DDM" << endl;
|
|
cout << "START DDM" << endl;
|
|
|
cout << "END DDM" << endl;
|
|
cout << "END DDM" << endl;
|
|
|
}
|
|
}
|
|
@@ -56,19 +56,21 @@ template <
|
|
|
typename DerivedW,
|
|
typename DerivedW,
|
|
|
typename DerivedOmega>
|
|
typename DerivedOmega>
|
|
|
IGL_INLINE void igl::direct_delta_mush_precomputation(
|
|
IGL_INLINE void igl::direct_delta_mush_precomputation(
|
|
|
- const Eigen::MatrixBase<DerivedV> &V,
|
|
|
|
|
- const Eigen::MatrixBase<DerivedF> &F,
|
|
|
|
|
- const Eigen::MatrixBase<DerivedC> &C,
|
|
|
|
|
- const Eigen::MatrixBase<DerivedE> &E,
|
|
|
|
|
- const Eigen::SparseMatrix<DerivedW> &W,
|
|
|
|
|
|
|
+ const Eigen::MatrixBase<DerivedV> & V,
|
|
|
|
|
+ const Eigen::MatrixBase<DerivedF> & F,
|
|
|
|
|
+ const Eigen::MatrixBase<DerivedC> & C,
|
|
|
|
|
+ const Eigen::MatrixBase<DerivedE> & E,
|
|
|
|
|
+ const Eigen::SparseMatrix<DerivedW> & W,
|
|
|
const int p,
|
|
const int p,
|
|
|
const typename DerivedV::Scalar lambda,
|
|
const typename DerivedV::Scalar lambda,
|
|
|
const typename DerivedV::Scalar kappa,
|
|
const typename DerivedV::Scalar kappa,
|
|
|
const typename DerivedV::Scalar alpha,
|
|
const typename DerivedV::Scalar alpha,
|
|
|
- Eigen::PlainObjectBase<DerivedOmega> &Omega)
|
|
|
|
|
|
|
+ Eigen::PlainObjectBase<DerivedOmega> & Omega)
|
|
|
{
|
|
{
|
|
|
|
|
+ using namespace std;
|
|
|
|
|
+ using namespace Eigen;
|
|
|
assert(kappa < lambda &&
|
|
assert(kappa < lambda &&
|
|
|
- "kappa needs to be smaller than lambda so that optimization for R_i is well defined");
|
|
|
|
|
|
|
+ "kappa needs to be smaller than lambda so that optimization for R_i is well defined");
|
|
|
cout << "START DDM Precomputation" << endl;
|
|
cout << "START DDM Precomputation" << endl;
|
|
|
cout << "Using params:"
|
|
cout << "Using params:"
|
|
|
<< "\np: " << p
|
|
<< "\np: " << p
|
|
@@ -83,7 +85,7 @@ IGL_INLINE void igl::direct_delta_mush_precomputation(
|
|
|
<< endl;
|
|
<< endl;
|
|
|
|
|
|
|
|
const int n = V.rows();
|
|
const int n = V.rows();
|
|
|
- const int m = C.rows();
|
|
|
|
|
|
|
+ const int m = E.rows();
|
|
|
|
|
|
|
|
// U: 4 by #V homogeneous transposed version of V
|
|
// U: 4 by #V homogeneous transposed version of V
|
|
|
Eigen::MatrixXd U(4, n);
|
|
Eigen::MatrixXd U(4, n);
|
|
@@ -91,7 +93,7 @@ IGL_INLINE void igl::direct_delta_mush_precomputation(
|
|
|
Eigen::VectorXd ones(n);
|
|
Eigen::VectorXd ones(n);
|
|
|
for (int i = 0; i < n; i++)
|
|
for (int i = 0; i < n; i++)
|
|
|
{
|
|
{
|
|
|
- ones(i) = 1;
|
|
|
|
|
|
|
+ ones(i) = 1;
|
|
|
}
|
|
}
|
|
|
U.row(U.rows() - 1) = ones;
|
|
U.row(U.rows() - 1) = ones;
|
|
|
cout << "U: " << U.rows() << " x " << U.cols() << " Sum: " << U.sum() << endl;
|
|
cout << "U: " << U.rows() << " x " << U.cols() << " Sum: " << U.sum() << endl;
|
|
@@ -113,7 +115,7 @@ IGL_INLINE void igl::direct_delta_mush_precomputation(
|
|
|
Eigen::SparseMatrix<double> D_L_sparse = D_L.sparseView();
|
|
Eigen::SparseMatrix<double> D_L_sparse = D_L.sparseView();
|
|
|
cout << "D_L_sparse: " << D_L_sparse.rows() << " x " << D_L_sparse.cols() << " Sum: " << D_L_sparse.sum() << endl;
|
|
cout << "D_L_sparse: " << D_L_sparse.rows() << " x " << D_L_sparse.cols() << " Sum: " << D_L_sparse.sum() << endl;
|
|
|
Eigen::SimplicialLDLT<Eigen::SparseMatrix<double>> ldlt;
|
|
Eigen::SimplicialLDLT<Eigen::SparseMatrix<double>> ldlt;
|
|
|
- ldlt.compute(D_L_sparse);
|
|
|
|
|
|
|
+ ldlt.compute(D_L_sparse); // this will take quite a while to compute
|
|
|
Eigen::SparseMatrix<double> L_bar = ldlt.solve(L).transpose();
|
|
Eigen::SparseMatrix<double> L_bar = ldlt.solve(L).transpose();
|
|
|
cout << "L_bar: " << L_bar.rows() << " x " << L_bar.cols() << " Sum: " << L_bar.sum() << endl;
|
|
cout << "L_bar: " << L_bar.rows() << " x " << L_bar.cols() << " Sum: " << L_bar.sum() << endl;
|
|
|
|
|
|
|
@@ -127,14 +129,15 @@ IGL_INLINE void igl::direct_delta_mush_precomputation(
|
|
|
cout << "W_prime: " << W_prime.rows() << " x " << W_prime.cols() << " Sum: " << W_prime.sum() << endl;
|
|
cout << "W_prime: " << W_prime.rows() << " x " << W_prime.cols() << " Sum: " << W_prime.sum() << endl;
|
|
|
ldlt_W_prime.compute(C_calc);
|
|
ldlt_W_prime.compute(C_calc);
|
|
|
cout << "computing W'" << endl;
|
|
cout << "computing W'" << endl;
|
|
|
- for (int iter = 0; iter < p; iter++) {
|
|
|
|
|
|
|
+ for (int iter = 0; iter < p; iter++)
|
|
|
|
|
+ {
|
|
|
cout << "iter:" << iter << endl;
|
|
cout << "iter:" << iter << endl;
|
|
|
W_prime.makeCompressed();
|
|
W_prime.makeCompressed();
|
|
|
W_prime = ldlt_W_prime.solve(W_prime);
|
|
W_prime = ldlt_W_prime.solve(W_prime);
|
|
|
}
|
|
}
|
|
|
cout << "W_prime: " << W_prime.rows() << " x " << W_prime.cols() << " Sum: " << W_prime.sum() << endl;
|
|
cout << "W_prime: " << W_prime.rows() << " x " << W_prime.cols() << " Sum: " << W_prime.sum() << endl;
|
|
|
|
|
|
|
|
- // Psi was hard to solve iteratively since i couldnt express u_k \times u_k^T as matrix form
|
|
|
|
|
|
|
+ // Psi was hard to solve iteratively since i couldn't express u_k \times u_k^T as matrix form
|
|
|
Eigen::SimplicialLDLT<Eigen::SparseMatrix<double>> ldlt_U_tilde;
|
|
Eigen::SimplicialLDLT<Eigen::SparseMatrix<double>> ldlt_U_tilde;
|
|
|
Eigen::SparseMatrix<double> B_calc((I + lambda * L_bar).transpose());
|
|
Eigen::SparseMatrix<double> B_calc((I + lambda * L_bar).transpose());
|
|
|
cout << "B_calc: " << B_calc.rows() << " x " << B_calc.cols() << " Sum: " << B_calc.sum() << endl;
|
|
cout << "B_calc: " << B_calc.rows() << " x " << B_calc.cols() << " Sum: " << B_calc.sum() << endl;
|
|
@@ -143,7 +146,8 @@ IGL_INLINE void igl::direct_delta_mush_precomputation(
|
|
|
Eigen::SparseMatrix<double> U_tilde(U_sparse.transpose());
|
|
Eigen::SparseMatrix<double> U_tilde(U_sparse.transpose());
|
|
|
cout << "U_tilde: " << U_tilde.rows() << " x " << U_tilde.cols() << " Sum: " << U_tilde.sum() << endl;
|
|
cout << "U_tilde: " << U_tilde.rows() << " x " << U_tilde.cols() << " Sum: " << U_tilde.sum() << endl;
|
|
|
cout << "computing U_tilde'" << endl;
|
|
cout << "computing U_tilde'" << endl;
|
|
|
- for (int i = 0; i < p; i++) {
|
|
|
|
|
|
|
+ for (int i = 0; i < p; i++)
|
|
|
|
|
+ {
|
|
|
cout << "i = " << i << endl;
|
|
cout << "i = " << i << endl;
|
|
|
U_tilde.makeCompressed();
|
|
U_tilde.makeCompressed();
|
|
|
U_tilde = ldlt_U_tilde.solve(U_tilde);
|
|
U_tilde = ldlt_U_tilde.solve(U_tilde);
|
|
@@ -151,45 +155,60 @@ IGL_INLINE void igl::direct_delta_mush_precomputation(
|
|
|
U_tilde = U_tilde.transpose();
|
|
U_tilde = U_tilde.transpose();
|
|
|
cout << "U_tilde: " << U_tilde.rows() << " x " << U_tilde.cols() << " Sum: " << U_tilde.sum() << endl;
|
|
cout << "U_tilde: " << U_tilde.rows() << " x " << U_tilde.cols() << " Sum: " << U_tilde.sum() << endl;
|
|
|
|
|
|
|
|
- // TODO: sparse didn't work here
|
|
|
|
|
- Eigen::SparseQR<Eigen::SparseMatrix<double>, Eigen::COLAMDOrdering<int>> qr_B;
|
|
|
|
|
|
|
+ // TODO: sparse didn't work here - malloc error
|
|
|
Eigen::MatrixXd U_dense(U_sparse);
|
|
Eigen::MatrixXd U_dense(U_sparse);
|
|
|
Eigen::MatrixXd U_tilde_dense(U_tilde);
|
|
Eigen::MatrixXd U_tilde_dense(U_tilde);
|
|
|
Eigen::MatrixXd B_inv_dense = U_dense.householderQr().solve(U_tilde_dense);
|
|
Eigen::MatrixXd B_inv_dense = U_dense.householderQr().solve(U_tilde_dense);
|
|
|
Eigen::SparseMatrix<double> B_inv = B_inv_dense.sparseView();
|
|
Eigen::SparseMatrix<double> B_inv = B_inv_dense.sparseView();
|
|
|
|
|
+ // Eigen::SparseQR<Eigen::SparseMatrix<double>, Eigen::COLAMDOrdering<int>> qr_B;
|
|
|
// U_sparse.makeCompressed();
|
|
// U_sparse.makeCompressed();
|
|
|
// Eigen::SparseMatrix<double> V_sparse_transpose(U_sparse), V_tilde_transpose(U_tilde);
|
|
// Eigen::SparseMatrix<double> V_sparse_transpose(U_sparse), V_tilde_transpose(U_tilde);
|
|
|
// qr_B.compute(V_sparse_transpose);
|
|
// qr_B.compute(V_sparse_transpose);
|
|
|
// Eigen::SparseMatrix<double> B_inv = qr_B.solve(V_tilde_transpose);
|
|
// Eigen::SparseMatrix<double> B_inv = qr_B.solve(V_tilde_transpose);
|
|
|
cout << "B_inv: " << B_inv.rows() << " x " << B_inv.cols() << " Sum: " << B_inv.sum() << endl;
|
|
cout << "B_inv: " << B_inv.rows() << " x " << B_inv.cols() << " Sum: " << B_inv.sum() << endl;
|
|
|
|
|
|
|
|
|
|
+ // U_precomputed: #V by 10
|
|
|
|
|
+ // U_precomputed.row(i) = u_i \dot u_i^T \in R^{4 x 4}
|
|
|
|
|
+ Eigen::MatrixXd U_precomputed(n, 16);
|
|
|
|
|
+ for (int k = 0; k < n; k++)
|
|
|
|
|
+ {
|
|
|
|
|
+ Eigen::Vector4d u = U.col(k);
|
|
|
|
|
+ Eigen::MatrixXd u_full = U.col(k) * U.col(k).transpose();
|
|
|
|
|
+ Eigen::VectorXd u_full_vector(Eigen::Map<Eigen::VectorXd>(u_full.data(), u_full.cols() * u_full.rows()));
|
|
|
|
|
+ U_precomputed.row(k) = u_full_vector;
|
|
|
|
|
+ }
|
|
|
|
|
+ cout << "U_precomputed: " << U_precomputed.rows() << " x " << U_precomputed.cols() << " Sum: " << U_precomputed.sum()
|
|
|
|
|
+ << endl;
|
|
|
|
|
+
|
|
|
// Psi: #V * #C by 16 (10) of \Psi_{ij}s.
|
|
// Psi: #V * #C by 16 (10) of \Psi_{ij}s.
|
|
|
// To access \Psi_{ij}, look at row (i * m + j)
|
|
// To access \Psi_{ij}, look at row (i * m + j)
|
|
|
- Eigen::MatrixXd Psi(n * m, 16); // TODO: this could be 10 to reduce storage
|
|
|
|
|
-
|
|
|
|
|
- // TODO: FIXME: VECTORIZE THIS
|
|
|
|
|
|
|
+ // this takes even longer since it is not vectorized
|
|
|
|
|
+ Eigen::MatrixXd Psi(n * m, 16);
|
|
|
for (int i = 0; i < n; i++)
|
|
for (int i = 0; i < n; i++)
|
|
|
{
|
|
{
|
|
|
- cout << "i = " << i << " / n = " << n << endl;
|
|
|
|
|
for (int j = 0; j < m; j++)
|
|
for (int j = 0; j < m; j++)
|
|
|
{
|
|
{
|
|
|
- Eigen::MatrixXd Psi_curr = Eigen::MatrixXd::Zero(4, 4);
|
|
|
|
|
|
|
+ Eigen::VectorXd Psi_curr = Eigen::VectorXd::Zero(16);
|
|
|
for (int k = 0; k < n; k++)
|
|
for (int k = 0; k < n; k++)
|
|
|
{
|
|
{
|
|
|
- Psi_curr += B_inv.coeff(k, i) * W.coeff(k, j) * U.col(k) * U.col(k).transpose();
|
|
|
|
|
|
|
+ // FAILED at k = 0, j = 4 since
|
|
|
|
|
+ // - in the paper, W.shape = #V by #C (num bones)
|
|
|
|
|
+ // - in our codebase, W.shape = #V by #E (num joints)
|
|
|
|
|
+ Psi_curr += B_inv.coeff(k, i) * W.coeff(k, j) * U_precomputed.row(k);
|
|
|
|
|
+// Psi_curr += B_inv.coeff(k, i) * U_precomputed.row(k);
|
|
|
}
|
|
}
|
|
|
- Eigen::VectorXd Psi_vector(Eigen::Map<Eigen::VectorXd>(Psi_curr.data(), Psi.cols()*Psi.rows()));
|
|
|
|
|
- Psi.row(i * m + j) = Psi_vector;
|
|
|
|
|
|
|
+ Psi.row(i * m + j) = Psi_curr;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
cout << "Psi: " << Psi.rows() << " x " << Psi.cols() << " Sum: " << Psi.sum() << endl;
|
|
cout << "Psi: " << Psi.rows() << " x " << Psi.cols() << " Sum: " << Psi.sum() << endl;
|
|
|
|
|
|
|
|
- // vector ps
|
|
|
|
|
|
|
+ // vector p_i:
|
|
|
|
|
+ // the sum of 3th, 7th and 11th of the stored 16-float vector representing Psis
|
|
|
|
|
+ // from j = 1 to m.
|
|
|
Eigen::MatrixXd P_vectors(n, 3);
|
|
Eigen::MatrixXd P_vectors(n, 3);
|
|
|
for (int i = 0; i < n; i++)
|
|
for (int i = 0; i < n; i++)
|
|
|
{
|
|
{
|
|
|
Eigen::Vector3d p_i = Eigen::Vector3d::Zero(3);
|
|
Eigen::Vector3d p_i = Eigen::Vector3d::Zero(3);
|
|
|
- // Eigen::seq not usable???
|
|
|
|
|
for (int j = 0; j < m; j++)
|
|
for (int j = 0; j < m; j++)
|
|
|
{
|
|
{
|
|
|
Eigen::Vector3d p_i_curr(3);
|
|
Eigen::Vector3d p_i_curr(3);
|
|
@@ -198,26 +217,29 @@ IGL_INLINE void igl::direct_delta_mush_precomputation(
|
|
|
}
|
|
}
|
|
|
P_vectors.row(i) = p_i;
|
|
P_vectors.row(i) = p_i;
|
|
|
}
|
|
}
|
|
|
|
|
+ cout << "P_vectors: " << P_vectors.rows() << " x " << P_vectors.cols() << " Sum: " << P_vectors.sum() << endl;
|
|
|
|
|
|
|
|
// Omega
|
|
// Omega
|
|
|
- Omega.resize(n, 16);
|
|
|
|
|
|
|
+ Omega.resize(n * m, 16);
|
|
|
for (int i = 0; i < n; i++)
|
|
for (int i = 0; i < n; i++)
|
|
|
{
|
|
{
|
|
|
- Eigen::Matrix3d p_matrix(4, 4);
|
|
|
|
|
- Eigen::Vector3d curr_p = P_vectors.row(i);
|
|
|
|
|
|
|
+ Eigen::MatrixXd p_matrix(4, 4);
|
|
|
|
|
+ Eigen::VectorXd curr_p = P_vectors.row(i);
|
|
|
p_matrix.block(0, 0, 3, 3) = curr_p * curr_p.transpose();
|
|
p_matrix.block(0, 0, 3, 3) = curr_p * curr_p.transpose();
|
|
|
- p_matrix.block(3, 0, 3, 1) = curr_p.transpose();
|
|
|
|
|
- p_matrix.block(0, 3, 3, 3) = curr_p;
|
|
|
|
|
|
|
+ p_matrix.block(3, 0, 1, 3) = curr_p.transpose();
|
|
|
|
|
+ p_matrix.block(0, 3, 3, 1) = curr_p;
|
|
|
p_matrix(3, 3) = 1;
|
|
p_matrix(3, 3) = 1;
|
|
|
for (int j = 0; j < m; j++)
|
|
for (int j = 0; j < m; j++)
|
|
|
{
|
|
{
|
|
|
Eigen::MatrixXd Omega_curr(4, 4);
|
|
Eigen::MatrixXd Omega_curr(4, 4);
|
|
|
- Omega_curr = (1 - alpha) * Psi.block(i * m + j, 0, 1, 16).eval() + alpha * W_prime.coeff(i, j) * p_matrix;
|
|
|
|
|
- Eigen::VectorXd Omega_vector(Eigen::Map<Eigen::VectorXd>(Omega_curr.data(), Omega.cols()*Omega.rows()));
|
|
|
|
|
|
|
+ Eigen::MatrixXd Psi_curr = Psi.block(i * m + j, 0, 1, 16);
|
|
|
|
|
+ Psi_curr.resize(4, 4);
|
|
|
|
|
+ Omega_curr = (1 - alpha) * Psi_curr + alpha * W_prime.coeff(i, j) * p_matrix;
|
|
|
|
|
+ Eigen::VectorXd Omega_vector(Eigen::Map<Eigen::VectorXd>(Omega_curr.data(), Omega_curr.cols() * Omega_curr.rows()));
|
|
|
Omega.row(i * m + j) = Omega_vector;
|
|
Omega.row(i * m + j) = Omega_vector;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+ cout << "Omega: " << Omega.rows() << " x " << Omega.cols() << " Sum: " << Omega.sum() << endl;
|
|
|
|
|
|
|
|
cout << "END DDM Precomputation" << endl;
|
|
cout << "END DDM Precomputation" << endl;
|
|
|
}
|
|
}
|
|
@@ -228,17 +250,42 @@ template <
|
|
|
typename DerivedOmega,
|
|
typename DerivedOmega,
|
|
|
typename DerivedU>
|
|
typename DerivedU>
|
|
|
IGL_INLINE void igl::direct_delta_mush_pose_evaluation(
|
|
IGL_INLINE void igl::direct_delta_mush_pose_evaluation(
|
|
|
- const std::vector<DerivedT, DerivedTAlloc> &T,
|
|
|
|
|
- const Eigen::MatrixBase<DerivedOmega> &Omega,
|
|
|
|
|
- Eigen::PlainObjectBase<DerivedU> &U)
|
|
|
|
|
|
|
+ const std::vector<DerivedT, DerivedTAlloc> & T,
|
|
|
|
|
+ const Eigen::MatrixBase<DerivedOmega> & Omega,
|
|
|
|
|
+ Eigen::PlainObjectBase<DerivedU> & U)
|
|
|
{
|
|
{
|
|
|
|
|
+ using namespace std;
|
|
|
|
|
+ using namespace Eigen;
|
|
|
cout << "START DDM Pose Eval" << endl;
|
|
cout << "START DDM Pose Eval" << endl;
|
|
|
cout << "END DDM Pose Eval" << endl;
|
|
cout << "END DDM Pose Eval" << endl;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#ifdef IGL_STATIC_LIBRARY
|
|
#ifdef IGL_STATIC_LIBRARY
|
|
|
|
|
+
|
|
|
// Explicit template instantiation
|
|
// Explicit template instantiation
|
|
|
-template void igl::direct_delta_mush<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double, Eigen::Transform<double, 3, 2, 0>, Eigen::aligned_allocator<Eigen::Transform<double, 3, 2, 0> >, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<double, 0, int> const&, std::__1::vector<Eigen::Transform<double, 3, 2, 0>, Eigen::aligned_allocator<Eigen::Transform<double, 3, 2, 0> > > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
|
|
|
|
|
-template void igl::direct_delta_mush_precomputation<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, Eigen::SparseMatrix<double, 0, int> const&, int, Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar, Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar, Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
|
|
|
|
|
-template void igl::direct_delta_mush_pose_evaluation<Eigen::Transform<double, 3, 2, 0>, Eigen::aligned_allocator<Eigen::Transform<double, 3, 2, 0> >, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(std::__1::vector<Eigen::Transform<double, 3, 2, 0>, Eigen::aligned_allocator<Eigen::Transform<double, 3, 2, 0> > > const&, Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
|
|
|
|
|
|
|
+template void
|
|
|
|
|
+igl::direct_delta_mush<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double, Eigen::Transform<double, 3, 2, 0>, Eigen::aligned_allocator<Eigen::Transform<double, 3, 2, 0> >, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(
|
|
|
|
|
+ Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const &,
|
|
|
|
|
+ Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const &,
|
|
|
|
|
+ Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const &,
|
|
|
|
|
+ Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const &, Eigen::SparseMatrix<double, 0, int> const &,
|
|
|
|
|
+ std::__1::vector<Eigen::Transform<double, 3, 2, 0>, Eigen::aligned_allocator<Eigen::Transform<double, 3, 2, 0> > > const &,
|
|
|
|
|
+ Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > &);
|
|
|
|
|
+
|
|
|
|
|
+template void
|
|
|
|
|
+igl::direct_delta_mush_precomputation<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1>, double, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(
|
|
|
|
|
+ Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const &,
|
|
|
|
|
+ Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const &,
|
|
|
|
|
+ Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const &,
|
|
|
|
|
+ Eigen::MatrixBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const &, Eigen::SparseMatrix<double, 0, int> const &, int,
|
|
|
|
|
+ Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar, Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar,
|
|
|
|
|
+ Eigen::Matrix<double, -1, -1, 0, -1, -1>::Scalar,
|
|
|
|
|
+ Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > &);
|
|
|
|
|
+
|
|
|
|
|
+template void
|
|
|
|
|
+igl::direct_delta_mush_pose_evaluation<Eigen::Transform<double, 3, 2, 0>, Eigen::aligned_allocator<Eigen::Transform<double, 3, 2, 0> >, Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(
|
|
|
|
|
+ std::__1::vector<Eigen::Transform<double, 3, 2, 0>, Eigen::aligned_allocator<Eigen::Transform<double, 3, 2, 0> > > const &,
|
|
|
|
|
+ Eigen::MatrixBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const &,
|
|
|
|
|
+ Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > &);
|
|
|
|
|
+
|
|
|
#endif
|
|
#endif
|