96 typedef std::pair<std::size_t, std::size_t> Edge;
97 typedef std::map<Edge, unsigned int> EdgeMap;
100 while (accessor.next())
104 for (
int i = 0; i < 8; ++i)
105 if (accessor.sdf[i] < 0.0f)
106 cubeconfig |= (1 << i);
109 if (cubeconfig == 0x00 || cubeconfig == 0xff)
116 unsigned int vid[12];
117 for (
int i = 0; i < 12; ++i)
119 if (!(edgeconfig & (1 << i)))
125 Edge edge(accessor.vid[ev[0]], accessor.vid[ev[1]]);
126 if (edge.first > edge.second)
129 EdgeMap::iterator iter = vert_ids.find(edge);
130 if (iter != vert_ids.end())
132 vid[i] = iter->second;
137 float d[2] = { accessor.sdf[ev[0]], accessor.sdf[ev[1]] };
138 float w[2] = { d[1] / (d[1] - d[0]), -d[0] / (d[1] - d[0]) };
140 (accessor.pos[ev[0]], accessor.pos[ev[1]], w[0], w[1]);
142 if (accessor.has_colors())
145 (accessor.color[ev[0]], accessor.color[ev[1]], w[0], w[1]);
149 vid[i] = verts.size();
150 vert_ids.insert(std::make_pair(edge, verts.size()));
155 for (
int j = 0;
mc_tri_table[cubeconfig][j] != -1; j += 3)
156 for (
int k = 0; k < 3; ++k)