From 7b5a7a7af9ca7b32cd9f3ca27a0965550ca89254 Mon Sep 17 00:00:00 2001
From: "matthias.ringwald"
 <matthias.ringwald@1a0a8af8-31b5-11de-8e0c-53a27eea117e>
Date: Sun, 13 Jun 2010 21:50:49 +0000
Subject: [PATCH] reordered and fixed compile errors

---
 example/WiiMoteOpenGLDemo/rotation.c | 89 +++++++++++++---------------
 1 file changed, 42 insertions(+), 47 deletions(-)

diff --git a/example/WiiMoteOpenGLDemo/rotation.c b/example/WiiMoteOpenGLDemo/rotation.c
index d664053f5..f2108dfec 100644
--- a/example/WiiMoteOpenGLDemo/rotation.c
+++ b/example/WiiMoteOpenGLDemo/rotation.c
@@ -128,49 +128,6 @@ void getRotationMatrixFromQuartenion(float q[4], float m[4][4]){
 }
 
 
-void getRotationMatrixFromVectors(float vin[3], float vout[3], float matrix[4][4]){
-    normalizeVector(vout,3);
-    
-    float q[4] = {0,0,0,0};
-    
-    float vin_length = 0;
-    float vout_length = 0;
-    float dotprod = 0;
-    
-    int i;
-    for (i=0; i<3; i++){
-        vin_length += vin[i]*vin[i];
-        vout_length+= vout[i]*vout[i];
-        dotprod += vin[i]*vout[i];
-    }
-
-#if 1 //mila
-    q[0] = sqrt(vin_length * vout_length) + dotprod;
-    q[1] = -1*(vin[1]*vout[2] - vin[2]*vout[1]);
-    q[2] = -1*(vin[2]*vout[0] - vin[0]*vout[2]);
-    q[3] = -1*(vin[0]*vout[1] - vin[1]*vout[0]);
-#else    
-    float axis[3] = {0,0,0};
-    axis[0] = -1*(vin[1]*vout[2] - vin[2]*vout[1]);
-    axis[1] = -1*(vin[2]*vout[0] - vin[0]*vout[2]);
-    axis[2] = -1*(vin[0]*vout[1] - vin[1]*vout[0]);
-    normalizeVector(axis,3);
-    
-    float angle = acos(vin[0]*vout[0]+vin[1]*vout[1]+vin[2]*vout[2]);
-    quaternionFromAxis(angle, axis, q);
-#endif    
-
-
-    float v0[4] = {0, vin[0], vin[1], vin[2]};
-    float v1[4] = {0, vout[0], vout[1], vout[2]};
-	slerp(v0, v1, 0.5, q);
-	
-
-	normalizeVector(q,4);
-    getRotationMatrixFromQuartenion(q,matrix);
-
-}
-
 float getRotationAngle(float matrix[4][4]){
     return acos( (matrix[0][0]+matrix[1][1]+matrix[2][2]-1) * 0.5);
 }
@@ -191,10 +148,10 @@ void slerp(float v0[4], float v1[4], double t, float result[4]) {
         // If the inputs are too close for comfort, linearly interpolate
         // and normalize the result.
         for (i=0; i<4; i++){
-            result[i] = v0[i] + t*(v1[i] � v0[i]);
+            result[i] = v0[i] + t*(v1[i] - v0[i]);
         }
         normalizeVector(result,4);
-        return result;
+        return;
     }
 
     if (dot<-1) dot = -1;
@@ -204,14 +161,52 @@ void slerp(float v0[4], float v1[4], double t, float result[4]) {
     
     float v2[4] = {0,0,0,0};
     for (i=0; i<4; i++){
-        v2[i] = v1[i] � v0[i]*dot;
+        v2[i] = v1[i] - v0[i]*dot;
     }
     normalizeVector(v2,4);             // { v0, v2 } is now an orthonormal basis
 
     for (i=0; i<4; i++){
         result[i] = v0[i]*cos(theta) + v2[i]*sin(theta);
     }
-    return result;
+    return;
+}
+
+
+
+void getRotationMatrixFromVectors(float vin[3], float vout[3], float matrix[4][4]){
+    normalizeVector(vout,3);
+    
+    float q[4] = {0,0,0,0};
+    
+    float vin_length = 0;
+    float vout_length = 0;
+    float dotprod = 0;
+    
+    int i;
+    for (i=0; i<3; i++){
+        vin_length += vin[i]*vin[i];
+        vout_length+= vout[i]*vout[i];
+        dotprod += vin[i]*vout[i];
+    }
+	
+#if 1 //mila
+    q[0] = sqrt(vin_length * vout_length) + dotprod;
+    q[1] = -1*(vin[1]*vout[2] - vin[2]*vout[1]);
+    q[2] = -1*(vin[2]*vout[0] - vin[0]*vout[2]);
+    q[3] = -1*(vin[0]*vout[1] - vin[1]*vout[0]);
+#else    
+    float axis[3] = {0,0,0};
+    axis[0] = -1*(vin[1]*vout[2] - vin[2]*vout[1]);
+    axis[1] = -1*(vin[2]*vout[0] - vin[0]*vout[2]);
+    axis[2] = -1*(vin[0]*vout[1] - vin[1]*vout[0]);
+    normalizeVector(axis,3);
+    
+    float angle = acos(vin[0]*vout[0]+vin[1]*vout[1]+vin[2]*vout[2]);
+    quaternionFromAxis(angle, axis, q);
+#endif    
+		
+	normalizeVector(q,4);
+    getRotationMatrixFromQuartenion(q,matrix);
 }
 
 #if 0