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, \ from mcedit2.rendering.chunkmeshes.entitymesh import TileEntityLocationMesh, MonsterLocationRenderer, ItemRenderer, \
ItemFrameMesh, MonsterModelRenderer, CommandBlockColorsMesh, CommandBlockLocationMesh, \ ItemFrameMesh, MonsterModelRenderer, CommandBlockColorsMesh, CommandBlockLocationMesh, \
TileEntityModelRenderer TileEntityModelRenderer
from mcedit2.rendering.chunkmeshes.heightlevel import HeightLevelBlockMesh
from mcedit2.rendering.chunkmeshes.lowdetail import LowDetailBlockMesh, OverheadBlockMesh from mcedit2.rendering.chunkmeshes.lowdetail import LowDetailBlockMesh, OverheadBlockMesh
from mcedit2.rendering.chunkmeshes.terrainpop import TerrainPopulatedRenderer from mcedit2.rendering.chunkmeshes.terrainpop import TerrainPopulatedRenderer
from mcedit2.rendering.chunkmeshes.tileticks import TileTicksRenderer from mcedit2.rendering.chunkmeshes.tileticks import TileTicksRenderer
@ -136,6 +137,7 @@ class ChunkUpdate(object):
ChunkSectionsRenderer, ChunkSectionsRenderer,
LowDetailBlockMesh, LowDetailBlockMesh,
OverheadBlockMesh, OverheadBlockMesh,
HeightLevelBlockMesh,
] ]
@profiler.iterator("ChunkUpdate") @profiler.iterator("ChunkUpdate")

View File

@ -18,9 +18,10 @@ class Layer:
ItemFrames = "ItemFrames" ItemFrames = "ItemFrames"
TileTicks = "TileTicks" TileTicks = "TileTicks"
TerrainPopulated = "TerrainPopulated" TerrainPopulated = "TerrainPopulated"
HeightMap = "HeightMap"
ChunkSections = "ChunkSections" ChunkSections = "ChunkSections"
AllLayers = (Blocks, MonsterLocations, Items, AllLayers = (Blocks, MonsterLocations, Items,
TileEntities, TileEntityLocations, TileEntities, TileEntityLocations,
CommandBlockColors, CommandBlockLocations, CommandBlockColors, CommandBlockLocations,
ItemFrames, TileTicks, ChunkSections) ItemFrames, TileTicks, ChunkSections, HeightMap)
DefaultVisibleLayers = (Blocks, Items, TileEntities, CommandBlockColors, ItemFrames) DefaultVisibleLayers = (Blocks, Items, TileEntities, CommandBlockColors, ItemFrames)

View File

@ -38,6 +38,18 @@ class RenderstateLowDetailNode(rendernode.RenderstateRenderNode):
def exit(self): def exit(self):
GL.glPopAttrib() 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): class RenderstateAlphaTestNode(rendernode.RenderstateRenderNode):
def enter(self): def enter(self):
GL.glPushAttrib(GL.GL_ENABLE_BIT) GL.glPushAttrib(GL.GL_ENABLE_BIT)
@ -81,4 +93,5 @@ allRenderstates = (
RenderstateWaterNode, RenderstateWaterNode,
RenderstateIceNode, RenderstateIceNode,
RenderstateEntityNode, RenderstateEntityNode,
RenderstateHeightLevelNode,
) )