]> git.tdb.fi Git - libs/gl.git/blobdiff - blender/io_mspgl/export_mesh.py
Properly handle compound children with non-identity local matrix
[libs/gl.git] / blender / io_mspgl / export_mesh.py
index e9724f27f3d94166469099df98b70cfed1c09b87..07f457a1e36720c06ee27475fd4176924f07a669 100644 (file)
@@ -1,5 +1,6 @@
 import itertools
 import bpy
+import mathutils
 
 class VertexCache:
        def __init__(self, size):
@@ -34,6 +35,7 @@ class VertexCache:
 
 class MeshExporter:
        def __init__(self):
+               self.show_progress = True
                self.use_strips = True
                self.use_degen_tris = False
                self.max_strip_len = 1024
@@ -49,7 +51,7 @@ class MeshExporter:
                self.export_groups = False
                self.max_groups = 2
 
-       def stripify(self, mesh, progress = None):
+       def stripify(self, mesh, progress=None):
                for f in mesh.faces:
                        f.flag = False
 
@@ -192,43 +194,51 @@ class MeshExporter:
                return strips, loose
 
        def export(self, context, out_file, objs=None, progress=None):
+               if objs:
+                       objs = [(o, mathutils.Matrix()) for i in objs]
+
                if self.compound:
                        if objs is None:
-                               objs = context.selected_objects
+                               objs = [(o, mathutils.Matrix()) for o in context.selected_objects]
                        check = objs
                        while check:
                                children = []
-                               for o in check:
+                               for o, m in check:
                                        for c in o.children:
                                                if c.compound:
-                                                       children.append(c)
+                                                       children.append((c, m*c.matrix_local))
                                objs += children
                                check = children
                elif objs is None:
-                       objs = [context.active_object]
+                       objs = [(context.active_object, mathutils.Matrix())]
 
                if not objs:
                        raise Exception("Nothing to export")
-               for o in objs:
+               for o, m in objs:
                        if o.type!="MESH":
                                raise Exception("Can only export Mesh data")
 
                from .mesh import Mesh
                from .util import Progress
 
-               if not progress:
-                       progress = Progress(context)
-               progress.set_task("Preparing", 0.0, 0.0)
+               if self.show_progress:
+                       if not progress:
+                               progress = Progress(context)
+                       progress.set_task("Preparing", 0.0, 0.0)
+               else:
+                       progress = None
 
                mesh = None
                bmeshes = []
-               for o in objs:
+               for o, m in objs:
                        bmesh = o.to_mesh(context.scene, True, "PREVIEW")
                        bmeshes.append(bmesh)
+                       me = Mesh(bmesh)
+                       me.transform(m)
                        if not mesh:
-                               mesh = Mesh(bmesh)
+                               mesh = me
                        else:
-                               mesh.splice(Mesh(bmesh))
+                               mesh.splice(me)
 
                if progress:
                        progress.set_task("Smoothing", 0.05, 0.35)
@@ -243,11 +253,12 @@ class MeshExporter:
                        mesh.sort_vertex_groups(self.max_groups)
 
                        # Create a mapping from vertex group indices to bone indices
-                       group_index_map = dict((i, i) for i in range(len(objs[0].vertex_groups)))
-                       if objs[0].parent and objs[0].parent.type=="ARMATURE":
-                               armature = objs[0].parent.data
+                       first_obj = objs[0][0]
+                       group_index_map = dict((i, i) for i in range(len(first_obj.vertex_groups)))
+                       if first_obj.parent and first_obj.parent.type=="ARMATURE":
+                               armature = first_obj.parent.data
                                bone_indices = dict((armature.bones[i].name, i) for i in range(len(armature.bones)))
-                               for g in objs[0].vertex_groups:
+                               for g in first_obj.vertex_groups:
                                        if g.name in bone_indices:
                                                group_index_map[g.index] = bone_indices[g.name]