home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 4994 / fmt_DragonNest_msh.7z / fmt_DragonNest_msh.py
Encoding:
Python Source  |  2012-01-16  |  4.0 KB  |  119 lines

  1. from inc_noesis import *
  2. import noesis
  3. import rapi
  4. from Sanae3D.Sanae import SanaeObject
  5.  
  6. def registerNoesisTypes():
  7.     '''Register the plugin. Just change the Game name and extension.'''
  8.     
  9.     handle = noesis.register("Dragon Nest", ".msh")
  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.     return 1
  18.  
  19. def noepyLoadModel(data, mdlList):
  20.     '''Build the model, set materials, bones, and animations. You do not
  21.     need all of them as long as they are empty lists (they are by default)'''
  22.     
  23.     ctx = rapi.rpgCreateContext()
  24.     parser = SanaeParser(data)
  25.     parser.parse_file()
  26.     mdl = rapi.rpgConstructModel()
  27.     mdl.setModelMaterials(NoeModelMaterials(parser.texList, parser.matList))
  28.     mdl.setBones(parser.boneList)
  29.     mdl.setAnims(parser.animList)
  30.     mdlList.append(mdl)
  31.     return 1
  32.  
  33. class SanaeParser(SanaeObject):
  34.     
  35.     def __init__(self, data):    
  36.         '''Initialize some data. Refer to Sanae.py to see what is already
  37.         initialized'''
  38.         
  39.         super(SanaeParser, self).__init__(data)
  40.         self.hasBones = True
  41.         
  42.     def read_name(self):
  43.         
  44.         return noeStrFromBytes(self.inFile.readBytes(256))
  45.     
  46.     def parse_bones(self, numBones):
  47.         
  48.         for i in range(numBones):
  49.             boneName = self.read_name()
  50.             matrix = self.inFile.readBytes(64)
  51.             
  52.     def parse_faces(self, numIdx):
  53.         
  54.         return self.inFile.readBytes(numIdx * 2)
  55.     
  56.     def parse_vertices(self, numVerts):
  57.  
  58.         positions = self.inFile.readBytes(numVerts * 12)
  59.         normals = self.inFile.readBytes(numVerts * 12)
  60.         uv = self.inFile.readBytes(numVerts * 8)
  61.         
  62.         rapi.rpgBindPositionBuffer(positions, noesis.RPGEODATA_FLOAT, 12)
  63.         rapi.rpgBindNormalBuffer(normals, noesis.RPGEODATA_FLOAT, 12)
  64.         rapi.rpgBindUV1Buffer(uv, noesis.RPGEODATA_FLOAT, 8)        
  65.         
  66.         if self.hasBones:
  67.             bones = self.inFile.readBytes(numVerts * 8) #4 shorts
  68.             weights = self.inFile.readBytes(numVerts * 16) #4 floats
  69.         
  70.         
  71.         
  72.     def parse_unk(self, count):
  73.         
  74.         for i in range(count):
  75.             self.read_name()
  76.             
  77.     def parse_mesh(self, numMesh):
  78.         
  79.         for i in range(numMesh):
  80.             print(self.inFile.tell())
  81.             self.read_name() #scene root
  82.             meshName = self.read_name()
  83.             rapi.rpgSetName(meshName)
  84.             numVerts, numIdx, unk, unk2 = self.inFile.read('4L')
  85.             print(numVerts, numIdx, unk, unk2, self.hasBones)
  86.             self.inFile.seek(496, 1)
  87.             idxBuff = self.parse_faces(numIdx)
  88.             print(self.inFile.tell())
  89.             self.parse_vertices(numVerts)
  90.     
  91.             texName = meshName + ".dds"
  92.             matName = "material"
  93.             material = NoeMaterial(matName, texName)
  94.             self.matList.append(material)
  95.             
  96.             rapi.rpgSetMaterial(matName)
  97.             if unk == 1:
  98.                 rapi.rpgCommitTriangles(idxBuff, noesis.RPGEODATA_USHORT, numIdx, noesis.RPGEO_TRIANGLE_STRIP, 1)
  99.             else:
  100.                 rapi.rpgCommitTriangles(idxBuff, noesis.RPGEODATA_USHORT, numIdx, noesis.RPGEO_TRIANGLE, 1)
  101.         
  102.             if not self.inFile.checkEOF():
  103.                 count = self.inFile.readUInt()
  104.                 self.parse_unk(count)
  105.  
  106.     def parse_file(self):
  107.         '''Main parser method'''
  108.         
  109.         idstring = self.read_name()
  110.         version, numMesh, unk1, unk2 = self.inFile.read('4L')
  111.         self.inFile.read('6f')
  112.         numBones = self.inFile.readUInt()
  113.         if not numBones:
  114.             self.hasBones = False
  115.         self.inFile.read('2L')
  116.         
  117.         self.inFile.seek(716, 1)
  118.         self.parse_bones(numBones)
  119.         self.parse_mesh(numMesh)