Chunk meshes now return SceneNodes instead of VertexArrayBuffers

This will allow them to return their own rendering commands instead of being limited to using VertexNodes.
This commit is contained in:
David Vierra 2015-03-30 13:32:28 -10:00
parent ae7a9e1b84
commit 9a73b1395b
9 changed files with 38 additions and 30 deletions

View File

@ -114,10 +114,10 @@ class MeshBase(object):
renderType = NotImplemented
extraTextures = ()
renderstate = renderstates.RenderstateAlphaTestNode
vertexArrays = ()
sceneNode = None
def bufferSize(self):
return sum(a.buffer.size for a in self.vertexArrays) * 4
# def bufferSize(self):
# return sum(a.buffer.size for a in self.vertexArrays) * 4
class ChunkMeshBase(MeshBase):
@ -127,4 +127,3 @@ class ChunkMeshBase(MeshBase):
:type chunkUpdate: ChunkUpdate
"""
self.chunkUpdate = chunkUpdate
self.vertexArrays = []

View File

@ -4,7 +4,7 @@
from __future__ import absolute_import, division, print_function, unicode_literals
import logging
import numpy
from mcedit2.rendering import renderstates
from mcedit2.rendering import renderstates, scenegraph
from mcedit2.rendering.blockmeshes import standardCubeTemplates
from mcedit2.rendering.blockmeshes import ChunkMeshBase
from mcedit2.rendering.layers import Layer
@ -58,7 +58,8 @@ class TileEntityMesh(EntityMeshBase):
tiles = self._computeVertices(tilePositions, (0xff, 0xff, 0x33, 0x44), chunkPosition=chunk.chunkPosition)
yield
self.vertexArrays = [tiles]
self.sceneNode = scenegraph.VertexNode(tiles)
class MonsterRenderer(EntityMeshBase):
@ -84,7 +85,8 @@ class MonsterRenderer(EntityMeshBase):
offset=True,
chunkPosition=chunk.chunkPosition)
yield
self.vertexArrays = [monsters]
self.sceneNode = scenegraph.VertexNode(monsters)
class ItemRenderer(EntityMeshBase):
@ -111,8 +113,9 @@ class ItemRenderer(EntityMeshBase):
entityPositions.append(pos)
entityColors.append(color)
entities = self._computeVertices(entityPositions,
items = self._computeVertices(entityPositions,
numpy.array(entityColors, dtype='uint8')[:, numpy.newaxis, numpy.newaxis],
offset=True, chunkPosition=chunk.chunkPosition)
yield
self.vertexArrays = [entities]
self.sceneNode = scenegraph.VertexNode(items)

View File

@ -4,7 +4,7 @@
from __future__ import absolute_import, division, print_function, unicode_literals
import logging
import numpy
from mcedit2.rendering import renderstates
from mcedit2.rendering import renderstates, scenegraph
from mcedit2.rendering.blockmeshes import standardCubeTemplates
from mcedit2.rendering.blockmeshes import ChunkMeshBase
from mcedit2.rendering.vertexarraybuffer import VertexArrayBuffer
@ -99,7 +99,7 @@ class LowDetailBlockMesh(ChunkMeshBase):
yield
if self.detailLevel == 2:
self.vertexArrays = [va0]
self.sceneNode = scenegraph.VertexNode(va0)
return
# Calculate how deep each column needs to go to be flush with the adjacent column;
@ -134,9 +134,12 @@ class LowDetailBlockMesh(ChunkMeshBase):
va2.vertex[:, (0, 3), 0] -= 1.0 # turn diagonally
vertexArrays = [va1, va2, va0]
nodes = [scenegraph.VertexNode(v) for v in (va1, va2, va0)]
self.sceneNode = scenegraph.Node()
for node in nodes:
self.sceneNode.addChild(node)
self.vertexArrays = vertexArrays
class OverheadBlockMesh(LowDetailBlockMesh):

View File

@ -4,7 +4,7 @@
from __future__ import absolute_import, division, print_function, unicode_literals
import logging
import numpy
from mcedit2.rendering import renderstates
from mcedit2.rendering import renderstates, scenegraph
from mcedit2.rendering.blockmeshes import standardCubeTemplates
from mcedit2.rendering.blockmeshes import ChunkMeshBase
from mcedit2.rendering.layers import Layer
@ -86,6 +86,6 @@ class TerrainPopulatedRenderer(ChunkMeshBase):
verts = self.vertexTemplate[visibleFaces]
buffer = VertexArrayBuffer(0, textures=False, lights=False)
buffer.buffer = verts
self.vertexArrays.append(buffer)
self.sceneNode = scenegraph.VertexNode(buffer)
yield

View File

@ -3,6 +3,7 @@
"""
from __future__ import absolute_import, division, print_function, unicode_literals
import logging
from mcedit2.rendering import scenegraph
from mcedit2.rendering.chunkmeshes.entitymesh import EntityMeshBase
from mcedit2.rendering.layers import Layer
@ -16,8 +17,9 @@ class TileTicksRenderer(EntityMeshBase):
if hasattr(chunk, "TileTicks"):
ticks = chunk.TileTicks
if len(ticks):
self.vertexArrays.append(self._computeVertices([[t[i].value for i in "xyz"] for t in ticks],
(0xff, 0xff, 0xff, 0x44),
chunkPosition=chunk.chunkPosition))
self.sceneNode = scenegraph.VertexNode(
self._computeVertices([[t[i].value for i in "xyz"] for t in ticks],
(0xff, 0xff, 0xff, 0x44),
chunkPosition=chunk.chunkPosition))
yield

View File

@ -8,7 +8,7 @@ import logging
import numpy
cimport numpy
from mcedit2.rendering import renderstates
from mcedit2.rendering import renderstates, scenegraph
from mcedit2.rendering.layers import Layer
from mcedit2.rendering.vertexarraybuffer import VertexArrayBuffer
cimport mcedit2.rendering.blockmodels as blockmodels
@ -30,7 +30,7 @@ class BlockModelMesh(object):
:rtype:
"""
self.sectionUpdate = sectionUpdate
self.vertexArrays = []
self.sceneNode = None
self.layer = Layer.Blocks
def createVertexArrays(self):
@ -243,5 +243,5 @@ class BlockModelMesh(object):
vertexArray = VertexArrayBuffer(buffer_ptr)
vabuffer = vertexArray.buffer
memcpy(vabuffer.data, vertexBuffer, buffer_ptr * sizeof(float) * quadBytes)
self.vertexArrays = [vertexArray]
self.sceneNode = scenegraph.VertexNode(vertexArray)
free(vertexBuffer)

View File

@ -207,9 +207,11 @@ class VertexNode(Node):
def __init__(self, vertexArrays):
"""
:type vertexArrays: VertexArrayBuffer
:type vertexArrays: list[VertexArrayBuffer]
"""
super(VertexNode, self).__init__()
if not isinstance(vertexArrays, (list, tuple)):
vertexArrays = [vertexArrays]
self.vertexArrays = vertexArrays

View File

@ -119,14 +119,13 @@ class SceneUpdateTask(object):
if arrayNode.meshType in meshTypes:
chunkNode.removeChild(arrayNode)
# Create one VertexNode for each visible layer in this chunk
# Add the scene nodes created by each mesh builder
for mesh in layerMeshes:
if len(mesh.vertexArrays):
node = scenegraph.VertexNode(mesh.vertexArrays)
node.layerName = layer
node.meshType = type(mesh)
chunkNode.layers[layer] = node
chunkNode.addChild(node)
if mesh.sceneNode:
mesh.sceneNode.layerName = layer
mesh.sceneNode.meshType = type(mesh)
chunkNode.layers[layer] = mesh.sceneNode
chunkNode.addChild(mesh.sceneNode)
chunkInfo.renderedLayers.add(layer)

View File

@ -275,7 +275,7 @@ class AnvilChunkData(object):
tag["Level"]["TileTicks"] = self.TileTicks
elif "TileTicks" in tag["Level"]:
del tag["Level"]["TileTicks"]
log.debug(u"Saved chunk {0}".format(self))
return tag