예제 #1
0
        //public NativeArray<Vector3> m_verts;
        //public NativeArray<int> m_indices;
        public void Execute(int index)
        {
            int x = index / (h * d);
            int y = (index - x * h * d) / d;
            int z = (index - x * h * d) % h;

            float[] Cube = new float[8];
            for (int ii = 0; ii < 8; ii++)
            {
                ix       = x + Marching.VertexOffset[ii, 0];
                iy       = y + Marching.VertexOffset[ii, 1];
                iz       = z + Marching.VertexOffset[ii, 2];
                Cube[ii] = m_voxels[ix + iy * w + iz * w * h];
            }

            //perform algorithm
            int   i, j, vert, idx;
            int   flagIndex = 0;
            float offset    = 0f;
            NativeArray <Vector3> EdgeVertex = new NativeArray <Vector3>(12, Allocator.TempJob);

            for (i = 0; i < 8; i++)
            {
                //Debug.Log("Cube[i] " + Cube[i] + " Surface " + Surface);
                if (Cube[i] <= Surface)
                {
                    flagIndex |= 1 << i;
                }
            }
            //Debug.Log("b4 intersection : " + flagIndex);
            int edgeFlags = MarchingCube.CubeEdgeFlags[flagIndex];

            if (edgeFlags == 0)
            {
                return;
            }

            //Debug.Log("Got intersection");
            for (i = 0; i < 12; i++)
            {
                //intersection happens
                if ((edgeFlags & (1 << i)) != 0)
                {
                    offset = Marching.GetOffset(Cube[MarchingCube.EdgeConnection[i, 0]], Cube[MarchingCube.EdgeConnection[i, 1]]);

                    EdgeVertex[i] = new Vector3(x + (Marching.VertexOffset[MarchingCube.EdgeConnection[i, 0], 0]
                                                     + offset * MarchingCube.EdgeDirection[i, 0]),
                                                y + (Marching.VertexOffset[MarchingCube.EdgeConnection[i, 0], 1]
                                                     + offset * MarchingCube.EdgeDirection[i, 1]),
                                                z + (Marching.VertexOffset[MarchingCube.EdgeConnection[i, 0], 2]
                                                     + offset * MarchingCube.EdgeDirection[i, 2]));
                }
            }

            for (i = 0; i < 5; i++)
            {
                if (MarchingCube.TriangleConnectionTable[flagIndex, 3 * i] < 0)
                {
                    break;
                }

                //idx = x * w * d + y * d  + z;
                for (j = 0; j < 3; j++)
                {
                    vert = MarchingCube.TriangleConnectionTable[flagIndex, 3 * i + j];
                    m_indices[currentVertIndex] = currentVertIndex + WindingOrder[j];
                    m_verts[currentVertIndex++] = EdgeVertex[vert];
                    // Debug.Log("zzz " + currentVertIndex);
                }
            }

            EdgeVertex.Dispose();
        }