Пример #1
0
    private void loaderLoop()
    {
        while (!stopThread)
        {
            Queue <ChunkRequest> queueCopy = new Queue <ChunkRequest>();
            lock (chunkRequests)
            {
                //  Wait for chunk requests
                while (chunkRequests.Count == 0 && !stopThread)
                {
                    Monitor.Wait(chunkRequests);
                }

                // Copy
                for (int i = 0; i < 3 && chunkRequests.Count > 0; i++)
                {
                    queueCopy.Enqueue(chunkRequests[0]);
                    chunkRequests.RemoveAt(0);
                }
            }

            Queue <TerrainGen.ChunkCreateMsg> done = new Queue <TerrainGen.ChunkCreateMsg>();

            while (queueCopy.Count > 0 && !stopThread)
            {
                ChunkRequest r = (ChunkRequest)queueCopy.Dequeue();

                // Heightmap
                HeightMap h = World.getOrCreateHeightMap(r.cx, r.cz);
                h.generate(Constants.WORLD_SEED);

                // Chunk block data
                ChunkData c = new ChunkData(r.cx, r.cy, r.cz);
                c.generate(h);

                // Mesh
                Vector2Int meshI = new Vector2Int(-1, -1);
                if (!c.isAir())
                {
                    meshI = c.generateMesh();
                    while ((meshI.x == -1 && meshI.y == -1) && !stopThread)
                    {
                        // Wait for the main thread to finish with one of the mesh data objects
                        if (done.Count > 0)
                        {
                            TerrainGen.chunksLoaded(done);
                            done.Clear();
                        }
                        Thread.Sleep(32);
                        meshI = c.generateMesh();
                    }
                }
                TerrainGen.ChunkCreateMsg m = new TerrainGen.ChunkCreateMsg(r.cx, r.cy, r.cz, c, meshI);
                done.Enqueue(m);
            }
            TerrainGen.chunksLoaded(done);
        }
    }