Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from inc_noesis import *
- import noesis
- import rapi
- import os
- def registerNoesisTypes():
- '''Register the plugin. Just change the Game name and extension.'''
- handle = noesis.register("xin", ".ksw")
- noesis.setHandlerTypeCheck(handle, noepyCheckType)
- noesis.setHandlerLoadModel(handle, noepyLoadModel)
- return 1
- def noepyCheckType(data):
- '''Verify that the format is supported by this plugin. Default yes'''
- if len(data) < 6:
- return 0
- return 1
- def noepyLoadModel(data, mdlList):
- '''Build the model, set materials, bones, and animations. You do not
- need all of them as long as they are empty lists (they are by default)'''
- ctx = rapi.rpgCreateContext()
- parser = SanaeParser(data)
- parser.parse_file()
- mdl = rapi.rpgConstructModel()
- mdl.setModelMaterials(NoeModelMaterials(parser.texList, parser.matList))
- mdl.setBones(parser.boneList)
- mdl.setAnims(parser.animList)
- mdlList.append(mdl)
- return 1
- class SanaeParser(object):
- def __init__(self, data):
- self.inFile = NoeBitStream(data)
- self.texList = []
- self.matList = []
- self.boneList = []
- self.animList = []
- def read_ustring(self, n):
- s = bytes()
- for i in range(n):
- s += self.inFile.readBytes(1)
- self.inFile.readBytes(1)
- return noeStrFromBytes(s)
- def invert_faces(self):
- '''Negates the x-coord of all vertices in the mesh'''
- trans = NoeMat43((NoeVec3((-1, 0, 0)),
- NoeVec3((0, 1, 0)),
- NoeVec3((0, 0, 1)),
- NoeVec3((0, 0, 0))))
- rapi.rpgSetTransform(trans)
- def parse_material(self, matName):
- self.inFile.read('16f')
- self.inFile.readFloat()
- self.inFile.readUShort()
- self.inFile.readShort()
- diffTex = self.read_ustring(768)
- normTex = self.read_ustring(256)
- normTex2 = self.read_ustring(256)
- texName = os.path.basename(diffTex)
- material = NoeMaterial(matName, texName)
- self.matList.append(material)
- def parse_faces(self, numIdx):
- return self.inFile.readBytes(4*numIdx)
- def parse_vertices(self, numVerts):
- vertBuff = self.inFile.readBytes(numVerts*12)
- rapi.rpgBindPositionBuffer(vertBuff, noesis.RPGEODATA_FLOAT, 12)
- self.invert_faces()
- def parse_normals(self, numVerts):
- normBuff = self.inFile.readBytes(numVerts*12)
- rapi.rpgBindNormalBuffer(normBuff, noesis.RPGEODATA_FLOAT, 12)
- def parse_uvs(self, numVerts):
- uvBuff = self.inFile.readBytes(numVerts*12)
- rapi.rpgBindUV1Buffer(uvBuff, noesis.RPGEODATA_FLOAT, 12)
- def parse_tri(self, triStripLen):
- idxBuff = self.inFile.readBytes(triStripLen*4)
- rapi.rpgCommitTriangles(idxBuff, noesis.RPGEODATA_INT, triStripLen, noesis.RPGEO_TRIANGLE_STRIP, 1)
- def parse_file(self):
- '''Main parser method'''
- self.inFile.seek(140)
- numMesh, numVerts, triStripLen, unk1, vertOff, normOff, \
- unk2, UVOff, unk3, unk4, triSTripOff, unk5, boneOff = self.inFile.read('13L')
- self.inFile.seek(vertOff)
- self.parse_vertices(numVerts)
- self.inFile.read('1L')
- self.parse_normals(numVerts)
- self.inFile.read('1L')
- self.parse_uvs(numVerts)
- self.inFile.seek(triSTripOff)
- numIdx = triStripLen *3
- idxBuff = self.parse_faces(numIdx)
- rapi.rpgCommitTriangles(idxBuff, noesis.RPGEODATA_INT, numIdx, noesis.RPGEO_TRIANGLE, 1)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement