Beispiel #1
0
    public void RequestMesh(List <ChunkToGenerate> chunksToGen, int resolution, bool flatShaded)
    {
        for (int i = 0; i < chunksToGen.Count; i++)
        {
            IDensityFunc f     = Activator.CreateInstance(chunksToGen[i].DensityFunc) as IDensityFunc;
            var          chunk = chunksToGen[i].Chunk;

            ThreadedDataRequester.Instance.RequestData(() => { return(chunk.CubeMarch(resolution, f, flatShaded)); }, (obj) => OnDataRecieved((MeshData)obj, chunk));
        }
    }
Beispiel #2
0
    public void RequestMesh(List <ChunkToGenerate> chunksToGen, Type idensityFunc, int resolution, bool flatShaded)
    {
        //TODO maybe instance for each and every one extra instead of one
        IDensityFunc densFunc = Activator.CreateInstance(idensityFunc) as IDensityFunc;

        for (int i = 0; i < chunksToGen.Count; i++)
        {
            var chunk = chunksToGen[i].Chunk;
            ThreadedDataRequester.Instance.RequestData(() => { return(chunk.CubeMarch(resolution, densFunc, flatShaded)); }, (obj) => OnDataRecieved((MeshData)obj, chunk));
        }
    }
Beispiel #3
0
    public MeshData CubeMarch(Vector3 gridResolution, IDensityFunc func, bool flatShaded = true, float isoLevel = 0f)
    {
        List <Triangle> trianglesFromMarch = new List <Triangle>();

        //loop over everything
        //stop at  < gridResolution as we need to calculate the positions +1 anyways and the alst rows colums fileds voxel is out of the chunkbounds anyway
        for (int z = 0; z < gridResolution.z; z++)
        {
            for (int y = 0; y < gridResolution.y; y++)
            {
                for (int x = 0; x < gridResolution.x; x++)
                {
                    Vertex[] voxel     = GetVoxel(x, y, z, gridResolution, func);
                    int      lookUpIdx = GetLookUpIndex(voxel, isoLevel);

                    for (int i = 0; MeshGenerationLUTs.triTable[lookUpIdx][i] != -1; i += 3)
                    {
                        int idxA0 = MeshGenerationLUTs.cornerIndexAFromEdge[MeshGenerationLUTs.triTable[lookUpIdx][i]];
                        int idxB0 = MeshGenerationLUTs.cornerIndexBFromEdge[MeshGenerationLUTs.triTable[lookUpIdx][i]];

                        int idxA1 = MeshGenerationLUTs.cornerIndexAFromEdge[MeshGenerationLUTs.triTable[lookUpIdx][i + 1]];
                        int idxB1 = MeshGenerationLUTs.cornerIndexBFromEdge[MeshGenerationLUTs.triTable[lookUpIdx][i + 1]];

                        int idxA2 = MeshGenerationLUTs.cornerIndexAFromEdge[MeshGenerationLUTs.triTable[lookUpIdx][i + 2]];
                        int idxB2 = MeshGenerationLUTs.cornerIndexBFromEdge[MeshGenerationLUTs.triTable[lookUpIdx][i + 2]];


                        trianglesFromMarch.Add(
                            new Triangle()
                        {
                            A          = CubeMarchLerp(voxel[idxA0], voxel[idxB0], isoLevel),
                            VertexA_ID = new PointCreators(voxel[idxA0].ID, voxel[idxB0].ID),
                            B          = CubeMarchLerp(voxel[idxA1], voxel[idxB1], isoLevel),
                            VertexB_ID = new PointCreators(voxel[idxA1].ID, voxel[idxB1].ID),
                            C          = CubeMarchLerp(voxel[idxA2], voxel[idxB2], isoLevel),
                            VertexC_ID = new PointCreators(voxel[idxA2].ID, voxel[idxB2].ID)
                        }
                            );
                    }
                }
            }
        }// end for z

        return(CreatMeshData(trianglesFromMarch, flatShaded));
    }
Beispiel #4
0
 public MeshData CubeMarch(float girdResolution, IDensityFunc func, bool flatShaded = true, float isoLevel = 0f)
 {
     return(CubeMarch(Vector3.one * girdResolution, func, flatShaded, isoLevel));
 }
Beispiel #5
0
    Vertex[] GetVoxel(int x, int y, int z, Vector3 gridResolution, IDensityFunc densFunc)
    {
        Vertex[] voxel = new Vertex[8];

        Vector3 localP = GetLocalPoint(x, y, z + 1, gridResolution);
        Vector3 p      = LocalToWorld(localP);

        voxel[0] = new Vertex
        {
            ID     = new VertexID(x, y, z + 1),
            Point  = p,
            IsoVal = densFunc.Evaluate(
                new SamplePointVariables(p.x, localP.x),
                new SamplePointVariables(p.y, localP.y),
                new SamplePointVariables(p.z, localP.z)
                )
        };

        localP = GetLocalPoint(x + 1, y, z + 1, gridResolution);
        p      = LocalToWorld(localP);

        voxel[1] = new Vertex
        {
            ID     = new VertexID(x + 1, y, z + 1),
            Point  = p,
            IsoVal = densFunc.Evaluate(
                new SamplePointVariables(p.x, localP.x),
                new SamplePointVariables(p.y, localP.y),
                new SamplePointVariables(p.z, localP.z)
                )
        };

        localP   = GetLocalPoint(x + 1, y, z, gridResolution);
        p        = LocalToWorld(localP);
        voxel[2] = new Vertex
        {
            ID     = new VertexID(x + 1, y, z),
            Point  = p,
            IsoVal = densFunc.Evaluate(
                new SamplePointVariables(p.x, localP.x),
                new SamplePointVariables(p.y, localP.y),
                new SamplePointVariables(p.z, localP.z)
                )
        };

        localP   = GetLocalPoint(x, y, z, gridResolution);
        p        = LocalToWorld(localP);
        voxel[3] = new Vertex
        {
            ID     = new VertexID(x, y, z),
            Point  = p,
            IsoVal = densFunc.Evaluate(
                new SamplePointVariables(p.x, localP.x),
                new SamplePointVariables(p.y, localP.y),
                new SamplePointVariables(p.z, localP.z)
                )
        };

        localP   = GetLocalPoint(x, y + 1, z + 1, gridResolution);
        p        = LocalToWorld(localP);
        voxel[4] = new Vertex
        {
            ID     = new VertexID(x, y + 1, z + 1),
            Point  = p,
            IsoVal = densFunc.Evaluate(
                new SamplePointVariables(p.x, localP.x),
                new SamplePointVariables(p.y, localP.y),
                new SamplePointVariables(p.z, localP.z)
                )
        };

        localP   = GetLocalPoint(x + 1, y + 1, z + 1, gridResolution);
        p        = LocalToWorld(localP);
        voxel[5] = new Vertex
        {
            ID     = new VertexID(x + 1, y + 1, z + 1),
            Point  = p,
            IsoVal = densFunc.Evaluate(
                new SamplePointVariables(p.x, localP.x),
                new SamplePointVariables(p.y, localP.y),
                new SamplePointVariables(p.z, localP.z)
                )
        };

        localP   = GetLocalPoint(x + 1, y + 1, z, gridResolution);
        p        = LocalToWorld(localP);
        voxel[6] = new Vertex
        {
            ID     = new VertexID(x + 1, y + 1, z),
            Point  = p,
            IsoVal = densFunc.Evaluate(
                new SamplePointVariables(p.x, localP.x),
                new SamplePointVariables(p.y, localP.y),
                new SamplePointVariables(p.z, localP.z)
                )
        };

        localP   = GetLocalPoint(x, y + 1, z, gridResolution);
        p        = LocalToWorld(localP);
        voxel[7] = new Vertex
        {
            ID     = new VertexID(x, y + 1, z),
            Point  = p,
            IsoVal = densFunc.Evaluate(
                new SamplePointVariables(p.x, localP.x),
                new SamplePointVariables(p.y, localP.y),
                new SamplePointVariables(p.z, localP.z)
                )
        };

        return(voxel);
    }