コード例 #1
0
        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);
        }
コード例 #2
0
        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);
            }
        }