25/01/12 0.18
authorJerome Mahieux <jerome.le.chat@free.fr>
Mon, 20 Aug 2012 16:58:11 +0000 (16:58 +0000)
committerJerome Mahieux <jerome.le.chat@free.fr>
Mon, 20 Aug 2012 16:58:11 +0000 (16:58 +0000)
  . code rewrite according to api bmesh changes (me.polygon and uv layers essentially)
  . implemented foreachset() call for uv import (faster)

io_directx_bel/README
io_directx_bel/__init__.py
io_directx_bel/bel/__init__.py
io_directx_bel/bel/fs.py
io_directx_bel/bel/image.py
io_directx_bel/bel/material.py
io_directx_bel/bel/mesh.py
io_directx_bel/bel/ob.py
io_directx_bel/bel/uv.py
io_directx_bel/import_x.py

index c147ac95b048c43f9a2b186a0d54052f3a3992aa..28678279910a42bcf20fe9203543f7cea741a279 100644 (file)
@@ -24,7 +24,11 @@ TO TEST THE SCRIPT :
   . start blender\r
   . enable then addon in  user prefs > addons\r
   . run the script with file > import > directX\r
-\r
\r
+25/01/12 0.18\r
+  . code rewrite according to api bmesh changes (me.polygon and uv layers essentially)\r
+  . implemented foreachset() call for uv import (faster)\r
+  \r
 25/01/12 0.17\r
   . faster, 60% faster in some case : various loops improvements, infile templates parsing disabled by default\r
     saw another bottleneck about data chunks as string but will wait for binary support for better point of view.\r
index 8db2a9594dd06ecc4708000d8566a6adddfafaa6..2b707a5fcf1e980eae96a5e9434f40284630d222 100644 (file)
@@ -3,8 +3,9 @@ bl_info = {
     "name": "DirectX Importer",
     "description": "Import directX Model Format (.x)",
     "author": "Littleneo (Jerome Mahieux)",
-    "version": (0, 17),
-    "blender": (2, 6, 1),
+    "version": (0, 18),
+    "blender": (2, 6, 3),
+    "api": 42615,
     "location": "File > Import > DirectX (.x)",
     "warning": "",
     "wiki_url": "https://github.com/littleneo/directX_blender/wiki",
@@ -32,24 +33,11 @@ from bpy_extras.io_utils import (ExportHelper,
                                  path_reference_mode,
                                  axis_conversion,
                                  )
-
-'''
-class DisplayTree(bpy.types.Operator) :
-    bl_idname = 'city.selector'
-    bl_label = 'preview'
-
-    def execute(self,context) :
-'''
-
-def hide_templates(self,context) :
-    if self.use_templates == False : self.show_templates = False
-
-def not_parented(self,context) :
-    self.parented = False
-    self.use_templates = False
-
+try : import bel
+except : import io_directx_bel.bel
+    
 class ImportX(bpy.types.Operator, ImportHelper):
-    """Load a Direct x File"""
+    '''Load a Direct x File'''
     bl_idname = "import_scene.x"
     bl_label = "Import X"
     bl_options = {'PRESET', 'UNDO'}
@@ -66,7 +54,7 @@ class ImportX(bpy.types.Operator, ImportHelper):
             )
     show_templates = BoolProperty(
             name="Show x templates",
-            description="display any token structure definition found in the .x file",
+            description="display templates defined in the .x file",
             default=False,
             )
     show_geninfo = BoolProperty(
@@ -79,7 +67,6 @@ class ImportX(bpy.types.Operator, ImportHelper):
             name="Quick mode",
             description="only retrieve mesh basics",
             default=False,
-            update=not_parented
             )
     
     parented = BoolProperty(
@@ -87,13 +74,6 @@ class ImportX(bpy.types.Operator, ImportHelper):
             description="import armatures, empties, rebuild parent-childs relations",
             default=True,
             )
-
-    use_templates = BoolProperty(
-            name="Use infile x templates",
-            description="parse any token structure definition found in the .x file, use it prior to standard ones",
-            default=False,
-            update=hide_templates
-            )
     
     bone_maxlength = FloatProperty(
             name="Bone length",
@@ -106,8 +86,6 @@ class ImportX(bpy.types.Operator, ImportHelper):
     chunksize = EnumProperty(
             name="Chunksize",
             items=(('0', "all", ""),
-                   ('16384', "16KB", ""),
-                   ('8192', "8KB", ""),
                    ('4096', "4KB", ""),
                    ('2048', "2KB", ""),
                    ('1024', "1KB", ""),
@@ -127,7 +105,7 @@ class ImportX(bpy.types.Operator, ImportHelper):
             )
     use_ngons = BoolProperty(
             name="NGons",
-            description="Import faces with more then 4 verts as ngons",
+            description="Import faces with more then 4 verts as fgons",
             default=True,
             )
     use_edges = BoolProperty(
@@ -160,7 +138,7 @@ class ImportX(bpy.types.Operator, ImportHelper):
 
     use_image_search = BoolProperty(
             name="Image Search",
-            description="Search subdirs for any associated images " \
+            description="Search subdirs for any assosiated images " \
                         "(Warning, may be slow)",
             default=True,
             )
@@ -205,7 +183,6 @@ class ImportX(bpy.types.Operator, ImportHelper):
             )
 
     def execute(self, context):
-        from . import bel
         from . import import_x
         if self.split_mode == 'OFF':
             self.use_split_objects = False
@@ -227,7 +204,7 @@ class ImportX(bpy.types.Operator, ImportHelper):
         keywords["global_matrix"] = global_matrix
 
     
-        bel.fs.saveOptions('import_scene.x', self.as_keywords(ignore=(
+        bel.fs.saveOptions(self,'import_scene.x', self.as_keywords(ignore=(
                                             "filter_glob",
                                             "filepath",
                                             )))
@@ -241,15 +218,16 @@ class ImportX(bpy.types.Operator, ImportHelper):
         col = box.column(align=True)
         col.label('Import Options :')  
         col.prop(self, "chunksize")
-        col.prop(self, "use_smooth_groups")      
-        col.prop(self, "quickmode")
+        col.prop(self, "use_smooth_groups")
+        actif = not(self.quickmode)
         row = col.row()
-        row.enabled = not(self.quickmode)
+        row.enabled = actif
         row.prop(self, "parented")
-        #if self.parented :
-        row = col.row()
-        row.enabled = self.parented
-        row.prop(self, "bone_maxlength")
+        if self.parented :
+            row = col.row()
+            row.enabled = actif
+            row.prop(self, "bone_maxlength")      
+        col.prop(self, "quickmode")
         
         # source orientation box
         box = layout.box()
@@ -269,11 +247,8 @@ class ImportX(bpy.types.Operator, ImportHelper):
         col = box.column(align=True)
         col.label('Info / Debug :')
         col.prop(self, "show_tree")
+        col.prop(self, "show_templates")
         col.prop(self, "show_geninfo")
-        col.prop(self, "use_templates")
-        row = col.row()
-        row.enabled = self.use_templates
-        row.prop(self, "show_templates")  
         
         #row = layout.row(align=True)
         #row.prop(self, "use_ngons")
@@ -318,4 +293,4 @@ def unregister():
     #bpy.types.INFO_MT_file_export.remove(menu_func_export)
 
 if __name__ == "__main__":
-    register()
+    register()
\ No newline at end of file
index ab9cc89af925ca680778874d61f99dd2cdf5f73a..fcc6a5cccfb39e1b4914e86c45f245a51814bab5 100644 (file)
@@ -1,7 +1,7 @@
 # set a given name to a unique
 # blender data name in its collection
-def bpyname(name,collection,suffix=4) :
-    name = name[:20-suffix]
+def bpyname(name,collection,limit=63,suffix=4) :
+    name = name[:limit-suffix]
     tpl = '%s.%.'+str(suffix)+'d'
     bname = name
     id = 0
@@ -20,4 +20,4 @@ def nested(lst) :
         t = lst[0][0][0]
         return lst, True
     except :
-        return [lst], False
+        return [lst], False
\ No newline at end of file
index c9398fbf812b482de9b1d8cff83b8f5846157ae2..18e2b2c90f378a368b30617bd3e912d7eb0930e1 100644 (file)
@@ -48,7 +48,9 @@ def scanDir(path,ext='all') :
             files.extend(scanDir(path + '/' + item))
     return files
 
-def saveOptions(operator_name, tokens, filename='last_run'):
+def saveOptions(op,operator_name, tokens, filename='last_run'):
+    #print(op.as_keywords())
+    #print(dir(op))
     target_path = os_path.join("operator", operator_name)
     target_path = os_path.join("presets", target_path)
     target_path = bpy.utils.user_resource('SCRIPTS',target_path,create=True)
index cc6400a2e439f50aafddfc7809e0f5c8d1537ebc..f4a61792e1b5fccccd9b1f9c0808d53bc2720db1 100644 (file)
@@ -1,7 +1,8 @@
 import bpy
 import bpy.path
-import io_directx_bel.bel.fs
-from io_directx_bel import bel
+
+from . import __init__ as bel
+from . import fs
 
 debuglevel = 0
 
@@ -12,16 +13,16 @@ def dprint(str,l=2) :
 # create or retrieve a bdata image
 # given its path 
 def new(path, name=False, relative = True, premul = True) :
-    path = bel.fs.clean(path)
+    path = fs.clean(path)
     # check file
-    if bel.fs.isfile(path) == False :
+    if fs.isfile(path) == False :
         dprint('Texture image not found')
         return False
 
     if relative :
         try :
             path = bpy.path.relpath(path)
-            path = bel.fs.clean(path)
+            path = fs.clean(path)
         except : 
             print('cant turn path into relative one (.blend and img path drive letters ?) ')
         
@@ -29,7 +30,7 @@ def new(path, name=False, relative = True, premul = True) :
     # returns img if paths match
     for img in bpy.data.images :
         if img.filepath != '' :
-            if bpy.path.abspath(path) == bpy.path.abspath(bel.fs.clean(img.filepath)) :
+            if bpy.path.abspath(path) == bpy.path.abspath(fs.clean(img.filepath)) :
                 return img
 
     # create a unique name in image slot
@@ -261,4 +262,4 @@ def BSshader(nodes,pointer) :
         texslot.use_map_alpha = alpha
         texslot.alpha_factor = 1.0
 
-    return mat
+    return mat
\ No newline at end of file
index 299b190b1a8ee4c921ffb84922c2747d8cef385e..d39f32c6860215d1c1fb1cb1e542588e0cebb949 100644 (file)
@@ -1,13 +1,13 @@
 import bpy
 
-"""
+'''
 given name < 21
 if material name exists :
 naming_method = 0   blender default (increment name)
 naming_method = 1   do nothing, abort creation and use existing
 naming_method = 2   create new, rename existing, 
 naming_method = 3   create new, replace existing
-"""
+'''
 
 def new(name, naming_method=0) :
     if name not in bpy.data.materials or naming_method == 0:
index 736ef14926d31ef553c5bf03cccbc9033262355b..eee416c175946084a4f2f2c38fd1089d86d791c4 100644 (file)
@@ -4,12 +4,11 @@ import bpy
 import mathutils
 from mathutils import *
 
-import io_directx_bel.bel.uv
-import io_directx_bel.bel.ob
-from io_directx_bel import bel
+from . import uv as buv
+from . import ob as bob
 
 debuglevel = 0
-"""
+'''
 wip.. naming behaviour previous to any data
 name exist ?
 no : create
@@ -20,10 +19,10 @@ yes :
     naming_method = 3   create new, remove existing
     
 for now, and mesh data, 0 2 or 3
-"""
+'''
+
+## material listed in matslots must exist before creation of material slots
 
-## material MUST exist before creation of material slots
-## map only uvmap 0 to its image defined in mat  for now (multitex view)
 def write(obname,name, 
           verts=[], edges=[], faces=[], 
           matslots=[], mats=[], uvs=[], 
@@ -46,10 +45,10 @@ def write(obname,name,
     if naming_method == 3 :
         if obj : 
             #print('remove ob %s'%obj.name)
-            bel.ob.remove(obj,False)
+            bob.remove(obj,False)
         if me :
             #print('remove me %s'%me.name)
-            bel.ob.removeData(me)
+            bob.removeData(me)
     
 
     me = bpy.data.meshes.new(name)
@@ -59,7 +58,7 @@ def write(obname,name,
     me.update()
 
     if smooth : shadesmooth(me)
-    
+
     # material slots
     matimage=[]
     if len(matslots) > 0 :
@@ -86,15 +85,15 @@ def write(obname,name,
                             continue
             matimage.append(False)
 
-    # map a material to each face
-    if len(mats) > 0 :
-        for fi,f in enumerate(me.faces) :
-            f.material_index = mats[fi]
-
     # uvs
     if len(uvs) > 0 :
-        bel.uv.write(me, uvs, matimage)
+        #buv.write(me, uvs, matimage)
+        buv.flatwrite(me, uvs)
 
+    # map a material to each face
+    if len(mats) > 0 :
+        for fi,f in enumerate(me.polygons) :
+            f.material_index = mats[fi]
 
     obj = bpy.data.objects.new(name=obname, object_data=me)
     if naming_method != 0 :
@@ -124,17 +123,17 @@ def write(obname,name,
 def shadesmooth(me,lst=True) :
     if type(lst) == list :
         for fi in lst :
-            me.faces[fi].use_smooth = True
+            me.polygons[fi].use_smooth = True
     else :
-        for fi,face in enumerate(me.faces) :
+        for fi,face in enumerate(me.polygons) :
             face.use_smooth = True
  
 def shadeflat(me,lst=True) :
     if type(lst) == list :
         for fi in lst :
-            me.faces[fi].use_smooth = False
+            me.polygons[fi].use_smooth = False
     else :
-        for fi,face in enumerate(me.faces) :
+        for fi,face in enumerate(me.polygons) :
             face.use_smooth = False
 
 def weightsadd(ob, groupname, vindices, vweights=False) :
index b875fb867937a276a132cd3b5556d767a697ebe5..486bced1550d408d19469137f049494b81c32972 100644 (file)
@@ -113,4 +113,4 @@ def removeData(data) :
     else :
         #print('  not done, %s has %s user'%(data.name,data.users))
         data.name = '_dead'
-        
+        
\ No newline at end of file
index ef85b767645c9e4d36ff9f67089d712ce58d8ce0..28278190622e95ac458d6f97f5702c756a7d3a36 100644 (file)
@@ -1,34 +1,60 @@
 from mathutils import Vector
-from .. import bel
+from .__init__ import *
+from time import clock
 
+# uvs :
+# 
 def write(me, uvs, matimage = False) :
-    uvs, nest = bel.nested(uvs)
+    t = clock()
+    uvs, nest = nested(uvs)
     newuvs = []
-    append = newuvs.append
+    # uvi : uvlayer id  uvlist : uv coordinates list
     for uvi, uvlist in enumerate(uvs) :
 
         uv = me.uv_textures.new()
         uv.name = 'UV%s'%uvi
         
+        uvlayer = me.uv_layers[-1].data
+        
         for uvfi, uvface in enumerate(uvlist) :
             #uv.data[uvfi].use_twoside = True # 2.60 changes mat ways
-            mslotid = me.faces[uvfi].material_index
+            mslotid = me.polygons[uvfi].material_index
             #mat = mesh.materials[mslotid]
             if matimage :
                 if matimage[mslotid] :
                     img = matimage[mslotid]
                     uv.data[uvfi].image=img
-                    #uv.data[uvfi].use_image = True
             
-            uv.data[uvfi].uv1 = Vector((uvface[0],uvface[1]))
-            uv.data[uvfi].uv2 = Vector((uvface[2],uvface[3]))
-            uv.data[uvfi].uv3 = Vector((uvface[4],uvface[5]))
-            if len(uvface) == 8 :
-                uv.data[uvfi].uv4 = Vector((uvface[6],uvface[7]))
-        append(uv)
+            vi = 0
+            for fi in me.polygons[uvfi].loop_indices :
+                uvlayer[fi].uv = Vector((uvface[vi],uvface[vi+1]))
+                vi += 2
+                
+        newuvs.append(uv)
+    print('uvs in ',clock() - t)
     if nest : return newuvs
-    else : return newuvs[0]
+    return newuvs[0]
+    
+## WAY faster
+def flatwrite(me, uvs, matimage = False) :
+    #t = clock()
+    newuvs = []
+    #print('uv funcinput : %s'%(len(uvs)))
+    # uvi : uvlayer id  uvlist : uv coordinates list
+    for uvi, uvlist in enumerate(uvs) :
+        #print('uvlist input : %s'%(len(uvlist)))
+        #print(uvlist[0:5])
+        uv = me.uv_textures.new()
+        uv.name = 'UV%s'%uvi
+        uvlayer = me.uv_layers[-1].data
+        # flatuv = awaited uvlist length
+        #flatuv = list( range(len(uvlayer) * 2) )
+        #print('uvlist need : %s'%(len(flatuv)))
+        uvlayer.foreach_set('uv',uvlist)
 
+        newuvs.append(uv)
+    #print('uvs in ',clock() - t)
+    return newuvs
 
 # face are squared or rectangular, 
 # any orientation
@@ -36,12 +62,11 @@ def write(me, uvs, matimage = False) :
 # normal default when face has been built
 def row(vertices,faces,normals=True) :
     uvs = []
-    append = uvs.append
     for face in faces :
         v0 = vertices[face[0]]
         v1 = vertices[face[1]]
         v2 = vertices[face[-1]]
-        #print(v0,v1)
+        print(v0,v1)
         lx = (v1 - v0).length
         ly = (v2 - v0).length
         # init uv
@@ -54,28 +79,31 @@ def row(vertices,faces,normals=True) :
         else :
             x = uvs[-1][0]
             y = uvs[-1][1]
-        if normals : append([x,y,x+lx,y,x+lx,y+ly,x,y+ly])
-        else : append([x+lx,y,x,y,x,y+ly,x+lx,y+ly])
+        if normals : uvs.append([x,y,x+lx,y,x+lx,y+ly,x,y+ly])
+        else : uvs.append([x+lx,y,x,y,x,y+ly,x+lx,y+ly])
     return uvs
 
 ## convert UV given as verts location to blender format
 # eg : [ [v0x,v0y] , [vnx , vny] ... ] -> [ [ v1x,v1y,v0x,v0y,v4x,v4y] ... ]
-# this format is found in directx files
-'''
+# found in directx
 def asVertsLocation(verts2d, faces) :
+    t = clock()
     uv = []
     for f in faces :
         uvface = []
         for vi in f :
             uvface.extend(verts2d[vi])
         uv.append(uvface)
+    print('uvs convert in ',clock() - t)
     return uv
-'''
-def asVertsLocation(verts2d, idFaces) :
-    coFaces = []
-    uvBlender = []
-    conv0 = coFaces.extend
-    conv1 = uvBlender.extend
-    for f in idFaces : conv0([verts2d[vi] for vi in f])
-    for f in coFaces : conv1(f)
-    return uvBlender
+
+## Dx to flat
+#eg : [ [v0x,v0y] ,[v1x,v1y] , [vnx , vny] ] -> [ v0x,v0y,v1x,v1y,vnx,vny ]
+def asFlatList(uvlist,faces) :
+    #t = clock()
+    uv = []
+    for f in faces :
+        for vi in f :
+            uv.extend(uvlist[vi])
+    #print('uvs convert in %s len : %s'%(str(clock() - t),len(uv)))
+    return uv
\ No newline at end of file
index 54a279cde23e04eb1f3d7731c3dc569bd95f7994..f96dc7e5123e537018131deca70598595a3a2388 100644 (file)
@@ -5,10 +5,10 @@
 
 # I don't want to load the whole file as it can be huge : go chunks
 # also I want random access to 3d datas to import pieces, not always everything
-# so step1 is a whole file fast parsing, retrieving tokens name and building the internal dict
-# with no 3d datas inside.
-# step 2 is to call any token by their names and retrieve the 3d datas thanks to a pointer stored in dicts
-# between stp1 and step 2 a script ui should be provided to select, transform etc before import.
+# so step1 is a whole file fast parsing, retrieving tokens name and building en empty internal dict
+# with only pointers and no 3d datas.
+# step 2 is to call any token by their names and retrieve the 3d datas thanks to pointers stored in dicts
+# between step 1 and step 2 a script ui should be provided to select, transform etc before import.
 # > I need to know the pointer position of tokens but data.tell() is slow
 # a += pointer computed from line length is way faster. so I need eol -> rb mode
 # and readline() is ok in binary mode 'rb' with \r\n (win) \n (unix) but not \r mac..
@@ -27,18 +27,21 @@ import struct, binascii
 import time
 
 import bpy
+import mathutils as bmat
 from mathutils import Vector, Matrix
 
+try :
+       import bel
+       import bel.mesh
+       import bel.image
+       import bel.uv
+       import bel.material
+       import bel.ob
+       import bel.fs
+except :
+       import io_directx_bel.bel as bel
+       from .bel import mesh,image,uv,material,ob,fs
 
-import io_directx_bel.bel.mesh
-import io_directx_bel.bel.image
-import io_directx_bel.bel.uv
-import io_directx_bel.bel.material
-import io_directx_bel.bel.ob
-import io_directx_bel.bel.fs
-from io_directx_bel import bel
-
-# XXX, should use explicit names
 from .templates_x import *
 
 '''
@@ -62,9 +65,8 @@ def load(operator, context, filepath,
          show_geninfo=False,
          quickmode=False,
          parented=False,
-         use_templates=False,
          bone_maxlength=1.0,
-         chunksize=2048,
+         chunksize=False,
          naming_method=0,
          use_ngons=True,
          use_edges=True,
@@ -98,7 +100,7 @@ def load(operator, context, filepath,
         'Matrix4x4',
         'Vector',
     '''
-    """
+    '''
     with * : defined in dXdata
     
     WORD     16 bits
@@ -146,7 +148,7 @@ BINARY FORMAT
 #define TOKEN_CSTRING     51
 #define TOKEN_ARRAY       52
     
-    """
+    '''
     
     # COMMON REGEX
     space = '[\ \t]{1,}' # at least one space / tab
@@ -176,7 +178,7 @@ BINARY FORMAT
     # returns header values or False if directx reco tag is missing
     # assuming there's never comment header and that xof if the 1st
     # string of the file
-    """
+    '''
      they look like xof 0303txt 0032
      4       Magic Number (required) "xof "
      2       Minor Version 03
@@ -187,7 +189,7 @@ BINARY FORMAT
         "tzip" MSZip Compressed Text File
         "bzip" MSZip Compressed Binary File
      4       Float Accuracy "0032" 32 bit or "0064" 64 bit
-    """
+    '''
     def dXheader(data) :
         l = data.read(4)
         if l != b'xof ' :
@@ -215,6 +217,7 @@ BINARY FORMAT
         trunkated = False
         previouslvl = False
         while True :
+        #for l in data.readlines() :
             lines, trunkated = nextFileChunk(data,trunkated)
             if lines == None : break
             for l in lines :
@@ -248,7 +251,7 @@ BINARY FORMAT
                 
                 if quickmode == False :
                     ## look for templates
-                    if use_templates and re.match(r_template,l) :
+                    if re.match(r_template,l) :
                         tname = l.split(' ')[1]
                         templates[tname] = {'pointer' : ptr, 'line' : c}
                         continue
@@ -307,7 +310,6 @@ BINARY FORMAT
         if format == 'txt' :
             lines = chunk.decode('utf-8', errors='ignore')
             #if stream : return lines.replace('\r','').replace('\n','')
-            #lines = [ l + '\n' for l in lines.replace('\r','\n').split('\n') ]
             lines = lines.replace('\r','\n').split('\n')
             if trunkated : lines[0] = trunkated + lines[0]
             if len(lines) == 1 : 
@@ -403,12 +405,10 @@ BINARY FORMAT
     def dXtemplateData(tpl,block,ptr=0) :
         #print('dxTPL',block[ptr])
         pack = []
-        append = pack.append
-        namespace = locals()
         for member in tpl['members'] :
             #print(member)
-            datatype = member[0].lower()
             dataname = member[-1]
+            datatype = member[0].lower()
             if datatype ==  'array' :
                 datatype = member[1].lower()
                 s = dataname.index('[') + 1
@@ -426,9 +426,8 @@ BINARY FORMAT
             #if len(str(datavalue)) > 50 : dispvalue = str(datavalue[0:25]) + ' [...] ' + str(datavalue[-25:])
             #else : dispvalue = str(datavalue)
             #print('%s :  %s %s'%(dataname,dispvalue,type(datavalue)))
-            #exec('%s = datavalue'%(dataname))
-            namespace[dataname] = datavalue
-            append( datavalue )
+            exec('%s = datavalue'%(dataname))
+            pack.append( datavalue )
         return pack, ptr + 1
     
     def dXdata(block,datatype,length,s=0,eof=';') :
@@ -463,14 +462,13 @@ BINARY FORMAT
     def dXarray(block, datatype, length, s=0) :
         #print('dxARR',block[s])
         lst = []
-        append = lst.append
         if datatype in reserved_type :
             eoi=','
             for i in range(length) :
                 if i+1 == length : eoi = ';'
                 datavalue, s = dXdata(block,datatype,1,s,eoi)
-                append( datavalue )
-        
+                lst.append( datavalue )
+            
         else :
             eoi = ';,'
             for i in range(length) :
@@ -479,7 +477,7 @@ BINARY FORMAT
                 e = block.index(eoi,s)
                 #except : print(block,s) ; popo()
                 datavalue, na = dXdata(block[s:e+1],datatype,1)
-                append( datavalue )
+                lst.append( datavalue )
                 s = e + 2
         return lst, s
     
@@ -492,19 +490,20 @@ BINARY FORMAT
         line = templates[tpl_name]['line']
         #print('> %s at line %s (chr %s)'%(tpl_name,line,ptr))
         data.seek(ptr)
-        lines = []
-        append = lines.append
+        block = ''
         trunkated = False
         go = True
         while go :
-            rawlines, trunkated = nextFileChunk(data,trunkated,chunksize) # stream ?
-            if rawlines == None : break
-            for l in rawlines :
-                append(l.strip())
+            lines, trunkated = nextFileChunk(data,trunkated,chunksize) # stream ?
+            if lines == None : 
+                break
+            for l in lines :
+                #l = data.readline().decode().strip()
+                block += l.strip()
                 if '}' in l :
                     go = False
                     break
-        block = ''.join(lines)
+        
         uuid = re.search(r'<.+>',block).group()
         templates[tpl_name]['uuid'] = uuid.lower()
         templates[tpl_name]['members'] = []
@@ -544,42 +543,36 @@ BINARY FORMAT
                     #            print('  %s'%str(member)[1:-1].replace(',',' ').replace("'",''))
                 else :
                     print('MATCHES BUILTIN TEMPLATE')
-
+    
+            
     ##  read any kind of token data block
     # by default the block is cleaned from inline comment space etc to allow data parsing
     # useclean = False (retrieve all bytes) if you need to compute a file byte pointer
-    # to mimic the file.tell() function and use it with file.seek() later
+    # to mimic the file.tell() function and use it with file.seek()
     def readBlock(data,token, clean=True) :
-        data.seek(token['pointer'])
-        lines = []
-        append = lines.append
-        strip = str.strip
+        ptr = token['pointer']
+        data.seek(ptr)
+        block = ''
+        #lvl = 0
+        trunkated = False
         go = True
-        init = True
-        
-        def cleanLine(l):
-            if '//' in l : l = l[0:l.index('//')]
-            if '#' in l : l = l[0:l.index('#')]
-            return l.strip().replace(' ','').replace('\t','')
-            
         while go :
-            chunk = data.read(512).decode('utf-8', errors='ignore')
-            chunk = chunk.replace('\r','\n').split('\n')
-            for l in map(cleanLine, chunk) :
-                if l == '' : continue
-                if init :
-                    l = l[l.index('{')+1:]
-                    init = False
-                if '}' in l :
-                    append(l[0:l.index('}')])
+            lines, trunkated = nextFileChunk(data,trunkated,chunksize)
+            if lines == None : break
+            for l in lines :
+                #eol = len(l) + 1
+                l = l.strip()
+                #c += 1
+                block += l+'\n'
+                if re.match(r_endsection,l) :
                     go = False
                     break
-                append(l)
-        
-        block = ''.join(lines)
+        s = block.index('{') + 1
+        e = block.index('}')
+        block = block[s:e]
+        if clean : block = cleanBlock(block)
         return block
-
-
+    
     def getChilds(tokenname) :
         childs = []
         # '*' in childname means it's a reference. always perform this test
@@ -589,7 +582,7 @@ BINARY FORMAT
             childs.append( childname )
         return childs
     
-       # the input nested list of [bonename, matrix, [child0,child1..]] is given by import_dXtree()
+    # the input nested list of [bonename, matrix, [child0,child1..]] is given by import_dXtree()
     def buildArm(armdata, child,lvl=0,parent_matrix=False) :
         
         bonename, bonemat, bonechilds = child
@@ -778,7 +771,8 @@ BINARY FORMAT
             # UV
             if tokentype == 'meshtexturecoords' :
                 uv = readToken(childname)
-                uv = bel.uv.asVertsLocation(uv, faces)
+                #uv = bel.uv.asVertsLocation(uv, faces)
+                uv = bel.uv.asFlatList(uv, faces)
                 uvs.append(uv)
                 
                 if debug : print('uv       : %s'%(len(uv)))
@@ -942,7 +936,8 @@ BINARY FORMAT
                 walk_dXtree(tokens.keys())
             
             ## DATA IMPORTATION
-            if show_geninfo :
+            if show_geninfo : 
+                #print(tokens)
                 print('Root frames :\n %s'%rootTokens)
             if parented :
                 import_dXtree(rootTokens)
@@ -973,4 +968,4 @@ BINARY FORMAT
 
 
         return {'FINISHED'}
-        
+        
\ No newline at end of file