Advertisement
Guest User

Untitled

a guest
Jul 19th, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.89 KB | None | 0 0
  1. # ***************************************************************************** #
  2. #
  3. # MIT License
  4. #
  5. # Copyright (c) 2018 Benjamin Collins (kion @ dashgl.com)
  6. #
  7. # Permission is hereby granted, free of charge, to any person obtaining a copy
  8. # of this software and associated documentation files (the "Software"), to deal
  9. # in the Software without restriction, including without limitation the rights
  10. # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. # copies of the Software, and to permit persons to whom the Software is
  12. # furnished to do so, subject to the following conditions:
  13. #
  14. # The above copyright notice and this permission notice shall be included in all
  15. # copies or substantial portions of the Software.
  16. #
  17. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19. # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20. # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21. # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22. # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  23. # SOFTWARE.
  24. #
  25. # ***************************************************************************** #
  26.  
  27. import os
  28. import time
  29. import bpy
  30. import mathutils
  31. from struct import *
  32.  
  33. class DashLoader:
  34.  
  35. # Constructor
  36.  
  37. def __init__(self):
  38.  
  39. self.blocks = {
  40. 'ATTR' : [],
  41. 'NAME' : [],
  42. 'BONE' : [],
  43. 'VERT' : [],
  44. 'TEX' : [],
  45. 'MAT' : [],
  46. 'FACE' : [],
  47. 'ANIM' : []
  48. }
  49.  
  50. self.attrs = {
  51. 'vertex_weight' : 0,
  52. 'uv_count' : 0,
  53. 'vertex_normals' : 0,
  54. 'vertex_colors' : 0
  55. }
  56.  
  57. self.names = {
  58. 'bone' : [],
  59. 'tex' : [],
  60. 'anim' : []
  61. }
  62.  
  63. self.bones = []
  64. self.verts = []
  65. self.indices = []
  66. self.weights = []
  67. self.faces = []
  68. self.normals = []
  69. self.colors = []
  70. self.uvs = []
  71. self.texList = []
  72. self.matList = []
  73.  
  74. def readMagic(self):
  75. bytes = self.view.read(4)
  76. magic = str(bytes, "ASCII")
  77. return magic
  78.  
  79. def parse(self, filepath):
  80.  
  81. self.view = open(filepath, 'rb')
  82. self.readHeader()
  83. self.readAttrs()
  84. self.readNames()
  85. self.readBones()
  86. self.readVertices()
  87. self.readTextures()
  88. self.readMaterials()
  89. self.readFaceGroups()
  90. self.readAnimations()
  91.  
  92. self.createMesh()
  93.  
  94. def readHeader(self):
  95.  
  96. data = self.view.read(16)
  97. s = unpack('4sIII', data)
  98.  
  99. magic = s[0]
  100. ofs = s[1]
  101. version = s[2]
  102. nbBlocks = s[3]
  103.  
  104. if magic != b'DMF\x00':
  105. raise ValueError('Magic number does not indicate DMF file')
  106.  
  107. if version != 1:
  108. raise ValueError('Version not supported')
  109.  
  110. self.view.seek(ofs);
  111.  
  112. for i in range(0, nbBlocks):
  113. data = self.view.read(16)
  114. s = unpack('4sIII', data)
  115.  
  116. if s[0] == b'ATTR':
  117. self.blocks['ATTR'].append(s)
  118. elif s[0] == b'NAME':
  119. self.blocks['NAME'].append(s)
  120. elif s[0] == b'BONE':
  121. self.blocks['BONE'].append(s)
  122. elif s[0] == b'VERT':
  123. self.blocks['VERT'].append(s)
  124. elif s[0] == b'TEX\x00':
  125. self.blocks['TEX'].append(s)
  126. elif s[0] == b'MAT\x00':
  127. self.blocks['MAT'].append(s)
  128. elif s[0] == b'FACE':
  129. self.blocks['FACE'].append(s)
  130. elif s[0] == b'ANIM':
  131. self.blocks['ANIM'].append(s)
  132. return 0
  133.  
  134. def readAttrs(self):
  135.  
  136. if not len(self.blocks['ATTR']):
  137. return
  138.  
  139. block = self.blocks['ATTR'][0]
  140. ofs = block[1]
  141. nbAttr = block[3]
  142.  
  143. self.view.seek(ofs)
  144. data = self.view.read(8)
  145. s = unpack('4sI', data)
  146.  
  147. if s[0] != b'ATTR':
  148. raise ValueError('Magic number does not indicate ATTR block')
  149.  
  150. for i in range(0, nbAttr):
  151. data = self.view.read(8)
  152. s = unpack('4sI', data)
  153.  
  154. if s[0] == b'VWGT':
  155. self.attrs['vertex_weight'] = s[1]
  156. elif s[0] == b'UVCT':
  157. self.attrs['uv_count'] = s[1]
  158. elif s[0] == b'VNRM':
  159. self.attrs['vertex_normals'] = s[1]
  160. elif s[0] == b'VCLR':
  161. self.attrs['vertex_colors'] = s[1]
  162. return 0
  163.  
  164. def readNames(self):
  165.  
  166. for block in self.blocks['NAME']:
  167. ofs = block[1]
  168. nbName = block[3]
  169. self.view.seek(ofs)
  170. data = self.view.read(12)
  171. s = unpack('4sI4s', data)
  172.  
  173. if s[0] != b'NAME':
  174. raise ValueError('Magic number does not indicate NAME block')
  175.  
  176. type = s[2].decode('ascii')
  177. data = self.view.read(s[1])
  178. data = data.split(b'\x00')
  179.  
  180. for i in range(0, nbName):
  181. self.names[type].append(data[i].decode("ascii"))
  182. return 0
  183.  
  184. def readBones(self):
  185.  
  186. if not len(self.blocks['BONE']):
  187. return
  188.  
  189. block = self.blocks['BONE'][0]
  190. ofs = block[1]
  191. nbBone = block[3]
  192.  
  193. self.view.seek(ofs)
  194. data = self.view.read(8)
  195. s = unpack('4sI', data)
  196.  
  197. if s[0] != b'BONE':
  198. raise ValueError('Magic number does not indicate BONE block')
  199.  
  200. for i in range(0, nbBone):
  201. data = self.view.read(68)
  202. s = unpack('hhffffffffffffffff', data)
  203. self.bones.append(s)
  204. return 0
  205.  
  206. def readVertices(self):
  207.  
  208. if not len(self.blocks['VERT']):
  209. return
  210.  
  211. block = self.blocks['VERT'][0]
  212. ofs = block[1]
  213. nbVert = block[3]
  214.  
  215. self.view.seek(ofs)
  216. data = self.view.read(8)
  217. s = unpack('4sI', data)
  218.  
  219. if s[0] != b'VERT':
  220. raise ValueError('Magic number does not indicate VERT block')
  221.  
  222. for i in range(0, nbVert):
  223. data = self.view.read(12)
  224. s = unpack('fff', data)
  225. tpl = (s[0], s[2], s[1])
  226. self.verts.append(tpl)
  227.  
  228. if not self.attrs['vertex_weight']:
  229. continue
  230.  
  231. data = self.view.read(24)
  232. s = unpack('HHHHffff', data)
  233. self.weights.append(s)
  234. print(self.verts)
  235.  
  236. return 0
  237.  
  238. def readTextures(self):
  239. return 0
  240.  
  241. def readMaterials(self):
  242. return 0
  243.  
  244. def readFaceGroups(self):
  245.  
  246. for block in self.blocks['FACE']:
  247. ofs = block[1]
  248. matIndex = block[2]
  249. nbIndex = block[3]
  250. self.view.seek(ofs)
  251. data = self.view.read(8)
  252. s = unpack('4sI', data)
  253.  
  254. if s[0] != b'FACE':
  255. raise ValueError('Magic number does not indicate FACE block')
  256.  
  257. for i in range(0, nbIndex):
  258. data = self.view.read(2)
  259. s = unpack('H', data)
  260. self.indices.append(s[0])
  261.  
  262. for i in range(0, self.attrs['uv_count']):
  263. data = self.view.read(8)
  264. s = unpack('ff', data)
  265. self.uvs.append(s)
  266.  
  267. if self.attrs['vertex_normals']:
  268. data = self.view.read(12)
  269. s = unpack('fff', data)
  270. self.normals.append(s)
  271.  
  272. if self.attrs['vertex_colors']:
  273. data = self.view.read(12)
  274. s = unpack('fff', data)
  275. self.colors.append(s)
  276.  
  277. for i in range(0, nbIndex, 3):
  278. a = self.indices[i + 0]
  279. b = self.indices[i + 1]
  280. c = self.indices[i + 2]
  281. tpl = (a, b, c)
  282. self.faces.append(tpl)
  283. return 0
  284.  
  285. def readAnimations(self):
  286. return 0
  287.  
  288. def createMesh(self):
  289. me = bpy.data.meshes.new("kion")
  290. me.from_pydata(self.verts, [], self.faces)
  291. ob = bpy.data.objects.new("balls", me)
  292. ob.data = me
  293. scene = bpy.context.scene
  294. scene.objects.link(ob)
  295. return 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement