//Unloads a chunk
    public void UnloadChunk(Vector3Int chunkPos)
    {
        MarchingCubeChunk chunk = allPooledChunks.Find(x => x.chunkPosition == chunkPos);

        if (chunk != null)
        {
            pooledChunks.Add(chunk);
        }
    }
    //Player chunk update
    public void ChunkLoadUpdate(float distance, Vector3Int chunkPos)
    {
        if (!data.useLOD)
        {
            return;
        }
        MarchingCubeChunk chunk = allPooledChunks.Find(x => x.chunkPosition == chunkPos);

        if (chunk != null)
        {
            chunk.GenerateMesh(data, colorData, chunkPos, this, triTable, edgeTable, edgeTable2, Mathf.RoundToInt(Mathf.Clamp(distance, 0, data.resolution - 1)), false);
        }
    }
    void ThreadMeshData(MeshData meshData, Vector3 center, MarchingCubeChunkSetting chunkSetting, NoiseSetting noiseSetting, Action <MeshData> callback)
    {
        List <MarchingCube> cubes = MarchingCubeChunk.InitVertices(center, chunkSetting, noiseSetting);

        Vector3[] vertices = MarchingCubeChunk.GenerateVertices(cubes);
        meshData.cubes     = cubes;
        meshData.vertices  = vertices;
        meshData.triangles = MarchingCubeChunk.GenerateTriangles(vertices);
        meshData.uvs       = biomeSetting.GenerateUVS(this.chunkSetting, vertices);

        lock (meshDataThreadInfoQueue)
        {
            meshDataThreadInfoQueue.Enqueue(new GeneratorThreadInfo <MeshData>(callback, meshData));
        }
    }
    //This method is INTENDED TO MAKE CHUNK AT EDITOR, EXTERAMLY SLOW AT IN GAME
    public void GenerateChunksAtMain(Vector3 center)
    {
        if (marchingCubeChunkDictionary == null)
        {
            marchingCubeChunkDictionary = new Dictionary <Vector3, GameObject>();
        }

        int xOffset = (int)center.x;
        int zOffset = (int)center.z;

        for (int x = -(int)chunkSetting.chunkRenderNumber.x; x <= (int)chunkSetting.chunkRenderNumber.x; x++)
        {
            for (int y = -(int)chunkSetting.chunkRenderNumber.y; y <= (int)chunkSetting.chunkRenderNumber.y; y++)
            {
                for (int z = -(int)chunkSetting.chunkRenderNumber.z; z <= (int)chunkSetting.chunkRenderNumber.z; z++)
                {
                    float   meshDistance = chunkSetting.distanceBetweenVertex * (chunkSetting.numberOfVerticesPerLine);
                    Vector3 offset       = new Vector3(0, 0, 0);
                    offset.x = Mathf.RoundToInt(center.x / meshDistance) * meshDistance;
                    offset.y = 0;
                    offset.z = Mathf.RoundToInt(center.z / meshDistance) * meshDistance;
                    Vector3 centerOfMarchingCube = new Vector3(x, y, z) * meshDistance + offset;
                    if (!marchingCubeChunkDictionary.ContainsKey(centerOfMarchingCube))
                    {
                        GameObject marchingCubeParentObject = GenerateChunkObject(centerOfMarchingCube);
                        marchingCubeChunkDictionary.Add(centerOfMarchingCube, marchingCubeParentObject);

                        //Make mesh without threading
                        MeshData meshData = new MeshData();
                        meshData.terrainObject = marchingCubeParentObject;

                        meshData.cubes     = MarchingCubeChunk.InitVertices(centerOfMarchingCube, chunkSetting, noiseSetting);
                        meshData.vertices  = MarchingCubeChunk.GenerateVertices(meshData.cubes);
                        meshData.triangles = MarchingCubeChunk.GenerateTriangles(meshData.vertices);
                        Mesh mesh = new Mesh
                        {
                            vertices  = meshData.vertices,
                            triangles = meshData.triangles
                        };
                        mesh.SetUVs(2, biomeSetting.GenerateUVS(chunkSetting, meshData.vertices));
                        mesh.RecalculateNormals();
                        meshData.terrainObject.GetComponent <MeshCollider>().sharedMesh = mesh;
                        meshData.terrainObject.GetComponent <MeshFilter>().sharedMesh   = mesh;
                    }
                }
            }
        }
    }
 //Pre-generate the chunk pool for later use
 public void GenerateChunkPool(int _size)
 {
     GenerateTriTable();
     for (int x = -_size; x < _size; x++)
     {
         for (int z = -_size; z < _size; z++)
         {
             for (int y = -_size; y < _size; y++)
             {
                 MarchingCubeChunk chunk = Instantiate(chunkprefab, new Vector3(x, y, z) * 10, Quaternion.identity).GetComponent <MarchingCubeChunk>();
                 chunk.transform.parent = transform;
                 chunk.GenerateMesh(data, colorData, new Vector3Int(x, y, z), this, triTable, edgeTable, edgeTable2, data.useLOD ? Mathf.Clamp(data.LOD, 0, data.resolution - 1) : 0, true, true);
                 allPooledChunks.Add(chunk);
             }
         }
     }
 }
 //When a chunk generates
 public void ChunkGenerated(MarchingCubeChunk chunk)
 {
 }
Example #7
0
        //Update chunk
        private void UpdateChunkVoxel(Vector3 position, float _size, float _strengh, Color _color, MarchingCubeChunk chunk)
        {
            if (chunk == null)
            {
                return;
            }
            Vector3 relativePosition = position - chunk.chunkPosition * 10;
            //The edit that will be passed to the VoxelJob
            TerrainEdit edit;

            edit.position = relativePosition;
            edit.strengh  = _strengh;
            edit.size     = _size;
            edit.color    = _color;

            terrain.RegenerateChunkImmediate(chunk, edit);
        }