Add layer for rendering stored HeightMaps

This commit is contained in:
David Vierra 2015-09-09 12:22:36 -10:00
parent 4c8b548e74
commit 9ab9d12086
4 changed files with 84 additions and 1 deletions

View File

@ -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

View File

@ -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")

View File

@ -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)

View File

@ -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,
)