[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11948] branches/2-44-stable/blender: fix' s from trunk

Campbell Barton cbarton at metavr.com
Thu Sep 6 08:25:31 CEST 2007


Revision: 11948
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11948
Author:   campbellbarton
Date:     2007-09-06 08:25:31 +0200 (Thu, 06 Sep 2007)

Log Message:
-----------
fix's from trunk
- export_cal3d fix for calculating nomralized bone weights
- bvh importer failed with empties
- fbx export, added support for exporting groups and fixed duplis
- apply size/rot on armature uses better scale calculation and made this also work with curve.
- python could crash when printing a pose bone dict

Modified Paths:
--------------
    branches/2-44-stable/blender/release/scripts/bvh_import.py
    branches/2-44-stable/blender/release/scripts/export_cal3d.py
    branches/2-44-stable/blender/release/scripts/export_fbx.py
    branches/2-44-stable/blender/source/blender/blenlib/BLI_arithb.h
    branches/2-44-stable/blender/source/blender/blenlib/intern/arithb.c
    branches/2-44-stable/blender/source/blender/python/api2_2x/Pose.c
    branches/2-44-stable/blender/source/blender/python/api2_2x/gen_library.c
    branches/2-44-stable/blender/source/blender/src/editarmature.c
    branches/2-44-stable/blender/source/blender/src/editobject.c

Modified: branches/2-44-stable/blender/release/scripts/bvh_import.py
===================================================================
--- branches/2-44-stable/blender/release/scripts/bvh_import.py	2007-09-06 03:18:07 UTC (rev 11947)
+++ branches/2-44-stable/blender/release/scripts/bvh_import.py	2007-09-06 06:25:31 UTC (rev 11948)
@@ -354,7 +354,7 @@
 			
 			bvh_node.temp.rot= rx*DEG2RAD,ry*DEG2RAD,rz*DEG2RAD
 			
-			bvh_node.temp.insertIpoKey(Blender.Object.IpoKeys.LOCROT)
+			bvh_node.temp.insertIpoKey(Blender.Object.IpoKeyTypes.LOCROT)
 	
 	scn.update(1)
 	return objects

Modified: branches/2-44-stable/blender/release/scripts/export_cal3d.py
===================================================================
--- branches/2-44-stable/blender/release/scripts/export_cal3d.py	2007-09-06 03:18:07 UTC (rev 11947)
+++ branches/2-44-stable/blender/release/scripts/export_cal3d.py	2007-09-06 06:25:31 UTC (rev 11948)
@@ -616,7 +616,8 @@
 			sum = 0.0
 			
 			for bone_name, weight in blend_influences:
-				sum += weight
+				if BONES.get(bone_name):
+					sum += weight
 			
 			for bone_name, weight in blend_influences:
 				bone = BONES.get(bone_name)

Modified: branches/2-44-stable/blender/release/scripts/export_fbx.py
===================================================================
--- branches/2-44-stable/blender/release/scripts/export_fbx.py	2007-09-06 03:18:07 UTC (rev 11947)
+++ branches/2-44-stable/blender/release/scripts/export_fbx.py	2007-09-06 06:25:31 UTC (rev 11948)
@@ -155,6 +155,7 @@
 sane_name_mapping_mat = {}
 sane_name_mapping_tex = {}
 sane_name_mapping_take = {}
+sane_name_mapping_group = {}
 
 # Make sure reserved names are not used
 sane_name_mapping_ob['Scene'] = 'Scene_'
@@ -197,6 +198,7 @@
 def sane_matname(data):		return sane_name(data, sane_name_mapping_mat)
 def sane_texname(data):		return sane_name(data, sane_name_mapping_tex)
 def sane_takename(data):	return sane_name(data, sane_name_mapping_take)
+def sane_groupname(data):	return sane_name(data, sane_name_mapping_group)
 
 
 
@@ -451,10 +453,12 @@
 
 	class my_object_generic:
 		# Other settings can be applied for each type - mesh, armature etc.
-		def __init__(self, ob):
+		def __init__(self, ob, matrixWorld = None):
 			self.fbxName = sane_obname(ob)
 			self.blenObject = ob
-			self.matrixWorld = ob.matrixWorld * GLOBAL_MATRIX
+			self.fbxGroupNames = []
+			if matrixWorld:		self.matrixWorld = matrixWorld * GLOBAL_MATRIX
+			else:				self.matrixWorld = ob.matrixWorld * GLOBAL_MATRIX
 			self.__anim_poselist = {}
 		
 		def setPoseFrame(self, f):
@@ -1722,6 +1726,20 @@
 				file.write('\n\t\t}')
 		file.write('\n\t}')
 	
+	def write_group(name):
+		file.write('\n\tGroupSelection: "GroupSelection::%s", "Default" {' % name)
+		
+		file.write('''
+		Properties60:  {
+			Property: "MultiLayer", "bool", "",0
+			Property: "Pickable", "bool", "",1
+			Property: "Transformable", "bool", "",1
+			Property: "Show", "bool", "",1
+		}
+		MultiLayer: 0
+	}''')
+	
+	
 	# add meshes here to clear because they are not used anywhere.
 	meshes_to_clear = []
 	
@@ -1733,6 +1751,8 @@
 	ob_bones = [] 
 	ob_arms = []
 	ob_null = [] # emptys
+	
+	groups = [] # blender groups, only add ones that have objects in the selections
 	materials = {}
 	textures = {}
 	
@@ -1769,17 +1789,18 @@
 			tmp_ob_type = ob.type
 			if tmp_ob_type == 'Camera':
 				if EXP_CAMERA:
-					ob_cameras.append(my_object_generic(ob))
+					ob_cameras.append(my_object_generic(ob, mtx))
 			elif tmp_ob_type == 'Lamp':
 				if EXP_LAMP:
-					ob_lights.append(my_object_generic(ob))
+					ob_lights.append(my_object_generic(ob, mtx))
 			elif tmp_ob_type == 'Armature':
 				if EXP_ARMATURE:
+					# TODO - armatures dont work in dupligroups!
 					if ob not in ob_arms: ob_arms.append(ob)
 					# ob_arms.append(ob) # replace later. was "ob_arms.append(sane_obname(ob), ob)"
 			elif tmp_ob_type == 'Empty':
 				if EXP_EMPTY:
-					ob_null.append(my_object_generic(ob))
+					ob_null.append(my_object_generic(ob, mtx))
 			elif EXP_MESH:
 				origData = True
 				if tmp_ob_type != 'Mesh':
@@ -1869,7 +1890,7 @@
 					else:
 						blenParentBoneName = armob = None
 					
-					my_mesh = my_object_generic(ob)
+					my_mesh = my_object_generic(ob, mtx)
 					my_mesh.blenData =		me
 					my_mesh.origData = 		origData
 					my_mesh.blenMaterials =	mats
@@ -1957,6 +1978,33 @@
 	
 	del my_bone_blenParent 
 	
+	
+	
+	
+	# Build a list of groups we use.
+	bpy.data.objects.tag = False
+	tmp_obmapping = {}
+	for ob_generic in (ob_meshes, ob_arms, ob_cameras, ob_lights, ob_null):
+		for ob_base in ob_generic:
+			ob_base.blenObject.tag = True
+			tmp_obmapping[ob_base.blenObject] = ob_base.fbxGroupNames
+	
+	for blenGroup in bpy.data.groups:
+		fbxGroupName = None
+		for ob in blenGroup.objects:
+			if ob.tag:
+				if fbxGroupName == None:
+					fbxGroupName = sane_groupname(blenGroup)
+					groups.append((fbxGroupName, blenGroup))
+				
+				tmp_obmapping[ob].append(fbxGroupName) # also adds to the objects fbxGroupNames
+	
+	groups.sort() # not really needed
+	del tmp_obmapping
+	# Finished finding groups we use
+	
+	
+	
 	materials =	[(sane_matname(mat), mat) for mat in materials.itervalues() if mat]
 	textures =	[(sane_texname(img), img) for img in textures.itervalues()  if img]
 	materials.sort() # sort by name
@@ -2041,6 +2089,11 @@
 		Count: 1
 	}''')
 	
+	if groups:
+		file.write('''
+	ObjectType: "GroupSelection" {
+		Count: %i
+	}''' % len(groups))
 	
 	file.write('''
 	ObjectType: "GlobalSettings" {
@@ -2094,6 +2147,9 @@
 		write_texture(texname, tex, i)
 		i+=1
 	
+	for groupname, group in groups:
+		write_group(groupname)
+	
 	# NOTE - c4d and motionbuilder dont need normalized weights, but deep-exploration 5 does and (max?) do.
 	
 	# Write armature modifiers
@@ -2224,6 +2280,9 @@
 	# This should be at the end
 	# file.write('\n\tPose: "Pose::BIND_POSES", "BindPose" {\n\t}')
 	
+	for groupname, group in groups:
+		file.write('\n\tGroupSelection: "GroupSelection::%s", "Default" {\n\t}' % groupname)
+	
 	file.write('\n}')
 	file.write('''
 
@@ -2302,6 +2361,16 @@
 			# the armature object is written as an empty and all root level bones connect to it
 			file.write('\n\tConnect: "OO", "Model::%s", "Model::%s"' % (my_bone.fbxName, my_bone.fbxArm.fbxName) )
 	
+	# groups
+	if groups:
+		for ob_generic in (ob_meshes, ob_arms, ob_cameras, ob_lights, ob_null):
+			for ob_base in ob_generic:
+				for fbxGroupName in ob_base.fbxGroupNames:
+					file.write('\n\tConnect: "OO", "Model::%s", "GroupSelection::%s"' % (ob_base.fbxName, fbxGroupName))
+	
+	for my_arm in ob_arms:
+		file.write('\n\tConnect: "OO", "Model::%s", "Model::blend_root"' % my_arm.fbxName)
+	
 	file.write('\n}')
 	
 	

Modified: branches/2-44-stable/blender/source/blender/blenlib/BLI_arithb.h
===================================================================
--- branches/2-44-stable/blender/source/blender/blenlib/BLI_arithb.h	2007-09-06 03:18:07 UTC (rev 11947)
+++ branches/2-44-stable/blender/source/blender/blenlib/BLI_arithb.h	2007-09-06 06:25:31 UTC (rev 11948)
@@ -951,6 +951,9 @@
 void LocEulSizeToMat4(float mat[][4], float loc[3], float eul[3], float size[3]);
 void LocQuatSizeToMat4(float mat[][4], float loc[3], float quat[4], float size[3]);
 
+float Mat3ToScalef(float mat[][3]);
+float Mat4ToScalef(float mat[][4]);
+
 void tubemap(float x, float y, float z, float *u, float *v);
 void spheremap(float x, float y, float z, float *u, float *v);
 			  

Modified: branches/2-44-stable/blender/source/blender/blenlib/intern/arithb.c
===================================================================
--- branches/2-44-stable/blender/source/blender/blenlib/intern/arithb.c	2007-09-06 03:18:07 UTC (rev 11947)
+++ branches/2-44-stable/blender/source/blender/blenlib/intern/arithb.c	2007-09-06 06:25:31 UTC (rev 11948)
@@ -2606,6 +2606,25 @@
 	size[2]= Normalize(vec);
 }
 
+/* this gets the average scale of a matrix, only use when your scaling
+ * data that has no idea of scale axis, examples are bone-envelope-radius
+ * and curve radius */
+float Mat3ToScalef(float mat[][3])
+{
+	/* unit length vector */
+	float unit_vec[3] = {0.577350269189626, 0.577350269189626, 0.577350269189626};
+	Mat3MulVecfl(mat, unit_vec);
+	return VecLength(unit_vec);
+}
+
+float Mat4ToScalef(float mat[][4])
+{
+	float tmat[3][3];
+	Mat3CpyMat4(tmat, mat);
+	return Mat3ToScalef(tmat);
+}
+
+
 /* ************* SPECIALS ******************* */
 
 void triatoquat( float *v1,  float *v2,  float *v3, float *quat)

Modified: branches/2-44-stable/blender/source/blender/python/api2_2x/Pose.c
===================================================================
--- branches/2-44-stable/blender/source/blender/python/api2_2x/Pose.c	2007-09-06 03:18:07 UTC (rev 11947)
+++ branches/2-44-stable/blender/source/blender/python/api2_2x/Pose.c	2007-09-06 06:25:31 UTC (rev 11948)
@@ -57,6 +57,8 @@
 
 #include "DNA_armature_types.h" /*used for pose bone select*/
 
+#include "MEM_guardedalloc.h"
+
 extern void chan_calc_mat(bPoseChannel *chan);
 
 //------------------------ERROR CODES---------------------------------
@@ -143,11 +145,14 @@
 //This is the string representation of the object
 static PyObject *PoseBonesDict_repr(BPy_PoseBonesDict *self)
 {
-	char buffer[128], str[4096];
+	char buffer[128], *str;
 	PyObject *key, *value;
 	int pos = 0;
-
-	BLI_strncpy(str,"",4096);
+	
+	/* probably a bit of overkill but better then crashing */
+	str = MEM_mallocN( 64 + ( PyDict_Size( self->bonesMap ) * 128), "PoseBonesDict_repr" );
+	str[0] = '\0';
+	
 	sprintf(buffer, "[Pose Bone Dict: {");
 	strcat(str,buffer);
 	while (PyDict_Next(self->bonesMap, &pos, &key, &value)) {
@@ -157,6 +162,9 @@
 	}
 	sprintf(buffer, "}]\n");
 	strcat(str,buffer);
+	
+	MEM_freeN( str );
+	
 	return PyString_FromString(str);
 }
 

Modified: branches/2-44-stable/blender/source/blender/python/api2_2x/gen_library.c
===================================================================
--- branches/2-44-stable/blender/source/blender/python/api2_2x/gen_library.c	2007-09-06 03:18:07 UTC (rev 11947)
+++ branches/2-44-stable/blender/source/blender/python/api2_2x/gen_library.c	2007-09-06 06:25:31 UTC (rev 11948)
@@ -325,7 +325,6 @@
 	Py_RETURN_NONE;
 }
 
-/* return a unique tuple for this libdata*/
 long GenericLib_hash(BPy_GenericLib * pydata)
 {
 	return (long)pydata->id;

Modified: branches/2-44-stable/blender/source/blender/src/editarmature.c
===================================================================

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list