Add layer for rendering stored HeightMaps
This commit is contained in:
parent
4c8b548e74
commit
9ab9d12086
67
src/mcedit2/rendering/chunkmeshes/heightlevel.py
Normal file
67
src/mcedit2/rendering/chunkmeshes/heightlevel.py
Normal 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
|
||||
|
||||
|
@ -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")
|
||||
|
@ -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)
|
||||
|
@ -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,
|
||||
)
|
||||
|
Reference in New Issue
Block a user