macosx.cpp // //Module:macosx.cpp //Author:TomHicks //Creation:03-11-2006 //LastEdit:03-11-2006 //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. // #ifdef__APPLE__ //includenecessaryheaderfiles #include"main.h" #include"version.h" usingnamespacestd; //voidInitControls(); unsignedcharTranslateKey(intkeyCode); unsignedcharTranslateButton(intkeyCode); voidHandleConsoleKeyPress(OpenArena::Keyskey); //FunctionDefinitions voidResizeGLScene(GLsizeiwidth,GLsizeiheight) { if(height==0) height=1; glViewport(0,0,width,height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)width/height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); } intDrawGLScene() { level.Render(); g_Screen.SwapBuffers(); returntrue; } // //voidInitControls() //Purpose: //Initializescontrolsbyloadingthedefaultcontrolconfigfile"my.cfg". voidInitControls() { if(!level.LoadConfig("my.cfg")) level.LoadConfig(); } // //intInitGL(GLvoid) //Purpose: //TodoallrequiredsetupbeforecreatinganOpenGLwindow 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; } intmain(intargc,char**argv) { XEventevent; booldone=false; stringcommandLine=""; inti; for(i=1;i<argc;i++) { commandLine=commandLine+""+argv[i]; } level.ParseCmds(commandLine.c_str()); InitControls(); level.glFont.SetScreenDimensions(level.screen.GetWidth()*2,level.screen.GetHeight()*2); if(level.nextLevel=="") { level.LoadMap("intro.map"); } else { level.LoadMap(); } //Hackfornow if(level.screen.GetColorDepth()==32) { level.screen.SetColorDepth(24); } //g_Screen.SetInitializer(newOpenArena::Window::Initializer()); //g_Screen.SetResizer(newOpenArena::Window::Resizer()); if(!g_Screen.Open(OPENARENA_VERSION,level.screen.GetWidth(),level.screen.GetHeight(),level.screen.GetColorDepth(),level.screen.GetFullscreen())) { return1; } level.SetWindow(&g_Screen); level.LoadGLTextures(); while(!done) { while(XPending(g_Screen.GetDisplay())>0) { //EquivalentofWNDPROC XNextEvent(g_Screen.GetDisplay(),&event); switch(event.type) { caseExpose: if(event.xexpose.count!=0) { break; } DrawGLScene(); break; caseConfigureNotify: if((event.xconfigure.width!=g_Screen.GetWidth())||(event.xconfigure.height!=g_Screen.GetHeight())) { g_Screen.SetWidth(event.xconfigure.width); g_Screen.SetHeight(event.xconfigure.height); ResizeGLScene(event.xconfigure.width,event.xconfigure.height); } break; caseButtonPress: keys[TranslateButton(event.xbutton.button)]=true; break; caseButtonRelease: keys[TranslateButton(event.xbutton.button)]=false; keys2[TranslateButton(event.xbutton.button)]=false; break; caseKeyPress: if(level.showConsole) { HandleConsoleKeyPress((OpenArena::Keys)TranslateKey(XLookupKeysym(&event.xkey,0))); } else { keys[TranslateKey(XLookupKeysym(&event.xkey,0))]=true; } break; caseKeyRelease: keys[TranslateKey(XLookupKeysym(&event.xkey,0))]=false; keys2[TranslateKey(XLookupKeysym(&event.xkey,0))]=false; break; caseClientMessage: if(*XGetAtomName(g_Screen.GetDisplay(),event.xclient.message_type)==*"WM_PROTOCOLS") { printf("Exitingsanely...\n"); done=true; } break; default: break; } }//EndEquivalentofWNDPROC if(active) { if(keys[OpenArena::KEY_ESCAPE]) { done=true; } elseif(keys[OpenArena::KEY_F1]) { g_Screen.Close(); g_Screen.ToggleFullscreen(); g_Screen.Open(); } else { level.defaultPlayer[0].camera.Update(); if(!level.showConsole) { if(level.mlook) { level.defaultPlayer[0].camera.SetViewByMouse(g_Screen); } else { //SetMousePosition(g_Screen.width/2,g_Screen.height/2);//Shitthismaybewindowsspecific } //MaybesomeoftheseifnotalmostallshouldbemovedintoLevel //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; } } } } } } } } DrawGLScene(); if(keys[OpenArena::KEY_F1]) { keys[OpenArena::KEY_F1]=false; g_Screen.Close(); g_Screen.ToggleFullscreen(); if(!g_Screen.Open(OPENARENA_VERSION,level.screen.GetWidth(),level.screen.GetHeight(),level.screen.GetColorDepth(),level.screen.GetFullscreen())) { return1; } } } level.UnloadMap(); g_Screen.Close(); exit(0); } //Thisshouldprobablybemovedintooa_input unsignedcharTranslateKey(intkeyCode) { switch(keyCode) { caseXK_BackSpace: returnOpenArena::KEY_BACK; caseXK_Tab: returnOpenArena::KEY_TAB; caseXK_Return: returnOpenArena::KEY_RETURN; caseXK_Escape: returnOpenArena::KEY_ESCAPE; caseXK_Left: returnOpenArena::KEY_LEFT; caseXK_Right: returnOpenArena::KEY_RIGHT; caseXK_Up: returnOpenArena::KEY_UP; caseXK_Down: returnOpenArena::KEY_DOWN; caseXK_Home: returnOpenArena::KEY_HOME; caseXK_End: returnOpenArena::KEY_END; caseXK_Prior: returnOpenArena::KEY_PRIOR; caseXK_Next: returnOpenArena::KEY_NEXT; caseXK_Num_Lock: returnOpenArena::KEY_NUMLOCK; caseXK_KP_Enter: returnOpenArena::KEY_RETURN; caseXK_KP_Home: returnOpenArena::KEY_HOME; caseXK_KP_End: returnOpenArena::KEY_END; caseXK_KP_Prior: returnOpenArena::KEY_PRIOR; caseXK_KP_Next: returnOpenArena::KEY_NEXT; caseXK_KP_0: returnOpenArena::KEY_NUMPAD0; caseXK_KP_1: returnOpenArena::KEY_NUMPAD1; caseXK_KP_2: returnOpenArena::KEY_NUMPAD2; caseXK_KP_3: returnOpenArena::KEY_NUMPAD3; caseXK_KP_4: returnOpenArena::KEY_NUMPAD4; caseXK_KP_5: returnOpenArena::KEY_NUMPAD5; caseXK_KP_6: returnOpenArena::KEY_NUMPAD6; caseXK_KP_7: returnOpenArena::KEY_NUMPAD7; caseXK_KP_8: returnOpenArena::KEY_NUMPAD8; caseXK_KP_9: returnOpenArena::KEY_NUMPAD9; caseXK_KP_Multiply: returnOpenArena::KEY_MULTIPLY; caseXK_KP_Add: returnOpenArena::KEY_ADD; caseXK_KP_Subtract: returnOpenArena::KEY_SUBTRACT; caseXK_KP_Divide: returnOpenArena::KEY_DIVIDE; caseXK_F1: returnOpenArena::KEY_F1; caseXK_F2: returnOpenArena::KEY_F2; caseXK_F3: returnOpenArena::KEY_F3; caseXK_F4: returnOpenArena::KEY_F4; caseXK_F5: returnOpenArena::KEY_F5; caseXK_F6: returnOpenArena::KEY_F6; caseXK_F7: returnOpenArena::KEY_F7; caseXK_F8: returnOpenArena::KEY_F8; caseXK_F9: returnOpenArena::KEY_F9; caseXK_F10: returnOpenArena::KEY_F10; caseXK_F11: returnOpenArena::KEY_F11; caseXK_F12: returnOpenArena::KEY_F12; caseXK_Shift_L: returnOpenArena::KEY_SHIFT; caseXK_Shift_R: returnOpenArena::KEY_SHIFT; caseXK_Control_L: returnOpenArena::KEY_CONTROL; caseXK_Control_R: returnOpenArena::KEY_CONTROL; caseXK_Caps_Lock: returnOpenArena::KEY_CAPITAL; caseXK_Pause: returnOpenArena::KEY_PAUSE; caseXK_KP_Space: caseXK_space: returnOpenArena::KEY_SPACE; caseXK_Insert: returnOpenArena::KEY_INSERT; caseXK_Delete: returnOpenArena::KEY_DELETE; caseXK_KP_Separator: returnOpenArena::KEY_SEPARATOR; caseXK_Scroll_Lock: returnOpenArena::KEY_SCROLL; caseXK_period: returnOpenArena::KEY_OEM_PERIOD; caseXK_plus: returnOpenArena::KEY_OEM_PLUS; caseXK_minus: returnOpenArena::KEY_OEM_MINUS; caseXK_comma: returnOpenArena::KEY_OEM_COMMA; caseXK_0: returnOpenArena::KEY_0; caseXK_1: returnOpenArena::KEY_1; caseXK_2: returnOpenArena::KEY_2; caseXK_3: returnOpenArena::KEY_3; caseXK_4: returnOpenArena::KEY_4; caseXK_5: returnOpenArena::KEY_5; caseXK_6: returnOpenArena::KEY_6; caseXK_7: returnOpenArena::KEY_7; caseXK_8: returnOpenArena::KEY_8; caseXK_9: returnOpenArena::KEY_9; caseXK_a: caseXK_A: returnOpenArena::KEY_A; caseXK_b: caseXK_B: returnOpenArena::KEY_B; caseXK_c: caseXK_C: returnOpenArena::KEY_C; caseXK_d: caseXK_D: returnOpenArena::KEY_D; caseXK_e: caseXK_E: returnOpenArena::KEY_E; caseXK_f: caseXK_F: returnOpenArena::KEY_F; caseXK_g: caseXK_G: returnOpenArena::KEY_G; caseXK_h: caseXK_H: returnOpenArena::KEY_H; caseXK_i: caseXK_I: returnOpenArena::KEY_I; caseXK_j: caseXK_J: returnOpenArena::KEY_J; caseXK_k: caseXK_K: returnOpenArena::KEY_K; caseXK_l: caseXK_L: returnOpenArena::KEY_L; caseXK_m: caseXK_M: returnOpenArena::KEY_M; caseXK_n: caseXK_N: returnOpenArena::KEY_N; caseXK_o: caseXK_O: returnOpenArena::KEY_O; caseXK_p: caseXK_P: returnOpenArena::KEY_P; caseXK_q: caseXK_Q: returnOpenArena::KEY_Q; caseXK_r: caseXK_R: returnOpenArena::KEY_R; caseXK_s: caseXK_S: returnOpenArena::KEY_S; caseXK_t: caseXK_T: returnOpenArena::KEY_T; caseXK_u: caseXK_U: returnOpenArena::KEY_U; caseXK_v: caseXK_V: returnOpenArena::KEY_V; caseXK_w: caseXK_W: returnOpenArena::KEY_W; caseXK_x: caseXK_X: returnOpenArena::KEY_X; caseXK_y: caseXK_Y: returnOpenArena::KEY_Y; caseXK_z: caseXK_Z: returnOpenArena::KEY_Z; caseXK_grave: returnOpenArena::KEY_OEM_3; caseXK_Super_L: returnOpenArena::KEY_LWIN; caseXK_Super_R: returnOpenArena::KEY_RWIN; caseXK_Menu: returnOpenArena::KEY_APPS; caseXK_bracketleft: returnOpenArena::KEY_OEM_4; caseXK_bracketright: returnOpenArena::KEY_OEM_6; caseXK_backslash: returnOpenArena::KEY_OEM_5; caseXK_semicolon: returnOpenArena::KEY_OEM_1; caseXK_apostrophe: returnOpenArena::KEY_OEM_7; caseXK_slash: returnOpenArena::KEY_OEM_2; caseXK_Alt_L: returnOpenArena::KEY_UNKNOWN; caseXK_Alt_R: returnOpenArena::KEY_UNKNOWN; /*Thesekeysdefinatelystillneedtobeaccountedfor `96 pause65299 win65515 apps65383 -45 =61 [91 ]93 \92 ;59 '39 '47 leftalt65513 rightalt65514 #defineKEY_LBUTTON1 #defineKEY_RBUTTON2 #defineKEY_MBUTTON3 #defineKEY_LWIN21 #defineKEY_RWIN22 #defineKEY_APPS23 #defineKEY_OEM_153 #defineKEY_OEM_254 #defineKEY_OEM_355 #defineKEY_OEM_456 #defineKEY_OEM_557 #defineKEY_OEM_658 #defineKEY_OEM_759 */ default: returnOpenArena::KEY_UNKNOWN; } } unsignedcharTranslateButton(intkeyCode) { switch(keyCode) { caseButton1: returnOpenArena::KEY_BUTTON0; caseButton2: returnOpenArena::KEY_BUTTON2; caseButton3: returnOpenArena::KEY_BUTTON1; caseButton4: returnOpenArena::KEY_BUTTON3; caseButton5: returnOpenArena::KEY_BUTTON4; } } 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