1 /* 2 hierarchy.h: Code to generate unstructured multi-resolution hierarchies 3 from meshes or point clouds 4 5 This file is part of the implementation of 6 7 Instant Field-Aligned Meshes 8 Wenzel Jakob, Daniele Panozzo, Marco Tarini, and Olga Sorkine-Hornung 9 In ACM Transactions on Graphics (Proc. SIGGRAPH Asia 2015) 10 11 All rights reserved. Use of this source code is governed by a 12 BSD-style license that can be found in the LICENSE.txt file. 13 */ 14 15 #pragma once 16 17 #include "adjacency.h" 18 19 class Serializer; 20 21 extern AdjacencyMatrix 22 downsample_graph(const AdjacencyMatrix adj, const MatrixXf &V, 23 const MatrixXf &N, const VectorXf &areas, MatrixXf &V_p, 24 MatrixXf &V_n, VectorXf &areas_p, MatrixXu &to_upper, 25 VectorXu &to_lower, bool deterministic = false, 26 const ProgressCallback &progress = ProgressCallback()); 27 28 struct MultiResolutionHierarchy { 29 enum { MAX_DEPTH = 25 }; 30 public: 31 MultiResolutionHierarchy(); 32 void free(); 33 void save(Serializer &state); 34 void load(const Serializer &state); 35 levelsMultiResolutionHierarchy36 int levels() const { return (int) mV.size(); } 37 38 void build(bool deterministic = false, 39 const ProgressCallback &progress = ProgressCallback()); 40 41 void printStatistics() const; 42 void resetSolution(); 43 mutexMultiResolutionHierarchy44 inline ordered_lock &mutex() { return mMutex; } 45 phasesMultiResolutionHierarchy46 inline const std::vector<std::vector<uint32_t>> &phases(int level) const { return mPhases[level]; } 47 inline const AdjacencyMatrix &adj(int level = 0) const { return mAdj[level]; } 48 inline AdjacencyMatrix &adj(int level = 0) { return mAdj[level]; } 49 inline const MatrixXf &V(int level = 0) const { return mV[level]; } 50 inline const MatrixXf &N(int level = 0) const { return mN[level]; } 51 inline const VectorXf &A(int level = 0) const { return mA[level]; } toUpperMultiResolutionHierarchy52 inline const MatrixXu &toUpper(int level) const { return mToUpper[level]; } toLowerMultiResolutionHierarchy53 inline const VectorXu &toLower(int level) const { return mToLower[level]; } 54 inline const MatrixXf &Q(int level = 0) const { return mQ[level]; } 55 inline const MatrixXf &O(int level = 0) const { return mO[level]; } 56 inline const MatrixXf &CQ(int level = 0) const { return mCQ[level]; } 57 inline const MatrixXf &CO(int level = 0) const { return mCO[level]; } 58 inline const VectorXf &CQw(int level = 0) const { return mCQw[level]; } 59 inline const VectorXf &COw(int level = 0) const { return mCOw[level]; } FMultiResolutionHierarchy60 inline const MatrixXu &F() const { return mF; } E2EMultiResolutionHierarchy61 inline const VectorXu &E2E() const { return mE2E; } 62 inline MatrixXf &Q(int level = 0) { return mQ[level]; } 63 inline MatrixXf &O(int level = 0) { return mO[level]; } 64 inline MatrixXf &CQ(int level = 0) { return mCQ[level]; } 65 inline MatrixXf &CO(int level = 0) { return mCO[level]; } 66 inline VectorXf &CQw(int level = 0) { return mCQw[level]; } 67 inline VectorXf &COw(int level = 0) { return mCOw[level]; } 68 setFMultiResolutionHierarchy69 inline void setF(MatrixXu &&F) { mF = std::move(F); } setE2EMultiResolutionHierarchy70 inline void setE2E(VectorXu &&E2E) { mE2E = std::move(E2E); } setVMultiResolutionHierarchy71 inline void setV(MatrixXf &&V) { mV.clear(); mV.push_back(std::move(V)); } setNMultiResolutionHierarchy72 inline void setN(MatrixXf &&N) { mN.clear(); mN.push_back(std::move(N)); } setAMultiResolutionHierarchy73 inline void setA(MatrixXf &&A) { mA.clear(); mA.push_back(std::move(A)); } setAdjMultiResolutionHierarchy74 inline void setAdj(AdjacencyMatrix &&adj) { mAdj.clear(); mAdj.push_back(std::move(adj)); } 75 76 inline uint32_t size(int level = 0) const { return mV[level].cols(); } 77 scaleMultiResolutionHierarchy78 inline Float scale() const { return mScale; } setScaleMultiResolutionHierarchy79 inline void setScale(Float scale) { mScale = scale; } iterationsQMultiResolutionHierarchy80 inline int iterationsQ() const { return mIterationsQ; } setIterationsQMultiResolutionHierarchy81 inline void setIterationsQ(int iterationsQ) { mIterationsQ = iterationsQ; } iterationsOMultiResolutionHierarchy82 inline int iterationsO() const { return mIterationsO; } setIterationsOMultiResolutionHierarchy83 inline void setIterationsO(int iterationsO) { mIterationsO = iterationsO; } totalSizeMultiResolutionHierarchy84 inline size_t totalSize() const { return mTotalSize; } 85 86 void clearConstraints(); 87 void propagateConstraints(int rosy, int posy); 88 void propagateSolution(int rosy); 89 faceCenterMultiResolutionHierarchy90 inline Vector3f faceCenter(uint32_t idx) const { 91 Vector3f pos = Vector3f::Zero(); 92 for (int i = 0; i < 3; ++i) 93 pos += mV[0].col(mF(i, idx)); 94 return pos * (1.0f / 3.0f); 95 } 96 faceNormalMultiResolutionHierarchy97 inline Vector3f faceNormal(uint32_t idx) const { 98 Vector3f p0 = mV[0].col(mF(0, idx)), 99 p1 = mV[0].col(mF(1, idx)), 100 p2 = mV[0].col(mF(2, idx)); 101 return (p1-p0).cross(p2-p0).normalized(); 102 } 103 104 /* Flags which indicate whether the integer variables are froen */ frozenQMultiResolutionHierarchy105 bool frozenQ() const { return mFrozenQ; } frozenOMultiResolutionHierarchy106 bool frozenO() const { return mFrozenO; } setFrozenQMultiResolutionHierarchy107 void setFrozenQ(bool frozen) { mFrozenQ = frozen; } setFrozenOMultiResolutionHierarchy108 void setFrozenO(bool frozen) { mFrozenO = frozen; } 109 public: 110 MatrixXu mF; 111 VectorXu mE2E; 112 std::vector<std::vector<std::vector<uint32_t>>> mPhases; 113 std::vector<AdjacencyMatrix> mAdj; 114 std::vector<MatrixXf> mV; 115 std::vector<MatrixXf> mN; 116 std::vector<VectorXf> mA; 117 std::vector<VectorXu> mToLower; 118 std::vector<MatrixXu> mToUpper; 119 std::vector<MatrixXf> mO; 120 std::vector<MatrixXf> mQ; 121 std::vector<MatrixXf> mCQ; 122 std::vector<MatrixXf> mCO; 123 std::vector<VectorXf> mCQw; 124 std::vector<VectorXf> mCOw; 125 bool mFrozenQ, mFrozenO; 126 ordered_lock mMutex; 127 Float mScale; 128 int mIterationsQ; 129 int mIterationsO; 130 uint32_t mTotalSize; 131 }; 132