Isosurface.AdaptiveDualContouring.OctreeNode.ConstructLeaf C# (CSharp) Method

ConstructLeaf() public method

public ConstructLeaf ( List vertices, int grid_size ) : bool
vertices List
grid_size int
return bool
        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;
        }