void VID_Close() { Sys_Thread_LockMutex(display_mutex); #ifndef GLQUAKE VID_SW_FreeBuffers(); #endif Skin_Shutdown(); Mod_ClearAll(); SCR_Shutdown(); Sbar_Shutdown(); M_VidShutdown(); Draw_Shutdown(); CSTC_PictureShutdown(); if (display) { R_Shutdown(); Sys_Video_Close(display); display = 0; } Sys_Thread_UnlockMutex(display_mutex); }
void Draw_Scene(void (*drawFunc) (void)) { #if defined(USE_OPENGL) Uint8 *keys; matrix_t rotation; vec3_t forward, right, up; qboolean mouseGrabbed; qboolean mouseGrabbedLastFrame; int oldTime, newTime, deltaTime; // for frame independent movement mouseGrabbed = qfalse; mouseGrabbedLastFrame = qfalse; oldTime = SDL_GetTicks(); while(1) { SDL_Event event; newTime = SDL_GetTicks(); deltaTime = newTime - oldTime; //Sys_Printf(" deltaTime (%5.2f seconds)\n", (deltaTime / 1000.0)); MatrixFromAngles(rotation, drawAngles[PITCH], drawAngles[YAW], drawAngles[ROLL]); MatrixToVectorsFRU(rotation, forward, right, up); while(SDL_PollEvent(&event)) { switch (event.type) { case SDL_VIDEORESIZE: { drawScreen = SDL_SetVideoMode(event.resize.w, event.resize.h, drawVideo->vfmt->BitsPerPixel, SDL_OPENGL | SDL_RESIZABLE); if(drawScreen) { Reshape(drawScreen->w, drawScreen->h); } else { /* Uh oh, we couldn't set the new video mode?? */ ; } break; } case SDL_MOUSEMOTION: { if(mouseGrabbed && !mouseGrabbedLastFrame) { drawAngles[PITCH] += event.motion.yrel; drawAngles[YAW] -= event.motion.xrel; } mouseGrabbedLastFrame = qfalse; break; } case SDL_MOUSEBUTTONDOWN: { switch (event.button.button) { case 3: { // K_MOUSE2; if(!mouseGrabbed) { SDL_WM_GrabInput(SDL_GRAB_ON); SDL_ShowCursor(0); mouseGrabbed = qtrue; mouseGrabbedLastFrame = qtrue; } else { SDL_ShowCursor(1); SDL_WM_GrabInput(SDL_GRAB_OFF); mouseGrabbed = qfalse; } break; } default: break; } break; } case SDL_QUIT: { Draw_Shutdown(); return; } default: break; } } keys = SDL_GetKeyState(NULL); if(keys[SDLK_ESCAPE]) { Draw_Shutdown(); return; } if(keys[SDLK_w]) { if(SDL_GetModState() & KMOD_SHIFT) { VectorMA(drawOrigin, 0.5 * deltaTime, forward, drawOrigin); } else { VectorMA(drawOrigin, 1.0 * deltaTime, forward, drawOrigin); } } if(keys[SDLK_s]) { if(SDL_GetModState() & KMOD_SHIFT) { VectorMA(drawOrigin, -0.5 * deltaTime, forward, drawOrigin); } else { VectorMA(drawOrigin, -1.0 * deltaTime, forward, drawOrigin); } } if(keys[SDLK_a]) { if(SDL_GetModState() & KMOD_SHIFT) { VectorMA(drawOrigin, -0.5 * deltaTime, right, drawOrigin); } else { VectorMA(drawOrigin, -1.0 * deltaTime, right, drawOrigin); } } if(keys[SDLK_d]) { if(SDL_GetModState() & KMOD_SHIFT) { VectorMA(drawOrigin, 0.5 * deltaTime, right, drawOrigin); } else { VectorMA(drawOrigin, 1.0 * deltaTime, right, drawOrigin); } } if(keys[SDLK_SPACE]) { //drawOrigin[2] += 1.0 * deltaTime; if(SDL_GetModState() & KMOD_SHIFT) { VectorMA(drawOrigin, 0.5 * deltaTime, up, drawOrigin); } else { VectorMA(drawOrigin, 1.0 * deltaTime, up, drawOrigin); } } if(keys[SDLK_c]) { //drawOrigin[2] -= 1.0 * deltaTime; if(SDL_GetModState() & KMOD_SHIFT) { VectorMA(drawOrigin, -0.5 * deltaTime, up, drawOrigin); } else { VectorMA(drawOrigin, -1.0 * deltaTime, up, drawOrigin); } } if(keys[SDLK_UP]) { drawAngles[PITCH] -= 1.0 * deltaTime; } if(keys[SDLK_DOWN]) { drawAngles[PITCH] += 1.0 * deltaTime; } if(keys[SDLK_LEFT]) { drawAngles[YAW] += 1.0 * deltaTime; } if(keys[SDLK_RIGHT]) { drawAngles[YAW] -= 1.0 * deltaTime; } // check to make sure the angles haven't wrapped if(drawAngles[PITCH] < -90) { drawAngles[PITCH] = -90; } else if(drawAngles[PITCH] > 90) { drawAngles[PITCH] = 90; } Draw_BeginScene(); drawFunc(); Draw_EndScene(); oldTime = newTime; } #endif // #if defined(USE_OPENGL) }