aboutsummaryrefslogtreecommitdiff
path: root/Src/Winamp/plush/MATH.C
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Winamp/plush/MATH.C
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Winamp/plush/MATH.C')
-rw-r--r--Src/Winamp/plush/MATH.C67
1 files changed, 67 insertions, 0 deletions
diff --git a/Src/Winamp/plush/MATH.C b/Src/Winamp/plush/MATH.C
new file mode 100644
index 00000000..ef66ca89
--- /dev/null
+++ b/Src/Winamp/plush/MATH.C
@@ -0,0 +1,67 @@
+/******************************************************************************
+Plush Version 1.2
+math.c
+Math and Matrix Control
+Copyright (c) 1996-2000, Justin Frankel
+******************************************************************************/
+
+#include "plush.h"
+
+void plMatrixRotate(pl_Float matrix[], pl_uChar m, pl_Float Deg) {
+ pl_uChar m1, m2;
+ double c,s;
+ double d= Deg * PL_PI / 180.0;
+ memset(matrix,0,sizeof(pl_Float)*16);
+ matrix[((m-1)<<2)+m-1] = matrix[15] = 1.0;
+ m1 = (m % 3);
+ m2 = ((m1+1) % 3);
+ c = cos(d); s = sin(d);
+ matrix[(m1<<2)+m1]=(pl_Float)c; matrix[(m1<<2)+m2]=(pl_Float)s;
+ matrix[(m2<<2)+m2]=(pl_Float)c; matrix[(m2<<2)+m1]=(pl_Float)-s;
+}
+
+void plMatrixTranslate(pl_Float m[], pl_Float x, pl_Float y, pl_Float z) {
+ memset(m,0,sizeof(pl_Float)*16);
+ m[0] = m[4+1] = m[8+2] = m[12+3] = 1.0;
+ m[0+3] = x; m[4+3] = y; m[8+3] = z;
+}
+
+void plMatrixMultiply(pl_Float *dest, pl_Float src[]) {
+ pl_Float temp[16];
+ pl_uInt i;
+ memcpy(temp,dest,sizeof(pl_Float)*16);
+ for (i = 0; i < 16; i += 4) {
+ *dest++ = src[i+0]*temp[(0<<2)+0]+src[i+1]*temp[(1<<2)+0]+
+ src[i+2]*temp[(2<<2)+0]+src[i+3]*temp[(3<<2)+0];
+ *dest++ = src[i+0]*temp[(0<<2)+1]+src[i+1]*temp[(1<<2)+1]+
+ src[i+2]*temp[(2<<2)+1]+src[i+3]*temp[(3<<2)+1];
+ *dest++ = src[i+0]*temp[(0<<2)+2]+src[i+1]*temp[(1<<2)+2]+
+ src[i+2]*temp[(2<<2)+2]+src[i+3]*temp[(3<<2)+2];
+ *dest++ = src[i+0]*temp[(0<<2)+3]+src[i+1]*temp[(1<<2)+3]+
+ src[i+2]*temp[(2<<2)+3]+src[i+3]*temp[(3<<2)+3];
+ }
+}
+
+void plMatrixApply(pl_Float *m, pl_Float x, pl_Float y, pl_Float z,
+ pl_Float *outx, pl_Float *outy, pl_Float *outz) {
+ *outx = x*m[0] + y*m[1] + z*m[2] + m[3];
+ *outy = x*m[4] + y*m[5] + z*m[6] + m[7];
+ *outz = x*m[8] + y*m[9] + z*m[10] + m[11];
+}
+
+pl_Float plDotProduct(pl_Float x1, pl_Float y1, pl_Float z1,
+ pl_Float x2, pl_Float y2, pl_Float z2) {
+ return ((x1*x2)+(y1*y2)+(z1*z2));
+}
+
+void plNormalizeVector(pl_Float *x, pl_Float *y, pl_Float *z) {
+ double length;
+ length = (*x)*(*x)+(*y)*(*y)+(*z)*(*z);
+ if (length > 0.0000000001) {
+ pl_Float t = (pl_Float)sqrt(length);
+ *x /= t;
+ *y /= t;
+ *z /= t;
+ } else *x = *y = *z = 0.0;
+}
+