Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeoffrey Bantle <hairbat@yahoo.com>2008-03-28 03:08:41 +0300
committerGeoffrey Bantle <hairbat@yahoo.com>2008-03-28 03:08:41 +0300
commit3b36c10702c1395f3ce037fb75b48108333064fd (patch)
tree9ec42b6328aea84db7e73b86e6a27a4423b233ec /release
parente7651c53c35534952777e80274736ac9a43f6929 (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.py64
-rw-r--r--release/scripts/flt_import.py63
-rw-r--r--release/scripts/flt_properties.py19
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
}