Guest User

Untitled

a guest
Jul 20th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.79 KB | None | 0 0
  1. #!/usr/bin/env python
  2. #-*- coding utf-8 -*-
  3. import os
  4. from decimal import Decimal
  5.  
  6. class Material(object):
  7.     def __init__(self, name, rgb, amb, emis, spec, shi, trans):
  8.         self.name = name
  9.         self.rgb = rgb
  10.         self.amb = amb
  11.         self.emis = emis
  12.         self.spec = spec
  13.         self.shi = shi
  14.         self.trans = trans
  15.        
  16. class Surf(object):
  17.     def __init__(self, surf, mat, refs):
  18.         self.s = surf
  19.         self.mat = mat
  20.         self.refs = refs
  21.        
  22. class Ref(object):
  23.     def __init__(self, vert, uvx, uvy):
  24.         self.v = vert
  25.         self.uvx = uvx
  26.         self.uvy = uvy
  27.  
  28. class World(object):
  29.     def __init__(self, fh = None):
  30.         self.kids = []
  31.         if fh:
  32.             self.parselines(fh)
  33.    
  34.     def parselines(self, fh):
  35.         ln = fh.readline().strip()
  36.         # the world object should only have kids
  37.         assert ln.startswith('kids ')
  38.         num_kids = int(ln.strip().lstrip('kids '))
  39.         self._kids(fh, num_kids)
  40.    
  41.     def _kids(self, fh, num_kids):
  42.         self.kids = []
  43.         while num_kids > 0:
  44.             ln = fh.readline().strip()
  45.             if not ln:
  46.                 break
  47.             elif ln.startswith('OBJECT '):
  48.                 #print (self.name if hasattr(self, 'name') else 'WORLD'), num_kids, ln
  49.                 object_type = ln.lstrip('OBJECT ')
  50.                 if object_type == 'group':
  51.                     self.kids.append(Group(fh))
  52.                 elif object_type == 'poly':
  53.                     self.kids.append(Poly(fh))
  54.                 else:
  55.                     self.kids.append(Unknown(fh, object_type))
  56.                 num_kids -= 1
  57.  
  58. class Unknown(World):
  59.     def __init__(self, fh = None, object_type = None):
  60.         World.__init__(self)
  61.         self.object_type = object_type
  62.         self.content = ''
  63.         if fh:
  64.             self.parselines(fh)
  65.        
  66.     def parselines(self, fh):
  67.         ln = fh.readline()
  68.         while ln and not ln.startswith('kids '):
  69.             ln = fh.readline()
  70.             self.content += ln +'\r\n'
  71.         if ln.strip().startswith('kids '):
  72.             num_kids = int(ln.strip().lstrip('kids '))
  73.             self._kids(fh, num_kids)
  74.  
  75. class Group(World):
  76.     def __init__(self, fh = None):
  77.         World.__init__(self)
  78.         dec0 = Decimal ('0.0')
  79.         dec1 = Decimal ('1.0')
  80.         self.name = ''
  81.         self.data = None
  82.         self.loc = (dec0, dec0, dec0)
  83.         self.rot = (dec1, dec0, dec0, dec0, dec1, dec0, dec0, dec0, dec1)
  84.         self.url = ''
  85.         self.texture = ''
  86.         self.texrep = (dec1, dec1)
  87.         if fh:
  88.             self.parselines(fh)
  89.        
  90.     def parselines(self, fh):
  91.         while True:
  92.             ln = fh.readline().strip()
  93.             if not ln:
  94.                 break
  95.             elif ln.startswith('kids'):
  96.                 num_kids = int(ln.lstrip('kids '))
  97.                 self._kids(fh, num_kids)
  98.                 break
  99.             elif ln.startswith('name '):
  100.                 self.name = ln.lstrip('name ').strip('"')
  101.             elif ln.startswith('data '):
  102.                 num_chars = int(ln.lstrip('data '))
  103.                 self._data(fh, num_chars)
  104.             elif ln.startswith('rot '):
  105.                 self._rot(ln)
  106.             elif ln.startswith('loc '):
  107.                 self._loc(ln)
  108.             elif ln.startswith('url '):
  109.                 self._url(ln)
  110.             elif ln.startswith('texture '):
  111.                 self._texture(ln)
  112.             elif ln.startswith('texrep '):
  113.                 self._texrep(ln)
  114.  
  115.     def _name(self, ln):
  116.         self.name = ln.lstrip('name ').strip('"')
  117.  
  118.     def _data(self, fh, num_chars):
  119.         self.data = ''
  120.         while num_chars > 0:
  121.             ln = fh.readline()
  122.             if not ln:
  123.                 break
  124.             self.data += ln.rstrip('\n').rstrip('\r')
  125.             num_chars -= len(self.data)
  126.         #print self.name, "*data*", self.data
  127.        
  128.     def _loc(self, ln):
  129.         self.loc = tuple([Decimal(v) for v in ln.split()[1:4]])
  130.  
  131.     def _rot(self, ln):
  132.         self.rot = tuple([Decimal(v) for v in ln.split()[1:10]])
  133.    
  134.     def _url(self, ln):
  135.         self.url = ln.lstrip('url ')
  136.    
  137.     def _texture(self, ln):
  138.         self.texture = ln.strip().lstrip('texture ').strip('"')
  139.        
  140.     def _texrep(self, ln):
  141.         self.texrep = tuple([Decimal(v) for v in ln.split()[1:3]])
  142.        
  143. class Poly(Group):
  144.     def __init__(self, fh = None):
  145.         Group.__init__(self)
  146.         self.verts = []
  147.         self.surfs = []
  148.         self.crease = None
  149.         if fh:
  150.             self.parselines(fh)
  151.    
  152.     def parselines(self, fh):
  153.         while True:
  154.             ln = fh.readline().strip()
  155.             if not ln:
  156.                 break
  157.             elif ln.startswith('kids'):
  158.                 num_kids = int(ln.lstrip('kids '))
  159.                 self._kids(fh, num_kids)
  160.                 break
  161.             elif ln.startswith('name '):
  162.                 self._name(ln)
  163.             elif ln.startswith('data '):
  164.                 num_chars = int(ln.lstrip('data '))
  165.                 self._data(fh, num_chars)
  166.             elif ln.startswith('rot '):
  167.                 self._rot(ln)
  168.             elif ln.startswith('loc '):
  169.                 self._loc(ln)
  170.             elif ln.startswith('url '):
  171.                 self._url(ln)
  172.             elif ln.startswith('texture '):
  173.                 self._texture(ln)
  174.             elif ln.startswith('texrep '):
  175.                 self._texrep(ln)
  176.             elif ln.startswith('crease '):
  177.                 self._crease(ln)
  178.             elif ln.startswith('numvert '):
  179.                 num_verts = int(ln.lstrip('numvert '))
  180.                 self._verts(fh, num_verts)
  181.             elif ln.startswith('numsurf '):
  182.                 num_surfs = int(ln.lstrip('numsurf '))
  183.                 self._surfs(fh, num_surfs)
  184.            
  185.     def _crease(self, ln):
  186.         self.crease = Decimal(ln.strip().lstrip('crease '))
  187.        
  188.     def _verts(self, fh, num_verts):
  189.         while num_verts  > 0:
  190.             ln = fh.readline().strip()
  191.             if not ln:
  192.                 break
  193.             self.verts.append(tuple([Decimal(v) for v in ln.split()]))
  194.             num_verts -= 1
  195.        
  196.     def _surfs(self, fh, num_surfs):
  197.         while num_surfs:
  198.             surf = None
  199.             mat = None
  200.             num_refs = 0
  201.             refs = []
  202.             ln = fh.readline().strip()
  203.             if not ln:
  204.                 break
  205.             elif ln.strip().startswith('SURF '):
  206.                 surf = ln.lstrip('SURF ')
  207.             elif ln.strip().startswith('mat '):
  208.                 mat = int(ln.lstrip('mat '))
  209.             elif ln.startswith('refs '):
  210.                 num_refs = int(ln.lstrip('refs '))
  211.                 while num_refs > 0:
  212.                     ln = fh.readline().strip()
  213.                     if not ln:
  214.                         break
  215.                     v, uvx, uvy = ln.strip().split()
  216.                     refs.append(Ref(int(v), Decimal(uvx), Decimal(uvy)))
  217.                     num_refs -= 1
  218.                 break
  219.             self.surfs.append(Surf(surf, mat, refs))
  220.             num_surfs -= 1
  221.    
  222.    
  223. class Scene(object):
  224.     def __init__(self, ac3d_file=None):
  225.         self.materials = []
  226.         self.root = None
  227.         if ac3d_file:
  228.             self.readfile(ac3d_file)
  229.    
  230.     def readfile(self, ac3d_file):
  231.         fh = None
  232.         if hasattr(ac3d_file, 'readline'):
  233.             fh = ac3d_file
  234.         elif os.path.exists(filename) and os.path.isfile(filename):
  235.             fh = file(filename, 'r')
  236.         ln = fh.readline().strip()
  237.         assert ln.strip()[0:4] == "AC3D"
  238.         while not self.root:
  239.             ln = fh.readline().strip()
  240.             if not ln:
  241.                 break
  242.             elif ln.startswith('MATERIAL '):
  243.                 name = ln.lstrip('MATERIAL ').strip('"')
  244.                 rgb = tuple([Decimal(v) for v in ln.split('rgb')[1].split()[0:3]])
  245.                 amb = tuple([Decimal(v) for v in ln.split('amb')[1].split()[0:3]])
  246.                 emis = tuple([Decimal(v) for v in ln.split('emis')[1].split()[0:3]])
  247.                 spec = tuple([Decimal(v) for v in ln.split('spec')[1].split()[0:3]])
  248.                 shi = int(ln.split('shi')[1].split()[0])
  249.                 trans = Decimal(ln.split('trans')[1].split()[0])
  250.                 self.materials.append(Material(name, rgb, amb, emis, spec, shi, trans))
  251.             elif ln.strip().startswith('OBJECT '):
  252.                 if ln.strip().startswith('OBJECT world'):
  253.                     self.root = World(fh)
  254.                 elif ln.strip().startswith('OBJECT group'):
  255.                     self.root = Group(fh)
  256.                 elif ln.strip().startswith('OBJECT poly'):
  257.                     self.root = Poly(fh)
  258.                 else:
  259.                     self.root = Unknown(fh)
Add Comment
Please, Sign In to add comment