[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14265] trunk/blender/release/scripts: -> Extension Node attribute support for FLT I/O
Geoffrey Bantle
hairbat at yahoo.com
Fri Mar 28 01:08:42 CET 2008
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. @@
More information about the Bf-blender-cvs
mailing list