]> git.tdb.fi Git - libs/gl.git/blobdiff - blender/io_mspgl/export_scene.py
Improve progress reporting in the Blender exporter
[libs/gl.git] / blender / io_mspgl / export_scene.py
index fcd634fbf7330036c7880c4ef4ef2eca5f0fceb5..d51fb4718a0fdf1afda48a9587bf670dcbe3732e 100644 (file)
@@ -3,8 +3,8 @@ import os
 
 class SceneExporter:
        def __init__(self):
-               self.external_tech = True
                self.resource_collection = True
+               self.show_progress = True
 
        def export(self, context, out_file):
                objs = context.selected_objects
@@ -18,34 +18,58 @@ class SceneExporter:
 
                from .export_object import ObjectExporter
                object_export = ObjectExporter()
-               object_export.compound = True
-               object_export.external_tech = self.external_tech
+
+               object_prototypes = {}
+               unique_objects = []
+               for o in objs:
+                       if o.name in object_prototypes:
+                               continue
+
+                       clones = [o]
+                       if not any(s.link=="OBJECT" for s in o.material_slots):
+                               for u in objs:
+                                       if u is o:
+                                               continue
+                                       if u.data.name!=o.data.name:
+                                               continue
+                                       if u.technique!=o.technique:
+                                               continue
+                                       if any(s.link=="OBJECT" for s in u.material_slots):
+                                               continue
+
+                                       clones.append(u)
+
+                       unique_objects.append(o)
+                       for c in clones:
+                               object_prototypes[c.name] = o
 
                from .util import Progress
-               progress = Progress(context)
+               progress = Progress(self.show_progress and context)
+
                if self.resource_collection:
                        res_out = open_output(os.path.join(path, base+"_resources.mdc"))
 
                        # TODO Export techniques as separate items in the collection
-                       for i, o in enumerate(objs):
+                       for i, o in enumerate(unique_objects):
                                res_out.begin("object", '"{}.object"'.format(o.name))
-                               progress.push_task(o.name, i/len(objs), (i+1)/len(objs))
-                               object_export.export(context, res_out, [o], progress)
+                               progress.push_task_slice(o.name, i, len(objs))
+                               object_export.export(context, res_out, o, progress)
                                progress.pop_task()
                                res_out.end()
                else:
+                       object_export.separate_mesh = True
                        object_export.separate_tech = True
                        res_dir = os.path.join(path, base+"_resources")
                        if not os.path.exists(res_dir):
                                os.makedirs(res_dir)
-                       for o in objs:
+                       for i, o in enumerate(unique_objects):
                                obj_out = open_output(os.path.join(res_dir, o.name+".object"))
-                               progress.push_task(o.name, i/len(objs), (i+1)/len(objs))
-                               object_export.export(context, obj_out, [o], progress)
+                               progress.push_task_slice(o.name, i, len(objs))
+                               object_export.export(context, obj_out, o, progress)
                                progress.pop_task()
 
                for o in objs:
-                       out_file.begin("object", '"{}.object"'.format(o.name))
+                       out_file.begin("object", '"{}.object"'.format(object_prototypes[o.name].name))
                        # XXX Parent relationships screw up the location and rotation
                        out_file.write("position", o.location[0], o.location[1], o.location[2])
                        if o.rotation_mode=="AXIS_ANGLE":
@@ -60,4 +84,4 @@ class SceneExporter:
                                axis = q.axis
                        out_file.write("rotation", angle*180/math.pi, axis[0], axis[1], axis[2])
                        out_file.write("scale", o.scale[0], o.scale[1], o.scale[2])
-                       out_file.end();
+                       out_file.end()