/// <summary>
    /// Render this chunk using the given mesh
    /// </summary>
    public void renderChunk(ChunkMeshGenerator.ChunkMesh?chunkMesh = null)
    {
        Mesh         mesh = GetComponent <MeshFilter>().mesh;
        MeshCollider col  = GetComponent <MeshCollider>();

        ChunkMeshGenerator.ChunkMesh meshToUse = chunkMesh ?? (new ChunkMeshGenerator()).generateMeshFor(chunk);
        chunk.renderMesh = meshToUse;

        mesh.Clear();
        mesh.vertices  = meshToUse.vertices.ToArray();
        mesh.uv        = meshToUse.uvs.ToArray();
        mesh.triangles = meshToUse.triangles.ToArray();
        mesh.RecalculateNormals();
        col.sharedMesh = mesh;
    }
Exemplo n.º 2
0
 /// <summary>
 /// Run a jobs to empty async queues
 /// </summary>
 void Update()
 {
     // Empty the mesh gen queue
     if (chunkMeshGenerationQueue != null && chunkMeshGenerationQueue.Count > 0)
     {
         chunkMeshGenerationQueue.RemoveAll((Coordinate chunkColumn) => {
             if (island.columnHasBeenGenerated(chunkColumn))
             {
                 GenerateChunkColumnMeshsJob meshGenJob = new GenerateChunkColumnMeshsJob();
                 meshGenJob.columnLocation = chunkColumn;
                 meshGenJob.island         = island;
                 meshGenJob.outputQueue    = chunkRenderQueue;
                 meshGenJob.Start();
                 return(true);
             }
             return(false);
         });
     }
     // render one chunk a frame
     if (chunkRenderQueue != null && chunkRenderQueue.Count > 0)
     {
         ChunkMeshGenerator.ChunkMesh chunkMesh = chunkRenderQueue[0];
         GameObject      currentChunk           = Instantiate(ChunkObject, chunkMesh.chunkLocation.vec3 * Chunk.CHUNK_DIAMETER * World.BLOCK_SIZE, new Quaternion(), transform);
         ChunkController chunkController        = currentChunk.GetComponent <ChunkController>();
         chunkController.chunk            = island.getChunk(chunkMesh.chunkLocation, true);
         chunkController.chunk.controller = chunkController;
         chunkController.renderChunk(chunkMesh);
         currentChunk.SetActive(setChunkActive);
         chunkRenderQueue.RemoveAt(0);
     }
     // Empty the activation/deactivation queue
     if (chunkActivationQueue != null && chunkActivationQueue.Count > 0)
     {
         chunkActivationQueue.RemoveAll((chunkActivationQueueObject queueObject) => {
             return(toggleChunkActive(queueObject.chunkLocation, queueObject.setActiveTo));
         });
     }
 }
Exemplo n.º 3
0
 /// <summary>
 /// Generate just the mesh and uv values for the column of chunks
 /// </summary>
 protected override void ThreadFunction()
 {
     // @todo: breaks here?
     if (columnLocation.isInitialized && island != null)
     {
         for (int y = island.heightInChunks - 1; y >= 0; y--)
         {
             Chunk chunk = island.getChunk(new Coordinate(columnLocation.x, y, columnLocation.z));
             if (chunk != null && !chunk.isEmpty)
             {
                 if (!chunk.hasBeenRendered)
                 {
                     if (chunk.hasBeenGenerated)
                     {
                         ChunkMeshGenerator           chunkRenderer = new ChunkMeshGenerator();
                         ChunkMeshGenerator.ChunkMesh mesh          = chunkRenderer.generateMeshFor(chunk);
                         outputQueue.Add(mesh);
                     }
                 }
             }
         }
     }
 }