| 1410 | } |
| 1411 | |
| 1412 | bool extend_grid(RTCGeometry geom, std::vector<bool>& visited, std::deque<unsigned int>& left, std::deque<unsigned int>& top, std::deque<unsigned int>& right) |
| 1413 | { |
| 1414 | // top |
| 1415 | // | <---------- |
| 1416 | // | /\ . |
| 1417 | // | left | right |
| 1418 | // | | |
| 1419 | // \/ | |
| 1420 | |
| 1421 | |
| 1422 | /* test if all neighboring faces of top exist and are properly connected */ |
| 1423 | unsigned int prev_opposite_edge = -1; |
| 1424 | for (size_t i=0; i<top.size(); i++) |
| 1425 | { |
| 1426 | const unsigned int edge = top[i]; |
| 1427 | const unsigned int opposite_edge = rtcGetGeometryOppositeHalfEdge(geom,0,edge); |
| 1428 | if (opposite_edge == edge) return false; |
| 1429 | const unsigned int opposite_face = rtcGetGeometryFace(geom,opposite_edge); |
| 1430 | if (visited[opposite_face]) return false; |
| 1431 | |
| 1432 | /* test if we share an edge with the last quad */ |
| 1433 | if (i > 0) { |
| 1434 | const unsigned int border0 = rtcGetGeometryOppositeHalfEdge(geom,0,rtcGetGeometryPreviousHalfEdge(geom,prev_opposite_edge)); |
| 1435 | const unsigned int border1 = rtcGetGeometryNextHalfEdge(geom,opposite_edge); |
| 1436 | if (border0 != border1) return false; |
| 1437 | } |
| 1438 | prev_opposite_edge = opposite_edge; |
| 1439 | } |
| 1440 | |
| 1441 | /* extend border edges */ |
| 1442 | for (size_t i=0; i<top.size(); i++) |
| 1443 | { |
| 1444 | const unsigned int edge = top[i]; |
| 1445 | const unsigned int opposite_edge = rtcGetGeometryOppositeHalfEdge(geom,0,edge); |
| 1446 | assert(opposite_edge != edge); |
| 1447 | const unsigned int opposite_face = rtcGetGeometryFace(geom,opposite_edge); |
| 1448 | assert(!visited[opposite_face]); |
| 1449 | visited[opposite_face] = true; |
| 1450 | unsigned int next_edge = opposite_edge; |
| 1451 | next_edge = rtcGetGeometryNextHalfEdge(geom,next_edge); |
| 1452 | if (i == 0) right.push_back(next_edge); |
| 1453 | next_edge = rtcGetGeometryNextHalfEdge(geom,next_edge); |
| 1454 | top[i] = next_edge; |
| 1455 | next_edge = rtcGetGeometryNextHalfEdge(geom,next_edge); |
| 1456 | if (i == top.size()-1) left.push_front(next_edge); |
| 1457 | } |
| 1458 | |
| 1459 | return true; |
| 1460 | } |
| 1461 | |
| 1462 | void gather_grid(RTCGeometry geom, avector<Vec3fa>& positions, size_t width, size_t height, unsigned int* indices, avector<Vec3fa>& vertices, unsigned int edgey) |
| 1463 | { |
no test coverage detected