From df1be775ae630e15a7d159d88d061f28fa464d17 Mon Sep 17 00:00:00 2001 From: David Vierra Date: Fri, 13 Nov 2015 17:02:33 -1000 Subject: [PATCH] Add chunk renderer for positions that can spawn mobs --- .../rendering/chunkmeshes/mobspawns.py | 86 +++++++++++++++++++ src/mcedit2/rendering/chunkupdate.py | 2 + src/mcedit2/rendering/layers.py | 4 +- 3 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 src/mcedit2/rendering/chunkmeshes/mobspawns.py diff --git a/src/mcedit2/rendering/chunkmeshes/mobspawns.py b/src/mcedit2/rendering/chunkmeshes/mobspawns.py new file mode 100644 index 0000000..3994aec --- /dev/null +++ b/src/mcedit2/rendering/chunkmeshes/mobspawns.py @@ -0,0 +1,86 @@ +""" + mobspawns +""" +from __future__ import absolute_import, division, print_function, unicode_literals +import logging + +from mcedit2.rendering import renderstates +from mcedit2.rendering.blockmeshes import ChunkMeshBase, standardCubeTemplates +from mcedit2.rendering.layers import Layer +from mcedit2.rendering.scenegraph.vertex_array import VertexNode +from mcedit2.rendering.vertexarraybuffer import QuadVertexArrayBuffer +from mceditlib import faces + +log = logging.getLogger(__name__) + + +class MobSpawnsBlockMesh(ChunkMeshBase): + renderstate = renderstates.RenderstateHeightLevel + layer = Layer.MobSpawns + + def makeChunkVertices(self, chunk, limitBox): + """ + + :param chunk: + :type chunk: WorldEditorChunk + :param limitBox: + :return: :raise: + """ + + vertexes = [] + + for cy in chunk.sectionPositions(): + section = chunk.getSection(cy) + if section is None: + continue + + blockLight = section.BlockLight + skyLight = section.SkyLight + blocks = section.Blocks + + # A block can spawn monsters if it is air, and the block above it is air, + # and the block below it is solid, and the light level is < 8. + # blocks with blockLight < 8 AND skyLight < 8 will always spawn monsters + # blocks with blockLight < 8 AND skyLight >= 8 will only spawn monsters at night + + lowBlockLight = blockLight < 8 + lowNightLight = lowBlockLight & (skyLight < 8) + lowDayLight = lowBlockLight & (skyLight >= 8) + + validBlocks = blocks == 0 # block is air + validBlocks[:-1] &= blocks[1:] == 0 # block above is air + validBlocks[1:] &= blocks[:-1] != 0 # block below is not air + + belowSection = chunk.getSection(cy-1) + if belowSection: + validBlocks[:1] &= belowSection.Blocks[-1:] != 0 + else: + validBlocks[:1] = 0 + aboveSection = chunk.getSection(cy+1) + + if aboveSection: + validBlocks[-1:] &= aboveSection.Blocks[:1] == 0 + + def getVertexes(mask, color): + y, z, x = mask.nonzero() + vertexBuffer = QuadVertexArrayBuffer(len(x), textures=False, lights=False) + vertexBuffer.vertex[..., 0] = x[:, None] + vertexBuffer.vertex[..., 1] = y[:, None] + vertexBuffer.vertex[..., 2] = z[:, None] + + vertexBuffer.vertex[:] += (0, (cy << 4), 0) + + vertexBuffer.vertex[:] += standardCubeTemplates[faces.FaceYDecreasing, ..., :3] + + vertexBuffer.rgba[:] = color + return vertexBuffer + + nightVertexes = getVertexes(lowNightLight & validBlocks, (0xff, 0x00, 0x00, 0x3f)) + dayVertexes = getVertexes(lowDayLight & validBlocks, (0xff, 0xFF, 0x00, 0x3f)) + + vertexes.append(dayVertexes) + vertexes.append(nightVertexes) + + self.sceneNode = VertexNode(vertexes) + + yield diff --git a/src/mcedit2/rendering/chunkupdate.py b/src/mcedit2/rendering/chunkupdate.py index f14d350..808c273 100644 --- a/src/mcedit2/rendering/chunkupdate.py +++ b/src/mcedit2/rendering/chunkupdate.py @@ -14,6 +14,7 @@ from mcedit2.rendering.chunkmeshes.entitymesh import TileEntityLocationMesh, Mon TileEntityModelRenderer from mcedit2.rendering.chunkmeshes.heightlevel import HeightLevelBlockMesh from mcedit2.rendering.chunkmeshes.lowdetail import LowDetailBlockMesh, OverheadBlockMesh +from mcedit2.rendering.chunkmeshes.mobspawns import MobSpawnsBlockMesh from mcedit2.rendering.chunkmeshes.terrainpop import TerrainPopulatedRenderer from mcedit2.rendering.chunkmeshes.tileticks import TileTicksRenderer from mcedit2.util import profiler @@ -138,6 +139,7 @@ class ChunkUpdate(object): LowDetailBlockMesh, OverheadBlockMesh, HeightLevelBlockMesh, + MobSpawnsBlockMesh, ] @profiler.iterator("ChunkUpdate") diff --git a/src/mcedit2/rendering/layers.py b/src/mcedit2/rendering/layers.py index 00cc81f..70f7b6c 100644 --- a/src/mcedit2/rendering/layers.py +++ b/src/mcedit2/rendering/layers.py @@ -19,9 +19,11 @@ class Layer: TileTicks = "TileTicks" TerrainPopulated = "TerrainPopulated" HeightMap = "HeightMap" + MobSpawns = "Places Where Creepers Can Spawn" ChunkSections = "ChunkSections" AllLayers = (Blocks, MonsterLocations, Items, TileEntities, TileEntityLocations, CommandBlockColors, CommandBlockLocations, - ItemFrames, TileTicks, ChunkSections, HeightMap) + ItemFrames, TileTicks, ChunkSections, HeightMap, + MobSpawns) DefaultVisibleLayers = (Blocks, Items, TileEntities, CommandBlockColors, ItemFrames)