Code: Select all
from inc_noesis import *
import noesis
import rapi
from mascotcapsule import Figure
def registerNoesisTypes():
handle = noesis.register("MascotCapsule contains geometry data", ".mbac")
noesis.setHandlerTypeCheck(handle, mbacCheckType)
noesis.setHandlerLoadModel(handle, mbacLoadModel)
noesis.logPopup()
return 1
NOEPY_HEADER = "MB"
def mbacCheckType(data):
bs = NoeBitStream(data)
if len(data) < 2:
return 0
if bs.readBytes(2).decode("ASCII").rstrip("\0") != NOEPY_HEADER:
return 0
return 1
def mbacLoadModel(data, mdlList):
dirPath = rapi.getDirForFilePath(rapi.getInputName())
filename = rapi.getLocalFileName(rapi.getInputName())
f = open(dirPath + filename, 'rb')
figure = Figure.fromfile(f, False)
g = geometry(figure)
b = Bones(figure.bones,len(g.positions))
msh = NoeMesh([],[],"mesh0", "mat0")
msh.setIndices(g.indices)
msh.setPositions(g.positions)
msh.setUVs(g.texcoord)
msh.setNormals(g.normals)
msh.setWeights(b.bWeList)
mdl = NoeModel([msh],[],[])
mdl.setBones(b.bones)
mdlList.append(mdl)
return 1
def mdl_create(g,figure):
print('figure.vertices: %d' % len(figure.vertices))
for x, y, z in figure.vertices:
g.positions.append(NoeVec3((x,y,z)))
g.texcoord.append(NoeVec3((0,0,0)))
for face in figure.faces:
if len(face) == 3:
a, b, c = face
for i in (c, b, a):
g.indices.append(i)
elif len(face) == 4:
a, b, c, d = face
for i in (c, b, a):
g.indices.append(i)
for i in (d, b, c):
g.indices.append(i)
elif len(face) == 9:
a, b, c, u1, v1, u2, v2, u3, v3 = face
g.texcoord[a]=(NoeVec3([u1, v1, 0]))
g.texcoord[b]=(NoeVec3([u2, v2, 0]))
g.texcoord[c]=(NoeVec3([u3, v3, 0]))
for i in (c, b, a):
g.indices.append(i)
else:
a, b, c, d, u1, v1, u2, v2, u3, v3, u4, v4 = face
g.texcoord[a]=(NoeVec3([u1, v1, 0]))
g.texcoord[b]=(NoeVec3([u2, v2, 0]))
g.texcoord[c]=(NoeVec3([u3, v3, 0]))
g.texcoord[d]=(NoeVec3([u4, v4, 0]))
for i in (c, b, a):
g.indices.append(i)
for i in (d, b, c):
g.indices.append(i)
class geometry:
def __init__(self,f):
self.positions = []
self.indices = []
self.texcoord = []
self.normals = []
mdl_create(self,f)
class Bones:
def __init__(self,b,v):
self.bones = []
self.boneMap = []
#weight
self.boWe = [1.0, 0.0, 0.0, 0.0]
self.boId = [0, 0, 0, 0]
self.bWeList = [NoeVertWeight(self.boId, self.boWe)]*v
for i in range (0,len(b)):
boneName = "bone"+str(i)
bonePIndex = b[i][0]
boneMat = NoeMat43((
NoeVec3((b[i][1][0], b[i][1][4], b[i][1][8])),
NoeVec3((b[i][1][1], b[i][1][5], b[i][1][9])),
NoeVec3((b[i][1][2], b[i][1][6], b[i][1][10])),
NoeVec3((b[i][1][3], b[i][1][7], b[i][1][11])) ))
#translate = NoeVec3((b[i][1][3],b[i][1][7],b[i][1][11]))
#rotate = NoeQuat((0.0, 0.0, 0.0, 1.0))
#boneMat = rotate.toMat43(transposed = 1)
#boneMat[3] = translate
self.bones.append(NoeBone(i,boneName,boneMat,None,bonePIndex))
if b[i][3] - b[i][2] > 0:
for x in range(b[i][2], b[i][3]):
self.bWeList[x] = NoeVertWeight([i, 0, 0, 0], self.boWe)