/// <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(); } }
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 }); }