diff options
author | Geoffrey Bantle <hairbat@yahoo.com> | 2008-03-28 03:08:41 +0300 |
---|---|---|
committer | Geoffrey Bantle <hairbat@yahoo.com> | 2008-03-28 03:08:41 +0300 |
commit | 3b36c10702c1395f3ce037fb75b48108333064fd (patch) | |
tree | 9ec42b6328aea84db7e73b86e6a27a4423b233ec /release | |
parent | e7651c53c35534952777e80274736ac9a43f6929 (diff) |
-> Extension Node attribute support for FLT I/O
Extension node attributes are now read and stored as ID
props for the following Node types:
-Object Nodes
-Group Nodes
-LOD Nodes
-DOF Nodes
-Inline Light Point Nodes
The extension data is written back out on export.
Note that this commit only adds support for attribute extensions.
Completely new node types via the extension record are still
unsupported.
Diffstat (limited to 'release')
-rw-r--r-- | release/scripts/flt_export.py | 64 | ||||
-rw-r--r-- | release/scripts/flt_import.py | 63 | ||||
-rw-r--r-- | release/scripts/flt_properties.py | 19 |
3 files changed, 113 insertions, 33 deletions
diff --git a/release/scripts/flt_export.py b/release/scripts/flt_export.py index 5e69e203374..8fd2ca48b44 100644 --- a/release/scripts/flt_export.py +++ b/release/scripts/flt_export.py @@ -415,14 +415,26 @@ class Node: def write_pop(self): self.header.fw.write_short(11) self.header.fw.write_ushort(4) - + + def write_push_extension(self): + self.header.fw.write_short(21) + self.header.fw.write_ushort(24) + self.header.fw.pad(18) + self.header.fw.write_ushort(0) + + def write_pop_extension(self): + self.header.fw.write_short(22) + self.header.fw.write_ushort(24) + self.header.fw.pad(18) + self.header.fw.write_ushort(0) + def write_longid(self, name): length = len(name) if length >= 8: self.header.fw.write_short(33) # Long ID opcode self.header.fw.write_ushort(length+5) # Length of record self.header.fw.write_string(name, length+1) # name + zero terminator - + def write_comment(self,comment): length = len(comment) if length >= 65535: @@ -473,31 +485,31 @@ class Node: for child in self.child_objects: if(not child.restrictDisplay): childprops = None - type = None + ftype = None if not child.properties.has_key('FLT'): if child.type == 'Empty': if child.DupGroup: childprops = FLTXRef.copy() - type = 63 + ftype = 63 else: childprops = FLTGroup.copy() - type = 2 + ftype = 2 elif child.type == 'Mesh': if self.header.childhash[child.name] or not child.parent: childprops = FLTGroup.copy() - type = 2 + ftype = 2 else: childprops = FLTObject.copy() - type = 4 + ftype = 4 else: childprops = dict() for prop in child.properties['FLT']: childprops[prop] = child.properties['FLT'][prop] - type = child.properties['FLT']['type'] + ftype = child.properties['FLT']['type'] - if type in self.childtypes and type in alltypes: - Newnode = FLTNode(self,header,child,childprops,type) + if ftype in self.childtypes and ftype in alltypes: + Newnode = FLTNode(self,header,child,childprops,ftype) if child.type == 'Mesh': self.header.mnodes.append(Newnode) class FaceDesc: @@ -636,11 +648,11 @@ class FLTNode(Node): #now go through the loops and append. for l in loops: - (type, loop) = l + (ftype, loop) = l face_desc = FaceDesc() for i,vert in enumerate(loop): face_desc.vertex_index_lst.append(self.header.GRR.request_vertex_index(self.object,self.exportmesh,loop,i,0,0)) - if type == 'closed': + if ftype == 'closed': face_desc.renderstyle = 2 else: face_desc.renderstyle = 3 @@ -1036,12 +1048,26 @@ class FLTNode(Node): pass for key in records[self.opcode]: - (type,length,propname) = records[self.opcode][key] - write_prop(self.header.fw,type,exportdict[propname],length) + (ftype,length,propname) = records[self.opcode][key] + write_prop(self.header.fw,ftype,exportdict[propname],length) if self.props.has_key('comment'): self.write_comment(self.props['comment']) - + + if self.object and self.object.properties.has_key('FLT') and self.object.properties['FLT'].has_key('EXT'): + datalen = len(self.object.properties['FLT']['EXT']['data']) + self.write_push_extension() + self.header.fw.write_short(100) + self.header.fw.write_ushort(24 + datalen) + for key in records[100]: + (ftype,length,propname) = records[100][key] + write_prop(self.header.fw,ftype,self.object.properties['FLT']['EXT'][propname],length) + #write extension data + for i in xrange(datalen): + self.header.fw.write_char(self.object.properties['FLT']['EXT']['data'][i]) + self.write_pop_extension() + + self.write_longid(self.name) #fix this! if options.export_transform or self.opcode == 63: @@ -1064,8 +1090,8 @@ class FLTNode(Node): #self.write_pop() self.write_pop() - def __init__(self, parent, header, object,props,type): - self.opcode = type #both these next two lines need to be in the node class.... + def __init__(self, parent, header, object,props,ftype): + self.opcode = ftype #both these next two lines need to be in the node class.... self.childtypes = childtypes[self.opcode] Node.__init__(self, parent, header, object,props) self.face_lst = [] @@ -1295,8 +1321,8 @@ def write_attribute_files(): fw.write_int(size[0]) fw.write_int(size[1]) for key in records['Image']: - (type,length,propname) = records['Image'][key] - write_prop(fw,type,exportdict[propname],length) + (ftype,length,propname) = records['Image'][key] + write_prop(fw,ftype,exportdict[propname],length) fw.close_file() #globals used by the scene export function diff --git a/release/scripts/flt_import.py b/release/scripts/flt_import.py index 37278132211..34b69255b17 100644 --- a/release/scripts/flt_import.py +++ b/release/scripts/flt_import.py @@ -86,7 +86,7 @@ global_prefs['attrib'] = 0 msg_once = False throw_back_opcodes = [2, 73, 4, 11, 96, 14, 91, 98, 63,111] # Opcodes that indicate its time to return control to parent. -do_not_report_opcodes = [76, 78, 79, 80, 81, 82, 94, 83, 33, 112, 100, 101, 102, 97, 31, 103, 104, 117, 118, 120, 121, 124, 125] +do_not_report_opcodes = [76, 78, 79, 80, 81, 82, 94, 83, 33, 112, 101, 102, 97, 31, 103, 104, 117, 118, 120, 121, 124, 125] #Process FLT record definitions for record in FLT_Records: @@ -488,6 +488,20 @@ class Node: self.props['comment'] = self.header.fw.read_string(self.header.fw.get_length()-4) return True + def parse_extension(self): + extension = dict() + props = records[100] + propkeys = props.keys() + propkeys.sort() + for position in propkeys: + (type,length,name) = props[position] + extension[name] = read_prop(self.header.fw,type,length) + #read extension data. + dstring = list() + for i in xrange(self.header.fw.get_length()-24): + dstring.append(self.header.fw.read_char()) + extension['data'] = dstring + self.extension = extension def parse_record(self): self.props['type'] = self.opcode props = records[self.opcode] @@ -634,6 +648,7 @@ class InterNode(Node): self.uvlayers = dict() self.blayernames = dict() self.subfacelevel = 0 + self.extension = None mask = 2147483648 for i in xrange(7): @@ -1222,6 +1237,7 @@ class InterNode(Node): self.vis = self.parent.vis name = self.props['id'] + if self.hasMesh: self.mesh = Blender.Mesh.New() self.mesh.name = 'FLT_FaceList' @@ -1243,6 +1259,11 @@ class InterNode(Node): pass + if self.extension: + self.object.properties['FLT']['EXT'] = dict() + for key in self.extension: + self.object.properties['FLT']['EXT'][key] = self.extension[key] + if self.parent and self.parent.object and (self.header.scene == self.parent.header.scene): self.parent.object.makeParent([self.object],1) @@ -1511,9 +1532,10 @@ class Object(InterNode): InterNode.__init__(self) self.root_handler.set_handler({33: self.parse_long_id, - 31: self.parse_comment, - 10: self.parse_push, - 49: self.parse_matrix}) + 21: self.parse_push_extension, + 31: self.parse_comment, + 10: self.parse_push, + 49: self.parse_matrix}) self.root_handler.set_throw_back_lst(throw_back_opcodes) self.child_handler.set_handler({5: self.parse_face, @@ -1522,7 +1544,10 @@ class Object(InterNode): 111: self.parse_inline_light_point, 10: self.parse_push, 11: self.parse_pop}) - + self.extension_handler.set_handler({22: self.parse_pop_extension, + 100: self.parse_extension}) + + self.extension = dict() self.props = dict() self.props['comment'] = '' self.parse_record() @@ -1535,7 +1560,8 @@ class Group(InterNode): self.root_handler.set_handler({33: self.parse_long_id, 31: self.parse_comment, 10: self.parse_push, - 49: self.parse_matrix}) + 49: self.parse_matrix, + 21: self.parse_push_extension}) self.root_handler.set_throw_back_lst(throw_back_opcodes) self.child_handler.set_handler({5: self.parse_face, @@ -1552,6 +1578,10 @@ class Group(InterNode): 91: self.parse_unhandled, 98: self.parse_unhandled, 63: self.parse_xref}) + + self.extension_handler.set_handler({22: self.parse_pop_extension, + 100: self.parse_extension}) + self.props = dict.fromkeys(['type', 'id', 'comment', 'priority', 'flags', 'special1', 'special2', 'significance', 'layer code', 'loop count', 'loop duration', 'last frame duration']) @@ -1579,7 +1609,8 @@ class DOF(InterNode): self.root_handler.set_handler({33: self.parse_long_id, 31: self.parse_comment, 10: self.parse_push, - 49: self.parse_matrix}) + 49: self.parse_matrix, + 21: self.parse_push_extension}) self.root_handler.set_throw_back_lst(throw_back_opcodes) self.child_handler.set_handler({#130: self.parse_indexed_light_point, @@ -1594,6 +1625,8 @@ class DOF(InterNode): 91: self.parse_unhandled, 98: self.parse_unhandled, 63: self.parse_xref}) + self.extension_handler.set_handler({22: self.parse_pop_extension, + 100: self.parse_extension}) self.props = dict() self.props['comment'] = '' self.parse_record() @@ -1683,7 +1716,8 @@ class LOD(InterNode): self.root_handler.set_handler({33: self.parse_long_id, 31: self.parse_comment, 10: self.parse_push, - 49: self.parse_matrix}) + 49: self.parse_matrix, + 21: self.parse_push_extension}) self.root_handler.set_throw_back_lst(throw_back_opcodes) self.child_handler.set_handler({2: self.parse_group, @@ -1697,6 +1731,9 @@ class LOD(InterNode): 91: self.parse_unhandled, # sound 98: self.parse_unhandled, # clip 63: self.parse_xref}) + self.extension_handler.set_handler({22: self.parse_pop_extension, + 100: self.parse_extension}) + self.props = dict() self.props['comment'] = '' @@ -1709,13 +1746,16 @@ class InlineLightPoint(InterNode): self.root_handler.set_handler({33: self.parse_long_id, 31: self.parse_comment, 10: self.parse_push, + 21: self.parse_push_extension, 49: self.parse_matrix}) self.root_handler.set_throw_back_lst(throw_back_opcodes) self.child_handler.set_handler({72: self.parse_vertex_list, 10: self.parse_push, 11: self.parse_pop}) - + self.extension_handler.set_handler({22: self.parse_pop_extension, + 100: self.parse_extension}) + self.indices = list() self.props = dict() self.props['comment'] = '' @@ -1741,6 +1781,11 @@ class InlineLightPoint(InterNode): except: #horrible... pass + if self.extension: + self.object.properties['FLT']['EXT'] = dict() + for key in self.extension: + self.object.properties['FLT']['EXT'][key] = self.extension[key] + if self.parent and self.parent.object and self.header.scene == self.parent.header.scene: self.parent.object.makeParent([self.object]) diff --git a/release/scripts/flt_properties.py b/release/scripts/flt_properties.py index 2c9e9d7667b..bc7c972ca66 100644 --- a/release/scripts/flt_properties.py +++ b/release/scripts/flt_properties.py @@ -227,6 +227,14 @@ def read_prop(fw,type,length): rval = fw.read_string(length) return rval + +FLTExt = { + '3t8!id' : 'Ext', + '4t8!sid' : '', + '5c!reserved': 0, + '6c!revision' : 0, + '7S!recordcode' : 0 +} FLTGroup = { '3t8!id' : 'G', '4s!priority' : 0, @@ -280,7 +288,7 @@ FLTInlineLP = { '7C!back color: b' : 255, '8C!back color: g' : 255, '9C!back color: r' : 255, - '10i!display mode' : 255, + '10i!display mode' : 0, '11f!intensity' : 1.0, '12f!back intensity' : 0.0, '13f!minimum defocus' : 0.0, @@ -305,15 +313,15 @@ FLTInlineLP = { '32f!lobe roll angle' : 0.0, '33f!dir falloff exponent' : 1.0, '34f!dir ambient intensity' : 0.1, - '35f!anim period' : 0, + '35f!anim period' : 2, '36f!anim phase' : 0, - '37f!anim enabled' : 0, + '37f!anim enabled' : 1.0, '38f!significance' : 0.0, '39i!draw order' : 0, - '40I!flags' : 813875616, + '40I!flags' : 277004288, '41f!roti' : 0, '42f!rotj' : 0, - '43f!rotk' : 0 + '43f!rotk' : 1.0 } FLTInlineLPDisplay = [35,36,37,41,42,43] @@ -587,6 +595,7 @@ FLT_Records = { 14 : FLTDOF, 1 : FLTHeader, 111 : FLTInlineLP, + 100 : FLTExt, 'Image' : FLTImage } |