Revision: 14265
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14265
Author:   briggs
Date:     2008-03-28 01:08:41 +0100 (Fri, 28 Mar 2008)

Log Message:
-----------
-> 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.

Modified Paths:
--------------
    trunk/blender/release/scripts/flt_export.py
    trunk/blender/release/scripts/flt_import.py
    trunk/blender/release/scripts/flt_properties.py

Modified: trunk/blender/release/scripts/flt_export.py
===================================================================
--- trunk/blender/release/scripts/flt_export.py 2008-03-27 16:38:14 UTC (rev 
14264)
+++ trunk/blender/release/scripts/flt_export.py 2008-03-28 00:08:41 UTC (rev 
14265)
@@ -415,14 +415,26 @@
        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 @@
                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 @@
                                
                #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 @@
                                        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 @@
                                #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 @@
                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

Modified: trunk/blender/release/scripts/flt_import.py
===================================================================
--- trunk/blender/release/scripts/flt_import.py 2008-03-27 16:38:14 UTC (rev 
14264)
+++ trunk/blender/release/scripts/flt_import.py 2008-03-28 00:08:41 UTC (rev 
14265)
@@ -86,7 +86,7 @@
 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 @@
                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 @@
                self.uvlayers = dict()
                self.blayernames = dict()
                self.subfacelevel = 0
+               self.extension = None
                
                mask = 2147483648
                for i in xrange(7):
@@ -1222,6 +1237,7 @@
                        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 @@
                                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 @@
                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 @@
                                                                                
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 @@
                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 @@
                                                                                
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 @@
                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 @@
                                                                                
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 @@
                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,7 +1731,10 @@
                                                                                
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'] = ''
                self.parse_record()
@@ -1709,13 +1746,16 @@
                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})
-

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to