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

ConstructLeaf() public method

public ConstructLeaf ( List &vertices, int &index ) : bool
vertices List
index int
return bool
        public bool ConstructLeaf(ref List<VertexPositionColorNormalNormal> vertices, ref int index)
        {
            if (size != 1)
                return false;

            this.index = index++;
            type = NodeType.Leaf;
            int corners = 0;
            float[] samples = new float[8];
            for (int i = 0; i < 8; i++)
            {
                if ((samples[i] = Sampler.Sample(position + Utilities.TCornerDeltas[i])) < 0)
                    corners |= 1 << i;
            }
            this.corners = (byte)corners;

            if (corners == 0 || corners == 255)
                return false;

            int[][] v_edges = new int[Utilities.TransformedVerticesNumberTable[corners]][];
            this.vertices = new Vertex[Utilities.TransformedVerticesNumberTable[corners]];

            int v_index = 0;
            int e_index = 0;
            v_edges[0] = new int[] { -1, -1, -1, -1, -1, -1, -1, -1 };
            for (int e = 0; e < 16; e++)
            {
                int code = Utilities.TransformedEdgesTable[corners, e];
                if (code == -2)
                {
                    v_index++;
                    break;
                }
                if (code == -1)
                {
                    v_index++;
                    e_index = 0;
                    v_edges[v_index] = new int[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };
                    continue;
                }

                v_edges[v_index][e_index++] = code;
            }

            if (v_index > 1)
            {
            }

            for (int i = 0; i < v_index; i++)
            {
                int k = 0;
                this.vertices[i] = new Vertex();
                this.vertices[i].qef = new QEFProper.QEFSolver();
                Vector3 normal = Vector3.Zero;
                int[] ei = new int[12];
                if (this.position.X == 6 && this.position.Y == 0 && this.position.Z == 3)
                {
                }
                while (v_edges[i][k] != -1)
                {
                    ei[v_edges[i][k]] = 1;
                    Vector3 a = position + Utilities.TCornerDeltas[Utilities.TEdgePairs[v_edges[i][k], 0]] * size;
                    Vector3 b = position + Utilities.TCornerDeltas[Utilities.TEdgePairs[v_edges[i][k], 1]] * size;
                    Vector3 intersection = Sampler.GetIntersection(a, b, samples[Utilities.TEdgePairs[v_edges[i][k], 0]], samples[Utilities.TEdgePairs[v_edges[i][k], 1]]);
                    Vector3 n = Sampler.GetNormal(intersection);
                    normal += n;
                    this.vertices[i].qef.Add(intersection, n);
                    k++;
                }

                normal /= (float)k;
                normal.Normalize();
                this.vertices[i].index = vertices.Count;
                this.vertices[i].parent = null;
                this.vertices[i].collapsible = true;
                this.vertices[i].normal = normal;
                this.vertices[i].euler = 1;
                this.vertices[i].eis = ei;
                this.vertices[i].in_cell = this.child_index;
                this.vertices[i].face_prop2 = true;
                if (this.index == 1028)
                {
                }
                this.vertices[i].qef.Solve(1e-6f, 4, 1e-6f);
                this.vertices[i].error = this.vertices[i].qef.GetError();
                //VertexPositionColorNormalNormal vert = new VertexPositionColorNormalNormal();
                //vert.Position = this.vertices[i].qef.Solve(1e-6f, 4, 1e-6f) + position;
                //vert.Normal = Sampler.GetNormal(vert.Position);
                //vert.Color = new Color(vert.Normal * 0.5f + Vector3.One * 0.5f);
                //vertices.Add(vert);
            }

            for (int i = 0; i < this.vertices.Length; i++)
            {
                if (this.vertices[i] == null)
                {
                }
            }

            return true;
        }