Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'extern/quadriflow/src/hierarchy.hpp')
-rw-r--r--extern/quadriflow/src/hierarchy.hpp99
1 files changed, 99 insertions, 0 deletions
diff --git a/extern/quadriflow/src/hierarchy.hpp b/extern/quadriflow/src/hierarchy.hpp
new file mode 100644
index 00000000000..8403038de4f
--- /dev/null
+++ b/extern/quadriflow/src/hierarchy.hpp
@@ -0,0 +1,99 @@
+#ifndef HIERARCHY_H_
+#define HIERARCHY_H_
+
+#ifdef WITH_CUDA
+# include <glm/glm.hpp>
+#endif
+
+#include <map>
+#include <vector>
+#include "adjacent-matrix.hpp"
+#include "config.hpp"
+#include "serialize.hpp"
+#define RCPOVERFLOW 2.93873587705571876e-39f
+
+using namespace Eigen;
+
+namespace qflow {
+
+class Hierarchy {
+ public:
+ Hierarchy();
+ void Initialize(double scale, int with_scale = 0);
+ void DownsampleGraph(const AdjacentMatrix adj, const MatrixXd& V, const MatrixXd& N,
+ const VectorXd& A, MatrixXd& V_p, MatrixXd& N_p, VectorXd& A_p,
+ MatrixXi& to_upper, VectorXi& to_lower, AdjacentMatrix& adj_p);
+ void generate_graph_coloring_deterministic(const AdjacentMatrix& adj, int size,
+ std::vector<std::vector<int>>& phases);
+ void FixFlip();
+ int FixFlipSat(int depth, int threshold = 0);
+ void PushDownwardFlip(int depth);
+ void PropagateEdge();
+ void DownsampleEdgeGraph(std::vector<Vector3i>& FQ, std::vector<Vector3i>& F2E,
+ std::vector<Vector2i>& edge_diff,
+ std::vector<int>& allow_changes, int level);
+ void UpdateGraphValue(std::vector<Vector3i>& FQ, std::vector<Vector3i>& F2E,
+ std::vector<Vector2i>& edge_diff);
+
+ enum { MAX_DEPTH = 25 };
+
+ void SaveToFile(FILE* fp);
+ void LoadFromFile(FILE* fp);
+
+ void clearConstraints();
+ void propagateConstraints();
+
+ double mScale;
+ int rng_seed;
+
+ MatrixXi mF; // mF(i, j) i \in [0, 3) ith index in face j
+ VectorXi mE2E; // inverse edge
+ std::vector<AdjacentMatrix> mAdj;
+ std::vector<MatrixXd> mV;
+ std::vector<MatrixXd> mN;
+ std::vector<VectorXd> mA;
+ std::vector<std::vector<std::vector<int>>> mPhases;
+ // parameters
+ std::vector<MatrixXd> mQ;
+ std::vector<MatrixXd> mO;
+ std::vector<VectorXi> mToLower;
+ std::vector<MatrixXi> mToUpper; // mToUpper[h](i, j) \in V; i \in [0, 2); j \in V
+ std::vector<MatrixXd> mS;
+ std::vector<MatrixXd> mK;
+
+ // constraints
+ std::vector<MatrixXd> mCQ;
+ std::vector<MatrixXd> mCO;
+ std::vector<VectorXd> mCQw;
+ std::vector<VectorXd> mCOw;
+
+ int with_scale;
+
+ // upper: fine to coarse
+ std::vector<std::vector<int>> mToUpperFaces; // face correspondance
+ std::vector<std::vector<int>> mSing;
+ std::vector<std::vector<int>> mToUpperEdges; // edge correspondance
+ std::vector<std::vector<int>> mToUpperOrients; // rotation of edges from fine to coarse
+ std::vector<std::vector<Vector3i>> mFQ; // face_edgeOrients
+ std::vector<std::vector<Vector3i>> mF2E; // face_edgeIds
+ std::vector<std::vector<Vector2i>> mE2F; // undirect edges to face ID
+ std::vector<std::vector<int> > mAllowChanges;
+ std::vector<std::vector<Vector2i>> mEdgeDiff; // face_edgeDiff
+
+#ifdef WITH_CUDA
+ std::vector<Link*> cudaAdj;
+ std::vector<int*> cudaAdjOffset;
+ std::vector<glm::dvec3*> cudaN;
+ std::vector<glm::dvec3*> cudaV;
+ std::vector<glm::dvec3*> cudaQ;
+ std::vector<glm::dvec3*> cudaO;
+ std::vector<std::vector<int*>> cudaPhases;
+ std::vector<glm::ivec2*> cudaToUpper;
+ void CopyToDevice();
+ void CopyToHost();
+#endif
+};
+
+} // namespace qflow
+
+#endif