/* ============== VID_LoadRefresh ============== */ qboolean VID_LoadRefresh( char *name ) { refimport_t ri; #ifndef REF_HARD_LINKED GetRefAPI_t GetRefAPI; #endif char fn[MAX_OSPATH]; struct stat st; extern uid_t saved_euid; FILE *fp; if ( reflib_active ) { if (KBD_Close_fp) KBD_Close_fp(); if (RW_IN_Shutdown_fp) RW_IN_Shutdown_fp(); KBD_Close_fp = NULL; RW_IN_Shutdown_fp = NULL; re.Shutdown(); VID_FreeReflib (); } #ifndef REF_HARD_LINKED // Vladimir // load config char so_file [MAX_QPATH]; // Conf: /{fs_basedir}/{gamedir}/quake2.conf Com_sprintf(so_file, sizeof(so_file), "%s/quake2.conf", FS_Gamedir() ); Sys_Printf( "------- Loading %s (%s) -------\n", name, so_file ); //regain root seteuid(saved_euid); // read config if ((fp = fopen(so_file, "r")) == NULL) { Com_Printf( "LoadLibrary(\"%s\") failed: can't open %s (required for location of ref libraries)\n", name, so_file); return false; } fgets(fn, sizeof(fn), fp); fclose(fp); while (*fn && isspace(fn[strlen(fn) - 1])) fn[strlen(fn) - 1] = 0; // Vladimir Append /lib strcat(fn, "/lib"); strcat(fn, name); // permission checking if (strstr(fn, "softx") == NULL) { // softx doesn't require root if (stat(fn, &st) == -1) { Com_Printf( "LoadLibrary(\"%s\" - %s) failed: %s\n", name, fn, strerror(errno)); return false; } } else { // softx requires we give up root now setreuid(getuid(), getuid()); setegid(getgid()); } if ( ( reflib_library = dlopen( fn, RTLD_LAZY | RTLD_GLOBAL ) ) == 0 ) { Com_Printf( "LoadLibrary(\"%s\", %s) failed: %s\n", name , fn, dlerror()); return false; } Sys_Printf( "LoadLibrary(\"%s\")\n", fn ); #endif ri.Cmd_AddCommand = Cmd_AddCommand; ri.Cmd_RemoveCommand = Cmd_RemoveCommand; ri.Cmd_Argc = Cmd_Argc; ri.Cmd_Argv = Cmd_Argv; ri.Cmd_ExecuteText = Cbuf_ExecuteText; ri.Con_Printf = VID_Printf; ri.Sys_Error = VID_Error; ri.FS_LoadFile = FS_LoadFile; ri.FS_FreeFile = FS_FreeFile; ri.FS_Gamedir = FS_Gamedir; ri.Cvar_Get = Cvar_Get; ri.Cvar_Set = Cvar_Set; ri.Cvar_SetValue = Cvar_SetValue; ri.Vid_GetModeInfo = VID_GetModeInfo; ri.Vid_MenuInit = VID_MenuInit; ri.Vid_NewWindow = VID_NewWindow; ri.Vid_SwapBuffers = VID_SwapBuffers; // Vladimir JNI swap buffers #ifndef REF_HARD_LINKED if ( ( GetRefAPI = (void *) dlsym( reflib_library, "GetRefAPI" ) ) == 0 ) Com_Error( ERR_FATAL, "dlsym failed on %s", name ); #endif re = GetRefAPI( ri ); if (re.api_version != API_VERSION) { VID_FreeReflib (); Com_Error (ERR_FATAL, "%s has incompatible api_version", name); } /* Init IN (Mouse) */ in_state.IN_CenterView_fp = IN_CenterView; in_state.Key_Event_fp = Do_Key_Event; in_state.viewangles = cl.viewangles; in_state.in_strafe_state = &in_strafe.state; #ifndef REF_HARD_LINKED if ((RW_IN_Init_fp = dlsym(reflib_library, "RW_IN_Init")) == NULL || (RW_IN_Shutdown_fp = dlsym(reflib_library, "RW_IN_Shutdown")) == NULL || (RW_IN_Activate_fp = dlsym(reflib_library, "RW_IN_Activate")) == NULL || (RW_IN_Commands_fp = dlsym(reflib_library, "RW_IN_Commands")) == NULL || (RW_IN_Move_fp = dlsym(reflib_library, "RW_IN_Move")) == NULL || (RW_IN_Frame_fp = dlsym(reflib_library, "RW_IN_Frame")) == NULL) Sys_Error("No RW_IN functions in REF.\n"); #else Real_IN_Init(); #endif if ( re.Init( 0, 0 ) == -1 ) { re.Shutdown(); VID_FreeReflib (); return false; } /* Init KBD */ #ifndef REF_HARD_LINKED if ((KBD_Init_fp = dlsym(reflib_library, "KBD_Init")) == NULL || (KBD_Update_fp = dlsym(reflib_library, "KBD_Update")) == NULL || (KBD_Close_fp = dlsym(reflib_library, "KBD_Close")) == NULL) Sys_Error("No KBD functions in REF.\n"); #else { void KBD_Init(void); void KBD_Update(void); void KBD_Close(void); KBD_Init_fp = KBD_Init; KBD_Update_fp = KBD_Update; KBD_Close_fp = KBD_Close; } #endif KBD_Init_fp(Do_Key_Event); // give up root now setreuid(getuid(), getuid()); setegid(getgid()); Sys_Printf( "------------------------------------\n"); reflib_active = true; return true; }
void VID_Shutdown (void) { if (re.Shutdown) re.Shutdown (); }
/* ============== VID_LoadRefresh ============== */ qboolean VID_LoadRefresh( char *name ) { refimport_t ri; GetRefAPI_t GetRefAPI; if ( reflib_active ) { re.Shutdown(); VID_FreeReflib (); } Com_Printf( "------- Loading %s -------\n", name ); if ( ( reflib_library = LoadLibrary( name ) ) == 0 ) { Com_Printf( "LoadLibrary(\"%s\") failed\n", name ); return false; } ri.Cmd_AddCommand = Cmd_AddCommand; ri.Cmd_RemoveCommand = Cmd_RemoveCommand; ri.Cmd_Argc = Cmd_Argc; ri.Cmd_Argv = Cmd_Argv; ri.Cmd_ExecuteText = Cbuf_ExecuteText; ri.Con_Printf = VID_Printf; ri.Sys_Error = VID_Error; ri.FS_LoadFile = FS_LoadFile; ri.FS_FreeFile = FS_FreeFile; ri.FS_Gamedir = FS_Gamedir; ri.Cvar_Get = Cvar_Get; ri.Cvar_Set = Cvar_Set; ri.Cvar_SetValue = Cvar_SetValue; ri.Vid_GetModeInfo = VID_GetModeInfo; ri.Vid_MenuInit = VID_MenuInit; ri.Vid_NewWindow = VID_NewWindow; if ( ( GetRefAPI = (void *) GetProcAddress( reflib_library, "GetRefAPI" ) ) == 0 ) Com_Error( ERR_FATAL, "GetProcAddress failed on %s", name ); re = GetRefAPI( ri ); if (re.api_version != API_VERSION) { VID_FreeReflib (); Com_Error (ERR_FATAL, "%s has incompatible api_version", name); } if ( re.Init( global_hInstance, MainWndProc ) == -1 ) { re.Shutdown(); VID_FreeReflib (); return false; } Com_Printf( "------------------------------------\n"); reflib_active = true; //====== //PGM vidref_val = VIDREF_OTHER; if(vid_ref) { if(!strcmp (vid_ref->string, "gl")) vidref_val = VIDREF_GL; else if(!strcmp(vid_ref->string, "soft")) vidref_val = VIDREF_SOFT; } //PGM //====== return true; }
void Com_Frame( void ) { try { int timeBeforeFirstEvents = 0, timeBeforeServer = 0, timeBeforeEvents = 0, timeBeforeClient = 0, timeAfter = 0; int msec, minMsec; static int lastTime = 0; // write config file if anything changed Com_WriteConfiguration(); // if "viewlog" has been modified, show or hide the log console if ( com_viewlog->modified ) { Sys_ShowConsole( com_viewlog->integer, qfalse ); com_viewlog->modified = qfalse; } // // main event loop // if ( com_speeds->integer ) { timeBeforeFirstEvents = Sys_Milliseconds (); } // we may want to spin here if things are going too fast if ( com_maxfps->integer > 0 ) { minMsec = 1000 / com_maxfps->integer; } else { minMsec = 1; } do { com_frameTime = Com_EventLoop(); if ( lastTime > com_frameTime ) { lastTime = com_frameTime; // possible on first frame } msec = com_frameTime - lastTime; } while ( msec < minMsec ); Cbuf_Execute (); lastTime = com_frameTime; // mess with msec if needed com_frameMsec = msec; float fractionMsec=0.0f; msec = Com_ModifyMsec( msec, fractionMsec); // // server side // if ( com_speeds->integer ) { timeBeforeServer = Sys_Milliseconds (); } SV_Frame (msec, fractionMsec); // // client system // // if ( !com_dedicated->integer ) { // // run event loop a second time to get server to client packets // without a frame of latency // if ( com_speeds->integer ) { timeBeforeEvents = Sys_Milliseconds (); } Com_EventLoop(); Cbuf_Execute (); // // client side // if ( com_speeds->integer ) { timeBeforeClient = Sys_Milliseconds (); } CL_Frame (msec, fractionMsec); if ( com_speeds->integer ) { timeAfter = Sys_Milliseconds (); } } // // report timing information // if ( com_speeds->integer ) { int all, sv, ev, cl; all = timeAfter - timeBeforeServer; sv = timeBeforeEvents - timeBeforeServer; ev = timeBeforeServer - timeBeforeFirstEvents + timeBeforeClient - timeBeforeEvents; cl = timeAfter - timeBeforeClient; sv -= time_game; cl -= time_frontend + time_backend; Com_Printf("fr:%i all:%3i sv:%3i ev:%3i cl:%3i gm:%3i tr:%3i pvs:%3i rf:%3i bk:%3i\n", com_frameNumber, all, sv, ev, cl, time_game, timeInTrace, timeInPVSCheck, time_frontend, time_backend); // speedslog if ( com_speedslog && com_speedslog->integer ) { if(!speedslog) { speedslog = FS_FOpenFileWrite("speeds.log"); FS_Write("data={\n", strlen("data={\n"), speedslog); bComma=false; if ( com_speedslog->integer > 1 ) { // force it to not buffer so we get valid // data even if we are crashing FS_ForceFlush(logfile); } } if (speedslog) { char msg[MAXPRINTMSG]; if(bComma) { FS_Write(",\n", strlen(",\n"), speedslog); bComma=false; } FS_Write("{", strlen("{"), speedslog); Com_sprintf(msg,sizeof(msg), "%8.4f,%8.4f,%8.4f,%8.4f,%8.4f,%8.4f,",corg[0],corg[1],corg[2],cangles[0],cangles[1],cangles[2]); FS_Write(msg, strlen(msg), speedslog); Com_sprintf(msg,sizeof(msg), "%i,%3i,%3i,%3i,%3i,%3i,%3i,%3i,%3i,%3i}", com_frameNumber, all, sv, ev, cl, time_game, timeInTrace, timeInPVSCheck, time_frontend, time_backend); FS_Write(msg, strlen(msg), speedslog); bComma=true; } } timeInTrace = timeInPVSCheck = 0; } // // trace optimization tracking // if ( com_showtrace->integer ) { extern int c_traces, c_brush_traces, c_patch_traces; extern int c_pointcontents; /* Com_Printf( "%4i non-sv_traces, %4i sv_traces, %4i ms, ave %4.2f ms\n", c_traces - numTraces, numTraces, timeInTrace, (float)timeInTrace/(float)numTraces ); timeInTrace = numTraces = 0; c_traces = 0; */ Com_Printf ("%4i traces (%ib %ip) %4i points\n", c_traces, c_brush_traces, c_patch_traces, c_pointcontents); c_traces = 0; c_brush_traces = 0; c_patch_traces = 0; c_pointcontents = 0; } com_frameNumber++; } catch ( int code ) { Com_CatchError (code); Com_Printf ("%s\n", Com_ErrorString (code)); return; } #ifdef G2_PERFORMANCE_ANALYSIS if (com_G2Report && com_G2Report->integer) { re.G2Time_ReportTimers(); } re.G2Time_ResetTimers(); #endif }
/* ============== VID_LoadRefresh ============== */ qboolean VID_LoadRefresh( char *name ) { refimport_t ri; GetRefAPI_t GetRefAPI; char fn[MAX_OSPATH]; struct stat st; extern uid_t saved_euid; FILE *fp; if ( reflib_active ) { if (KBD_Close_fp) KBD_Close_fp(); if (RW_IN_Shutdown_fp) RW_IN_Shutdown_fp(); KBD_Close_fp = NULL; RW_IN_Shutdown_fp = NULL; re.Shutdown(); VID_FreeReflib (); } Com_Printf( "------- Loading %s -------\n", name ); //regain root seteuid(saved_euid); if ((fp = fopen(so_file, "r")) == NULL) { Com_Printf( "LoadLibrary(\"%s\") failed: can't open %s (required for location of ref libraries)\n", name, so_file); return false; } fgets(fn, sizeof(fn), fp); fclose(fp); while (*fn && isspace(fn[strlen(fn) - 1])) fn[strlen(fn) - 1] = 0; strcat(fn, "/"); strcat(fn, name); // permission checking if (strstr(fn, "softx") == NULL) { // softx doesn't require root if (stat(fn, &st) == -1) { Com_Printf( "LoadLibrary(\"%s\") failed: %s\n", name, strerror(errno)); return false; } #if 0 if (st.st_uid != 0) { Com_Printf( "LoadLibrary(\"%s\") failed: ref is not owned by root\n", name); return false; } if ((st.st_mode & 0777) & ~0700) { Com_Printf( "LoadLibrary(\"%s\") failed: invalid permissions, must be 700 for security considerations\n", name); return false; } #endif } else { // softx requires we give up root now setreuid(getuid(), getuid()); setegid(getgid()); } if ( ( reflib_library = dlopen( fn, RTLD_LAZY | RTLD_GLOBAL ) ) == 0 ) { Com_Printf( "LoadLibrary(\"%s\") failed: %s\n", name , dlerror()); return false; } Com_Printf( "LoadLibrary(\"%s\")\n", fn ); ri.Cmd_AddCommand = Cmd_AddCommand; ri.Cmd_RemoveCommand = Cmd_RemoveCommand; ri.Cmd_Argc = Cmd_Argc; ri.Cmd_Argv = Cmd_Argv; ri.Cmd_ExecuteText = Cbuf_ExecuteText; ri.Con_Printf = VID_Printf; ri.Sys_Error = VID_Error; ri.FS_LoadFile = FS_LoadFile; ri.FS_FreeFile = FS_FreeFile; ri.FS_Gamedir = FS_Gamedir; ri.Cvar_Get = Cvar_Get; ri.Cvar_Set = Cvar_Set; ri.Cvar_SetValue = Cvar_SetValue; ri.Vid_GetModeInfo = VID_GetModeInfo; ri.Vid_MenuInit = VID_MenuInit; ri.Vid_NewWindow = VID_NewWindow; if ( ( GetRefAPI = (void *) dlsym( reflib_library, "GetRefAPI" ) ) == 0 ) Com_Error( ERR_FATAL, "dlsym failed on %s", name ); re = GetRefAPI( ri ); if (re.api_version != API_VERSION) { VID_FreeReflib (); Com_Error (ERR_FATAL, "%s has incompatible api_version", name); } /* Init IN (Mouse) */ in_state.IN_CenterView_fp = IN_CenterView; in_state.Key_Event_fp = Do_Key_Event; in_state.viewangles = cl.viewangles; in_state.in_strafe_state = &in_strafe.state; if ((RW_IN_Init_fp = dlsym(reflib_library, "RW_IN_Init")) == NULL || (RW_IN_Shutdown_fp = dlsym(reflib_library, "RW_IN_Shutdown")) == NULL || (RW_IN_Activate_fp = dlsym(reflib_library, "RW_IN_Activate")) == NULL || (RW_IN_Commands_fp = dlsym(reflib_library, "RW_IN_Commands")) == NULL || (RW_IN_Move_fp = dlsym(reflib_library, "RW_IN_Move")) == NULL || (RW_IN_Frame_fp = dlsym(reflib_library, "RW_IN_Frame")) == NULL) Sys_Error("No RW_IN functions in REF.\n"); Real_IN_Init(); if ( re.Init( 0, 0 ) == -1 ) { re.Shutdown(); VID_FreeReflib (); return false; } /* Init KBD */ #if 1 if ((KBD_Init_fp = dlsym(reflib_library, "KBD_Init")) == NULL || (KBD_Update_fp = dlsym(reflib_library, "KBD_Update")) == NULL || (KBD_Close_fp = dlsym(reflib_library, "KBD_Close")) == NULL) Sys_Error("No KBD functions in REF.\n"); #else { void KBD_Init(void); void KBD_Update(void); void KBD_Close(void); KBD_Init_fp = KBD_Init; KBD_Update_fp = KBD_Update; KBD_Close_fp = KBD_Close; } #endif KBD_Init_fp(Do_Key_Event); // give up root now setreuid(getuid(), getuid()); setegid(getgid()); Com_Printf( "------------------------------------\n"); reflib_active = true; return true; }
/* ==================== MainWndProc main window procedure ==================== */ LONG WINAPI MainWndProc ( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { LONG lRet = 0; if ( uMsg == MSH_MOUSEWHEEL ) { if ( ( ( int ) wParam ) > 0 ) { Key_Event( K_MWHEELUP, true, sys_msg_time ); Key_Event( K_MWHEELUP, false, sys_msg_time ); } else { Key_Event( K_MWHEELDOWN, true, sys_msg_time ); Key_Event( K_MWHEELDOWN, false, sys_msg_time ); } return DefWindowProc (hWnd, uMsg, wParam, lParam); } switch (uMsg) { case WM_MOUSEWHEEL: /* ** this chunk of code theoretically only works under NT4 and Win98 ** since this message doesn't exist under Win95 */ if ( ( short ) HIWORD( wParam ) > 0 ) { Key_Event( K_MWHEELUP, true, sys_msg_time ); Key_Event( K_MWHEELUP, false, sys_msg_time ); } else { Key_Event( K_MWHEELDOWN, true, sys_msg_time ); Key_Event( K_MWHEELDOWN, false, sys_msg_time ); } break; case WM_HOTKEY: return 0; case WM_CREATE: cl_hwnd = hWnd; MSH_MOUSEWHEEL = RegisterWindowMessage("MSWHEEL_ROLLMSG"); return DefWindowProc (hWnd, uMsg, wParam, lParam); case WM_PAINT: SCR_DirtyScreen (); // force entire screen to update next frame return DefWindowProc (hWnd, uMsg, wParam, lParam); case WM_DESTROY: // let sound and input know about this? cl_hwnd = NULL; return DefWindowProc (hWnd, uMsg, wParam, lParam); case WM_ACTIVATE: { int fActive, fMinimized; // KJB: Watch this for problems in fullscreen modes with Alt-tabbing. fActive = LOWORD(wParam); fMinimized = (BOOL) HIWORD(wParam); AppActivate( fActive != WA_INACTIVE, fMinimized); if ( reflib_active ) re.AppActivate( !( fActive == WA_INACTIVE ) ); } return DefWindowProc (hWnd, uMsg, wParam, lParam); case WM_MOVE: { int xPos, yPos; RECT r; int style; if (!vid_fullscreen->value) { xPos = (short) LOWORD(lParam); // horizontal position yPos = (short) HIWORD(lParam); // vertical position r.left = 0; r.top = 0; r.right = 1; r.bottom = 1; style = GetWindowLong( hWnd, GWL_STYLE ); AdjustWindowRect( &r, style, FALSE ); Cvar_SetValue( "vid_xpos", xPos + r.left); Cvar_SetValue( "vid_ypos", yPos + r.top); vid_xpos->modified = false; vid_ypos->modified = false; if (ActiveApp) IN_Activate (true); } } return DefWindowProc (hWnd, uMsg, wParam, lParam); // this is complicated because Win32 seems to pack multiple mouse events into // one update sometimes, so we always check all states and look for events case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_RBUTTONDOWN: case WM_RBUTTONUP: case WM_MBUTTONDOWN: case WM_MBUTTONUP: case WM_MOUSEMOVE: { int temp; temp = 0; if (wParam & MK_LBUTTON) temp |= 1; if (wParam & MK_RBUTTON) temp |= 2; if (wParam & MK_MBUTTON) temp |= 4; IN_MouseEvent (temp); } break; case WM_SYSCOMMAND: if ( wParam == SC_SCREENSAVE ) return 0; return DefWindowProc (hWnd, uMsg, wParam, lParam); case WM_SYSKEYDOWN: if ( wParam == 13 ) { if ( vid_fullscreen ) { Cvar_SetValue( "vid_fullscreen", !vid_fullscreen->value ); } return 0; } // fall through case WM_KEYDOWN: Key_Event( MapKey( lParam ), true, sys_msg_time); break; case WM_SYSKEYUP: case WM_KEYUP: Key_Event( MapKey( lParam ), false, sys_msg_time); break; case MM_MCINOTIFY: { LONG CDAudio_MessageHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); lRet = CDAudio_MessageHandler (hWnd, uMsg, wParam, lParam); } break; default: // pass all unhandled messages to DefWindowProc return DefWindowProc (hWnd, uMsg, wParam, lParam); } /* return 0 if handled message, 1 if not */ return DefWindowProc( hWnd, uMsg, wParam, lParam ); }
//RAZFIXME: BAD BAD, maybe? had to move it out of ghoul2_shared.h -> CGhoul2Info_v at the least.. IGhoul2InfoArray &_TheGhoul2InfoArray( void ) { return re.TheGhoul2InfoArray(); }
void VID_Init (void) { TR; refimport_t ri; viddef.width = 320; viddef.height = 240; ri.Cmd_AddCommand = Cmd_AddCommand; ri.Cmd_RemoveCommand = Cmd_RemoveCommand; ri.Cmd_Argc = Cmd_Argc; ri.Cmd_Argv = Cmd_Argv; ri.Cmd_ExecuteText = Cbuf_ExecuteText; ri.Con_Printf = VID_Printf; ri.Sys_Error = VID_Error; ri.FS_LoadFile = FS_LoadFile; ri.FS_FreeFile = FS_FreeFile; ri.FS_Gamedir = FS_Gamedir; ri.Vid_MenuInit = VID_MenuInit; ri.Vid_NewWindow = VID_NewWindow; ri.Cvar_Get = Cvar_Get; ri.Cvar_Set = Cvar_Set; ri.Cvar_SetValue = Cvar_SetValue; ri.Vid_GetModeInfo = VID_GetModeInfo; re = GetRefAPI(ri); xe=&_xe; Xe_Init(xe); edram_init(xe); Xe_SetRenderTarget(xe, Xe_GetFramebufferSurface(xe)); static const struct XenosVBFFormat vbf = { 3, { {XE_USAGE_POSITION, 0, XE_TYPE_FLOAT4}, {XE_USAGE_COLOR, 0, XE_TYPE_UBYTE4}, {XE_USAGE_TEXCOORD, 0, XE_TYPE_FLOAT2}, } }; pPixelShader = Xe_LoadShaderFromMemory(xe, (void*) g_xps_PS); Xe_InstantiateShader(xe, pPixelShader, 0); pVertexShader = Xe_LoadShaderFromMemory(xe, (void*) g_xvs_VS); Xe_InstantiateShader(xe, pVertexShader, 0); Xe_ShaderApplyVFetchPatches(xe, pVertexShader, 0, &vbf); // Create vb pVBSw = Xe_CreateVertexBuffer(xe, 3 * sizeof (DrawVerticeFormats)); DrawVerticeFormats *Rect = Xe_VB_Lock(xe, pVBSw, 0, 3 * sizeof (DrawVerticeFormats), XE_LOCK_WRITE); { // top left Rect[0].x = -1; Rect[0].y = 1; Rect[0].u = 0; Rect[0].v = 0; Rect[0].color = 0; // bottom left Rect[1].x = -1; Rect[1].y = -1; Rect[1].u = 0; Rect[1].v = 1; Rect[1].color = 0; // top right Rect[2].x = 1; Rect[2].y = 1; Rect[2].u = 1; Rect[2].v = 0; Rect[2].color = 0; int i = 0; for (i = 0; i < 3; i++) { Rect[i].z = 0.0; Rect[i].w = 1.0; } } Xe_VB_Unlock(xe, pVBSw); pVideoSurface = NULL; if (re.api_version != API_VERSION) Com_Error (ERR_FATAL, "Re has incompatible api_version"); // call the init function if (re.Init (NULL, NULL) == -1) Com_Error (ERR_FATAL, "Couldn't start refresh"); }
void Menu_Draw ( menuframework_t *menu ) { char scratch[MAX_QPATH]; static int yaw; // int maxframe = 29; entity_t entity; int i; menucommon_t *item; refdef_t refdef; // Draw rotating Quake II Symbol memset( &refdef, 0, sizeof( refdef ) ); memset( &entity, 0, sizeof( entity ) ); refdef.x = 0; refdef.y = 0; refdef.width = viddef.width; refdef.height = viddef.height; refdef.fov_x = 35; refdef.fov_y = CalcFov( refdef.fov_x, refdef.width, refdef.height ); refdef.time = cls.realtime * 0.001; refdef.areabits = NULL; refdef.num_entities = 1; //refdef.lightstyles = 5; // Gentle Pulse refdef.lightstyles = 63; // Testing (FULLBRIGHT) refdef.rdflags = RDF_NOWORLDMODEL; refdef.blend[0] = 1.0; refdef.blend[1] = 1.0; refdef.blend[2] = 1.0; refdef.blend[3] = 0.0; refdef.dlights = NULL; refdef.num_dlights = 0; refdef.num_particles = 0; refdef.particles = NULL; VectorSet(refdef.viewangles, 1.0, 0.0, 0.0); VectorClear(refdef.vieworg); //if (!strcmp(vid_ref->string, "soft")) // Com_sprintf( scratch, sizeof( scratch ), "models/items/quaddama/tris.md2"); //else Com_sprintf( scratch, sizeof( scratch ), "models/MenuModel/quad.md2"); entity.model = re.RegisterModel( scratch ); //entity.Model_Type = 0; entity.flags = RF_MINLIGHT | RF_DEPTHHACK | RF_FULLBRIGHT | RF_GLOW | RF_NOSHADOW; entity.origin[0] = 80; entity.origin[1] = 0; entity.origin[2] = -18; // -18 compensates for the float height of the model VectorCopy( entity.origin, entity.oldorigin ); entity.frame = 0; entity.oldframe = 0; entity.backlerp = 0.0; entity.angles[1] = yaw++; if ( ++yaw > 360 ) yaw -= 360; refdef.entities = &entity; // Fog the scene //refdef.blend[0] = 0.55; //refdef.blend[1] = 0.55; //refdef.blend[2] = 0.55; //refdef.blend[3] = 0.55; if (cl_3dmenubg->value) { // Draw scene MenuRefdefActive = 1; re.RenderFrame( &refdef ); //Menu_DrawBackground("q2bg.tga"); } // Draw the menu version information if (cl_menustamp->value > 0) { /* 1 - Regular string 2 - Regular string plus drop shadow (green... not effective) 3 - All green string */ if (cl_menustamp->value == 1) { // Draw the text Menu_DrawString (viddef.width - (strlen(MENUSTAMP) * FONTSIZE) - (FONTSIZE * 3), viddef.height - FONTSIZE, MENUSTAMP); } else if (cl_menustamp->value == 2) { // Draw the drop shadow (we need black characters) DrawAltString (viddef.width - (strlen(MENUSTAMP) * FONTSIZE) - (FONTSIZE * 3) - 1, viddef.height - FONTSIZE, MENUSTAMP); // Draw the text Menu_DrawString (viddef.width - (strlen(MENUSTAMP) * FONTSIZE) - (FONTSIZE * 3), viddef.height - FONTSIZE - 1, MENUSTAMP); } else if (cl_menustamp->value == 3) { // Draw the text DrawAltString (viddef.width - (strlen(MENUSTAMP) * FONTSIZE) - (FONTSIZE * 3), viddef.height - FONTSIZE, MENUSTAMP); } } // Menu drawing prevention hack for main menu if ((menu->x == -1) && (menu->y == -1)) return; /* ** draw contents */ for ( i = 0; i < menu->nitems; i++ ) { switch ( ( ( menucommon_t * ) menu->items[i] )->type ) { case MTYPE_FIELD: Field_Draw( ( menufield_t * ) menu->items[i] ); break; case MTYPE_SLIDER: Slider_Draw( ( menuslider_t * ) menu->items[i] ); break; case MTYPE_LIST: MenuList_Draw( ( menulist_t * ) menu->items[i] ); break; case MTYPE_SPINCONTROL: SpinControl_Draw( ( menulist_t * ) menu->items[i] ); break; case MTYPE_ACTION: Action_Draw( ( menuaction_t * ) menu->items[i] ); break; case MTYPE_SEPARATOR: Separator_Draw( ( menuseparator_t * ) menu->items[i] ); break; } } item = Menu_ItemAtCursor( menu ); if ( item && item->cursordraw ) { item->cursordraw( item ); } else if ( menu->cursordraw ) { menu->cursordraw( menu ); } else if ( item && item->type != MTYPE_FIELD ) { if ( item->flags & QMF_LEFT_JUSTIFY ) { Draw_Char( menu->x + item->x - 24 + item->cursor_offset, menu->y + item->y, 12 + ( ( int ) ( Sys_Milliseconds()/250 ) & 1 ) ); } else { Draw_Char( menu->x + item->cursor_offset, menu->y + item->y, 12 + ( ( int ) ( Sys_Milliseconds()/250 ) & 1 ) ); } } if ( item ) { if ( item->statusbarfunc ) item->statusbarfunc( ( void * ) item ); else if ( item->statusbar ) Menu_DrawStatusBar( item->statusbar ); else Menu_DrawStatusBar( menu->statusbar ); } else { Menu_DrawStatusBar( menu->statusbar ); } }
/* ============================ CL_StartHunkUsers After the server has cleared the hunk, these will need to be restarted This is the only place that any of these functions are called from ============================ */ void CL_StartHunkUsers( void ) { if ( !com_cl_running->integer ) { return; } if ( !cls.rendererStarted ) { #ifdef _XBOX //if ((!com_sv_running->integer || com_errorEntered) && !vidRestartReloadMap) //{ // // free up some memory // extern void SV_ClearLastLevel(void); // SV_ClearLastLevel(); //} #endif cls.rendererStarted = qtrue; re.BeginRegistration( &cls.glconfig ); // load character sets // cls.charSetShader = re.RegisterShaderNoMip( "gfx/2d/bigchars" ); cls.charSetShader = re.RegisterShaderNoMip( "gfx/2d/charsgrid_med" ); cls.whiteShader = re.RegisterShader( "white" ); // cls.consoleShader = re.RegisterShader( "console" ); g_console_field_width = cls.glconfig.vidWidth / SMALLCHAR_WIDTH - 2; kg.g_consoleField.widthInChars = g_console_field_width; #ifndef _IMMERSION //------- // The latest Immersion Force Feedback system initializes here, not through // win32 input system. Therefore, the window handle is valid :) //------- // now that the renderer has started up we know that the global hWnd is now valid, // so we can now go ahead and (re)setup the input stuff that needs hWnds for DI... // (especially Force feedback)... // static qboolean bOnceOnly = qfalse; // only do once, not every renderer re-start if (!bOnceOnly) { bOnceOnly = qtrue; extern void Sys_In_Restart_f( void ); Sys_In_Restart_f(); } #ifdef _XBOX if (vidRestartReloadMap) { int checksum; CM_LoadMap(va("maps/%s.bsp", cl_mapname->string), qfalse, &checksum); RE_LoadWorldMap(va("maps/%s.bsp", cl_mapname->string)); vidRestartReloadMap = qfalse; } #endif // _XBOX #endif // _IMMERSION } if ( !cls.soundStarted ) { cls.soundStarted = qtrue; S_Init(); } if ( !cls.soundRegistered ) { cls.soundRegistered = qtrue; S_BeginRegistration(); } #ifdef _IMMERSION if ( !cls.forceStarted ) { cls.forceStarted = qtrue; CL_InitFF(); } #endif // _IMMERSION #if !defined (_XBOX) //i guess xbox doesn't want the ui loaded all the time? //we require the ui to be loaded here or else it crashes trying to access the ui on command line map loads if ( !cls.uiStarted ) { cls.uiStarted = qtrue; CL_InitUI(); } #endif // if ( !cls.cgameStarted && cls.state > CA_CONNECTED && cls.state != CA_CINEMATIC ) { if ( !cls.cgameStarted && cls.state > CA_CONNECTED && (cls.state != CA_CINEMATIC && !CL_IsRunningInGameCinematic()) ) { cls.cgameStarted = qtrue; CL_InitCGame(); } }
/* ============== VID_LoadRefresh ============== */ qboolean VID_LoadRefresh( char *name ) { refimport_t ri; GetRefAPI_t GetRefAPI; char fn[MAX_OSPATH]; char *path; struct stat st; extern uid_t saved_euid; if ( reflib_active ) { if (KBD_Close_fp) KBD_Close_fp(); if (RW_IN_Shutdown_fp) RW_IN_Shutdown_fp(); KBD_Close_fp = NULL; RW_IN_Shutdown_fp = NULL; re.Shutdown(); VID_FreeReflib (); } Com_Printf( "------- Loading %s -------\n", name ); //regain root seteuid(saved_euid); path = Cvar_Get ("basedir", DEFAULT_BASEDIR, CVAR_NOSET)->string; snprintf (fn, MAX_OSPATH, "%s/%s", path, name ); if (stat(fn, &st) == -1) { path = Cvar_Get ("libdir", DEFAULT_LIBDIR, CVAR_NOSET)->string; snprintf (fn, MAX_OSPATH, "%s/%s", path, name ); if (stat(fn, &st) == -1) { Com_Printf( "LoadLibrary(\"%s\") failed: %s\n", name, strerror(errno)); return false; } } // permission checking if (strstr(fn, "softx") == NULL && strstr(fn, "glx") == NULL && strstr(fn, "softsdl") == NULL && strstr(fn, "sdlgl") == NULL) { // softx doesn't require root #if 0 if (st.st_uid != 0) { Com_Printf( "LoadLibrary(\"%s\") failed: ref is not owned by root\n", name); return false; } if ((st.st_mode & 0777) & ~0700) { Com_Printf( "LoadLibrary(\"%s\") failed: invalid permissions, must be 700 for security considerations\n", name); return false; } #endif } else { // softx requires we give up root now setreuid(getuid(), getuid()); setegid(getgid()); } if ( ( reflib_library = dlopen( fn, RTLD_LAZY ) ) == 0 ) { Com_Printf( "LoadLibrary(\"%s\") failed: %s\n", name , dlerror()); return false; } Com_Printf( "LoadLibrary(\"%s\")\n", fn ); ri.Cmd_AddCommand = Cmd_AddCommand; ri.Cmd_RemoveCommand = Cmd_RemoveCommand; ri.Cmd_Argc = Cmd_Argc; ri.Cmd_Argv = Cmd_Argv; ri.Cmd_ExecuteText = Cbuf_ExecuteText; ri.Con_Printf = VID_Printf; ri.Sys_Error = VID_Error; ri.FS_LoadFile = FS_LoadFile; ri.FS_FreeFile = FS_FreeFile; ri.FS_Gamedir = FS_Gamedir; ri.Cvar_Get = Cvar_Get; ri.Cvar_Set = Cvar_Set; ri.Cvar_SetValue = Cvar_SetValue; ri.Vid_GetModeInfo = VID_GetModeInfo; ri.Vid_MenuInit = VID_MenuInit; ri.Vid_NewWindow = VID_NewWindow; #ifdef QMAX ri.SetParticlePics = SetParticleImages; #endif if ( ( GetRefAPI = (void *) dlsym( reflib_library, "GetRefAPI" ) ) == 0 ) Com_Error( ERR_FATAL, "dlsym failed on %s", name ); re = GetRefAPI( ri ); if (re.api_version != API_VERSION) { VID_FreeReflib (); Com_Error (ERR_FATAL, "%s has incompatible api_version", name); } /* Init IN (Mouse) */ in_state.IN_CenterView_fp = IN_CenterView; in_state.Key_Event_fp = Do_Key_Event; in_state.viewangles = cl.viewangles; in_state.in_strafe_state = &in_strafe.state; in_state.in_speed_state = &in_speed.state; if ((RW_IN_Init_fp = dlsym(reflib_library, "RW_IN_Init")) == NULL || (RW_IN_Shutdown_fp = dlsym(reflib_library, "RW_IN_Shutdown")) == NULL || (RW_IN_Activate_fp = dlsym(reflib_library, "RW_IN_Activate")) == NULL || (RW_IN_Commands_fp = dlsym(reflib_library, "RW_IN_Commands")) == NULL || (RW_IN_Move_fp = dlsym(reflib_library, "RW_IN_Move")) == NULL || (RW_IN_Frame_fp = dlsym(reflib_library, "RW_IN_Frame")) == NULL) Sys_Error("No RW_IN functions in REF.\n"); /* this one is optional */ RW_Sys_GetClipboardData_fp = dlsym(reflib_library, "RW_Sys_GetClipboardData"); Real_IN_Init(); if ( re.Init( 0, 0 ) == -1 ) { re.Shutdown(); VID_FreeReflib (); return false; } /* Init KBD */ #if 1 if ((KBD_Init_fp = dlsym(reflib_library, "KBD_Init")) == NULL || (KBD_Update_fp = dlsym(reflib_library, "KBD_Update")) == NULL || (KBD_Close_fp = dlsym(reflib_library, "KBD_Close")) == NULL) Sys_Error("No KBD functions in REF.\n"); #else { void KBD_Init(void); void KBD_Update(void); void KBD_Close(void); KBD_Init_fp = KBD_Init; KBD_Update_fp = KBD_Update; KBD_Close_fp = KBD_Close; } #endif KBD_Init_fp(Do_Key_Event); Key_ClearStates(); // give up root now setreuid(getuid(), getuid()); setegid(getgid()); Com_Printf( "------------------------------------\n"); reflib_active = true; return true; }
/* ============== VID_LoadRefresh ============== */ qboolean VID_LoadRefresh( char *name ) { refimport_t ri; #ifndef REF_HARD_LINKED GetRefAPI_t GetRefAPI; #endif char fn[MAX_OSPATH]; struct stat st; extern uid_t saved_euid; FILE *fp; char *path; char curpath[MAX_OSPATH]; if ( reflib_active ) { if (KBD_Close_fp) KBD_Close_fp(); if (RW_IN_Shutdown_fp) RW_IN_Shutdown_fp(); KBD_Close_fp = NULL; RW_IN_Shutdown_fp = NULL; re.Shutdown(); VID_FreeReflib (); } #ifndef REF_HARD_LINKED getcwd(curpath, sizeof(curpath)); Com_Printf( "------- Loading %s -------\n", name ); // now run through the search paths path = NULL; while (1) { path = FS_NextPath (path); if (!path) return NULL; // couldn't find one anywhere sprintf (fn, "%s/%s/%s", curpath, path, name); Com_Printf ("Trying to load library (%s)\n", fn); reflib_library = dlopen( fn, RTLD_NOW ); if (reflib_library) { Com_DPrintf ("LoadLibrary (%s)\n",name); break; } } #endif ri.Cmd_AddCommand = Cmd_AddCommand; ri.Cmd_RemoveCommand = Cmd_RemoveCommand; ri.Cmd_Argc = Cmd_Argc; ri.Cmd_Argv = Cmd_Argv; ri.Cmd_ExecuteText = Cbuf_ExecuteText; ri.Con_Printf = VID_Printf; ri.Sys_Error = VID_Error; ri.FS_LoadFile = FS_LoadFile; ri.FS_FreeFile = FS_FreeFile; ri.FS_Gamedir = FS_Gamedir; ri.Cvar_Get = Cvar_Get; ri.Cvar_Set = Cvar_Set; ri.Cvar_SetValue = Cvar_SetValue; ri.Vid_GetModeInfo = VID_GetModeInfo; ri.Vid_MenuInit = VID_MenuInit; ri.Vid_NewWindow = VID_NewWindow; #ifndef REF_HARD_LINKED if ( ( GetRefAPI = (void *) dlsym( reflib_library, "GetRefAPI" ) ) == 0 ) Com_Error( ERR_FATAL, "dlsym failed on %s", name ); #endif re = GetRefAPI( ri ); if (re.api_version != API_VERSION) { VID_FreeReflib (); Com_Error (ERR_FATAL, "%s has incompatible api_version", name); } /* Init IN (Mouse) */ in_state.IN_CenterView_fp = IN_CenterView; in_state.Key_Event_fp = Do_Key_Event; in_state.viewangles = cl.viewangles; in_state.in_strafe_state = &in_strafe.state; #ifndef REF_HARD_LINKED if ((RW_IN_Init_fp = dlsym(reflib_library, "RW_IN_Init")) == NULL || (RW_IN_Shutdown_fp = dlsym(reflib_library, "RW_IN_Shutdown")) == NULL || (RW_IN_Activate_fp = dlsym(reflib_library, "RW_IN_Activate")) == NULL || (RW_IN_Commands_fp = dlsym(reflib_library, "RW_IN_Commands")) == NULL || (RW_IN_Move_fp = dlsym(reflib_library, "RW_IN_Move")) == NULL || (RW_IN_Frame_fp = dlsym(reflib_library, "RW_IN_Frame")) == NULL) Sys_Error("No RW_IN functions in REF.\n"); #else { void RW_IN_Init(in_state_t *in_state_p); void RW_IN_Shutdown(void); void RW_IN_Commands (void); void RW_IN_Move (usercmd_t *cmd); void RW_IN_Frame (void); void RW_IN_Activate(void); RW_IN_Init_fp = RW_IN_Init; RW_IN_Shutdown_fp = RW_IN_Shutdown; RW_IN_Activate_fp = RW_IN_Activate; RW_IN_Commands_fp = RW_IN_Commands; RW_IN_Move_fp = RW_IN_Move; RW_IN_Frame_fp = RW_IN_Frame; } #endif if ( re.Init( 0, 0 ) == -1 ) { re.Shutdown(); VID_FreeReflib (); return false; } // give up root now setreuid(getuid(), getuid()); setegid(getgid()); /* Init KBD */ #ifndef REF_HARD_LINKED if ((KBD_Init_fp = dlsym(reflib_library, "KBD_Init")) == NULL || (KBD_Update_fp = dlsym(reflib_library, "KBD_Update")) == NULL || (KBD_Close_fp = dlsym(reflib_library, "KBD_Close")) == NULL) Sys_Error("No KBD functions in REF.\n"); #else { void KBD_Init(void); void KBD_Update(void); void KBD_Close(void); KBD_Init_fp = KBD_Init; KBD_Update_fp = KBD_Update; KBD_Close_fp = KBD_Close; } #endif KBD_Init_fp(Do_Key_Event); Real_IN_Init(); Com_Printf( "------------------------------------\n"); reflib_active = true; return true; }
void *Z_Malloc(int iSize, memtag_t eTag, qboolean bZeroit, int unusedAlign) #endif { gbMemFreeupOccured = qfalse; if (iSize == 0) { zoneHeader_t *pMemory = (zoneHeader_t *) &gZeroMalloc; return &pMemory[1]; } // Add in tracking info and round to a longword... (ignore longword aligning now we're not using contiguous blocks) // // int iRealSize = (iSize + sizeof(zoneHeader_t) + sizeof(zoneTail_t) + 3) & 0xfffffffc; int iRealSize = (iSize + sizeof(zoneHeader_t) + sizeof(zoneTail_t)); // Allocate a chunk... // zoneHeader_t *pMemory = NULL; while (pMemory == NULL) { #ifdef _WIN32 if (gbMemFreeupOccured) { Sleep(1000); // sleep for a second, so Windows has a chance to shuffle mem to de-swiss-cheese it } #endif if (bZeroit) { pMemory = (zoneHeader_t *) calloc ( iRealSize, 1 ); } else { pMemory = (zoneHeader_t *) malloc ( iRealSize ); } if (!pMemory) { // new bit, if we fail to malloc memory, try dumping some of the cached stuff that's non-vital and try again... // // ditch the BSP cache... // if (CM_DeleteCachedMap(qfalse)) { gbMemFreeupOccured = qtrue; continue; // we've just ditched a whole load of memory, so try again with the malloc } // ditch any sounds not used on this level... // extern qboolean SND_RegisterAudio_LevelLoadEnd(qboolean bDeleteEverythingNotUsedThisLevel); if (SND_RegisterAudio_LevelLoadEnd(qtrue)) { gbMemFreeupOccured = qtrue; continue; // we've dropped at least one sound, so try again with the malloc } // ditch any image_t's (and associated GL texture mem) not used on this level... // if (re.RegisterImages_LevelLoadEnd()) { gbMemFreeupOccured = qtrue; continue; // we've dropped at least one image, so try again with the malloc } // ditch the model-binaries cache... (must be getting desperate here!) // if (re.RegisterModels_LevelLoadEnd(qtrue)) { gbMemFreeupOccured = qtrue; continue; } // as a last panic measure, dump all the audio memory, but not if we're in the audio loader // (which is annoying, but I'm not sure how to ensure we're not dumping any memory needed by the sound // currently being loaded if that was the case)... // // note that this keeps querying until it's freed up as many bytes as the requested size, but freeing // several small blocks might not mean that one larger one is satisfiable after freeup, however that'll // just make it go round again and try for freeing up another bunch of blocks until the total is satisfied // again (though this will have freed twice the requested amount in that case), so it'll either work // eventually or not free up enough and drop through to the final ERR_DROP. No worries... // extern qboolean gbInsideLoadSound; extern int SND_FreeOldestSound(void); // I had to add a void-arg version of this because of link issues, sigh if (!gbInsideLoadSound) { int iBytesFreed = SND_FreeOldestSound(); if (iBytesFreed) { int iTheseBytesFreed = 0; while ( (iTheseBytesFreed = SND_FreeOldestSound()) != 0) { iBytesFreed += iTheseBytesFreed; if (iBytesFreed >= iRealSize) break; // early opt-out since we've managed to recover enough (mem-contiguity issues aside) } gbMemFreeupOccured = qtrue; continue; } } // sigh, dunno what else to try, I guess we'll have to give up and report this as an out-of-mem error... // // findlabel: "recovermem" Com_Printf(S_COLOR_RED"Z_Malloc(): Failed to alloc %d bytes (TAG_%s) !!!!!\n", iSize, psTagStrings[eTag]); Z_Details_f(); Com_Error(ERR_FATAL,"(Repeat): Z_Malloc(): Failed to alloc %d bytes (TAG_%s) !!!!!\n", iSize, psTagStrings[eTag]); return NULL; } } #ifdef DEBUG_ZONE_ALLOCS extern char *Filename_WithoutPath(const char *psFilename); Q_strncpyz(pMemory->sSrcFileBaseName, Filename_WithoutPath(psFile), sizeof(pMemory->sSrcFileBaseName)); pMemory->iSrcFileLineNum = iLine; pMemory->sOptionalLabel[0] = '\0'; pMemory->iSnapshotNumber = giZoneSnaphotNum; #endif // Link in pMemory->iMagic = ZONE_MAGIC; pMemory->eTag = eTag; pMemory->iSize = iSize; pMemory->pNext = TheZone.Header.pNext; TheZone.Header.pNext = pMemory; if (pMemory->pNext) { pMemory->pNext->pPrev = pMemory; } pMemory->pPrev = &TheZone.Header; // // add tail... // ZoneTailFromHeader(pMemory)->iMagic = ZONE_MAGIC; // Update stats... // TheZone.Stats.iCurrent += iSize; TheZone.Stats.iCount++; TheZone.Stats.iSizesPerTag [eTag] += iSize; TheZone.Stats.iCountsPerTag [eTag]++; if (TheZone.Stats.iCurrent > TheZone.Stats.iPeak) { TheZone.Stats.iPeak = TheZone.Stats.iCurrent; } #ifdef DETAILED_ZONE_DEBUG_CODE mapAllocatedZones[pMemory]++; #endif Z_Validate(); // check for corruption void *pvReturnMem = &pMemory[1]; return pvReturnMem; }