Add Villager entity model
This commit is contained in:
parent
ee730eda2e
commit
1cae9b60bb
@ -39,7 +39,7 @@ class ModelBox(collections.namedtuple(
|
|||||||
|
|
||||||
|
|
||||||
class ModelRenderer(object):
|
class ModelRenderer(object):
|
||||||
def __init__(self, parent, u, v):
|
def __init__(self, parent, u=0, v=0):
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.boxes = []
|
self.boxes = []
|
||||||
self.u = u
|
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, \
|
from mcedit2.rendering.chunkmeshes.entity.quadruped import ModelPig, ModelCow, ModelSheep, \
|
||||||
ModelSheepWool
|
ModelSheepWool
|
||||||
from mcedit2.rendering.chunkmeshes.entity.spider import ModelSpider
|
from mcedit2.rendering.chunkmeshes.entity.spider import ModelSpider
|
||||||
|
from mcedit2.rendering.chunkmeshes.entity.villager import ModelVillager
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -137,11 +138,23 @@ def cookEntityModel(model):
|
|||||||
return CookedModel(allVerts, model.textureWidth, model.textureHeight)
|
return CookedModel(allVerts, model.textureWidth, model.textureHeight)
|
||||||
|
|
||||||
cookedModels = {}
|
cookedModels = {}
|
||||||
textures = {}
|
models = {}
|
||||||
|
|
||||||
def addModel(model):
|
def addModel(model):
|
||||||
cookedModels[model.id] = cookEntityModel(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(ModelCreeper())
|
||||||
addModel(ModelZombie())
|
addModel(ModelZombie())
|
||||||
@ -152,6 +165,7 @@ addModel(ModelPig())
|
|||||||
addModel(ModelCow())
|
addModel(ModelCow())
|
||||||
addModel(ModelSheep())
|
addModel(ModelSheep())
|
||||||
addModel(ModelSheepWool())
|
addModel(ModelSheepWool())
|
||||||
|
addModel(ModelVillager())
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
from pprint import pprint
|
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.vertex[:] = modelVerts[..., :3]
|
||||||
vertexBuffer.texcoord[:] = modelVerts[..., 3:5]
|
vertexBuffer.texcoord[:] = modelVerts[..., 3:5]
|
||||||
|
|
||||||
node = VertexNode(vertexBuffer)
|
node = VertexNode([vertexBuffer])
|
||||||
rotateNode = RotateNode(ref.Rotation[0], (0., 1., 0.))
|
rotateNode = RotateNode(ref.Rotation[0], (0., 1., 0.))
|
||||||
rotateNode.addChild(node)
|
rotateNode.addChild(node)
|
||||||
translateNode = TranslateNode((ref.Position - (chunk.cx << 4, 0, chunk.cz << 4)))
|
translateNode = TranslateNode((ref.Position - (chunk.cx << 4, 0, chunk.cz << 4)))
|
||||||
@ -168,14 +168,19 @@ class MonsterModelRenderer(ChunkMeshBase):
|
|||||||
ID = "Creeper"
|
ID = "Creeper"
|
||||||
|
|
||||||
model = models.cookedModels[ID]
|
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)
|
node = entityModelNode(ref, model, modelTex, chunk)
|
||||||
sceneNode.addChild(node)
|
sceneNode.addChild(node)
|
||||||
if ID == "Sheep":
|
if ID == "Sheep":
|
||||||
woolID = "MCEDIT_SheepWool"
|
woolID = "MCEDIT_SheepWool"
|
||||||
model = models.cookedModels[woolID]
|
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)
|
node = entityModelNode(ref, model, modelTex, chunk)
|
||||||
sceneNode.addChild(node)
|
sceneNode.addChild(node)
|
||||||
|
@ -252,16 +252,25 @@ class PCPaintingEntityRefBase(PCEntityRefBase):
|
|||||||
def facingForMCEditFace(self, face):
|
def facingForMCEditFace(self, face):
|
||||||
return self._mceditFacings.get(face, None)
|
return self._mceditFacings.get(face, None)
|
||||||
|
|
||||||
|
|
||||||
class PCPaintingEntityRef(PCPaintingEntityRefBase):
|
class PCPaintingEntityRef(PCPaintingEntityRefBase):
|
||||||
Motive = nbtattr.NBTAttr("Motive", nbt.TAG_String)
|
Motive = nbtattr.NBTAttr("Motive", nbt.TAG_String)
|
||||||
|
|
||||||
|
|
||||||
class PCItemFrameEntityRef(PCPaintingEntityRefBase):
|
class PCItemFrameEntityRef(PCPaintingEntityRefBase):
|
||||||
Item = nbtattr.NBTCompoundAttr("Item", ItemRef)
|
Item = nbtattr.NBTCompoundAttr("Item", ItemRef)
|
||||||
|
|
||||||
|
|
||||||
|
class PCVillagerEntityRef(PCEntityRefBase):
|
||||||
|
Profession = nbtattr.NBTAttr("Profession", nbt.TAG_Int, 0)
|
||||||
|
|
||||||
|
|
||||||
_entityClasses = {
|
_entityClasses = {
|
||||||
"ItemFrame": PCItemFrameEntityRef
|
"ItemFrame": PCItemFrameEntityRef,
|
||||||
|
"Villager": PCVillagerEntityRef,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def PCTileEntityRef(rootTag, chunk=None):
|
def PCTileEntityRef(rootTag, chunk=None):
|
||||||
id = rootTag["id"].value
|
id = rootTag["id"].value
|
||||||
cls = _tileEntityClasses.get(id, PCTileEntityRefBase)
|
cls = _tileEntityClasses.get(id, PCTileEntityRefBase)
|
||||||
|
Reference in New Issue
Block a user