Add ItemFrameMesh to render maps in item frames.

Added getMapTexture to SceneUpdateTask
Added ItemFrames rendering layer
Removed ItemFrame from MonsterRenderer
This commit is contained in:
David Vierra 2015-07-09 16:30:33 -10:00
parent 2812a416e5
commit 548e21463b
4 changed files with 91 additions and 4 deletions

View File

@ -10,6 +10,7 @@ from mcedit2.rendering.blockmeshes import ChunkMeshBase
from mcedit2.rendering.layers import Layer
from mcedit2.rendering.slices import _XYZ
from mcedit2.rendering.vertexarraybuffer import QuadVertexArrayBuffer
from mceditlib.anvil.entities import PCPaintingEntityRefBase
log = logging.getLogger(__name__)
@ -62,9 +63,67 @@ class TileEntityMesh(EntityMeshBase):
class ItemFrameMesh(EntityMeshBase):
layer = Layer.ItemFrames
def makeChunkVertices(self, chunk, limitBox):
mapTiles = []
for i, ref in enumerate(chunk.Entities):
if ref.id != "ItemFrame":
continue
if i % 10 == 0:
yield
if limitBox and ref.Position not in limitBox:
continue
item = ref.Item
if item.itemType.internalName != "minecraft:filled_map":
continue
mapID = item.Damage
mapTex = self.chunkUpdate.updateTask.getMapTexture(mapID)
# xxxx assumes 1.8 TilePos - fix this in ref??
mapTiles.append((mapTex, ref.TilePos, ref.Facing))
nodes = []
for mapTex, (x, y, z), facing in mapTiles:
vertexBuffer = QuadVertexArrayBuffer(1, lights=False, textures=True)
# chunk is already translated - why?
x -= chunk.cx << 4
z -= chunk.cz << 4
vertexBuffer.vertex[:] = x, y, z
corners = self.faceCorners[facing]
vertexBuffer.vertex[:] += corners
texCorners = [(0, 0), (0, 1), (1, 1), (1, 0)]
vertexBuffer.texcoord[:] += texCorners
vertexNode = scenegraph.VertexNode([vertexBuffer])
bindTexNode = scenegraph.BindTextureNode(mapTex)
bindTexNode.addChild(vertexNode)
nodes.append(bindTexNode)
self.sceneNode = scenegraph.Node()
for node in nodes:
self.sceneNode.addChild(node)
faceCorners = { # xxx polygon offset?
PCPaintingEntityRefBase.SouthFacing: ((0, 0, 0.01), (0, 1, 0.01), (1, 1, 0.01), (1, 0, 0.01)),
PCPaintingEntityRefBase.WestFacing: ((0.01, 0, 0), (0.01, 1, 0), (0.01, 1, 1), (0.01, 0, 1)),
PCPaintingEntityRefBase.NorthFacing: ((0, 0, 0.99), (0, 1, 0.99), (1, 1, 0.99), (1, 0, 0.99)),
PCPaintingEntityRefBase.EastFacing: ((0.99, 0, 0), (0.99, 1, 0), (0.99, 1, 1), (0.99, 0, 1)),
}
class MonsterRenderer(EntityMeshBase):
layer = Layer.Entities # xxx Monsters
notMonsters = {"Item", "XPOrb", "Painting"}
notMonsters = {"Item", "XPOrb", "Painting", "ItemFrame"}
def makeChunkVertices(self, chunk, limitBox):
monsterPositions = []

View File

@ -9,7 +9,8 @@ from mcedit2.rendering.modelmesh import BlockModelMesh
from mcedit2.rendering import layers
from mcedit2.rendering.chunkmeshes.chunksections import ChunkSectionsRenderer
from mcedit2.rendering.chunkmeshes.entitymesh import TileEntityMesh, MonsterRenderer, ItemRenderer
from mcedit2.rendering.chunkmeshes.entitymesh import TileEntityMesh, MonsterRenderer, ItemRenderer, \
ItemFrameMesh
from mcedit2.rendering.chunkmeshes.lowdetail import LowDetailBlockMesh, OverheadBlockMesh
from mcedit2.rendering.chunkmeshes.terrainpop import TerrainPopulatedRenderer
from mcedit2.rendering.chunkmeshes.tileticks import TileTicksRenderer
@ -122,6 +123,7 @@ class ChunkUpdate(object):
wholeChunkMeshClasses = [
TileEntityMesh,
ItemFrameMesh,
MonsterRenderer,
ItemRenderer,
TileTicksRenderer,

View File

@ -11,8 +11,9 @@ class Layer:
Monsters = "Monsters"
Items = "Items"
TileEntities = "TileEntities"
ItemFrames = "ItemFrames"
TileTicks = "TileTicks"
TerrainPopulated = "TerrainPopulated"
ChunkSections = "ChunkSections"
AllLayers = (Blocks, Entities, Items, TileEntities, TileTicks, ChunkSections)
DefaultVisibleLayers = (Blocks, Entities, Items, TileEntities)
AllLayers = (Blocks, Entities, Items, TileEntities, ItemFrames, TileTicks, ChunkSections)
DefaultVisibleLayers = (Blocks, Entities, Items, TileEntities, ItemFrames)

View File

@ -5,6 +5,7 @@ from __future__ import absolute_import, division, print_function, unicode_litera
import logging
import sys
import collections
from OpenGL import GL
import numpy
import itertools
@ -15,6 +16,7 @@ from mcedit2.rendering.chunknode import ChunkNode, ChunkGroupNode
from mcedit2.rendering.chunkupdate import ChunkRenderInfo
from mcedit2.rendering.depths import DepthOffset
from mcedit2.rendering.geometrycache import GeometryCache
from mcedit2.util.glutils import Texture
from mceditlib.anvil.biome_types import BiomeTypes
log = logging.getLogger(__name__)
@ -59,6 +61,7 @@ class SceneUpdateTask(object):
self.alpha = 255
self.textureAtlas = textureAtlas
self.mapTextures = {}
self.renderType = numpy.zeros((256*256,), 'uint8')
self.renderType[:] = 3
@ -151,6 +154,28 @@ class SceneUpdateTask(object):
groupNode = self.worldScene.getRenderstateGroup(renderstate)
groupNode.discardChunkNode(cx, cz)
def getMapTexture(self, mapID):
def _loadFunc(colors):
def _load():
w = colors.shape[1]
h = colors.shape[0]
GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, w, h, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, colors.ravel())
return _load
if mapID in self.mapTextures:
return self.mapTextures[mapID]
try:
mapData = self.worldScene.dimension.worldEditor.getMap(mapID)
except Exception as e:
log.exception("Map %s could not be loaded (while loading GL texture)", mapID)
else:
colors = mapData.getColorsAsRGBA()
mapTex = Texture(_loadFunc(colors))
self.mapTextures[mapID] = mapTex
return mapTex
class WorldScene(scenegraph.Node):
def __init__(self, dimension, textureAtlas=None, geometryCache=None, bounds=None):
super(WorldScene, self).__init__()