public bool UpdateChunk(ComputeShader computeShader, ThreadedChunkLoader thread, int updateSize, Vector3 position)
    {
        int  octreeSize = (int)Mathf.Pow(2, LOD);
        bool updated    = tree.VoxelizeUpdate(computeShader, thread, this, position, octreeSize);

        return(updated);
    }
    public bool CreateChunk(ComputeShader computeShader, ThreadedChunkLoader thread, int lod, Vector3 position)
    {
        LOD = lod;
        if (LOD < 1)
        {
            LOD = 1;
        }
        else if (LOD > 6)
        {
            LOD = 6;
        }
        int octreeSize = (int)Mathf.Pow(2, LOD);

        min = position - new Vector3(64 / 2, 64 / 2, 64 / 2);
        Vector3 octreePos = new Vector3(position.x - (64 / 2), position.y - (64 / 2), position.z - (64 / 2));
        bool    created   = tree.Voxelize(computeShader, thread, this, octreePos, octreeSize);

        if (meshObject != null)
        {
            meshObject.GetComponent <MeshINfo>().chunkMin = min;
        }

        if (!created && meshObject != null)
        {
            DestroyMesh();
        }

        return(created);
    }
    // Use this for initialization
    void Start()
    {
        //Octree.InitPermutations(133925);
        Octree.InitPermutations(1200);

        thread = new ThreadedChunkLoader(this);

        chunkQueue      = new Dictionary <Vector3, Vector3>();
        changedChunks   = new List <Chunk>();
        reloadingChunks = new Dictionary <Vector3, Chunk>();
        chunkGrid       = new List <Vector3>();

        prevCameraPos = Camera.main.transform.position;

        chunks = new Dictionary <Vector3, Chunk>();

        /*
         * chunkQueue.Sort(delegate(Vector3 c1, Vector3 c2){
         *      return Mathf.Abs((Camera.main.transform.position - c1).sqrMagnitude).CompareTo
         *              (Mathf.Abs(((Camera.main.transform.position - c2).sqrMagnitude)));
         * });
         *
         *
         * List<Vector3> sortQueue = chunkQueue.Keys.ToList();
         *
         * sortQueue.Sort(delegate(Vector3 c1, Vector3 c2) {
         *      return Mathf.Abs((Camera.main.transform.position - c1).sqrMagnitude).CompareTo
         *              (Mathf.Abs(((Camera.main.transform.position - c2).sqrMagnitude)));
         * });
         * chunkQueue.Clear();
         * chunkQueue = sortQueue.ToDictionary(x => x, x => x);
         */

        int mapMult = 16;
        int yMult   = 16;


        for (int x = 0; x < mapMult; x++)
        {
            for (int y = 0; y < yMult; y++)
            {
                for (int z = 0; z < mapMult; z++)
                {
                    chunkGrid.Add(new Vector3(x, y, z));
                }
            }
        }
    }
    private bool ComputeNewVoxels(ComputeShader shader, ThreadedChunkLoader thread, Chunk chunk, Vector3 min, int octreeSize)
    {
        float gpuStart = Time.realtimeSinceStartup;


        float[] chunkPos = new float[3] {
            min.x, min.y, min.z
        };
        shader.SetFloats("chunkPosition", chunkPos);

        shader.SetInt("resolution", octreeSize);
        shader.SetInt("octreeSize", octreeSize);

        int[] zero = new int[1] {
            0
        };

        float sqRTRC  = Mathf.Sqrt(octreeSize * octreeSize * octreeSize);
        int   sqRTRes = (int)sqRTRC;

        if (sqRTRC > sqRTRes)
        {
            sqRTRes++;
        }

        int[] zeroSq = new int[sqRTRes];
        for (int i = 0; i < sqRTRes; i++)
        {
            zeroSq[i] = 0;
        }

        ComputeBuffer Perm = new ComputeBuffer(512, sizeof(int));

        Perm.SetData(permutations);

        ComputeBuffer cornCount       = new ComputeBuffer(sqRTRes, sizeof(int));
        ComputeBuffer finalCount      = new ComputeBuffer(1, sizeof(int));
        ComputeBuffer voxMatBuffer    = new ComputeBuffer(octreeSize * octreeSize * octreeSize, sizeof(uint));
        ComputeBuffer cornerMaterials = new ComputeBuffer((octreeSize + 1) * (octreeSize + 1) * (octreeSize + 1), sizeof(uint));

        shader.SetInt("primitiveModCount", chunk.modCount);
        ComputeBuffer PrimMods = null;

        if (chunk.modCount > 0)
        {
            PrimMods = new ComputeBuffer(chunk.modCount, (sizeof(int) * 2) + (sizeof(float) * 6));
            PrimMods.SetData(chunk.primitiveMods);
        }


        int kernel = shader.FindKernel("ComputeMaterials");

        if (chunk.modCount > 0)
        {
            shader.SetBuffer(kernel, "primitiveMods", PrimMods);
        }
        shader.SetBuffer(kernel, "Perm", Perm);
        shader.SetBuffer(kernel, "cornerMaterials", cornerMaterials);
        shader.Dispatch(kernel, 1, 1, 1);

        kernel = shader.FindKernel("ComputeCorners");
        shader.SetBuffer(kernel, "voxelMaterials", voxMatBuffer);
        shader.SetBuffer(kernel, "cornerCount", cornCount);
        shader.SetBuffer(kernel, "cornerMaterials", cornerMaterials);
        cornCount.SetData(zeroSq);
        shader.Dispatch(kernel, 1, 1, 1);

        kernel = shader.FindKernel("AddLength");
        shader.SetBuffer(kernel, "cornerCount", cornCount);
        shader.SetBuffer(kernel, "finalCount", finalCount);
        finalCount.SetData(zero);
        shader.Dispatch(kernel, 1, 1, 1);

        int[] voxelCount = new int[1];
        finalCount.GetData(voxelCount);
        int count = voxelCount[0];

        if (count <= 0)
        {
            voxMatBuffer.Dispose();
            cornerMaterials.Dispose();
            cornCount.Dispose();
            finalCount.Dispose();
            Perm.Dispose();
            if (chunk.modCount > 0)
            {
                PrimMods.Dispose();
                PrimMods = null;
            }
            Perm            = null;
            voxMatBuffer    = null;
            cornerMaterials = null;
            cornCount       = null;
            finalCount      = null;
            return(false);
        }

        //Debug.Log (count);

        ComputeBuffer cornerIndexes = new ComputeBuffer(count, sizeof(uint));

        kernel = shader.FindKernel("ComputePositions");
        shader.SetBuffer(kernel, "voxelMaterials", voxMatBuffer);
        shader.SetBuffer(kernel, "cornerCount", cornCount);
        shader.SetBuffer(kernel, "cornerIndexes", cornerIndexes);
        shader.Dispatch(kernel, 1, 1, 1);

        ComputeBuffer voxBuffer      = new ComputeBuffer(count, (sizeof(float) * 6) + sizeof(int));
        ComputeBuffer positionBuffer = new ComputeBuffer(count, sizeof(float) * 3);

        kernel = shader.FindKernel("ComputeVoxels");
        if (chunk.modCount > 0)
        {
            shader.SetBuffer(kernel, "primitiveMods", PrimMods);
        }
        shader.SetBuffer(kernel, "Perm", Perm);
        shader.SetBuffer(kernel, "voxMins", positionBuffer);
        shader.SetBuffer(kernel, "voxelMaterials", voxMatBuffer);
        shader.SetBuffer(kernel, "finalCount", finalCount);
        shader.SetBuffer(kernel, "cornerIndexes", cornerIndexes);
        shader.SetBuffer(kernel, "voxels", voxBuffer);
        shader.Dispatch(kernel, (count / 128) + 1, 1, 1);

        Vector3[] voxelMins = new Vector3[count];
        positionBuffer.GetData(voxelMins);
        positionBuffer.Dispose();
        positionBuffer = null;

        uint[] voxelMaterials = new uint[count];
        cornerIndexes.GetData(voxelMaterials);
        cornerIndexes.Dispose();
        cornerIndexes = null;

        GPUVOX[] voxs = new GPUVOX[count];
        voxBuffer.GetData(voxs);
        voxBuffer.Dispose();
        voxBuffer = null;

        voxMatBuffer.Dispose();
        cornerMaterials.Dispose();
        cornCount.Dispose();
        finalCount.Dispose();
        Perm.Dispose();
        if (chunk.modCount > 0)
        {
            PrimMods.Dispose();
            PrimMods = null;
        }
        Perm            = null;
        voxMatBuffer    = null;
        cornerMaterials = null;
        cornCount       = null;
        finalCount      = null;
        float gpuEnd = Time.realtimeSinceStartup;

        //Debug.Log ("GPU time on chunk: " + (gpuEnd - gpuStart));

        thread.setData(this, count, voxelMins, voxelMaterials, voxs, min, octreeSize);
        thread.setChunkForUpdate(chunk);
        thread.Start();

        return(true);
    }
 public bool VoxelizeUpdate(ComputeShader shader, ThreadedChunkLoader thread, Chunk chunk, Vector3 pos, int size)
 {
     return(ComputeNewVoxels(shader, thread, chunk, pos, size));
 }
 public bool Voxelize(ComputeShader shader, ThreadedChunkLoader thread, Chunk chunk, Vector3 min, int size)
 {
     return(ComputeVoxels(shader, thread, chunk, min, size));
 }
Exemple #7
0
    // Use this for initialization
    void Start()
    {
        //Octree.InitPermutations(133925);
        Octree.InitPermutations(1200);

        thread = new ThreadedChunkLoader(this);

        chunkQueue = new Dictionary<Vector3, Vector3>();
        changedChunks = new List<Chunk>();
        reloadingChunks = new Dictionary<Vector3, Chunk>();
        chunkGrid = new List<Vector3>();

        prevCameraPos = Camera.main.transform.position;

        chunks = new Dictionary<Vector3, Chunk>();

        /*
        chunkQueue.Sort(delegate(Vector3 c1, Vector3 c2){
            return Mathf.Abs((Camera.main.transform.position - c1).sqrMagnitude).CompareTo
                (Mathf.Abs(((Camera.main.transform.position - c2).sqrMagnitude)));
        });

        List<Vector3> sortQueue = chunkQueue.Keys.ToList();

        sortQueue.Sort(delegate(Vector3 c1, Vector3 c2) {
            return Mathf.Abs((Camera.main.transform.position - c1).sqrMagnitude).CompareTo
                (Mathf.Abs(((Camera.main.transform.position - c2).sqrMagnitude)));
        });
        chunkQueue.Clear();
        chunkQueue = sortQueue.ToDictionary(x => x, x => x);
        */

        int mapMult = 16;
        int yMult = 16;

        for (int x = 0; x < mapMult; x++)
        {
            for (int y = 0; y < yMult; y++)
            {
                for (int z = 0; z < mapMult; z++)
                {
                    chunkGrid.Add(new Vector3(x, y, z));
                }
            }
        }
    }
Exemple #8
0
    public bool UpdateChunk(ComputeShader computeShader, ThreadedChunkLoader thread, int updateSize, Vector3 position)
    {
        int octreeSize = (int) Mathf.Pow(2, LOD);
        bool updated = tree.VoxelizeUpdate(computeShader, thread, this, position, octreeSize);

        return updated;
    }
Exemple #9
0
    public bool CreateChunk(ComputeShader computeShader, ThreadedChunkLoader thread, int lod, Vector3 position)
    {
        LOD = lod;
        if (LOD < 1)
            LOD = 1;
        else if (LOD > 6)
            LOD = 6;
        int octreeSize = (int) Mathf.Pow(2, LOD);
        min = position - new Vector3(64 / 2, 64 / 2, 64 / 2);
        Vector3 octreePos = new Vector3(position.x - (64 / 2), position.y - (64 / 2), position.z - (64 / 2));
        bool created = tree.Voxelize(computeShader, thread, this, octreePos, octreeSize);

        if (meshObject != null)
        {
            meshObject.GetComponent<MeshINfo>().chunkMin = min;
        }

        if (!created && meshObject != null)
        {
            DestroyMesh();
        }

        return created;
    }