817 const int coarse_face_index)
822 const int ptex_face_inner_resolution = ptex_face_resolution - 2;
823 const int num_inner_vertices_per_ptex = (ptex_face_resolution - 1) * (ptex_face_resolution - 2);
824 const int num_subdiv_vertices_per_coarse_edge = resolution - 2;
827 const int start_vertex_index = center_vertex_index + 1;
830 for (
int corner = 0; corner < coarse_face.
size(); corner++) {
831 const int start_ptex_face_vertex_index = start_vertex_index +
832 corner * num_inner_vertices_per_ptex;
838 start_ptex_face_vertex_index,
839 ptex_face_inner_resolution + 1);
840 for (
int row = 0; row < ptex_face_inner_resolution - 1; row++) {
841 const int start_row_vertex_index = start_ptex_face_vertex_index +
842 row * (ptex_face_inner_resolution + 1);
848 start_row_vertex_index,
849 ptex_face_inner_resolution + 1);
854 start_row_vertex_index +
855 ptex_face_inner_resolution + 1,
856 ptex_face_inner_resolution + 1);
860 for (
int corner = 0; corner < coarse_face.
size(); corner++) {
861 const int next_corner = (corner + 1) % coarse_face.
size();
862 int current_patch_vertex_index = start_vertex_index + corner * num_inner_vertices_per_ptex +
863 ptex_face_inner_resolution;
864 int next_path_vertex_index = start_vertex_index + next_corner * num_inner_vertices_per_ptex +
865 num_inner_vertices_per_ptex - ptex_face_resolution + 1;
866 for (
int row = 0; row < ptex_face_inner_resolution; row++, subdiv_edge_index++) {
867 const int v1 = current_patch_vertex_index;
868 const int v2 = next_path_vertex_index;
871 current_patch_vertex_index += ptex_face_inner_resolution + 1;
872 next_path_vertex_index += 1;
876 if (ptex_face_resolution >= 3) {
877 for (
int corner = 0; corner < coarse_face.
size(); corner++, subdiv_edge_index++) {
878 const int current_patch_end_vertex_index = start_vertex_index +
879 corner * num_inner_vertices_per_ptex +
880 num_inner_vertices_per_ptex - 1;
881 const int v1 = center_vertex_index;
882 const int v2 = current_patch_end_vertex_index;
888 int prev_corner = coarse_face.
size() - 1;
889 for (
int corner = 0; corner < coarse_face.
size(); corner++) {
896 coarse_edge_i * num_subdiv_vertices_per_coarse_edge;
897 const bool flip = (coarse_edge[1] == coarse_vert);
898 int side_start_index;
899 if (ptex_face_resolution >= 3) {
900 side_start_index = start_vertex_index + num_inner_vertices_per_ptex * corner;
903 side_start_index = center_vertex_index;
905 for (
int i = 0;
i < ptex_face_resolution - 1;
i++, subdiv_edge_index++) {
906 const int v1 = (flip) ? (start_edge_vertex + (resolution -
i - 3)) :
907 (start_edge_vertex +
i);
908 const int v2 = side_start_index +
i;
913 if (ptex_face_resolution >= 3) {
916 coarse_prev_edge * num_subdiv_vertices_per_coarse_edge;
917 const bool flip = (coarse_edge[1] == coarse_vert);
918 int side_start_index = start_vertex_index + num_inner_vertices_per_ptex * corner;
919 for (
int i = 0;
i < ptex_face_resolution - 2;
i++, subdiv_edge_index++) {
920 const int v1 = (flip) ? (start_edge_vertex + (resolution -
i - 3)) :
921 (start_edge_vertex +
i);
922 const int v2 = side_start_index + (ptex_face_inner_resolution + 1) *
i;
927 prev_corner = corner;
1077 const int coarse_face_index)
1083 const int ptex_inner_resolution = ptex_resolution - 2;
1084 const int num_subdiv_edges_per_coarse_edge = resolution - 1;
1085 const int num_subdiv_vertices_per_coarse_edge = resolution - 2;
1086 const float inv_ptex_resolution_1 = 1.0f /
float(ptex_resolution - 1);
1092 const int start_loop_index = 4 * start_face_index;
1093 const float du = inv_ptex_resolution_1;
1094 const float dv = inv_ptex_resolution_1;
1096 int subdiv_loop_index = start_loop_index;
1098 for (
int y = 1;
y < ptex_resolution - 2;
y++) {
1099 const float v =
y * inv_ptex_resolution_1;
1100 const int inner_y =
y - 1;
1101 for (
int x = 1;
x < ptex_resolution - 2;
x++, subdiv_loop_index += 4) {
1102 const int inner_x =
x - 1;
1103 const float u =
x * inv_ptex_resolution_1;
1105 const int v0 = start_vertex_index + (inner_y * ptex_inner_resolution + inner_x);
1106 const int v1 = v0 + 1;
1107 const int v2 = v0 + ptex_inner_resolution + 1;
1108 const int v3 = v0 + ptex_inner_resolution;
1110 const int e0 = start_edge_index + (inner_y * (2 * ptex_inner_resolution - 1) + inner_x);
1111 const int e1 = e0 + ptex_inner_resolution;
1112 const int e2 = e0 + (2 * ptex_inner_resolution - 1);
1113 const int e3 = e0 + ptex_inner_resolution - 1;
1137 int prev_corner_index = coarse_face.
size() - 1;
1138 for (
int corner = 0; corner < coarse_face.
size(); corner++) {
1147 coarse_edge_i * num_subdiv_vertices_per_coarse_edge;
1148 const bool flip = (coarse_edge[1] == coarse_vert);
1149 int side_start_index = start_vertex_index;
1150 int side_stride = 0;
1153 int e2_offset, e2_stride;
1154 float u,
v, delta_u, delta_v;
1155 if (coase_prev_vert == prev_coarse_edge[0]) {
1157 num_subdiv_vertices_per_coarse_edge - 1;
1159 num_subdiv_edges_per_coarse_edge - 1;
1175 else if (corner == 1) {
1176 side_start_index += resolution - 3;
1177 side_stride = resolution - 2;
1178 e2_offset = 2 * num_subdiv_edges_per_coarse_edge - 4;
1179 e2_stride = 2 * num_subdiv_edges_per_coarse_edge - 3;
1185 else if (corner == 2) {
1186 side_start_index += num_subdiv_vertices_per_coarse_edge *
1187 num_subdiv_vertices_per_coarse_edge -
1197 else if (corner == 3) {
1198 side_start_index += num_subdiv_vertices_per_coarse_edge *
1199 (num_subdiv_vertices_per_coarse_edge - 1);
1200 side_stride = -(resolution - 2);
1202 (2 * num_subdiv_edges_per_coarse_edge - 3);
1203 e2_stride = -(2 * num_subdiv_edges_per_coarse_edge - 3);
1209 for (
int i = 0;
i < resolution - 2;
i++, subdiv_loop_index += 4) {
1212 v1 = start_edge_vertex + (resolution -
i - 3);
1215 v1 = start_edge_vertex +
i;
1217 const int v2 = side_start_index + side_stride *
i;
1221 num_subdiv_edges_per_coarse_edge -
i - 1;
1227 corner * num_subdiv_vertices_per_coarse_edge +
i;
1231 ((corner - 1 + coarse_face.
size()) % coarse_face.
size()) *
1232 num_subdiv_vertices_per_coarse_edge +
1233 num_subdiv_vertices_per_coarse_edge - 1;
1236 e2 = start_edge_index + e2_offset + e2_stride * (
i - 1);
1239 const float loop_u = u + delta_u *
i;
1240 const float loop_v =
v + delta_v *
i;
1265 prev_corner_index = corner;
1271 const int coarse_face_index)
1277 const int ptex_face_inner_resolution = ptex_face_resolution - 2;
1278 const float inv_ptex_resolution_1 = 1.0f /
float(ptex_face_resolution - 1);
1279 const int num_inner_vertices_per_ptex = (ptex_face_resolution - 1) * (ptex_face_resolution - 2);
1281 ptex_face_inner_resolution + 1);
1282 const int num_subdiv_vertices_per_coarse_edge = resolution - 2;
1283 const int num_subdiv_edges_per_coarse_edge = resolution - 1;
1287 const int start_vertex_index = center_vertex_index + 1;
1288 const int start_inner_vertex_index = center_vertex_index + 1;
1291 const int start_loop_index = 4 * start_face_index;
1292 const float du = inv_ptex_resolution_1;
1293 const float dv = inv_ptex_resolution_1;
1295 int subdiv_loop_index = start_loop_index;
1296 for (
int corner = 0; corner < coarse_face.
size(); corner++) {
1297 const int corner_vertex_index = start_vertex_index + corner * num_inner_vertices_per_ptex;
1298 const int corner_edge_index = start_edge_index + corner * num_inner_edges_per_ptex_face;
1299 for (
int y = 1;
y < ptex_face_inner_resolution;
y++) {
1300 const float v =
y * inv_ptex_resolution_1;
1301 const int inner_y =
y - 1;
1302 for (
int x = 1;
x < ptex_face_inner_resolution + 1;
x++, subdiv_loop_index += 4) {
1303 const int inner_x =
x - 1;
1304 const float u =
x * inv_ptex_resolution_1;
1306 const int v0 = corner_vertex_index +
1307 (inner_y * (ptex_face_inner_resolution + 1) + inner_x);
1308 const int v1 = v0 + 1;
1309 const int v2 = v0 + ptex_face_inner_resolution + 2;
1310 const int v3 = v0 + ptex_face_inner_resolution + 1;
1312 const int e0 = corner_edge_index +
1313 (inner_y * (2 * ptex_face_inner_resolution + 1) + inner_x);
1314 const int e1 = e0 + ptex_face_inner_resolution + 1;
1315 const int e2 = e0 + (2 * ptex_face_inner_resolution + 1);
1316 const int e3 = e0 + ptex_face_inner_resolution;
1320 ptex_face_index + corner,
1340 for (
int corner = 0; corner < coarse_face.
size(); corner++) {
1341 const int next_corner = (corner + 1) % coarse_face.
size();
1342 const int corner_edge_index = start_edge_index + corner * num_inner_edges_per_ptex_face;
1343 const int next_corner_edge_index = start_edge_index +
1344 next_corner * num_inner_edges_per_ptex_face;
1345 int current_patch_vertex_index = start_inner_vertex_index +
1346 corner * num_inner_vertices_per_ptex +
1347 ptex_face_inner_resolution;
1348 int next_path_vertex_index = start_inner_vertex_index +
1349 next_corner * num_inner_vertices_per_ptex +
1350 num_inner_vertices_per_ptex - ptex_face_resolution + 1;
1351 int v0 = current_patch_vertex_index;
1352 int v1 = next_path_vertex_index;
1353 current_patch_vertex_index += ptex_face_inner_resolution + 1;
1354 next_path_vertex_index += 1;
1355 int e0 = start_edge_index + coarse_face.
size() * num_inner_edges_per_ptex_face +
1356 corner * (ptex_face_resolution - 2);
1357 int e1 = next_corner_edge_index + num_inner_edges_per_ptex_face - ptex_face_resolution + 2;
1358 int e3 = corner_edge_index + 2 * ptex_face_resolution - 4;
1359 for (
int row = 1; row < ptex_face_inner_resolution; row++, subdiv_loop_index += 4) {
1360 const int v2 = next_path_vertex_index;
1361 const int v3 = current_patch_vertex_index;
1362 const int e2 = e0 + 1;
1363 const float u = row * du;
1364 const float v = 1.0f - dv;
1368 ptex_face_index + next_corner,
1384 current_patch_vertex_index += ptex_face_inner_resolution + 1;
1385 next_path_vertex_index += 1;
1390 e3 += 2 * ptex_face_resolution - 3;
1394 if (ptex_face_resolution >= 3) {
1395 const int start_center_edge_index = start_edge_index + (num_inner_edges_per_ptex_face +
1396 ptex_face_inner_resolution) *
1398 const int start_boundary_edge = start_edge_index +
1399 coarse_face.
size() * num_inner_edges_per_ptex_face +
1400 ptex_face_inner_resolution - 1;
1401 for (
int corner = 0, prev_corner = coarse_face.
size() - 1; corner < coarse_face.
size();
1402 prev_corner = corner, corner++, subdiv_loop_index += 4)
1404 const int corner_edge_index = start_edge_index + corner * num_inner_edges_per_ptex_face;
1405 const int current_patch_end_vertex_index = start_vertex_index +
1406 corner * num_inner_vertices_per_ptex +
1407 num_inner_vertices_per_ptex - 1;
1408 const int prev_current_patch_end_vertex_index = start_vertex_index +
1409 prev_corner * num_inner_vertices_per_ptex +
1410 num_inner_vertices_per_ptex - 1;
1411 const int v0 = center_vertex_index;
1412 const int v1 = prev_current_patch_end_vertex_index;
1413 const int v2 = current_patch_end_vertex_index - 1;
1414 const int v3 = current_patch_end_vertex_index;
1415 const int e0 = start_center_edge_index + prev_corner;
1416 const int e1 = start_boundary_edge + prev_corner * (ptex_face_inner_resolution);
1417 const int e2 = corner_edge_index + num_inner_edges_per_ptex_face - 1;
1418 const int e3 = start_center_edge_index + corner;
1419 const float u = 1.0f - du;
1420 const float v = 1.0f - dv;
1424 ptex_face_index + corner,
1443 for (
int prev_corner = coarse_face.
size() - 1, corner = 0; corner < coarse_face.
size();
1444 prev_corner = corner, corner++)
1453 const bool flip = (coarse_edge[1] == coarse_vert);
1455 coarse_edge_i * num_subdiv_vertices_per_coarse_edge;
1456 const int corner_vertex_index = start_vertex_index + corner * num_inner_vertices_per_ptex;
1457 const int corner_edge_index = start_edge_index + corner * num_inner_edges_per_ptex_face;
1461 if (coase_prev_vert == prev_coarse_edge[0]) {
1463 num_subdiv_vertices_per_coarse_edge - 1;
1465 num_subdiv_edges_per_coarse_edge - 1;
1471 for (
int i = 0;
i <= ptex_face_inner_resolution;
i++, subdiv_loop_index += 4) {
1474 v1 = start_edge_vertex + (resolution -
i - 3);
1477 v1 = start_edge_vertex +
i;
1480 if (ptex_face_inner_resolution >= 1) {
1481 v2 = corner_vertex_index +
i;
1484 v2 = center_vertex_index;
1489 num_subdiv_edges_per_coarse_edge -
i - 1;
1494 int e1 = start_edge_index + corner * (2 * ptex_face_inner_resolution + 1);
1495 if (ptex_face_resolution >= 3) {
1496 e1 += coarse_face.
size() *
1497 (num_inner_edges_per_ptex_face + ptex_face_inner_resolution + 1) +
1501 if (
i == 0 && ptex_face_resolution >= 3) {
1502 e2 = start_edge_index +
1503 coarse_face.
size() *
1504 (num_inner_edges_per_ptex_face + ptex_face_inner_resolution + 1) +
1505 corner * (2 * ptex_face_inner_resolution + 1) + ptex_face_inner_resolution + 1;
1507 else if (
i == 0 && ptex_face_resolution < 3) {
1508 e2 = start_edge_index + prev_corner * (2 * ptex_face_inner_resolution + 1);
1511 e2 = corner_edge_index +
i - 1;
1513 const float u = du *
i;
1514 const float v = 0.0f;
1518 ptex_face_index + corner,
1539 const bool flip_prev = (prev_coarse_edge[1] == coarse_vert);
1540 v0 = corner_vertex_index;
1541 if (coase_prev_vert == prev_coarse_edge[0]) {
1543 num_subdiv_vertices_per_coarse_edge - 1;
1548 e3 = start_edge_index +
1549 coarse_face.
size() * (num_inner_edges_per_ptex_face + ptex_face_inner_resolution + 1) +
1550 corner * (2 * ptex_face_inner_resolution + 1) + ptex_face_inner_resolution + 1;
1551 for (
int i = 0;
i <= ptex_face_inner_resolution - 1;
i++, subdiv_loop_index += 4) {
1554 if (
i == ptex_face_inner_resolution - 1) {
1555 v1 = start_vertex_index + prev_corner * num_inner_vertices_per_ptex +
1556 ptex_face_inner_resolution;
1557 e1 = start_edge_index +
1558 coarse_face.
size() *
1559 (num_inner_edges_per_ptex_face + ptex_face_inner_resolution + 1) +
1560 prev_corner * (2 * ptex_face_inner_resolution + 1) + ptex_face_inner_resolution;
1561 e0 = start_edge_index + coarse_face.
size() * num_inner_edges_per_ptex_face +
1562 prev_corner * ptex_face_inner_resolution;
1565 v1 = v0 + ptex_face_inner_resolution + 1;
1566 e0 = corner_edge_index + ptex_face_inner_resolution +
1567 i * (2 * ptex_face_inner_resolution + 1);
1570 int v2 = flip_prev ? v3 - 1 : v3 + 1;
1574 num_subdiv_edges_per_coarse_edge - 2 -
i;
1580 const float u = 0.0f;
1581 const float v = du * (
i + 1);
1585 ptex_face_index + corner,