From 0f862dad1e3fdb70b06b87cf5450ccde5037c467 Mon Sep 17 00:00:00 2001 From: Ryan Messner Date: Thu, 24 Feb 2011 18:41:57 -0500 Subject: [PATCH] first commit --- Debug/bouncing_balls.dll | Bin 0 -> 184320 bytes DrawBeat.h | 28 + GLScene.cpp | 440 +++++++++++++ Headers.h | 24 + HelperFuncs.cpp | 17 + HelperFuncs.h | 13 + Liquid1.cpp | 212 ++++++ Liquid1.h | 45 ++ Liquidmanager.cpp | 203 ++++++ Liquidmanager.h | 97 +++ Release/bouncing_balls.exp | Bin 0 -> 617 bytes Release/bouncing_balls.lib | Bin 0 -> 1866 bytes SVIS.CPP | 1248 ++++++++++++++++++++++++++++++++++++ VIS.H | 51 ++ bouncing_balls.dsp | 121 ++++ bouncing_balls.dsw | 29 + bouncing_balls.ncb | Bin 0 -> 232448 bytes bouncing_balls.opt | Bin 0 -> 48640 bytes bouncing_balls.plg | 34 + bouncing_balls.sln | 21 + bouncing_balls.suo | Bin 0 -> 12288 bytes bouncing_balls.vcproj | 188 ++++++ declarations.h | 233 +++++++ particle.cpp | 174 +++++ particle.h | 43 ++ winampdetectbeat.h | 97 +++ 26 files changed, 3318 insertions(+) create mode 100755 Debug/bouncing_balls.dll create mode 100755 DrawBeat.h create mode 100755 GLScene.cpp create mode 100755 Headers.h create mode 100755 HelperFuncs.cpp create mode 100755 HelperFuncs.h create mode 100755 Liquid1.cpp create mode 100755 Liquid1.h create mode 100755 Liquidmanager.cpp create mode 100755 Liquidmanager.h create mode 100755 Release/bouncing_balls.exp create mode 100755 Release/bouncing_balls.lib create mode 100755 SVIS.CPP create mode 100755 VIS.H create mode 100755 bouncing_balls.dsp create mode 100755 bouncing_balls.dsw create mode 100755 bouncing_balls.ncb create mode 100755 bouncing_balls.opt create mode 100755 bouncing_balls.plg create mode 100755 bouncing_balls.sln create mode 100755 bouncing_balls.suo create mode 100755 bouncing_balls.vcproj create mode 100755 declarations.h create mode 100755 particle.cpp create mode 100755 particle.h create mode 100755 winampdetectbeat.h diff --git a/Debug/bouncing_balls.dll b/Debug/bouncing_balls.dll new file mode 100755 index 0000000000000000000000000000000000000000..fded5ed8766e9309c16ce9fdf51b6ec6ad74d466 GIT binary patch literal 184320 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
  • -zNYw~uj94V@CEN`gJFM8KtzbxpC9O(;WHhu?G6_5_m1%b_$IVAFe2UYOS?@bhN68PgYZ6u?H<>nYpVz3c(ZXC2r9&vP$w0bC^48!IVU+ytzo z)Pd*3L;FvFMSYJ?053m;&Px*C7u!i2?eY`S2Nrqm`Labvf)~2Q_vk?zk1RG$LvQGIJoV)|8A^Wi& zavbrGAC*gprjjTKrPfgEstr|NL{{4(ZbYjhR!V}@aJ9P{i#5mub+DSQW~(FB@#9Oz_k|9Ax>Pz)?uvkjqGhNc}V7`2e-SCA@!xOj!NqiGg5b{8LryBFsob_Xq zVH=KRCqw#fgycO9tIZoc$8+)IotUAG+&1nscOHI_13lMa^QIzZR|s9SlRwX2;T?i6 zEVK~#fmv89SPV)m5v~X~1z*t*k*P@d^&_DVi=c}RBR2IwTq>`TH_F@K1(e8#v07Dz z_1|*LDW!O0biNp0d#u&Sn9Xp=;Ak}-cu$3d9jWHSx+#F1U5Z%VM%Xwz5sf{pmcq`t zq?RMvNon4iL-W=AVABz6Hb4v4qP2J}0r<*-?9JDv18)lv|660P_w2;19fti~2EU?Q zy8}#;Sg0?s*&cSd3@(djD%S8Z zo11OTjwWyFW(cS-7XEQEeB)erhm%2(g;>ij!dmu5LJI|+_IjKhj|X>#fIp}61(@N5 z{9>0qzK-9>Z^DchW6pQ;CHw)t1il~9w`8Ut2wq}c(MN2KbUv7ur;?PTV9Gi>JjhNT*9!*DD82+yPZkk{8yA>Pil*6!}Wcu~yU;7GFnj2#-jn zE(IW35H3Yx%_vri$Es0+l#F$wbSVq*u#wVOtQ}2;$GKQq3ZHY0v<|VcO;{x@mUc=9 vq=oWg!hBV~DhyO%pb7(37^uQP6$Yv>P=$di3{+vD3IkObsKUU100#aSFfPHy literal 0 HcmV?d00001 diff --git a/DrawBeat.h b/DrawBeat.h new file mode 100755 index 0000000..5207184 --- /dev/null +++ b/DrawBeat.h @@ -0,0 +1,28 @@ +int DrawBeat(struct winampVisModule *this_mod, float beat_help,GLuint base,int choice, + GLuint texture[6],char * title,float title_transformation) +{ + + glLoadIdentity(); + glPushMatrix(); + glDisable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glDisable(GL_TEXTURE_2D); + int decimal, sign; + char *beat_text; + double source = double(beat_help); + beat_text = _fcvt( source, 0, &decimal, &sign ); + glDisable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glPushMatrix(); + glTranslatef(-40.0f,20.0f,0.0f); + glColor4ub(255,255,255,200); + glTranslatef(20.0f,0.0f,-60.0f); + glPrint(beat_text,base); + glPopMatrix(); + glPopMatrix(); + glEnable(GL_DEPTH_TEST); + glDisable(GL_BLEND); + glEnable(GL_TEXTURE_2D); + return TRUE; +} + diff --git a/GLScene.cpp b/GLScene.cpp new file mode 100755 index 0000000..8ad03ce --- /dev/null +++ b/GLScene.cpp @@ -0,0 +1,440 @@ +#include "declarations.h" + +void myinit(void) +{ + /*Initialize and compute the vectors for the spiral*/ + spir[0][0]=0.0; + spir[0][1]=-1.0; + spir[1][0]=-sin(30.0*M_PI/180); + spir[1][1]=-cos(30.0*M_PI/180); + spir[2][0]=-cos(30.0*M_PI/180); + spir[2][1]=-sin(30.0*M_PI/180); + spir[3][0]=-1.0; + spir[3][1]=0.0; + spir[4][0]=-cos(30.0*M_PI/180); + spir[4][1]=sin(30.0*M_PI/180); + spir[5][0]=-sin(30.0*M_PI/180); + spir[5][1]=cos(30.0*M_PI/180); + spir[6][0]=0.0; + spir[6][1]=1.0; + spir[7][0]=sin(30.0*M_PI/180); + spir[7][1]=cos(30.0*M_PI/180); + spir[8][0]=cos(30.0*M_PI/180); + spir[8][1]=sin(30.0*M_PI/180); + spir[9][0]=1.0; + spir[9][1]=0; + spir[10][0]=cos(30.0*M_PI/180); + spir[10][1]=-sin(30.0*M_PI/180); + spir[11][0]=sin(30.0*M_PI/180); + spir[11][1]=-cos(30.0*M_PI/180); + +/*create all needed spheres and initialize them with default values*/ + initializeSpheres(); + +/*Initialize the random number creator*/ + time_t t; + time(&t); + srand((unsigned int)t); //initialize with date and time + +/* attributes */ + + glClearColor(0.0, 0.0, 0.0, 1.0); /* black background */ + +/* Lighting */ + glLoadIdentity(); + + GLfloat light_ambient[] = {0.0,0.0,0.0,1.0}; + GLfloat light_diffuse[] = {1.0,1.0,1.0,1.0}; + //GLfloat light_specular[] = {1.0,1.0,1.0,1.0}; + GLfloat lmodel_ambient[] = {0.5,0.5,0.5,1.0}; + GLfloat mat_amb_diff[] = { 0.5, 0.5, 0.5, 1.0 }; + //GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; + //GLfloat mat_shininess[] = { 40.0 }; + + GLfloat light_position0[] = {1.0, 1.0, 0.0, 0.0 }; + + glShadeModel (GL_SMOOTH); + + glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); + //glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); + glLightfv(GL_LIGHT0, GL_POSITION, light_position0); + + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); + + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_amb_diff); + //glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); + //glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); + + //Enable Lighting + glEnable(GL_COLOR_MATERIAL); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); +} + +void displayScene (struct winampVisModule *this_mod) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /*clear the window*/ + + /*Draw circle surface*/ + if(SURFACE) { + + glColor3d(0.86,0.86,0.86); + + glBegin(GL_POLYGON); + double rad=groundRad; + double steps=1; + for(double x=rad; x>=-rad; x-=steps) { + double z=sqrt(((double)rad*(double)rad)-((double)x*(double)x)); + glVertex3d(x,0.0,z); + } + for(x=-rad; x<=rad; x+=steps) { + double z=sqrt(((double)rad*(double)rad)-((double)x*(double)x)); + glVertex3d(x,0.0,-z); + } + glEnd(); + + } + + /*Draw spheres and belonging cones to bump them*/ + for(int o=0; o>>>> + //Sound input goes here for sphere with size sphere[i].r + //Input ranges from 0-MAXSTRENGTH, so now from 0-100 + + //change everything in the function to return an input the value + //the function delivers you the index of the sphere which is i out of NUMSPHERE Spheres, so try to + //keep it dynamic by base your return value on i and on NUMSPHERE, so if NUMSPHERE changes during + //execution of the program your function is possible to always return values for each sphere + double input=computeSoundInput(i); + + //this function bumps the ball up and is called each time, it actually just bumps the ball up, + //when it is on the ground and so just disregard the input if not. + bump(&sphere[i], input); +//-------->>>>> + + //Draw the sphere + glColor3fv(sphere[i].color); + glTranslatef(sphere[i].x,sphere[i].r+sphere[i].height,sphere[i].z); + glutSolidSphere(sphere[i].r, + 20.0+(int)((1-NUMSPHERES/MAXSPHERES)*(sphere[i].r/10)), + 50.0+(int)((1-NUMSPHERES/MAXSPHERES)*(sphere[i].r))); + + glPopMatrix(); //restore the origin + } + +/*Text output*/ + setOrthographicProjection(); //switch to orthographic projection to easier print out text + glPushMatrix(); + glLoadIdentity(); + + //Data ouput of current settings + if(OUTPUT) { + char temp[50]; + glColor3f(1.0,1.0,1.0); + + //Number of Balls + sprintf(temp," Balls: %.d", NUMSPHERES); + printOut(10,10,temp); + //Airtime + sprintf(temp," max. Airtime: %.1f", NUMSEC); + printOut(10,25,temp); + //Speedfactor + sprintf(temp," Speedfactor: %.1f", SPEEDFACTOR); + printOut(10,40,temp); + //Cones on/off? + sprintf(temp," Cones: %s", (CONES)?"on":"off"); + printOut(10,55,temp); + //Surface on/off? + sprintf(temp," Surface: %s", (SURFACE)?"on":"off"); + printOut(10,70,temp); + //Bouncing balls? + sprintf(temp,"Bouncing Balls: %s", (BOUNCE)?"on":"off"); + printOut(10,85,temp); + //Color change? + sprintf(temp," Change color: %s", (COLORCHANGE)?"on":"off"); + printOut(10,100,temp); + //Index color of balls + printOut(10,115," Start color: "); + char * color; + if(COLOR==0) color="white"; + if(COLOR==1) {color="red"; glColor3f(1.0,0.0,0.0);} + if(COLOR==2) {color="green"; glColor3f(0.0,1.0,0.0);} + if(COLOR==3) {color="blue"; glColor3f(0.0,0.0,1.0);} + if(COLOR==4) {color="yellow"; glColor3f(1.0,1.0,0.0);} + if(COLOR==5) {color="magenta"; glColor3f(1.0,0.0,1.0);} + if(COLOR==6) {color="cyan"; glColor3f(0.0,1.0,1.0);} + sprintf(temp,"%s", color); + printOut(138,115,temp); + + //help message + if(!HELP) { + glColor3f(1.0,1.0,0.0); + printOut(width-20*8,10,"Press \'h\' for help!"); + } + } + + //help instructions + if(HELP) { + glColor3f(1.0,1.0,0.0); + int x=200; + int y=0; + + printOut(x,y+10," h = switch help on/off"); + printOut(x,y+25," o = switch output of the current settings on/off"); + + printOut(x,y+55,"-/+ = decrease/increase number of balls"); + printOut(x,y+70,"u/i = decrease/increase the maximum airtime of the balls"); + printOut(x,y+85,"j/k = decrease/increase the speed factor of the balls"); + printOut(x,y+100,"n/m = decrease/increase the start color of the balls"); + printOut(x,y+130," c = display cones?"); + printOut(x,y+145," s = display white circle surface?"); + printOut(x,y+160," b = allow balls to bounce on the ground?"); + printOut(x,y+175," l = allow balls to change color?"); + + printOut(x,y+205," r = reset all settings to default value"); + + printOut(x,y+235,"written by Ryan Messner and Simon Beisel"); + } + + glPopMatrix(); + resetPerspectiveProjection(); //reset to old view + + glFlush(); /* clear buffers */ + //glutSwapBuffers(); /*swap the buffers*/ +} + +void initializeSpheres() { + groundRad=0; + int i; + for(i=0; i0.0)||!(sphere[i].color[1]>0.0)||!(sphere[i].color[2]>0.0)) { + changeColor(&sphere[i], COLOR); + } + sphere[i].up=true; + sphere[i].firstUp=false; + sphere[i].inAir=false; + sphere[i].SEC=0; + sphere[i].height=0; + if (i==NUMSPHERES-1) { + groundRad=sqrt((double)((sphere[i].x)*(sphere[i].x))+(double)((sphere[i].z)*(sphere[i].z)))+(double)(i*1.2); + } + doSort(i,sphere[i].z); + } + + //to always have the same view on the scene independend of how big the circle surface is + //and how many spheres are on it I compute the coordinates for y and z dynamically + double distance=(double)(groundRad*1.02)/(double)(sin((alpha/2)*(M_PI/180))); + double yz=sqrt((distance*distance)/2); + + //The view is along and on the z axis to the origin + glLoadIdentity(); + gluLookAt(0.0, yz, yz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); +} + +//-------->>>>> +//That is your function, implement everything here and return a double value for the +//strength of the tune in the specific frequency range for sphere i +double computeSoundInput(int i) { + //at the moment it is just a random number + return (double)((rand() % 101)+0); +} +//-------->>>>> + +//is used to print out several text at the position x,y +void printOut(int x, int y, char * text) { + glRasterPos2i(x,y); + int length=strlen(text); + for (int i = 0; i < length; i++) + { + glutBitmapCharacter(GLUT_BITMAP_8_BY_13, text[i]); + } +} + +//Most important function of the whole program, it gets a strength variable as an input and based +//on it bumps a ball in the air if it is laying still on the ground and is not bouncing or in the air +void bump(struct SPHERE *sp, double strength) { + + //if ball not in Air compute it current new airtime SEC based on the strength value + if(!sp->inAir&&strength>0) { + startTimer(sp); //start the timer + //this is the main calculation, SEC is always higher for smaller balls than for + //bigger balls with the same strength input, that is what the second term of the + //function is for, the last term is the max air time and is calculated in + sp->SEC=strength/MAXSTRENGTH*(1-(sp->r/(NUMSPHERES*2)))*NUMSEC; + + //change color of the ball slightly + if(COLORCHANGE) { + int choice=(int) (rand() % 3); + int plusminus=(int) (rand() % 2); + float change=((float)(rand() % 10)+5)/100.0; + if (plusminus==1) change=-change; + sp->color[choice]+=(sp->color[choice]+change<1.0&&sp->color[choice]+change>0.0)?change:-change; + } + + sp->firstUp=true; + sp->inAir=true; + } + + //stop the timer and compute seconds till the start of the timer + stopTimer(sp); + double seconds=timerSeconds(sp); + + //compute the speed based on the speedfactor and the number of spheres + double speed=NUMSPHERES*SPEEDFACTOR; + + //let the ball fly up and down + if(sp->SEC>0.05) + { + if(!BOUNCE) sp->inAir=true; + + //up-direction + if(sp->up==true) { + double max=4.905*sp->SEC*sp->SEC; + sp->height=(max-4.905*(sp->SEC-seconds)*(sp->SEC-seconds))*speed; + } + //down-direction + else { + double max=4.905*sp->SEC*sp->SEC; + sp->height=(max-4.905*seconds*seconds)*speed; + } + + //if ball reaches the floor or is at the top of its flight turn the direction and + //probably decrease the height for let the ball bounce + if(seconds>sp->SEC) { + sp->up=(sp->up==true)?false:true; + startTimer(sp); + if(sp->SEC>0&&sp->up==true) { + sp->firstUp=false; + sp->SEC-=(sp->SEC*4/9); + + if(!BOUNCE) sp->inAir=false; + } + + } + } + //finished with bouncing or at the ground again and accepting input again + else { + sp->inAir=false; + } +} + +/*function to change color of one sphere*/ +void changeColor(struct SPHERE *sp, int c) { + double red=0.0; + double green=0.0; + double blue=0.0; + + //0 = white + //1 = red + //2 = green + //3 = blue + //4 = yellow + //5 = magenta + //6 = cyan + if(c==1||c==4||c==5||c==0) red=1.0; //red + if(c==2||c==4||c==6||c==0) green=1.0; //green + if(c==3||c==5||c==6||c==0) blue=1.0; //blue + + sp->color[0]=red; //SET COLOR + sp->color[1]=green; + sp->color[2]=blue; +} + +/*Sort the z value from one sphere with index no, into an array*/ +void doSort(int no, double z) { + int place=0; + for(int i=0; iplace; i--) { + order[i][0]=order[i-1][0]; + order[i][1]=order[i-1][1]; + } + order[place][0]=no; + order[place][1]=z; +} + +/*switch to an orthographic projection which makes it easier to output text*/ +void setOrthographicProjection() { + + // switch to projection mode + glMatrixMode(GL_PROJECTION); + // save previous matrix which contains the + //settings for the perspective projection + glPushMatrix(); + // reset matrix + glLoadIdentity(); + // set a 2D orthographic projection + gluOrtho2D(0, width, 0, height); + // invert the y axis, down is positive + glScalef(1, -1, 1); + // mover the origin from the bottom left corner + // to the upper left corner + glTranslatef(0, -height, 0); + glMatrixMode(GL_MODELVIEW); +} + +/*switch back to the perspective projection and reset the matrix*/ +void resetPerspectiveProjection() { + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); +} + +/*start the timer for a sphere*/ +void startTimer(struct SPHERE *sp) { + ::QueryPerformanceCounter(&sp->startTime_); +} + +/*stop the timer for a sphere*/ +void stopTimer(struct SPHERE *sp) { + ::QueryPerformanceCounter(&sp->stopTime_); +} + +/*get the seconds between start and stop of the timer for a sphere*/ +double timerSeconds(struct SPHERE *sp) { + if (!::QueryPerformanceFrequency(&sp->frequency_)) + throw "Error with QueryPerformanceFrequency"; + return (double)(sp->stopTime_.QuadPart - sp->startTime_.QuadPart) / (double) sp->frequency_.QuadPart; +} diff --git a/Headers.h b/Headers.h new file mode 100755 index 0000000..163a202 --- /dev/null +++ b/Headers.h @@ -0,0 +1,24 @@ +#include // Header File For Windows +#include // Header File For The OLE Controls Library (BuildTexture) +//#include // Header File For The OpenGL32 Library +//#include // Header File For The GLu32 Library +#ifndef HEADERS_H +#define HEADERS_H + +//#include // Header File For The GLaux Library +#include +#include // Header File For Math +//#include // Header File For Variable Argument Routines +//#include +//#include "Glext.h" +//#include +#include +#include +#include +#pragma comment(lib, "opengl32.lib") +#pragma comment(lib, "glu32.lib") +#pragma comment(lib, "glaux.lib") +#pragma comment(lib, "glut32.lib") +//#pragma comment(lib, "jpeg.lib") + +#endif \ No newline at end of file diff --git a/HelperFuncs.cpp b/HelperFuncs.cpp new file mode 100755 index 0000000..20a3583 --- /dev/null +++ b/HelperFuncs.cpp @@ -0,0 +1,17 @@ +#include "HelperFuncs.h" + +bool bReadyToExit; + +void initHelperFuncs() +{ + srand(time(NULL)); + + bReadyToExit = false; +} + +void setExit() +{ + bReadyToExit = true; +} + + diff --git a/HelperFuncs.h b/HelperFuncs.h new file mode 100755 index 0000000..c3e81d4 --- /dev/null +++ b/HelperFuncs.h @@ -0,0 +1,13 @@ +#ifndef HELPERFUNCS_H +#define HELPERFUNCS_H + +#include "HEADERS.H" + +#define PI 3.14159 + +void initHelperFuncs(); + +void setExit(); + +#endif + diff --git a/Liquid1.cpp b/Liquid1.cpp new file mode 100755 index 0000000..f824c7e --- /dev/null +++ b/Liquid1.cpp @@ -0,0 +1,212 @@ +#include "headers.h" +#include "Misc.h" +#include "liquid1.h" + +scene1::scene1(double time,float wid,float hei):Manager(time) +{ + xrot = 0.0f; + t = 0.0f; + liquid_cube = new cube(); + direction = -1; + beat_responder = 0.0f; + bg = new background(); + timeeffect = 0; + multi_texture =0; + speedTexure = FALSE; + + glClientActiveTextureARB = NULL; + glActiveTextureARB = NULL; + + glActiveTextureARB = ( PFNGLCLIENTACTIVETEXTUREARBPROC ) wglGetProcAddress ( "glActiveTextureARB" ); + glClientActiveTextureARB = ( PFNGLACTIVETEXTUREARBPROC ) wglGetProcAddress ( "glClientActiveTextureARB" ); + t2 = 0.0f; + sceneTime = 0.0f; + lastTime = 0.0f; + width = wid; + height = hei; + fade_def = 0; + +} + +scene1::~scene1() +{ + if (liquid_cube) + delete liquid_cube; +} + + +void scene1::Draw(GLuint blend_colour,struct winampVisModule *this_mod) +{ + glDisable(GL_FOG); + glDisable(GL_LIGHT0); + glDisable(GL_LIGHT1); + glDisable(GL_COLOR_MATERIAL); + glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE); + glDisable(GL_LIGHT0); + glDisable(GL_LIGHTING); + glDisable ( GL_DEPTH_TEST ); + glBlendFunc(GL_SRC_ALPHA,GL_ONE); + + glEnable(GL_BLEND); + + for (int i=0;i<7;i++) + { + glPushMatrix(); + glTranslatef(0.0f,0.0f,-20.0f+(10-i)*(float)pow(beat_responder/50,2)); + glPushMatrix(); + liquid_cube->Update(20*i+blend_colour,beat_responder/10,timeeffect); + liquid_cube->Draw(1.0f-beat_responder/120.0f,0.1f,m_Texture,beat_responder*i/100.0f+0.1f,xrot); + glPopMatrix(); + glPopMatrix(); + } + +} + +void scene1::Update(float beat_help,struct winampVisModule *this_mod,float beat_scaler,bool Tex_on) +{ + glLoadIdentity (); + + speedTexure = Tex_on; + if (fade_def==0) + fadeffect+=0.1f; + if (fade_def==1) + fadeffect-=0.1f; + + timeeffect=(GetTickCount()-SceneStart)/1000; + beat_responder=beat_help*beat_scaler; + xrot+=direction*((beat_responder/30.0f)*(beat_responder/30.0f))+1.0f; + t+=(beat_responder/20.0f)*0.01f*(float)cos(timeeffect/300.0f*(beat_responder))*direction; + if (t>1.5*beat_responder/16) + direction=-1; + if (t<-1.5*beat_responder/16) + direction=1; + float currTime = GetTime(); + float deltaTime = currTime - lastTime; + lastTime = currTime; + float speed = 1; + sceneTime += deltaTime * speed; +} + +bool scene1::Init(loadall *textures) +{ + textures_in=textures; + liquid_cube->Init(); + glClientActiveTextureARB ( GL_TEXTURE0_ARB ); + glEnableClientState ( GL_TEXTURE_COORD_ARRAY ); + + glClientActiveTextureARB ( GL_TEXTURE1_ARB ); + glEnableClientState ( GL_TEXTURE_COORD_ARRAY ); + SceneStart = GetTickCount(); + fadeffect = 0; + + multi_texture=rand()%19; + + switch (multi_texture) + { + case 0: + m_Texture[0]=textures->Bind(22); + m_Texture[1]=textures->Bind(1); + break; + case 1: + m_Texture[0]=textures->Bind(1); + m_Texture[1]=textures->Bind(0); + break; + case 2: + m_Texture[0]=textures->Bind(0); + m_Texture[1]=textures->Bind(2); + break; + case 3: + m_Texture[0]=textures->Bind(1); + m_Texture[1]=textures->Bind(4); + break; + case 4: + m_Texture[0]=textures->Bind(3); + m_Texture[1]=textures->Bind(21); + break; + case 5: + m_Texture[0]=textures->Bind(21); + m_Texture[1]=textures->Bind(3); + break; + case 6: + m_Texture[0]=textures->Bind(10); + m_Texture[1]=textures->Bind(7); + break; + case 7: + m_Texture[0]=textures->Bind(11); + m_Texture[1]=textures->Bind(3); + break; + case 8: + m_Texture[0]=textures->Bind(13); + m_Texture[1]=textures->Bind(21); + break; + case 9: + m_Texture[0]=textures->Bind(12); + m_Texture[1]=textures->Bind(4); + break; + case 10: + m_Texture[0]=textures->Bind(14); + m_Texture[1]=textures->Bind(7); + break; + case 11: + m_Texture[0]=textures->Bind(15); + m_Texture[1]=textures->Bind(3); + break; + case 12: + m_Texture[0]=textures->Bind(16); + m_Texture[1]=textures->Bind(21); + break; + case 13: + m_Texture[0]=textures->Bind(17); + m_Texture[1]=textures->Bind(4); + break; + case 14: + m_Texture[0]=textures->Bind(18); + m_Texture[1]=textures->Bind(2); + break; + case 15: + m_Texture[0]=textures->Bind(19); + m_Texture[1]=textures->Bind(4); + break; + case 16: + m_Texture[0]=textures->Bind(20); + m_Texture[1]=textures->Bind(17); + break; + case 17: + m_Texture[0]=textures->Bind(21); + m_Texture[1]=textures->Bind(15); + break; + case 18: + m_Texture[0]=textures->Bind(1); + m_Texture[1]=textures->Bind(22); + break; + } + /*multi_texture=rand()%18; + if (multi_texture==19) + multi_texture=0;*/ + return true; +} + +float scene1::GetTime(void) +{ + static bool init = false; + static bool hires = false; + static __int64 freq = 1; + if(!init) + { + hires = !QueryPerformanceFrequency((LARGE_INTEGER *)&freq); + if(!hires) + freq = 1000; + init = true; + } + + __int64 now; + + if(hires) + QueryPerformanceCounter((LARGE_INTEGER *)&now); + else + now = GetTickCount(); + + return (float)((double)now / (double)freq); + +} + diff --git a/Liquid1.h b/Liquid1.h new file mode 100755 index 0000000..7a6074f --- /dev/null +++ b/Liquid1.h @@ -0,0 +1,45 @@ +#ifndef __LIQUID1_H_ +#define __LIQUID1_H_ + +#include "TextureLoader.h" +#include "Scenemanager.h" +#include "LoadAlltextures.h" +#include "cube.h" +#include "Background.h" +#include "vis.h" + +class scene1:public Manager +{ + + public: + scene1(double time,float wid,float hei); + ~scene1(); + virtual void Draw (GLuint blend_colour,struct winampVisModule *this_mod); + virtual void Update (float beat_help,struct winampVisModule *this_mod,float beat_scaler,bool Tex_on); + virtual bool Init (loadall *textures); + + private: + float GetTime(void); + + GLuint m_Texture[5]; + cube *liquid_cube; + int i,direction; + int scene_switcher; + float scalefactor; + float xrot,t,t2; + float beat_responder; + int multi_texture; + DWORD timeeffect,SceneStart; + background *bg; + float fadeffect; + PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB; + PFNGLACTIVETEXTUREARBPROC glActiveTextureARB; + loadall *textures_in; + bool speedTexure; + float lastTime,sceneTime; + Manager *liquid_next; + float width,height; + int fade_def; +}; + +#endif __LIQUID1_H_ diff --git a/Liquidmanager.cpp b/Liquidmanager.cpp new file mode 100755 index 0000000..336b8c0 --- /dev/null +++ b/Liquidmanager.cpp @@ -0,0 +1,203 @@ +#include "HelperFuncs.h" +#include "TextGeneration.h" +#include "MeshGeneration.h" +#include "Liquidmanager.h" +#include "LiquidTime.h" +#include "3ds.h" + +#define FILE_NAME "Liquid\\face.3ds" + + +liqTime *g_pFrameTime; +TextGeneration *Generated_textures; +MeshGeneration *Generated_Meshes; +CLoad3DS g_Load3ds; +t3DModel liquidmodel; + +Liquidmanager::Liquidmanager(int wid,int hei,struct winampVisModule *this_mod) +{ + Generated_textures = new TextGeneration(); + Generated_Meshes = new MeshGeneration(); + + char *ini_file=new char[70]; + char *help=new char[70]; + char *p; + GetModuleFileName(this_mod->hDllInstance,ini_file,MAX_PATH); + p=ini_file+strlen(ini_file); + while (p >= ini_file && *p != '\\') p--; + if (++p >= ini_file) + *p = 0; + strcpy(help,ini_file); + strcat(help,FILE_NAME); + + g_Load3ds.Import3DS(&liquidmodel, help); + + width = wid; + height = hei; + + textures = new loadall(this_mod); + + liquid1 = new scene1(40.0f,(float)width,(float)height); + /*liquid2 = new scene2(40.0f,4,(float)width,(float)height,0); + liquid3 = new scene3(40.0f,Generated_textures,(float)width,(float)height); + liquid6 = new scene6(40.0f,(float)width,(float)height); + liquid7 = new scene7(40.0f,(float)width,(float)height); + liquid8 = new scene8(40.0f,(float)width,(float)height); + liquid9 = new scene9(40.0f,(float)width,(float)height); + liquid10 = new scene10(40.0f,(float)width,(float)height); + liquid11 = new scene11(40.0f,(float)width,(float)height); + liquid12 = new scene12(40.0f,(float)width,(float)height); + liquid13 = new scene13(40.0f,Generated_textures,Generated_Meshes,(float)width,(float)height); + liquid14 = new scene14(40.0f,(float)width,(float)height); + liquid15 = new scene15(40.0f,(float)width,(float)height); + liquid16 = new scene16(40.0f,0,(float)width,(float)height); + liquid17 = new scene17(40.0f,(float)width,(float)height); + liquid18 = new scene18(40.0f,Generated_textures,Generated_Meshes,(float)width,(float)height); + liquid19 = new scene19(40.0f,Generated_textures,Generated_Meshes,(float)width,(float)height); + liquid20 = new scene20(40.0f,(float)width,(float)height); + liquid21 = new scene21(40.0f,(float)width,(float)height); + liquid22 = new scene22(40.0f,(float)width,(float)height); + liquid23 = new scene23(40.0f,(float)width,(float)height); + liquid24 = new scene24(40.0f,(float)width,(float)height); + liquid25 = new scene25(40.0f,Generated_textures,Generated_Meshes,(float)width,(float)height); + liquid26 = new scene26(40.0f,Generated_textures,Generated_Meshes,(float)width,(float)height); + liquid27 = new scene27(40.0f,Generated_textures,Generated_Meshes,(float)width,(float)height); + liquid28 = new scene28(40.0f,Generated_textures,Generated_Meshes,(float)width,(float)height); + liquid29 = new scene29(40.0f,Generated_textures,Generated_Meshes,(float)width,(float)height); + liquid30 = new scene30(40.0f,(float)width,(float)height); + liquid31 = new scene31(40.0f,Generated_textures,Generated_Meshes,&liquidmodel,(float)width,(float)height); + //liquid34 = new scene34(40.0f,(float)width,(float)height);*/ + g_pFrameTime = new liqTime(); + liquid1->Init(textures); + + lockscene = FALSE; +} + +void Liquidmanager::Init() +{ + initScenes(); +} + +void Liquidmanager::initScenes() +{ + liquid1->add_Next_Prev(liquid1,liquid1); + /*liquid2->add_Next_Prev(liquid3,liquid1); + liquid3->add_Next_Prev(liquid6,liquid2); + liquid6->add_Next_Prev(liquid7,liquid3); + liquid7->add_Next_Prev(liquid8,liquid6); + liquid8->add_Next_Prev(liquid9,liquid7); + liquid9->add_Next_Prev(liquid10,liquid8); + liquid10->add_Next_Prev(liquid11,liquid9); + liquid11->add_Next_Prev(liquid12,liquid10); + liquid12->add_Next_Prev(liquid13,liquid11); + liquid13->add_Next_Prev(liquid14,liquid12); + liquid14->add_Next_Prev(liquid15,liquid13); + liquid15->add_Next_Prev(liquid16,liquid14); + liquid16->add_Next_Prev(liquid17,liquid15); + liquid17->add_Next_Prev(liquid18,liquid16); + liquid18->add_Next_Prev(liquid19,liquid17); + liquid19->add_Next_Prev(liquid20,liquid18); + liquid20->add_Next_Prev(liquid21,liquid19); + liquid21->add_Next_Prev(liquid22,liquid20); + liquid22->add_Next_Prev(liquid23,liquid21); + liquid23->add_Next_Prev(liquid24,liquid22); + liquid24->add_Next_Prev(liquid25,liquid23); + liquid25->add_Next_Prev(liquid26,liquid24); + liquid26->add_Next_Prev(liquid27,liquid25); + liquid27->add_Next_Prev(liquid28,liquid26); + liquid28->add_Next_Prev(liquid29,liquid27); + liquid29->add_Next_Prev(liquid30,liquid28); + liquid30->add_Next_Prev(liquid31,liquid29); + liquid31->add_Next_Prev(liquid1,liquid30); + //liquid34->add_Next_Prev(liquid1,liquid31);*/ + + m_pCurrentScene = liquid1; + m_pCurrentScene->start(); +} + +void Liquidmanager::Update(float beat_help,struct winampVisModule *this_mod,float beat_scaler,bool Tex_on) +{ + g_pFrameTime->update(); + if(m_pCurrentScene != NULL) + { + if(m_pCurrentScene->isComplete()) + { + nextScene(); + } + + if(m_pCurrentScene != NULL) + m_pCurrentScene->Update(beat_help,this_mod,beat_scaler,Tex_on); + } +} + +void Liquidmanager::nextScene() +{ + if (lockscene==FALSE) + { + m_pCurrentScene = m_pCurrentScene->getNext(); + } + else + { + m_pCurrentScene = m_pCurrentScene; + } + + if(m_pCurrentScene == NULL) + setExit(); + else + { + m_pCurrentScene->Init(textures); + m_pCurrentScene->start(); + } +} + +void Liquidmanager::prevScene() +{ + if (lockscene==FALSE) + { + m_pCurrentScene = m_pCurrentScene->getPrev(); + } + else + { + m_pCurrentScene = m_pCurrentScene; + } + + if(m_pCurrentScene == NULL) + setExit(); + else + { + m_pCurrentScene->Init(textures); + m_pCurrentScene->start(); + } +} + +void Liquidmanager::holdScene() +{ + lockscene = !lockscene; +} + +void Liquidmanager::holdBeat(float beat_help) +{ +} + + +void Liquidmanager::Draw(GLuint blend_colour,struct winampVisModule *this_mod) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glEnable(GL_DEPTH_TEST); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + if(m_pCurrentScene != NULL) + m_pCurrentScene->Draw(blend_colour,this_mod); +} + +Liquidmanager::~Liquidmanager() +{ + if(liquid1) + delete liquid1; + //if(liquid2) + // delete liquid2; + //if(liquid3) + // delete liquid3; +} diff --git a/Liquidmanager.h b/Liquidmanager.h new file mode 100755 index 0000000..8afe5d7 --- /dev/null +++ b/Liquidmanager.h @@ -0,0 +1,97 @@ +#ifndef __LIQMANAGER_H +#define __LIQMANAGER_H + +#include "headers.h" +#include "Misc.h" +#include "Scenemanager.h" +#include "LoadAlltextures.h" +#include "Texture.h" +#include "Liquid1.h" +/*#include "Liquid2.h" +#include "Liquid3.h" +#include "Liquid6.h" +#include "Liquid7.h" +#include "Liquid8.h" +#include "Liquid9.h" +#include "Liquid10.h" +#include "Liquid11.h" +#include "Liquid12.h" +#include "Liquid13.h" +#include "Liquid14.h" +#include "Liquid15.h" +#include "Liquid16.h" +#include "Liquid17.h" +#include "Liquid18.h" +#include "Liquid19.h" +#include "Liquid20.h" +#include "Liquid21.h" +#include "Liquid22.h" +#include "Liquid23.h" +#include "Liquid24.h" +#include "Liquid25.h" +#include "Liquid26.h" +#include "Liquid27.h" +#include "Liquid28.h" +#include "Liquid29.h" +#include "Liquid30.h" +#include "Liquid31.h" +#include "Liquid34.h"*/ +#include "vis.h" + +class Liquidmanager +{ + public: + Liquidmanager(int wid,int hei,struct winampVisModule *this_mod); + ~Liquidmanager(); + + void Init(); + void Update(float beat_help,struct winampVisModule *this_mod,float beat_scaler,bool Tex_on); + void Draw(GLuint blend_colour,struct winampVisModule *this_mod); + void holdBeat(float beat_help); + loadall *textures; + void nextScene(); + void prevScene(); + void holdScene(); + void adveScene(bool status); + + protected: + bool lockscene; + void initScenes(); + Manager *m_pCurrentScene; + + int width,height; + + scene1 *liquid1; + /*scene2 *liquid2; + scene3 *liquid3; + scene6 *liquid6; + scene7 *liquid7; + scene8 *liquid8; + scene9 *liquid9; + scene10 *liquid10; + scene11 *liquid11; + scene12 *liquid12; + scene13 *liquid13; + scene14 *liquid14; + scene15 *liquid15; + scene16 *liquid16; + scene17 *liquid17; + scene18 *liquid18; + scene19 *liquid19; + scene20 *liquid20; + scene21 *liquid21; + scene22 *liquid22; + scene23 *liquid23; + scene24 *liquid24; + scene25 *liquid25; + scene26 *liquid26; + scene27 *liquid27; + scene28 *liquid28; + scene29 *liquid29; + scene30 *liquid30; + scene31 *liquid31; + scene34 *liquid34;*/ + Manager *liquid_next; +}; + +#endif __LIQMANAGER_H diff --git a/Release/bouncing_balls.exp b/Release/bouncing_balls.exp new file mode 100755 index 0000000000000000000000000000000000000000..7cec5efbd5fb31e163e358cf968d690d366f3157 GIT binary patch literal 617 zcmZuu%}&BV5FS9R8V*D+9ypNLLrqLY6Yu;+2&Irxj0cjQHV{L_IPUTS4ZTw!6-P)pG7G7i`8oFV-E;gSETle)!Rspn_PCtcrLbnTlAHOp{1?SIFq}imbbUW8?r8eQF6$@K{{`X)Ins4bI96Ceij} z3Y)J7 zB)TMpw<-e`G3ONL<&qyRB*;k8FG0Tidz|ydF)J&D8-dQO;-;u>Lzzx^-tBat6hyg2 z)n}kWSIgI^Fr@_aUr)9b30R>V5=nWt-8?(V9R(t=LCj|%gtLLncHVQHv6Iup(qm%2 z(f2b{Bxp9EUW9h#Pz|>GO`ou1y@Binm5+RQz#=4d4UaO*#PKOi%TSO?Kiv0P!~UrM zVVqs7zsQ=^+Fr1HV@#9GJNX1cyw7E5BxsN>CW|my{qBHVO{L%C>Pp z@Vz}18b3C^FCjD~wjl+sZS;wT_0M?-iBAXRU_vq)B>WF%XQFUU)M%w*1U0gcny=(z z;Cno3+(|$_7eURsSYkAM5kfdKYWUnmq2WHYeMhwndParent, + "Bouncing Balls Visualizer /n(c) 2004 Ryan Messner and Simon Biesel", + "Configuration",MB_OK); +} + +/* --------------------------------------------------------------------------------------------------------------------*/ +/* ----------------------------------------------------frame rate function---------------------------------------------*/ +/* --------------------------------------------------------------------------------------------------------------------*/ + +void CalculateFrameRate() +{ + static float framesPerSecond = 0.0f; + static float lastTime = 0.0f; + static char strFrameRate[50] = {0}; + float currentTime = GetTickCount() * 0.001f; + ++framesPerSecond; + if( currentTime - lastTime > 1.0f ) + { + lastTime = currentTime; + sprintf(strFrameRate, "FPS: %d -Bouncing Balls- Ryan Messner & Simon Beisel", int(framesPerSecond)); + SetWindowText(hMainWnd, strFrameRate); + framesPerSecond = 0; + } +} + +/* --------------------------------------------------------------------------------------------------------------------*/ +/* ----------------------------------------------------KillGL function-------------------------------------------------*/ +/* --------------------------------------------------------------------------------------------------------------------*/ + +GLvoid KillGLWindow(struct winampVisModule *this_mod) +{ + if (fullscreen) // Kontrolle auf Vollbildmodus + { + ChangeDisplaySettings(NULL,0); // Zurück zum Desktop + ShowCursor(TRUE); // Der abgeschaltete Mauszeiger wird wieder angezeigt + } + if (hRC) // Rendering Context (RC) vorhanden? + { + if (!wglMakeCurrent(NULL,NULL)) // Kann der DC und RC überhaupt gelöscht werden? + { + MessageBox( NULL,"Entfernen des DC und RC fehlgeschlagen.","Fehler", + MB_OK | MB_ICONINFORMATION); + } + + if (!wglDeleteContext(hRC)) // Kann der RC gelöscht werden? + { + MessageBox( NULL,"Entfernen des RC fehlgeschlagen.","Fehler...", + MB_OK | MB_ICONINFORMATION); + } + hRC=NULL; // Der RC wird NULL gesetzt, also entfernt + } +} +/* --------------------------------------------------------------------------------------------------------------------*/ +/* ----------------------------------------------------Resize function-------------------------------------------------*/ +/* --------------------------------------------------------------------------------------------------------------------*/ + +GLvoid ReSizeGLScene(GLsizei w, GLsizei h) +{ + width=w; + height=h; + + glViewport (0, 0, (GLsizei) w, (GLsizei) h); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(alpha,(GLfloat)w/(GLfloat)h, 0.0, 100.0); //perspective view + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + //to always have the same view on the scene independend of how big the circle surface is + //and how many spheres are on it I compute the coordinates for y and z dynamically + double distance=(double)(groundRad*1.02)/(double)(sin((alpha/2)*(M_PI/180))); + double yz=sqrt((distance*distance)/2); + + //The view is along and on the z axis to the origin + gluLookAt(0.0, yz, yz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); +} + +/* --------------------------------------------------------------------------------------------------------------------*/ +/* ----------------------------------------------------change resolution-----------------------------------------------*/ +/* --------------------------------------------------------------------------------------------------------------------*/ + +bool change_resolution(struct winampVisModule *this_mod) +{ + if (fullscreen) // Soll im Vollbildmodus gestartet werden + { + DWORD dwExStyle2; + DWORD dwStyle2; + DEVMODE dmScreenSettings; + memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // Diese wird geleert + dmScreenSettings.dmSize=sizeof(dmScreenSettings); // dmsize soll genauso groß wie die dmScreenSettings sein + dmScreenSettings.dmPelsWidth = width; + dmScreenSettings.dmPelsHeight = height; + dmScreenSettings.dmBitsPerPel = 32; + dmScreenSettings.dmFields=DM_BITSPERPEL| + DM_PELSWIDTH|DM_PELSHEIGHT; + RECT WindowRect2; // Speicher für aktuelle Auflösung + WindowRect2.left=(long)0; // Die linke Seite des Rechtecks wirtd auf 0 gesetzt + WindowRect2.right=(long)width; // Hier wird die gewünschte Breite des Fensters gespeichert + WindowRect2.top=(long)0; // Die obere Seite wird auch auf 0 gesetzt + WindowRect2.bottom=(long)height; // Und hier wird die Höhe abgelegt + dwExStyle2=WS_EX_APPWINDOW; // Fenstereigenschaften + dwStyle2=WS_POPUP; + ShowCursor(FALSE); + ChangeDisplaySettings(&dmScreenSettings,0); // Zurück zum Desktop + ReSizeGLScene(width, height); + AdjustWindowRectEx(&WindowRect2,dwStyle2,FALSE,dwExStyle2); + SetForegroundWindow(hMainWnd); + SetFocus(hMainWnd); + } + // Der Mauszeiger wird nicht angezeigt + + else + { + DWORD dwExStyle2; + DWORD dwStyle2; + DEVMODE dmScreenSettings; // + memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // + dmScreenSettings.dmSize=sizeof(dmScreenSettings); // + dmScreenSettings.dmPelsWidth = width; + dmScreenSettings.dmPelsHeight = height; + dmScreenSettings.dmBitsPerPel = 32; + dmScreenSettings.dmFields=DM_BITSPERPEL| + DM_PELSWIDTH|DM_PELSHEIGHT; + dwExStyle2=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Das Fenster soll zusätzlich einen 3D Rahmen bekommen + dwStyle2=WS_OVERLAPPEDWINDOW; // Ein typisches Windowsfenster mit Minimieren, Maximieren, etc + ReSizeGLScene(width, height); + RECT WindowRect2; // Speicher für aktuelle Auflösung + WindowRect2.left=(long)0; // Die linke Seite des Rechtecks wirtd auf 0 gesetzt + WindowRect2.right=(long)width; // Hier wird die gewünschte Breite des Fensters gespeichert + WindowRect2.top=(long)0; // Die obere Seite wird auch auf 0 gesetzt + WindowRect2.bottom=(long)height; // Und hier wird die Höhe abgelegt + dwExStyle2=WS_EX_APPWINDOW; // Fenstereigenschaften + dwStyle2=WS_POPUP; + SetWindowPos(hMainWnd,HWND_TOP, 0, 0,width,height,SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); + SetForegroundWindow(hMainWnd); + SetFocus(hMainWnd); + + } + return 0; +} + +/* --------------------------------------------------------------------------------------------------------------------*/ +/* -----------------------------------------------OPENGL init function-------------------------------------------------*/ +/* --------------------------------------------------------------------------------------------------------------------*/ + +bool InitGL(struct winampVisModule *this_mod) +{ + if (width==640) + current_window_size=0; + if (width==800) + current_window_size=1; + if (width==1024) + current_window_size=2; + if (width==1280) + current_window_size=3; + if (width==1600) + current_window_size=4; + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glClearColor(1.0f, 0.0f, 0.0f, 0.0f); + glClearDepth(1.0f); // Enables Clearing Of The Depth Buffer + glShadeModel(GL_SMOOTH); // Enables Smooth Color Shading + glMatrixMode(GL_PROJECTION); // Select The Projection Matrix + glLoadIdentity(); // Reset The Projection Matrix + gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); // Calculate The Aspect Ratio Of The Window + glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix + glBlendFunc(GL_SRC_ALPHA,GL_ONE); + glEnable(GL_BLEND); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + //glEnable(GL_TEXTURE_2D); + + return TRUE; // Initialization Went OK +} + +/* --------------------------------------------------------------------------------------------------------------------*/ +/* ----------------------------------------------------init function for our window------------------------------------*/ +/* --------------------------------------------------------------------------------------------------------------------*/ + +int init(struct winampVisModule *this_mod) +{ + //config_read(this_mod); + + /* ----------------------------------------------------Register our window class-----------------------------------*/ + /* ----------------------------------------------------------------------------------------------------------------*/ + + GLuint PixelFormat; // Speichert das Pixelformat + WNDCLASS wc; // wc wird eine Instanz der Fensterklasse + DWORD dwExStyle; // weitere Informationen + DWORD dwStyle; // Fensterinformationen + RECT WindowRect; // Speicher für aktuelle Auflösung + WindowRect.left=(long)0; // Die linke Seite des Rechtecks wirtd auf 0 gesetzt + WindowRect.right=(long)width; // Hier wird die gewünschte Breite des Fensters gespeichert + WindowRect.top=(long)0; // Die obere Seite wird auch auf 0 gesetzt + WindowRect.bottom=(long)height; // Und hier wird die Höhe abgelegt + hInstance = this_mod->hDllInstance; + memset(&wc,0,sizeof(wc)); + wc.lpfnWndProc = (WNDPROC) WndProc; + wc.hInstance = this_mod->hDllInstance; // hInstance of DLL + wc.lpszClassName = szAppName; // our window class name + wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Lädt einen Cursor + wc.lpszMenuName = NULL; // Auch ein Menü wird nicht benötigt. + //if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", + // "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO) + //{ + fullscreen=FALSE; // Windowed Mode + //} + + if (!RegisterClass(&wc)) + { + MessageBox( NULL,"Can't register window class.","ERROR", + MB_OK|MB_ICONEXCLAMATION); + return 1; + } + if (fullscreen) // Soll im Vollbildmodus gestartet werden + { + DEVMODE dmScreenSettings; // Instanz von DEVMODE wird erzeugt + memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // Diese wird geleert + dmScreenSettings.dmSize=sizeof(dmScreenSettings); // dmsize soll genauso groß wie die dmScreenSettings sein + dmScreenSettings.dmPelsWidth = width; + dmScreenSettings.dmPelsHeight = height; + dmScreenSettings.dmBitsPerPel = 32; + dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; + if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN) + !=DISP_CHANGE_SUCCESSFUL) + { + if (MessageBox(NULL,"Fullscreen device not available , Do you want to start in a windowed mode?", + "Problem",MB_YESNO|MB_ICONEXCLAMATION)==IDYES) + { + fullscreen=FALSE; + } + + else + { + return FALSE; + } + } + } + if (fullscreen) + { + dwExStyle=WS_EX_APPWINDOW; // Fenstereigenschaften + dwStyle=WS_POPUP; + ShowCursor(FALSE); // Der Mauszeiger wird nicht angezeigt + } + else + { + dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Das Fenster soll zusätzlich einen 3D Rahmen bekommen + dwStyle=WS_OVERLAPPEDWINDOW; // Ein typisches Windowsfenster mit Minimieren, Maximieren, etc + } + AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); // Fenster wird angepasst + hMainWnd = CreateWindowEx(dwExStyle, // these exstyles put a nice small frame, but also a button in the taskbar + szAppName, // our window class name + this_mod->description, // use description for a window title + WS_CLIPSIBLINGS | // Wird von OpenGL benötigt + WS_CLIPCHILDREN | // Wird auch von OpenGL benötigt + dwStyle, + 0,0, // screen position (read from config) + WindowRect.right-WindowRect.left, // Hier werden die ermittelten Werte für die Breite eingesetzt + WindowRect.bottom-WindowRect.top, // und hier für die Länge + this_mod->hwndParent, // parent window (winamp main window) + NULL, // no menu + this_mod->hDllInstance, // hInstance of DLL + 0); // no window creation data + if (!hMainWnd) + { + MessageBox(this_mod->hwndParent,"Error creating window","ERROR",MB_OK); + return 1; + } + static PIXELFORMATDESCRIPTOR pfd= // pdf ist jetzt ein PIXELFORMATDESCRIPTOR + { + sizeof(PIXELFORMATDESCRIPTOR), + 1, // Versionsnummer + PFD_DRAW_TO_WINDOW | // Das Format muss in Fenster sichtbar sein können + PFD_SUPPORT_OPENGL | // OpenGL muss unterstützt werden + PFD_DOUBLEBUFFER, // Double Buffering muss unterstützt werden + PFD_TYPE_RGBA, // Das RGBA (Rot,Grün,Blau,Alpha(Transparenz)) muss unterstützt werden + 32, // Die Farbtiefe, die schon übergeben wurde, wird hier benötigt + 0, 0, 0, 0, 0, 0, // wird nicht benötigt + 0, // kein Alpha Buffer + 0, // Shift Bit ignoriert + 0, // kein Accumulation Buffer + 0, 0, 0, 0, // nicht benötigt + 32, // 16Bit Z-Buffer (Depth Buffer) + 0, // kein Stencil Buffer + 0, // kein Auxiliary Buffer + PFD_MAIN_PLANE, // Die Hauptebene auf die später gezeichnet wird + 0, // unwichtig + 0, 0, 0 // keine Ebenenmasken benötigt + }; + if (!(hDC=GetDC(hMainWnd))) // Versuch, den DC zu bekommen + { + KillGLWindow(this_mod); // Alles rückgängig machen + + MessageBox( NULL,"NO dc available.","ERROR", + MB_OK|MB_ICONEXCLAMATION); + return FALSE; // FALSE zurückgeben, beenden + } + if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Kann Windows ein passendes finden? + { + KillGLWindow(this_mod); // Alles zurücksetzen + MessageBox( NULL,"Can't find pixelformat.","ERROR", + MB_OK|MB_ICONEXCLAMATION); + return FALSE; // FALSE zurück und Ende. + } + if(!SetPixelFormat(hDC,PixelFormat,&pfd)) + { + KillGLWindow(this_mod); // Leider nicht, Fehlerpopup und raus + MessageBox( NULL,"Can't use pixelformat.", + "ERROR",MB_OK|MB_ICONEXCLAMATION); + return FALSE; // FALSE zurück und raus + } + if (!(hRC=wglCreateContext(hDC))) // Versuch den RC zu bekommen + { + KillGLWindow(this_mod); // Alles rückgängig machen + MessageBox( NULL,"Can't get rendering context.","ERROR", + MB_OK|MB_ICONEXCLAMATION); + return FALSE; + } + if(!wglMakeCurrent(hDC,hRC)) // Versuch den RC zu aktivieren + { + KillGLWindow(this_mod); // hat nicht geklappt, also alles zurück + MessageBox( NULL,"Can't activate rendering context.","ERROR", + MB_OK|MB_ICONEXCLAMATION); + return FALSE; + } + ShowWindow(hMainWnd,SW_SHOW); // Fenster anzeigen + SetForegroundWindow(hMainWnd); // Priorität des Programms wird erhöht + SetFocus(hMainWnd); // Tastatureingaben werden jetzt an das Programm geleitet + ReSizeGLScene(width, height); // Die Perspektive wird aktiviert + + SetTimer(hMainWnd , FPS_TIMER, FPS_INTERVAL, NULL); + + myinit(); + initializeSpheres(); + + return 0; +} + +void myinit(void) +{ + /*Initialize and compute the vectors for the spiral*/ + spir[0][0]=0.0; + spir[0][1]=-1.0; + spir[1][0]=-sin(30.0*M_PI/180); + spir[1][1]=-cos(30.0*M_PI/180); + spir[2][0]=-cos(30.0*M_PI/180); + spir[2][1]=-sin(30.0*M_PI/180); + spir[3][0]=-1.0; + spir[3][1]=0.0; + spir[4][0]=-cos(30.0*M_PI/180); + spir[4][1]=sin(30.0*M_PI/180); + spir[5][0]=-sin(30.0*M_PI/180); + spir[5][1]=cos(30.0*M_PI/180); + spir[6][0]=0.0; + spir[6][1]=1.0; + spir[7][0]=sin(30.0*M_PI/180); + spir[7][1]=cos(30.0*M_PI/180); + spir[8][0]=cos(30.0*M_PI/180); + spir[8][1]=sin(30.0*M_PI/180); + spir[9][0]=1.0; + spir[9][1]=0; + spir[10][0]=cos(30.0*M_PI/180); + spir[10][1]=-sin(30.0*M_PI/180); + spir[11][0]=sin(30.0*M_PI/180); + spir[11][1]=-cos(30.0*M_PI/180); + + for (int i = 0; i <= 103; i++) + { + cosTable[i] = cos((double)(M_PI*2*i/100.0)); + sinTable[i] = sin((double)(M_PI*2*i/100.0)); + } +/*create all needed spheres and initialize them with default values*/ + initializeSpheres(); + +/*Initialize the random number creator*/ + time_t t; + time(&t); + srand((unsigned int)t); //initialize with date and time + +/* attributes */ + + glClearColor(0.0, 0.0, 0.0, 1.0); /* black background */ + +/* Lighting */ + glLoadIdentity(); + + GLfloat light_ambient[] = {0.0,0.0,0.0,1.0}; + GLfloat light_diffuse[] = {1.0,1.0,1.0,1.0}; + GLfloat light_specular[] = {1.0,1.0,1.0,1.0}; + GLfloat lmodel_ambient[] = {0.5,0.5,0.5,1.0}; + GLfloat mat_amb_diff[] = { 0.5, 0.5, 0.5, 1.0 }; + GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; + GLfloat mat_shininess[] = { 40.0 }; + + GLfloat light_position0[] = {1.0, 1.0, 0.0, 0.0 }; + + glShadeModel (GL_SMOOTH); + + glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); + glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); + glLightfv(GL_LIGHT0, GL_POSITION, light_position0); + + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); + + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_amb_diff); + glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); + glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); + + //Enable Lighting + glEnable(GL_COLOR_MATERIAL); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); +} +/* --------------------------------------------------------------------------------------------------------------------*/ +/* ---------------------------------------------mainrenderfunction-----------------------------------------------------*/ +/* --------------------------------------------------------------------------------------------------------------------*/ + +int render(struct winampVisModule *this_mod) +{ + displayScene(this_mod); + SwapBuffers(hDC); // Die Puffer werden getauscht + CalculateFrameRate(); + if (done==TRUE) + return 1; + else + return 0; +} + +/* --------------------------------------------------------------------------------------------------------------------*/ +/* ---------------------------------------------------quitfunction-----------------------------------------------------*/ +/* --------------------------------------------------------------------------------------------------------------------*/ + +void quit(struct winampVisModule *this_mod) +{ + SelectObject(memDC,oldBM); // delete our doublebuffer + DeleteObject(memDC); + DeleteObject(memBM); + DestroyWindow(hMainWnd); // delete our window + UnregisterClass(szAppName,this_mod->hDllInstance); // unregister window class + KillGLWindow(this_mod); +} + +void quit3(struct winampVisModule *this_mod) +{ + if (current_window_size==0) + { + width=640; + height=480; + } + if (current_window_size==1) + { + width=800; + height=600; + } + if (current_window_size==2) + { + width=1024; + height=768; + } + if (current_window_size==3) + { + width=1280; + height=1024; + } + if (current_window_size==4) + { + width=1600; + height=1200; + } + + //config_write(this_mod); // write configuration + change_resolution(this_mod); +} + +/* --------------------------------------------------------------------------------------------------------------------*/ +/* ---------------------------------------------------------keysfunction-----------------------------------------------*/ +/* --------------------------------------------------------------------------------------------------------------------*/ + +LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_CREATE: return 0; + case WM_ERASEBKGND: return 0; + case WM_PAINT: + { + PAINTSTRUCT ps; + RECT r; + HDC hdc = BeginPaint(hwnd,&ps); + GetClientRect(hwnd,&r); + BitBlt(hdc,0,0,r.right,r.bottom,memDC,0,0,SRCCOPY); + EndPaint(hwnd,&ps); + } + return 0; + case WM_CLOSE: // Did We Receive A Close Message? + { + PostQuitMessage(0); // Send A Quit Message + return 0; // Jump Back + } + case WM_DESTROY: PostQuitMessage(0); return 0; + { // get this_mod from our window's user data + winampVisModule *this_mod = (winampVisModule *) GetWindowLong(hwnd,GWL_USERDATA); + PostMessage(this_mod->hwndParent,message,wParam,lParam); + } + return 0; + case WM_MOVE: + { + RECT r; + GetWindowRect(hMainWnd,&r); + config_x = 1024; + config_y = 768; + } + return 0; + case WM_SIZE: // Resize The OpenGL Window + { + width=LOWORD(lParam); + height=HIWORD(lParam); + ReSizeGLScene(width,height); // LoWord=Width, HiWord=Height + return 0; // Jump Back + } + case WM_SYSCOMMAND: // Intercept System Commands + { + switch (wParam) // Check System Calls + { + case SC_SCREENSAVE: // Screensaver Trying To Start? + case SC_MONITORPOWER: // Monitor Trying To Enter Powersave? + return 0; // Prevent From Happening + } + break; // Exit + } + case WM_KEYDOWN: // Is A Key Being Held Down? + { + keys[wParam] = TRUE; // If So, Mark It As TRUE + keyboard(); + return 0; // Jump Back + } + case WM_KEYUP: // Has A Key Been Released? + { + keys[wParam] = FALSE; // If So, Mark It As FALSE + return 0; // Jump Back + } + case WM_MOUSEMOVE: + { + return 0; + } + case WM_LBUTTONUP : + { + return 0; + } + case WM_RBUTTONDOWN : + { + return 0; + } + } + return DefWindowProc(hwnd,message,wParam,lParam); +} + +/* --------------------------------------------------------------------------------------------------------------------*/ +/* ----------------------------------------------------winamp plugin module--------------------------------------------*/ +/* --------------------------------------------------------------------------------------------------------------------*/ + +void config_getinifn(struct winampVisModule *this_mod, char *ini_file) +{ + char *p; + GetModuleFileName(this_mod->hDllInstance,ini_file,MAX_PATH); + p=ini_file+strlen(ini_file); + while (p >= ini_file && *p != '\\') p--; + if (++p >= ini_file) *p = 0; + strcat(ini_file,"plugin.ini"); + delete p; +} + +void config_read(struct winampVisModule *this_mod) +{ + char ini_file[MAX_PATH]; + config_getinifn(this_mod,ini_file); + width = GetPrivateProfileInt(this_mod->description,"width",width,ini_file); + height = GetPrivateProfileInt(this_mod->description,"height",height,ini_file); + if ((width!=640) && (width!=800) && (width!=1024) && (width!=1280) && (width!=1600)) + { + width=640; + height=480; + } +} + +void config_write(struct winampVisModule *this_mod) +{ + char string[32]; + char ini_file[MAX_PATH]; + + config_getinifn(this_mod,ini_file); + + wsprintf(string,"%d",width); + WritePrivateProfileString(this_mod->description,"width",string,ini_file); + wsprintf(string,"%d",height); + WritePrivateProfileString(this_mod->description,"height",string,ini_file); +} +/* --------------------------------------------------------------------------------------------------------------------*/ +/* ----------------------------------------------winmain function------------------------------------------------------*/ +/* --------------------------------------------------------------------------------------------------------------------*/ + +int WINAPI WinMain( HINSTANCE hInstance, // Instance + HINSTANCE hPrevInstance, // Previous Instance + LPSTR lpCmdLine, // Command Line Parameters + int nCmdShow) // Window Show State +{ + MSG msg; // Windows Message Structure + config(&mod); + init(&mod); + while(!done) // Loop That Runs While done=FALSE + { + if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // Is There A Message Waiting? + { + if (msg.message==WM_QUIT) // Have We Received A Quit Message? + { + done=TRUE; // If So done=TRUE + if (done==TRUE) quit(&mod); + } + else // If Not, Deal With Window Messages + { + TranslateMessage(&msg); // Translate The Message + DispatchMessage(&msg); // Dispatch The Message + } + } + else // If There Are No Messages + { + int ret=render(&mod); + if (ret==1) + quit(&mod); + } + } + return 1; // Exit The Program +} + + + +void setLighting (GLfloat r, + GLfloat g, + GLfloat b) +{ + GLfloat light_ambient[] = {0.0,0.0,0.0,1.0}; + GLfloat light_diffuse[] = {r,g,b,1.0}; + GLfloat light_specular[] = {1.0,1.0,1.0,1.0}; + GLfloat lmodel_ambient[] = {0.5,0.5,0.5,1.0}; + GLfloat mat_amb_diff[] = { 0.5, 0.5, 0.5, 1.0 }; + GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 }; + GLfloat mat_shininess[] = { 40.0 }; + + GLfloat light_position0[] = {1.0, 1.0, 0.0, 0.0 }; + + glShadeModel (GL_SMOOTH); + + glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); + glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); + glLightfv(GL_LIGHT0, GL_POSITION, light_position0); + + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); +} + +/* --------------------------------------------------------------------------------------------------------------------*/ +/* --------------------------------------------- Rendering Functions ------------------------------------------------------*/ +/* --------------------------------------------------------------------------------------------------------------------*/ + +/*Draw the circles which reflects the beat*/ +void drawWaveformCircles(struct winampVisModule *this_mod, int numSamples) +{ + double istep = groundRad/numSamples; + double jstep = 0.05; + double beatFactor = (((double)winampDetectBass(this_mod, 0,100)/100.0)*0.2)+0.8; + double color = (double)winampDetectBass(this_mod, 0, 100)/100.0 + .01; + for (double i = groundRad; i > 0; i -= istep) + { + + + glColor3d(color,1,color); + glLineWidth(2.0); + glBegin(GL_LINE_LOOP); + double steps=1; + for(double x = 1; x > 0; x -= .02) + { + + glVertex3d(beatFactor*i*my_cos(x), + 0.0, + beatFactor*i*my_sin(x) ); + } + glEnd(); + } +} + +void displayScene (struct winampVisModule *this_mod) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + GLfloat lcolor = (GLfloat)winampDetectBass(this_mod,0,100)/100.0; + + rotateFactor += rotateRate; + if (rotateFactor >= 1.0) rotateFactor = 0.0; + + /*Draw circle surface*/ + if(SURFACE) { + glColor3d(0.86,0.86,0.86); + + glBegin(GL_POLYGON); + glVertex3d(0.0,0.0,0.0); + for(double x = 1.02; x >=0; x -= .02) + { + glVertex3d(groundRad*my_cos(x), + 0.0, + groundRad*my_sin(x) ); + } + glEnd(); + } + if (WAVEFORMCIRCLES) + { + drawWaveformCircles(this_mod, NUM_CIRCLES); + } + + /*Draw spheres and belonging cones to bump them*/ + for(int o=0; o>>>> + //Sound input for the balls goes here for sphere with size sphere[i].r + //Input ranges from 0-MAXSTRENGTH, so now from 0-100 + + //the input is only computed if the ball is not in the air + if (!sphere[i].inAir) + input=computeSoundInput(i, NUMSPHERES, this_mod, BT_BEAT); + + //this function bumps the ball up and is called each time, it actually just bumps the ball up, + //when it is on the ground and so just disregard the input if not. + bump(&sphere[i], input); + +//-------->>>>> + + //Draw the sphere + if (SPHERES) + { + glColor3fv(sphere[i].color); + glTranslatef(sphere[i].x,sphere[i].r+sphere[i].height,sphere[i].z); + if(SQUASH) { + double squash = (sphere[i].height/100.0)*0.6 + 0.5; + glScaled(1.0, squash,1.0); + } + glutSolidSphere(sphere[i].r, + 20.0+(int)((1-NUMSPHERES/MAXSPHERES)*(sphere[i].r/10)), + 50.0+(int)((1-NUMSPHERES/MAXSPHERES)*(sphere[i].r))); + } + + glPopMatrix(); //restore the origin + + + } + +/*Text output*/ + setOrthographicProjection(); //switch to orthographic projection to easier print out text + glPushMatrix(); + glLoadIdentity(); + + //Data ouput of current settings + if(OUTPUT) { + char temp[50]; + glColor4f(1.0,1.0,1.0, 1.0); + + //Number of Balls + sprintf(temp," # Balls: %.d", NUMSPHERES); + printOut(10,10,temp); + //Balls on/off? + sprintf(temp," Balls: %s", (SPHERES)?"on":"off"); + printOut(10,25,temp); + //Airtime + sprintf(temp," max. Airtime: %.1f", NUMSEC); + printOut(10,40,temp); + //Speedfactor + sprintf(temp," Speedfactor: %.1f", SPEEDFACTOR); + printOut(10,55,temp); + //Cones on/off? + sprintf(temp," Cones: %s", (CONES)?"on":"off"); + printOut(10,70,temp); + //Surface on/off? + sprintf(temp," Surface: %s", (SURFACE)?"on":"off"); + printOut(10,85,temp); + //Bouncing balls? + sprintf(temp,"Bouncing Balls: %s", (BOUNCE)?"on":"off"); + printOut(10,100,temp); + //Squash balls? + sprintf(temp," Squash Balls: %s", (SQUASH)?"on":"off"); + printOut(10,115,temp); + //Beat Circles? + sprintf(temp," Beat Circles: %s", (WAVEFORMCIRCLES)?"on":"off"); + printOut(10, 130, temp); + //Color change? + sprintf(temp," Change color: %s", (COLORCHANGE)?"on":"off"); + printOut(10,145,temp); + //Index color of balls + printOut(10,160," Start color: "); + char * color; + if(COLOR==0) color="white"; + if(COLOR==1) {color="red"; glColor3f(1.0,0.0,0.0);} + if(COLOR==2) {color="green"; glColor3f(0.0,1.0,0.0);} + if(COLOR==3) {color="blue"; glColor3f(0.0,0.0,1.0);} + if(COLOR==4) {color="yellow"; glColor3f(1.0,1.0,0.0);} + if(COLOR==5) {color="magenta"; glColor3f(1.0,0.0,1.0);} + if(COLOR==6) {color="cyan"; glColor3f(0.0,1.0,1.0);} + sprintf(temp,"%s", color); + printOut(138,160,temp); + glColor3f(1.0, 1.0, 1.0); + //help message + if(!HELP) { + glColor3f(1.0,1.0,0.0); + printOut(width-20*8,10,"Press \'h\' for help!"); + } + } + + //help instructions + if(HELP) { + glColor3f(1.0,1.0,0.0); + int x=200; + int y=0; + + printOut(x,y+10," h = switch help on/off"); + printOut(x,y+25," o = switch output of the current settings on/off"); + + printOut(x,y+55,"z/x = decrease/increase number of balls"); + printOut(x,y+70,"u/i = decrease/increase the maximum airtime of the balls"); + printOut(x,y+85,"j/k = decrease/increase the speed factor of the balls"); + printOut(x,y+100,"n/m = decrease/increase the start color of the balls"); + printOut(x,y+130," c = display cones?"); + printOut(x,y+145," s = display white circle surface?"); + printOut(x,y+160," w = display beat circles?"); + printOut(x,y+175," a = display balls?"); + printOut(x,y+190," b = allow balls to bounce on the ground?"); + printOut(x,y+205," t = allow balls to be squashed?"); + printOut(x,y+220," l = allow balls to change color?"); + + printOut(x,y+250," r = reset all settings to default value"); + + printOut(x,y+280,"by Ryan Messner and Simon Beisel"); + } + + glPopMatrix(); + resetPerspectiveProjection(); //reset to old view + + glFlush(); /* clear buffers */ + + //glutSwapBuffers(); /*swap the buffers*/ +} + +void initializeSpheres() { + groundRad=0; + int i; + for(i=0; i0.0)||!(sphere[i].color[1]>0.0)||!(sphere[i].color[2]>0.0)) { + changeColor(&sphere[i], COLOR); + } + sphere[i].up=true; + sphere[i].firstUp=false; + sphere[i].inAir=false; + sphere[i].SEC=0; + sphere[i].height=0; + if (i==NUMSPHERES-1) { + groundRad=sqrt((double)((sphere[i].x)*(sphere[i].x))+(double)((sphere[i].z)*(sphere[i].z)))+(double)(i*1.2); + } + doSort(i,sphere[i].z); + } + + //to always have the same view on the scene independend of how big the circle surface is + //and how many spheres are on it I compute the coordinates for y and z dynamically + double distance=(double)(groundRad*1.02)/(double)(sin((alpha/2)*(M_PI/180))); + double yz=sqrt((distance*distance)/2); + + //The view is along and on the z axis to the origin + glLoadIdentity(); + gluLookAt(0.0, yz, yz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); +} + +//-------->>>>> +//compute the sound input for each single sphere depending on their size +double computeSoundInput(int i, int total, struct winampVisModule *this_mod, int BounceType) +{ + int range = (int) (576/NUMSPHERES); + int place=(int)(((NUMSPHERES-(i+1))/NUMSPHERES)*576); + place=(place<0)?0:place; + double tempstrength=0; + double level=0; + double strength; + + switch (BounceType) + { + case BT_WAVEFORM: + for(int a=0; aspectrumData[0][place+a] + this_mod->spectrumData[1][place+a]) /2); + tempstrength+=level; + } + + strength=((tempstrength/range)/255)*MAXSTRENGTH; + strength=(strength+(i/(NUMSPHERES*2)))*1.8; + + strength=(strength>MAXSTRENGTH)?MAXSTRENGTH:strength; + return strength; + case BT_BEAT: + return ((double)winampBeat(this_mod)/100)*MAXSTRENGTH; + case BT_BASS: + default: + return (rand()%100)+1; + } +} +//-------->>>>> + +//is used to print out several text at the position x,y +void printOut(int x, int y, char * text) { + glRasterPos2i(x,y); + int length=strlen(text); + for (int i = 0; i < length; i++) + { + glutBitmapCharacter(GLUT_BITMAP_8_BY_13, text[i]); + } +} + +//Most important function of the whole program, it gets a strength variable as an input and based +//on it bumps a ball in the air if it is laying still on the ground and is not bouncing or in the air +void bump(struct SPHERE *sp, double strength) { + + //if ball not in Air compute it current new airtime SEC based on the strength value + if(!sp->inAir&&strength>MAXSTRENGTH/10) { + startTimer(sp); //start the timer + //this is the main calculation, SEC is always higher for smaller balls than for + //bigger balls with the same strength input, that is what the second term of the + //function is for, the last term is the max air time and is calculated in + sp->SEC=strength/MAXSTRENGTH*(1-(sp->r/(NUMSPHERES*2)))*NUMSEC; + + //change color of the ball slightly + if(COLORCHANGE) { + int choice=(int) (rand() % 3); + int plusminus=(int) (rand() % 2); + float change=(strength/MAXSTRENGTH)/10+0.02; + if (plusminus==1) change=-change; + sp->color[choice]+=(sp->color[choice]+change<1.0&&sp->color[choice]+change>0.0)?change:-change; + } + + sp->firstUp=true; + sp->inAir=true; + } + + //stop the timer and compute seconds till the start of the timer + stopTimer(sp); + double seconds=timerSeconds(sp); + + //compute the speed based on the speedfactor and the number of spheres + double speed=NUMSPHERES*SPEEDFACTOR; + + //let the ball fly up and down + if(sp->SEC>0.05) + { + if(!BOUNCE) sp->inAir=true; + + //up-direction + if(sp->up==true) { + double max=4.905*sp->SEC*sp->SEC; + sp->height=(max-4.905*(sp->SEC-seconds)*(sp->SEC-seconds))*speed; + } + //down-direction + else { + double max=4.905*sp->SEC*sp->SEC; + sp->height=(max-4.905*seconds*seconds)*speed; + } + + //if ball reaches the floor or is at the top of its flight turn the direction and + //probably decrease the height for let the ball bounce + if(seconds>sp->SEC) { + sp->up=(sp->up==true)?false:true; + startTimer(sp); + if(sp->SEC>0&&sp->up==true) { + sp->firstUp=false; + sp->SEC-=(sp->SEC*4/9); + + if(!BOUNCE) sp->inAir=false; + } + + } + } + //finished with bouncing or at the ground again and accepting input again + else { + sp->inAir=false; + } +} + +/*function to change color of one sphere*/ +void changeColor(struct SPHERE *sp, int c) { + double red=0.0; + double green=0.0; + double blue=0.0; + + //0 = white + //1 = red + //2 = green + //3 = blue + //4 = yellow + //5 = magenta + //6 = cyan + if(c==1||c==4||c==5||c==0) red=1.0; //red + if(c==2||c==4||c==6||c==0) green=1.0; //green + if(c==3||c==5||c==6||c==0) blue=1.0; //blue + + sp->color[0]=red; //SET COLOR + sp->color[1]=green; + sp->color[2]=blue; +} + +/*Sort the z value from one sphere with index no, into an array*/ +void doSort(int no, double z) { + int place=0; + for(int i=0; iplace; i--) { + order[i][0]=order[i-1][0]; + order[i][1]=order[i-1][1]; + } + order[place][0]=no; + order[place][1]=z; +} + +/*switch to an orthographic projection which makes it easier to output text*/ +void setOrthographicProjection() { + + // switch to projection mode + glMatrixMode(GL_PROJECTION); + // save previous matrix which contains the + //settings for the perspective projection + glPushMatrix(); + // reset matrix + glLoadIdentity(); + // set a 2D orthographic projection + gluOrtho2D(0, width, 0, height); + // invert the y axis, down is positive + glScalef(1, -1, 1); + // mover the origin from the bottom left corner + // to the upper left corner + glTranslatef(0, -height, 0); + glMatrixMode(GL_MODELVIEW); +} + +/*switch back to the perspective projection and reset the matrix*/ +void resetPerspectiveProjection() { + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); +} + +/*start the timer for a sphere*/ +void startTimer(struct SPHERE *sp) { + ::QueryPerformanceCounter(&sp->startTime_); +} + +/*stop the timer for a sphere*/ +void stopTimer(struct SPHERE *sp) { + ::QueryPerformanceCounter(&sp->stopTime_); +} + +/*get the seconds between start and stop of the timer for a sphere*/ +double timerSeconds(struct SPHERE *sp) { + if (!::QueryPerformanceFrequency(&sp->frequency_)) + throw "Error with QueryPerformanceFrequency"; + return (double)(sp->stopTime_.QuadPart - sp->startTime_.QuadPart) / (double) sp->frequency_.QuadPart; +} + +void keyboard () +{ + if(keys['R']) { //reset to default settings + CONES = DEFAULTCONES; + SURFACE = DEFAULTSURFACE; + NUMSPHERES = DEFAULTSPHERES; + SPEEDFACTOR = DEFAULTSPEEDFACTOR; + NUMSEC = DEFAULTSEC; + COLORCHANGE = DEFAULTCOLORCHANGE; + COLOR = DEFAULTCOLOR; + WAVEFORMCIRCLES = DEFAULTWAVEFORMCIRCLES; + SPHERES = SPHERESONOFF; + SQUASH = DEFAULTSQUASH; + + for(int i=0; iMINSPHERES) { //decrease number of spheres + NUMSPHERES--; + changeColor(&sphere[NUMSPHERES], COLOR); //RESET COLOR + initializeSpheres(); + } + if(keys['I']&&NUMSECMINSEC) { //decrease Airtime + NUMSEC-=0.1; + } + if(keys['K']&&SPEEDFACTORMINSPEEDFACTOR) { //decrease Speedfactor + SPEEDFACTOR-=0.1; + } + if(keys['S']) { //switch surface on/off + SURFACE=(SURFACE==true)?false:true; + } + if(keys['C']) { //switch cones on/off + CONES=(CONES==true)?false:true; + } + if(keys['B']) { //switch bouncing balls on/off + BOUNCE=(BOUNCE==true)?false:true; + } + if(keys['O']) { //switch output of data on/off + OUTPUT=(OUTPUT==true)?false:true; + } + + if(keys['H']) { //switch help on/off + if(HELP==false) { + surfacetemp=SURFACE; + SURFACE=false; + circlestemp=WAVEFORMCIRCLES; + WAVEFORMCIRCLES=false; + } + if(HELP==true) { + SURFACE=(SURFACE==true)?true:surfacetemp; + WAVEFORMCIRCLES=(WAVEFORMCIRCLES==true)?true:circlestemp; + } + HELP=(HELP==true)?false:true; + } + if(keys['L']) { //switch colorchange on/off + COLORCHANGE=(COLORCHANGE==true)?false:true; + for(int i=0; iMINCOLOR) { //switch through colors + COLOR--; + for(int i=0; i\plugin.ini +// Look at the example plugin for a framework. + +// ints are 32 bits, and structure members are aligned on the default 8 byte boundaries +// tested with VC++ 4.2 and 5.0 + + +typedef struct winampVisModule { + char *description; // description of module + HWND hwndParent; // parent window (filled in by calling app) + HINSTANCE hDllInstance; // instance handle to this DLL (filled in by calling app) + int sRate; // sample rate (filled in by calling app) + int nCh; // number of channels (filled in...) + int latencyMs; // latency from call of RenderFrame to actual drawing + // (calling app looks at this value when getting data) + int delayMs; // delay between calls in ms + + // the data is filled in according to the respective Nch entry + int spectrumNch; + int waveformNch; + unsigned char spectrumData[2][576]; + unsigned char waveformData[2][576]; + + void (*Config)(struct winampVisModule *this_mod); // configuration dialog + int (*Init)(struct winampVisModule *this_mod); // 0 on success, creates window, etc + int (*Render)(struct winampVisModule *this_mod); // returns 0 if successful, 1 if vis should end + void (*Quit)(struct winampVisModule *this_mod); // call when done + + void *userData; // user data, optional +} winampVisModule; + +typedef struct { + int version; // VID_HDRVER + char *description; // description of library + winampVisModule* (*getModule)(int); +} winampVisHeader; + +// exported symbols +typedef winampVisHeader* (*winampVisGetHeaderType)(); + +// version of current module (0x101 == 1.01) +#define VIS_HDRVER 0x101 + +#endif //VIS_H \ No newline at end of file diff --git a/bouncing_balls.dsp b/bouncing_balls.dsp new file mode 100755 index 0000000..9523a94 --- /dev/null +++ b/bouncing_balls.dsp @@ -0,0 +1,121 @@ +# Microsoft Developer Studio Project File - Name="bouncing_balls" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=bouncing_balls - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "bouncing_balls.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "bouncing_balls.mak" CFG="bouncing_balls - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "bouncing_balls - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "bouncing_balls - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "bouncing_balls - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BOUNCING_BALLS_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BOUNCING_BALLS_EXPORTS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 + +!ELSEIF "$(CFG)" == "bouncing_balls - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BOUNCING_BALLS_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BOUNCING_BALLS_EXPORTS" /FR /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "bouncing_balls - Win32 Release" +# Name "bouncing_balls - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\SVIS.CPP +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\declarations.h +# End Source File +# Begin Source File + +SOURCE=.\Headers.h +# End Source File +# Begin Source File + +SOURCE=.\VIS.H +# End Source File +# Begin Source File + +SOURCE=.\winampdetectbeat.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# End Target +# End Project diff --git a/bouncing_balls.dsw b/bouncing_balls.dsw new file mode 100755 index 0000000..d4eb323 --- /dev/null +++ b/bouncing_balls.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "bouncing_balls"=".\bouncing_balls.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/bouncing_balls.ncb b/bouncing_balls.ncb new file mode 100755 index 0000000000000000000000000000000000000000..cdbfca7d7de2a31925ce12959f6838f7dae82029 GIT binary patch literal 232448 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 literal 0 HcmV?d00001 diff --git a/bouncing_balls.opt b/bouncing_balls.opt new file mode 100755 index 0000000000000000000000000000000000000000..5cccc70b33603d2d4e9fa3c19d1dc16e0d7b16e9 GIT binary patch literal 48640 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

    0H;i58^=to|EcvqJt$Gze{1`1 zb{47c|JL_^S84rEt^cX@KehfR{(ZssW4$W0{-@Ue)cT*EjkCPN`&!7u2etmE*8kM{ KpT9c%?|%VTJwj;! literal 0 HcmV?d00001 diff --git a/bouncing_balls.plg b/bouncing_balls.plg new file mode 100755 index 0000000..417a689 --- /dev/null +++ b/bouncing_balls.plg @@ -0,0 +1,34 @@ + + +

    +

    Build Log

    +

    +--------------------Configuration: bouncing_balls - Win32 Debug-------------------- +

    +

    Command Lines

    +Creating temporary file "C:\DOCUME~1\Owner\LOCALS~1\Temp\RSP12D.tmp" with contents +[ +/nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "BOUNCING_BALLS_EXPORTS" /FR"Debug/" /Fp"Debug/bouncing_balls.pch" /YX /Fo"Debug/" /Fd"Debug/" /FD /GZ /c +"C:\Documents and Settings\Owner\Desktop\bouncing_balls\SVIS.CPP" +] +Creating command line "cl.exe @C:\DOCUME~1\Owner\LOCALS~1\Temp\RSP12D.tmp" +Creating temporary file "C:\DOCUME~1\Owner\LOCALS~1\Temp\RSP12E.tmp" with contents +[ +kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"Debug/bouncing_balls.pdb" /debug /machine:I386 /out:"Debug/bouncing_balls.dll" /implib:"Debug/bouncing_balls.lib" /pdbtype:sept +".\Debug\SVIS.OBJ" +] +Creating command line "link.exe @C:\DOCUME~1\Owner\LOCALS~1\Temp\RSP12E.tmp" +

    Output Window

    +Compiling... +SVIS.CPP +Linking... +LINK : LNK6004: Debug/bouncing_balls.dll not found or not built by the last incremental link; performing full link + Creating library Debug/bouncing_balls.lib and object Debug/bouncing_balls.exp + + + +

    Results

    +bouncing_balls.dll - 0 error(s), 0 warning(s) +
    + + diff --git a/bouncing_balls.sln b/bouncing_balls.sln new file mode 100755 index 0000000..1ffd915 --- /dev/null +++ b/bouncing_balls.sln @@ -0,0 +1,21 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bouncing_balls", "bouncing_balls.vcproj", "{1F8B3371-FE47-4DAB-A32D-EAA23B3089AE}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {1F8B3371-FE47-4DAB-A32D-EAA23B3089AE}.Debug.ActiveCfg = Debug|Win32 + {1F8B3371-FE47-4DAB-A32D-EAA23B3089AE}.Debug.Build.0 = Debug|Win32 + {1F8B3371-FE47-4DAB-A32D-EAA23B3089AE}.Release.ActiveCfg = Release|Win32 + {1F8B3371-FE47-4DAB-A32D-EAA23B3089AE}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/bouncing_balls.suo b/bouncing_balls.suo new file mode 100755 index 0000000000000000000000000000000000000000..fd4439576283e98849c34c36a90580ec0c97116a GIT binary patch literal 12288 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 yJzsFH<*PvjfjMqIv-&s3yj}BOmCOf + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/declarations.h b/declarations.h new file mode 100755 index 0000000..816d72d --- /dev/null +++ b/declarations.h @@ -0,0 +1,233 @@ +#ifndef DECLARATIONS_H +#define DECLARATIONS_H + +#include "headers.h" +#include "vis.h" +#include "winampdetectbeat.h" +//#include "structures.h" +//#include "beat_return.h" + +const FPS_TIMER = 1; +const FPS_INTERVAL = 2000; +double input; + +HGLRC hRC=NULL; // Der OpenGL Rendering Context +HDC hDC=NULL; // Geschützter GDI Device Context +HWND hWnd=NULL; // Verweist später auf den Windows Handle +HINSTANCE hInstance; +HWND hMainWnd; // main window handle +HDC memDC; // memory device context +HBITMAP memBM, // memory bitmap (for memDC) + oldBM; // old bitmap (from memDC) // Die Instanz der Anwendung + +char szAppName[] = "Bouncing Balls"; // Our window class, etc +char *tmp=new char[70]; +char *title=new char[70]; +char *old_title=new char[70]; +char ** title_winamp; + +int width=640 ,config_x = 1600 ,height=480 ,config_y =1200 ; +int key=1; +int current_window_size=4; +int now_playing,pos; +float old_beat,beat_help =0.0f; +bool keys[256]; // Vektor (Array) der den Status einzelner Tasten enthält (gedrückt/nicht gedrückt) +bool done=FALSE; +bool new_title=TRUE; +bool fullscreen=TRUE; // Läuft das Programm im Vollbildmodus oder nicht? +bool change_scene=TRUE; +bool active=TRUE; + +/* --------------------------------------------------------------------------------------------------------------------*/ +/* -----------------------------------------------------winamp functions-----------------------------------------------*/ +/* --------------------------------------------------------------------------------------------------------------------*/ + // configuration declarations +void config_read(struct winampVisModule *this_mod); // reads the configuration +void config_write(struct winampVisModule *this_mod); // writes the configuration +void config_getinifn(struct winampVisModule *this_mod, char *ini_file); // makes the .ini file filename + winampVisModule *getModule(int which); // returns a winampVisModule when requested. Used in hdr, below +void config(struct winampVisModule *this_mod); // configuration dialog +int init(struct winampVisModule *this_mod); // initialization for module +int render(struct winampVisModule *this_mod); // rendering for winamp module +void quit(struct winampVisModule *this_mod); // deinitialization for module +void quit3(struct winampVisModule *this_mod); // deinitialization for module and restart + + +LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); + +/* --------------------------------------------------------------------------------------------------------------------*/ +/* -------------Module header, includes version, description, and address of the module retriever function-------------*/ +/* --------------------------------------------------------------------------------------------------------------------*/ + +winampVisHeader hdr = { VIS_HDRVER, "Bouncing Balls Visualisation plugin for winamp", getModule }; + +/* --------------------------------------------------------------------------------------------------------------------*/ +/* ----------------------------------------------------module OpenGL---------------------------------------------------*/ +/* --------------------------------------------------------------------------------------------------------------------*/ + +winampVisModule mod = +{ + "Bouncing Balls Visualizer", + NULL, // hwndParent + NULL, // hDllInstance + 0, // sRate + 0, // nCh + 1, // latencyMS + 1, // delayMS + 2, // spectrumNch + 2, // waveformNch + { 0, }, // spectrumData + { 0, }, // waveformData + config, + init, + render, + quit +}; + +/* --------------------------------------------------------------------------------------------------------------------*/ +/* ----------------------------------------------------Scene Variables---------------------------------------------------*/ +/* --------------------------------------------------------------------------------------------------------------------*/ + +#define M_PI 3.14159265358979323846 + +//Maximum input number for each sphere ranges from 0 to MAXSTRENGTH +#define MAXSTRENGTH 100 + +//Define the values for the number of spheres +#define MAXSPHERES 100 +#define MINSPHERES 7 +#define DEFAULTSPHERES 19 + +//Define the values for the max air-time in one direction +//so 1 sec means actually max 2 sec a ball can be in the air +#define MAXSEC 3.0 +#define MINSEC 0.5 +#define DEFAULTSEC 1.0 + +//Define the speedfactor which is multiplied whith the actual height of each ball, +//when he is in the air, so a higher speedfactor with would let a ball jump higher in +//the same amount of time than with a lower speedfactor +#define MAXSPEEDFACTOR 5.0 +#define MINSPEEDFACTOR 0.5 +#define DEFAULTSPEEDFACTOR 3.5 + +//define the number of different colors with which the balls can be initialized +#define MINCOLOR 0 +#define MAXCOLOR 6 +#define DEFAULTCOLOR 1 + +//show cones or not? +#define DEFAULTCONES false +//show the circle surface or not? +#define DEFAULTSURFACE true +//let the ball change the color when they are bumped up? +#define DEFAULTCOLORCHANGE true +//let ball first bounce a little up and down after they accept the next input? +#define DEFAULTBOUNCE false +//Output the current settings for all necessary user-variables on the screen? +#define DEFAULTOUTPUT true +//print out a short help on the screen? +#define DEFAULTHELP false +//output the waveform circles? +#define DEFAULTWAVEFORMCIRCLES false +//output the spheres? +#define SPHERESONOFF true +//squash the balls? +#define DEFAULTSQUASH false + +#define DEFAULTSAMPLES 20 +#define BT_WAVEFORM 0 +#define BT_BEAT 1 +#define BT_BASS 2 +#define MAXPILLARHEIGHT 50 +//set the decision variables to their default values + +#define my_cos(n) cosTable[(int)(n*100)] +#define my_sin(n) sinTable[(int)(n*100)] + + +int NUMSPHERES = DEFAULTSPHERES; +int COLOR = DEFAULTCOLOR; +int NUM_CIRCLES = DEFAULTSAMPLES; +bool CONES = DEFAULTCONES; +bool SURFACE = DEFAULTSURFACE; +bool WAVEFORMCIRCLES = DEFAULTWAVEFORMCIRCLES; +bool COLORCHANGE = DEFAULTCOLORCHANGE; +bool BOUNCE = DEFAULTBOUNCE; +bool OUTPUT = DEFAULTOUTPUT; +bool HELP = DEFAULTHELP; +bool SPHERES = SPHERESONOFF; +bool SQUASH = DEFAULTSQUASH; +double sinTable[104]; +double cosTable[104]; +double SPEEDFACTOR = DEFAULTSPEEDFACTOR; +double NUMSEC = DEFAULTSEC; +double rotateFactor = 0; +double rotateRate = .05; + +bool surfacetemp; +bool circlestemp; + +//function definition for later use +void bump(struct SPHERE *sp, double strength); +void startTimer(struct SPHERE *sp); +void stopTimer(struct SPHERE *sp); +void doSort(int no, double z); +void initializeSpheres(); +void changeColor(struct SPHERE *sp, int c); +void printOut(int x, int y, char * text); +void setOrthographicProjection(); +void resetPerspectiveProjection(); +double computeSoundInput(int index, int total, struct winampVisModule *this_mod, int BounceType); +double timerSeconds(struct SPHERE *sp); +void displayScene(struct winampVisModule *this_mod); +void myinit(void); +void keyboard(void); +void drawPillars (int i, int spherenum, bool orient, struct winampVisModule* this_mod); +void drawSquare (double a[3], double b[3], double c[3], double d[3]); +//Datastructure to safe the state of each single sphere +struct SPHERE { + //radius + double r; + //x,z - coordinates + double x; + double z; + GLfloat color[3]; + //is the sphere flying upwards at the moment? + bool up; + //is it his first way up after being bumped up? + bool firstUp; + //is he in air now or waiting for an input? + bool inAir; + //store the current air-time for each sphere + double SEC; + //contains the current height of the ball + double height; + //needed to store start and stop times of each ball, to + //compute its height + LARGE_INTEGER frequency_; + LARGE_INTEGER startTime_; + LARGE_INTEGER stopTime_; +}; + + + +/*Define global variables*/ +//First define an array of Spheres +SPHERE *sphere = new SPHERE[MAXSPHERES]; + +//will later store the radius of the ground circle +double groundRad=0; +//this will determine the number of circles drawn in waveformcircle mode +int wfci_samples = 10; +//this will determine whether the color and alpha shift with the beat +bool wfcb_color = true; +//used to store the vectors for creating the spiral shape +double spir[12][2]; +//view angle for the perspective view +double alpha=45.0; +//is used to order the Spheres by their z-values to print them out in the right +//order so that no unwanted overlap can happen +int order[MAXSPHERES][2]; + +#endif //DECLARATIONS_H diff --git a/particle.cpp b/particle.cpp new file mode 100755 index 0000000..9ba7241 --- /dev/null +++ b/particle.cpp @@ -0,0 +1,174 @@ +#include "headers.h" +#include "Misc.h" +#include "particle.h" + +particle::particle(float xg,float yg,float zg) +{ + GLfloat colors[12][3]= + { + {1.0f,0.5f,0.5f},{1.0f,0.75f,0.5f},{1.0f,1.0f,0.5f},{0.75f,1.0f,0.5f}, + {0.5f,1.0f,0.5f},{0.5f,1.0f,0.75f},{0.5f,1.0f,1.0f},{0.5f,0.75f,1.0f}, + {0.5f,0.5f,1.0f},{0.75f,0.5f,1.0f},{1.0f,0.5f,1.0f},{1.0f,0.5f,0.75f} + }; + + const int MAX_PARTICLES=100; + for (int loop=0;loopwaveformData[1][int(loop)]/127; + //float waveform2=(32767.0f-pcm[int(loop)])*SPECHEIGHT/105536.0f; + + particle_in[loop].xi+=particle_in[loop].xg+waveform2/5; + particle_in[loop].yi+=particle_in[loop].yg+waveform2/100; + particle_in[loop].zi+=particle_in[loop].zg*waveform2/10; + particle_in[loop].life-=particle_in[loop].fade; + particle_in[loop].xg+=(float)cos(rand()%180)*waveform2/(10*60); + particle_in[loop].yg-=((float)cos(rand()%180)/10)*xrot/60; + particle_in[loop].zg-=(float)cos(rand()%180)*waveform2/127; + + if (particle_in[loop].life<0.0f) + { + particle_in[loop].life=1.0f; + particle_in[loop].fade=float(rand()%100)/1000.0f+0.003f; + particle_in[loop].x=0.0f; + particle_in[loop].y=0.0f; + particle_in[loop].z=0.0f; + particle_in[loop].xi=xspeed+float((rand()%60)-32.0f); + particle_in[loop].yi=yspeed+float((rand()%60)-30.0f); + particle_in[loop].zi=float((rand()%60)-30.0f); + particle_in[loop].r=colors[col][0]; + particle_in[loop].g=colors[col][1]; + particle_in[loop].b=colors[col][2]; + } + glVertexPointer ( 3, GL_FLOAT, 0, &vertices ); + glColorPointer ( 4, GL_FLOAT, 0, &colours ); + glDrawElements ( GL_QUADS, 4 , GL_UNSIGNED_INT, &indices ); + } + } +} + + + diff --git a/particle.h b/particle.h new file mode 100755 index 0000000..b84bc68 --- /dev/null +++ b/particle.h @@ -0,0 +1,43 @@ +#ifndef __PARTICLE_H_ +#define __PARTICLE_H_ +#include "vis.h" + +class particle +{ + + public: + + typedef struct // Create A Structure For Particle + { + bool active; // Active (Yes/No) + float life; // Particle Life + float fade; // Fade Speed + float r; // Red Value + float g; // Green Value + float b; // Blue Value + float x; // X Position + float y; // Y Position + float z; // Z Position + float xi; // X Direction + float yi; // Y Direction + float zi; // Z Direction + float xg; // X Gravity + float yg; // Y Gravity + float zg; // Z Gravity + }particles; + + particle(float xg,float yg,float zg); + ~particle(); + + void Draw(GLuint blend_colour,float beat_responder,struct winampVisModule *this_mod,float xrot,float xspeed,float yspeed,int col); + void Restore(float xg,float yg,float zg); + + particles particle_in[500]; + + float slowdown; + PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB; + PFNGLACTIVETEXTUREARBPROC glActiveTextureARB; + +}; + +#endif __PARTICLE_H_ diff --git a/winampdetectbeat.h b/winampdetectbeat.h new file mode 100755 index 0000000..f26a4c6 --- /dev/null +++ b/winampdetectbeat.h @@ -0,0 +1,97 @@ +int winampDetectBeat(struct winampVisModule *this_mod) +{ + int y=0; // y=0 | 1 right | left channel; + int last=this_mod->waveformData[y][0]; + int total=0; + for (int x = 1; x < 576; x ++) + { + total += abs(last - this_mod->waveformData[y][x]); + last = this_mod->waveformData[y][x]; + } + total /= 576; + if (total > 127) total = 127; + return total; +} + +int winampDetectBass(struct winampVisModule *this_mod,int xmin,int xmax) +{ + int last=this_mod->waveformData[0][0]; + int total=0; + for (int y=0;y<2;y++) + { + for (int x = xmin; x < xmax; x ++) + { + total += abs(this_mod->spectrumData[y][x]); + last = this_mod->waveformData[y][x]; + } + total /= (xmax-xmin); + } + if (total > 100) total = 100; + return total; +} + +int winampDetectMiddle(struct winampVisModule *this_mod) +{ + int y=0; // y=0 | 1 right | left channel; + int last=this_mod->waveformData[y][0]; + int total=0; + for (int x = 550; x < 555; x ++) + { + total += abs(this_mod->waveformData[y][x]); + last = this_mod->waveformData[y][x]; + } + total /= 5; + if (total > 127) total = 127; + return total; +} + +int winampMiddleUp(struct winampVisModule *this_mod,int i,int j) +{ + int y=0; // y=0 | 1 right | left channel; + int last=this_mod->waveformData[y][i]; + int total=0; + for (int x = 0; x < j; x ++) + { + total += abs(this_mod->spectrumData[y][x+i]); + last = this_mod->waveformData[y][x+i]; + } + total /= j; + if (total > 127) total = 127; + return total; +} + +int winampDetectTreble(struct winampVisModule *this_mod) +{ + int y=0; // y=0 | 1 right | left channel; + int last=this_mod->waveformData[y][0]; + int total=0; + for (int x = 250; x < 560; x ++) + { + total += abs(this_mod->spectrumData[y][x]); + last = this_mod->waveformData[y][x]; + } + total /= 310; + if (total > 127) total = 127; + return total; +} + +int winampBeat(struct winampVisModule *this_mod) +{ + int total; + for (int y = 0; y < 2; y ++) + { + int last=this_mod->waveformData[y][0]; + total=0; + + //get average waveformData level + for (int x = 1; x < 576; x ++) + { + total+=abs(last-this_mod->waveformData[y][x]); + last = this_mod->waveformData[y][x]; + } + total /= 576; + + if (total > 100) total = 100; + } + return total; +} \ No newline at end of file