86 typedef std::pair<std::size_t, std::size_t> Edge;
87 typedef std::map<Edge, unsigned int> EdgeMap;
88 typedef std::map<std::size_t, unsigned int> VertexMap;
92 while (accessor.next())
96 for (
int i = 0; i < 4; ++i)
97 if (accessor.sdf[i] < 0.0f)
98 tetconfig |= (1 << i);
100 if (tetconfig == 0x0 || tetconfig == 0xf)
108 for (
int i = 0; i < 6; ++i)
110 if (!(edgeconfig & (1 << i)))
116 Edge edge(accessor.vid[ev[0]], accessor.vid[ev[1]]);
117 if (edge.first > edge.second)
120 EdgeMap::iterator iter = edge_map.find(edge);
121 if (iter != edge_map.end())
123 vid[i] = iter->second;
128 float d[2] = { accessor.sdf[ev[0]], accessor.sdf[ev[1]] };
134 else if (d[1] == 0.0f)
139 VertexMap::iterator iter = vert_map.find(accessor.vid[snap]);
140 if (iter != vert_map.end())
142 vid[i] = iter->second;
146 if (accessor.has_colors())
147 colors.push_back(
math::Vec4f(accessor.color[snap], 1.0f));
148 vid[i] = verts.size();
149 verts.push_back(accessor.pos[snap]);
150 vert_map.insert(std::make_pair(accessor.vid[snap], vid[i]));
155 float w[2] = { d[1] / (d[1] - d[0]), -d[0] / (d[1] - d[0]) };
157 (accessor.pos[ev[0]], accessor.pos[ev[1]], w[0], w[1]);
160 if (accessor.has_colors())
163 (accessor.color[ev[0]], accessor.color[ev[1]], w[0], w[1]);
167 vid[i] = verts.size();
169 edge_map.insert(std::make_pair(edge, vid[i]));
173 for (
int i = 0;
mt_tri_table[tetconfig][i] != -1; i += 3)
175 unsigned int vids[3];
176 for (
int k = 0; k < 3; ++k)
178 if (vids[0] != vids[1] && vids[1] != vids[2] && vids[2] != vids[0])
179 for (
int k = 0; k < 3; ++k)
180 faces.push_back(vids[k]);