]> git.tdb.fi Git - libs/gl.git/commitdiff
Use the same mesh for multiple instances of an object in scene exporter
authorMikko Rasa <tdb@tdb.fi>
Sun, 10 Sep 2017 12:23:22 +0000 (15:23 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sun, 10 Sep 2017 12:23:22 +0000 (15:23 +0300)
blender/io_mspgl/export_scene.py

index fcd634fbf7330036c7880c4ef4ef2eca5f0fceb5..08cce75709cc0618926811c32405fb821a9f016c 100644 (file)
@@ -21,31 +21,56 @@ class SceneExporter:
                object_export.compound = True
                object_export.external_tech = self.external_tech
 
                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)
                if self.resource_collection:
                        res_out = open_output(os.path.join(path, base+"_resources.mdc"))
 
                        # TODO Export techniques as separate items in the collection
                from .util import Progress
                progress = Progress(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.pop_task()
                                res_out.end()
                else:
                                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.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)
                        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.pop_task()
 
                for o in objs:
                                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.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":
                        # 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":