aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Visualization/vis_nsfs/scope.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Visualization/vis_nsfs/scope.cpp')
-rw-r--r--Src/Plugins/Visualization/vis_nsfs/scope.cpp200
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