70 std::vector<uint> resulting_UUIDs;
72 if (voxel_face_vertices.size() < 3) {
73 helios_runtime_error(
"ERROR (VoxelIntersection::slicePrimitive): voxel_face_vertices must contain at least three points.");
76 helios::vec3 face_normal =
cross(voxel_face_vertices.at(1) - voxel_face_vertices.at(0), voxel_face_vertices.at(2) - voxel_face_vertices.at(1));
89 bool primitiveHasTexture = !texa.empty();
118 helios::vec3 d1a =
helios::make_vec3(-1 * face_normal.
x * voxel_face_vertices.at(0).x, -1 * face_normal.
y * voxel_face_vertices.at(0).y, -1 * face_normal.
z * voxel_face_vertices.at(0).z);
119 helios::vec3 d2a =
helios::make_vec3(-1 * primitive_normal.
x * primitive_vertices.at(1).x, -1 * primitive_normal.
y * primitive_vertices.at(1).y, -1 * primitive_normal.
z * primitive_vertices.at(1).z);
121 float d1 = d1a.
x + d1a.
y + d1a.
z;
122 float d2 = d2a.
x + d2a.
y + d2a.
z;
130 yi = (d2 * face_normal.
z - d1 * primitive_normal.
z) / direction_vector.
x;
131 zi = (d1 * primitive_normal.
y - d2 * face_normal.
y) / direction_vector.
x;
132 }
else if (maxc == 2) {
133 xi = (d1 * primitive_normal.
z - d2 * face_normal.
z) / direction_vector.
y;
135 zi = (d2 * face_normal.
x - d1 * primitive_normal.
x) / direction_vector.
y;
136 }
else if (maxc == 3) {
137 xi = (d2 * face_normal.
y - d1 * primitive_normal.
y) / direction_vector.
z;
138 yi = (d1 * primitive_normal.
x - d2 * face_normal.
x) / direction_vector.
z;
148 std::vector<helios::vec3> possible_points;
150 std::vector<helios::vec3> slice_points;
151 std::vector<uint> slice_points_edge_ID;
158 if (primitive_vertices.size() == 4) {
159 possible_points.resize(4);
160 possible_points.at(0) =
linesIntersection(primitive_vertices.at(1), primitive_vertices.at(1) - primitive_vertices.at(0), ipoint, direction_vector);
161 possible_points.at(1) =
linesIntersection(primitive_vertices.at(2), primitive_vertices.at(2) - primitive_vertices.at(1), ipoint, direction_vector);
162 possible_points.at(2) =
linesIntersection(primitive_vertices.at(3), primitive_vertices.at(3) - primitive_vertices.at(2), ipoint, direction_vector);
163 possible_points.at(3) =
linesIntersection(primitive_vertices.at(0), primitive_vertices.at(0) - primitive_vertices.at(3), ipoint, direction_vector);
165 for (
uint i = 0; i < 4; i++) {
167 vi1 = primitive_vertices.at(1);
168 vi0 = primitive_vertices.at(0);
170 vi1 = primitive_vertices.at(2);
171 vi0 = primitive_vertices.at(1);
173 vi1 = primitive_vertices.at(3);
174 vi0 = primitive_vertices.at(2);
176 vi1 = primitive_vertices.at(0);
177 vi0 = primitive_vertices.at(3);
180 bool test_x = ((possible_points.at(i).x >= vi1.
x && possible_points.at(i).x <= vi0.
x) || (possible_points.at(i).x >= vi0.
x && possible_points.at(i).x <= vi1.
x));
181 bool test_y = ((possible_points.at(i).y >= vi1.
y && possible_points.at(i).y <= vi0.
y) || (possible_points.at(i).y >= vi0.
y && possible_points.at(i).y <= vi1.
y));
182 bool test_z = ((possible_points.at(i).z >= vi1.
z && possible_points.at(i).z <= vi0.
z) || (possible_points.at(i).z >= vi0.
z && possible_points.at(i).z <= vi1.
z));
184 if (test_x && test_y && test_z) {
185 slice_points.push_back(possible_points.at(i));
186 slice_points_edge_ID.push_back(i);
190 }
else if (primitive_vertices.size() == 3) {
192 possible_points.resize(3);
193 possible_points.at(0) =
linesIntersection(primitive_vertices.at(1), primitive_vertices.at(1) - primitive_vertices.at(0), ipoint, direction_vector);
194 possible_points.at(1) =
linesIntersection(primitive_vertices.at(2), primitive_vertices.at(2) - primitive_vertices.at(1), ipoint, direction_vector);
195 possible_points.at(2) =
linesIntersection(primitive_vertices.at(0), primitive_vertices.at(0) - primitive_vertices.at(2), ipoint, direction_vector);
197 for (
uint i = 0; i < 3; i++) {
199 vi1 = primitive_vertices.at(1);
200 vi0 = primitive_vertices.at(0);
202 vi1 = primitive_vertices.at(2);
203 vi0 = primitive_vertices.at(1);
206 vi1 = primitive_vertices.at(0);
207 vi0 = primitive_vertices.at(2);
210 bool test_x = ((possible_points.at(i).x >= vi1.
x && possible_points.at(i).x <= vi0.
x) || (possible_points.at(i).x >= vi0.
x && possible_points.at(i).x <= vi1.
x));
211 bool test_y = ((possible_points.at(i).y >= vi1.
y && possible_points.at(i).y <= vi0.
y) || (possible_points.at(i).y >= vi0.
y && possible_points.at(i).y <= vi1.
y));
212 bool test_z = ((possible_points.at(i).z >= vi1.
z && possible_points.at(i).z <= vi0.
z) || (possible_points.at(i).z >= vi0.
z && possible_points.at(i).z <= vi1.
z));
214 if (test_x && test_y && test_z) {
215 slice_points.push_back(possible_points.at(i));
216 slice_points_edge_ID.push_back(i);
223 uint initial_slice_points_size = slice_points.size();
226 float absTol = pow(10, -6);
227 float relTol = pow(10, -20);
231 if (initial_slice_points_size == 0) {
232 resulting_UUIDs.push_back(UUID);
233 return resulting_UUIDs;
235 }
else if (initial_slice_points_size == 1) {
237 resulting_UUIDs.push_back(UUID);
239 std::cout <<
"the primitive intersected with the face at a single point (a corner) - no slicing needed" << std::endl;
241 return resulting_UUIDs;
242 }
else if (initial_slice_points_size == 2) {
248 if (slice_points_edge_ID.at(0) == slice_points_edge_ID.at(1)) {
249 resulting_UUIDs.push_back(UUID);
251 std::cout <<
"the primitive intersected with the face along an edge - no need to slice" << std::endl;
253 return resulting_UUIDs;
256 if (primitive_vertices.size() == 4) {
257 if ((
approxSame(slice_points.at(0), primitive_vertices.at(0), absTol) &&
approxSame(slice_points.at(1), primitive_vertices.at(1), absTol)) ||
258 (
approxSame(slice_points.at(0), primitive_vertices.at(1), absTol) &&
approxSame(slice_points.at(1), primitive_vertices.at(0), absTol)) ||
259 (
approxSame(slice_points.at(0), primitive_vertices.at(1), absTol) &&
approxSame(slice_points.at(1), primitive_vertices.at(2), absTol)) ||
260 (
approxSame(slice_points.at(0), primitive_vertices.at(2), absTol) &&
approxSame(slice_points.at(1), primitive_vertices.at(1), absTol)) ||
261 (
approxSame(slice_points.at(0), primitive_vertices.at(2), absTol) &&
approxSame(slice_points.at(1), primitive_vertices.at(3), absTol)) ||
262 (
approxSame(slice_points.at(0), primitive_vertices.at(3), absTol) &&
approxSame(slice_points.at(1), primitive_vertices.at(2), absTol)) ||
263 (
approxSame(slice_points.at(0), primitive_vertices.at(3), absTol) &&
approxSame(slice_points.at(1), primitive_vertices.at(0), absTol)) ||
264 (
approxSame(slice_points.at(0), primitive_vertices.at(0), absTol) &&
approxSame(slice_points.at(1), primitive_vertices.at(3), absTol))) {
266 std::cout <<
"the primitive intersected with the face along an edge - no need to slice" << std::endl;
268 resulting_UUIDs.push_back(UUID);
269 return resulting_UUIDs;
272 }
else if (primitive_vertices.size() == 3) {
274 if ((
approxSame(slice_points.at(0), primitive_vertices.at(0), absTol) ||
approxSame(slice_points.at(0), primitive_vertices.at(1), absTol) ||
approxSame(slice_points.at(0), primitive_vertices.at(2), absTol)) &&
275 (
approxSame(slice_points.at(1), primitive_vertices.at(0), absTol) ||
approxSame(slice_points.at(1), primitive_vertices.at(1), absTol) ||
approxSame(slice_points.at(1), primitive_vertices.at(2), absTol))) {
276 resulting_UUIDs.push_back(UUID);
278 std::cout <<
"the primitive intersected with the face along an edge - no need to slice" << std::endl;
280 return resulting_UUIDs;
287 for (
uint j = 0; j < primitive_vertices.size(); j++) {
288 for (
uint i = 0; i < slice_points.size(); i++) {
290 float Dxyza = sqrtf(powf(primitive_vertices.at(j).x - slice_points.at(i).x, 2.0) + powf(primitive_vertices.at(j).y - slice_points.at(i).y, 2.0) + powf(primitive_vertices.at(j).z - slice_points.at(i).z, 2.0));
291 if (
approxSame(Dxyza,
float(0.0), absTol, relTol)) {
292 slice_points.at(i) = primitive_vertices.at(j);
298 }
else if (initial_slice_points_size == 3) {
305 vec3 non_vertex_slice_point;
306 uint non_vertex_slice_edge_ID;
307 vec3 vertex_slice_point;
309 for (
uint bb = 0; bb < slice_points.size(); bb++) {
310 bool this_point_vert_test =
false;
311 for (
uint cc = 0; cc < primitive_vertices.size(); cc++) {
312 bool vert_test =
approxSame(slice_points.at(bb), primitive_vertices.at(cc), absTol);
315 this_point_vert_test =
true;
316 vertex_slice_point = primitive_vertices.at(cc);
321 if (this_point_vert_test ==
false) {
322 non_vertex_slice_point = slice_points.at(bb);
323 non_vertex_slice_edge_ID = slice_points_edge_ID.at(bb);
326 slice_points.resize(2);
327 slice_points.at(0) = non_vertex_slice_point;
328 slice_points_edge_ID.at(0) = non_vertex_slice_edge_ID;
329 slice_points.at(1) = vertex_slice_point;
336 }
else if (initial_slice_points_size == 4) {
338 vec3 non_vertex_slice_point;
339 uint non_vertex_slice_edge_ID;
340 vec3 vertex_slice_point;
341 for (
uint bb = 0; bb < slice_points.size(); bb++) {
342 bool this_point_vert_test =
false;
343 for (
uint cc = 0; cc < primitive_vertices.size(); cc++) {
344 bool vert_test =
approxSame(slice_points.at(bb), primitive_vertices.at(cc), absTol);
347 this_point_vert_test =
true;
352 slice_points.resize(2);
354 helios_runtime_error(
"ERROR (VoxelIntersection::slicePrimitive): more than 5 slice points detected - invalid geometry.");
361 helios::vec3 face_coordinate =
make_vec3(fabs(face_normal.
x) * voxel_face_vertices.at(0).x, fabs(face_normal.
y) * voxel_face_vertices.at(0).y, fabs(face_normal.
z) * voxel_face_vertices.at(0).z);
363 float buffer_value = powf(
float(10),
float(-5));
365 if (fabs(face_normal.
x) > 0.5) {
366 if (primitive_vertices.at(0).x < face_coordinate.
x) {
367 buffer =
make_vec3(
float(-1) * buffer_value, 0, 0);
368 }
else if (primitive_vertices.at(0).x > face_coordinate.
x) {
372 std::cout <<
"vertex 0 exactly at face" << std::endl;
376 }
else if (fabs(face_normal.
y) > 0.5) {
377 if (primitive_vertices.at(0).y < face_coordinate.
y) {
378 buffer =
make_vec3(0,
float(-1) * buffer_value, 0);
379 }
else if (primitive_vertices.at(0).y > face_coordinate.
y) {
383 std::cout <<
"vertex 0 exactly at face" << std::endl;
387 }
else if (fabs(face_normal.
z) > 0.5) {
388 if (primitive_vertices.at(0).z < face_coordinate.
z) {
389 buffer =
make_vec3(0, 0,
float(-1) * buffer_value);
390 }
else if (primitive_vertices.at(0).z > face_coordinate.
z) {
394 std::cout <<
"vertex 0 exactly at face" << std::endl;
406 float minArea = pow(10, -13);
414 if (primitiveHasTexture ==
false) {
416 if (primitive_vertices.size() == 3) {
418 if (initial_slice_points_size == 2) {
419 if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 1)) {
421 t0 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, slice_points.at(1) - buffer, primitive_color);
422 t1 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(2) + buffer, primitive_color);
423 t2 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(2) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
424 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 0)) {
426 t0 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_color);
427 t1 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(2) + buffer, slice_points.at(1) + buffer, primitive_color);
428 t2 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(2) + buffer, primitive_color);
429 }
else if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 2)) {
431 t0 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
432 t1 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, primitive_color);
433 t2 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
434 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 0)) {
436 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, primitive_color);
437 t1 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
438 t2 = context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
439 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 2)) {
441 t0 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, primitive_color);
442 t1 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
443 t2 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
444 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 1)) {
446 t0 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
447 t1 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, primitive_color);
448 t2 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
455 resulting_UUIDs.push_back(t0);
460 resulting_UUIDs.push_back(t1);
465 resulting_UUIDs.push_back(t2);
469 }
else if (initial_slice_points_size == 3) {
472 if (slice_points_edge_ID.at(0) == 0) {
474 t0 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
475 t1 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, slice_points.at(1) - buffer, primitive_color);
476 }
else if (slice_points_edge_ID.at(0) == 1) {
478 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(2) + buffer, slice_points.at(1) + buffer, primitive_color);
479 t1 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_color);
480 }
else if (slice_points_edge_ID.at(0) == 2) {
482 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, primitive_color);
483 t1 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
490 resulting_UUIDs.push_back(t0);
495 resulting_UUIDs.push_back(t1);
499 }
else if (primitive_vertices.size() == 4) {
502 if (initial_slice_points_size == 2) {
504 if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 2)) {
506 t0 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
507 t1 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, primitive_color);
508 t2 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
509 t3 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
512 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 0)) {
514 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, primitive_color);
515 t1 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
516 t2 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
517 t3 = context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
519 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 3)) {
521 t0 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
522 t1 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(3) - buffer, slice_points.at(1) - buffer, primitive_color);
523 t2 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
524 t3 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
526 }
else if ((slice_points_edge_ID.at(0) == 3 && slice_points_edge_ID.at(1) == 1)) {
528 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(1) + buffer, slice_points.at(1) + buffer, primitive_color);
529 t1 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
530 t2 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
531 t3 = context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
534 }
else if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 3)) {
536 t0 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
537 t1 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, primitive_color);
538 t2 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
539 t3 = context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
540 }
else if ((slice_points_edge_ID.at(0) == 3 && slice_points_edge_ID.at(1) == 0)) {
542 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, primitive_color);
543 t1 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
544 t2 = context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
545 t3 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
547 }
else if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 1)) {
549 t0 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, slice_points.at(1) - buffer, primitive_color);
550 t1 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_color);
551 t2 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(2) + buffer, primitive_vertices.at(3) + buffer, primitive_color);
552 t3 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
553 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 0)) {
555 t0 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_color);
556 t1 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, slice_points.at(1) + buffer, primitive_color);
557 t2 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(2) + buffer, primitive_vertices.at(3) + buffer, primitive_color);
558 t3 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
559 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 2)) {
561 t0 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, primitive_color);
562 t1 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
563 t2 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
564 t3 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
565 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 1)) {
567 t0 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
568 t1 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, primitive_color);
569 t2 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
570 t3 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
571 }
else if ((slice_points_edge_ID.at(0) == 3 && slice_points_edge_ID.at(1) == 2)) {
573 t0 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
574 t1 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(1) + buffer, slice_points.at(1) + buffer, primitive_color);
575 t2 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
576 t3 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(1) + buffer, primitive_vertices.at(2) + buffer, primitive_color);
577 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 3)) {
579 t0 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(3) - buffer, slice_points.at(1) - buffer, primitive_color);
580 t1 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
581 t2 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
582 t3 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_vertices.at(2) + buffer, primitive_color);
589 resulting_UUIDs.push_back(t0);
594 resulting_UUIDs.push_back(t1);
599 resulting_UUIDs.push_back(t2);
604 resulting_UUIDs.push_back(t3);
607 }
else if (initial_slice_points_size == 3) {
610 if (slice_points_edge_ID.at(0) == 0 && vertex_index == 2) {
612 t0 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
613 t1 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, slice_points.at(1) - buffer, primitive_color);
614 t2 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
615 }
else if (slice_points_edge_ID.at(0) == 0 && vertex_index == 3) {
617 t0 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
618 t1 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, slice_points.at(1) - buffer, primitive_color);
619 t2 = context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
620 }
else if (slice_points_edge_ID.at(0) == 1 && vertex_index == 3) {
622 t0 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
623 t1 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
624 t2 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, primitive_color);
625 }
else if (slice_points_edge_ID.at(0) == 1 && vertex_index == 0) {
627 t0 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
628 t1 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, primitive_color);
629 t2 = context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
630 }
else if (slice_points_edge_ID.at(0) == 2 && vertex_index == 1) {
632 t0 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
633 t1 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, slice_points.at(1) + buffer, primitive_color);
634 t2 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
635 }
else if (slice_points_edge_ID.at(0) == 2 && vertex_index == 0) {
637 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, slice_points.at(1) + buffer, primitive_color);
638 t1 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
639 t2 = context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
640 }
else if (slice_points_edge_ID.at(0) == 3 && vertex_index == 2) {
642 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, primitive_color);
643 t1 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
644 t2 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
645 }
else if (slice_points_edge_ID.at(0) == 3 && vertex_index == 1) {
647 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, primitive_color);
648 t1 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
649 t2 = context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
656 resulting_UUIDs.push_back(t0);
661 resulting_UUIDs.push_back(t1);
666 resulting_UUIDs.push_back(t2);
669 }
else if (initial_slice_points_size == 4) {
671 if (vertex_index == 0 || vertex_index == 2) {
673 t0 = context->
addTriangle(primitive_vertices.at(0) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
674 t1 = context->
addTriangle(primitive_vertices.at(0) + buffer, primitive_vertices.at(2) + buffer, primitive_vertices.at(3) + buffer, primitive_color);
676 }
else if (vertex_index == 1 || vertex_index == 3) {
678 t0 = context->
addTriangle(primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
679 t1 = context->
addTriangle(primitive_vertices.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
686 resulting_UUIDs.push_back(t0);
691 resulting_UUIDs.push_back(t1);
696 }
else if (primitiveHasTexture) {
702 std::vector<helios::vec2> ip_uv;
705 if (primitive_vertices.size() == 3) {
708 if (initial_slice_points_size == 2) {
709 for (
uint i = 0; i < slice_points.size(); i++) {
717 if (slice_points_edge_ID.at(i) == 0) {
718 point_0 = primitive_vertices.at(0);
719 point_1 = primitive_vertices.at(1);
720 point_0uv = v_uv.at(0);
721 point_1uv = v_uv.at(1);
722 }
else if (slice_points_edge_ID.at(i) == 1) {
723 point_0 = primitive_vertices.at(1);
724 point_1 = primitive_vertices.at(2);
725 point_0uv = v_uv.at(1);
726 point_1uv = v_uv.at(2);
727 }
else if (slice_points_edge_ID.at(i) == 2) {
728 point_0 = primitive_vertices.at(2);
729 point_1 = primitive_vertices.at(0);
730 point_0uv = v_uv.at(2);
731 point_1uv = v_uv.at(0);
736 if (ip_uv.at(0).x < 0 || ip_uv.at(0).x > 1 || ip_uv.at(0).y < 0 || ip_uv.at(0).y > 1) {
737 helios_runtime_error(
"ERROR (VoxelIntersection::slicePrimitive): texture UV coordinates for UUID " + std::to_string(UUID) +
" are out of valid range [0,1].");
741 if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 1)) {
743 t0 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, slice_points.at(1) - buffer, tex, ip_uv.at(0), v_uv.at(1), ip_uv.at(1));
744 t1 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(2) + buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(2));
745 t2 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(2) + buffer, primitive_vertices.at(0) + buffer, tex, ip_uv.at(0), v_uv.at(2), v_uv.at(0));
746 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 0)) {
748 t0 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(1));
749 t1 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(2) + buffer, slice_points.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(2), ip_uv.at(1));
750 t2 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(2) + buffer, primitive_vertices.at(0) + buffer, tex, ip_uv.at(1), v_uv.at(2), v_uv.at(0));
751 }
else if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 2)) {
753 t0 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(0));
754 t1 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, tex, ip_uv.at(0), v_uv.at(2), ip_uv.at(1));
755 t2 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, tex, ip_uv.at(0), v_uv.at(1), v_uv.at(2));
756 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 0)) {
758 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(0), ip_uv.at(1));
759 t1 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(2));
760 t2 = context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, tex, ip_uv.at(1), v_uv.at(1), v_uv.at(2));
761 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 2)) {
763 t0 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, tex, ip_uv.at(0), v_uv.at(2), ip_uv.at(1));
764 t1 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(0));
765 t2 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(0), v_uv.at(1));
766 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 1)) {
768 t0 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(2));
769 t1 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(0), ip_uv.at(1));
770 t2 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, tex, ip_uv.at(1), v_uv.at(0), v_uv.at(1));
777 resulting_UUIDs.push_back(t0);
782 resulting_UUIDs.push_back(t1);
787 resulting_UUIDs.push_back(t2);
792 }
else if (initial_slice_points_size == 3) {
803 if (slice_points_edge_ID.at(0) == 0) {
804 point_0 = primitive_vertices.at(0);
805 point_1 = primitive_vertices.at(1);
806 point_0uv = v_uv.at(0);
807 point_1uv = v_uv.at(1);
808 ip_uv.at(1) = v_uv.at(2);
810 }
else if (slice_points_edge_ID.at(0) == 1) {
811 point_0 = primitive_vertices.at(1);
812 point_1 = primitive_vertices.at(2);
813 point_0uv = v_uv.at(1);
814 point_1uv = v_uv.at(2);
815 ip_uv.at(1) = v_uv.at(0);
816 }
else if (slice_points_edge_ID.at(0) == 2) {
817 point_0 = primitive_vertices.at(2);
818 point_1 = primitive_vertices.at(0);
819 point_0uv = v_uv.at(2);
820 point_1uv = v_uv.at(0);
821 ip_uv.at(1) = v_uv.at(1);
827 if (ip_uv.at(0).x < 0 || ip_uv.at(0).x > 1 || ip_uv.at(0).y < 0 || ip_uv.at(0).y > 1) {
828 helios_runtime_error(
"ERROR (VoxelIntersection::slicePrimitive): texture UV coordinates for UUID " + std::to_string(UUID) +
" are out of valid range [0,1].");
831 if (slice_points_edge_ID.at(0) == 0) {
833 t0 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(0));
834 t1 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, slice_points.at(1) - buffer, tex, ip_uv.at(0), v_uv.at(1), ip_uv.at(1));
835 }
else if (slice_points_edge_ID.at(0) == 1) {
837 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(2) + buffer, slice_points.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(2), ip_uv.at(1));
838 t1 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(1));
839 }
else if (slice_points_edge_ID.at(0) == 2) {
841 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(0), ip_uv.at(1));
842 t1 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(2));
849 resulting_UUIDs.push_back(t0);
854 resulting_UUIDs.push_back(t1);
859 }
else if (primitive_vertices.size() == 4) {
863 if (v_uv.size() == 0) {
869 if (initial_slice_points_size == 2) {
871 for (
uint i = 0; i < 2; i++) {
878 if (slice_points_edge_ID.at(i) == 0) {
879 point_0 = primitive_vertices.at(0);
880 point_1 = primitive_vertices.at(1);
881 point_0uv = v_uv.at(0);
882 point_1uv = v_uv.at(1);
883 }
else if (slice_points_edge_ID.at(i) == 1) {
884 point_0 = primitive_vertices.at(1);
885 point_1 = primitive_vertices.at(2);
886 point_0uv = v_uv.at(1);
887 point_1uv = v_uv.at(2);
888 }
else if (slice_points_edge_ID.at(i) == 2) {
889 point_0 = primitive_vertices.at(2);
890 point_1 = primitive_vertices.at(3);
891 point_0uv = v_uv.at(2);
892 point_1uv = v_uv.at(3);
893 }
else if (slice_points_edge_ID.at(i) == 3) {
894 point_0 = primitive_vertices.at(3);
895 point_1 = primitive_vertices.at(0);
896 point_0uv = v_uv.at(3);
897 point_1uv = v_uv.at(0);
902 if (ip_uv.at(i).x < 0 || ip_uv.at(i).x > 1 || ip_uv.at(i).y < 0 || ip_uv.at(i).y > 1) {
903 helios_runtime_error(
"ERROR (VoxelIntersection::slicePrimitive): texture UV coordinates for UUID " + std::to_string(UUID) +
" are out of valid range [0,1].");
908 if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 2)) {
910 t0 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(0));
911 t1 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, tex, ip_uv.at(0), v_uv.at(2), ip_uv.at(1));
912 t2 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, tex, ip_uv.at(1), v_uv.at(3), v_uv.at(0));
913 t3 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, tex, ip_uv.at(0), v_uv.at(1), v_uv.at(2));
914 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 0)) {
916 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(0), ip_uv.at(1));
917 t1 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(2));
918 t2 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, tex, ip_uv.at(0), v_uv.at(3), v_uv.at(0));
919 t3 = context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, tex, ip_uv.at(1), v_uv.at(1), v_uv.at(2));
920 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 3)) {
922 t0 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(1) + buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(1));
923 t1 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(3) - buffer, slice_points.at(1) - buffer, tex, ip_uv.at(0), v_uv.at(3), ip_uv.at(1));
924 t2 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, tex, ip_uv.at(1), v_uv.at(0), v_uv.at(1));
925 t3 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, tex, ip_uv.at(0), v_uv.at(2), v_uv.at(3));
926 }
else if ((slice_points_edge_ID.at(0) == 3 && slice_points_edge_ID.at(1) == 1)) {
928 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(1) + buffer, slice_points.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(1), ip_uv.at(1));
929 t1 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(3) - buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(3));
930 t2 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(0), v_uv.at(1));
931 t3 = context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, tex, ip_uv.at(1), v_uv.at(2), v_uv.at(3));
933 }
else if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 3)) {
935 t0 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(0));
936 t1 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, tex, ip_uv.at(0), v_uv.at(2), ip_uv.at(1));
937 t2 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, tex, ip_uv.at(0), v_uv.at(1), v_uv.at(2));
938 t3 = context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, tex, ip_uv.at(1), v_uv.at(2), v_uv.at(3));
939 }
else if ((slice_points_edge_ID.at(0) == 3 && slice_points_edge_ID.at(1) == 0)) {
941 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(0), ip_uv.at(1));
942 t1 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(2));
943 t2 = context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, tex, ip_uv.at(1), v_uv.at(1), v_uv.at(2));
944 t3 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, tex, ip_uv.at(0), v_uv.at(2), v_uv.at(3));
945 }
else if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 1)) {
947 t0 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, slice_points.at(1) - buffer, tex, ip_uv.at(0), v_uv.at(1), ip_uv.at(1));
948 t1 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(3) + buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(3));
949 t2 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(2) + buffer, primitive_vertices.at(3) + buffer, tex, ip_uv.at(1), v_uv.at(2), v_uv.at(3));
950 t3 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, tex, ip_uv.at(0), v_uv.at(3), v_uv.at(0));
951 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 0)) {
953 t0 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(1));
954 t1 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, slice_points.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(3), ip_uv.at(1));
955 t2 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(2) + buffer, primitive_vertices.at(3) + buffer, tex, ip_uv.at(0), v_uv.at(2), v_uv.at(3));
956 t3 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, tex, ip_uv.at(1), v_uv.at(3), v_uv.at(0));
957 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 2)) {
959 t0 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, tex, ip_uv.at(0), v_uv.at(2), ip_uv.at(1));
960 t1 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(0));
961 t2 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, tex, ip_uv.at(1), v_uv.at(03), v_uv.at(0));
962 t3 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(0), v_uv.at(1));
963 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 1)) {
965 t0 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(2));
966 t1 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(0), ip_uv.at(1));
967 t2 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, tex, ip_uv.at(0), v_uv.at(3), v_uv.at(0));
968 t3 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, tex, ip_uv.at(1), v_uv.at(0), v_uv.at(1));
969 }
else if ((slice_points_edge_ID.at(0) == 3 && slice_points_edge_ID.at(1) == 2)) {
971 t0 = context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(3) - buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(3));
972 t1 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(1) + buffer, slice_points.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(1), ip_uv.at(1));
973 t2 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(0), v_uv.at(1));
974 t3 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(1) + buffer, primitive_vertices.at(2) + buffer, tex, ip_uv.at(1), v_uv.at(1), v_uv.at(2));
975 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 3)) {
977 t0 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(3) - buffer, slice_points.at(1) - buffer, tex, ip_uv.at(0), v_uv.at(3), ip_uv.at(1));
978 t1 = context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(1) + buffer, tex, ip_uv.at(0), ip_uv.at(1), v_uv.at(1));
979 t2 = context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, tex, ip_uv.at(1), v_uv.at(0), v_uv.at(1));
980 t3 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_vertices.at(2) + buffer, tex, ip_uv.at(0), v_uv.at(1), v_uv.at(2));
987 resulting_UUIDs.push_back(t0);
992 resulting_UUIDs.push_back(t1);
997 resulting_UUIDs.push_back(t2);
1002 resulting_UUIDs.push_back(t3);
1006 }
else if (initial_slice_points_size == 3) {
1010 for (
uint i = 0; i < 1; i++) {
1017 if (slice_points_edge_ID.at(i) == 0) {
1018 point_0 = primitive_vertices.at(0);
1019 point_1 = primitive_vertices.at(1);
1020 point_0uv = v_uv.at(0);
1021 point_1uv = v_uv.at(1);
1022 }
else if (slice_points_edge_ID.at(i) == 1) {
1023 point_0 = primitive_vertices.at(1);
1024 point_1 = primitive_vertices.at(2);
1025 point_0uv = v_uv.at(1);
1026 point_1uv = v_uv.at(2);
1027 }
else if (slice_points_edge_ID.at(i) == 2) {
1028 point_0 = primitive_vertices.at(2);
1029 point_1 = primitive_vertices.at(3);
1030 point_0uv = v_uv.at(2);
1031 point_1uv = v_uv.at(3);
1032 }
else if (slice_points_edge_ID.at(i) == 3) {
1033 point_0 = primitive_vertices.at(3);
1034 point_1 = primitive_vertices.at(0);
1035 point_0uv = v_uv.at(3);
1036 point_1uv = v_uv.at(0);
1050 if (ip_uv.at(i).x < 0 || ip_uv.at(i).x > 1 || ip_uv.at(i).y < 0 || ip_uv.at(i).y > 1) {
1051 helios_runtime_error(
"ERROR (VoxelIntersection::slicePrimitive): texture UV coordinates for UUID " + std::to_string(UUID) +
" are out of valid range [0,1].");
1055 if (slice_points_edge_ID.at(0) == 0 && vertex_index == 2) {
1057 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(2) + buffer, primitive_vertices.at(0) + buffer, tex, ip_uv.at(0), v_uv.at(2), v_uv.at(0));
1058 t1 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, tex, ip_uv.at(0), v_uv.at(1), v_uv.at(2));
1059 t2 = context->
addTriangle(primitive_vertices.at(2) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, tex, v_uv.at(2), v_uv.at(3), v_uv.at(0));
1060 }
else if (slice_points_edge_ID.at(0) == 0 && vertex_index == 3) {
1062 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, tex, ip_uv.at(0), v_uv.at(3), v_uv.at(0));
1063 t1 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(3) - buffer, tex, ip_uv.at(0), v_uv.at(1), v_uv.at(3));
1064 t2 = context->
addTriangle(primitive_vertices.at(3) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, tex, v_uv.at(3), v_uv.at(1), v_uv.at(2));
1065 }
else if (slice_points_edge_ID.at(0) == 1 && vertex_index == 3) {
1067 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(3), v_uv.at(1));
1068 t1 = context->
addTriangle(primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, tex, v_uv.at(3), v_uv.at(0), v_uv.at(1));
1069 t2 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, tex, ip_uv.at(0), v_uv.at(2), v_uv.at(3));
1070 }
else if (slice_points_edge_ID.at(0) == 1 && vertex_index == 0) {
1072 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(0), v_uv.at(1));
1073 t1 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(0) - buffer, tex, ip_uv.at(0), v_uv.at(2), v_uv.at(0));
1074 t2 = context->
addTriangle(primitive_vertices.at(0) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, tex, v_uv.at(0), v_uv.at(2), v_uv.at(3));
1075 }
else if (slice_points_edge_ID.at(0) == 2 && vertex_index == 1) {
1077 t0 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, tex, ip_uv.at(0), v_uv.at(1), v_uv.at(2));
1078 t1 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(3), v_uv.at(1));
1079 t2 = context->
addTriangle(primitive_vertices.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, tex, v_uv.at(1), v_uv.at(3), v_uv.at(0));
1080 }
else if (slice_points_edge_ID.at(0) == 2 && vertex_index == 0) {
1082 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, tex, ip_uv.at(0), v_uv.at(3), v_uv.at(0));
1083 t1 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(0) - buffer, primitive_vertices.at(2) - buffer, tex, ip_uv.at(0), v_uv.at(0), v_uv.at(2));
1084 t2 = context->
addTriangle(primitive_vertices.at(0) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, tex, v_uv.at(0), v_uv.at(1), v_uv.at(2));
1085 }
else if (slice_points_edge_ID.at(0) == 3 && vertex_index == 2) {
1087 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(2) + buffer, tex, ip_uv.at(0), v_uv.at(0), v_uv.at(2));
1088 t1 = context->
addTriangle(primitive_vertices.at(2) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, tex, v_uv.at(2), v_uv.at(0), v_uv.at(1));
1089 t2 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, tex, ip_uv.at(0), v_uv.at(2), v_uv.at(3));
1090 }
else if (slice_points_edge_ID.at(0) == 3 && vertex_index == 1) {
1092 t0 = context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, tex, ip_uv.at(0), v_uv.at(0), v_uv.at(1));
1093 t1 = context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(3) - buffer, tex, ip_uv.at(0), v_uv.at(1), v_uv.at(3));
1094 t2 = context->
addTriangle(primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, tex, v_uv.at(1), v_uv.at(2), v_uv.at(3));
1101 resulting_UUIDs.push_back(t0);
1106 resulting_UUIDs.push_back(t1);
1111 resulting_UUIDs.push_back(t2);
1115 }
else if (initial_slice_points_size == 4) {
1117 if (vertex_index == 0 || vertex_index == 2) {
1119 t0 = context->
addTriangle(primitive_vertices.at(0) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, tex, v_uv.at(0), v_uv.at(1), v_uv.at(2));
1120 t1 = context->
addTriangle(primitive_vertices.at(0) + buffer, primitive_vertices.at(2) + buffer, primitive_vertices.at(3) + buffer, tex, v_uv.at(0), v_uv.at(2), v_uv.at(3));
1122 }
else if (vertex_index == 1 || vertex_index == 3) {
1124 t0 = context->
addTriangle(primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, tex, v_uv.at(1), v_uv.at(2), v_uv.at(3));
1125 t1 = context->
addTriangle(primitive_vertices.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, tex, v_uv.at(1), v_uv.at(3), v_uv.at(0));
1132 resulting_UUIDs.push_back(t0);
1137 resulting_UUIDs.push_back(t1);
1147 for (
uint i = 0; i < resulting_UUIDs.size(); i++) {
1162 float pdiff_area = (resulting_area - original_area) / original_area * 100.0;
1163 float pdiff_area_abs = fabs(pdiff_area);
1164 if (pdiff_area_abs > 1) {
1165 warnings.
addWarning(
"slice_area_mismatch",
"Sum of slice areas does not equal area of original primitive (UUID = " + std::to_string(UUID) +
", original area = " + std::to_string(original_area) +
1166 ", resulting area = " + std::to_string(resulting_area) +
", percent difference = " + std::to_string(pdiff_area) +
"%)");
1172 for (
uint aa = 0; aa < resulting_UUIDs.size(); aa++) {
1175 if (!
approxSame(primitive_normal.
x, this_normal.
x, absTol, relTol) || !
approxSame(primitive_normal.
y, this_normal.
y, absTol, relTol) || !
approxSame(primitive_normal.
z, this_normal.
z, absTol, relTol)) {
1176 warnings.
addWarning(
"slice_normal_mismatch",
"UUID " + std::to_string(resulting_UUIDs.at(aa)) +
" normal (" + std::to_string(this_normal.
x) +
", " + std::to_string(this_normal.
y) +
", " + std::to_string(this_normal.
z) +
1177 ") does not match original normal (" + std::to_string(primitive_normal.
x) +
", " + std::to_string(primitive_normal.
y) +
", " + std::to_string(primitive_normal.
z) +
")");
1184 return resulting_UUIDs;