Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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