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/Plugins/Visualization/vis_nsfs/scope.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/Plugins/Visualization/vis_nsfs/scope.cpp')
-rw-r--r-- | Src/Plugins/Visualization/vis_nsfs/scope.cpp | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/Src/Plugins/Visualization/vis_nsfs/scope.cpp b/Src/Plugins/Visualization/vis_nsfs/scope.cpp new file mode 100644 index 00000000..ec1ede89 --- /dev/null +++ b/Src/Plugins/Visualization/vis_nsfs/scope.cpp @@ -0,0 +1,200 @@ +#include <windows.h> +#include <math.h> + +#define M_PI 3.14159265358979323846 +extern int (*warand)(void); +extern void line(unsigned char *fb, int X0, int Y0, int X1, int Y1, int w, int h); + +static double sc_curtime; +static unsigned int sc_starttime; + +static int __inline myftol(double d) +{ + int a; + __asm + { + fld d + fistp a + mov eax, a + } +} + +static void __doscope(int fx, int ipos, double i, double v, double &x, double &y, double &sc_tmp) +{ + double r,d; + switch (fx) + { + case 0: x=2.0*(i-0.5); y=v*0.5; return; + case 1: + x=cos(i*M_PI*3.0+sc_curtime)*(0.5+v*0.2); + y=sin(i*M_PI*6.0+sc_curtime)*(0.5+v*0.2); + return; + case 2: + r=i*M_PI*128+sc_curtime; + x=cos(r/(64.0+32.0*cos(sc_curtime*M_PI)))*0.4+sin(r)*0.05; + y=sin(r/(64.0+32.0*cos(sc_curtime*M_PI)))*0.4+cos(r)*0.05; + return; + case 3: + r=M_PI*cos(sc_curtime*0.5)*2; + x=cos(r)*0.3+cos(i*M_PI*2)*v*0.5; + y=sin(r)*0.3+sin(i*M_PI*2)*v*0.5; + return; + case 4: + r=M_PI*cos(sc_curtime*0.5)*2; + x=cos(r)*0.3+cos(i*M_PI*2)*(1.0+v)*0.23; + y=sin(r*1.5)*0.3+sin(i*M_PI*2)*(1.0+v)*0.23; + return; + case 5: + y=2.0*(i-0.5); + x=v*0.5 + 0.4*cos(sc_curtime); + return; + case 6: + d=i+v*0.2; + r=sc_curtime+i*3.14159*4; + x=cos(r)*d*0.6; + y=sin(r)*d*0.6; + return; + case 7: + x=(i-0.5)*2.0; + y=0.25-0.5*fabs(sin(i*M_PI*4 + sc_curtime)) + v*0.2; + return; + case 8: + r=i*3.14159*2; + d=sin(r*3)+v*0.5; + x=cos(sc_curtime+r)*d; + y=sin(sc_curtime-r)*d; + return; + case 9: + x=2.0*(i-0.5); + y=v*v*v*0.7; + return; + case 10: + x=cos(i*8)*0.9*sin(sc_curtime); + y=sin(i*8)*0.5*v; + return; + case 11: + d=i-0.9; + sc_tmp=sc_tmp+v*0.1; + x=cos(sc_tmp)*d+sin(sc_tmp)*v+0.3; + y=sin(sc_tmp)*d-cos(sc_tmp)*v; + return; + case 12: + r=i*8; + x=cos(r)*0.3+sin(r*(3+cos(sc_curtime*0.5+i*3.0)))*0.2; + y=sin(r)*0.3+cos(r*(2+2*cos(sc_curtime*0.5+i*3.0)))*0.2; + return; + case 13: + x=v*0.3+sin(i*4*3.14159)*cos(sc_curtime)*0.4; + y=2.0*(i-0.5); + return; + case 14: + if (!(ipos&3)) x=y=0; + else + { + x=v; + y=(ipos&8)?1.0:-1.0; + if (ipos & 4) + { + sc_tmp=y; + y=x; + x=sc_tmp; + } + } + return; + case 15: + x=(ipos&1)?-1:1; + y=(ipos&30)?0:v; + return; + case 16: + r=ipos * 3.14159 * (0.3); + x=(0.3+v*0.1)*cos(r); + y=(0.3+v*0.1)*sin(r); + return; + } +} + +//#define TEST_SCOPE 14 +#define NUM_SC 17 + +static unsigned int start; + +#define INTERVAL 5000 + +static int curfx[2]={0,NUM_SC},lastfx[2]={0,NUM_SC}, interval_l=INTERVAL; +static double fxblend, lastfxblend; +void drawscope(unsigned char *out, int w, int h, unsigned char *visdata) +{ + double tmp1=0.0; + double tmp2=0.0; + double tmp3=0.0; + double tmp4=0.0; + int x; + int lx=0; + int ly=0; + double w2=w*65536.0/2.0; + double h2=h*65536.0/2.0; + if (!sc_starttime) sc_starttime=GetTickCount(); + sc_curtime=(GetTickCount()-sc_curtime)/1000.0; + + if (GetTickCount()>=start+INTERVAL) + { + lastfxblend=fxblend; + lastfx[0]=curfx[0]; + lastfx[1]=curfx[1]; + start=GetTickCount(); + curfx[0]=warand()%NUM_SC; + curfx[1]=warand()%NUM_SC; + interval_l=2500+(warand()&8191); + if (interval_l > INTERVAL) interval_l=INTERVAL; + + for (x = 0; x < 2; x ++) + if (curfx[x] == 14 || curfx[x] == 15) curfx[x]=warand()%NUM_SC; + fxblend=0.25+(warand()&511)/1023.0; +#ifdef TEST_SCOPE + curfx[0]=TEST_SCOPE; + lastfx[0]=curfx[0]; + curfx[1]=NUM_SC; + lastfx[1]=NUM_SC; + fxblend=lastfxblend=0.0; +#endif + } + double weight=(double)(GetTickCount()-start)*(1.0/(double)(interval_l)); + if (weight > 1.0) weight=1.0; + for (x = 0; x < 576; x ++) + { + int xp; + int yp; + double xof=0.0, yof=0.0; + double ix=x/576.0; + double iy=((visdata[x]^128)-128)/127.5; + + __doscope(curfx[0],x,ix,iy,xof,yof,tmp1); + { + double xof2=0.0,yof2=0.0; + __doscope(curfx[1],x,ix,iy,xof2,yof2,tmp3); + xof=xof*(1.0-fxblend) + xof2*fxblend; + yof=yof*(1.0-fxblend) + yof2*fxblend; + } + + { + double xof2=0.0, yof2=0.0; + __doscope(lastfx[0],x,ix,iy,xof2,yof2,tmp2); + { + double xof3=0.0,yof3=0.0; + __doscope(lastfx[1],x,ix,iy,xof3,yof3,tmp4); + xof2=xof2*(1.0-lastfxblend) + xof3*lastfxblend; + yof2=yof2*(1.0-lastfxblend) + yof3*lastfxblend; + } + xof=xof*weight + xof2*(1.0-weight); + yof=yof*weight + yof2*(1.0-weight); + } + + xp = myftol(xof * w2 + w2); + yp = myftol(yof * h2 + h2); + + if (x) line(out,lx,ly,xp,yp,w,h); + + lx=xp; + ly=yp; + } +}
\ No newline at end of file |