Advertisement
Guest User

xin_noesis

a guest
Feb 18th, 2012
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.81 KB | None | 0 0
  1. from inc_noesis import *
  2. import noesis
  3. import rapi
  4. import os
  5.  
  6. def registerNoesisTypes():
  7.     '''Register the plugin. Just change the Game name and extension.'''
  8.    
  9.     handle = noesis.register("xin", ".ksw")
  10.     noesis.setHandlerTypeCheck(handle, noepyCheckType)
  11.     noesis.setHandlerLoadModel(handle, noepyLoadModel)
  12.     return 1
  13.  
  14. def noepyCheckType(data):
  15.     '''Verify that the format is supported by this plugin. Default yes'''
  16.    
  17.     if len(data) < 6:
  18.         return 0
  19.    
  20.     return 1
  21.  
  22. def noepyLoadModel(data, mdlList):
  23.     '''Build the model, set materials, bones, and animations. You do not
  24.    need all of them as long as they are empty lists (they are by default)'''
  25.    
  26.     ctx = rapi.rpgCreateContext()
  27.     parser = SanaeParser(data)
  28.     parser.parse_file()
  29.     mdl = rapi.rpgConstructModel()
  30.     mdl.setModelMaterials(NoeModelMaterials(parser.texList, parser.matList))
  31.     mdl.setBones(parser.boneList)
  32.     mdl.setAnims(parser.animList)
  33.     mdlList.append(mdl)
  34.     return 1
  35.  
  36. class SanaeParser(object):
  37.    
  38.     def __init__(self, data):    
  39.        
  40.         self.inFile = NoeBitStream(data)
  41.         self.texList = []
  42.         self.matList = []    
  43.         self.boneList = []
  44.         self.animList = []
  45.        
  46.     def read_ustring(self, n):
  47.            
  48.         s = bytes()
  49.         for i in range(n):
  50.             s += self.inFile.readBytes(1)
  51.             self.inFile.readBytes(1)
  52.         return noeStrFromBytes(s)        
  53.    
  54.     def invert_faces(self):
  55.         '''Negates the x-coord of all vertices in the mesh'''
  56.        
  57.         trans = NoeMat43((NoeVec3((-1, 0, 0)),
  58.                          NoeVec3((0, 1, 0)),
  59.                          NoeVec3((0, 0, 1)),
  60.                          NoeVec3((0, 0, 0))))
  61.         rapi.rpgSetTransform(trans)    
  62.    
  63.     def parse_material(self, matName):
  64.        
  65.         self.inFile.read('16f')
  66.         self.inFile.readFloat()
  67.         self.inFile.readUShort()
  68.         self.inFile.readShort()
  69.         diffTex = self.read_ustring(768)
  70.         normTex = self.read_ustring(256)
  71.         normTex2 = self.read_ustring(256)
  72.        
  73.         texName = os.path.basename(diffTex)
  74.         material = NoeMaterial(matName, texName)
  75.         self.matList.append(material)
  76.        
  77.     def parse_faces(self, numIdx):
  78.        
  79.         return self.inFile.readBytes(4*numIdx)
  80.    
  81.     def parse_vertices(self, numVerts):
  82.        
  83.             vertBuff = self.inFile.readBytes(numVerts*12)
  84.             rapi.rpgBindPositionBuffer(vertBuff, noesis.RPGEODATA_FLOAT, 12)
  85.             self.invert_faces()
  86.  
  87.     def parse_normals(self, numVerts):
  88.        
  89.             normBuff = self.inFile.readBytes(numVerts*12)
  90.             rapi.rpgBindNormalBuffer(normBuff, noesis.RPGEODATA_FLOAT, 12)
  91.  
  92.     def parse_uvs(self, numVerts):
  93.        
  94.             uvBuff = self.inFile.readBytes(numVerts*12)
  95.             rapi.rpgBindUV1Buffer(uvBuff, noesis.RPGEODATA_FLOAT, 12)          
  96.  
  97.            
  98.     def parse_tri(self, triStripLen):
  99.        
  100.             idxBuff = self.inFile.readBytes(triStripLen*4)
  101.             rapi.rpgCommitTriangles(idxBuff, noesis.RPGEODATA_INT, triStripLen, noesis.RPGEO_TRIANGLE_STRIP, 1)
  102.  
  103.      
  104.     def parse_file(self):
  105.         '''Main parser method'''
  106.         self.inFile.seek(140)
  107.         numMesh, numVerts, triStripLen, unk1, vertOff, normOff, \
  108.             unk2, UVOff, unk3, unk4, triSTripOff, unk5, boneOff = self.inFile.read('13L')
  109.         self.inFile.seek(vertOff)
  110.         self.parse_vertices(numVerts)
  111.         self.inFile.read('1L')
  112.         self.parse_normals(numVerts)
  113.         self.inFile.read('1L')
  114.         self.parse_uvs(numVerts)
  115.         self.inFile.seek(triSTripOff)
  116.         numIdx = triStripLen *3
  117.         idxBuff = self.parse_faces(numIdx)
  118.         rapi.rpgCommitTriangles(idxBuff, noesis.RPGEODATA_INT, numIdx, noesis.RPGEO_TRIANGLE, 1)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement