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

Razakhel / RaZ / 15087107203

17 May 2025 03:25PM UTC coverage: 74.544% (+0.1%) from 74.445%
15087107203

push

github

Razakhel
[Data/MarchingCubes] Added a marching cubes implementation

- It can be computed from a boolean 3D grid

42 of 43 new or added lines in 2 files covered. (97.67%)

8299 of 11133 relevant lines covered (74.54%)

1725.45 hits per line

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

97.5
/src/RaZ/Data/MarchingCubes.cpp
1
#include "RaZ/Data/Grid3.hpp"
2
#include "RaZ/Data/MarchingCubes.hpp"
3
#include "RaZ/Data/Mesh.hpp"
4

5
#include "tracy/Tracy.hpp"
6

7
namespace Raz {
8

9
namespace {
10

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

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

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

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

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

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

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

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

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

349
} // namespace
350

351
Mesh MarchingCubes::compute(const Grid3b& grid) {
7✔
352
  ZoneScopedN("MarchingCubes::compute");
353

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

357
  Mesh mesh;
5✔
358
  Submesh& submesh = mesh.addSubmesh();
5✔
359
  std::vector<Vertex>& vertices = submesh.getVertices();
5✔
360
  std::vector<unsigned int>& indices = submesh.getTriangleIndices();
5✔
361

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

366
  for (std::size_t depthIndex = 0; depthIndex < grid.getDepth() - 1; ++depthIndex) {
12✔
367
    for (std::size_t heightIndex = 0; heightIndex < grid.getHeight() - 1; ++heightIndex) {
18✔
368
      for (std::size_t widthIndex = 0; widthIndex < grid.getWidth() - 1; ++widthIndex) {
60✔
369
        const uint8_t cellConfig = computeCellConfiguration(grid, widthIndex, heightIndex, depthIndex);
49✔
370
        const std::array<int8_t, 15>& edgeIndices = trianglesIndices[cellConfig];
49✔
371
        const Vec3f localOffset(static_cast<float>(widthIndex), static_cast<float>(heightIndex), static_cast<float>(depthIndex));
49✔
372

373
        for (std::size_t edgeIndex = 0; edgeIndex < edgeIndices.size(); edgeIndex += 3) {
113✔
374
          if (edgeIndices[edgeIndex] == NONE)
113✔
375
            break;
49✔
376

377
          const Vec3f firstPoint  = edgeVertices[edgeIndices[edgeIndex    ]] - globalOffset + localOffset;
64✔
378
          const Vec3f secondPoint = edgeVertices[edgeIndices[edgeIndex + 1]] - globalOffset + localOffset;
64✔
379
          const Vec3f thirdPoint  = edgeVertices[edgeIndices[edgeIndex + 2]] - globalOffset + localOffset;
64✔
380
          const Vec3f normal      = (secondPoint - firstPoint).cross(thirdPoint - firstPoint).normalize();
64✔
381
          vertices.emplace_back(Vertex{ firstPoint, Vec2f(), normal });
192✔
382
          vertices.emplace_back(Vertex{ secondPoint, Vec2f(), normal });
192✔
383
          vertices.emplace_back(Vertex{ thirdPoint, Vec2f(), normal });
192✔
384

385
          indices.emplace_back(static_cast<unsigned int>(vertices.size() - 3));
64✔
386
          indices.emplace_back(static_cast<unsigned int>(vertices.size() - 2));
64✔
387
          indices.emplace_back(static_cast<unsigned int>(vertices.size() - 1));
64✔
388
        }
389
      }
390
    }
391
  }
392

393
  return mesh;
10✔
NEW
394
}
×
395

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

© 2026 Coveralls, Inc