Add Villager entity model

This commit is contained in:
David Vierra 2015-07-13 16:34:02 -10:00
parent ee730eda2e
commit 1cae9b60bb
5 changed files with 107 additions and 7 deletions

View File

@ -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

View File

@ -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

View File

@ -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,
]

View File

@ -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)

View File

@ -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)