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

merge-vertex.cpp « src « quadriflow « extern - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 4c7b0a2bb9b55fe235fa135f298849225e0b8a05 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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