import os
-import itertools
class DataExporter:
- def export_to_file(self, context, out_fn, *, collection=False, shared_resources=False):
- from .util import Progress
- progress = Progress(context)
-
- objects = context.selected_objects
+ def export_to_file(self, ctx, out_fn, *, collection=False, shared_resources=False):
+ objects = ctx.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 shared_resources:
numbers = {}
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
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':
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:
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:
resources[res_name] = res
dummy_res.create_reference_statement("ref", res)
- progress.pop_task()
-
return dummy_res
class ProjectExporter:
- def export_to_directory(self, context, out_dir):
- from .util import Progress
- progress = Progress(context)
+ def export_to_directory(self, ctx, out_dir):
+ from .scene import create_scene, create_scene_chain
- from .scene import create_scene_chain
+ task = ctx.task("Preparing scenes", 0.0)
+ task.set_slices(len(ctx.context.blend_data.scenes))
scenes = {}
+ scene_queue = []
sequences = []
- for s in context.blend_data.scenes:
- if s.export_disposition=='IGNORE':
- continue
-
+ for s in ctx.context.blend_data.scenes:
+ subtask = task.next_slice(s)
if s.export_disposition=='SEQUENCE':
scene = create_scene_chain(s, scenes)
sequences.append(scene)
- elif s.name not in scenes:
+ scene_queue.append(scene)
+ elif s.export_disposition!='IGNORE' and s.name not in scenes:
scene = create_scene(s)
+ scenes[scene.name] = scene
if s.export_disposition=='SCENE':
- scenes[scene.name] = scene
+ scene_queue.append(scene)
all_objects = []
for s in scenes.values():
- all_objects += s.prototypes
+ all_objects += [p.object for p in s.prototypes]
all_objects += s.lights
if s.camera:
all_objects.append(s.camera)
+ 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)
scene_exporter = SceneExporter()
data_exporter = DataExporter()
+ task = ctx.task("Exporting resources", 1.0)
resources = {}
- dummy_res = data_exporter.export_resources(context, all_objects, resources, None, progress)
- for s in scenes.values():
+ 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)
+ task = ctx.task("Exporting sequences", 1.0)
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)
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))