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/merge-vertex.cpp')
-rw-r--r--extern/quadriflow/src/merge-vertex.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/extern/quadriflow/src/merge-vertex.cpp b/extern/quadriflow/src/merge-vertex.cpp
new file mode 100644
index 00000000000..4c7b0a2bb9b
--- /dev/null
+++ b/extern/quadriflow/src/merge-vertex.cpp
@@ -0,0 +1,44 @@
+#include "merge-vertex.hpp"
+
+#include "compare-key.hpp"
+
+#include <map>
+#include <vector>
+
+namespace qflow {
+
+void merge_close(MatrixXd& V, MatrixXi& F, double threshold)
+{
+ std::map<Key3f, int> vid_maps;
+ std::vector<int> vid_compress(V.cols());
+ for (int i = 0; i < V.cols(); ++i) {
+ Key3f key(V(0, i), V(1, i), V(2, i), threshold);
+ if (vid_maps.count(key)) {
+ vid_compress[i] = vid_maps[key];
+ }
+ else {
+ V.col(vid_maps.size()) = V.col(i);
+ vid_compress[i] = vid_maps.size();
+ vid_maps[key] = vid_compress[i];
+ }
+ }
+ printf("Compress Vertex from %d to %d...\n", (int)V.cols(), (int)vid_maps.size());
+ MatrixXd newV(3, vid_maps.size());
+ memcpy(newV.data(), V.data(), sizeof(double) * 3 * vid_maps.size());
+ V = std::move(newV);
+ int f_num = 0;
+ for (int i = 0; i < F.cols(); ++i) {
+ for (int j = 0; j < 3; ++j) {
+ F(j, f_num) = vid_compress[F(j, i)];
+ }
+ if (F(0, f_num) != F(1, f_num) && F(0, f_num) != F(2, f_num) && F(1, f_num) != F(2, f_num)) {
+ f_num++;
+ }
+ }
+ printf("Compress Face from %d to %d...\n", (int)F.cols(), f_num);
+ MatrixXi newF(3, f_num);
+ memcpy(newF.data(), F.data(), sizeof(int) * 3 * f_num);
+ F = std::move(newF);
+}
+
+} // namespace qflow