Add Villager entity model
This commit is contained in:
parent
ee730eda2e
commit
1cae9b60bb
@ -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
|
||||
|
@ -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
|
||||
|
72
src/mcedit2/rendering/chunkmeshes/entity/villager.py
Normal file
72
src/mcedit2/rendering/chunkmeshes/entity/villager.py
Normal 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,
|
||||
]
|
@ -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)
|
||||
|
@ -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)
|
||||
|
Reference in New Issue
Block a user