Example #1
0
        public static void Polygonise(IDistanceField a_distanceField, DistanceField <Chunk.Voxel> .Cell[] a_cells, int a_x, int a_y, int a_z, float a_iso, List <Chunk.ChunkVertex> a_verticies)
        {
            int cubeIndex = 0;

            for (int i = 0; i < 8; ++i)
            {
                if (a_cells[i].Distance < a_iso)
                {
                    cubeIndex |= 1 << i;
                }
            }

            if (EdgeTable[cubeIndex] == 0)
            {
                return;
            }

            Chunk.ChunkVertex[] vertList = VertexList(a_distanceField, a_cells, a_x, a_y, a_z, a_iso, cubeIndex);

            for (int i = 0; TriTable[cubeIndex][i] != -1; i += 3)
            {
                a_verticies.Add(vertList[TriTable[cubeIndex][i + 0]]);
                a_verticies.Add(vertList[TriTable[cubeIndex][i + 1]]);
                a_verticies.Add(vertList[TriTable[cubeIndex][i + 2]]);
            }
        }
Example #2
0
        public DistanceFieldCollider(IDistanceField a_distanceField, PhysicsEngine a_engine)
        {
            m_distanceField = a_distanceField;

            m_engine = a_engine;

            m_engine.InputQueue.Enqueue(this);
        }
Example #3
0
        private static Chunk.ChunkVertex[] VertexList(IDistanceField a_distanceField, DistanceField <Chunk.Voxel> .Cell[] a_cells, int a_x, int a_y, int a_z, float a_iso, int a_cubeIndex)
        {
            Chunk.ChunkVertex[] vertList = new Chunk.ChunkVertex[12];

            if ((EdgeTable[a_cubeIndex] & 1) != 0)
            {
                vertList[0].Position = new Vector4(LinearInterp
                                                   (
                                                       new Vector4((a_x + 0) * a_distanceField.Spacing,
                                                                   (a_y + 0) * a_distanceField.Spacing,
                                                                   (a_z + 0) * a_distanceField.Spacing,
                                                                   a_cells[0].Distance),
                                                       new Vector4((a_x + 1) * a_distanceField.Spacing,
                                                                   (a_y + 0) * a_distanceField.Spacing,
                                                                   (a_z + 0) * a_distanceField.Spacing,
                                                                   a_cells[1].Distance),
                                                       a_iso
                                                   ), 1.0f);

                vertList[0].Color = a_cells[0].Data.UColor;
            }
            if ((EdgeTable[a_cubeIndex] & 2) != 0)
            {
                vertList[1].Position = new Vector4(LinearInterp
                                                   (
                                                       new Vector4((a_x + 1) * a_distanceField.Spacing,
                                                                   (a_y + 0) * a_distanceField.Spacing,
                                                                   (a_z + 0) * a_distanceField.Spacing,
                                                                   a_cells[1].Distance),
                                                       new Vector4((a_x + 1) * a_distanceField.Spacing,
                                                                   (a_y + 0) * a_distanceField.Spacing,
                                                                   (a_z + 1) * a_distanceField.Spacing,
                                                                   a_cells[2].Distance),
                                                       a_iso
                                                   ), 1.0f);

                vertList[1].Color = a_cells[1].Data.UColor;
            }
            if ((EdgeTable[a_cubeIndex] & 4) != 0)
            {
                vertList[2].Position = new Vector4(LinearInterp
                                                   (
                                                       new Vector4((a_x + 1) * a_distanceField.Spacing,
                                                                   (a_y + 0) * a_distanceField.Spacing,
                                                                   (a_z + 1) * a_distanceField.Spacing,
                                                                   a_cells[2].Distance),
                                                       new Vector4((a_x + 0) * a_distanceField.Spacing,
                                                                   (a_y + 0) * a_distanceField.Spacing,
                                                                   (a_z + 1) * a_distanceField.Spacing,
                                                                   a_cells[3].Distance),
                                                       a_iso
                                                   ), 1.0f);

                vertList[2].Color = a_cells[3].Data.UColor;
            }
            if ((EdgeTable[a_cubeIndex] & 8) != 0)
            {
                vertList[3].Position = new Vector4(LinearInterp
                                                   (
                                                       new Vector4((a_x + 0) * a_distanceField.Spacing,
                                                                   (a_y + 0) * a_distanceField.Spacing,
                                                                   (a_z + 1) * a_distanceField.Spacing,
                                                                   a_cells[3].Distance),
                                                       new Vector4((a_x + 0) * a_distanceField.Spacing,
                                                                   (a_y + 0) * a_distanceField.Spacing,
                                                                   (a_z + 0) * a_distanceField.Spacing,
                                                                   a_cells[0].Distance),
                                                       a_iso
                                                   ), 1.0f);

                vertList[3].Color = a_cells[0].Data.UColor;
            }
            if ((EdgeTable[a_cubeIndex] & 16) != 0)
            {
                vertList[4].Position = new Vector4(LinearInterp
                                                   (
                                                       new Vector4((a_x + 0) * a_distanceField.Spacing,
                                                                   (a_y + 1) * a_distanceField.Spacing,
                                                                   (a_z + 0) * a_distanceField.Spacing,
                                                                   a_cells[4].Distance),
                                                       new Vector4((a_x + 1) * a_distanceField.Spacing,
                                                                   (a_y + 1) * a_distanceField.Spacing,
                                                                   (a_z + 0) * a_distanceField.Spacing,
                                                                   a_cells[5].Distance),
                                                       a_iso
                                                   ), 1.0f);

                vertList[4].Color = a_cells[4].Data.UColor;
            }
            if ((EdgeTable[a_cubeIndex] & 32) != 0)
            {
                vertList[5].Position = new Vector4(LinearInterp
                                                   (
                                                       new Vector4((a_x + 1) * a_distanceField.Spacing,
                                                                   (a_y + 1) * a_distanceField.Spacing,
                                                                   (a_z + 0) * a_distanceField.Spacing,
                                                                   a_cells[5].Distance),
                                                       new Vector4((a_x + 1) * a_distanceField.Spacing,
                                                                   (a_y + 1) * a_distanceField.Spacing,
                                                                   (a_z + 1) * a_distanceField.Spacing,
                                                                   a_cells[6].Distance),
                                                       a_iso
                                                   ), 1.0f);

                vertList[5].Color = a_cells[5].Data.UColor;
            }
            if ((EdgeTable[a_cubeIndex] & 64) != 0)
            {
                vertList[6].Position = new Vector4(LinearInterp
                                                   (
                                                       new Vector4((a_x + 1) * a_distanceField.Spacing,
                                                                   (a_y + 1) * a_distanceField.Spacing,
                                                                   (a_z + 1) * a_distanceField.Spacing,
                                                                   a_cells[6].Distance),
                                                       new Vector4((a_x + 0) * a_distanceField.Spacing,
                                                                   (a_y + 1) * a_distanceField.Spacing,
                                                                   (a_z + 1) * a_distanceField.Spacing,
                                                                   a_cells[7].Distance),
                                                       a_iso
                                                   ), 1.0f);

                vertList[6].Color = a_cells[7].Data.UColor;
            }
            if ((EdgeTable[a_cubeIndex] & 128) != 0)
            {
                vertList[7].Position = new Vector4(LinearInterp
                                                   (
                                                       new Vector4((a_x + 0) * a_distanceField.Spacing,
                                                                   (a_y + 1) * a_distanceField.Spacing,
                                                                   (a_z + 1) * a_distanceField.Spacing,
                                                                   a_cells[7].Distance),
                                                       new Vector4((a_x + 0) * a_distanceField.Spacing,
                                                                   (a_y + 1) * a_distanceField.Spacing,
                                                                   (a_z + 0) * a_distanceField.Spacing,
                                                                   a_cells[4].Distance),
                                                       a_iso
                                                   ), 1.0f);

                vertList[7].Color = a_cells[4].Data.UColor;
            }
            if ((EdgeTable[a_cubeIndex] & 256) != 0)
            {
                vertList[8].Position = new Vector4(LinearInterp
                                                   (
                                                       new Vector4((a_x + 0) * a_distanceField.Spacing,
                                                                   (a_y + 0) * a_distanceField.Spacing,
                                                                   (a_z + 0) * a_distanceField.Spacing,
                                                                   a_cells[0].Distance),
                                                       new Vector4((a_x + 0) * a_distanceField.Spacing,
                                                                   (a_y + 1) * a_distanceField.Spacing,
                                                                   (a_z + 0) * a_distanceField.Spacing,
                                                                   a_cells[4].Distance),
                                                       a_iso
                                                   ), 1.0f);

                vertList[8].Color = a_cells[0].Data.UColor;
            }
            if ((EdgeTable[a_cubeIndex] & 512) != 0)
            {
                vertList[9].Position = new Vector4(LinearInterp
                                                   (
                                                       new Vector4((a_x + 1) * a_distanceField.Spacing,
                                                                   (a_y + 0) * a_distanceField.Spacing,
                                                                   (a_z + 0) * a_distanceField.Spacing,
                                                                   a_cells[1].Distance),
                                                       new Vector4((a_x + 1) * a_distanceField.Spacing,
                                                                   (a_y + 1) * a_distanceField.Spacing,
                                                                   (a_z + 0) * a_distanceField.Spacing,
                                                                   a_cells[5].Distance),
                                                       a_iso
                                                   ), 1.0f);

                vertList[9].Color = a_cells[1].Data.UColor;
            }
            if ((EdgeTable[a_cubeIndex] & 1024) != 0)
            {
                vertList[10].Position = new Vector4(LinearInterp
                                                    (
                                                        new Vector4((a_x + 1) * a_distanceField.Spacing,
                                                                    (a_y + 0) * a_distanceField.Spacing,
                                                                    (a_z + 1) * a_distanceField.Spacing,
                                                                    a_cells[2].Distance),
                                                        new Vector4((a_x + 1) * a_distanceField.Spacing,
                                                                    (a_y + 1) * a_distanceField.Spacing,
                                                                    (a_z + 1) * a_distanceField.Spacing,
                                                                    a_cells[6].Distance),
                                                        a_iso
                                                    ), 1.0f);

                vertList[10].Color = a_cells[2].Data.UColor;
            }
            if ((EdgeTable[a_cubeIndex] & 2048) != 0)
            {
                vertList[11].Position = new Vector4(LinearInterp
                                                    (
                                                        new Vector4((a_x + 0) * a_distanceField.Spacing,
                                                                    (a_y + 0) * a_distanceField.Spacing,
                                                                    (a_z + 1) * a_distanceField.Spacing,
                                                                    a_cells[3].Distance),
                                                        new Vector4((a_x + 0) * a_distanceField.Spacing,
                                                                    (a_y + 1) * a_distanceField.Spacing,
                                                                    (a_z + 1) * a_distanceField.Spacing,
                                                                    a_cells[7].Distance),
                                                        a_iso
                                                    ), 1.0f);

                vertList[11].Color = a_cells[3].Data.UColor;
            }

            return(vertList);
        }