windows.cpp // //Module:windows.cpp //Author:TomHicks //Creation:09-01-2003 //LastEdit:06-19-2005 //Editors:TomHicks // //Purpose: //ToimplementtheOpenArenaSDK. // //SummaryofMethods: //Global //-InitControls() //LoadsthedefaultPlayer'sconfiguration. //-InitGL() //InitializesOpenGLandisresponsibleforloadingtextures. //-ResizeGLScene(GLsizeiwidth,GLsizeiheight) //Resizestheviewporttothecurrentsizeofthevisibleareaofthewindowspecifiedbywidthandheight. //-KillGLWindow() //Closesthewindow. //-CreateGLWindow(stringtitle,intwidth,intheight,intbits,boolfullscreenflag) //Createsthewindowwiththespecifiedparameters. //-WinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow) //Mainprocedure. //-WndProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam) //WindowProcedurefortheOpenGLwindow. // #ifdefWIN32 //includenecessaryheaderfiles #include"main.h" #include"version.h" #include"vector.h" //linknecessarylibraries #pragmacomment(lib,"opengl32.lib") #pragmacomment(lib,"glu32.lib") #pragmacomment(lib,"glaux.lib") #pragmacomment(lib,"winmm.lib") //EnsureCDS_FULLSCREENisdefined #ifndefCDS_FULLSCREEN #defineCDS_FULLSCREEN4 #endif usingnamespacestd; voidInitControls(); intInitGL(GLvoid); voidReSizeGLScene(GLsizeiwidth,GLsizeiheight); intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow); LRESULTCALLBACKWndProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam); OpenArena::KeysTranslateKey(intkeyCode); voidHandleConsoleKeyPress(OpenArena::Keyskey); //FunctionDefinitions // //voidInitControls() //Purpose: //Initializescontrolsbyloadingthedefaultcontrolconfigfile"my.cfg". voidInitControls() { if(!level.LoadConfig("my.cfg")) level.LoadConfig(); } // //intInitGL(GLvoid) //Purpose: //TodoallrequiredsetupbeforecreatinganOpenGLwindow //Pre: // //Post: // intInitGL(GLvoid) { level.LoadGLTextures(); glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glClearColor(0.0f,0.0f,0.0f,0.0f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glBlendFunc(GL_SRC_ALPHA,GL_ONE); glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); /*lightingdisabledtemporarily glLightfv(GL_LIGHT1,GL_AMBIENT,level.LightAmbient); for(index=0;index<level.numLights;index++) { glLightfv(GL_LIGHT1,GL_DIFFUSE,level.light[index].color); glLightfv(GL_LIGHT1,GL_POSITION,level.light[index].coords); } glEnable(GL_LIGHT1); glEnable(GL_LIGHTING); */ //BuildFont(); returntrue; } // //GLvoidReSizeGLScene(GLsizeiwidth,GLsizeiheight) //Purpose: //ToresizetheOpenGLwindowalsocalledoncreation //Pre: // //Post: // voidReSizeGLScene(GLsizeiwidth,GLsizeiheight) { if(height==0) height=1; glViewport(0,0,width,height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } LRESULTCALLBACKWndProc(HWNDhWnd, UINTuMsg, WPARAMwParam, LPARAMlParam) { switch(uMsg) { caseWM_ACTIVATE: { if(!HIWORD(wParam)) { active=true; } else { active=false; } return0; } caseWM_SYSCOMMAND: { switch(wParam) { caseSC_SCREENSAVE: caseSC_MONITORPOWER: return0; } break; } caseWM_CLOSE: { PostQuitMessage(0); return0; } caseWM_KEYDOWN: { if(level.showConsole) { HandleConsoleKeyPress((OpenArena::Keys)TranslateKey(wParam)); } else { keys[TranslateKey(wParam)]=true; } return0; } caseWM_KEYUP: { keys[TranslateKey(wParam)]=false; keys2[TranslateKey(wParam)]=false; return0; } caseWM_SYSKEYDOWN: break; caseWM_SIZE: { ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); return0; } caseWM_LBUTTONDOWN: { keys[OpenArena::KEY_LBUTTON]=true; return0; } caseWM_LBUTTONUP: { keys[OpenArena::KEY_LBUTTON]=false; keys[OpenArena::KEY_LBUTTON]=false; return0; } caseWM_RBUTTONDOWN: { keys[OpenArena::KEY_RBUTTON]=true; return0; } caseWM_RBUTTONUP: { keys[OpenArena::KEY_RBUTTON]=false; keys[OpenArena::KEY_RBUTTON]=false; return0; } caseWM_MBUTTONDOWN: { keys[OpenArena::KEY_MBUTTON]=true; return0; } caseWM_MBUTTONUP: { keys[OpenArena::KEY_MBUTTON]=false; keys[OpenArena::KEY_MBUTTON]=false; return0; } } returnDefWindowProc(hWnd,uMsg,wParam,lParam); } intWINAPIWinMain(HINSTANCEhInstance, HINSTANCEhPrevInstance, LPSTRlpCmdLine, intnCmdShow) { MSGmsg; booldone=false; if(strlen(lpCmdLine)) level.ParseCmds(lpCmdLine); InitControls(); g_Screen.SetInitializer(newOpenArena::Window::Initializer()); g_Screen.SetResizer(newOpenArena::Window::Resizer()); if(!g_Screen.Open(string(OPENARENA_VERSION),level.screen.GetWidth(),level.screen.GetHeight(),level.screen.GetColorDepth(),level.screen.GetFullscreen())) { return0; } level.SetWindow(&g_Screen); level.glFont.SetScreenDimensions(level.screen.GetWidth()*2,level.screen.GetHeight()*2); //level.glFont.BuildFont("oa\\textures\\menu\\font.bmp");//(level.gamedir+"\\textures\\menu\\font.bmp").c_str()); if(level.nextLevel=="") { level.LoadMap("intro.map"); } else { level.LoadMap(); } while(!done) { while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if(msg.message==WM_QUIT) { done=true; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } if(active) { if(keys[OpenArena::KEY_ESCAPE]) { done=true; } else { level.defaultPlayer[0].camera.Update(); if(!level.showConsole) { if(level.mlook) { usingOpenArena::Vec2i; //Getthemousedeltaandrotateaccordingly Vec2imousePosition=g_Screen.GetMousePosition(); Vec2imiddleOfScreen=Vec2i(g_Screen.GetWidth()/2,g_Screen.GetHeight()/2); Vec2imouseDelta=mousePosition-middleOfScreen; constfloatMOUSE_SENSATIVITY_HORIZONTAL=1; constfloatMOUSE_SENSATIVITY_VERTICAL=1; floathorizontalAngle=mouseDelta.x*MOUSE_SENSATIVITY_HORIZONTAL; floatverticalAngle=mouseDelta.y*MOUSE_SENSATIVITY_VERTICAL; level.defaultPlayer[0].camera.RotateHorizontal(horizontalAngle); level.defaultPlayer[0].camera.RotateVertical(verticalAngle); //level.defaultPlayer[0].camera.SetViewByMouse(g_Screen); } else { g_Screen.SetMousePosition(Vec2i(g_Screen.GetWidth()/2,g_Screen.GetHeight()/2)); //SetCursorPos(g_Screen.GetWidth()/2,g_Screen.GetHeight()/2); } //MoveBackward if(!level.defaultPlayer->controls.backward.IsEmpty()) { level.defaultPlayer->controls.backward.FirstPosition(); if(keys[level.defaultPlayer->controls.backward.Retrieve()]) { level.defaultPlayer->camera.MoveCamera(-level.moveSpeed); } else { while(level.defaultPlayer->controls.backward.NextPosition()&&(keys[level.defaultPlayer->controls.backward.Retrieve()]!=true)); { if(keys[level.defaultPlayer->controls.backward.Retrieve()]) { level.defaultPlayer->camera.MoveCamera(-level.moveSpeed); } } } } //Moveforward if(!level.defaultPlayer->controls.forward.IsEmpty()) { level.defaultPlayer->controls.forward.FirstPosition(); if(keys[level.defaultPlayer->controls.forward.Retrieve()]) { level.defaultPlayer->camera.MoveCamera(level.moveSpeed); } else { while(level.defaultPlayer->controls.forward.NextPosition()&&(keys[level.defaultPlayer->controls.forward.Retrieve()]!=true)); { if(keys[level.defaultPlayer->controls.forward.Retrieve()]) { level.defaultPlayer->camera.MoveCamera(level.moveSpeed); } } } } //StrafeLeft if(!level.defaultPlayer->controls.moveLeft.IsEmpty()) { level.defaultPlayer->controls.moveLeft.FirstPosition(); if(keys[level.defaultPlayer->controls.moveLeft.Retrieve()]) { level.defaultPlayer->camera.StrafeCamera(-level.moveSpeed); } else { while(level.defaultPlayer->controls.moveLeft.NextPosition()&&(keys[level.defaultPlayer->controls.moveLeft.Retrieve()]!=true)); { if(keys[level.defaultPlayer->controls.moveLeft.Retrieve()]) { level.defaultPlayer->camera.StrafeCamera(-level.moveSpeed); } } } } //StrafeRight if(!level.defaultPlayer->controls.moveRight.IsEmpty()) { level.defaultPlayer->controls.moveRight.FirstPosition(); if(keys[level.defaultPlayer->controls.moveRight.Retrieve()]) { level.defaultPlayer[0].camera.StrafeCamera(level.moveSpeed); } else { while(level.defaultPlayer->controls.moveRight.NextPosition()&&(keys[level.defaultPlayer->controls.moveRight.Retrieve()]!=true)); { if(keys[level.defaultPlayer->controls.moveRight.Retrieve()]) { level.defaultPlayer->camera.StrafeCamera(level.moveSpeed); } } } } //KeyboardLookLeft if(!level.defaultPlayer->controls.lookLeft.IsEmpty()) { level.defaultPlayer->controls.lookLeft.FirstPosition(); if(keys[level.defaultPlayer->controls.lookLeft.Retrieve()]) { level.defaultPlayer[0].camera.RotateView(level.turnSpeed,0,1,0); } else { while(level.defaultPlayer->controls.lookLeft.NextPosition()&&(keys[level.defaultPlayer->controls.lookLeft.Retrieve()]!=true)); { if(keys[level.defaultPlayer->controls.lookLeft.Retrieve()]) { level.defaultPlayer[0].camera.RotateView(level.turnSpeed,0,1,0); } } } } //KeyboardLookRight if(!level.defaultPlayer->controls.lookRight.IsEmpty()) { level.defaultPlayer->controls.lookRight.FirstPosition(); if(keys[level.defaultPlayer->controls.lookRight.Retrieve()]) { level.defaultPlayer->camera.RotateView(-level.turnSpeed,0,1,0); } else { while(level.defaultPlayer->controls.lookRight.NextPosition()&&(keys[level.defaultPlayer->controls.lookRight.Retrieve()]!=true)); { if(keys[level.defaultPlayer->controls.lookRight.Retrieve()]) { level.defaultPlayer->camera.RotateView(-level.turnSpeed,0,1,0); } } } } //KeyboardLookUp if(!level.defaultPlayer->controls.lookUp.IsEmpty()) { level.defaultPlayer->controls.lookUp.FirstPosition(); if(keys[level.defaultPlayer->controls.lookUp.Retrieve()]) { level.defaultPlayer->camera.RotateView(level.turnSpeed,1,0,0); } else { while(level.defaultPlayer->controls.lookUp.NextPosition()&&(keys[level.defaultPlayer->controls.lookUp.Retrieve()]!=true)); { if(keys[level.defaultPlayer->controls.lookUp.Retrieve()]) { level.defaultPlayer->camera.RotateView(level.turnSpeed,1,0,0); } } } } //KeyboardLookDown if(!level.defaultPlayer->controls.lookDown.IsEmpty()) { level.defaultPlayer->controls.lookDown.FirstPosition(); if(keys[level.defaultPlayer->controls.lookDown.Retrieve()]) { level.defaultPlayer->camera.RotateView(-level.turnSpeed,1,0,0); } else { while(level.defaultPlayer->controls.lookDown.NextPosition()&&(keys[level.defaultPlayer->controls.lookDown.Retrieve()]!=true)); { if(keys[level.defaultPlayer->controls.lookDown.Retrieve()]) { level.defaultPlayer->camera.RotateView(-level.turnSpeed,1,0,0); } } } } //ToggleShowFPS if(!level.defaultPlayer->controls.toggleFPS.IsEmpty()) { level.defaultPlayer->controls.toggleFPS.FirstPosition(); if(keys[level.defaultPlayer->controls.toggleFPS.Retrieve()]) { if(!keys2[level.defaultPlayer->controls.toggleFPS.Retrieve()]) { level.showFPS=!level.showFPS; } } else { while(level.defaultPlayer->controls.toggleFPS.NextPosition()&&(keys[level.defaultPlayer->controls.toggleFPS.Retrieve()]!=true)); { if(keys[level.defaultPlayer->controls.toggleFPS.Retrieve()]) { if(!keys2[level.defaultPlayer->controls.toggleFPS.Retrieve()]) { level.showFPS=!level.showFPS; } } } } } //ToggleMouseLook if(!level.defaultPlayer->controls.toggleMouseLook.IsEmpty()) { level.defaultPlayer->controls.toggleMouseLook.FirstPosition(); if(keys[level.defaultPlayer->controls.toggleMouseLook.Retrieve()]) { if(keys2[level.defaultPlayer->controls.toggleMouseLook.Retrieve()]) { level.mlook=!level.mlook; } } else { while(level.defaultPlayer->controls.toggleMouseLook.NextPosition()&&(keys[level.defaultPlayer->controls.toggleMouseLook.Retrieve()]!=true)); { if(keys[level.defaultPlayer->controls.toggleMouseLook.Retrieve()]) { if(keys2[level.defaultPlayer->controls.toggleMouseLook.Retrieve()]) { level.mlook=!level.mlook; } } } } } //ToggleConsole if(!level.defaultPlayer[0].controls.toggleConsole.IsEmpty()) { level.defaultPlayer[0].controls.toggleConsole.FirstPosition(); if(keys[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]) { if(!keys2[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]) { level.showConsole=!level.showConsole; keys2[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]=true; } } else { while(level.defaultPlayer[0].controls.toggleConsole.NextPosition()&&(keys[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]!=true)); { if(keys[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]) { if(!keys2[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]) { level.showConsole=!level.showConsole; keys2[level.defaultPlayer[0].controls.toggleConsole.Retrieve()]=true; } } } } } //QuickMouseLook if(!level.defaultPlayer->controls.quickMouseLook.IsEmpty()) { level.defaultPlayer->controls.quickMouseLook.FirstPosition(); if(keys[level.defaultPlayer->controls.quickMouseLook.Retrieve()]) { if(keys2[level.defaultPlayer->controls.quickMouseLook.Retrieve()]) { level.mlook=!level.mlook; } } else { while(level.defaultPlayer->controls.quickMouseLook.NextPosition()&&(keys[level.defaultPlayer->controls.quickMouseLook.Retrieve()]!=true)); { if(keys[level.defaultPlayer->controls.quickMouseLook.Retrieve()]) { if(keys2[level.defaultPlayer->controls.quickMouseLook.Retrieve()]) { level.mlook=!level.mlook; } } } } } //level.Render(); } level.Render(); // } } g_Screen.SwapBuffers(); if(keys[OpenArena::KEY_F1]) { keys[OpenArena::KEY_F1]=false; g_Screen.Close(); g_Screen.ToggleFullscreen(); if(!g_Screen.Open("OpenArena",g_Screen.GetWidth(),g_Screen.GetHeight(),g_Screen.GetColorDepth(),g_Screen.GetFullscreen())) { return0; } } } level.UnloadMap(); g_Screen.Close(); return(msg.wParam); } OpenArena::KeysTranslateKey(intkeyCode) { switch(keyCode) { caseVK_LEFT: returnOpenArena::KEY_LEFT; caseVK_RIGHT: returnOpenArena::KEY_RIGHT; caseVK_UP: returnOpenArena::KEY_UP; caseVK_DOWN: returnOpenArena::KEY_DOWN; caseVK_SPACE: returnOpenArena::KEY_SPACE; caseVK_RETURN: returnOpenArena::KEY_RETURN; caseVK_SHIFT: returnOpenArena::KEY_SHIFT; caseVK_PAUSE: returnOpenArena::KEY_PAUSE; caseVK_CONTROL: returnOpenArena::KEY_CONTROL; caseVK_CAPITAL: returnOpenArena::KEY_CAPITAL; caseVK_ESCAPE: returnOpenArena::KEY_ESCAPE; caseVK_PRIOR: returnOpenArena::KEY_PRIOR; caseVK_NEXT: returnOpenArena::KEY_NEXT; caseVK_END: returnOpenArena::KEY_END; caseVK_HOME: returnOpenArena::KEY_HOME; caseVK_INSERT: returnOpenArena::KEY_INSERT; caseVK_DELETE: returnOpenArena::KEY_DELETE; caseVK_LWIN: returnOpenArena::KEY_LWIN; caseVK_RWIN: returnOpenArena::KEY_RWIN; caseVK_APPS: returnOpenArena::KEY_APPS; caseVK_NUMPAD0: returnOpenArena::KEY_NUMPAD0; caseVK_NUMPAD1: returnOpenArena::KEY_NUMPAD1; caseVK_NUMPAD2: returnOpenArena::KEY_NUMPAD2; caseVK_NUMPAD3: returnOpenArena::KEY_NUMPAD3; caseVK_NUMPAD4: returnOpenArena::KEY_NUMPAD4; caseVK_NUMPAD5: returnOpenArena::KEY_NUMPAD5; caseVK_NUMPAD6: returnOpenArena::KEY_NUMPAD6; caseVK_NUMPAD7: returnOpenArena::KEY_NUMPAD7; caseVK_NUMPAD8: returnOpenArena::KEY_NUMPAD8; caseVK_NUMPAD9: returnOpenArena::KEY_NUMPAD9; caseVK_MULTIPLY: returnOpenArena::KEY_MULTIPLY; caseVK_ADD: returnOpenArena::KEY_ADD; caseVK_SUBTRACT: returnOpenArena::KEY_SUBTRACT; caseVK_DIVIDE: returnOpenArena::KEY_DIVIDE; caseVK_F1: returnOpenArena::KEY_F1; caseVK_F2: returnOpenArena::KEY_F2; caseVK_F3: returnOpenArena::KEY_F3; caseVK_F4: returnOpenArena::KEY_F4; caseVK_F5: returnOpenArena::KEY_F5; caseVK_F6: returnOpenArena::KEY_F6; caseVK_F7: returnOpenArena::KEY_F7; caseVK_F8: returnOpenArena::KEY_F8; caseVK_F9: returnOpenArena::KEY_F9; caseVK_F10: returnOpenArena::KEY_F10; caseVK_F11: returnOpenArena::KEY_F11; caseVK_F12: returnOpenArena::KEY_F12; caseVK_NUMLOCK: returnOpenArena::KEY_NUMLOCK; caseVK_SCROLL: returnOpenArena::KEY_SCROLL; caseVK_SEPARATOR: returnOpenArena::KEY_SEPARATOR; caseVK_OEM_1: returnOpenArena::KEY_OEM_1; caseVK_OEM_2: returnOpenArena::KEY_OEM_2; caseVK_OEM_3: returnOpenArena::KEY_OEM_3; caseVK_OEM_4: returnOpenArena::KEY_OEM_4; caseVK_OEM_5: returnOpenArena::KEY_OEM_5; caseVK_OEM_6: returnOpenArena::KEY_OEM_6; caseVK_OEM_7: returnOpenArena::KEY_OEM_7; caseVK_OEM_PERIOD: returnOpenArena::KEY_OEM_PERIOD; caseVK_OEM_PLUS: returnOpenArena::KEY_OEM_PLUS; caseVK_OEM_MINUS: returnOpenArena::KEY_OEM_MINUS; caseVK_OEM_COMMA: returnOpenArena::KEY_OEM_COMMA; caseVK_BACK: returnOpenArena::KEY_BACK; caseVK_TAB: returnOpenArena::KEY_TAB; case'0': returnOpenArena::KEY_0; case'1': returnOpenArena::KEY_1; case'2': returnOpenArena::KEY_2; case'3': returnOpenArena::KEY_3; case'4': returnOpenArena::KEY_4; case'5': returnOpenArena::KEY_5; case'6': returnOpenArena::KEY_6; case'7': returnOpenArena::KEY_7; case'8': returnOpenArena::KEY_8; case'9': returnOpenArena::KEY_9; case'A': returnOpenArena::KEY_A; case'B': returnOpenArena::KEY_B; case'C': returnOpenArena::KEY_C; case'D': returnOpenArena::KEY_D; case'E': returnOpenArena::KEY_E; case'F': returnOpenArena::KEY_F; case'G': returnOpenArena::KEY_G; case'H': returnOpenArena::KEY_H; case'I': returnOpenArena::KEY_I; case'J': returnOpenArena::KEY_J; case'K': returnOpenArena::KEY_K; case'L': returnOpenArena::KEY_L; case'M': returnOpenArena::KEY_M; case'N': returnOpenArena::KEY_N; case'O': returnOpenArena::KEY_O; case'P': returnOpenArena::KEY_P; case'Q': returnOpenArena::KEY_Q; case'R': returnOpenArena::KEY_R; case'S': returnOpenArena::KEY_S; case'T': returnOpenArena::KEY_T; case'U': returnOpenArena::KEY_U; case'V': returnOpenArena::KEY_V; case'W': returnOpenArena::KEY_W; case'X': returnOpenArena::KEY_X; case'Y': returnOpenArena::KEY_Y; case'Z': returnOpenArena::KEY_Z; caseVK_LBUTTON: returnOpenArena::KEY_LBUTTON; caseVK_RBUTTON: returnOpenArena::KEY_RBUTTON; caseVK_MBUTTON: returnOpenArena::KEY_MBUTTON; default: returnOpenArena::KEY_UNKNOWN; } } voidHandleConsoleKeyPress(OpenArena::Keyskey) { //Seeifweneedtohidetheconsole level.defaultPlayer[0].controls.toggleConsole.FirstPosition(); if(key==level.defaultPlayer[0].controls.toggleConsole.Retrieve()) { level.showConsole=false; } else { while(level.defaultPlayer[0].controls.toggleConsole.NextPosition()&&level.showConsole) { if(level.defaultPlayer[0].controls.toggleConsole.Retrieve()==key) { level.showConsole=false; } } } switch(key) { caseOpenArena::KEY_SHIFT: keys[OpenArena::KEY_SHIFT]=true; break; caseOpenArena::KEY_RETURN: level.UpdateConsole('\n'); break; caseOpenArena::KEY_SPACE: printf("hello"); level.UpdateConsole(''); break; caseOpenArena::KEY_BACK: level.UpdateConsole(OpenArena::KEY_BACK); break; default: charascii=OpenArena::KeyToASCII(key,keys[OpenArena::KEY_SHIFT]); if(ascii!='\0') { level.UpdateConsole(ascii); } } } #endif