[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