void initial() { initializeSpheres(); glClearColor (0.9, 0.9, 0.9, 0.0); glShadeModel (GL_SMOOTH); // may be pointless in this program }
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); }
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; i<MAXSPHERES; i++) { changeColor(&sphere[i], COLOR); } initializeSpheres(); } if(keys['X']&&NUMSPHERES<MAXSPHERES) { //increase number of spheres NUMSPHERES++; initializeSpheres(); } if((keys['Z']||keys['Y'])&&NUMSPHERES>MINSPHERES) { //decrease number of spheres NUMSPHERES--; changeColor(&sphere[NUMSPHERES], COLOR); //RESET COLOR initializeSpheres(); } if(keys['I']&&NUMSEC<MAXSEC) { //increase Airtime NUMSEC+=0.1; } if(keys['U']&&NUMSEC>MINSEC) { //decrease Airtime NUMSEC-=0.1; } if(keys['K']&&SPEEDFACTOR<MAXSPEEDFACTOR) { //increase Speedfactor SPEEDFACTOR+=0.1; } if(keys['J']&&SPEEDFACTOR>MINSPEEDFACTOR) { //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; i<NUMSPHERES; i++) { changeColor(&sphere[i], COLOR); } } if(keys['M']&&COLOR<MAXCOLOR) { //switch through colors COLOR++; for(int i=0; i<NUMSPHERES; i++) { changeColor(&sphere[i], COLOR); } } if(keys['N']&&COLOR>MINCOLOR) { //switch through colors COLOR--; for(int i=0; i<NUMSPHERES; i++) { changeColor(&sphere[i], COLOR); } } if(keys['W']) { //switch waveformcircles on/off WAVEFORMCIRCLES = (WAVEFORMCIRCLES == true)?false:true; } if(keys['A']) { //switch balls on/off SPHERES = (SPHERES == true)?false:true; } if(keys['T']) { //switch balls on/off SQUASH = (SQUASH == true)?false:true; } }