public List <BlockLight> GetAllLightsWithinMaxRange(ChunkSpacePosition chunkPosition) { int distance = Configuration.MAX_LIGHT_RADIUS + Chunk.SIZE / 2; BlockSpacePosition checkPosition; checkPosition.x = chunkPosition.x * Chunk.SIZE + Chunk.SIZE / 2; checkPosition.y = chunkPosition.y * Chunk.SIZE + Chunk.SIZE / 2; checkPosition.z = chunkPosition.z * Chunk.SIZE + Chunk.SIZE / 2; List <BlockLight> lights = new List <BlockLight>(); foreach (Chunk chunk in ChunkRepository.IterateChunksWithinRadius(checkPosition, distance)) { // TODO -- This isn't super efficient on memory, but required for thread safety. Try to figure out a // better way of doing this. BlockLight[] chunkLights; lock (chunk) { chunkLights = chunk.LightsArray(); } int chunkLightsLength = chunkLights.Length; for (int chunkLightsIndex = 0; chunkLightsIndex < chunkLightsLength; chunkLightsIndex++) { BlockLight light = chunkLights[chunkLightsIndex]; BlockSpacePosition lightPosition = light.chunkPosition.GetBlockSpacePosition(chunk); if (BlockIsNotHidden(lightPosition)) { lights.Add(light); } } } return(lights); }
public void MarkChunksWithinMaxLightRadiusForMeshUpdate(BlockSpacePosition position) { int distance = Configuration.MAX_LIGHT_RADIUS + Chunk.SIZE / 2; foreach (Chunk chunk in ChunkRepository.IterateChunksWithinRadius(position, distance)) { chunk.MarkForMeshUpdate(); ChunkRepository.AddToProcessingChunkList(chunk); } }