117 std::vector<uint> resulting_UUIDs;
119 if (voxel_face_vertices.size() < 3) {
120 helios_runtime_error(
"ERROR (CollisionDetection::slicePrimitive): voxel_face_vertices must contain at least three points.");
123 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));
136 bool primitiveHasTexture = !texa.empty();
165 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);
166 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);
168 float d1 = d1a.
x + d1a.
y + d1a.
z;
169 float d2 = d2a.
x + d2a.
y + d2a.
z;
177 yi = (d2 * face_normal.
z - d1 * primitive_normal.
z) / direction_vector.
x;
178 zi = (d1 * primitive_normal.
y - d2 * face_normal.
y) / direction_vector.
x;
179 }
else if (maxc == 2) {
180 xi = (d1 * primitive_normal.
z - d2 * face_normal.
z) / direction_vector.
y;
182 zi = (d2 * face_normal.
x - d1 * primitive_normal.
x) / direction_vector.
y;
183 }
else if (maxc == 3) {
184 xi = (d2 * face_normal.
y - d1 * primitive_normal.
y) / direction_vector.
z;
185 yi = (d1 * primitive_normal.
x - d2 * face_normal.
x) / direction_vector.
z;
195 std::vector<helios::vec3> possible_points;
197 std::vector<helios::vec3> slice_points;
198 std::vector<uint> slice_points_edge_ID;
205 if (primitive_vertices.size() == 4) {
206 possible_points.resize(4);
207 possible_points.at(0) =
linesIntersection(primitive_vertices.at(1), primitive_vertices.at(1) - primitive_vertices.at(0), ipoint, direction_vector);
208 possible_points.at(1) =
linesIntersection(primitive_vertices.at(2), primitive_vertices.at(2) - primitive_vertices.at(1), ipoint, direction_vector);
209 possible_points.at(2) =
linesIntersection(primitive_vertices.at(3), primitive_vertices.at(3) - primitive_vertices.at(2), ipoint, direction_vector);
210 possible_points.at(3) =
linesIntersection(primitive_vertices.at(0), primitive_vertices.at(0) - primitive_vertices.at(3), ipoint, direction_vector);
212 for (
uint i = 0; i < 4; i++) {
214 vi1 = primitive_vertices.at(1);
215 vi0 = primitive_vertices.at(0);
217 vi1 = primitive_vertices.at(2);
218 vi0 = primitive_vertices.at(1);
220 vi1 = primitive_vertices.at(3);
221 vi0 = primitive_vertices.at(2);
223 vi1 = primitive_vertices.at(0);
224 vi0 = primitive_vertices.at(3);
227 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));
228 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));
229 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));
231 if (test_x && test_y && test_z) {
232 slice_points.push_back(possible_points.at(i));
233 slice_points_edge_ID.push_back(i);
237 }
else if (primitive_vertices.size() == 3) {
239 possible_points.resize(3);
240 possible_points.at(0) =
linesIntersection(primitive_vertices.at(1), primitive_vertices.at(1) - primitive_vertices.at(0), ipoint, direction_vector);
241 possible_points.at(1) =
linesIntersection(primitive_vertices.at(2), primitive_vertices.at(2) - primitive_vertices.at(1), ipoint, direction_vector);
242 possible_points.at(2) =
linesIntersection(primitive_vertices.at(0), primitive_vertices.at(0) - primitive_vertices.at(2), ipoint, direction_vector);
244 for (
uint i = 0; i < 3; i++) {
246 vi1 = primitive_vertices.at(1);
247 vi0 = primitive_vertices.at(0);
249 vi1 = primitive_vertices.at(2);
250 vi0 = primitive_vertices.at(1);
253 vi1 = primitive_vertices.at(0);
254 vi0 = primitive_vertices.at(2);
257 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));
258 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));
259 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));
261 if (test_x && test_y && test_z) {
262 slice_points.push_back(possible_points.at(i));
263 slice_points_edge_ID.push_back(i);
270 uint initial_slice_points_size = slice_points.size();
273 float absTol = pow(10, -6);
274 float relTol = pow(10, -20);
278 if (initial_slice_points_size == 0) {
279 resulting_UUIDs.push_back(UUID);
280 return resulting_UUIDs;
282 }
else if (initial_slice_points_size == 1) {
284 resulting_UUIDs.push_back(UUID);
285 if (this->printmessages) {
286 std::cout <<
"the primitive intersected with the face at a single point (a corner) - no slicing needed" << std::endl;
288 return resulting_UUIDs;
289 }
else if (initial_slice_points_size == 2) {
295 if (slice_points_edge_ID.at(0) == slice_points_edge_ID.at(1)) {
296 resulting_UUIDs.push_back(UUID);
297 if (this->printmessages) {
298 std::cout <<
"the primitive intersected with the face along an edge - no need to slice" << std::endl;
300 return resulting_UUIDs;
303 if (primitive_vertices.size() == 4) {
304 if ((
approxSame(slice_points.at(0), primitive_vertices.at(0), absTol) &&
approxSame(slice_points.at(1), primitive_vertices.at(1), absTol)) ||
305 (
approxSame(slice_points.at(0), primitive_vertices.at(1), absTol) &&
approxSame(slice_points.at(1), primitive_vertices.at(0), absTol)) ||
306 (
approxSame(slice_points.at(0), primitive_vertices.at(1), absTol) &&
approxSame(slice_points.at(1), primitive_vertices.at(2), absTol)) ||
307 (
approxSame(slice_points.at(0), primitive_vertices.at(2), absTol) &&
approxSame(slice_points.at(1), primitive_vertices.at(1), absTol)) ||
308 (
approxSame(slice_points.at(0), primitive_vertices.at(2), absTol) &&
approxSame(slice_points.at(1), primitive_vertices.at(3), absTol)) ||
309 (
approxSame(slice_points.at(0), primitive_vertices.at(3), absTol) &&
approxSame(slice_points.at(1), primitive_vertices.at(2), absTol)) ||
310 (
approxSame(slice_points.at(0), primitive_vertices.at(3), absTol) &&
approxSame(slice_points.at(1), primitive_vertices.at(0), absTol)) ||
311 (
approxSame(slice_points.at(0), primitive_vertices.at(0), absTol) &&
approxSame(slice_points.at(1), primitive_vertices.at(3), absTol))) {
312 if (this->printmessages) {
313 std::cout <<
"the primitive intersected with the face along an edge - no need to slice" << std::endl;
315 resulting_UUIDs.push_back(UUID);
316 return resulting_UUIDs;
319 }
else if (primitive_vertices.size() == 3) {
321 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)) &&
322 (
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))) {
323 resulting_UUIDs.push_back(UUID);
324 if (this->printmessages) {
325 std::cout <<
"the primitive intersected with the face along an edge - no need to slice" << std::endl;
327 return resulting_UUIDs;
334 for (
uint j = 0; j < primitive_vertices.size(); j++) {
335 for (
uint i = 0; i < slice_points.size(); i++) {
337 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));
338 if (
approxSame(Dxyza,
float(0.0), absTol, relTol)) {
339 slice_points.at(i) = primitive_vertices.at(j);
345 }
else if (initial_slice_points_size == 3) {
352 vec3 non_vertex_slice_point;
353 uint non_vertex_slice_edge_ID;
354 vec3 vertex_slice_point;
356 for (
uint bb = 0; bb < slice_points.size(); bb++) {
357 bool this_point_vert_test =
false;
358 for (
uint cc = 0; cc < primitive_vertices.size(); cc++) {
359 bool vert_test =
approxSame(slice_points.at(bb), primitive_vertices.at(cc), absTol);
362 this_point_vert_test =
true;
363 vertex_slice_point = primitive_vertices.at(cc);
368 if (this_point_vert_test ==
false) {
369 non_vertex_slice_point = slice_points.at(bb);
370 non_vertex_slice_edge_ID = slice_points_edge_ID.at(bb);
373 slice_points.resize(2);
374 slice_points.at(0) = non_vertex_slice_point;
375 slice_points_edge_ID.at(0) = non_vertex_slice_edge_ID;
376 slice_points.at(1) = vertex_slice_point;
383 }
else if (initial_slice_points_size == 4) {
385 vec3 non_vertex_slice_point;
386 uint non_vertex_slice_edge_ID;
387 vec3 vertex_slice_point;
388 for (
uint bb = 0; bb < slice_points.size(); bb++) {
389 bool this_point_vert_test =
false;
390 for (
uint cc = 0; cc < primitive_vertices.size(); cc++) {
391 bool vert_test =
approxSame(slice_points.at(bb), primitive_vertices.at(cc), absTol);
394 this_point_vert_test =
true;
399 slice_points.resize(2);
401 helios_runtime_error(
"ERROR (CollisionDetection::slicePrimitive): more than 5 slice points detected - invalid geometry.");
408 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);
410 float buffer_value = powf(
float(10),
float(-5));
412 if (fabs(face_normal.
x) > 0.5) {
413 if (primitive_vertices.at(0).x < face_coordinate.
x) {
414 buffer =
make_vec3(
float(-1) * buffer_value, 0, 0);
415 }
else if (primitive_vertices.at(0).x > face_coordinate.
x) {
418 if (this->printmessages) {
419 std::cout <<
"vertex 0 exactly at face" << std::endl;
423 }
else if (fabs(face_normal.
y) > 0.5) {
424 if (primitive_vertices.at(0).y < face_coordinate.
y) {
425 buffer =
make_vec3(0,
float(-1) * buffer_value, 0);
426 }
else if (primitive_vertices.at(0).y > face_coordinate.
y) {
429 if (this->printmessages) {
430 std::cout <<
"vertex 0 exactly at face" << std::endl;
434 }
else if (fabs(face_normal.
z) > 0.5) {
435 if (primitive_vertices.at(0).z < face_coordinate.
z) {
436 buffer =
make_vec3(0, 0,
float(-1) * buffer_value);
437 }
else if (primitive_vertices.at(0).z > face_coordinate.
z) {
440 if (this->printmessages) {
441 std::cout <<
"vertex 0 exactly at face" << std::endl;
453 float minArea = pow(10, -13);
461 if (primitiveHasTexture ==
false) {
463 if (primitive_vertices.size() == 3) {
465 if (initial_slice_points_size == 2) {
466 if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 1)) {
468 t0 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, slice_points.at(1) - buffer, primitive_color);
469 t1 = this->context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(2) + buffer, primitive_color);
470 t2 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(2) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
471 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 0)) {
473 t0 = this->context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_color);
474 t1 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(2) + buffer, slice_points.at(1) + buffer, primitive_color);
475 t2 = this->context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(2) + buffer, primitive_color);
476 }
else if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 2)) {
478 t0 = this->context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
479 t1 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, primitive_color);
480 t2 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
481 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 0)) {
483 t0 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, primitive_color);
484 t1 = this->context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
485 t2 = this->context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
486 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 2)) {
488 t0 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, primitive_color);
489 t1 = this->context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
490 t2 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
491 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 1)) {
493 t0 = this->context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
494 t1 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, primitive_color);
495 t2 = this->context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
502 resulting_UUIDs.push_back(t0);
507 resulting_UUIDs.push_back(t1);
512 resulting_UUIDs.push_back(t2);
516 }
else if (initial_slice_points_size == 3) {
519 if (slice_points_edge_ID.at(0) == 0) {
521 t0 = this->context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
522 t1 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, slice_points.at(1) - buffer, primitive_color);
523 }
else if (slice_points_edge_ID.at(0) == 1) {
525 t0 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(2) + buffer, slice_points.at(1) + buffer, primitive_color);
526 t1 = this->context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_color);
527 }
else if (slice_points_edge_ID.at(0) == 2) {
529 t0 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, primitive_color);
530 t1 = this->context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
537 resulting_UUIDs.push_back(t0);
542 resulting_UUIDs.push_back(t1);
546 }
else if (primitive_vertices.size() == 4) {
549 if (initial_slice_points_size == 2) {
551 if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 2)) {
553 t0 = this->context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
554 t1 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, primitive_color);
555 t2 = this->context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
556 t3 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
559 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 0)) {
561 t0 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, primitive_color);
562 t1 = this->context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
563 t2 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
564 t3 = this->context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
566 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 3)) {
568 t0 = this->context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
569 t1 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(3) - buffer, slice_points.at(1) - buffer, primitive_color);
570 t2 = this->context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
571 t3 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
573 }
else if ((slice_points_edge_ID.at(0) == 3 && slice_points_edge_ID.at(1) == 1)) {
575 t0 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(1) + buffer, slice_points.at(1) + buffer, primitive_color);
576 t1 = this->context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
577 t2 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
578 t3 = this->context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
581 }
else if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 3)) {
583 t0 = this->context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
584 t1 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, primitive_color);
585 t2 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
586 t3 = this->context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
587 }
else if ((slice_points_edge_ID.at(0) == 3 && slice_points_edge_ID.at(1) == 0)) {
589 t0 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, primitive_color);
590 t1 = this->context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
591 t2 = this->context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
592 t3 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
594 }
else if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 1)) {
596 t0 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, slice_points.at(1) - buffer, primitive_color);
597 t1 = this->context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_color);
598 t2 = this->context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(2) + buffer, primitive_vertices.at(3) + buffer, primitive_color);
599 t3 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
600 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 0)) {
602 t0 = this->context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_color);
603 t1 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, slice_points.at(1) + buffer, primitive_color);
604 t2 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(2) + buffer, primitive_vertices.at(3) + buffer, primitive_color);
605 t3 = this->context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
606 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 2)) {
608 t0 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, primitive_color);
609 t1 = this->context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
610 t2 = this->context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
611 t3 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
612 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 1)) {
614 t0 = this->context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
615 t1 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, primitive_color);
616 t2 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
617 t3 = this->context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
618 }
else if ((slice_points_edge_ID.at(0) == 3 && slice_points_edge_ID.at(1) == 2)) {
620 t0 = this->context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
621 t1 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(1) + buffer, slice_points.at(1) + buffer, primitive_color);
622 t2 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
623 t3 = this->context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(1) + buffer, primitive_vertices.at(2) + buffer, primitive_color);
624 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 3)) {
626 t0 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(3) - buffer, slice_points.at(1) - buffer, primitive_color);
627 t1 = this->context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
628 t2 = this->context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
629 t3 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_vertices.at(2) + buffer, primitive_color);
636 resulting_UUIDs.push_back(t0);
641 resulting_UUIDs.push_back(t1);
646 resulting_UUIDs.push_back(t2);
651 resulting_UUIDs.push_back(t3);
654 }
else if (initial_slice_points_size == 3) {
657 if (slice_points_edge_ID.at(0) == 0 && vertex_index == 2) {
659 t0 = this->context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
660 t1 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, slice_points.at(1) - buffer, primitive_color);
661 t2 = this->context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
662 }
else if (slice_points_edge_ID.at(0) == 0 && vertex_index == 3) {
664 t0 = this->context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
665 t1 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(1) - buffer, slice_points.at(1) - buffer, primitive_color);
666 t2 = this->context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
667 }
else if (slice_points_edge_ID.at(0) == 1 && vertex_index == 3) {
669 t0 = this->context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
670 t1 = this->context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
671 t2 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, primitive_color);
672 }
else if (slice_points_edge_ID.at(0) == 1 && vertex_index == 0) {
674 t0 = this->context->
addTriangle(slice_points.at(0) + buffer, slice_points.at(1) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
675 t1 = this->context->
addTriangle(slice_points.at(0) - buffer, primitive_vertices.at(2) - buffer, slice_points.at(1) - buffer, primitive_color);
676 t2 = this->context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
677 }
else if (slice_points_edge_ID.at(0) == 2 && vertex_index == 1) {
679 t0 = this->context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
680 t1 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, slice_points.at(1) + buffer, primitive_color);
681 t2 = this->context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
682 }
else if (slice_points_edge_ID.at(0) == 2 && vertex_index == 0) {
684 t0 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(3) + buffer, slice_points.at(1) + buffer, primitive_color);
685 t1 = this->context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
686 t2 = this->context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
687 }
else if (slice_points_edge_ID.at(0) == 3 && vertex_index == 2) {
689 t0 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, primitive_color);
690 t1 = this->context->
addTriangle(slice_points.at(1) + buffer, primitive_vertices.at(0) + buffer, primitive_vertices.at(1) + buffer, primitive_color);
691 t2 = this->context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
692 }
else if (slice_points_edge_ID.at(0) == 3 && vertex_index == 1) {
694 t0 = this->context->
addTriangle(slice_points.at(0) + buffer, primitive_vertices.at(0) + buffer, slice_points.at(1) + buffer, primitive_color);
695 t1 = this->context->
addTriangle(slice_points.at(0) - buffer, slice_points.at(1) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
696 t2 = this->context->
addTriangle(slice_points.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
703 resulting_UUIDs.push_back(t0);
708 resulting_UUIDs.push_back(t1);
713 resulting_UUIDs.push_back(t2);
716 }
else if (initial_slice_points_size == 4) {
718 if (vertex_index == 0 || vertex_index == 2) {
720 t0 = this->context->
addTriangle(primitive_vertices.at(0) - buffer, primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_color);
721 t1 = this->context->
addTriangle(primitive_vertices.at(0) + buffer, primitive_vertices.at(2) + buffer, primitive_vertices.at(3) + buffer, primitive_color);
723 }
else if (vertex_index == 1 || vertex_index == 3) {
725 t0 = this->context->
addTriangle(primitive_vertices.at(1) - buffer, primitive_vertices.at(2) - buffer, primitive_vertices.at(3) - buffer, primitive_color);
726 t1 = this->context->
addTriangle(primitive_vertices.at(1) + buffer, primitive_vertices.at(3) + buffer, primitive_vertices.at(0) + buffer, primitive_color);
733 resulting_UUIDs.push_back(t0);
738 resulting_UUIDs.push_back(t1);
743 }
else if (primitiveHasTexture) {
749 std::vector<helios::vec2> ip_uv;
752 if (primitive_vertices.size() == 3) {
755 if (initial_slice_points_size == 2) {
756 for (
uint i = 0; i < slice_points.size(); i++) {
764 if (slice_points_edge_ID.at(i) == 0) {
765 point_0 = primitive_vertices.at(0);
766 point_1 = primitive_vertices.at(1);
767 point_0uv = v_uv.at(0);
768 point_1uv = v_uv.at(1);
769 }
else if (slice_points_edge_ID.at(i) == 1) {
770 point_0 = primitive_vertices.at(1);
771 point_1 = primitive_vertices.at(2);
772 point_0uv = v_uv.at(1);
773 point_1uv = v_uv.at(2);
774 }
else if (slice_points_edge_ID.at(i) == 2) {
775 point_0 = primitive_vertices.at(2);
776 point_1 = primitive_vertices.at(0);
777 point_0uv = v_uv.at(2);
778 point_1uv = v_uv.at(0);
783 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) {
784 helios_runtime_error(
"ERROR (CollisionDetection::slicePrimitive): texture UV coordinates for UUID " + std::to_string(UUID) +
" are out of valid range [0,1].");
788 if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 1)) {
790 t0 = this->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));
791 t1 = this->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));
792 t2 = this->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));
793 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 0)) {
795 t0 = this->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));
796 t1 = this->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));
797 t2 = this->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));
798 }
else if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 2)) {
800 t0 = this->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));
801 t1 = this->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));
802 t2 = this->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));
803 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 0)) {
805 t0 = this->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));
806 t1 = this->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));
807 t2 = this->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));
808 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 2)) {
810 t0 = this->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));
811 t1 = this->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));
812 t2 = this->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));
813 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 1)) {
815 t0 = this->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));
816 t1 = this->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));
817 t2 = this->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));
824 resulting_UUIDs.push_back(t0);
829 resulting_UUIDs.push_back(t1);
834 resulting_UUIDs.push_back(t2);
839 }
else if (initial_slice_points_size == 3) {
850 if (slice_points_edge_ID.at(0) == 0) {
851 point_0 = primitive_vertices.at(0);
852 point_1 = primitive_vertices.at(1);
853 point_0uv = v_uv.at(0);
854 point_1uv = v_uv.at(1);
855 ip_uv.at(1) = v_uv.at(2);
857 }
else if (slice_points_edge_ID.at(0) == 1) {
858 point_0 = primitive_vertices.at(1);
859 point_1 = primitive_vertices.at(2);
860 point_0uv = v_uv.at(1);
861 point_1uv = v_uv.at(2);
862 ip_uv.at(1) = v_uv.at(0);
863 }
else if (slice_points_edge_ID.at(0) == 2) {
864 point_0 = primitive_vertices.at(2);
865 point_1 = primitive_vertices.at(0);
866 point_0uv = v_uv.at(2);
867 point_1uv = v_uv.at(0);
868 ip_uv.at(1) = v_uv.at(1);
874 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) {
875 helios_runtime_error(
"ERROR (CollisionDetection::slicePrimitive): texture UV coordinates for UUID " + std::to_string(UUID) +
" are out of valid range [0,1].");
878 if (slice_points_edge_ID.at(0) == 0) {
880 t0 = this->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));
881 t1 = this->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));
882 }
else if (slice_points_edge_ID.at(0) == 1) {
884 t0 = this->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));
885 t1 = this->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));
886 }
else if (slice_points_edge_ID.at(0) == 2) {
888 t0 = this->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));
889 t1 = this->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));
896 resulting_UUIDs.push_back(t0);
901 resulting_UUIDs.push_back(t1);
906 }
else if (primitive_vertices.size() == 4) {
910 if (v_uv.size() == 0) {
916 if (initial_slice_points_size == 2) {
918 for (
uint i = 0; i < 2; i++) {
925 if (slice_points_edge_ID.at(i) == 0) {
926 point_0 = primitive_vertices.at(0);
927 point_1 = primitive_vertices.at(1);
928 point_0uv = v_uv.at(0);
929 point_1uv = v_uv.at(1);
930 }
else if (slice_points_edge_ID.at(i) == 1) {
931 point_0 = primitive_vertices.at(1);
932 point_1 = primitive_vertices.at(2);
933 point_0uv = v_uv.at(1);
934 point_1uv = v_uv.at(2);
935 }
else if (slice_points_edge_ID.at(i) == 2) {
936 point_0 = primitive_vertices.at(2);
937 point_1 = primitive_vertices.at(3);
938 point_0uv = v_uv.at(2);
939 point_1uv = v_uv.at(3);
940 }
else if (slice_points_edge_ID.at(i) == 3) {
941 point_0 = primitive_vertices.at(3);
942 point_1 = primitive_vertices.at(0);
943 point_0uv = v_uv.at(3);
944 point_1uv = v_uv.at(0);
949 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) {
950 helios_runtime_error(
"ERROR (CollisionDetection::slicePrimitive): texture UV coordinates for UUID " + std::to_string(UUID) +
" are out of valid range [0,1].");
955 if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 2)) {
957 t0 = this->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));
958 t1 = this->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));
959 t2 = this->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));
960 t3 = this->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));
961 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 0)) {
963 t0 = this->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));
964 t1 = this->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));
965 t2 = this->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));
966 t3 = this->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));
967 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 3)) {
969 t0 = this->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));
970 t1 = this->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));
971 t2 = this->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));
972 t3 = this->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));
973 }
else if ((slice_points_edge_ID.at(0) == 3 && slice_points_edge_ID.at(1) == 1)) {
975 t0 = this->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));
976 t1 = this->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));
977 t2 = this->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));
978 t3 = this->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));
980 }
else if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 3)) {
982 t0 = this->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));
983 t1 = this->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));
984 t2 = this->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));
985 t3 = this->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));
986 }
else if ((slice_points_edge_ID.at(0) == 3 && slice_points_edge_ID.at(1) == 0)) {
988 t0 = this->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));
989 t1 = this->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));
990 t2 = this->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));
991 t3 = this->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));
992 }
else if ((slice_points_edge_ID.at(0) == 0 && slice_points_edge_ID.at(1) == 1)) {
994 t0 = this->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));
995 t1 = this->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));
996 t2 = this->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));
997 t3 = this->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));
998 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 0)) {
1000 t0 = this->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));
1001 t1 = this->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));
1002 t2 = this->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));
1003 t3 = this->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));
1004 }
else if ((slice_points_edge_ID.at(0) == 1 && slice_points_edge_ID.at(1) == 2)) {
1006 t0 = this->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));
1007 t1 = this->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));
1008 t2 = this->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));
1009 t3 = this->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));
1010 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 1)) {
1012 t0 = this->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));
1013 t1 = this->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));
1014 t2 = this->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));
1015 t3 = this->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));
1016 }
else if ((slice_points_edge_ID.at(0) == 3 && slice_points_edge_ID.at(1) == 2)) {
1018 t0 = this->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));
1019 t1 = this->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));
1020 t2 = this->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));
1021 t3 = this->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));
1022 }
else if ((slice_points_edge_ID.at(0) == 2 && slice_points_edge_ID.at(1) == 3)) {
1024 t0 = this->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));
1025 t1 = this->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));
1026 t2 = this->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));
1027 t3 = this->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));
1034 resulting_UUIDs.push_back(t0);
1039 resulting_UUIDs.push_back(t1);
1044 resulting_UUIDs.push_back(t2);
1049 resulting_UUIDs.push_back(t3);
1053 }
else if (initial_slice_points_size == 3) {
1057 for (
uint i = 0; i < 1; i++) {
1064 if (slice_points_edge_ID.at(i) == 0) {
1065 point_0 = primitive_vertices.at(0);
1066 point_1 = primitive_vertices.at(1);
1067 point_0uv = v_uv.at(0);
1068 point_1uv = v_uv.at(1);
1069 }
else if (slice_points_edge_ID.at(i) == 1) {
1070 point_0 = primitive_vertices.at(1);
1071 point_1 = primitive_vertices.at(2);
1072 point_0uv = v_uv.at(1);
1073 point_1uv = v_uv.at(2);
1074 }
else if (slice_points_edge_ID.at(i) == 2) {
1075 point_0 = primitive_vertices.at(2);
1076 point_1 = primitive_vertices.at(3);
1077 point_0uv = v_uv.at(2);
1078 point_1uv = v_uv.at(3);
1079 }
else if (slice_points_edge_ID.at(i) == 3) {
1080 point_0 = primitive_vertices.at(3);
1081 point_1 = primitive_vertices.at(0);
1082 point_0uv = v_uv.at(3);
1083 point_1uv = v_uv.at(0);
1097 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) {
1098 helios_runtime_error(
"ERROR (CollisionDetection::slicePrimitive): texture UV coordinates for UUID " + std::to_string(UUID) +
" are out of valid range [0,1].");
1102 if (slice_points_edge_ID.at(0) == 0 && vertex_index == 2) {
1104 t0 = this->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));
1105 t1 = this->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));
1106 t2 = this->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));
1107 }
else if (slice_points_edge_ID.at(0) == 0 && vertex_index == 3) {
1109 t0 = this->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));
1110 t1 = this->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));
1111 t2 = this->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));
1112 }
else if (slice_points_edge_ID.at(0) == 1 && vertex_index == 3) {
1114 t0 = this->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));
1115 t1 = this->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));
1116 t2 = this->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));
1117 }
else if (slice_points_edge_ID.at(0) == 1 && vertex_index == 0) {
1119 t0 = this->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));
1120 t1 = this->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));
1121 t2 = this->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 (slice_points_edge_ID.at(0) == 2 && vertex_index == 1) {
1124 t0 = this->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));
1125 t1 = this->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));
1126 t2 = this->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));
1127 }
else if (slice_points_edge_ID.at(0) == 2 && vertex_index == 0) {
1129 t0 = this->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));
1130 t1 = this->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));
1131 t2 = this->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));
1132 }
else if (slice_points_edge_ID.at(0) == 3 && vertex_index == 2) {
1134 t0 = this->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));
1135 t1 = this->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));
1136 t2 = this->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));
1137 }
else if (slice_points_edge_ID.at(0) == 3 && vertex_index == 1) {
1139 t0 = this->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));
1140 t1 = this->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));
1141 t2 = this->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));
1148 resulting_UUIDs.push_back(t0);
1153 resulting_UUIDs.push_back(t1);
1158 resulting_UUIDs.push_back(t2);
1162 }
else if (initial_slice_points_size == 4) {
1164 if (vertex_index == 0 || vertex_index == 2) {
1166 t0 = this->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));
1167 t1 = this->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));
1169 }
else if (vertex_index == 1 || vertex_index == 3) {
1171 t0 = this->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));
1172 t1 = this->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));
1179 resulting_UUIDs.push_back(t0);
1184 resulting_UUIDs.push_back(t1);
1194 for (
uint i = 0; i < resulting_UUIDs.size(); i++) {
1209 float pdiff_area = (resulting_area - original_area) / original_area * 100.0;
1210 float pdiff_area_abs = fabs(pdiff_area);
1211 if (pdiff_area_abs > 1) {
1212 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) +
1213 ", resulting area = " + std::to_string(resulting_area) +
", percent difference = " + std::to_string(pdiff_area) +
"%)");
1219 for (
uint aa = 0; aa < resulting_UUIDs.size(); aa++) {
1222 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)) {
1223 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) +
1224 ") does not match original normal (" + std::to_string(primitive_normal.
x) +
", " + std::to_string(primitive_normal.
y) +
", " + std::to_string(primitive_normal.
z) +
")");
1231 return resulting_UUIDs;