public bool ConstructLeaf(List<VertexPositionColorNormal> vertices, int grid_size)
{
if (size != 1)
return false;
int corners = 0;
float[, ,] samples = new float[2, 2, 2];
for (int i = 0; i < 8; i++)
{
if ((samples[i / 4, i % 4 / 2, i % 2] = Sampler.Sample(position + new Vector3(i / 4, i % 4 / 2, i % 2))) < 0)
corners |= 1 << i;
}
if (corners == 0 || corners == 255)
return false;
//type = OctreeNodeType.Leaf;
//return true;
QEF3D qef = new QEF3D();
QEFProper.QEFSolver qefp = new QEFProper.QEFSolver();
Vector3 average_normal = Vector3.Zero;
for (int i = 0; i < 12; i++)
{
int c1 = edgevmap[i, 0];
int c2 = edgevmap[i, 1];
int m1 = (corners >> c1) & 1;
int m2 = (corners >> c2) & 1;
if (m1 == m2)
continue;
float d1 = samples[c1 / 4, c1 % 4 / 2, c1 % 2];
float d2 = samples[c2 / 4, c2 % 4 / 2, c2 % 2];
Vector3 p1 = new Vector3((float)((c1 / 4)), (float)((c1 % 4 / 2)), (float)((c1 % 2)));
Vector3 p2 = new Vector3((float)((c2 / 4)), (float)((c2 % 4 / 2)), (float)((c2 % 2)));
Vector3 intersection = Sampler.GetIntersection(p1, p2, d1, d2) + position;
Vector3 normal = Sampler.GetNormal(intersection);//GetNormal(x, y);
average_normal += normal;
qef.Add(intersection, normal);
qefp.Add(intersection, normal);
}
Vector3 n = average_normal / (float)qef.Intersections.Count;
n.Normalize();
draw_info = new OctreeDrawInfo();
//draw_info.position = position + qef.Solve2(0, 0, 0);
draw_info.position = qefp.Solve(1e-6f, 4, 1e-6f);
draw_info.corners = corners;
draw_info.averageNormal = n;
draw_info.qef = qefp;
//vertices.Add(new VertexPositionColorNormal(position + draw_info.position, Color.LightGreen, n));
type = OctreeNodeType.Leaf;
return true;
}