Skip to content

Commit 8b82918

Browse files
Jiali Duanfacebook-github-bot
Jiali Duan
authored andcommitted
Marching Cubes cuda extension
Summary: Torch CUDA extension for Marching Cubes - MC involving 3 steps: - 1st forward pass to collect vertices and occupied state for each voxel - Compute compactVoxelArray to skip non-empty voxels - 2nd pass to genereate interpolated vertex positions and faces by marching through the grid - In contrast to existing MC: - Bind each interpolated vertex with a global edge_id to address floating-point precision - Added deduplication process to remove redundant vertices and faces Benchmarks (ms): | N / V(^3) | python | C++ | CUDA | Speedup | | 2 / 20 | 12176873 | 24338 | 4363 | 2790x/5x| | 1 / 100 | - | 3070511 | 27126 | 113x | | 2 / 100 | - | 5968934 | 53129 | 112x | | 1 / 256 | - | 61278092 | 430900 | 142x | | 2 / 256 | - |125687930 | 856941 | 146x | Reviewed By: kjchalup Differential Revision: D39644248 fbshipit-source-id: d679c0c79d67b98b235d12296f383d760a00042a
1 parent 9a0b0c2 commit 8b82918

File tree

8 files changed

+922
-347
lines changed

8 files changed

+922
-347
lines changed

pytorch3d/csrc/marching_cubes/marching_cubes.cu

+559
Large diffs are not rendered by default.

pytorch3d/csrc/marching_cubes/marching_cubes.h

+27-4
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,40 @@
2323
// the points are within a volume.
2424
//
2525
// Returns:
26-
// vertices: List of N FloatTensors of vertices
27-
// faces: List of N LongTensors of faces
26+
// vertices: (N_verts, 3) FloatTensor of vertices
27+
// faces: (N_faces, 3) LongTensor of faces
28+
// ids: (N_verts,) LongTensor used to identify each vertex and deduplication
29+
// to avoid floating point precision issues.
30+
// For Cuda, will be used to dedupe redundant vertices.
31+
// For cpp implementation, this tensor is just a placeholder.
2832

2933
// CPU implementation
30-
std::tuple<at::Tensor, at::Tensor> MarchingCubesCpu(
34+
std::tuple<at::Tensor, at::Tensor, at::Tensor> MarchingCubesCpu(
35+
const at::Tensor& vol,
36+
const float isolevel);
37+
38+
// CUDA implementation
39+
std::tuple<at::Tensor, at::Tensor, at::Tensor> MarchingCubesCuda(
3140
const at::Tensor& vol,
3241
const float isolevel);
3342

3443
// Implementation which is exposed
35-
inline std::tuple<at::Tensor, at::Tensor> MarchingCubes(
44+
inline std::tuple<at::Tensor, at::Tensor, at::Tensor> MarchingCubes(
3645
const at::Tensor& vol,
3746
const float isolevel) {
47+
if (vol.is_cuda()) {
48+
#ifdef WITH_CUDA
49+
CHECK_CUDA(vol);
50+
const int D = vol.size(0);
51+
const int H = vol.size(1);
52+
const int W = vol.size(2);
53+
if (D > 1024 || H > 1024 || W > 1024) {
54+
AT_ERROR("Maximum volume size allowed 1K x 1K x 1K");
55+
}
56+
return MarchingCubesCuda(vol.contiguous(), isolevel);
57+
#else
58+
AT_ERROR("Not compiled with GPU support.");
59+
#endif
60+
}
3861
return MarchingCubesCpu(vol.contiguous(), isolevel);
3962
}

pytorch3d/csrc/marching_cubes/marching_cubes_cpu.cpp

+9-6
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <unordered_map>
1414
#include <vector>
1515
#include "marching_cubes/marching_cubes_utils.h"
16+
#include "marching_cubes/tables.h"
1617

1718
// Cpu implementation for Marching Cubes
1819
// Args:
@@ -21,10 +22,11 @@
2122
// whether points are within a volume.
2223
//
2324
// Returns:
24-
// vertices: a float tensor of shape (N, 3) for positions of the mesh
25-
// faces: a long tensor of shape (N, 3) for indices of the face vertices
25+
// vertices: a float tensor of shape (N_verts, 3) for positions of the mesh
26+
// faces: a long tensor of shape (N_faces, 3) for indices of the face
27+
// ids: a long tensor of shape (N_verts) as placeholder
2628
//
27-
std::tuple<at::Tensor, at::Tensor> MarchingCubesCpu(
29+
std::tuple<at::Tensor, at::Tensor, at::Tensor> MarchingCubesCpu(
2830
const at::Tensor& vol,
2931
const float isolevel) {
3032
// volume shapes
@@ -48,7 +50,7 @@ std::tuple<at::Tensor, at::Tensor> MarchingCubesCpu(
4850
for (int x = 0; x < W - 1; x++) {
4951
Cube cube(x, y, z, vol_a, isolevel);
5052
// Cube is entirely in/out of the surface
51-
if (_FACE_TABLE[cube.cubeindex][0] == -1) {
53+
if (_FACE_TABLE[cube.cubeindex][0] == 255) {
5254
continue;
5355
}
5456
// store all boundary vertices that intersect with the edges
@@ -58,7 +60,7 @@ std::tuple<at::Tensor, at::Tensor> MarchingCubesCpu(
5860
std::vector<Vertex> ps;
5961

6062
// Interpolate the vertices where the surface intersects with the cube
61-
for (int j = 0; _FACE_TABLE[cube.cubeindex][j] != -1; j++) {
63+
for (int j = 0; _FACE_TABLE[cube.cubeindex][j] != 255; j++) {
6264
const int e = _FACE_TABLE[cube.cubeindex][j];
6365
interp_points[e] = cube.VertexInterp(isolevel, e, vol_a);
6466

@@ -95,6 +97,7 @@ std::tuple<at::Tensor, at::Tensor> MarchingCubesCpu(
9597
const int n_vertices = verts.size();
9698
const int64_t n_faces = (int64_t)faces.size() / 3;
9799
auto vert_tensor = torch::zeros({n_vertices, 3}, torch::kFloat);
100+
auto id_tensor = torch::zeros({n_vertices}, torch::kInt64); // placeholder
98101
auto face_tensor = torch::zeros({n_faces, 3}, torch::kInt64);
99102

100103
auto vert_a = vert_tensor.accessor<float, 2>();
@@ -111,5 +114,5 @@ std::tuple<at::Tensor, at::Tensor> MarchingCubesCpu(
111114
face_a[i][2] = faces.at(i * 3 + 2);
112115
}
113116

114-
return std::make_tuple(vert_tensor, face_tensor);
117+
return std::make_tuple(vert_tensor, face_tensor, id_tensor);
115118
}

pytorch3d/csrc/marching_cubes/marching_cubes_utils.h

+1-281
Large diffs are not rendered by default.
+294
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,294 @@
1+
/*
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the BSD-style license found in the
6+
* LICENSE file in the root directory of this source tree.
7+
*/
8+
9+
#pragma once
10+
using uint = unsigned int;
11+
12+
// A table mapping from cubeindex to a list of face configurations.
13+
// Each list contains at most 5 faces, where each face is represented with
14+
// 3 consecutive numbers
15+
// Table adapted from http://paulbourke.net/geometry/polygonise/
16+
//
17+
#define X 255
18+
const unsigned char _FACE_TABLE[256][16] = {
19+
{X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X},
20+
{0, 8, 3, X, X, X, X, X, X, X, X, X, X, X, X, X},
21+
{0, 1, 9, X, X, X, X, X, X, X, X, X, X, X, X, X},
22+
{1, 8, 3, 9, 8, 1, X, X, X, X, X, X, X, X, X, X},
23+
{1, 2, 10, X, X, X, X, X, X, X, X, X, X, X, X, X},
24+
{0, 8, 3, 1, 2, 10, X, X, X, X, X, X, X, X, X, X},
25+
{9, 2, 10, 0, 2, 9, X, X, X, X, X, X, X, X, X, X},
26+
{2, 8, 3, 2, 10, 8, 10, 9, 8, X, X, X, X, X, X, X},
27+
{3, 11, 2, X, X, X, X, X, X, X, X, X, X, X, X, X},
28+
{0, 11, 2, 8, 11, 0, X, X, X, X, X, X, X, X, X, X},
29+
{1, 9, 0, 2, 3, 11, X, X, X, X, X, X, X, X, X, X},
30+
{1, 11, 2, 1, 9, 11, 9, 8, 11, X, X, X, X, X, X, X},
31+
{3, 10, 1, 11, 10, 3, X, X, X, X, X, X, X, X, X, X},
32+
{0, 10, 1, 0, 8, 10, 8, 11, 10, X, X, X, X, X, X, X},
33+
{3, 9, 0, 3, 11, 9, 11, 10, 9, X, X, X, X, X, X, X},
34+
{9, 8, 10, 10, 8, 11, X, X, X, X, X, X, X, X, X, X},
35+
{4, 7, 8, X, X, X, X, X, X, X, X, X, X, X, X, X},
36+
{4, 3, 0, 7, 3, 4, X, X, X, X, X, X, X, X, X, X},
37+
{0, 1, 9, 8, 4, 7, X, X, X, X, X, X, X, X, X, X},
38+
{4, 1, 9, 4, 7, 1, 7, 3, 1, X, X, X, X, X, X, X},
39+
{1, 2, 10, 8, 4, 7, X, X, X, X, X, X, X, X, X, X},
40+
{3, 4, 7, 3, 0, 4, 1, 2, 10, X, X, X, X, X, X, X},
41+
{9, 2, 10, 9, 0, 2, 8, 4, 7, X, X, X, X, X, X, X},
42+
{2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, X, X, X, X},
43+
{8, 4, 7, 3, 11, 2, X, X, X, X, X, X, X, X, X, X},
44+
{11, 4, 7, 11, 2, 4, 2, 0, 4, X, X, X, X, X, X, X},
45+
{9, 0, 1, 8, 4, 7, 2, 3, 11, X, X, X, X, X, X, X},
46+
{4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, X, X, X, X},
47+
{3, 10, 1, 3, 11, 10, 7, 8, 4, X, X, X, X, X, X, X},
48+
{1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, X, X, X, X},
49+
{4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, X, X, X, X},
50+
{4, 7, 11, 4, 11, 9, 9, 11, 10, X, X, X, X, X, X, X},
51+
{9, 5, 4, X, X, X, X, X, X, X, X, X, X, X, X, X},
52+
{9, 5, 4, 0, 8, 3, X, X, X, X, X, X, X, X, X, X},
53+
{0, 5, 4, 1, 5, 0, X, X, X, X, X, X, X, X, X, X},
54+
{8, 5, 4, 8, 3, 5, 3, 1, 5, X, X, X, X, X, X, X},
55+
{1, 2, 10, 9, 5, 4, X, X, X, X, X, X, X, X, X, X},
56+
{3, 0, 8, 1, 2, 10, 4, 9, 5, X, X, X, X, X, X, X},
57+
{5, 2, 10, 5, 4, 2, 4, 0, 2, X, X, X, X, X, X, X},
58+
{2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, X, X, X, X},
59+
{9, 5, 4, 2, 3, 11, X, X, X, X, X, X, X, X, X, X},
60+
{0, 11, 2, 0, 8, 11, 4, 9, 5, X, X, X, X, X, X, X},
61+
{0, 5, 4, 0, 1, 5, 2, 3, 11, X, X, X, X, X, X, X},
62+
{2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, X, X, X, X},
63+
{10, 3, 11, 10, 1, 3, 9, 5, 4, X, X, X, X, X, X, X},
64+
{4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, X, X, X, X},
65+
{5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, X, X, X, X},
66+
{5, 4, 8, 5, 8, 10, 10, 8, 11, X, X, X, X, X, X, X},
67+
{9, 7, 8, 5, 7, 9, X, X, X, X, X, X, X, X, X, X},
68+
{9, 3, 0, 9, 5, 3, 5, 7, 3, X, X, X, X, X, X, X},
69+
{0, 7, 8, 0, 1, 7, 1, 5, 7, X, X, X, X, X, X, X},
70+
{1, 5, 3, 3, 5, 7, X, X, X, X, X, X, X, X, X, X},
71+
{9, 7, 8, 9, 5, 7, 10, 1, 2, X, X, X, X, X, X, X},
72+
{10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, X, X, X, X},
73+
{8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, X, X, X, X},
74+
{2, 10, 5, 2, 5, 3, 3, 5, 7, X, X, X, X, X, X, X},
75+
{7, 9, 5, 7, 8, 9, 3, 11, 2, X, X, X, X, X, X, X},
76+
{9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, X, X, X, X},
77+
{2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, X, X, X, X},
78+
{11, 2, 1, 11, 1, 7, 7, 1, 5, X, X, X, X, X, X, X},
79+
{9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, X, X, X, X},
80+
{5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, X},
81+
{11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, X},
82+
{11, 10, 5, 7, 11, 5, X, X, X, X, X, X, X, X, X, X},
83+
{10, 6, 5, X, X, X, X, X, X, X, X, X, X, X, X, X},
84+
{0, 8, 3, 5, 10, 6, X, X, X, X, X, X, X, X, X, X},
85+
{9, 0, 1, 5, 10, 6, X, X, X, X, X, X, X, X, X, X},
86+
{1, 8, 3, 1, 9, 8, 5, 10, 6, X, X, X, X, X, X, X},
87+
{1, 6, 5, 2, 6, 1, X, X, X, X, X, X, X, X, X, X},
88+
{1, 6, 5, 1, 2, 6, 3, 0, 8, X, X, X, X, X, X, X},
89+
{9, 6, 5, 9, 0, 6, 0, 2, 6, X, X, X, X, X, X, X},
90+
{5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, X, X, X, X},
91+
{2, 3, 11, 10, 6, 5, X, X, X, X, X, X, X, X, X, X},
92+
{11, 0, 8, 11, 2, 0, 10, 6, 5, X, X, X, X, X, X, X},
93+
{0, 1, 9, 2, 3, 11, 5, 10, 6, X, X, X, X, X, X, X},
94+
{5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, X, X, X, X},
95+
{6, 3, 11, 6, 5, 3, 5, 1, 3, X, X, X, X, X, X, X},
96+
{0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, X, X, X, X},
97+
{3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, X, X, X, X},
98+
{6, 5, 9, 6, 9, 11, 11, 9, 8, X, X, X, X, X, X, X},
99+
{5, 10, 6, 4, 7, 8, X, X, X, X, X, X, X, X, X, X},
100+
{4, 3, 0, 4, 7, 3, 6, 5, 10, X, X, X, X, X, X, X},
101+
{1, 9, 0, 5, 10, 6, 8, 4, 7, X, X, X, X, X, X, X},
102+
{10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, X, X, X, X},
103+
{6, 1, 2, 6, 5, 1, 4, 7, 8, X, X, X, X, X, X, X},
104+
{1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, X, X, X, X},
105+
{8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, X, X, X, X},
106+
{7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, X},
107+
{3, 11, 2, 7, 8, 4, 10, 6, 5, X, X, X, X, X, X, X},
108+
{5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, X, X, X, X},
109+
{0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, X, X, X, X},
110+
{9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, X},
111+
{8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, X, X, X, X},
112+
{5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, X},
113+
{0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, X},
114+
{6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, X, X, X, X},
115+
{10, 4, 9, 6, 4, 10, X, X, X, X, X, X, X, X, X, X},
116+
{4, 10, 6, 4, 9, 10, 0, 8, 3, X, X, X, X, X, X, X},
117+
{10, 0, 1, 10, 6, 0, 6, 4, 0, X, X, X, X, X, X, X},
118+
{8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, X, X, X, X},
119+
{1, 4, 9, 1, 2, 4, 2, 6, 4, X, X, X, X, X, X, X},
120+
{3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, X, X, X, X},
121+
{0, 2, 4, 4, 2, 6, X, X, X, X, X, X, X, X, X, X},
122+
{8, 3, 2, 8, 2, 4, 4, 2, 6, X, X, X, X, X, X, X},
123+
{10, 4, 9, 10, 6, 4, 11, 2, 3, X, X, X, X, X, X, X},
124+
{0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, X, X, X, X},
125+
{3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, X, X, X, X},
126+
{6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, X},
127+
{9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, X, X, X, X},
128+
{8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, X},
129+
{3, 11, 6, 3, 6, 0, 0, 6, 4, X, X, X, X, X, X, X},
130+
{6, 4, 8, 11, 6, 8, X, X, X, X, X, X, X, X, X, X},
131+
{7, 10, 6, 7, 8, 10, 8, 9, 10, X, X, X, X, X, X, X},
132+
{0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, X, X, X, X},
133+
{10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, X, X, X, X},
134+
{10, 6, 7, 10, 7, 1, 1, 7, 3, X, X, X, X, X, X, X},
135+
{1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, X, X, X, X},
136+
{2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, X},
137+
{7, 8, 0, 7, 0, 6, 6, 0, 2, X, X, X, X, X, X, X},
138+
{7, 3, 2, 6, 7, 2, X, X, X, X, X, X, X, X, X, X},
139+
{2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, X, X, X, X},
140+
{2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, X},
141+
{1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, X},
142+
{11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, X, X, X, X},
143+
{8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, X},
144+
{0, 9, 1, 11, 6, 7, X, X, X, X, X, X, X, X, X, X},
145+
{7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, X, X, X, X},
146+
{7, 11, 6, X, X, X, X, X, X, X, X, X, X, X, X, X},
147+
{7, 6, 11, X, X, X, X, X, X, X, X, X, X, X, X, X},
148+
{3, 0, 8, 11, 7, 6, X, X, X, X, X, X, X, X, X, X},
149+
{0, 1, 9, 11, 7, 6, X, X, X, X, X, X, X, X, X, X},
150+
{8, 1, 9, 8, 3, 1, 11, 7, 6, X, X, X, X, X, X, X},
151+
{10, 1, 2, 6, 11, 7, X, X, X, X, X, X, X, X, X, X},
152+
{1, 2, 10, 3, 0, 8, 6, 11, 7, X, X, X, X, X, X, X},
153+
{2, 9, 0, 2, 10, 9, 6, 11, 7, X, X, X, X, X, X, X},
154+
{6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, X, X, X, X},
155+
{7, 2, 3, 6, 2, 7, X, X, X, X, X, X, X, X, X, X},
156+
{7, 0, 8, 7, 6, 0, 6, 2, 0, X, X, X, X, X, X, X},
157+
{2, 7, 6, 2, 3, 7, 0, 1, 9, X, X, X, X, X, X, X},
158+
{1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, X, X, X, X},
159+
{10, 7, 6, 10, 1, 7, 1, 3, 7, X, X, X, X, X, X, X},
160+
{10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, X, X, X, X},
161+
{0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, X, X, X, X},
162+
{7, 6, 10, 7, 10, 8, 8, 10, 9, X, X, X, X, X, X, X},
163+
{6, 8, 4, 11, 8, 6, X, X, X, X, X, X, X, X, X, X},
164+
{3, 6, 11, 3, 0, 6, 0, 4, 6, X, X, X, X, X, X, X},
165+
{8, 6, 11, 8, 4, 6, 9, 0, 1, X, X, X, X, X, X, X},
166+
{9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, X, X, X, X},
167+
{6, 8, 4, 6, 11, 8, 2, 10, 1, X, X, X, X, X, X, X},
168+
{1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, X, X, X, X},
169+
{4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, X, X, X, X},
170+
{10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, X},
171+
{8, 2, 3, 8, 4, 2, 4, 6, 2, X, X, X, X, X, X, X},
172+
{0, 4, 2, 4, 6, 2, X, X, X, X, X, X, X, X, X, X},
173+
{1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, X, X, X, X},
174+
{1, 9, 4, 1, 4, 2, 2, 4, 6, X, X, X, X, X, X, X},
175+
{8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, X, X, X, X},
176+
{10, 1, 0, 10, 0, 6, 6, 0, 4, X, X, X, X, X, X, X},
177+
{4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, X},
178+
{10, 9, 4, 6, 10, 4, X, X, X, X, X, X, X, X, X, X},
179+
{4, 9, 5, 7, 6, 11, X, X, X, X, X, X, X, X, X, X},
180+
{0, 8, 3, 4, 9, 5, 11, 7, 6, X, X, X, X, X, X, X},
181+
{5, 0, 1, 5, 4, 0, 7, 6, 11, X, X, X, X, X, X, X},
182+
{11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, X, X, X, X},
183+
{9, 5, 4, 10, 1, 2, 7, 6, 11, X, X, X, X, X, X, X},
184+
{6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, X, X, X, X},
185+
{7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, X, X, X, X},
186+
{3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, X},
187+
{7, 2, 3, 7, 6, 2, 5, 4, 9, X, X, X, X, X, X, X},
188+
{9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, X, X, X, X},
189+
{3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, X, X, X, X},
190+
{6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, X},
191+
{9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, X, X, X, X},
192+
{1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, X},
193+
{4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, X},
194+
{7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, X, X, X, X},
195+
{6, 9, 5, 6, 11, 9, 11, 8, 9, X, X, X, X, X, X, X},
196+
{3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, X, X, X, X},
197+
{0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, X, X, X, X},
198+
{6, 11, 3, 6, 3, 5, 5, 3, 1, X, X, X, X, X, X, X},
199+
{1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, X, X, X, X},
200+
{0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, X},
201+
{11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, X},
202+
{6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, X, X, X, X},
203+
{5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, X, X, X, X},
204+
{9, 5, 6, 9, 6, 0, 0, 6, 2, X, X, X, X, X, X, X},
205+
{1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, X},
206+
{1, 5, 6, 2, 1, 6, X, X, X, X, X, X, X, X, X, X},
207+
{1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, X},
208+
{10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, X, X, X, X},
209+
{0, 3, 8, 5, 6, 10, X, X, X, X, X, X, X, X, X, X},
210+
{10, 5, 6, X, X, X, X, X, X, X, X, X, X, X, X, X},
211+
{11, 5, 10, 7, 5, 11, X, X, X, X, X, X, X, X, X, X},
212+
{11, 5, 10, 11, 7, 5, 8, 3, 0, X, X, X, X, X, X, X},
213+
{5, 11, 7, 5, 10, 11, 1, 9, 0, X, X, X, X, X, X, X},
214+
{10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, X, X, X, X},
215+
{11, 1, 2, 11, 7, 1, 7, 5, 1, X, X, X, X, X, X, X},
216+
{0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, X, X, X, X},
217+
{9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, X, X, X, X},
218+
{7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, X},
219+
{2, 5, 10, 2, 3, 5, 3, 7, 5, X, X, X, X, X, X, X},
220+
{8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, X, X, X, X},
221+
{9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, X, X, X, X},
222+
{9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, X},
223+
{1, 3, 5, 3, 7, 5, X, X, X, X, X, X, X, X, X, X},
224+
{0, 8, 7, 0, 7, 1, 1, 7, 5, X, X, X, X, X, X, X},
225+
{9, 0, 3, 9, 3, 5, 5, 3, 7, X, X, X, X, X, X, X},
226+
{9, 8, 7, 5, 9, 7, X, X, X, X, X, X, X, X, X, X},
227+
{5, 8, 4, 5, 10, 8, 10, 11, 8, X, X, X, X, X, X, X},
228+
{5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, X, X, X, X},
229+
{0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, X, X, X, X},
230+
{10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, X},
231+
{2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, X, X, X, X},
232+
{0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, X},
233+
{0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, X},
234+
{9, 4, 5, 2, 11, 3, X, X, X, X, X, X, X, X, X, X},
235+
{2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, X, X, X, X},
236+
{5, 10, 2, 5, 2, 4, 4, 2, 0, X, X, X, X, X, X, X},
237+
{3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, X},
238+
{5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, X, X, X, X},
239+
{8, 4, 5, 8, 5, 3, 3, 5, 1, X, X, X, X, X, X, X},
240+
{0, 4, 5, 1, 0, 5, X, X, X, X, X, X, X, X, X, X},
241+
{8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, X, X, X, X},
242+
{9, 4, 5, X, X, X, X, X, X, X, X, X, X, X, X, X},
243+
{4, 11, 7, 4, 9, 11, 9, 10, 11, X, X, X, X, X, X, X},
244+
{0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, X, X, X, X},
245+
{1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, X, X, X, X},
246+
{3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, X},
247+
{4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, X, X, X, X},
248+
{9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, X},
249+
{11, 7, 4, 11, 4, 2, 2, 4, 0, X, X, X, X, X, X, X},
250+
{11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, X, X, X, X},
251+
{2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, X, X, X, X},
252+
{9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, X},
253+
{3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, X},
254+
{1, 10, 2, 8, 7, 4, X, X, X, X, X, X, X, X, X, X},
255+
{4, 9, 1, 4, 1, 7, 7, 1, 3, X, X, X, X, X, X, X},
256+
{4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, X, X, X, X},
257+
{4, 0, 3, 7, 4, 3, X, X, X, X, X, X, X, X, X, X},
258+
{4, 8, 7, X, X, X, X, X, X, X, X, X, X, X, X, X},
259+
{9, 10, 8, 10, 11, 8, X, X, X, X, X, X, X, X, X, X},
260+
{3, 0, 9, 3, 9, 11, 11, 9, 10, X, X, X, X, X, X, X},
261+
{0, 1, 10, 0, 10, 8, 8, 10, 11, X, X, X, X, X, X, X},
262+
{3, 1, 10, 11, 3, 10, X, X, X, X, X, X, X, X, X, X},
263+
{1, 2, 11, 1, 11, 9, 9, 11, 8, X, X, X, X, X, X, X},
264+
{3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, X, X, X, X},
265+
{0, 2, 11, 8, 0, 11, X, X, X, X, X, X, X, X, X, X},
266+
{3, 2, 11, X, X, X, X, X, X, X, X, X, X, X, X, X},
267+
{2, 3, 8, 2, 8, 10, 10, 8, 9, X, X, X, X, X, X, X},
268+
{9, 10, 2, 0, 9, 2, X, X, X, X, X, X, X, X, X, X},
269+
{2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, X, X, X, X},
270+
{1, 10, 2, X, X, X, X, X, X, X, X, X, X, X, X, X},
271+
{1, 3, 8, 9, 1, 8, X, X, X, X, X, X, X, X, X, X},
272+
{0, 9, 1, X, X, X, X, X, X, X, X, X, X, X, X, X},
273+
{0, 3, 8, X, X, X, X, X, X, X, X, X, X, X, X, X},
274+
{X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X}};
275+
#undef X
276+
277+
// Table mapping each edge to the corresponding cube vertices offsets
278+
const uint _EDGE_TO_VERTICES[12][2] = {
279+
{0, 1},
280+
{1, 5},
281+
{4, 5},
282+
{0, 4},
283+
{2, 3},
284+
{3, 7},
285+
{6, 7},
286+
{2, 6},
287+
{0, 2},
288+
{1, 3},
289+
{5, 7},
290+
{4, 6},
291+
};
292+
293+
// Table mapping from 0-7 to v0-v7 in cube.vertices
294+
const int _INDEX_TABLE[8] = {0, 1, 5, 4, 2, 3, 7, 6};

0 commit comments

Comments
 (0)