]> git.tdb.fi Git - libs/gl.git/blob - blender/io_mspgl/export_scene.py
3dc3236b04b992c67ced8a583e991f50a9011410
[libs/gl.git] / blender / io_mspgl / export_scene.py
1 import math
2 import os
3
4 class SceneExporter:
5         def __init__(self):
6                 self.selected_only = False
7                 self.visible_only = True
8                 self.collection = True
9                 self.skip_existing = True
10
11         def export_to_file(self, context, out_fn):
12                 from .util import Progress
13                 progress = Progress(context)
14
15                 from .scene import create_scene_from_current
16                 scene = create_scene_from_current(context, selected_only=self.selected_only, visible_only=self.visible_only)
17
18                 resources = {}
19                 self.export_scene_resources(context, scene, resources, progress)
20                 scene_res = self.export_scene(scene, resources)
21                 progress.set_progress(1.0)
22
23                 path, base = os.path.split(out_fn)
24                 base, ext = os.path.splitext(base)
25
26                 if self.collection:
27                         existing = None
28                         if self.skip_existing:
29                                 existing = lambda r: not os.path.exists(os.path.join(path, r.name))
30                         scene_res.write_collection(out_fn, filter=existing)
31                 else:
32                         scene_res.write_to_file(out_fn)
33                         for r in scene_res.collect_references():
34                                 r.write_to_file(os.path.join(path, r.name))
35
36         def export_scene_resources(self, context, scene, resources, progress):
37                 from .export import DataExporter
38                 data_exporter = DataExporter()
39
40                 data_exporter.export_resources(context, scene.prototypes, resources, None, progress)
41
42         def export_scene(self, scene, resources):
43                 from .datafile import Resource, Statement, Token
44                 scene_res = Resource(scene.name+".scene", "scene")
45
46                 scene_res.statements.append(Statement("type", Token(scene.scene_type.lower())))
47
48                 for i in scene.instances:
49                         obj_res = resources[i.prototype+".object"]
50                         st = scene_res.create_reference_statement("object", obj_res, i.name)
51
52                         ss = Statement("transform")
53
54                         loc = i.matrix_world.to_translation()
55                         ss.sub.append(Statement("position", *tuple(loc)))
56
57                         quat = i.matrix_world.to_quaternion()
58                         if i.rotation_mode in ('XYZ', 'XZY', 'YXZ', 'YZX', 'ZXY', 'ZYX'):
59                                 angles = [a*180/math.pi for a in quat.to_euler()]
60                                 ss.sub.append(Statement("euler", *angles));
61                         else:
62                                 ss.sub.append(Statement("rotation", quat.angle*180/math.pi, *tuple(quat.axis)))
63
64                         scale = i.matrix_world.to_scale()
65                         ss.sub.append(Statement("scale", *tuple(scale)))
66
67                         st.sub.append(ss)
68                         scene_res.statements.append(st)
69
70                 return scene_res