[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11835] branches/2-44-stable/blender/ release/scripts/export_fbx.py: fixed namespace collisions and cleanup

Campbell Barton cbarton at metavr.com
Sun Aug 26 03:36:01 CEST 2007


Revision: 11835
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11835
Author:   campbellbarton
Date:     2007-08-26 03:36:00 +0200 (Sun, 26 Aug 2007)

Log Message:
-----------
fixed namespace collisions and cleanup

Modified Paths:
--------------
    branches/2-44-stable/blender/release/scripts/export_fbx.py

Modified: branches/2-44-stable/blender/release/scripts/export_fbx.py
===================================================================
--- branches/2-44-stable/blender/release/scripts/export_fbx.py	2007-08-26 01:35:03 UTC (rev 11834)
+++ branches/2-44-stable/blender/release/scripts/export_fbx.py	2007-08-26 01:36:00 UTC (rev 11835)
@@ -61,11 +61,11 @@
 from Blender.Mathutils import Matrix, Vector, Euler, RotationMatrix, TranslationMatrix
 
 import BPyObject
-reload(BPyObject)
 import BPyMesh
 import BPySys
 import BPyMessages
 
+import sys
 
 def copy_file(source, dest):
 	file = open(source, 'rb')
@@ -101,7 +101,6 @@
 					print '\t\tWarning, file failed to copy, skipping.'
 	
 	print '\tCopied %d images' % copyCount
-	
 
 mtx_z90 = RotationMatrix(90, 3, 'z')
 mtx_x90 = RotationMatrix(90, 3, 'x')
@@ -129,33 +128,48 @@
 ZVEC  = Vector(0, 0,  1)
 ZVECN = Vector(0, 0, -1)
 
-# Used to add the scene name into the filename without using odd chars
 
+def strip_path(p):
+	return p.split('\\')[-1].split('/')[-1]
+
+# Used to add the scene name into the filename without using odd chars	
 sane_name_mapping_ob = {}
 sane_name_mapping_mat = {}
 sane_name_mapping_tex = {}
 sane_name_mapping_take = {}
 
-def strip_path(p):
-	return p.split('\\')[-1].split('/')[-1]
+# Make sure reserved names are not used
+sane_name_mapping_ob['Scene'] = 'Scene_'
+sane_name_mapping_ob['blend_root'] = 'blend_root_'
 
+def increment_string(t):
+	name = t
+	num = ''
+	while name and name[-1].isdigit():
+		num = name[-1] + num
+		name = name[:-1]
+	if num:	return '%s%d' % (name, int(num)+1)	
+	else:	return name + '_0'
+
+
 # todo - Disallow the name 'Scene' and 'blend_root' - it will bugger things up.
 def sane_name(data, dct):
-	if not data: return None
+	#if not data: return None
 	name = data.name
-	try:		return dct[name]
-	except:		pass
 	
+	# dont cache, only ever call once for each data type now,
+	# so as to avoid namespace collision between types - like with objects <-> bones
+	#try:		return dct[name]
+	#except:		pass
+	
 	orig_name = name
 	if not name:
 		name = 'unnamed' # blank string, ASKING FOR TROUBLE!
 	else:
 		name = BPySys.cleanName(name)
-		
-		# Unlikely but make sure reserved names arnt used
-		if		name == 'Scene':		name = 'Scene_'
-		elif	name == 'blend_root':	name = 'blend_root_'
 	
+	while name in dct.itervalues():	name = increment_string(name)
+	
 	dct[orig_name] = name
 	return name
 
@@ -165,46 +179,29 @@
 def sane_takename(data):	return sane_name(data, sane_name_mapping_take)
 
 
-def increment_string(t):
-	name = t
-	num = ''
-	while name and name[-1].isdigit():
-		num = name[-1] + num
-		name = name[:-1]
-	if num:	return '%s%d' % (name, int(num)+1)	
-	else:	return name + '_0'
-
 # storage classes
 class my_bone_class:
 	__slots__ =(\
 	  'blenName',\
 	  'blenBone',\
 	  'blenMeshes',\
-	  'blenArmature',\
 	  'restMatrix',\
 	  'parent',\
 	  'blenName',\
 	  'fbxName',\
-	  'fbxArmObName',\
+	  'fbxArm',\
 	  '__pose_bone',\
 	  '__anim_poselist')
 	
-	unique_names = set()
-	
-	def __init__(self, blenBone, blenArmature, fbxArmObName):
+	def __init__(self, blenBone, fbxArm):
 		
 		# This is so 2 armatures dont have naming conflicts since FBX bones use object namespace
-		fbxName =			sane_obname(blenBone)
-		while fbxName in my_bone_class.unique_names:	fbxName = increment_string(fbxName)
-		self.fbxName = fbxName
-		my_bone_class.unique_names.add(fbxName)
+		self.fbxName = sane_obname(blenBone)
 		
-		self.fbxArmObName =		fbxArmObName
-		
 		self.blenName =			blenBone.name
 		self.blenBone =			blenBone
 		self.blenMeshes =		{}					# fbxMeshObName : mesh
-		self.blenArmature =		blenArmature
+		self.fbxArm =			fbxArm
 		self.restMatrix =		blenBone.matrix['ARMATURESPACE']
 		
 		# not used yet
@@ -214,7 +211,7 @@
 		self.parent =			None
 		
 		# not public
-		pose = blenArmature.getPose()
+		pose = fbxArm.blenObject.getPose()
 		self.__pose_bone =		pose.bones[self.blenName]
 		
 		# store a list if matricies here, (poseMatrix, head, tail)
@@ -255,7 +252,7 @@
 	# end
 	
 	def getAnimMatrix(self, frame):
-		arm_mat = self.blenArmature.matrixWorld
+		arm_mat = self.fbxArm.matrixWorld
 		if not self.parent:
 			return mtx4_z90 * (self.getPoseMatrix(frame) * arm_mat)
 		else:
@@ -265,6 +262,14 @@
 		self.__anim_poselist.clear()
 
 
+class my_object_generic:
+	# Other settings can be applied for each type - mesh, armature etc.
+	def __init__(self, ob):
+		self.fbxName = sane_obname(ob)
+		self.blenObject = ob
+		self.matrixWorld = ob.matrixWorld
+
+
 def mat4x4str(mat):
 	return '%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f' % tuple([ f for v in mat for f in v ])
 
@@ -543,15 +548,21 @@
 	
 	
 	# -------------------------------------------- Armatures
-	def write_bone(bone, name, matrix_mod):
-		file.write('\n\tModel: "Model::%s", "Limb" {' % name)
+	#def write_bone(bone, name, matrix_mod):
+	def write_bone(my_bone):
+		file.write('\n\tModel: "Model::%s", "Limb" {' % my_bone.fbxName)
 		file.write('\n\t\tVersion: 232')
 		
-		write_object_props(bone, None, None, matrix_mod)
+		write_object_props(my_bone.blenBone, None, None, my_bone.fbxArm.matrixWorld)
 		
-		#file.write('\n\t\t\tProperty: "Size", "double", "",%.6f' % ((bone.head['ARMATURESPACE']-bone.tail['ARMATURESPACE']) * matrix_mod).length)
+		# file.write('\n\t\t\tProperty: "Size", "double", "",%.6f' % ((my_bone.blenData.head['ARMATURESPACE'] - my_bone.blenData.tail['ARMATURESPACE']) * my_bone.fbxArm.matrixWorld).length)
 		file.write('\n\t\t\tProperty: "Size", "double", "",1')
-		file.write('\n\t\t\tProperty: "LimbLength", "double", "",%.6f' % ((bone.head['ARMATURESPACE'] * matrix_mod) - (bone.tail['ARMATURESPACE'] * matrix_mod)).length)
+		
+		#((my_bone.blenData.head['ARMATURESPACE'] * my_bone.fbxArm.matrixWorld) - (my_bone.blenData.tail['ARMATURESPACE'] * my_bone.fbxArm.matrixWorld)).length)
+		
+		file.write('\n\t\t\tProperty: "LimbLength", "double", "",%.6f' %\
+			((my_bone.blenBone.head['ARMATURESPACE'] - my_bone.blenBone.tail['ARMATURESPACE']) * my_bone.fbxArm.matrixWorld).length)
+		
 		#file.write('\n\t\t\tProperty: "LimbLength", "double", "",1')
 		file.write('\n\t\t\tProperty: "Color", "ColorRGB", "",0.8,0.8,0.8')
 		file.write('\n\t\t\tProperty: "Color", "Color", "A",0.8,0.8,0.8')
@@ -685,7 +696,7 @@
 		write_camera_dummy('Producer Right',			(4000,0,0), 1, 30000, 1, (0,1,0))
 		write_camera_dummy('Producer Left',			(-4000,0,0), 1, 30000, 1, (0,1,0))
 	
-	def write_camera(ob, name):
+	def write_camera(my_cam):
 		'''
 		Write a blender camera
 		'''
@@ -694,11 +705,11 @@
 		height	= render.sizeY
 		aspect	= float(width)/height
 		
-		data = ob.data
+		data = my_cam.blenObject.data
 		
-		file.write('\n\tModel: "Model::%s", "Camera" {' % name )
+		file.write('\n\tModel: "Model::%s", "Camera" {' % my_cam.fbxName )
 		file.write('\n\t\tVersion: 232')
-		loc, rot, scale, matrix, matrix_rot = write_object_props(ob)
+		loc, rot, scale, matrix, matrix_rot = write_object_props(my_cam.blenObject)
 		
 		file.write('\n\t\t\tProperty: "Roll", "Roll", "A+",0')
 		file.write('\n\t\t\tProperty: "FieldOfView", "FieldOfView", "A+",%.6f' % data.angle)
@@ -798,12 +809,12 @@
 		file.write('\n\t\tCameraOrthoZoom: 1')
 		file.write('\n\t}')
 	
-	def write_light(ob, name):
-		light = ob.data
-		file.write('\n\tModel: "Model::%s", "Light" {' % name)
+	def write_light(my_light):
+		light = my_light.blenObject.data
+		file.write('\n\tModel: "Model::%s", "Light" {' % my_light.fbxName)
 		file.write('\n\t\tVersion: 232')
 		
-		write_object_props(ob)
+		write_object_props(my_light.blenObject)
 		
 		# Why are these values here twice?????? - oh well, follow the holy sdk's output
 		
@@ -843,7 +854,7 @@
 		file.write('\n\t\t\tProperty: "EnableFarAttenuation", "bool", "",0')
 		file.write('\n\t\t\tProperty: "FarAttenuationStart", "double", "",0')
 		file.write('\n\t\t\tProperty: "FarAttenuationEnd", "double", "",0')
-		file.write('\n\t\t\tProperty: "CastShadows", "bool", "",0')
+		file.write('\n\t\t\tProperty: "CastShadows", "bool", "",0') # TODO
 		file.write('\n\t\t\tProperty: "ShadowColor", "ColorRGBA", "",0,0,0,1')
 		file.write('\n\t\t}')
 		file.write('\n\t\tMultiLayer: 0')
@@ -854,11 +865,15 @@
 		file.write('\n\t\tGeometryVersion: 124')
 		file.write('\n\t}')
 	
-	def write_null(ob, name):
+	def write_null(my_null, fbxName = None):
 		# ob can be null
-		file.write('\n\tModel: "Model::%s", "Null" {' % name)
+		if not fbxName: fbxName = my_null.fbxName
+		
+		file.write('\n\tModel: "Model::%s", "Null" {' % fbxName)
 		file.write('\n\t\tVersion: 232')
-		write_object_props(ob)
+		if my_null:		write_object_props(my_null.blenObject)
+		else:			write_object_props()
+			
 		file.write('''
 		}
 		MultiLayer: 0
@@ -1041,7 +1056,9 @@
 	
 	# in the example was 'Bip01 L Thigh_2'
 	#def write_sub_deformer_skin(obname, group_name, bone, me, matrix_mod):
-	def write_sub_deformer_skin(obname, group_name, bone, weights, matrix_mod):
+	#def write_sub_deformer_skin(obname, group_name, bone, weights, matrix_mod):
+	def write_sub_deformer_skin(my_mesh, my_bone, weights):
+	
 		'''
 		Each subdeformer is spesific to a mesh, but the bone it links to can be used by many sub-deformers
 		So the SubDeformer needs the mesh-object name as a prefix to make it unique
@@ -1049,8 +1066,8 @@
 		Its possible that there is no matching vgroup in this mesh, in that case no verts are in the subdeformer,
 		a but silly but dosnt really matter
 		'''
+		file.write('\n\tDeformer: "SubDeformer::Cluster %s %s", "Cluster" {' % (my_mesh.fbxName, my_bone.fbxName))
 		
-		file.write('\n\tDeformer: "SubDeformer::Cluster %s %s", "Cluster" {' % (obname, group_name))
 		file.write('''
 		Version: 100
 		MultiLayer: 0
@@ -1064,7 +1081,7 @@
 		try:
 			# Before we used normalized wright list
 			#vgroup_data = me.getVertsFromGroup(bone.name, 1)
-			group_index = weights[0].index(bone.name)
+			group_index = weights[0].index(my_bone.blenName)
 			vgroup_data = [(j, weight[group_index]) for j, weight in enumerate(weights[1]) if weight[group_index]] 
 		except:
 			vgroup_data = []
@@ -1097,27 +1114,24 @@
 			i+=1
 		
 		
-		m = mtx4_z90 * (bone.matrix['ARMATURESPACE'] * matrix_mod)
+		m = mtx4_z90 * (my_bone.restMatrix * my_bone.fbxArm.matrixWorld)
 		matstr = mat4x4str(m)
 		matstr_i = mat4x4str(m.invert())
 		
-		# --- try more here
-		
-		# It seems fine to have these matricies the same! - worldspace bone or pose locations?

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list