[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