fork download
  1. from inc_noesis import *
  2. import noesis
  3. import rapi
  4. import os
  5.  
  6. def registerNoesisTypes():
  7. '''Register the plugin'''
  8.  
  9. handle = noesis.register("Zu Online", ".ltb")
  10. noesis.setHandlerTypeCheck(handle, noepyCheckType)
  11. noesis.setHandlerLoadModel(handle, noepyLoadModel) #see also noepyLoadModelRPG
  12. return 1
  13.  
  14. def noepyCheckType(data):
  15. '''Verify that the format is supported by this plugin.'''
  16.  
  17. if len(data) < 9:
  18. return 0
  19. try:
  20. bs = NoeBitStream(data)
  21. ver1 = bs.readShort()
  22. ver2 = bs.readShort()
  23. if ver1 != 1 or ver2 != 9:
  24. return 0
  25. return 1
  26. except:
  27. return 0
  28.  
  29. def noepyLoadModel(data, mdlList):
  30. '''Load the model'''
  31.  
  32. ctx = rapi.rpgCreateContext()
  33. parser = ZuOnline_LTB(data)
  34. parser.parse_file()
  35. mdl = rapi.rpgConstructModel()
  36. mdlList.append(mdl)
  37. mdl.setModelMaterials(NoeModelMaterials(parser.texList, parser.matList))
  38. mdlList.append(mdl)
  39. return 1
  40.  
  41. class ZuOnline_LTB(object):
  42.  
  43. def __init__(self, data):
  44. self.inFile = NoeBitStream(data)
  45. self.animList = []
  46. self.texList = []
  47. self.matList = []
  48. self.boneList = []
  49. self.dirpath = rapi.getDirForFilePath(rapi.getInputName())
  50. self.texpath = self.dirpath + "texture\\"
  51.  
  52. def basename(self):
  53. '''Returns the filename without extension'''
  54.  
  55. filename = rapi.getLocalFileName(rapi.getInputName())
  56. basename, ext = os.path.splitext(filename)
  57. return basename
  58.  
  59. def read_name(self):
  60.  
  61. string = self.inFile.readBytes(self.inFile.readUShort())
  62. try:
  63. return noeStrFromBytes(string)
  64. except:
  65. return string
  66.  
  67. def parse_vertices(self, numVerts, meshType):
  68.  
  69. print (self.inFile.tell())
  70. if meshType == 1:
  71. vertBuff = self.inFile.readBytes(numVerts * 32)
  72. rapi.rpgBindPositionBufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, 32, 0)
  73. rapi.rpgBindNormalBufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, 32, 12)
  74. rapi.rpgBindUV1BufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, 32, 24)
  75. elif meshType == 2:
  76. vertBuff = self.inFile.readBytes(numVerts * 36)
  77. rapi.rpgBindPositionBufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, 36, 0)
  78. rapi.rpgBindNormalBufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, 36, 16)
  79. rapi.rpgBindUV1BufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, 36, 28)
  80. elif meshType == 3:
  81. vertBuff = self.inFile.readBytes(numVerts * 40)
  82. rapi.rpgBindPositionBufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, 40, 0)
  83. rapi.rpgBindNormalBufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, 40, 20)
  84. rapi.rpgBindUV1BufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, 40, 32)
  85. elif meshType == 4:
  86. vertBuff = self.inFile.readBytes(numVerts * 44)
  87. rapi.rpgBindPositionBufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, 44, 0)
  88. rapi.rpgBindNormalBufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, 44, 24)
  89. rapi.rpgBindUV1BufferOfs(vertBuff, noesis.RPGEODATA_FLOAT, 44, 36)
  90. else:
  91. print("unknown meshType: %d" %meshType)
  92.  
  93. def parse_faces(self, numIdx):
  94.  
  95. return self.inFile.readBytes(numIdx * 2)
  96.  
  97. def parse_unk(self):
  98.  
  99. count = self.inFile.readUInt()
  100. self.inFile.seek(count*12, 1)
  101.  
  102. def create_material(self, matNum):
  103.  
  104. matName = "material[%d]" %matNum
  105. if matNum == 1:
  106. texName = self.texpath + self.basename() + ".dtx"
  107. elif matNum == 2:
  108. texName = self.texpath + self.basename() + "_a.dtx"
  109. elif matNum == 3:
  110. texName = self.texpath + self.basename() + "_b.dtx"
  111. elif matNum == 4:
  112. texName = self.texpath + self.basename() + "_c.dtx"
  113. elif matNum == 5:
  114. texName = self.texpath + self.basename() + "_a.dtx"
  115. elif matNum == 6:
  116. texName = self.texpath + self.basename() + "_a.dtx"
  117. else:
  118. print(matNum)
  119. texName = ""
  120.  
  121. material = NoeMaterial(matName, texName)
  122. self.matList.append(material)
  123. return matName
  124.  
  125. def parse_submesh(self, numSubmesh):
  126.  
  127. print (self.inFile.tell())
  128. for i in range(numSubmesh):
  129. self.inFile.readUInt()
  130. matNum = self.inFile.readUInt()
  131. self.inFile.read('4L')
  132. self.inFile.readByte()
  133. unk1 = self.inFile.readUInt()
  134. sectionSize = self.inFile.readUInt()
  135.  
  136. #sectionSize could be 0
  137. if sectionSize:
  138. start = self.inFile.tell()
  139. numVerts = self.inFile.readUInt()
  140. numIdx = self.inFile.readUInt() * 3
  141. meshType = self.inFile.readUInt()
  142. self.inFile.read('5L')
  143.  
  144. if unk1 == 4:
  145. self.inFile.readUInt()
  146. elif unk1 == 5:
  147. self.inFile.readUShort()
  148.  
  149. self.parse_vertices(numVerts, meshType)
  150. idxBuff = self.parse_faces(numIdx)
  151.  
  152. #just seeking past unknowns rather than parse the unknown
  153. curr = self.inFile.tell() - start
  154. remain = sectionSize - curr
  155. self.inFile.seek(remain, 1)
  156.  
  157. unk2 = self.inFile.readByte()
  158. self.inFile.seek(unk2, 1)
  159.  
  160.  
  161. matName = self.create_material(matNum)
  162. #rapi.rpgSetMaterial(matName)
  163. #rapi.rpgCommitTriangles(idxBuff, noesis.RPGEODATA_USHORT, numIdx, noesis.RPGEO_TRIANGLE, 1)
  164.  
  165. def parse_mesh(self, numMesh):
  166.  
  167. for i in range(numMesh):
  168. meshName = self.read_name()
  169. numSubmesh = self.inFile.readUInt()
  170. for j in range(numSubmesh):
  171. self.inFile.readFloat()
  172. self.inFile.read('2L')
  173. self.parse_submesh(numSubmesh)
  174.  
  175. def parse_file(self):
  176.  
  177. self.inFile.read('2H')
  178. self.inFile.read('4L')
  179. version = self.inFile.readUInt()
  180. self.inFile.read('2L')
  181. numBones = self.inFile.readUInt()
  182. self.inFile.read('10L')
  183. self.inFile.read('2H') #large number
  184. self.inFile.readUInt()
  185. self.read_name()
  186. self.inFile.readFloat()
  187. self.inFile.readUInt()
  188. numMesh = self.inFile.readUInt()
  189. self.parse_mesh(numMesh)# your code goes here
Runtime error #stdin #stdout #stderr 0.02s 27664KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Traceback (most recent call last):
  File "./prog.py", line 1, in <module>
ImportError: No module named 'inc_noesis'