]> git.tdb.fi Git - libs/gl.git/blobdiff - blender/io_mspgl/datafile.py
Check the flat qualifier from the correct member
[libs/gl.git] / blender / io_mspgl / datafile.py
index 42ff454b4ccff69ab8d433629d973ddced83e744..b9d0b3afe0b1267e62e5d35e85a7779aa9973734 100644 (file)
@@ -1,3 +1,5 @@
+import struct
+
 class Statement:
        def __init__(self, keyword, *args):
                self.keyword = keyword
@@ -12,9 +14,14 @@ class Statement:
                for a in self.args:
                        if type(a)==float:
                                s += " {:#.6g}".format(a)
+                       elif type(a)==bool:
+                               if a:
+                                       s += " true"
+                               else:
+                                       s += " false"
                        elif type(a)==str:
                                s += ' "{}"'.format(a)
-                       elif type(a)==Resource:
+                       elif type(a)==Resource or type(a)==RawData:
                                s += ' "{}"'.format(a.name)
                        else:
                                s += " {}".format(a)
@@ -38,9 +45,25 @@ class Token:
                return self.text
 
 
+class RawData:
+       def __init__(self, name, data):
+               self.name = name
+               self.data = data
+
+       def collect_references(self):
+               return []
+
+       def write_to_file(self, fn):
+               with open(fn, "wb") as out_file:
+                       out_file.write(b"MDR\x01")
+                       out_file.write(struct.pack(">QH", len(self.data), 0))
+                       out_file.write(self.data)
+
+
 class Resource:
-       def __init__(self, name):
+       def __init__(self, name, keyword):
                self.name = name
+               self.keyword = keyword
                self.statements = []
                self.references = []
 
@@ -50,11 +73,11 @@ class Resource:
 
                resources = []
                for a in args:
-                       if type(a)==Resource:
+                       if type(a)==Resource or type(a)==RawData:
                                resources.append(a)
 
                if not resources:
-                       raise TypeError("create_reference_statement expected a Resource argument, found none")
+                       raise TypeError("create_reference_statement expected a Resource or RawData argument, found none")
 
                self.references += [r for r in resources if r not in self.references]
                return Statement(keyword, *args)
@@ -77,3 +100,20 @@ class Resource:
                        refs += [e for e in r.collect_references() if e not in refs]
                refs += [e for e in self.references if e not in refs]
                return refs
+
+       def write_to_file(self, fn):
+               with open(fn, "w") as out_file:
+                       for s in self.statements:
+                               s.write_to_file(out_file)
+
+       def write_collection(self, fn, *, exclude_self=False, filter=None):
+               items = self.collect_references()
+               if not exclude_self:
+                       items.append(self)
+               with open(fn, "w") as out_file:
+                       for i in items:
+                               if filter and not filter(i):
+                                       continue
+                               st = Statement(i.keyword, i.name)
+                               st.sub = i.statements
+                               st.write_to_file(out_file)