Ejemplo n.º 1
0
        /// <summary>
        /// Will add landscape entities to the chunk byte landscape
        /// </summary>
        /// <param name="buffer"></param>
        public void GenerateMicroLandscape(LandscapeChunkBuffer buffer)
        {
            if (buffer.Entities == null)
            {
                return;
            }

            foreach (var entity in buffer.Entities.OrderBy(x => x.ChunkLocation.GetHashCode()))
            {
                foreach (var block in entity.Blocks)
                {
                    int index3D = ((block.ChunkPosition.Z * AbstractChunk.ChunkSize.X) + block.ChunkPosition.X) * AbstractChunk.ChunkSize.Y + (block.ChunkPosition.Y);
                    if (buffer.chunkBytesBuffer[index3D] == UtopiaProcessorParams.CubeId.Air || block.isMandatory)
                    {
                        buffer.chunkBytesBuffer[index3D] = block.BlockId;

                        //Update Max Height for lighting !
                        int index2D = (block.ChunkPosition.X * AbstractChunk.ChunkSize.Z) + block.ChunkPosition.Z;
                        if (buffer.ColumnsInfoBuffer[index2D].MaxHeight < block.ChunkPosition.Y)
                        {
                            buffer.ColumnsInfoBuffer[index2D].MaxHeight = (byte)block.ChunkPosition.Y;
                        }
                    }
                }

                //The block buffer has been processed, I can clear it now. => It has been introduced into the Global landscape Array
                entity.Blocks.Clear();
            }
        }
Ejemplo n.º 2
0
        public void Generate(Range3I generationRange, GeneratedChunk[,,] chunks)
        {
            generationRange.Foreach(pos =>
            {
                //Get the chunk
                var chunk = chunks[pos.X - generationRange.Position.X, pos.Y - generationRange.Position.Y, pos.Z - generationRange.Position.Z];
                var chunkWorldPosition = new Vector3D(chunk.Position.X * AbstractChunk.ChunkSize.X, 0.0, chunk.Position.Z * AbstractChunk.ChunkSize.Z);

                //Create the Rnd component to be used by the landscape creator
                var chunkRnd = new FastRandom(_worldParameters.Seed + chunk.Position.GetHashCode());

                //If already generated, the buffer will take care of sending back directly the landscape from buffer zone, otherwhile landscape is generated.
                //The buffer has the advantage to be shared between client/server in "Single player" mode.
                //It means that a chunk, if generated by the server, won't need to be generated by the client because it will be stored into the buffer.
                //The buffer is heavily use for landscape entities that can span on multiple chunks like trees.
                LandscapeChunkBuffer landscapeBuffer = _landscapeBufferManager.Get(chunk.Position);

                while (landscapeBuffer.ProcessingState != LandscapeChunkBuffer.LandscapeChunkBufferState.Processed)
                {
                    Thread.Sleep(100);
                    landscapeBuffer = _landscapeBufferManager.Get(chunk.Position);
                }

                var columnsInfo = new ChunkColumnInfo[AbstractChunk.ChunkSize.X * AbstractChunk.ChunkSize.Z];
                var chunkBytes  = new byte[AbstractChunk.ChunkBlocksByteLength];
                Array.Copy(landscapeBuffer.chunkBytesBuffer, chunkBytes, landscapeBuffer.chunkBytesBuffer.Length);
                Array.Copy(landscapeBuffer.ColumnsInfoBuffer, columnsInfo, columnsInfo.Length);

                var metaData = CreateChunkMetaData(columnsInfo);
                chunk.BlockData.ColumnsInfo   = columnsInfo; //Save Columns info Array
                chunk.BlockData.ChunkMetaData = metaData;    //Save the metaData Informations

                PopulateChunk(chunk, chunkBytes, metaData, chunkRnd, _entityFactory, landscapeBuffer.Entities);

                RefreshChunkMetaData(metaData, columnsInfo);

                chunk.BlockData.SetBlockBytes(chunkBytes); //Save block array
            });
        }