diff --git a/src/mcedit2/rendering/chunkmeshes/heightlevel.py b/src/mcedit2/rendering/chunkmeshes/heightlevel.py new file mode 100644 index 0000000..f60c829 --- /dev/null +++ b/src/mcedit2/rendering/chunkmeshes/heightlevel.py @@ -0,0 +1,67 @@ +""" + ${NAME} +""" +from __future__ import absolute_import, division, print_function, unicode_literals +import logging + +import numpy + +from mcedit2.rendering import renderstates +from mcedit2.rendering.blockmeshes import standardCubeTemplates +from mcedit2.rendering.blockmeshes import ChunkMeshBase +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 HeightLevelBlockMesh(ChunkMeshBase): + renderstate = renderstates.RenderstateHeightLevelNode + layer = Layer.HeightMap + def makeChunkVertices(self, chunk, limitBox): + """ + + :param chunk: + :type chunk: WorldEditorChunk + :param limitBox: + :return: :raise: + """ + + if not hasattr(chunk, 'HeightMap') or chunk.HeightMap is None: + return + + heightMap = chunk.HeightMap + chunkWidth = chunkLength = 16 + chunkHeight = chunk.dimension.bounds.height + + z, x = list(numpy.indices((chunkLength, chunkWidth))) + y = (heightMap - 1)[:chunkLength, :chunkWidth] + numpy.clip(y, 0, chunkHeight - 1, y) + + nonZeroHeights = y > 0 + + x = x[nonZeroHeights] + if not len(x): + return + + z = z[nonZeroHeights] + y = y[nonZeroHeights] + + yield + vertexBuffer = QuadVertexArrayBuffer(len(x), textures=False, lights=False) + + vertexBuffer.vertex[..., 0] = x[:, numpy.newaxis] + vertexBuffer.vertex[..., 1] = y[:, numpy.newaxis] + vertexBuffer.vertex[..., 2] = z[:, numpy.newaxis] + + + vertexBuffer.vertex[:] += standardCubeTemplates[faces.FaceYIncreasing, ..., :3] + + vertexBuffer.rgba[:] = (0xff, 0x00, 0xff, 0x9f) + self.sceneNode = VertexNode(vertexBuffer) + + yield + + diff --git a/src/mcedit2/rendering/chunkupdate.py b/src/mcedit2/rendering/chunkupdate.py index 7f2fcd8..aad0dfc 100644 --- a/src/mcedit2/rendering/chunkupdate.py +++ b/src/mcedit2/rendering/chunkupdate.py @@ -12,6 +12,7 @@ from mcedit2.rendering.chunkmeshes.chunksections import ChunkSectionsRenderer from mcedit2.rendering.chunkmeshes.entitymesh import TileEntityLocationMesh, MonsterLocationRenderer, ItemRenderer, \ ItemFrameMesh, MonsterModelRenderer, CommandBlockColorsMesh, CommandBlockLocationMesh, \ TileEntityModelRenderer +from mcedit2.rendering.chunkmeshes.heightlevel import HeightLevelBlockMesh from mcedit2.rendering.chunkmeshes.lowdetail import LowDetailBlockMesh, OverheadBlockMesh from mcedit2.rendering.chunkmeshes.terrainpop import TerrainPopulatedRenderer from mcedit2.rendering.chunkmeshes.tileticks import TileTicksRenderer @@ -136,6 +137,7 @@ class ChunkUpdate(object): ChunkSectionsRenderer, LowDetailBlockMesh, OverheadBlockMesh, + HeightLevelBlockMesh, ] @profiler.iterator("ChunkUpdate") diff --git a/src/mcedit2/rendering/layers.py b/src/mcedit2/rendering/layers.py index 139802b..00cc81f 100644 --- a/src/mcedit2/rendering/layers.py +++ b/src/mcedit2/rendering/layers.py @@ -18,9 +18,10 @@ class Layer: ItemFrames = "ItemFrames" TileTicks = "TileTicks" TerrainPopulated = "TerrainPopulated" + HeightMap = "HeightMap" ChunkSections = "ChunkSections" AllLayers = (Blocks, MonsterLocations, Items, TileEntities, TileEntityLocations, CommandBlockColors, CommandBlockLocations, - ItemFrames, TileTicks, ChunkSections) + ItemFrames, TileTicks, ChunkSections, HeightMap) DefaultVisibleLayers = (Blocks, Items, TileEntities, CommandBlockColors, ItemFrames) diff --git a/src/mcedit2/rendering/renderstates.py b/src/mcedit2/rendering/renderstates.py index 4f232b9..59e0a48 100644 --- a/src/mcedit2/rendering/renderstates.py +++ b/src/mcedit2/rendering/renderstates.py @@ -38,6 +38,18 @@ class RenderstateLowDetailNode(rendernode.RenderstateRenderNode): def exit(self): GL.glPopAttrib() +class RenderstateHeightLevelNode(rendernode.RenderstateRenderNode): + def enter(self): + GL.glPushAttrib(GL.GL_ENABLE_BIT | GL.GL_POLYGON_BIT) + GL.glDisable(GL.GL_CULL_FACE) + GL.glDisable(GL.GL_TEXTURE_2D) + GL.glEnable(GL.GL_BLEND) + GL.glPolygonOffset(-1, -1) + GL.glEnable(GL.GL_POLYGON_OFFSET_FILL) + + def exit(self): + GL.glPopAttrib() + class RenderstateAlphaTestNode(rendernode.RenderstateRenderNode): def enter(self): GL.glPushAttrib(GL.GL_ENABLE_BIT) @@ -81,4 +93,5 @@ allRenderstates = ( RenderstateWaterNode, RenderstateIceNode, RenderstateEntityNode, + RenderstateHeightLevelNode, )