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:
parent
2812a416e5
commit
548e21463b
@ -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 = []
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
|
@ -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__()
|
||||
|
Reference in New Issue
Block a user