• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Razakhel / RaZ / 16724994103

04 Aug 2025 01:47PM UTC coverage: 74.615% (+0.02%) from 74.593%
16724994103

push

github

Razakhel
[Data/MarchingCubes] Parallelized the marching cubes implementation

- For a 512x512x512 grid created from 3D Perlin noise, this speeds up the marching cubes algorithm by ~20%

32 of 33 new or added lines in 1 file covered. (96.97%)

4 existing lines in 2 files now uncovered.

8327 of 11160 relevant lines covered (74.61%)

1750.91 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

95.56
/src/RaZ/Data/MarchingCubes.cpp
1
#include "RaZ/Data/Grid3.hpp"
2
#include "RaZ/Data/MarchingCubes.hpp"
3
#include "RaZ/Data/Mesh.hpp"
4
#include "RaZ/Utils/Threading.hpp"
5

6
#include "tracy/Tracy.hpp"
7

8
#include <numeric>
9

10
namespace Raz {
11

12
namespace {
13

14
// TODO: the middle & back points should have a negative Z coordinate, but follows the configuration used for now
15
constexpr std::array<Vec3f, 12> edgeVertices = {
16
  Vec3f(0.5f, 0.f,  0.f),  // Bottom front
17
  Vec3f(1.f,  0.5f, 0.f),  // Right front
18
  Vec3f(0.5f, 1.f,  0.f),  // Top front
19
  Vec3f(0.f,  0.5f, 0.f),  // Left front
20
  Vec3f(0.f,  0.f,  0.5f), // Bottom left
21
  Vec3f(1.f,  0.f,  0.5f), // Bottom right
22
  Vec3f(1.f,  1.f,  0.5f), // Top right
23
  Vec3f(0.f,  1.f,  0.5f), // Top left
24
  Vec3f(0.5f, 0.f,  1.f),  // Bottom back
25
  Vec3f(1.f,  0.5f, 1.f),  // Right back
26
  Vec3f(0.5f, 1.f,  1.f),  // Top back
27
  Vec3f(0.f,  0.5f, 1.f)   // Left back
28
};
29

30
enum VertexPosition {
31
  NONE         = -1,
32
  BOTTOM_FRONT = 0,
33
  RIGHT_FRONT  = 1,
34
  TOP_FRONT    = 2,
35
  LEFT_FRONT   = 3,
36
  BOTTOM_LEFT  = 4,
37
  BOTTOM_RIGHT = 5,
38
  TOP_RIGHT    = 6,
39
  TOP_LEFT     = 7,
40
  BOTTOM_BACK  = 8,
41
  RIGHT_BACK   = 9,
42
  TOP_BACK     = 10,
43
  LEFT_BACK    = 11
44
};
45

46
// Table adapted from https://paulbourke.net/geometry/polygonise/
47
constexpr std::array<std::array<int8_t, 15>, 256> trianglesIndices = {{
48
  { NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
49
  { BOTTOM_BACK, LEFT_BACK, BOTTOM_LEFT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
50
  { BOTTOM_BACK, BOTTOM_RIGHT, RIGHT_BACK, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
51
  { BOTTOM_RIGHT, LEFT_BACK, BOTTOM_LEFT, RIGHT_BACK, LEFT_BACK, BOTTOM_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
52
  { BOTTOM_RIGHT, BOTTOM_FRONT, RIGHT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
53
  { BOTTOM_BACK, LEFT_BACK, BOTTOM_LEFT, BOTTOM_RIGHT, BOTTOM_FRONT, RIGHT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
54
  { RIGHT_BACK, BOTTOM_FRONT, RIGHT_FRONT, BOTTOM_BACK, BOTTOM_FRONT, RIGHT_BACK, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
55
  { BOTTOM_FRONT, LEFT_BACK, BOTTOM_LEFT, BOTTOM_FRONT, RIGHT_FRONT, LEFT_BACK, RIGHT_FRONT, RIGHT_BACK, LEFT_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
56
  { BOTTOM_LEFT, LEFT_FRONT, BOTTOM_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
57
  { BOTTOM_BACK, LEFT_FRONT, BOTTOM_FRONT, LEFT_BACK, LEFT_FRONT, BOTTOM_BACK, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
58
  { BOTTOM_RIGHT, RIGHT_BACK, BOTTOM_BACK, BOTTOM_FRONT, BOTTOM_LEFT, LEFT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
59
  { BOTTOM_RIGHT, LEFT_FRONT, BOTTOM_FRONT, BOTTOM_RIGHT, RIGHT_BACK, LEFT_FRONT, RIGHT_BACK, LEFT_BACK, LEFT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
60
  { BOTTOM_LEFT, RIGHT_FRONT, BOTTOM_RIGHT, LEFT_FRONT, RIGHT_FRONT, BOTTOM_LEFT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
61
  { BOTTOM_BACK, RIGHT_FRONT, BOTTOM_RIGHT, BOTTOM_BACK, LEFT_BACK, RIGHT_FRONT, LEFT_BACK, LEFT_FRONT, RIGHT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
62
  { BOTTOM_LEFT, RIGHT_BACK, BOTTOM_BACK, BOTTOM_LEFT, LEFT_FRONT, RIGHT_BACK, LEFT_FRONT, RIGHT_FRONT, RIGHT_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
63
  { RIGHT_BACK, LEFT_BACK, RIGHT_FRONT, RIGHT_FRONT, LEFT_BACK, LEFT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
64
  { TOP_BACK, TOP_LEFT, LEFT_BACK, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
65
  { TOP_BACK, BOTTOM_LEFT, BOTTOM_BACK, TOP_LEFT, BOTTOM_LEFT, TOP_BACK, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
66
  { BOTTOM_BACK, BOTTOM_RIGHT, RIGHT_BACK, LEFT_BACK, TOP_BACK, TOP_LEFT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
67
  { TOP_BACK, BOTTOM_RIGHT, RIGHT_BACK, TOP_BACK, TOP_LEFT, BOTTOM_RIGHT, TOP_LEFT, BOTTOM_LEFT, BOTTOM_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE },
68
  { BOTTOM_RIGHT, BOTTOM_FRONT, RIGHT_FRONT, LEFT_BACK, TOP_BACK, TOP_LEFT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
69
  { BOTTOM_LEFT, TOP_BACK, TOP_LEFT, BOTTOM_LEFT, BOTTOM_BACK, TOP_BACK, BOTTOM_RIGHT, BOTTOM_FRONT, RIGHT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
70
  { RIGHT_BACK, BOTTOM_FRONT, RIGHT_FRONT, RIGHT_BACK, BOTTOM_BACK, BOTTOM_FRONT, LEFT_BACK, TOP_BACK, TOP_LEFT, NONE, NONE, NONE, NONE, NONE, NONE },
71
  { BOTTOM_FRONT, RIGHT_FRONT, RIGHT_BACK, BOTTOM_FRONT, RIGHT_BACK, TOP_LEFT, BOTTOM_FRONT, TOP_LEFT, BOTTOM_LEFT, TOP_LEFT, RIGHT_BACK, TOP_BACK, NONE, NONE, NONE },
72
  { LEFT_BACK, TOP_BACK, TOP_LEFT, BOTTOM_LEFT, LEFT_FRONT, BOTTOM_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
73
  { LEFT_FRONT, TOP_BACK, TOP_LEFT, LEFT_FRONT, BOTTOM_FRONT, TOP_BACK, BOTTOM_FRONT, BOTTOM_BACK, TOP_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
74
  { RIGHT_BACK, BOTTOM_BACK, BOTTOM_RIGHT, LEFT_BACK, TOP_BACK, TOP_LEFT, BOTTOM_FRONT, BOTTOM_LEFT, LEFT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
75
  { TOP_BACK, TOP_LEFT, LEFT_FRONT, RIGHT_BACK, TOP_BACK, LEFT_FRONT, RIGHT_BACK, LEFT_FRONT, BOTTOM_FRONT, RIGHT_BACK, BOTTOM_FRONT, BOTTOM_RIGHT, NONE, NONE, NONE },
76
  { BOTTOM_LEFT, RIGHT_FRONT, BOTTOM_RIGHT, BOTTOM_LEFT, LEFT_FRONT, RIGHT_FRONT, TOP_LEFT, LEFT_BACK, TOP_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
77
  { BOTTOM_RIGHT, LEFT_FRONT, RIGHT_FRONT, BOTTOM_RIGHT, TOP_BACK, LEFT_FRONT, BOTTOM_RIGHT, BOTTOM_BACK, TOP_BACK, TOP_LEFT, LEFT_FRONT, TOP_BACK, NONE, NONE, NONE },
78
  { TOP_BACK, TOP_LEFT, LEFT_BACK, RIGHT_BACK, BOTTOM_BACK, LEFT_FRONT, RIGHT_BACK, LEFT_FRONT, RIGHT_FRONT, LEFT_FRONT, BOTTOM_BACK, BOTTOM_LEFT, NONE, NONE, NONE },
79
  { TOP_BACK, TOP_LEFT, LEFT_FRONT, TOP_BACK, LEFT_FRONT, RIGHT_BACK, RIGHT_BACK, LEFT_FRONT, RIGHT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
80
  { RIGHT_BACK, TOP_RIGHT, TOP_BACK, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
81
  { RIGHT_BACK, TOP_RIGHT, TOP_BACK, BOTTOM_BACK, LEFT_BACK, BOTTOM_LEFT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
82
  { BOTTOM_BACK, TOP_RIGHT, TOP_BACK, BOTTOM_RIGHT, TOP_RIGHT, BOTTOM_BACK, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
83
  { LEFT_BACK, TOP_RIGHT, TOP_BACK, LEFT_BACK, BOTTOM_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT, TOP_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE },
84
  { BOTTOM_RIGHT, BOTTOM_FRONT, RIGHT_FRONT, RIGHT_BACK, TOP_RIGHT, TOP_BACK, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
85
  { BOTTOM_LEFT, BOTTOM_BACK, LEFT_BACK, BOTTOM_RIGHT, BOTTOM_FRONT, RIGHT_FRONT, TOP_BACK, RIGHT_BACK, TOP_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE },
86
  { TOP_RIGHT, BOTTOM_FRONT, RIGHT_FRONT, TOP_RIGHT, TOP_BACK, BOTTOM_FRONT, TOP_BACK, BOTTOM_BACK, BOTTOM_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
87
  { BOTTOM_FRONT, RIGHT_FRONT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_FRONT, TOP_RIGHT, BOTTOM_LEFT, TOP_RIGHT, TOP_BACK, BOTTOM_LEFT, TOP_BACK, LEFT_BACK, NONE, NONE, NONE },
88
  { RIGHT_BACK, TOP_RIGHT, TOP_BACK, BOTTOM_FRONT, BOTTOM_LEFT, LEFT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
89
  { BOTTOM_BACK, LEFT_FRONT, BOTTOM_FRONT, BOTTOM_BACK, LEFT_BACK, LEFT_FRONT, TOP_BACK, RIGHT_BACK, TOP_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE },
90
  { BOTTOM_BACK, TOP_RIGHT, TOP_BACK, BOTTOM_BACK, BOTTOM_RIGHT, TOP_RIGHT, BOTTOM_FRONT, BOTTOM_LEFT, LEFT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
91
  { BOTTOM_FRONT, BOTTOM_RIGHT, TOP_RIGHT, BOTTOM_FRONT, TOP_RIGHT, LEFT_BACK, BOTTOM_FRONT, LEFT_BACK, LEFT_FRONT, TOP_BACK, LEFT_BACK, TOP_RIGHT, NONE, NONE, NONE },
92
  { RIGHT_FRONT, BOTTOM_LEFT, LEFT_FRONT, RIGHT_FRONT, BOTTOM_RIGHT, BOTTOM_LEFT, RIGHT_BACK, TOP_RIGHT, TOP_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
93
  { TOP_BACK, RIGHT_BACK, TOP_RIGHT, BOTTOM_BACK, LEFT_BACK, BOTTOM_RIGHT, LEFT_BACK, RIGHT_FRONT, BOTTOM_RIGHT, LEFT_BACK, LEFT_FRONT, RIGHT_FRONT, NONE, NONE, NONE },
94
  { TOP_RIGHT, TOP_BACK, BOTTOM_BACK, TOP_RIGHT, BOTTOM_BACK, LEFT_FRONT, TOP_RIGHT, LEFT_FRONT, RIGHT_FRONT, LEFT_FRONT, BOTTOM_BACK, BOTTOM_LEFT, NONE, NONE, NONE },
95
  { TOP_RIGHT, TOP_BACK, LEFT_BACK, TOP_RIGHT, LEFT_BACK, RIGHT_FRONT, RIGHT_FRONT, LEFT_BACK, LEFT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
96
  { RIGHT_BACK, TOP_LEFT, LEFT_BACK, TOP_RIGHT, TOP_LEFT, RIGHT_BACK, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
97
  { RIGHT_BACK, BOTTOM_LEFT, BOTTOM_BACK, RIGHT_BACK, TOP_RIGHT, BOTTOM_LEFT, TOP_RIGHT, TOP_LEFT, BOTTOM_LEFT, NONE, NONE, NONE, NONE, NONE, NONE },
98
  { BOTTOM_BACK, TOP_LEFT, LEFT_BACK, BOTTOM_BACK, BOTTOM_RIGHT, TOP_LEFT, BOTTOM_RIGHT, TOP_RIGHT, TOP_LEFT, NONE, NONE, NONE, NONE, NONE, NONE },
99
  { BOTTOM_RIGHT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_LEFT, TOP_RIGHT, TOP_LEFT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
100
  { RIGHT_BACK, TOP_LEFT, LEFT_BACK, RIGHT_BACK, TOP_RIGHT, TOP_LEFT, RIGHT_FRONT, BOTTOM_RIGHT, BOTTOM_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
101
  { RIGHT_FRONT, BOTTOM_RIGHT, BOTTOM_FRONT, RIGHT_BACK, TOP_RIGHT, BOTTOM_BACK, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_BACK, TOP_RIGHT, TOP_LEFT, BOTTOM_LEFT, NONE, NONE, NONE },
102
  { LEFT_BACK, BOTTOM_BACK, BOTTOM_FRONT, LEFT_BACK, BOTTOM_FRONT, TOP_RIGHT, LEFT_BACK, TOP_RIGHT, TOP_LEFT, RIGHT_FRONT, TOP_RIGHT, BOTTOM_FRONT, NONE, NONE, NONE },
103
  { BOTTOM_FRONT, RIGHT_FRONT, TOP_RIGHT, BOTTOM_FRONT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_LEFT, TOP_RIGHT, TOP_LEFT, NONE, NONE, NONE, NONE, NONE, NONE },
104
  { TOP_LEFT, RIGHT_BACK, TOP_RIGHT, TOP_LEFT, LEFT_BACK, RIGHT_BACK, BOTTOM_LEFT, LEFT_FRONT, BOTTOM_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
105
  { RIGHT_BACK, TOP_RIGHT, TOP_LEFT, RIGHT_BACK, TOP_LEFT, BOTTOM_FRONT, RIGHT_BACK, BOTTOM_FRONT, BOTTOM_BACK, BOTTOM_FRONT, TOP_LEFT, LEFT_FRONT, NONE, NONE, NONE },
106
  { BOTTOM_FRONT, BOTTOM_LEFT, LEFT_FRONT, BOTTOM_BACK, BOTTOM_RIGHT, LEFT_BACK, BOTTOM_RIGHT, TOP_LEFT, LEFT_BACK, BOTTOM_RIGHT, TOP_RIGHT, TOP_LEFT, NONE, NONE, NONE },
107
  { LEFT_FRONT, BOTTOM_FRONT, BOTTOM_RIGHT, LEFT_FRONT, BOTTOM_RIGHT, TOP_LEFT, TOP_LEFT, BOTTOM_RIGHT, TOP_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE },
108
  { RIGHT_BACK, TOP_RIGHT, LEFT_BACK, LEFT_BACK, TOP_RIGHT, TOP_LEFT, RIGHT_FRONT, BOTTOM_RIGHT, BOTTOM_LEFT, RIGHT_FRONT, BOTTOM_LEFT, LEFT_FRONT, NONE, NONE, NONE },
109
  { TOP_RIGHT, TOP_LEFT, BOTTOM_BACK, TOP_RIGHT, BOTTOM_BACK, RIGHT_BACK, TOP_LEFT, LEFT_FRONT, BOTTOM_BACK, BOTTOM_RIGHT, BOTTOM_BACK, RIGHT_FRONT, LEFT_FRONT, RIGHT_FRONT, BOTTOM_BACK },
110
  { LEFT_FRONT, RIGHT_FRONT, BOTTOM_BACK, LEFT_FRONT, BOTTOM_BACK, BOTTOM_LEFT, RIGHT_FRONT, TOP_RIGHT, BOTTOM_BACK, LEFT_BACK, BOTTOM_BACK, TOP_LEFT, TOP_RIGHT, TOP_LEFT, BOTTOM_BACK },
111
  { LEFT_FRONT, RIGHT_FRONT, TOP_RIGHT, TOP_LEFT, LEFT_FRONT, TOP_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
112
  { RIGHT_FRONT, TOP_FRONT, TOP_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
113
  { BOTTOM_BACK, LEFT_BACK, BOTTOM_LEFT, TOP_RIGHT, RIGHT_FRONT, TOP_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
114
  { RIGHT_BACK, BOTTOM_BACK, BOTTOM_RIGHT, TOP_RIGHT, RIGHT_FRONT, TOP_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
115
  { BOTTOM_RIGHT, LEFT_BACK, BOTTOM_LEFT, BOTTOM_RIGHT, RIGHT_BACK, LEFT_BACK, TOP_RIGHT, RIGHT_FRONT, TOP_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
116
  { BOTTOM_RIGHT, TOP_FRONT, TOP_RIGHT, BOTTOM_FRONT, TOP_FRONT, BOTTOM_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
117
  { BOTTOM_RIGHT, TOP_FRONT, TOP_RIGHT, BOTTOM_RIGHT, BOTTOM_FRONT, TOP_FRONT, BOTTOM_LEFT, BOTTOM_BACK, LEFT_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
118
  { RIGHT_BACK, TOP_FRONT, TOP_RIGHT, RIGHT_BACK, BOTTOM_BACK, TOP_FRONT, BOTTOM_BACK, BOTTOM_FRONT, TOP_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
119
  { TOP_RIGHT, RIGHT_BACK, LEFT_BACK, TOP_RIGHT, LEFT_BACK, BOTTOM_FRONT, TOP_RIGHT, BOTTOM_FRONT, TOP_FRONT, BOTTOM_LEFT, BOTTOM_FRONT, LEFT_BACK, NONE, NONE, NONE },
120
  { BOTTOM_FRONT, BOTTOM_LEFT, LEFT_FRONT, RIGHT_FRONT, TOP_FRONT, TOP_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
121
  { LEFT_FRONT, BOTTOM_BACK, LEFT_BACK, LEFT_FRONT, BOTTOM_FRONT, BOTTOM_BACK, RIGHT_FRONT, TOP_FRONT, TOP_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE },
122
  { BOTTOM_BACK, BOTTOM_RIGHT, RIGHT_BACK, BOTTOM_FRONT, BOTTOM_LEFT, LEFT_FRONT, TOP_RIGHT, RIGHT_FRONT, TOP_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
123
  { TOP_RIGHT, RIGHT_FRONT, TOP_FRONT, BOTTOM_RIGHT, RIGHT_BACK, BOTTOM_FRONT, RIGHT_BACK, LEFT_FRONT, BOTTOM_FRONT, RIGHT_BACK, LEFT_BACK, LEFT_FRONT, NONE, NONE, NONE },
124
  { TOP_FRONT, BOTTOM_LEFT, LEFT_FRONT, TOP_FRONT, TOP_RIGHT, BOTTOM_LEFT, TOP_RIGHT, BOTTOM_RIGHT, BOTTOM_LEFT, NONE, NONE, NONE, NONE, NONE, NONE },
125
  { BOTTOM_BACK, LEFT_BACK, LEFT_FRONT, BOTTOM_BACK, LEFT_FRONT, TOP_RIGHT, BOTTOM_BACK, TOP_RIGHT, BOTTOM_RIGHT, TOP_RIGHT, LEFT_FRONT, TOP_FRONT, NONE, NONE, NONE },
126
  { BOTTOM_LEFT, LEFT_FRONT, TOP_FRONT, BOTTOM_BACK, BOTTOM_LEFT, TOP_FRONT, BOTTOM_BACK, TOP_FRONT, TOP_RIGHT, BOTTOM_BACK, TOP_RIGHT, RIGHT_BACK, NONE, NONE, NONE },
127
  { TOP_FRONT, TOP_RIGHT, RIGHT_BACK, TOP_FRONT, RIGHT_BACK, LEFT_FRONT, LEFT_FRONT, RIGHT_BACK, LEFT_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
128
  { TOP_RIGHT, RIGHT_FRONT, TOP_FRONT, TOP_BACK, TOP_LEFT, LEFT_BACK, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
129
  { TOP_BACK, BOTTOM_LEFT, BOTTOM_BACK, TOP_BACK, TOP_LEFT, BOTTOM_LEFT, TOP_FRONT, TOP_RIGHT, RIGHT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
130
  { BOTTOM_RIGHT, RIGHT_BACK, BOTTOM_BACK, TOP_RIGHT, RIGHT_FRONT, TOP_FRONT, LEFT_BACK, TOP_BACK, TOP_LEFT, NONE, NONE, NONE, NONE, NONE, NONE },
131
  { RIGHT_FRONT, TOP_FRONT, TOP_RIGHT, BOTTOM_RIGHT, RIGHT_BACK, TOP_LEFT, BOTTOM_RIGHT, TOP_LEFT, BOTTOM_LEFT, TOP_LEFT, RIGHT_BACK, TOP_BACK, NONE, NONE, NONE },
132
  { TOP_FRONT, BOTTOM_RIGHT, BOTTOM_FRONT, TOP_FRONT, TOP_RIGHT, BOTTOM_RIGHT, TOP_BACK, TOP_LEFT, LEFT_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
133
  { BOTTOM_RIGHT, BOTTOM_FRONT, TOP_RIGHT, TOP_RIGHT, BOTTOM_FRONT, TOP_FRONT, BOTTOM_LEFT, BOTTOM_BACK, TOP_BACK, BOTTOM_LEFT, TOP_BACK, TOP_LEFT, NONE, NONE, NONE },
134
  { LEFT_BACK, TOP_BACK, TOP_LEFT, RIGHT_BACK, BOTTOM_BACK, TOP_RIGHT, BOTTOM_BACK, TOP_FRONT, TOP_RIGHT, BOTTOM_BACK, BOTTOM_FRONT, TOP_FRONT, NONE, NONE, NONE },
135
  { TOP_LEFT, BOTTOM_LEFT, RIGHT_BACK, TOP_LEFT, RIGHT_BACK, TOP_BACK, BOTTOM_LEFT, BOTTOM_FRONT, RIGHT_BACK, TOP_RIGHT, RIGHT_BACK, TOP_FRONT, BOTTOM_FRONT, TOP_FRONT, RIGHT_BACK },
136
  { BOTTOM_LEFT, LEFT_FRONT, BOTTOM_FRONT, TOP_LEFT, LEFT_BACK, TOP_BACK, RIGHT_FRONT, TOP_FRONT, TOP_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE },
137
  { TOP_RIGHT, RIGHT_FRONT, TOP_FRONT, TOP_BACK, TOP_LEFT, BOTTOM_FRONT, TOP_BACK, BOTTOM_FRONT, BOTTOM_BACK, BOTTOM_FRONT, TOP_LEFT, LEFT_FRONT, NONE, NONE, NONE },
138
  { BOTTOM_BACK, BOTTOM_RIGHT, RIGHT_BACK, TOP_BACK, TOP_LEFT, LEFT_BACK, BOTTOM_FRONT, BOTTOM_LEFT, LEFT_FRONT, TOP_RIGHT, RIGHT_FRONT, TOP_FRONT, NONE, NONE, NONE },
139
  { RIGHT_BACK, BOTTOM_FRONT, BOTTOM_RIGHT, RIGHT_BACK, LEFT_FRONT, BOTTOM_FRONT, RIGHT_BACK, TOP_BACK, LEFT_FRONT, TOP_LEFT, LEFT_FRONT, TOP_BACK, TOP_RIGHT, RIGHT_FRONT, TOP_FRONT },
140
  { LEFT_BACK, TOP_BACK, TOP_LEFT, BOTTOM_LEFT, LEFT_FRONT, TOP_RIGHT, BOTTOM_LEFT, TOP_RIGHT, BOTTOM_RIGHT, TOP_RIGHT, LEFT_FRONT, TOP_FRONT, NONE, NONE, NONE },
141
  { TOP_RIGHT, BOTTOM_RIGHT, LEFT_FRONT, TOP_RIGHT, LEFT_FRONT, TOP_FRONT, BOTTOM_RIGHT, BOTTOM_BACK, LEFT_FRONT, TOP_LEFT, LEFT_FRONT, TOP_BACK, BOTTOM_BACK, TOP_BACK, LEFT_FRONT },
142
  { BOTTOM_BACK, TOP_RIGHT, RIGHT_BACK, BOTTOM_BACK, TOP_FRONT, TOP_RIGHT, BOTTOM_BACK, BOTTOM_LEFT, TOP_FRONT, LEFT_FRONT, TOP_FRONT, BOTTOM_LEFT, LEFT_BACK, TOP_BACK, TOP_LEFT },
143
  { TOP_FRONT, TOP_RIGHT, RIGHT_BACK, TOP_FRONT, RIGHT_BACK, LEFT_FRONT, TOP_BACK, TOP_LEFT, RIGHT_BACK, TOP_LEFT, LEFT_FRONT, RIGHT_BACK, NONE, NONE, NONE },
144
  { RIGHT_FRONT, TOP_BACK, RIGHT_BACK, TOP_FRONT, TOP_BACK, RIGHT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
145
  { TOP_BACK, RIGHT_FRONT, TOP_FRONT, TOP_BACK, RIGHT_BACK, RIGHT_FRONT, BOTTOM_BACK, LEFT_BACK, BOTTOM_LEFT, NONE, NONE, NONE, NONE, NONE, NONE },
146
  { RIGHT_FRONT, BOTTOM_BACK, BOTTOM_RIGHT, RIGHT_FRONT, TOP_FRONT, BOTTOM_BACK, TOP_FRONT, TOP_BACK, BOTTOM_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
147
  { LEFT_BACK, BOTTOM_LEFT, BOTTOM_RIGHT, LEFT_BACK, BOTTOM_RIGHT, TOP_FRONT, LEFT_BACK, TOP_FRONT, TOP_BACK, TOP_FRONT, BOTTOM_RIGHT, RIGHT_FRONT, NONE, NONE, NONE },
148
  { BOTTOM_RIGHT, TOP_BACK, RIGHT_BACK, BOTTOM_RIGHT, BOTTOM_FRONT, TOP_BACK, BOTTOM_FRONT, TOP_FRONT, TOP_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
149
  { BOTTOM_LEFT, BOTTOM_BACK, LEFT_BACK, BOTTOM_RIGHT, BOTTOM_FRONT, RIGHT_BACK, BOTTOM_FRONT, TOP_BACK, RIGHT_BACK, BOTTOM_FRONT, TOP_FRONT, TOP_BACK, NONE, NONE, NONE },
150
  { BOTTOM_BACK, BOTTOM_FRONT, TOP_BACK, TOP_BACK, BOTTOM_FRONT, TOP_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
151
  { LEFT_BACK, BOTTOM_LEFT, BOTTOM_FRONT, LEFT_BACK, BOTTOM_FRONT, TOP_BACK, TOP_BACK, BOTTOM_FRONT, TOP_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
152
  { RIGHT_FRONT, TOP_BACK, RIGHT_BACK, RIGHT_FRONT, TOP_FRONT, TOP_BACK, LEFT_FRONT, BOTTOM_FRONT, BOTTOM_LEFT, NONE, NONE, NONE, NONE, NONE, NONE },
153
  { BOTTOM_BACK, LEFT_BACK, BOTTOM_FRONT, BOTTOM_FRONT, LEFT_BACK, LEFT_FRONT, TOP_BACK, RIGHT_BACK, RIGHT_FRONT, TOP_BACK, RIGHT_FRONT, TOP_FRONT, NONE, NONE, NONE },
154
  { BOTTOM_LEFT, LEFT_FRONT, BOTTOM_FRONT, BOTTOM_BACK, BOTTOM_RIGHT, TOP_FRONT, BOTTOM_BACK, TOP_FRONT, TOP_BACK, TOP_FRONT, BOTTOM_RIGHT, RIGHT_FRONT, NONE, NONE, NONE },
155
  { TOP_FRONT, TOP_BACK, BOTTOM_RIGHT, TOP_FRONT, BOTTOM_RIGHT, RIGHT_FRONT, TOP_BACK, LEFT_BACK, BOTTOM_RIGHT, BOTTOM_FRONT, BOTTOM_RIGHT, LEFT_FRONT, LEFT_BACK, LEFT_FRONT, BOTTOM_RIGHT },
156
  { RIGHT_BACK, TOP_FRONT, TOP_BACK, RIGHT_BACK, BOTTOM_LEFT, TOP_FRONT, RIGHT_BACK, BOTTOM_RIGHT, BOTTOM_LEFT, LEFT_FRONT, TOP_FRONT, BOTTOM_LEFT, NONE, NONE, NONE },
157
  { LEFT_BACK, LEFT_FRONT, BOTTOM_RIGHT, LEFT_BACK, BOTTOM_RIGHT, BOTTOM_BACK, LEFT_FRONT, TOP_FRONT, BOTTOM_RIGHT, RIGHT_BACK, BOTTOM_RIGHT, TOP_BACK, TOP_FRONT, TOP_BACK, BOTTOM_RIGHT },
158
  { BOTTOM_LEFT, LEFT_FRONT, TOP_FRONT, BOTTOM_LEFT, TOP_FRONT, BOTTOM_BACK, BOTTOM_BACK, TOP_FRONT, TOP_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
159
  { TOP_FRONT, TOP_BACK, LEFT_BACK, LEFT_FRONT, TOP_FRONT, LEFT_BACK, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
160
  { TOP_LEFT, RIGHT_FRONT, TOP_FRONT, TOP_LEFT, LEFT_BACK, RIGHT_FRONT, LEFT_BACK, RIGHT_BACK, RIGHT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
161
  { BOTTOM_BACK, TOP_LEFT, BOTTOM_LEFT, BOTTOM_BACK, RIGHT_FRONT, TOP_LEFT, BOTTOM_BACK, RIGHT_BACK, RIGHT_FRONT, TOP_FRONT, TOP_LEFT, RIGHT_FRONT, NONE, NONE, NONE },
162
  { RIGHT_FRONT, TOP_FRONT, TOP_LEFT, BOTTOM_RIGHT, RIGHT_FRONT, TOP_LEFT, BOTTOM_RIGHT, TOP_LEFT, LEFT_BACK, BOTTOM_RIGHT, LEFT_BACK, BOTTOM_BACK, NONE, NONE, NONE },
163
  { RIGHT_FRONT, TOP_FRONT, TOP_LEFT, RIGHT_FRONT, TOP_LEFT, BOTTOM_RIGHT, BOTTOM_RIGHT, TOP_LEFT, BOTTOM_LEFT, NONE, NONE, NONE, NONE, NONE, NONE },
164
  { BOTTOM_RIGHT, BOTTOM_FRONT, TOP_FRONT, BOTTOM_RIGHT, TOP_FRONT, LEFT_BACK, BOTTOM_RIGHT, LEFT_BACK, RIGHT_BACK, LEFT_BACK, TOP_FRONT, TOP_LEFT, NONE, NONE, NONE },
165
  { BOTTOM_FRONT, TOP_FRONT, RIGHT_BACK, BOTTOM_FRONT, RIGHT_BACK, BOTTOM_RIGHT, TOP_FRONT, TOP_LEFT, RIGHT_BACK, BOTTOM_BACK, RIGHT_BACK, BOTTOM_LEFT, TOP_LEFT, BOTTOM_LEFT, RIGHT_BACK },
166
  { TOP_LEFT, LEFT_BACK, BOTTOM_BACK, TOP_LEFT, BOTTOM_BACK, TOP_FRONT, TOP_FRONT, BOTTOM_BACK, BOTTOM_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
167
  { TOP_LEFT, BOTTOM_LEFT, BOTTOM_FRONT, TOP_FRONT, TOP_LEFT, BOTTOM_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
168
  { BOTTOM_FRONT, BOTTOM_LEFT, LEFT_FRONT, RIGHT_FRONT, TOP_FRONT, LEFT_BACK, RIGHT_FRONT, LEFT_BACK, RIGHT_BACK, LEFT_BACK, TOP_FRONT, TOP_LEFT, NONE, NONE, NONE },
169
  { BOTTOM_FRONT, BOTTOM_BACK, TOP_LEFT, BOTTOM_FRONT, TOP_LEFT, LEFT_FRONT, BOTTOM_BACK, RIGHT_BACK, TOP_LEFT, TOP_FRONT, TOP_LEFT, RIGHT_FRONT, RIGHT_BACK, RIGHT_FRONT, TOP_LEFT },
170
  { BOTTOM_RIGHT, LEFT_BACK, BOTTOM_BACK, BOTTOM_RIGHT, TOP_LEFT, LEFT_BACK, BOTTOM_RIGHT, RIGHT_FRONT, TOP_LEFT, TOP_FRONT, TOP_LEFT, RIGHT_FRONT, BOTTOM_FRONT, BOTTOM_LEFT, LEFT_FRONT },
171
  { LEFT_FRONT, BOTTOM_FRONT, BOTTOM_RIGHT, LEFT_FRONT, BOTTOM_RIGHT, TOP_LEFT, RIGHT_FRONT, TOP_FRONT, BOTTOM_RIGHT, TOP_FRONT, TOP_LEFT, BOTTOM_RIGHT, NONE, NONE, NONE },
172
  { LEFT_BACK, RIGHT_BACK, TOP_FRONT, LEFT_BACK, TOP_FRONT, TOP_LEFT, RIGHT_BACK, BOTTOM_RIGHT, TOP_FRONT, LEFT_FRONT, TOP_FRONT, BOTTOM_LEFT, BOTTOM_RIGHT, BOTTOM_LEFT, TOP_FRONT },
173
  { BOTTOM_BACK, RIGHT_BACK, BOTTOM_RIGHT, LEFT_FRONT, TOP_FRONT, TOP_LEFT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
174
  { TOP_LEFT, LEFT_BACK, BOTTOM_BACK, TOP_LEFT, BOTTOM_BACK, TOP_FRONT, BOTTOM_LEFT, LEFT_FRONT, BOTTOM_BACK, LEFT_FRONT, TOP_FRONT, BOTTOM_BACK, NONE, NONE, NONE },
175
  { TOP_LEFT, LEFT_FRONT, TOP_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
176
  { TOP_LEFT, TOP_FRONT, LEFT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
177
  { BOTTOM_LEFT, BOTTOM_BACK, LEFT_BACK, LEFT_FRONT, TOP_LEFT, TOP_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
178
  { BOTTOM_BACK, BOTTOM_RIGHT, RIGHT_BACK, LEFT_FRONT, TOP_LEFT, TOP_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
179
  { LEFT_BACK, BOTTOM_RIGHT, RIGHT_BACK, LEFT_BACK, BOTTOM_LEFT, BOTTOM_RIGHT, LEFT_FRONT, TOP_LEFT, TOP_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
180
  { RIGHT_FRONT, BOTTOM_RIGHT, BOTTOM_FRONT, TOP_FRONT, LEFT_FRONT, TOP_LEFT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
181
  { BOTTOM_RIGHT, BOTTOM_FRONT, RIGHT_FRONT, BOTTOM_LEFT, BOTTOM_BACK, LEFT_BACK, TOP_FRONT, LEFT_FRONT, TOP_LEFT, NONE, NONE, NONE, NONE, NONE, NONE },
182
  { BOTTOM_FRONT, RIGHT_BACK, BOTTOM_BACK, BOTTOM_FRONT, RIGHT_FRONT, RIGHT_BACK, TOP_FRONT, LEFT_FRONT, TOP_LEFT, NONE, NONE, NONE, NONE, NONE, NONE },
183
  { TOP_FRONT, LEFT_FRONT, TOP_LEFT, BOTTOM_FRONT, RIGHT_FRONT, BOTTOM_LEFT, RIGHT_FRONT, LEFT_BACK, BOTTOM_LEFT, RIGHT_FRONT, RIGHT_BACK, LEFT_BACK, NONE, NONE, NONE },
184
  { TOP_LEFT, BOTTOM_FRONT, BOTTOM_LEFT, TOP_FRONT, BOTTOM_FRONT, TOP_LEFT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
185
  { TOP_LEFT, BOTTOM_BACK, LEFT_BACK, TOP_LEFT, TOP_FRONT, BOTTOM_BACK, TOP_FRONT, BOTTOM_FRONT, BOTTOM_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
186
  { BOTTOM_FRONT, TOP_LEFT, TOP_FRONT, BOTTOM_FRONT, BOTTOM_LEFT, TOP_LEFT, BOTTOM_BACK, BOTTOM_RIGHT, RIGHT_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
187
  { BOTTOM_RIGHT, TOP_FRONT, BOTTOM_FRONT, BOTTOM_RIGHT, LEFT_BACK, TOP_FRONT, BOTTOM_RIGHT, RIGHT_BACK, LEFT_BACK, LEFT_BACK, TOP_LEFT, TOP_FRONT, NONE, NONE, NONE },
188
  { RIGHT_FRONT, TOP_LEFT, TOP_FRONT, RIGHT_FRONT, BOTTOM_RIGHT, TOP_LEFT, BOTTOM_RIGHT, BOTTOM_LEFT, TOP_LEFT, NONE, NONE, NONE, NONE, NONE, NONE },
189
  { RIGHT_FRONT, TOP_LEFT, TOP_FRONT, BOTTOM_RIGHT, TOP_LEFT, RIGHT_FRONT, BOTTOM_RIGHT, LEFT_BACK, TOP_LEFT, BOTTOM_RIGHT, BOTTOM_BACK, LEFT_BACK, NONE, NONE, NONE },
190
  { BOTTOM_BACK, BOTTOM_LEFT, TOP_LEFT, BOTTOM_BACK, TOP_LEFT, RIGHT_FRONT, BOTTOM_BACK, RIGHT_FRONT, RIGHT_BACK, TOP_FRONT, RIGHT_FRONT, TOP_LEFT, NONE, NONE, NONE },
191
  { TOP_LEFT, TOP_FRONT, RIGHT_FRONT, TOP_LEFT, RIGHT_FRONT, LEFT_BACK, LEFT_BACK, RIGHT_FRONT, RIGHT_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
192
  { TOP_FRONT, LEFT_BACK, TOP_BACK, LEFT_FRONT, LEFT_BACK, TOP_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
193
  { BOTTOM_LEFT, TOP_FRONT, LEFT_FRONT, BOTTOM_LEFT, BOTTOM_BACK, TOP_FRONT, BOTTOM_BACK, TOP_BACK, TOP_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
194
  { LEFT_BACK, TOP_FRONT, LEFT_FRONT, LEFT_BACK, TOP_BACK, TOP_FRONT, RIGHT_BACK, BOTTOM_BACK, BOTTOM_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE },
195
  { RIGHT_BACK, TOP_BACK, TOP_FRONT, RIGHT_BACK, TOP_FRONT, BOTTOM_LEFT, RIGHT_BACK, BOTTOM_LEFT, BOTTOM_RIGHT, LEFT_FRONT, BOTTOM_LEFT, TOP_FRONT, NONE, NONE, NONE },
196
  { TOP_FRONT, LEFT_BACK, TOP_BACK, TOP_FRONT, LEFT_FRONT, LEFT_BACK, BOTTOM_FRONT, RIGHT_FRONT, BOTTOM_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE },
197
  { BOTTOM_RIGHT, BOTTOM_FRONT, RIGHT_FRONT, BOTTOM_LEFT, BOTTOM_BACK, LEFT_FRONT, BOTTOM_BACK, TOP_FRONT, LEFT_FRONT, BOTTOM_BACK, TOP_BACK, TOP_FRONT, NONE, NONE, NONE },
198
  { TOP_BACK, LEFT_FRONT, LEFT_BACK, TOP_BACK, TOP_FRONT, LEFT_FRONT, BOTTOM_BACK, BOTTOM_FRONT, RIGHT_BACK, BOTTOM_FRONT, RIGHT_FRONT, RIGHT_BACK, NONE, NONE, NONE },
199
  { RIGHT_FRONT, RIGHT_BACK, BOTTOM_LEFT, RIGHT_FRONT, BOTTOM_LEFT, BOTTOM_FRONT, RIGHT_BACK, TOP_BACK, BOTTOM_LEFT, LEFT_FRONT, BOTTOM_LEFT, TOP_FRONT, TOP_BACK, TOP_FRONT, BOTTOM_LEFT },
200
  { LEFT_BACK, BOTTOM_FRONT, BOTTOM_LEFT, LEFT_BACK, TOP_BACK, BOTTOM_FRONT, TOP_BACK, TOP_FRONT, BOTTOM_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
201
  { BOTTOM_BACK, TOP_BACK, BOTTOM_FRONT, TOP_BACK, TOP_FRONT, BOTTOM_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
202
  { BOTTOM_RIGHT, RIGHT_BACK, BOTTOM_BACK, BOTTOM_FRONT, BOTTOM_LEFT, TOP_BACK, BOTTOM_FRONT, TOP_BACK, TOP_FRONT, TOP_BACK, BOTTOM_LEFT, LEFT_BACK, NONE, NONE, NONE },
203
  { BOTTOM_RIGHT, RIGHT_BACK, TOP_BACK, BOTTOM_RIGHT, TOP_BACK, BOTTOM_FRONT, BOTTOM_FRONT, TOP_BACK, TOP_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
204
  { LEFT_BACK, BOTTOM_RIGHT, BOTTOM_LEFT, LEFT_BACK, TOP_FRONT, BOTTOM_RIGHT, LEFT_BACK, TOP_BACK, TOP_FRONT, TOP_FRONT, RIGHT_FRONT, BOTTOM_RIGHT, NONE, NONE, NONE },
205
  { RIGHT_FRONT, BOTTOM_RIGHT, BOTTOM_BACK, RIGHT_FRONT, BOTTOM_BACK, TOP_FRONT, TOP_FRONT, BOTTOM_BACK, TOP_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
206
  { TOP_BACK, TOP_FRONT, BOTTOM_LEFT, TOP_BACK, BOTTOM_LEFT, LEFT_BACK, TOP_FRONT, RIGHT_FRONT, BOTTOM_LEFT, BOTTOM_BACK, BOTTOM_LEFT, RIGHT_BACK, RIGHT_FRONT, RIGHT_BACK, BOTTOM_LEFT },
207
  { RIGHT_FRONT, RIGHT_BACK, TOP_BACK, TOP_FRONT, RIGHT_FRONT, TOP_BACK, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
208
  { TOP_BACK, RIGHT_BACK, TOP_RIGHT, TOP_LEFT, TOP_FRONT, LEFT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
209
  { BOTTOM_BACK, LEFT_BACK, BOTTOM_LEFT, TOP_BACK, RIGHT_BACK, TOP_RIGHT, LEFT_FRONT, TOP_LEFT, TOP_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
210
  { TOP_RIGHT, BOTTOM_BACK, BOTTOM_RIGHT, TOP_RIGHT, TOP_BACK, BOTTOM_BACK, TOP_LEFT, TOP_FRONT, LEFT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
211
  { LEFT_FRONT, TOP_LEFT, TOP_FRONT, LEFT_BACK, BOTTOM_LEFT, TOP_BACK, BOTTOM_LEFT, TOP_RIGHT, TOP_BACK, BOTTOM_LEFT, BOTTOM_RIGHT, TOP_RIGHT, NONE, NONE, NONE },
212
  { RIGHT_BACK, TOP_RIGHT, TOP_BACK, RIGHT_FRONT, BOTTOM_RIGHT, BOTTOM_FRONT, TOP_LEFT, TOP_FRONT, LEFT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
213
  { TOP_FRONT, LEFT_FRONT, TOP_LEFT, BOTTOM_RIGHT, BOTTOM_FRONT, RIGHT_FRONT, BOTTOM_BACK, LEFT_BACK, BOTTOM_LEFT, TOP_BACK, RIGHT_BACK, TOP_RIGHT, NONE, NONE, NONE },
214
  { TOP_LEFT, TOP_FRONT, LEFT_FRONT, TOP_RIGHT, TOP_BACK, RIGHT_FRONT, TOP_BACK, BOTTOM_FRONT, RIGHT_FRONT, TOP_BACK, BOTTOM_BACK, BOTTOM_FRONT, NONE, NONE, NONE },
215
  { BOTTOM_LEFT, TOP_BACK, LEFT_BACK, BOTTOM_LEFT, TOP_RIGHT, TOP_BACK, BOTTOM_LEFT, BOTTOM_FRONT, TOP_RIGHT, RIGHT_FRONT, TOP_RIGHT, BOTTOM_FRONT, LEFT_FRONT, TOP_LEFT, TOP_FRONT },
216
  { TOP_LEFT, BOTTOM_FRONT, BOTTOM_LEFT, TOP_LEFT, TOP_FRONT, BOTTOM_FRONT, TOP_RIGHT, TOP_BACK, RIGHT_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
217
  { RIGHT_BACK, TOP_RIGHT, TOP_BACK, BOTTOM_BACK, LEFT_BACK, TOP_FRONT, BOTTOM_BACK, TOP_FRONT, BOTTOM_FRONT, TOP_FRONT, LEFT_BACK, TOP_LEFT, NONE, NONE, NONE },
218
  { BOTTOM_LEFT, TOP_FRONT, BOTTOM_FRONT, BOTTOM_LEFT, TOP_LEFT, TOP_FRONT, BOTTOM_RIGHT, TOP_RIGHT, BOTTOM_BACK, TOP_RIGHT, TOP_BACK, BOTTOM_BACK, NONE, NONE, NONE },
219
  { TOP_FRONT, BOTTOM_FRONT, LEFT_BACK, TOP_FRONT, LEFT_BACK, TOP_LEFT, BOTTOM_FRONT, BOTTOM_RIGHT, LEFT_BACK, TOP_BACK, LEFT_BACK, TOP_RIGHT, BOTTOM_RIGHT, TOP_RIGHT, LEFT_BACK },
220
  { RIGHT_BACK, TOP_RIGHT, TOP_BACK, RIGHT_FRONT, BOTTOM_RIGHT, TOP_FRONT, BOTTOM_RIGHT, TOP_LEFT, TOP_FRONT, BOTTOM_RIGHT, BOTTOM_LEFT, TOP_LEFT, NONE, NONE, NONE },
221
  { BOTTOM_RIGHT, TOP_FRONT, RIGHT_FRONT, BOTTOM_RIGHT, TOP_LEFT, TOP_FRONT, BOTTOM_RIGHT, BOTTOM_BACK, TOP_LEFT, LEFT_BACK, TOP_LEFT, BOTTOM_BACK, RIGHT_BACK, TOP_RIGHT, TOP_BACK },
222
  { TOP_BACK, BOTTOM_BACK, RIGHT_FRONT, TOP_BACK, RIGHT_FRONT, TOP_RIGHT, BOTTOM_BACK, BOTTOM_LEFT, RIGHT_FRONT, TOP_FRONT, RIGHT_FRONT, TOP_LEFT, BOTTOM_LEFT, TOP_LEFT, RIGHT_FRONT },
223
  { TOP_LEFT, TOP_FRONT, RIGHT_FRONT, TOP_LEFT, RIGHT_FRONT, LEFT_BACK, TOP_RIGHT, TOP_BACK, RIGHT_FRONT, TOP_BACK, LEFT_BACK, RIGHT_FRONT, NONE, NONE, NONE },
224
  { TOP_FRONT, RIGHT_BACK, TOP_RIGHT, TOP_FRONT, LEFT_FRONT, RIGHT_BACK, LEFT_FRONT, LEFT_BACK, RIGHT_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
225
  { BOTTOM_LEFT, TOP_FRONT, LEFT_FRONT, BOTTOM_BACK, TOP_FRONT, BOTTOM_LEFT, BOTTOM_BACK, TOP_RIGHT, TOP_FRONT, BOTTOM_BACK, RIGHT_BACK, TOP_RIGHT, NONE, NONE, NONE },
226
  { BOTTOM_BACK, LEFT_FRONT, LEFT_BACK, BOTTOM_BACK, TOP_RIGHT, LEFT_FRONT, BOTTOM_BACK, BOTTOM_RIGHT, TOP_RIGHT, TOP_RIGHT, TOP_FRONT, LEFT_FRONT, NONE, NONE, NONE },
227
  { TOP_FRONT, LEFT_FRONT, BOTTOM_LEFT, TOP_FRONT, BOTTOM_LEFT, TOP_RIGHT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE },
228
  { BOTTOM_RIGHT, BOTTOM_FRONT, RIGHT_FRONT, RIGHT_BACK, TOP_RIGHT, LEFT_FRONT, RIGHT_BACK, LEFT_FRONT, LEFT_BACK, LEFT_FRONT, TOP_RIGHT, TOP_FRONT, NONE, NONE, NONE },
229
  { BOTTOM_BACK, LEFT_FRONT, BOTTOM_LEFT, BOTTOM_BACK, TOP_FRONT, LEFT_FRONT, BOTTOM_BACK, RIGHT_BACK, TOP_FRONT, TOP_RIGHT, TOP_FRONT, RIGHT_BACK, BOTTOM_RIGHT, BOTTOM_FRONT, RIGHT_FRONT },
230
  { LEFT_FRONT, LEFT_BACK, TOP_RIGHT, LEFT_FRONT, TOP_RIGHT, TOP_FRONT, LEFT_BACK, BOTTOM_BACK, TOP_RIGHT, RIGHT_FRONT, TOP_RIGHT, BOTTOM_FRONT, BOTTOM_BACK, BOTTOM_FRONT, TOP_RIGHT },
231
  { TOP_FRONT, LEFT_FRONT, BOTTOM_LEFT, TOP_FRONT, BOTTOM_LEFT, TOP_RIGHT, BOTTOM_FRONT, RIGHT_FRONT, BOTTOM_LEFT, RIGHT_FRONT, TOP_RIGHT, BOTTOM_LEFT, NONE, NONE, NONE },
232
  { TOP_RIGHT, LEFT_BACK, RIGHT_BACK, TOP_RIGHT, BOTTOM_FRONT, LEFT_BACK, TOP_RIGHT, TOP_FRONT, BOTTOM_FRONT, BOTTOM_LEFT, LEFT_BACK, BOTTOM_FRONT, NONE, NONE, NONE },
233
  { RIGHT_BACK, TOP_RIGHT, TOP_FRONT, RIGHT_BACK, TOP_FRONT, BOTTOM_BACK, BOTTOM_BACK, TOP_FRONT, BOTTOM_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
234
  { BOTTOM_RIGHT, TOP_RIGHT, LEFT_BACK, BOTTOM_RIGHT, LEFT_BACK, BOTTOM_BACK, TOP_RIGHT, TOP_FRONT, LEFT_BACK, BOTTOM_LEFT, LEFT_BACK, BOTTOM_FRONT, TOP_FRONT, BOTTOM_FRONT, LEFT_BACK },
235
  { BOTTOM_RIGHT, TOP_RIGHT, TOP_FRONT, BOTTOM_FRONT, BOTTOM_RIGHT, TOP_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
236
  { BOTTOM_RIGHT, BOTTOM_LEFT, TOP_FRONT, BOTTOM_RIGHT, TOP_FRONT, RIGHT_FRONT, BOTTOM_LEFT, LEFT_BACK, TOP_FRONT, TOP_RIGHT, TOP_FRONT, RIGHT_BACK, LEFT_BACK, RIGHT_BACK, TOP_FRONT },
237
  { RIGHT_FRONT, BOTTOM_RIGHT, BOTTOM_BACK, RIGHT_FRONT, BOTTOM_BACK, TOP_FRONT, RIGHT_BACK, TOP_RIGHT, BOTTOM_BACK, TOP_RIGHT, TOP_FRONT, BOTTOM_BACK, NONE, NONE, NONE },
238
  { BOTTOM_BACK, BOTTOM_LEFT, LEFT_BACK, TOP_RIGHT, TOP_FRONT, RIGHT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
239
  { RIGHT_FRONT, TOP_RIGHT, TOP_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
240
  { LEFT_FRONT, TOP_RIGHT, RIGHT_FRONT, TOP_LEFT, TOP_RIGHT, LEFT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
241
  { LEFT_FRONT, TOP_RIGHT, RIGHT_FRONT, LEFT_FRONT, TOP_LEFT, TOP_RIGHT, LEFT_BACK, BOTTOM_LEFT, BOTTOM_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
242
  { TOP_RIGHT, LEFT_FRONT, TOP_LEFT, TOP_RIGHT, RIGHT_FRONT, LEFT_FRONT, BOTTOM_RIGHT, RIGHT_BACK, BOTTOM_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
243
  { RIGHT_FRONT, TOP_LEFT, TOP_RIGHT, RIGHT_FRONT, LEFT_FRONT, TOP_LEFT, RIGHT_BACK, LEFT_BACK, BOTTOM_RIGHT, LEFT_BACK, BOTTOM_LEFT, BOTTOM_RIGHT, NONE, NONE, NONE },
244
  { LEFT_FRONT, BOTTOM_RIGHT, BOTTOM_FRONT, LEFT_FRONT, TOP_LEFT, BOTTOM_RIGHT, TOP_LEFT, TOP_RIGHT, BOTTOM_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE },
245
  { BOTTOM_BACK, LEFT_BACK, BOTTOM_LEFT, BOTTOM_RIGHT, BOTTOM_FRONT, TOP_LEFT, BOTTOM_RIGHT, TOP_LEFT, TOP_RIGHT, TOP_LEFT, BOTTOM_FRONT, LEFT_FRONT, NONE, NONE, NONE },
246
  { RIGHT_BACK, TOP_LEFT, TOP_RIGHT, RIGHT_BACK, BOTTOM_FRONT, TOP_LEFT, RIGHT_BACK, BOTTOM_BACK, BOTTOM_FRONT, BOTTOM_FRONT, LEFT_FRONT, TOP_LEFT, NONE, NONE, NONE },
247
  { TOP_LEFT, TOP_RIGHT, BOTTOM_FRONT, TOP_LEFT, BOTTOM_FRONT, LEFT_FRONT, TOP_RIGHT, RIGHT_BACK, BOTTOM_FRONT, BOTTOM_LEFT, BOTTOM_FRONT, LEFT_BACK, RIGHT_BACK, LEFT_BACK, BOTTOM_FRONT },
248
  { BOTTOM_FRONT, TOP_RIGHT, RIGHT_FRONT, BOTTOM_FRONT, BOTTOM_LEFT, TOP_RIGHT, BOTTOM_LEFT, TOP_LEFT, TOP_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE },
249
  { LEFT_BACK, BOTTOM_FRONT, BOTTOM_BACK, LEFT_BACK, TOP_RIGHT, BOTTOM_FRONT, LEFT_BACK, TOP_LEFT, TOP_RIGHT, RIGHT_FRONT, BOTTOM_FRONT, TOP_RIGHT, NONE, NONE, NONE },
250
  { RIGHT_BACK, BOTTOM_BACK, BOTTOM_RIGHT, TOP_RIGHT, RIGHT_FRONT, BOTTOM_LEFT, TOP_RIGHT, BOTTOM_LEFT, TOP_LEFT, BOTTOM_LEFT, RIGHT_FRONT, BOTTOM_FRONT, NONE, NONE, NONE },
251
  { RIGHT_BACK, LEFT_BACK, BOTTOM_FRONT, RIGHT_BACK, BOTTOM_FRONT, BOTTOM_RIGHT, LEFT_BACK, TOP_LEFT, BOTTOM_FRONT, RIGHT_FRONT, BOTTOM_FRONT, TOP_RIGHT, TOP_LEFT, TOP_RIGHT, BOTTOM_FRONT },
252
  { BOTTOM_RIGHT, BOTTOM_LEFT, TOP_RIGHT, BOTTOM_LEFT, TOP_LEFT, TOP_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
253
  { BOTTOM_BACK, LEFT_BACK, TOP_LEFT, BOTTOM_BACK, TOP_LEFT, BOTTOM_RIGHT, BOTTOM_RIGHT, TOP_LEFT, TOP_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE },
254
  { RIGHT_BACK, BOTTOM_BACK, BOTTOM_LEFT, RIGHT_BACK, BOTTOM_LEFT, TOP_RIGHT, TOP_RIGHT, BOTTOM_LEFT, TOP_LEFT, NONE, NONE, NONE, NONE, NONE, NONE },
255
  { RIGHT_BACK, LEFT_BACK, TOP_LEFT, TOP_RIGHT, RIGHT_BACK, TOP_LEFT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
256
  { TOP_RIGHT, LEFT_BACK, TOP_BACK, TOP_RIGHT, RIGHT_FRONT, LEFT_BACK, RIGHT_FRONT, LEFT_FRONT, LEFT_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
257
  { TOP_RIGHT, BOTTOM_BACK, TOP_BACK, TOP_RIGHT, LEFT_FRONT, BOTTOM_BACK, TOP_RIGHT, RIGHT_FRONT, LEFT_FRONT, LEFT_FRONT, BOTTOM_LEFT, BOTTOM_BACK, NONE, NONE, NONE },
258
  { BOTTOM_BACK, BOTTOM_RIGHT, RIGHT_BACK, LEFT_BACK, TOP_BACK, RIGHT_FRONT, LEFT_BACK, RIGHT_FRONT, LEFT_FRONT, RIGHT_FRONT, TOP_BACK, TOP_RIGHT, NONE, NONE, NONE },
259
  { RIGHT_FRONT, LEFT_FRONT, TOP_BACK, RIGHT_FRONT, TOP_BACK, TOP_RIGHT, LEFT_FRONT, BOTTOM_LEFT, TOP_BACK, RIGHT_BACK, TOP_BACK, BOTTOM_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT, TOP_BACK },
260
  { BOTTOM_FRONT, TOP_RIGHT, BOTTOM_RIGHT, BOTTOM_FRONT, LEFT_BACK, TOP_RIGHT, BOTTOM_FRONT, LEFT_FRONT, LEFT_BACK, TOP_BACK, TOP_RIGHT, LEFT_BACK, NONE, NONE, NONE },
261
  { BOTTOM_BACK, TOP_BACK, LEFT_FRONT, BOTTOM_BACK, LEFT_FRONT, BOTTOM_LEFT, TOP_BACK, TOP_RIGHT, LEFT_FRONT, BOTTOM_FRONT, LEFT_FRONT, BOTTOM_RIGHT, TOP_RIGHT, BOTTOM_RIGHT, LEFT_FRONT },
262
  { BOTTOM_BACK, BOTTOM_FRONT, TOP_RIGHT, BOTTOM_BACK, TOP_RIGHT, RIGHT_BACK, BOTTOM_FRONT, LEFT_FRONT, TOP_RIGHT, TOP_BACK, TOP_RIGHT, LEFT_BACK, LEFT_FRONT, LEFT_BACK, TOP_RIGHT },
263
  { RIGHT_BACK, TOP_BACK, TOP_RIGHT, BOTTOM_FRONT, LEFT_FRONT, BOTTOM_LEFT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
264
  { BOTTOM_FRONT, TOP_RIGHT, RIGHT_FRONT, BOTTOM_LEFT, TOP_RIGHT, BOTTOM_FRONT, BOTTOM_LEFT, TOP_BACK, TOP_RIGHT, BOTTOM_LEFT, LEFT_BACK, TOP_BACK, NONE, NONE, NONE },
265
  { TOP_RIGHT, RIGHT_FRONT, BOTTOM_FRONT, TOP_RIGHT, BOTTOM_FRONT, TOP_BACK, TOP_BACK, BOTTOM_FRONT, BOTTOM_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
266
  { BOTTOM_LEFT, RIGHT_FRONT, BOTTOM_FRONT, BOTTOM_LEFT, TOP_RIGHT, RIGHT_FRONT, BOTTOM_LEFT, LEFT_BACK, TOP_RIGHT, TOP_BACK, TOP_RIGHT, LEFT_BACK, BOTTOM_BACK, BOTTOM_RIGHT, RIGHT_BACK },
267
  { TOP_RIGHT, RIGHT_FRONT, BOTTOM_FRONT, TOP_RIGHT, BOTTOM_FRONT, TOP_BACK, BOTTOM_RIGHT, RIGHT_BACK, BOTTOM_FRONT, RIGHT_BACK, TOP_BACK, BOTTOM_FRONT, NONE, NONE, NONE },
268
  { LEFT_BACK, TOP_BACK, TOP_RIGHT, LEFT_BACK, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_LEFT, TOP_RIGHT, BOTTOM_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE },
269
  { BOTTOM_BACK, TOP_BACK, TOP_RIGHT, BOTTOM_RIGHT, BOTTOM_BACK, TOP_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
270
  { LEFT_BACK, TOP_BACK, TOP_RIGHT, LEFT_BACK, TOP_RIGHT, BOTTOM_LEFT, RIGHT_BACK, BOTTOM_BACK, TOP_RIGHT, BOTTOM_BACK, BOTTOM_LEFT, TOP_RIGHT, NONE, NONE, NONE },
271
  { RIGHT_BACK, TOP_BACK, TOP_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
272
  { TOP_BACK, LEFT_FRONT, TOP_LEFT, TOP_BACK, RIGHT_BACK, LEFT_FRONT, RIGHT_BACK, RIGHT_FRONT, LEFT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
273
  { BOTTOM_BACK, LEFT_BACK, BOTTOM_LEFT, TOP_BACK, RIGHT_BACK, TOP_LEFT, RIGHT_BACK, LEFT_FRONT, TOP_LEFT, RIGHT_BACK, RIGHT_FRONT, LEFT_FRONT, NONE, NONE, NONE },
274
  { BOTTOM_RIGHT, RIGHT_FRONT, LEFT_FRONT, BOTTOM_RIGHT, LEFT_FRONT, TOP_BACK, BOTTOM_RIGHT, TOP_BACK, BOTTOM_BACK, TOP_LEFT, TOP_BACK, LEFT_FRONT, NONE, NONE, NONE },
275
  { BOTTOM_LEFT, BOTTOM_RIGHT, TOP_BACK, BOTTOM_LEFT, TOP_BACK, LEFT_BACK, BOTTOM_RIGHT, RIGHT_FRONT, TOP_BACK, TOP_LEFT, TOP_BACK, LEFT_FRONT, RIGHT_FRONT, LEFT_FRONT, TOP_BACK },
276
  { TOP_BACK, LEFT_FRONT, TOP_LEFT, RIGHT_BACK, LEFT_FRONT, TOP_BACK, RIGHT_BACK, BOTTOM_FRONT, LEFT_FRONT, RIGHT_BACK, BOTTOM_RIGHT, BOTTOM_FRONT, NONE, NONE, NONE },
277
  { RIGHT_BACK, TOP_LEFT, TOP_BACK, RIGHT_BACK, LEFT_FRONT, TOP_LEFT, RIGHT_BACK, BOTTOM_RIGHT, LEFT_FRONT, BOTTOM_FRONT, LEFT_FRONT, BOTTOM_RIGHT, BOTTOM_BACK, LEFT_BACK, BOTTOM_LEFT },
278
  { LEFT_FRONT, TOP_LEFT, TOP_BACK, LEFT_FRONT, TOP_BACK, BOTTOM_FRONT, BOTTOM_FRONT, TOP_BACK, BOTTOM_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
279
  { LEFT_FRONT, TOP_LEFT, TOP_BACK, LEFT_FRONT, TOP_BACK, BOTTOM_FRONT, LEFT_BACK, BOTTOM_LEFT, TOP_BACK, BOTTOM_LEFT, BOTTOM_FRONT, TOP_BACK, NONE, NONE, NONE },
280
  { BOTTOM_FRONT, RIGHT_BACK, RIGHT_FRONT, BOTTOM_FRONT, TOP_LEFT, RIGHT_BACK, BOTTOM_FRONT, BOTTOM_LEFT, TOP_LEFT, TOP_LEFT, TOP_BACK, RIGHT_BACK, NONE, NONE, NONE },
281
  { RIGHT_BACK, RIGHT_FRONT, TOP_LEFT, RIGHT_BACK, TOP_LEFT, TOP_BACK, RIGHT_FRONT, BOTTOM_FRONT, TOP_LEFT, LEFT_BACK, TOP_LEFT, BOTTOM_BACK, BOTTOM_FRONT, BOTTOM_BACK, TOP_LEFT },
282
  { BOTTOM_LEFT, TOP_LEFT, RIGHT_FRONT, BOTTOM_LEFT, RIGHT_FRONT, BOTTOM_FRONT, TOP_LEFT, TOP_BACK, RIGHT_FRONT, BOTTOM_RIGHT, RIGHT_FRONT, BOTTOM_BACK, TOP_BACK, BOTTOM_BACK, RIGHT_FRONT },
283
  { BOTTOM_RIGHT, RIGHT_FRONT, BOTTOM_FRONT, LEFT_BACK, TOP_LEFT, TOP_BACK, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
284
  { TOP_BACK, RIGHT_BACK, BOTTOM_RIGHT, TOP_BACK, BOTTOM_RIGHT, TOP_LEFT, TOP_LEFT, BOTTOM_RIGHT, BOTTOM_LEFT, NONE, NONE, NONE, NONE, NONE, NONE },
285
  { TOP_BACK, RIGHT_BACK, BOTTOM_RIGHT, TOP_BACK, BOTTOM_RIGHT, TOP_LEFT, BOTTOM_BACK, LEFT_BACK, BOTTOM_RIGHT, LEFT_BACK, TOP_LEFT, BOTTOM_RIGHT, NONE, NONE, NONE },
286
  { TOP_BACK, BOTTOM_BACK, BOTTOM_LEFT, TOP_LEFT, TOP_BACK, BOTTOM_LEFT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
287
  { TOP_BACK, LEFT_BACK, TOP_LEFT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
288
  { RIGHT_BACK, RIGHT_FRONT, LEFT_BACK, RIGHT_FRONT, LEFT_FRONT, LEFT_BACK, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
289
  { BOTTOM_LEFT, BOTTOM_BACK, RIGHT_BACK, BOTTOM_LEFT, RIGHT_BACK, LEFT_FRONT, LEFT_FRONT, RIGHT_BACK, RIGHT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
290
  { BOTTOM_BACK, BOTTOM_RIGHT, RIGHT_FRONT, BOTTOM_BACK, RIGHT_FRONT, LEFT_BACK, LEFT_BACK, RIGHT_FRONT, LEFT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE },
291
  { BOTTOM_LEFT, BOTTOM_RIGHT, RIGHT_FRONT, LEFT_FRONT, BOTTOM_LEFT, RIGHT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
292
  { BOTTOM_RIGHT, BOTTOM_FRONT, LEFT_FRONT, BOTTOM_RIGHT, LEFT_FRONT, RIGHT_BACK, RIGHT_BACK, LEFT_FRONT, LEFT_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
293
  { BOTTOM_LEFT, BOTTOM_BACK, RIGHT_BACK, BOTTOM_LEFT, RIGHT_BACK, LEFT_FRONT, BOTTOM_RIGHT, BOTTOM_FRONT, RIGHT_BACK, BOTTOM_FRONT, LEFT_FRONT, RIGHT_BACK, NONE, NONE, NONE },
294
  { BOTTOM_BACK, BOTTOM_FRONT, LEFT_FRONT, LEFT_BACK, BOTTOM_BACK, LEFT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
295
  { BOTTOM_LEFT, BOTTOM_FRONT, LEFT_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
296
  { BOTTOM_FRONT, BOTTOM_LEFT, LEFT_BACK, BOTTOM_FRONT, LEFT_BACK, RIGHT_FRONT, RIGHT_FRONT, LEFT_BACK, RIGHT_BACK, NONE, NONE, NONE, NONE, NONE, NONE },
297
  { RIGHT_BACK, RIGHT_FRONT, BOTTOM_FRONT, BOTTOM_BACK, RIGHT_BACK, BOTTOM_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
298
  { BOTTOM_FRONT, BOTTOM_LEFT, LEFT_BACK, BOTTOM_FRONT, LEFT_BACK, RIGHT_FRONT, BOTTOM_BACK, BOTTOM_RIGHT, LEFT_BACK, BOTTOM_RIGHT, RIGHT_FRONT, LEFT_BACK, NONE, NONE, NONE },
299
  { BOTTOM_RIGHT, RIGHT_FRONT, BOTTOM_FRONT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
300
  { BOTTOM_RIGHT, BOTTOM_LEFT, LEFT_BACK, RIGHT_BACK, BOTTOM_RIGHT, LEFT_BACK, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
301
  { BOTTOM_BACK, RIGHT_BACK, BOTTOM_RIGHT, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
302
  { BOTTOM_BACK, BOTTOM_LEFT, LEFT_BACK, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE },
303
  { NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE }
304
}};
305

306
uint8_t computeCellConfiguration(const Grid3b& grid, std::size_t widthIndex, std::size_t heightIndex, std::size_t depthIndex) {
48✔
307
  // TODO: the following configuration feels more logical, matches the marching squares', and should ideally be used in the future
308

309
  // Computing a single number according to the corners' values:
310
  //
311
  // front      back
312
  // 8 - 4    128 - 64
313
  // |   |     |     |
314
  // 1 - 2    16 -- 32
315
  //
316
  // O - O   O - O           O - O   O - X           O - X   X - O           X - X   X - X
317
  // |   |   |   | -> 0      |   |   |   | -> 65     |   |   |   | -> 165    |   |   |   | -> 255
318
  // O - O   O - O           X - O   O - O           X - O   O - X           X - X   X - X
319

320
  //return static_cast<uint8_t>(grid.getValue(widthIndex,     heightIndex,     depthIndex    ))        // Bottom-left front
321
  //     | static_cast<uint8_t>(grid.getValue(widthIndex + 1, heightIndex,     depthIndex    ) << 1u)  // Bottom-right front
322
  //     | static_cast<uint8_t>(grid.getValue(widthIndex + 1, heightIndex + 1, depthIndex    ) << 2u)  // Top-right front
323
  //     | static_cast<uint8_t>(grid.getValue(widthIndex,     heightIndex + 1, depthIndex    ) << 3u)  // Top-left front
324
  //     | static_cast<uint8_t>(grid.getValue(widthIndex,     heightIndex,     depthIndex + 1) << 4u)  // Bottom-left back
325
  //     | static_cast<uint8_t>(grid.getValue(widthIndex + 1, heightIndex,     depthIndex + 1) << 5u)  // Bottom-right back
326
  //     | static_cast<uint8_t>(grid.getValue(widthIndex + 1, heightIndex + 1, depthIndex + 1) << 6u)  // Top-right back
327
  //     | static_cast<uint8_t>(grid.getValue(widthIndex,     heightIndex + 1, depthIndex + 1) << 7u); // Top-left back
328

329
  // TODO: using the configuration from https://paulbourke.net/geometry/polygonise/; see other TODO above
330

331
  // Computing a single number according to the corners' values:
332
  //
333
  //  front       back
334
  // 128 - 64   16 - 32
335
  //  |    |     |    |
336
  //  8 -- 4     1 -- 2
337
  //
338
  // O - O   O - O           O - O   O - X           O - X   X - O          X - X   X - X
339
  // |   |   |   | -> 0      |   |   |   | -> 40     |   |   |   | -> 90    |   |   |   | -> 255
340
  // O - O   O - O           X - O   O - O           X - O   O - X          X - X   X - X
341

342
  return static_cast<uint8_t>(grid.getValue(widthIndex,     heightIndex,     depthIndex + 1))        // Bottom-left back
48✔
343
       | static_cast<uint8_t>(grid.getValue(widthIndex + 1, heightIndex,     depthIndex + 1) << 1u)  // Bottom-right back
49✔
344
       | static_cast<uint8_t>(grid.getValue(widthIndex + 1, heightIndex,     depthIndex    ) << 2u)  // Bottom-right front
49✔
345
       | static_cast<uint8_t>(grid.getValue(widthIndex,     heightIndex,     depthIndex    ) << 3u)  // Bottom-left front
49✔
346
       | static_cast<uint8_t>(grid.getValue(widthIndex,     heightIndex + 1, depthIndex + 1) << 4u)  // Top-left back
48✔
347
       | static_cast<uint8_t>(grid.getValue(widthIndex + 1, heightIndex + 1, depthIndex + 1) << 5u)  // Top-right back
47✔
348
       | static_cast<uint8_t>(grid.getValue(widthIndex + 1, heightIndex + 1, depthIndex    ) << 6u)  // Top-right front
47✔
349
       | static_cast<uint8_t>(grid.getValue(widthIndex,     heightIndex + 1, depthIndex    ) << 7u); // Top-left front
48✔
350
}
351

352
} // namespace
353

354
Mesh MarchingCubes::compute(const Grid3b& grid) {
7✔
355
  ZoneScopedN("MarchingCubes::compute");
356

357
  if (grid.getWidth() < 2 || grid.getHeight() < 2 || grid.getDepth() < 2)
7✔
358
    throw std::invalid_argument("[MarchingCubes] The input grid's width, height & depth must be at least 2.");
2✔
359

360
  Mesh mesh;
5✔
361
  Submesh& submesh = mesh.addSubmesh();
5✔
362

363
  const Vec3f globalOffset(static_cast<float>(grid.getWidth() - 1) * 0.5f,
15✔
364
                           static_cast<float>(grid.getHeight() - 1) * 0.5f,
5✔
365
                           static_cast<float>(grid.getDepth() - 1) * 0.5f);
10✔
366

367
  submesh.getVertices() = Threading::parallelizeReduce(0, grid.getDepth() - 1, [&grid, globalOffset] (const auto& range) {
10✔
368
    ZoneScopedN("MarchingCubes::compute");
369

370
    std::vector<Vertex> vertices;
7✔
371

372
    for (std::size_t depthIndex = range.beginIndex; depthIndex < range.endIndex; ++depthIndex) {
13✔
373
      for (std::size_t heightIndex = 0; heightIndex < grid.getHeight() - 1; ++heightIndex) {
17✔
374
        for (std::size_t widthIndex = 0; widthIndex < grid.getWidth() - 1; ++widthIndex) {
58✔
375
          const uint8_t cellConfig = computeCellConfiguration(grid, widthIndex, heightIndex, depthIndex);
47✔
376
          const std::array<int8_t, 15>& edgeIndices = trianglesIndices[cellConfig];
49✔
377
          const Vec3f localOffset(static_cast<float>(widthIndex), static_cast<float>(heightIndex), static_cast<float>(depthIndex));
47✔
378

379
          for (std::size_t edgeIndex = 0; edgeIndex < edgeIndices.size(); edgeIndex += 3) {
112✔
380
            if (edgeIndices[edgeIndex] == NONE)
112✔
381
              break;
47✔
382

383
            // TODO: compute texcoords
384
            // TODO: compute tangent
385
            const Vec3f firstPoint  = edgeVertices[edgeIndices[edgeIndex    ]] - globalOffset + localOffset;
65✔
386
            const Vec3f secondPoint = edgeVertices[edgeIndices[edgeIndex + 1]] - globalOffset + localOffset;
64✔
387
            const Vec3f thirdPoint  = edgeVertices[edgeIndices[edgeIndex + 2]] - globalOffset + localOffset;
64✔
388
            const Vec3f normal      = (secondPoint - firstPoint).cross(thirdPoint - firstPoint).normalize();
64✔
389
            vertices.emplace_back(Vertex{ firstPoint, Vec2f(), normal });
192✔
390
            vertices.emplace_back(Vertex{ secondPoint, Vec2f(), normal });
192✔
391
            vertices.emplace_back(Vertex{ thirdPoint, Vec2f(), normal });
192✔
392
          }
393
        }
394
      }
395
    }
396

397
    return vertices;
6✔
NEW
398
  }, [] (std::vector<Vertex>&& result, const std::vector<Vertex>& vertices) {
×
399
    ZoneScopedN("Reduce");
400
    result.insert(result.end(), vertices.begin(), vertices.end());
2✔
401
    return std::move(result);
2✔
402
  });
5✔
403

404
  std::vector<unsigned int>& indices = submesh.getTriangleIndices();
5✔
405
  indices.resize(submesh.getVertices().size());
5✔
406
  std::iota(indices.begin(), indices.end(), 0);
5✔
407

408
  return mesh;
10✔
409
}
×
410

411
} // namespace Raz
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc