[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12654] trunk/blender/source/blender: Bugfix #7573

Ton Roosendaal ton at blender.org
Thu Nov 22 21:26:00 CET 2007


Revision: 12654
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12654
Author:   ton
Date:     2007-11-22 21:25:59 +0100 (Thu, 22 Nov 2007)

Log Message:
-----------
Bugfix #7573

NLA Window, Strip blending mode "Add" didn't work at all.
It was using very bad quaternion addition. Replaced with proper code.

For devs; new is the function QuatMulFac(quat, factor) which allows to
multiply a rotation with a value (make it rotate more or less)

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/action.c
    trunk/blender/source/blender/blenlib/BLI_arithb.h
    trunk/blender/source/blender/blenlib/intern/arithb.c
    trunk/blender/source/blender/src/drawipo.c

Modified: trunk/blender/source/blender/blenkernel/intern/action.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/action.c	2007-11-22 17:02:37 UTC (rev 12653)
+++ trunk/blender/source/blender/blenkernel/intern/action.c	2007-11-22 20:25:59 UTC (rev 12654)
@@ -607,8 +607,10 @@
 				QUATCOPY(squat, schan->quat);
 				if(mode==ACTSTRIPMODE_BLEND)
 					QuatInterpol(dchan->quat, dquat, squat, srcweight);
-				else
-					QuatAdd(dchan->quat, dquat, squat, srcweight);
+				else {
+					QuatMulFac(squat, srcweight);
+					QuatMul(dchan->quat, dquat, squat);
+				}
 				
 				NormalQuat (dchan->quat);
 			}

Modified: trunk/blender/source/blender/blenlib/BLI_arithb.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_arithb.h	2007-11-22 17:02:37 UTC (rev 12653)
+++ trunk/blender/source/blender/blenlib/BLI_arithb.h	2007-11-22 20:25:59 UTC (rev 12654)
@@ -119,6 +119,8 @@
 void QuatOne(float *);
 void QuatMul(float *, float *, float *);
 void QuatMulVecf(float *q, float *v);
+void QuatMulf(float *q, float f);
+void QuatMulFac(float *q, float fac);
 
 void NormalQuat(float *);
 void VecRotToQuat(float *vec, float phi, float *quat);
@@ -126,7 +128,6 @@
 void QuatSub(float *q, float *q1, float *q2);
 void QuatConj(float *q);
 void QuatInv(float *q);
-void QuatMulf(float *q, float f);
 float QuatDot(float *q1, float *q2);
 void QuatCopy(float *q1, float *q2);
 

Modified: trunk/blender/source/blender/blenlib/intern/arithb.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/arithb.c	2007-11-22 17:02:37 UTC (rev 12653)
+++ trunk/blender/source/blender/blenlib/intern/arithb.c	2007-11-22 20:25:59 UTC (rev 12654)
@@ -1109,6 +1109,7 @@
 	QuatMulf(q, 1.0f/f);
 }
 
+/* simple mult */
 void QuatMulf(float *q, float f)
 {
 	q[0] *= f;
@@ -1124,6 +1125,20 @@
 	q2[0]= -q2[0];
 }
 
+/* angular mult factor */
+void QuatMulFac(float *q, float fac)
+{
+	float angle= fac*saacos(q[0]);	/* quat[0]= cos(0.5*angle), but now the 0.5 and 2.0 rule out */
+	
+	float co= (float)cos(angle);
+	float si= (float)sin(angle);
+	q[0]= co;
+	Normalize(q+1);
+	q[1]*= si;
+	q[2]*= si;
+	q[3]*= si;
+	
+}
 
 void QuatToMat3( float *q, float m[][3])
 {

Modified: trunk/blender/source/blender/src/drawipo.c
===================================================================
--- trunk/blender/source/blender/src/drawipo.c	2007-11-22 17:02:37 UTC (rev 12653)
+++ trunk/blender/source/blender/src/drawipo.c	2007-11-22 20:25:59 UTC (rev 12654)
@@ -2014,7 +2014,7 @@
 	return (string);
 }
 
-static char *ipodriver_channelselect_pup(void)
+static char *ipodriver_channelselect_pup(int is_armature)
 {
 	static char string[1024];
 	char *tmp;
@@ -2031,7 +2031,8 @@
 	tmp+= sprintf(tmp, "|Scale X %%x%d", OB_SIZE_X);
 	tmp+= sprintf(tmp, "|Scale Y %%x%d", OB_SIZE_Y);
 	tmp+= sprintf(tmp, "|Scale Z %%x%d", OB_SIZE_Z);
-	tmp+= sprintf(tmp, "|Rotation Differance %%x%d", OB_ROT_DIFF);
+	if(is_armature)
+		tmp+= sprintf(tmp, "|Rotation Differance %%x%d", OB_ROT_DIFF);
 	
 	return (string);
 }
@@ -2094,7 +2095,8 @@
 									  ipodriver_modeselect_pup(driver->ob), 165,240,145,20, &(driver->blocktype), 0, 0, 0, 0, "Driver type");
 
 					uiDefButS(block, MENU, B_IPO_REDR, 
-								ipodriver_channelselect_pup(),			165,220,145,20, &(driver->adrcode), 0, 0, 0, 0, "Driver channel");
+								ipodriver_channelselect_pup(driver->ob->type==OB_ARMATURE && driver->blocktype==ID_AR),			
+														165,220,145,20, &(driver->adrcode), 0, 0, 0, 0, "Driver channel");
 				}
 				uiBlockEndAlign(block);
 			}





More information about the Bf-blender-cvs mailing list