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:
parent
ae7a9e1b84
commit
9a73b1395b
@ -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 = []
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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):
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
Reference in New Issue
Block a user