Advertisement
Guest User

Untitled

a guest
Jul 18th, 2018
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.44 KB | None | 0 0
  1.  # ***************************************************************************** #
  2.  #
  3.  # MIT License
  4.  #
  5.  # Copyright (c) 2018 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. from struct import *
  28.  
  29. class DashLoader:
  30.  
  31.     # Constructor
  32.  
  33.     def __init__(self):
  34.        
  35.         self.blocks = {
  36.             'ATTR' : [],
  37.             'NAME' : [],
  38.             'BONE' : [],
  39.             'VERT' : [],
  40.             'TEX' : [],
  41.             'MAT' : [],
  42.             'FACE' : [],
  43.             'ANIM' : []
  44.         }
  45.  
  46.         self.attrs = {
  47.             'vertex_weight' : 0,
  48.             'uv_count' : 0,
  49.             'vertex_normals' : 0,
  50.             'vertex_colors' : 0
  51.         }
  52.  
  53.         self.names = {
  54.             'bone' : [],
  55.             'tex' : [],
  56.             'anim' : []
  57.         }
  58.  
  59.         self.bones = []
  60.         self.verts = []
  61.         self.texList = []
  62.         self.matList = []
  63.  
  64.     def readMagic(self):
  65.         bytes = self.view.read(4)
  66.         magic = str(bytes, "ASCII")
  67.         return magic
  68.  
  69.     def parse(self, filepath):
  70.        
  71.         self.view = open(filepath, 'rb')
  72.         self.readHeader()
  73.         self.readAttrs()
  74.         self.readNames()
  75.         self.readBones()
  76.         self.readVertices()
  77.         self.readTextures()
  78.         self.readMaterials()
  79.         self.readFaceGroups()
  80.         self.readAnimations()
  81.  
  82.     def readHeader(self):
  83.        
  84.         data = self.view.read(16)
  85.         s = unpack('4sIII', data)
  86.  
  87.         magic = s[0]
  88.         ofs = s[1]
  89.         version = s[2]
  90.         nbBlocks = s[3]
  91.  
  92.         if magic != b'DMF\x00':
  93.             raise ValueError('Magic number does not indicate DMF file')
  94.  
  95.         if version != 1:
  96.             raise ValueError('Version not supported')
  97.  
  98.         self.view.seek(ofs);
  99.  
  100.         for i in range(0, nbBlocks):
  101.             data = self.view.read(16)
  102.             s = unpack('4sIII', data)
  103.            
  104.             if s[0] == b'ATTR':
  105.                 self.blocks['ATTR'].append(s)
  106.             elif s[0] == b'NAME':
  107.                 self.blocks['NAME'].append(s)
  108.             elif s[0] == b'BONE':
  109.                 self.blocks['BONE'].append(s)
  110.             elif s[0] == b'VERT':
  111.                 self.blocks['VERT'].append(s)
  112.             elif s[0] == b'TEX\x00':
  113.                 self.blocks['TEX'].append(s)
  114.             elif s[0] == b'MAT\x00':
  115.                 self.blocks['MAT'].append(s)
  116.             elif s[0] == b'FACE':
  117.                 self.blocks['FACE'].append(s)
  118.             elif s[0] == b'ANIM':
  119.                 self.blocks['ANIM'].append(s)
  120.         return 0
  121.  
  122.     def readAttrs(self):
  123.        
  124.         if not len(self.blocks['ATTR']):
  125.             return
  126.  
  127.         block = self.blocks['ATTR'][0]
  128.         ofs = block[1]
  129.         nbAttr = block[3]
  130.  
  131.         self.view.seek(ofs)
  132.         data = self.view.read(8)
  133.         s = unpack('4sI', data)
  134.  
  135.         if s[0] != b'ATTR':
  136.             raise ValueError('Magic number does not indicate ATTR block')
  137.        
  138.         for i in range(0, nbAttr):
  139.             data = self.view.read(8)
  140.             s = unpack('4sI', data)
  141.  
  142.             if s[0] == b'VWGT':
  143.                 self.attrs['vertex_weight'] = s[1]
  144.             elif s[0] == b'UVCT':
  145.                 self.attrs['uv_count'] = s[1]
  146.             elif s[0] == b'VNRM':
  147.                 self.attrs['vertex_normals'] = s[1]
  148.             elif s[0] == b'VCLR':
  149.                 self.attrs['vertex_colors'] = s[1]
  150.         return 0
  151.  
  152.     def readNames(self):
  153.  
  154.         for block in self.blocks['NAME']:
  155.             ofs = block[1]
  156.             nbName = block[3]
  157.             self.view.seek(ofs)
  158.             data = self.view.read(12)
  159.             s = unpack('4sI4s', data)
  160.            
  161.             if s[0] != b'NAME':
  162.                 raise ValueError('Magic number does not indicate NAME block')
  163.  
  164.             type = s[2].decode('ascii')
  165.             data = self.view.read(s[1])
  166.             data = data.split(b'\x00')
  167.            
  168.             for i in range(0, nbName):
  169.                 self.names[type].append(data[i].decode("ascii"))
  170.         return 0
  171.  
  172.     def readBones(self):
  173.        
  174.         if not len(self.blocks['BONE']):
  175.             return
  176.  
  177.         block = self.blocks['BONE'][0]
  178.         ofs = block[1]
  179.         nbBone = block[3]
  180.  
  181.         self.view.seek(ofs)
  182.         data = self.view.read(8)
  183.         s = unpack('4sI', data)
  184.  
  185.         if s[0] != b'BONE':
  186.             raise ValueError('Magic number does not indicate BONE block')
  187.        
  188.         for i in range(0, nbBone):
  189.             data = self.view.read(68)
  190.             s = unpack('hhffffffffffffffff', data)
  191.             self.bones.append(s)
  192.         return 0
  193.  
  194.     def readVertices(self):
  195.        
  196.         if not len(self.blocks['VERT']):
  197.             return
  198.  
  199.         block = self.blocks['VERT'][0]
  200.         ofs = block[1]
  201.         nbVert = block[3]
  202.  
  203.         self.view.seek(ofs)
  204.         data = self.view.read(8)
  205.         s = unpack('4sI', data)
  206.  
  207.         if s[0] != b'VERT':
  208.             raise ValueError('Magic number does not indicate VERT block')
  209.        
  210.         for i in range(0, nbVert):
  211.             if not self.attrs['vertex_weight']:
  212.                 data = self.view.read(12)
  213.                 s = unpack('fff', data)
  214.                 self.verts.append(s)
  215.             else:
  216.                 data = self.view.read(32)
  217.                 s = unpack('fffHHffff', data)
  218.                 self.verts.append(s)
  219.         return 0
  220.  
  221.     def readTextures(self);
  222.         return 0
  223.  
  224.     def readMaterials(self);
  225.         return 0
  226.  
  227.     def readFaceGroups(self):
  228.         return 0
  229.  
  230.     def readAnimations(self):
  231.         return 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement