private void FlushBlockRemoval(ChunkSubspacePosition position, BlockDefinition definition, BlockDefinition prevDefinition) { PushTransparencyCacheToAdjacentBlocks(position, definition.IsTransparent()); if (prevDefinition.IsLightEmitter()) { BlockLight light; light.chunk = this; light.chunkPosition = position; light.blockDefinition = prevDefinition; lights.Remove(light); } needsMeshUpdate = true; }
private void FlushBlockSet(ChunkSubspacePosition position, BlockDefinition definition, BlockDefinition prevDefinition) { if (prevDefinition.IsTransparent() != definition.IsTransparent()) { PushTransparencyCacheToAdjacentBlocks(position, definition.IsTransparent()); } MarkForMeshUpdate(); if (definition.IsLightEmitter()) { BlockLight light; light.chunk = this; light.chunkPosition = position; light.blockDefinition = definition; lights.Add(light); } }
void GenerateBlocksThread(object chunkInstance) { Chunk chunk = chunkInstance as Chunk; ChunkSubspacePosition position; BlockSpacePosition checkPosition; for (position.x = 0; position.x < SIZE; position.x++) { checkPosition.x = worldPosition.x * SIZE + position.x; for (position.z = 0; position.z < SIZE; position.z++) { checkPosition.z = worldPosition.z * SIZE + position.z; isShorelineCache[position.x, position.z] = true; for (position.y = worldPosition.y * SIZE + SIZE; position.y < Configuration.HEIGHT; position.y++) { checkPosition.y = position.y; Block checkBlock = ChunkRepository.GetBlockAtPosition(checkPosition); if (checkBlock.IsActive() && checkBlock.IsNotTransparent()) { isShorelineCache[position.x, position.z] = false; break; } } } } BlockType[,,] blockTypes = worldGenerator.GenerateBlocks(chunk); for (position.x = 0; position.x < SIZE; position.x++) { for (position.y = 0; position.y < SIZE; position.y++) { for (position.z = 0; position.z < SIZE; position.z++) { BlockDefinition blockDefinition = BlockDefinition.DefinitionOfType(blockTypes[position.x, position.y, position.z]); chunk.SetBlock(position, blockDefinition, false); if (blockDefinition.IsActive() && blockDefinition.IsNotTransparent() && blockDefinition.GetBlockType() != BlockType.Sand) { isShorelineCache[position.x, position.z] = false; } if (blockDefinition.IsLightEmitter()) { BlockLight light; light.chunk = this; light.chunkPosition = position; light.blockDefinition = blockDefinition; lock (chunk.padlock) { chunk.lights.Add(light); } } } } } // Generate and apply the models from this and all nearby chunks List <Model> generatedModels = worldGenerator.GenerateModels(chunk); lock (generatingModelsLock) { for (int i = 0; i < generatedModels.Count; i++) { AddModel(generatedModels[i]); } } List <Chunk> lockedChunks = LockNearbyChunkModels(); ApplyModels(); UnlockChunkModels(lockedChunks); // Cleanup pass for (position.x = 0; position.x < SIZE; position.x++) { for (position.z = 0; position.z < SIZE; position.z++) { for (position.y = SIZE - 1; position.y >= 0; position.y--) { chunk.GetBlock(position); // If the block is water, make sure it's surrounded on the bottom and sides if (chunk.GetBlock(position).IsWater()) { for (int i = 0; i < 5; i++) { ChunkSubspacePosition solidCheckPosition = position; if (i == 0) { solidCheckPosition.y -= 1; } else if (i == 1) { solidCheckPosition.x -= 1; } else if (i == 2) { solidCheckPosition.x += 1; } else if (i == 3) { solidCheckPosition.z -= 1; } else if (i == 4) { solidCheckPosition.z += 1; } if (solidCheckPosition.x >= 0 && solidCheckPosition.x < SIZE && solidCheckPosition.y >= 0 && solidCheckPosition.y < SIZE && solidCheckPosition.z >= 0 && solidCheckPosition.z < SIZE) { if (chunk.GetBlock(solidCheckPosition).IsNotActive()) { chunk.SetBlock(solidCheckPosition, BlockType.Stone, false); } } else { BlockSpacePosition checkWorldPosition = solidCheckPosition.GetBlockSpacePosition(chunk); if (ChunkRepository.GetBlockAtPosition(checkWorldPosition).IsNotActive()) { ChunkRepository.SetBlockAtPosition(checkWorldPosition, BlockType.Stone, false); } } } } } } } LoadTransparencyCache(); chunk.SetLoadState(ChunkLoadState.BlockGenerationComplete); }