merge with 2.5 at r20783
[blender-staging.git] / source / blender / blenlib / intern / arithb.c
index f111e94a141047c4f2f234f1b4f9813224649d24..0c7db0331e1c84fa2356c24bcf392bd6cf3c2a8a 100644 (file)
@@ -111,6 +111,26 @@ float Normalize(float *n)
        return d;
 }
 
+/*original function from shadeoutput.c*/
+double Normalize_d(double *n)
+{
+       double d;
+       
+       d= n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
+
+       if(d>0.00000000000000001) {
+               d= sqrt(d);
+
+               n[0]/=d; 
+               n[1]/=d; 
+               n[2]/=d;
+       } else {
+               n[0]=n[1]=n[2]= 0.0;
+               d= 0.0;
+       }
+       return d;
+}
+
 void Crossf(float *c, float *a, float *b)
 {
        c[0] = a[1] * b[2] - a[2] * b[1];
@@ -118,6 +138,13 @@ void Crossf(float *c, float *a, float *b)
        c[2] = a[0] * b[1] - a[1] * b[0];
 }
 
+void Crossd(double *c, double *a, double *b)
+{
+       c[0] = a[1] * b[2] - a[2] * b[1];
+       c[1] = a[2] * b[0] - a[0] * b[2];
+       c[2] = a[0] * b[1] - a[1] * b[0];
+}
+
 /* Inpf returns the dot product, also called the scalar product and inner product */
 float Inpf( float *v1, float *v2)
 {
@@ -845,7 +872,7 @@ void Mat4MulVec( float mat[][4], int *vec)
        vec[2]=(int)(x*mat[0][2] + y*mat[1][2] + mat[2][2]*vec[2] + mat[3][2]);
 }
 
-void Mat4MulVecfl( float mat[][4], float *vec)
+void Mat4MulVecfl(float mat[][4], float *vec)
 {
        float x,y;
 
@@ -1404,6 +1431,28 @@ void AxisAngleToQuat(float *q, float *axis, float angle)
        q[3] = nor[2] * si;     
 }
 
+void AxisAngleToQuatd(float *q, float *axis, double angle)
+{
+       double nor[3];
+       double si, l;
+       
+       nor[0] = axis[0];
+       nor[1] = axis[1];
+       nor[2] = axis[2];
+       
+       l = sqrt(nor[0]*nor[0] + nor[1]*nor[1] + nor[2]*nor[2]);
+       nor[0] /= l;
+       nor[1] /= l;
+       nor[2] /= l;
+
+       angle /= 2;
+       si = sin(angle);
+       q[0] = cos(angle);
+       q[1] = nor[0] * si;
+       q[2] = nor[1] * si;
+       q[3] = nor[2] * si;     
+}
+
 void vectoquat(float *vec, short axis, short upflag, float *q)
 {
        float q2[4], nor[3], *fp, mat[3][3], angle, si, co, x2, y2, z2, len1;