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