1#include "GeometryProcessing.h"
3#include "Platform/Instrumentation.h"
7void Cogs::Core::GeometryProcessing::uniqueVertexSubset(Context* ,
8 std::vector<uint32_t>& unique,
9 std::vector<uint32_t>& map,
11 const size_t P_stride,
13 const size_t N_stride,
15 const size_t T_stride,
19 CpuInstrumentationScope(SCOPE_GEOMETRY,
"uniqVtx");
26 std::vector<uint32_t> q(Vn);
27 for (uint32_t i = 0; i < Vn; i++) {
31 uint32_t kind = (N !=
nullptr ? 1 : 0) | (T !=
nullptr ? 2 : 0);
36 std::sort(q.begin(), q.end(), [&](
auto & a,
auto &b)->
bool
38 auto * Pa = (float*)((const char*)P + a * P_stride);
39 auto * Pb = (float*)((const char*)P + b * P_stride);
40 bool l0 = Pa[0] < Pb[0];
41 bool l1 = Pa[1] < Pb[1];
42 bool l2 = Pa[2] < Pb[2];
43 bool e0 = Pa[0] == Pb[0];
44 bool e1 = Pa[1] == Pb[1];
46 return l0 || (e0 && (l1 || (e1 && l2)));
51 std::sort(q.begin(), q.end(), [&](
auto & a,
auto &b)->
bool
53 auto * Pa = (float*)((const char*)P + a * P_stride);
54 auto * Pb = (float*)((const char*)P + b * P_stride);
55 auto * Na = (float*)((const char*)N + a * T_stride);
56 auto * Nb = (float*)((const char*)N + b * T_stride);
57 bool l0 = Pa[0] < Pb[0];
58 bool l1 = Pa[1] < Pb[1];
59 bool l2 = Pa[2] < Pb[2];
60 bool l3 = Na[0] < Nb[0];
61 bool l4 = Na[1] < Nb[1];
62 bool l5 = Na[2] < Nb[2];
63 bool e0 = Pa[0] == Pb[0];
64 bool e1 = Pa[1] == Pb[1];
65 bool e2 = Pa[2] == Pb[2];
66 bool e3 = Na[0] == Nb[0];
67 bool e4 = Na[1] == Nb[1];
69 return l0 || (e0 && (l1 || (e1 && (l2 || (e2 && (l3 || (e3 && (l4 || (e4 && l5)))))))));
74 std::sort(q.begin(), q.end(), [&](
auto & a,
auto &b)->
bool
76 auto * Pa = (float*)((const char*)P + a * P_stride);
77 auto * Pb = (float*)((const char*)P + b * P_stride);
78 auto * Ta = (float*)((const char*)T + a * T_stride);
79 auto * Tb = (float*)((const char*)T + b * T_stride);
80 bool l0 = Pa[0] < Pb[0];
81 bool l1 = Pa[1] < Pb[1];
82 bool l2 = Pa[2] < Pb[2];
83 bool l3 = Ta[0] < Tb[0];
84 bool l4 = Ta[1] < Tb[1];
85 bool e0 = Pa[0] == Pb[0];
86 bool e1 = Pa[1] == Pb[1];
87 bool e2 = Pa[2] == Pb[2];
88 bool e3 = Ta[0] == Tb[0];
90 return l0 || (e0 && (l1 || (e1 && (l2 || (e2 && (l3 || (e3 && l4)))))));
95 std::sort(q.begin(), q.end(), [&](
auto & a,
auto &b)->
bool
97 auto * Pa = (float*)((const char*)P + a * P_stride);
98 auto * Pb = (float*)((const char*)P + b * P_stride);
99 auto * Na = (float*)((const char*)N + a * T_stride);
100 auto * Nb = (float*)((const char*)N + b * T_stride);
101 auto * Ta = (float*)((const char*)T + a * T_stride);
102 auto * Tb = (float*)((const char*)T + b * T_stride);
103 bool l0 = Pa[0] < Pb[0];
104 bool l1 = Pa[1] < Pb[1];
105 bool l2 = Pa[2] < Pb[2];
106 bool l3 = Na[0] < Nb[0];
107 bool l4 = Na[1] < Nb[1];
108 bool l5 = Na[2] < Nb[2];
109 bool l6 = Ta[0] < Tb[0];
110 bool l7 = Ta[1] < Tb[1];
112 bool e0 = Pa[0] == Pb[0];
113 bool e1 = Pa[1] == Pb[1];
114 bool e2 = Pa[2] == Pb[2];
115 bool e3 = Na[0] == Nb[0];
116 bool e4 = Na[1] == Nb[1];
117 bool e5 = Na[2] == Nb[2];
118 bool e6 = Ta[0] == Tb[0];
120 return l0 || (e0 && (l1 || (e1 && (l2 || (e2 && (l3 || (e3 && (l4 || (e4 && (l5 || (e5 && (l6 || (e6 && l7)))))))))))));
130 const auto * P0 = (
float*)((
const char*)P + v * P_stride);
131 const auto * N0 = (
float*)((
const char*)N + v * N_stride);
132 const auto * T0 = (
float*)((
const char*)T + v * T_stride);
136 for (
unsigned i = 1; i < Vn; i++) {
138 const auto * Pi = (
float*)((
const char*)P + v * P_stride);
139 bool t0 = epsilon < std::abs(P0[0] - Pi[0]);
140 bool t1 = epsilon < std::abs(P0[1] - Pi[1]);
141 bool t2 = epsilon < std::abs(P0[2] - Pi[2]);
142 if (t0 || t1 || t2) {
152 for (
unsigned i = 1; i < Vn; i++) {
154 const auto * Pi = (
float*)((
const char*)P + v * P_stride);
155 const auto * Ni = (
float*)((
const char*)N + v * N_stride);
156 bool t0 = epsilon < std::abs(P0[0] - Pi[0]);
157 bool t1 = epsilon < std::abs(P0[1] - Pi[1]);
158 bool t2 = epsilon < std::abs(P0[2] - Pi[2]);
159 bool t3 = epsilon < std::abs(N0[0] - Ni[0]);
160 bool t4 = epsilon < std::abs(N0[1] - Ni[1]);
161 bool t5 = epsilon < std::abs(N0[1] - Ni[1]);
162 if (t0 || t1 || t2 || t3 || t4 || t5) {
173 for (
unsigned i = 1; i < Vn; i++) {
175 const auto * Pi = (
float*)((
const char*)P + v * P_stride);
176 const auto * Ti = (
float*)((
const char*)T + v * T_stride);
177 bool t0 = epsilon < std::abs(P0[0] - Pi[0]);
178 bool t1 = epsilon < std::abs(P0[1] - Pi[1]);
179 bool t2 = epsilon < std::abs(P0[2] - Pi[2]);
180 bool t3 = epsilon < std::abs(T0[0] - Ti[0]);
181 bool t4 = epsilon < std::abs(T0[1] - Ti[1]);
182 if (t0 || t1 || t2 || t3 || t4) {
193 for (
unsigned i = 1; i < Vn; i++) {
195 const auto * Pi = (
float*)((
const char*)P + v * P_stride);
196 const auto * Ni = (
float*)((
const char*)N + v * N_stride);
197 const auto * Ti = (
float*)((
const char*)T + v * T_stride);
198 bool t0 = epsilon < std::abs(P0[0] - Pi[0]);
199 bool t1 = epsilon < std::abs(P0[1] - Pi[1]);
200 bool t2 = epsilon < std::abs(P0[2] - Pi[2]);
201 bool t3 = epsilon < std::abs(N0[0] - Ni[0]);
202 bool t4 = epsilon < std::abs(N0[1] - Ni[1]);
203 bool t5 = epsilon < std::abs(N0[2] - Ni[2]);
204 bool t6 = epsilon < std::abs(T0[0] - Ti[0]);
205 bool t7 = epsilon < std::abs(T0[1] - Ti[1]);
207 if (t0 || t1 || t2 || t3 || t4 || t5 || t6 || t7) {