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 try: item = ref.Item if item.itemType.internalName != "minecraft:filled_map": continue except KeyError: log.exception( "Error while getting ItemFrame item ID in frame at %s", ref.TilePos) continue mapID = item.Damage mapTex = self.chunkUpdate.updateTask.getMapTexture(mapID) # xxx if mapTex is None: mapTex = missingNoTex # 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 = [(1, 1), (1, 0), (0, 0), (0, 1)] vertexBuffer.texcoord[:] += texCorners vertexNode = VertexNode([vertexBuffer]) if mapTex is not None: bindTexNode = BindTextureNode(mapTex) bindTexNode.addChild(vertexNode) nodes.append(bindTexNode) else: nodes.append(vertexNode) self.sceneNode = scenenode.Node() for node in nodes: self.sceneNode.addChild(node)
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 try: item = ref.Item if item.itemType.internalName != "minecraft:filled_map": continue except KeyError: log.exception("Error while getting ItemFrame item ID in frame at %s", ref.TilePos) continue mapID = item.Damage mapTex = self.chunkUpdate.updateTask.getMapTexture(mapID) # xxx if mapTex is None: mapTex = missingNoTex # 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 = [(1, 1), (1, 0), (0, 0), (0, 1)] vertexBuffer.texcoord[:] += texCorners vertexNode = VertexNode([vertexBuffer]) if mapTex is not None: bindTexNode = BindTextureNode(mapTex) bindTexNode.addChild(vertexNode) nodes.append(bindTexNode) else: nodes.append(vertexNode) self.sceneNode = scenenode.Node() for node in nodes: self.sceneNode.addChild(node)
def chestEntityModelNode(ref, model, modelTex, chunk, facing, largeX, largeZ): modelVerts = numpy.array(model.vertices) modelVerts.shape = modelVerts.shape[0]//4, 4, modelVerts.shape[1] # scale down modelVerts[..., :3] *= 1/16. # modelVerts[..., 1] = -modelVerts[..., 1] # modelVerts[..., 0] = -modelVerts[..., 0] vertexBuffer = QuadVertexArrayBuffer(len(modelVerts), lights=False, textures=True) vertexBuffer.vertex[:] = modelVerts[..., :3] vertexBuffer.texcoord[:] = modelVerts[..., 3:5] node = VertexNode([vertexBuffer]) rotations = { "north": 180, "east": 270, "south": 0, "west": 90 } decenterTranslateNode = TranslateNode((-0.5, -0.5, -0.5)) decenterTranslateNode.addChild(node) rotateNode = RotateNode(rotations[facing], (0., 1., 0.)) # rotateNode = RotateNode(0, (0., 1., 0.)) rotateNode.addChild(decenterTranslateNode) dx = dz = 0 if largeX and facing == "north": dx = 1. if largeZ and facing == "east": dz = -1. recenterTranslateNode = TranslateNode((0.5+dx, 0.5, 0.5+dz)) recenterTranslateNode.addChild(rotateNode) x, y, z = (ref.Position - (chunk.cx << 4, 0, chunk.cz << 4)) scaleNode = ScaleNode((1., -1., -1.)) scaleNode.addChild(recenterTranslateNode) posTranslateNode = TranslateNode((x, y+1., z+1.)) posTranslateNode.addChild(scaleNode) textureNode = BindTextureNode(modelTex, (1./model.texWidth, 1./model.texHeight, 1)) textureNode.addChild(posTranslateNode) return textureNode
def entityModelNode(ref, model, modelTex, chunk): modelVerts = numpy.array(model.vertices) modelVerts.shape = modelVerts.shape[0]//4, 4, modelVerts.shape[1] # scale down modelVerts[..., :3] *= 1/16. modelVerts[..., 1] = -modelVerts[..., 1] + 1.5 + 1/64. modelVerts[..., 0] = -modelVerts[..., 0] vertexBuffer = QuadVertexArrayBuffer(len(modelVerts), lights=False, textures=True) vertexBuffer.vertex[:] = modelVerts[..., :3] vertexBuffer.texcoord[:] = modelVerts[..., 3:5] node = VertexNode([vertexBuffer]) rotateNode = RotateNode(ref.Rotation[0], (0., 1., 0.)) rotateNode.addChild(node) translateNode = TranslateNode((ref.Position - (chunk.cx << 4, 0, chunk.cz << 4))) translateNode.addChild(rotateNode) textureNode = BindTextureNode(modelTex, (1./model.texWidth, 1./model.texHeight, 1)) textureNode.addChild(translateNode) return textureNode
def chestEntityModelNode(ref, model, modelTex, chunk, facing, largeX, largeZ): modelVerts = numpy.array(model.vertices) modelVerts.shape = modelVerts.shape[0] // 4, 4, modelVerts.shape[1] # scale down modelVerts[..., :3] *= 1 / 16. # modelVerts[..., 1] = -modelVerts[..., 1] # modelVerts[..., 0] = -modelVerts[..., 0] vertexBuffer = QuadVertexArrayBuffer(len(modelVerts), lights=False, textures=True) vertexBuffer.vertex[:] = modelVerts[..., :3] vertexBuffer.texcoord[:] = modelVerts[..., 3:5] node = VertexNode([vertexBuffer]) rotations = {"north": 180, "east": 270, "south": 0, "west": 90} decenterTranslateNode = TranslateNode((-0.5, -0.5, -0.5)) decenterTranslateNode.addChild(node) rotateNode = RotateNode(rotations[facing], (0., 1., 0.)) # rotateNode = RotateNode(0, (0., 1., 0.)) rotateNode.addChild(decenterTranslateNode) dx = dz = 0 if largeX and facing == "north": dx = 1. if largeZ and facing == "east": dz = -1. recenterTranslateNode = TranslateNode((0.5 + dx, 0.5, 0.5 + dz)) recenterTranslateNode.addChild(rotateNode) x, y, z = (ref.Position - (chunk.cx << 4, 0, chunk.cz << 4)) scaleNode = ScaleNode((1., -1., -1.)) scaleNode.addChild(recenterTranslateNode) posTranslateNode = TranslateNode((x, y + 1., z + 1.)) posTranslateNode.addChild(scaleNode) textureNode = BindTextureNode( modelTex, (1. / model.texWidth, 1. / model.texHeight, 1)) textureNode.addChild(posTranslateNode) return textureNode