]> git.tdb.fi Git - libs/gl.git/blobdiff - blender/io_mspgl/export.py
Further refactoring of instance handling in the Blender exporter
[libs/gl.git] / blender / io_mspgl / export.py
index 4751468b416a4b1316ae7c089dc3990c09707e0e..238f8c4d1725bb9f547632238e1ed488c76b2486 100644 (file)
@@ -1,27 +1,20 @@
 import os
 
 class DataExporter:
-       def __init__(self):
-               self.show_progress = True
-               self.collection = False
-               self.shared_resources = True
-
-       def export_to_file(self, context, out_fn):
-               from .util import Progress
-               progress = Progress(self.show_progress and context)
-
-               objects = context.selected_objects
+       def export_to_file(self, ctx, out_fn, *, collection=False, shared_resources=False):
+               objects = context.context.selected_objects
 
                resources = {}
-               material_atlases = {}
 
-               dummy_res = self.export_resources(context, objects, resources, material_atlases, progress)
+               task = ctx.task("Exporting resources", 1.0)
+               dummy_res = self.export_resources(task, objects, resources)
 
                path, base = os.path.split(out_fn)
                base, ext = os.path.splitext(base)
 
+               task = ctx.task("Writing files", 1.0)
                refs = dummy_res.collect_references()
-               if not self.shared_resources:
+               if not shared_resources:
                        numbers = {}
                        for r in refs:
                                res_ext = os.path.splitext(r.name)[1]
@@ -32,25 +25,24 @@ class DataExporter:
                                        r.name = base+res_ext
                                numbers[res_ext] = n+1
 
-               if self.collection:
+               if collection:
                        dummy_res.write_collection(out_fn, exclude_self=True)
                else:
                        for r in refs:
                                r.write_to_file(os.path.join(path, r.name))
 
-       def export_resources(self, context, objects, resources, material_atlases, progress):
-               if material_atlases is None:
-                       material_atlases = {}
-
+       def export_resources(self, ctx, objects, resources):
                object_exporter = None
                camera_exporter = None
                armature_exporter = None
+               light_exporter = None
 
                from .datafile import Resource
                dummy_res = Resource("dummy", "dummy")
 
-               for i, obj in enumerate(objects):
-                       progress.push_task_slice(obj.name, i, len(objects))
+               ctx.set_slices(len(objects))
+               for obj in objects:
+                       task = ctx.next_slice(obj)
                        res_name = None
                        res = None
                        if obj.type=='MESH':
@@ -59,8 +51,8 @@ class DataExporter:
                                        if not object_exporter:
                                                from .export_object import ObjectExporter
                                                object_exporter = ObjectExporter()
-                                       object_exporter.export_object_resources(context, obj, resources, material_atlases, progress)
-                                       res = object_exporter.export_object(obj, resources, progress)
+                                       object_exporter.export_object_resources(task, obj, resources)
+                                       res = object_exporter.export_object(obj, resources)
                        elif obj.type=='CAMERA':
                                res_name = obj.name+".camera"
                                if res_name not in resources:
@@ -74,12 +66,89 @@ class DataExporter:
                                        if not armature_exporter:
                                                from .export_armature import ArmatureExporter
                                                armature_exporter = ArmatureExporter()
-                                       res = armature_exporter.export_armature(context, obj)
+                                       res = armature_exporter.export_armature(obj)
+                       elif obj.type=='LIGHT':
+                               res_name = obj.name+".light"
+                               if res_name not in resources:
+                                       if not light_exporter:
+                                               from .export_light import LightExporter
+                                               light_exporter = LightExporter()
+                                       res = light_exporter.export_light(obj)
 
                        if res:
                                resources[res_name] = res
                                dummy_res.create_reference_statement("ref", res)
 
-                       progress.pop_task()
-
                return dummy_res
+
+class ProjectExporter:
+       def export_to_directory(self, ctx, out_dir):
+               from .scene import create_scene, create_scene_chain
+
+               task = ctx.task("Preparing scenes", 0.0)
+               task.set_slices(len(ctx.context.blend_data.scenes))
+
+               scenes = {}
+               sequences = []
+               for s in ctx.context.blend_data.scenes:
+                       subtask = task.next_slice(s)
+                       if s.export_disposition=='IGNORE':
+                               continue
+
+                       if s.export_disposition=='SEQUENCE':
+                               scene = create_scene_chain(s, scenes)
+                               sequences.append(scene)
+                       elif s.export_disposition!='IGNORE' and s.name not in scenes:
+                               scene = create_scene(s)
+                               if s.export_disposition=='SCENE':
+                                       scenes[scene.name] = scene
+
+               all_objects = []
+               for s in scenes.values():
+                       all_objects += [p.object for p in s.prototypes]
+                       all_objects += s.lights
+                       if s.camera:
+                               all_objects.append(s.camera)
+
+               scene_queue = list(scenes.values())
+               ordered_scenes = []
+               while scene_queue:
+                       s = scene_queue.pop(0)
+                       if not s.background_set or s.background_set in ordered_scenes:
+                               ordered_scenes.append(s)
+                       else:
+                               scene_queue.append(s)
+
+               from .util import make_unique
+               all_objects = make_unique(all_objects)
+
+               from .export_scene import SceneExporter
+               scene_exporter = SceneExporter()
+               data_exporter = DataExporter()
+
+               task = ctx.task("Exporting resources", 1.0)
+               resources = {}
+               dummy_res = data_exporter.export_resources(task, all_objects, resources)
+
+               task = ctx.task("Exporting scenes", 1.0)
+               for s in ordered_scenes:
+                       subtask = task.task(s, 0.5)
+                       scene_name = s.name+".scene"
+                       if scene_name not in resources:
+                               scene_res = scene_exporter.export_scene(s, resources)
+                               resources[scene_name] = scene_res
+                               dummy_res.create_reference_statement("ref", scene_res)
+
+               for s in sequences:
+                       subtask = task.task(s, 0.5)
+                       seq_name = s.name+".seq"
+                       if seq_name not in resources:
+                               scene_exporter.export_sequence_resources(s, resources)
+                               seq_res = scene_exporter.export_sequence(s, resources)
+                               resources[seq_name] = seq_res
+                               dummy_res.create_reference_statement("ref", seq_res)
+
+               task = ctx.task("Writing files", 1.0)
+               refs = dummy_res.collect_references()
+               for r in refs:
+                       r.write_to_file(os.path.join(out_dir, r.name))