diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Winamp/plush/MATH.C | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/Winamp/plush/MATH.C')
-rw-r--r-- | Src/Winamp/plush/MATH.C | 67 |
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; +} + |