From 1cae9b60bbbeb1af67e8408a3bd11c3abc3006df Mon Sep 17 00:00:00 2001 From: David Vierra Date: Mon, 13 Jul 2015 16:34:02 -1000 Subject: [PATCH] Add Villager entity model --- .../chunkmeshes/entity/modelrenderer.py | 2 +- .../rendering/chunkmeshes/entity/models.py | 18 ++++- .../rendering/chunkmeshes/entity/villager.py | 72 +++++++++++++++++++ .../rendering/chunkmeshes/entitymesh.py | 11 ++- src/mceditlib/anvil/entities.py | 11 ++- 5 files changed, 107 insertions(+), 7 deletions(-) create mode 100644 src/mcedit2/rendering/chunkmeshes/entity/villager.py diff --git a/src/mcedit2/rendering/chunkmeshes/entity/modelrenderer.py b/src/mcedit2/rendering/chunkmeshes/entity/modelrenderer.py index 2fd30ec..882c4d1 100644 --- a/src/mcedit2/rendering/chunkmeshes/entity/modelrenderer.py +++ b/src/mcedit2/rendering/chunkmeshes/entity/modelrenderer.py @@ -39,7 +39,7 @@ class ModelBox(collections.namedtuple( class ModelRenderer(object): - def __init__(self, parent, u, v): + def __init__(self, parent, u=0, v=0): self.parent = parent self.boxes = [] self.u = u diff --git a/src/mcedit2/rendering/chunkmeshes/entity/models.py b/src/mcedit2/rendering/chunkmeshes/entity/models.py index 41ae368..f06d081 100644 --- a/src/mcedit2/rendering/chunkmeshes/entity/models.py +++ b/src/mcedit2/rendering/chunkmeshes/entity/models.py @@ -12,6 +12,7 @@ from mcedit2.rendering.chunkmeshes.entity.creeper import ModelCreeper from mcedit2.rendering.chunkmeshes.entity.quadruped import ModelPig, ModelCow, ModelSheep, \ ModelSheepWool from mcedit2.rendering.chunkmeshes.entity.spider import ModelSpider +from mcedit2.rendering.chunkmeshes.entity.villager import ModelVillager log = logging.getLogger(__name__) @@ -137,11 +138,23 @@ def cookEntityModel(model): return CookedModel(allVerts, model.textureWidth, model.textureHeight) cookedModels = {} -textures = {} +models = {} def addModel(model): cookedModels[model.id] = cookEntityModel(model) - textures[model.id] = model.modelTexture + models[model.id] = model + +def getModelTexture(entityRef): + model = models.get(entityRef.id) + if model is None: + return None + if hasattr(model, b"textureForEntity"): + return model.textureForEntity(entityRef) + return model.modelTexture + +def getTexture(entityID): + model = models.get(entityID) + return model.modelTexture addModel(ModelCreeper()) addModel(ModelZombie()) @@ -152,6 +165,7 @@ addModel(ModelPig()) addModel(ModelCow()) addModel(ModelSheep()) addModel(ModelSheepWool()) +addModel(ModelVillager()) if __name__ == '__main__': from pprint import pprint diff --git a/src/mcedit2/rendering/chunkmeshes/entity/villager.py b/src/mcedit2/rendering/chunkmeshes/entity/villager.py new file mode 100644 index 0000000..da5e549 --- /dev/null +++ b/src/mcedit2/rendering/chunkmeshes/entity/villager.py @@ -0,0 +1,72 @@ +""" + villager +""" +from __future__ import absolute_import, division, print_function, unicode_literals +import logging +from mcedit2.rendering.chunkmeshes.entity.modelrenderer import ModelRenderer + +log = logging.getLogger(__name__) + + +class ModelVillager(object): + textureWidth = 64 + textureHeight = 64 + modelTexture = "assets/minecraft/textures/entity/villager/villager.png" + + id = "Villager" + + def textureForEntity(self, entityRef): + prof = entityRef.Profession + profNames = { + 0: "farmer", + 1: "librarian", + 2: "priest", + 3: "smith", + 4: "butcher", + } + profName = profNames.get(prof, "villager") + return "assets/minecraft/textures/entity/villager/%s.png" % profName + + def __init__(self, expandOffset=0., heightOffset=0.): + + self.villagerHead = ModelRenderer(self) + self.villagerHead.setCenterPoint(0.0, 0.0 + heightOffset, 0.0) + self.villagerHead.setTextureOffset(0, 0) + self.villagerHead.addBox(-4.0, -10.0, -4.0, 8, 10, 8, expandOffset) + self.villagerNose = ModelRenderer(self) + self.villagerNose.setCenterPoint(0.0, heightOffset - 2.0, 0.0) + self.villagerNose.setTextureOffset(24, 0) + self.villagerNose.addBox(-1.0, -1.0, -6.0, 2, 4, 2, expandOffset) + #self.villagerHead.addChild(self.villagerNose) + self.villagerBody = ModelRenderer(self) + self.villagerBody.setCenterPoint(0.0, 0.0 + heightOffset, 0.0) + self.villagerBody.setTextureOffset(16, 20) + self.villagerBody.addBox(-4.0, 0.0, -3.0, 8, 12, 6, expandOffset) + self.villagerBody.setTextureOffset(0, 38) + self.villagerBody.addBox(-4.0, 0.0, -3.0, 8, 18, 6, expandOffset + 0.5) + self.villagerArms = ModelRenderer(self) + self.villagerArms.setCenterPoint(0.0, 0.0 + heightOffset + 2.0, 0.0) + self.villagerArms.setTextureOffset(44, 22) + self.villagerArms.addBox(-8.0, -2.0, -2.0, 4, 8, 4, expandOffset) + self.villagerArms.setTextureOffset(44, 22) + self.villagerArms.addBox(4.0, -2.0, -2.0, 4, 8, 4, expandOffset) + self.villagerArms.setTextureOffset(40, 38) + self.villagerArms.addBox(-4.0, 2.0, -2.0, 8, 4, 4, expandOffset) + self.rightVillagerLeg = (ModelRenderer(self, 0, 22)) + self.rightVillagerLeg.setCenterPoint(-2.0, 12.0 + heightOffset, 0.0) + self.rightVillagerLeg.addBox(-2.0, 0.0, -2.0, 4, 12, 4, expandOffset) + self.leftVillagerLeg = (ModelRenderer(self, 0, 22)) + self.leftVillagerLeg.mirror = True + self.leftVillagerLeg.setCenterPoint(2.0, 12.0 + heightOffset, 0.0) + self.leftVillagerLeg.addBox(-2.0, 0.0, -2.0, 4, 12, 4, expandOffset) + + @property + def parts(self): + return [ + self.villagerHead, + self.villagerNose, + self.villagerBody, + self.villagerArms, + self.rightVillagerLeg, + self.leftVillagerLeg, + ] \ No newline at end of file diff --git a/src/mcedit2/rendering/chunkmeshes/entitymesh.py b/src/mcedit2/rendering/chunkmeshes/entitymesh.py index ce55b4e..21187c2 100644 --- a/src/mcedit2/rendering/chunkmeshes/entitymesh.py +++ b/src/mcedit2/rendering/chunkmeshes/entitymesh.py @@ -147,7 +147,7 @@ def entityModelNode(ref, model, modelTex, chunk): vertexBuffer.vertex[:] = modelVerts[..., :3] vertexBuffer.texcoord[:] = modelVerts[..., 3:5] - node = VertexNode(vertexBuffer) + 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))) @@ -168,14 +168,19 @@ class MonsterModelRenderer(ChunkMeshBase): ID = "Creeper" model = models.cookedModels[ID] - modelTex = self.chunkUpdate.updateTask.getModelTexture(models.textures[ID]) + texturePath = models.getModelTexture(ref) + if texturePath is None: + modelTex = None + else: + modelTex = self.chunkUpdate.updateTask.getModelTexture(texturePath) node = entityModelNode(ref, model, modelTex, chunk) sceneNode.addChild(node) if ID == "Sheep": woolID = "MCEDIT_SheepWool" model = models.cookedModels[woolID] - modelTex = self.chunkUpdate.updateTask.getModelTexture(models.textures[woolID]) + texturePath = models.getTexture(woolID) + modelTex = self.chunkUpdate.updateTask.getModelTexture(texturePath) node = entityModelNode(ref, model, modelTex, chunk) sceneNode.addChild(node) diff --git a/src/mceditlib/anvil/entities.py b/src/mceditlib/anvil/entities.py index e905d91..1b5d296 100644 --- a/src/mceditlib/anvil/entities.py +++ b/src/mceditlib/anvil/entities.py @@ -252,16 +252,25 @@ class PCPaintingEntityRefBase(PCEntityRefBase): def facingForMCEditFace(self, face): return self._mceditFacings.get(face, None) + class PCPaintingEntityRef(PCPaintingEntityRefBase): Motive = nbtattr.NBTAttr("Motive", nbt.TAG_String) + class PCItemFrameEntityRef(PCPaintingEntityRefBase): Item = nbtattr.NBTCompoundAttr("Item", ItemRef) + +class PCVillagerEntityRef(PCEntityRefBase): + Profession = nbtattr.NBTAttr("Profession", nbt.TAG_Int, 0) + + _entityClasses = { - "ItemFrame": PCItemFrameEntityRef + "ItemFrame": PCItemFrameEntityRef, + "Villager": PCVillagerEntityRef, } + def PCTileEntityRef(rootTag, chunk=None): id = rootTag["id"].value cls = _tileEntityClasses.get(id, PCTileEntityRefBase)