diff --git a/engine/client/cl_cg.c b/engine/client/cl_cg.c index 717b7578b..d56734874 100644 --- a/engine/client/cl_cg.c +++ b/engine/client/cl_cg.c @@ -563,7 +563,7 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long if (!mod) mod = cl.worldmodel; if (mod) - pc = CM_PointContents(mod, VM_POINTER(arg[0])); + pc = cl.worldmodel->funcs.NativeContents(mod, 0, 0, VM_POINTER(arg[0]), vec3_origin, vec3_origin); else pc = 1;//FTECONTENTS_SOLID; VM_LONG(ret) = pc;//Contents_To_Q3(pc); @@ -601,7 +601,7 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long } if (mod) - pc = CM_PointContents(mod, p_l); + pc = cl.worldmodel->funcs.NativeContents(mod, 0, 0, VM_POINTER(arg[0]), vec3_origin, vec3_origin); else pc = 1;//FTECONTENTS_SOLID; } @@ -636,7 +636,7 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long if (!angles) angles = vec3_origin; if (mod) - tr = CM_TransformedBoxTrace(mod, start, end, mins, maxs, brushmask, origin, angles); + TransformedNativeTrace(mod, 0, 0, start, end, mins, maxs, brushmask, &tr, origin, angles); else { memset(&tr, 0, sizeof(tr)); @@ -674,7 +674,9 @@ static long CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const long if (!maxs) maxs = vec3_origin; if (mod) - tr = CM_BoxTrace(mod, start, end, mins, maxs, brushmask); + { + mod->funcs.NativeTrace(mod, 0, 0, start, end, mins, maxs, brushmask, &tr); + } else { memset(&tr, 0, sizeof(tr)); diff --git a/engine/client/cl_input.c b/engine/client/cl_input.c index d9385a719..a67fd31ae 100644 --- a/engine/client/cl_input.c +++ b/engine/client/cl_input.c @@ -861,7 +861,7 @@ void VARGS CL_SendClientCommand(qboolean reliable, char *format, ...) return; //no point. va_start (argptr, format); - _vsnprintf (string,sizeof(string)-1, format,argptr); + vsnprintf (string,sizeof(string)-1, format,argptr); va_end (argptr); @@ -1406,7 +1406,7 @@ static char *VARGS vahunk(char *format, ...) char *ret; va_start (argptr, format); - _vsnprintf (string,sizeof(string)-1, format,argptr); + vsnprintf (string,sizeof(string)-1, format,argptr); va_end (argptr); ret = Hunk_Alloc(strlen(string)+1); diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 3049a6dc2..d85ab2068 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -121,9 +121,9 @@ cvar_t cl_muzzleflash = SCVAR("cl_muzzleflash", "1"); cvar_t cl_item_bobbing = SCVAR("cl_model_bobbing", "0"); cvar_t requiredownloads = SCVARF("requiredownloads","1", CVAR_ARCHIVE); -cvar_t cl_standardchat = SCVAR("cl_standardchat", "0"); +cvar_t cl_standardchat = SCVARF("cl_standardchat", "0", CVAR_ARCHIVE); cvar_t msg_filter = SCVAR("msg_filter", "0"); //0 for neither, 1 for mm1, 2 for mm2, 3 for both -cvar_t cl_standardmsg = SCVAR("cl_standardmsg", "0"); +cvar_t cl_standardmsg = SCVARF("cl_standardmsg", "0", CVAR_ARCHIVE); cvar_t cl_parsewhitetext = SCVAR("cl_parsewhitetext", "0"); cvar_t host_mapname = SCVAR("host_mapname", ""); @@ -1292,6 +1292,7 @@ void CL_CheckServerInfo(void) { char *s; unsigned int allowed; + int oldstate; cl.teamplay = atoi(Info_ValueForKey(cl.serverinfo, "teamplay")); cl.deathmatch = atoi(Info_ValueForKey(cl.serverinfo, "deathmatch")); @@ -1410,6 +1411,18 @@ void CL_CheckServerInfo(void) else cls.allow_anyparticles = false; + + s = Info_ValueForKey(cl.serverinfo, "status"); + oldstate = cl.ktprostate; + if (!stricmp(s, "standby")) + cl.ktprostate = KTPRO_STANDBY; + else if (!stricmp(s, "countdown")) + cl.ktprostate = KTPRO_COUNTDOWN; + else + cl.ktprostate = KTPRO_DONTKNOW; + if (oldstate != cl.ktprostate) + cl.ktprogametime = 0; + Cvar_ForceCheatVars(cls.allow_semicheats, cls.allow_cheats); } @@ -1726,7 +1739,7 @@ void CL_Startdemos_f (void) #ifndef CLIENTONLY !sv.state && #endif - cls.demonum != -1 && cls.demoplayback==DPB_NONE && !media_filmtype && COM_CheckParm("-demos")) + cls.demonum != -1 && cls.demoplayback==DPB_NONE && !Media_PlayingFullScreen() && COM_CheckParm("-demos")) { cls.demonum = 0; CL_NextDemo (); @@ -2748,7 +2761,7 @@ void VARGS Host_EndGame (char *message, ...) SCR_EndLoadingPlaque(); va_start (argptr,message); - _vsnprintf (string,sizeof(string)-1, message,argptr); + vsnprintf (string,sizeof(string)-1, message,argptr); va_end (argptr); Con_TPrintf (TL_NL); Con_TPrintf (TL_LINEBREAK_EQUALS); @@ -2785,7 +2798,7 @@ void VARGS Host_Error (char *error, ...) inerror = true; va_start (argptr,error); - _vsnprintf (string,sizeof(string)-1, error,argptr); + vsnprintf (string,sizeof(string)-1, error,argptr); va_end (argptr); Con_TPrintf (TLC_HOSTFATALERROR, string); @@ -2966,6 +2979,10 @@ void Host_Frame (double time) } host_frametime = (realtime - oldrealtime)*cl.gamespeed; + if (!cl.paused) + { + cl.ktprogametime += host_frametime; + } oldrealtime = realtime; CL_ProgressDemoTime(); @@ -3311,7 +3328,7 @@ void Host_Init (quakeparms_t *parms) #endif #ifndef NOMEDIA - if (!cls.demofile && !cls.state && !media_filmtype) + if (!cls.demofile && !cls.state && !Media_PlayingFullScreen()) { int ol_depth; int idcin_depth; diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 0954222f8..0a5aa1424 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -3001,7 +3001,7 @@ void CLQ2_ParseMuzzleFlash (void) break; case Q2MZ_MACHINEGUN: dl->color[0] = 0.2;dl->color[1] = 0.2;dl->color[2] = 0; - _snprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); + snprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); Q2S_StartSound (NULL, i, CHAN_WEAPON, S_PrecacheSound(soundname), volume, ATTN_NORM, 0); break; @@ -3017,27 +3017,27 @@ void CLQ2_ParseMuzzleFlash (void) case Q2MZ_CHAINGUN1: dl->radius = 200 + (rand()&31); dl->color[0] = 0.2;dl->color[1] = 0.05;dl->color[2] = 0; - _snprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); + snprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); Q2S_StartSound (NULL, i, CHAN_WEAPON, S_PrecacheSound(soundname), volume, ATTN_NORM, 0); break; case Q2MZ_CHAINGUN2: dl->radius = 225 + (rand()&31); dl->color[0] = 0.2;dl->color[1] = 0.1;dl->color[2] = 0; dl->die = cl.time + 0.1; // long delay - _snprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); + snprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); Q2S_StartSound (NULL, i, CHAN_WEAPON, S_PrecacheSound(soundname), volume, ATTN_NORM, 0); - _snprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); + snprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); Q2S_StartSound (NULL, i, CHAN_WEAPON, S_PrecacheSound(soundname), volume, ATTN_NORM, 0.05); break; case Q2MZ_CHAINGUN3: dl->radius = 250 + (rand()&31); dl->color[0] = 0.2;dl->color[1] = 0.2;dl->color[2] = 0; dl->die = cl.time + 0.1; // long delay - _snprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); + snprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); Q2S_StartSound (NULL, i, CHAN_WEAPON, S_PrecacheSound(soundname), volume, ATTN_NORM, 0); - _snprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); + snprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); Q2S_StartSound (NULL, i, CHAN_WEAPON, S_PrecacheSound(soundname), volume, ATTN_NORM, 0.033); - _snprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); + snprintf(soundname, sizeof(soundname), "weapons/machgf%ib.wav", (rand() % 5) + 1); Q2S_StartSound (NULL, i, CHAN_WEAPON, S_PrecacheSound(soundname), volume, ATTN_NORM, 0.066); break; diff --git a/engine/client/cl_screen.c b/engine/client/cl_screen.c index 8ca1eb0fc..229b4656c 100644 --- a/engine/client/cl_screen.c +++ b/engine/client/cl_screen.c @@ -137,12 +137,15 @@ float oldsbar = 0; void SCR_ScreenShot_f (void); void SCR_RSShot_f (void); -cvar_t show_fps = SCVAR("show_fps", "0"); +cvar_t show_fps = SCVARF("show_fps", "0", CVAR_ARCHIVE); cvar_t show_fps_x = SCVAR("show_fps_x", "-1"); cvar_t show_fps_y = SCVAR("show_fps_y", "-1"); cvar_t show_clock = SCVAR("cl_clock", "0"); cvar_t show_clock_x = SCVAR("cl_clock_x", "0"); cvar_t show_clock_y = SCVAR("cl_clock_y", "-1"); +cvar_t show_gameclock = SCVAR("cl_gameclock", "0"); +cvar_t show_gameclock_x = SCVAR("cl_gameclock_x", "0"); +cvar_t show_gameclock_y = SCVAR("cl_gameclock_y", "-1"); cvar_t show_speed = SCVAR("show_speed", "0"); cvar_t show_speed_x = SCVAR("show_speed_x", "-1"); cvar_t show_speed_y = SCVAR("show_speed_y", "-9"); @@ -156,6 +159,9 @@ void CLSCR_Init(void) Cvar_Register(&show_clock, cl_screengroup); Cvar_Register(&show_clock_x, cl_screengroup); Cvar_Register(&show_clock_y, cl_screengroup); + Cvar_Register(&show_gameclock, cl_screengroup); + Cvar_Register(&show_gameclock_x, cl_screengroup); + Cvar_Register(&show_gameclock_y, cl_screengroup); Cvar_Register(&show_speed, cl_screengroup); Cvar_Register(&show_speed_x, cl_screengroup); Cvar_Register(&show_speed_y, cl_screengroup); @@ -1156,6 +1162,43 @@ void SCR_DrawClock(void) SCR_StringXY(str, show_clock_x.value, show_clock_y.value); } +void SCR_DrawGameClock(void) +{ + float showtime; + int minuites; + int seconds; + char str[16]; + int flags; + float timelimit; + + if (!show_gameclock.value) + return; + + flags = (show_gameclock.value-1); + if (flags & 1) + timelimit = 60 * atof(Info_ValueForKey(cl.serverinfo, "timelimit")); + else + timelimit = 0; + + showtime = timelimit - cl.ktprogametime; + + if (showtime < 0) + { + showtime *= -1; + minuites = showtime/60; + seconds = (int)showtime - (minuites*60); + minuites *= -1; + } + else + { + minuites = showtime/60; + seconds = (int)showtime - (minuites*60); + } + + sprintf(str, " %02i:%02i", minuites, seconds); + + SCR_StringXY(str, show_gameclock_x.value, show_gameclock_y.value); +} /* ============== @@ -1344,7 +1387,7 @@ void SCR_SetUpToDrawConsole (void) return; // never a console with loading plaque // decide on the height of the console - if (cls.state != ca_active && !media_filmtype + if (cls.state != ca_active && !Media_PlayingFullScreen() #ifdef TEXTEDITOR && !editoractive #endif @@ -1387,7 +1430,7 @@ void SCR_SetUpToDrawConsole (void) if (clearconsole++ < vid.numpages) { - if (qrenderer == QR_SOFTWARE && !media_filmtype) + if (qrenderer == QR_SOFTWARE && !Media_PlayingFullScreen()) { scr_copytop = 1; Draw_TileClear (0, (int) scr_con_current, vid.width, vid.height - (int) scr_con_current); @@ -1397,7 +1440,7 @@ void SCR_SetUpToDrawConsole (void) } else if (clearnotify++ < vid.numpages) { - if (qrenderer == QR_SOFTWARE && !media_filmtype) + if (qrenderer == QR_SOFTWARE && !Media_PlayingFullScreen()) { scr_copytop = 1; Draw_TileClear (0, 0, vid.width, con_notifylines); @@ -2025,6 +2068,7 @@ void SCR_DrawTwoDimensional(int uimenu, qboolean nohud) SCR_DrawFPS (); SCR_DrawUPS (); SCR_DrawClock(); + SCR_DrawGameClock(); SCR_DrawTurtle (); SCR_DrawPause (); #ifdef PLUGINS diff --git a/engine/client/cl_ui.c b/engine/client/cl_ui.c index f0298617a..fc70c5f59 100644 --- a/engine/client/cl_ui.c +++ b/engine/client/cl_ui.c @@ -445,7 +445,7 @@ int VMEnumMods(char *match, int size, void *args) return true; //we only count directories with a pk3 file Q_strncpyz(desc, match, sizeof(desc)); - f = FS_OpenVFS(va("%s/%s/description.txt", ((vmsearch_t *)args)->dir, match), "rb", FS_BASE); + f = FS_OpenVFS(va("%s/description.txt", match), "rb", FS_BASE); if (f) { VFS_GETS(f, desc, sizeof(desc)); @@ -677,6 +677,8 @@ void VQ3_RenderView(const q3refdef_t *ref) r_refdef.viewangles[2] = 0; if (ref->rdflags & 1) r_refdef.flags |= Q2RDF_NOWORLDMODEL; + else + r_refdef.flags &= ~Q2RDF_NOWORLDMODEL; r_refdef.fov_x = ref->fov_x; r_refdef.fov_y = ref->fov_y; r_refdef.vrect.x = ref->x; @@ -735,7 +737,7 @@ void UI_RegisterFont(char *fontName, int pointSize, fontInfo_t *font) #define readInt() LittleLong(*in.i++) #define readFloat() LittleFloat(*in.f++) - _snprintf(name, sizeof(name), "fonts/fontImage_%i.dat",pointSize); + snprintf(name, sizeof(name), "fonts/fontImage_%i.dat",pointSize); in.c = COM_LoadTempFile(name); if (com_filesize == sizeof(fontInfo_t)) @@ -1426,6 +1428,18 @@ long UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const long *arg) //fixme: memory protect. return Script_Read(arg[0], VM_POINTER(arg[1])); + case UI_CIN_PLAYCINEMATIC: + //handle(name, x, y, w, h, looping) + case UI_CIN_STOPCINEMATIC: + //(handle) + case UI_CIN_RUNCINEMATIC: + //(handle) + case UI_CIN_DRAWCINEMATIC: + //(handle) + case UI_CIN_SETEXTENTS: + //(handle, x, y, w, h) + break; + default: Con_Printf("Q3UI: Not implemented system trap: %d\n", fn); return 0; diff --git a/engine/client/client.h b/engine/client/client.h index 7621ed53b..ae4ad30ce 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -573,6 +573,13 @@ typedef struct qboolean sendprespawn; int contentstage; + + float ktprogametime; + enum { + KTPRO_DONTKNOW, + KTPRO_COUNTDOWN, + KTPRO_STANDBY + } ktprostate; } client_state_t; extern int cl_teamtopcolor; @@ -1006,14 +1013,7 @@ void Editor_Init(void); void CL_AddVWeapModel(entity_t *player, int model); -typedef enum { - MFT_NONE, - MFT_STATIC, //non-moving, PCX, no sound - MFT_ROQ, - MFT_AVI, - MFT_CIN -} media_filmtype_t; -extern media_filmtype_t media_filmtype; +qboolean Media_PlayingFullScreen(void); void Media_Init(void); qboolean Media_PlayFilm(char *name); void CIN_FinishCinematic (void); @@ -1021,6 +1021,11 @@ qboolean CIN_PlayCinematic (char *arg); qboolean CIN_DrawCinematic (void); qboolean CIN_RunCinematic (void); +typedef struct cin_s cin_t; +struct cin_s *Media_StartCin(char *name); +int Media_UpdateForShader(int texnum, cin_t *cin); +void Media_ShutdownCin(cin_t *cin); + void MVD_Interpolate(void); void Stats_NewMap(void); diff --git a/engine/client/clq2_cin.c b/engine/client/clq2_cin.c index 6a283326c..fd0dbae9b 100644 --- a/engine/client/clq2_cin.c +++ b/engine/client/clq2_cin.c @@ -88,7 +88,7 @@ Called when either the cinematic completes, or it is aborted */ void CIN_FinishCinematic (void) { - // tell the server to advance to the next map / cinematic + // tell the server to advance to the next map / cinematic (a q2 hack) if (cls.state == ca_active) { CL_SendClientCommand(true, "nextserver %i", cl.servercount); @@ -489,8 +489,7 @@ qboolean CIN_PlayCinematic (char *arg) if (!cin.cinematic_file) { - - _snprintf (name, sizeof(name), "video/%s", arg); + snprintf (name, sizeof(name), "video/%s", arg); cin.cinematic_file = FS_OpenVFS(name, "rb", FS_GAME); } diff --git a/engine/client/clq2_ents.c b/engine/client/clq2_ents.c index 28ce0dbf6..b31b1e6c6 100644 --- a/engine/client/clq2_ents.c +++ b/engine/client/clq2_ents.c @@ -297,7 +297,7 @@ void CLQ2_RunMuzzleFlash2 (int ent, int flash_number) dl->color[0] = 1;dl->color[1] = 1;dl->color[2] = 0; P_RunParticleEffect (origin, vec3_origin, 0, 40); CL_SmokeAndFlash(origin); - _snprintf(soundname, sizeof(soundname), "tank/tnkatk2%c.wav", 'a' + rand() % 5); + snprintf(soundname, sizeof(soundname), "tank/tnkatk2%c.wav", 'a' + rand() % 5); Q2S_StartSound (NULL, ent, CHAN_WEAPON, S_PrecacheSound(soundname), 1, ATTN_NORM, 0); break; diff --git a/engine/client/clq3_parse.c b/engine/client/clq3_parse.c index 7f8355623..87293764a 100644 --- a/engine/client/clq3_parse.c +++ b/engine/client/clq3_parse.c @@ -492,8 +492,8 @@ qboolean CLQ3_SystemInfoChanged(char *str) Con_Printf("Sending request to download %s\n", com_token); CLQ3_SendClientCommand("download %s.pk3", com_token); ccs.downloadchunknum = 0; - _snprintf(cls.downloadname, sizeof(cls.downloadname), "%s.pk3", com_token); - _snprintf(cls.downloadtempname, sizeof(cls.downloadtempname), "%s.tmp", com_token); + snprintf(cls.downloadname, sizeof(cls.downloadname), "%s.pk3", com_token); + snprintf(cls.downloadtempname, sizeof(cls.downloadtempname), "%s.tmp", com_token); cls.downloadmethod = DL_Q3; cls.downloadpercent = 0; return false; diff --git a/engine/client/console.c b/engine/client/console.c index e6f225bbf..0fa239c9b 100644 --- a/engine/client/console.c +++ b/engine/client/console.c @@ -361,7 +361,7 @@ void Con_ToggleConsole_f (void) if (key_dest == key_console) { - if (cls.state == ca_active || media_filmtype + if (cls.state == ca_active || Media_PlayingFullScreen() #ifdef VM_UI || UI_MenuState() #endif @@ -781,7 +781,7 @@ void VARGS Con_Printf (const char *fmt, ...) char msg[MAXPRINTMSG]; va_start (argptr,fmt); - _vsnprintf (msg,sizeof(msg)-1, fmt,argptr); + vsnprintf (msg,sizeof(msg), fmt,argptr); va_end (argptr); #ifndef CLIENTONLY @@ -835,7 +835,7 @@ void VARGS Con_SafePrintf (char *fmt, ...) char msg[MAXPRINTMSG]; va_start (argptr,fmt); - _vsnprintf (msg,sizeof(msg)-1, fmt,argptr); + vsnprintf (msg,sizeof(msg)-1, fmt,argptr); va_end (argptr); // write it to the scrollable buffer @@ -849,7 +849,7 @@ void VARGS Con_TPrintf (translation_t text, ...) char *fmt = languagetext[text][cls.language]; va_start (argptr,text); - _vsnprintf (msg,sizeof(msg)-1, fmt,argptr); + vsnprintf (msg,sizeof(msg), fmt,argptr); va_end (argptr); // write it to the scrollable buffer @@ -863,7 +863,7 @@ void VARGS Con_SafeTPrintf (translation_t text, ...) char *fmt = languagetext[text][cls.language]; va_start (argptr,text); - _vsnprintf (msg,sizeof(msg)-1, fmt,argptr); + vsnprintf (msg,sizeof(msg), fmt,argptr); va_end (argptr); // write it to the scrollable buffer @@ -887,7 +887,7 @@ void VARGS Con_DPrintf (char *fmt, ...) return; // early exit va_start (argptr,fmt); - _vsnprintf (msg,sizeof(msg)-1, fmt,argptr); + vsnprintf (msg,sizeof(msg)-1, fmt,argptr); va_end (argptr); if (!developer.value) diff --git a/engine/client/image.c b/engine/client/image.c index bdffc6901..4692f20fe 100644 --- a/engine/client/image.c +++ b/engine/client/image.c @@ -687,7 +687,7 @@ int Image_WritePNG (char *filename, int compression, qbyte *pixels, int width, i png_structp png_ptr; png_infop info_ptr; png_byte **row_pointers; - _snprintf (name, sizeof(name)-1, "%s/%s", com_gamedir, filename); + snprintf (name, sizeof(name)-1, "%s/%s", com_gamedir, filename); if (!(fp = fopen (name, "wb"))) { COM_CreatePath (name); @@ -1923,7 +1923,7 @@ int Mod_LoadHiResTexture(char *name, char *subpath, qboolean mipmap, qboolean al return len; if (subpath && *subpath) { - _snprintf(fname, sizeof(fname)-1, "%s/%s", subpath, name); + snprintf(fname, sizeof(fname)-1, "%s/%s", subpath, name); if ((len = GL_FindTexture(fname))!=-1) //don't bother if it already exists. return len; } @@ -1944,10 +1944,10 @@ int Mod_LoadHiResTexture(char *name, char *subpath, qboolean mipmap, qboolean al { if (!subpath) continue; - _snprintf(fname, sizeof(fname)-1, path[i]+1, subpath, /*COM_SkipPath*/(nicename), ".dds"); + snprintf(fname, sizeof(fname)-1, path[i]+1, subpath, /*COM_SkipPath*/(nicename), ".dds"); } else - _snprintf(fname, sizeof(fname)-1, path[i]+1, nicename, ".dds"); + snprintf(fname, sizeof(fname)-1, path[i]+1, nicename, ".dds"); if ((buf = COM_LoadFile (fname, 5))) { len = GL_LoadTextureDDS(buf, com_filesize); @@ -1963,10 +1963,10 @@ int Mod_LoadHiResTexture(char *name, char *subpath, qboolean mipmap, qboolean al { if (!subpath) continue; - _snprintf(fname, sizeof(fname)-1, path[i]+1, subpath, /*COM_SkipPath*/(nicename), extensions[e]); + snprintf(fname, sizeof(fname)-1, path[i]+1, subpath, /*COM_SkipPath*/(nicename), extensions[e]); } else - _snprintf(fname, sizeof(fname)-1, path[i]+1, nicename, extensions[e]); + snprintf(fname, sizeof(fname)-1, path[i]+1, nicename, extensions[e]); TRACE(("dbg: Mod_LoadHiResTexture: trying %s\n", fname)); if ((buf = COM_LoadFile (fname, 5))) { @@ -1978,7 +1978,7 @@ int Mod_LoadHiResTexture(char *name, char *subpath, qboolean mipmap, qboolean al TRACE(("dbg: Mod_LoadHiResTexture: %s loaded\n", name)); if (i == 1) { //if it came from a special subpath (eg: map specific), upload it using the subpath prefix - _snprintf(fname, sizeof(fname)-1, "%s/%s", subpath, name); + snprintf(fname, sizeof(fname)-1, "%s/%s", subpath, name); len = GL_LoadTexture32 (fname, image_width, image_height, (unsigned*)data, mipmap, alpha); } else @@ -2063,10 +2063,10 @@ int Mod_LoadBumpmapTexture(char *name, char *subpath) else #endif COM_FileBase(cl.model_name[1], map); - _snprintf(fname, sizeof(fname)-1, path[i], map, nicename, extensions[e]); + snprintf(fname, sizeof(fname)-1, path[i], map, nicename, extensions[e]); } else - _snprintf(fname, sizeof(fname)-1, path[i], nicename, extensions[e]); + snprintf(fname, sizeof(fname)-1, path[i], nicename, extensions[e]); TRACE(("dbg: Mod_LoadBumpmapTexture: opening %s\n", fname)); diff --git a/engine/client/keys.c b/engine/client/keys.c index 43ad3b0ee..bd65eeb66 100644 --- a/engine/client/keys.c +++ b/engine/client/keys.c @@ -1446,7 +1446,7 @@ void Key_Event (int key, qboolean down) break; #endif case key_game: - if (media_filmtype) + if (Media_PlayingFullScreen()) { Media_PlayFilm(""); break; diff --git a/engine/client/m_items.c b/engine/client/m_items.c index 34fd50b3b..d6a1933cf 100644 --- a/engine/client/m_items.c +++ b/engine/client/m_items.c @@ -78,7 +78,7 @@ void Draw_TextBox (int x, int y, int width, int lines) Draw_TransPic (cx, cy+8, p); } -void Draw_BigFontString(int x, int y, const char *text) +void Draw_Hexen2BigFontString(int x, int y, const char *text) { int sx, sy; mpic_t *p; @@ -108,6 +108,76 @@ void Draw_BigFontString(int x, int y, const char *text) } } +mpic_t *QBigFontWorks(void) +{ + mpic_t *p; + p = Draw_SafeCachePic ("gfx/mcharset.lmp"); + if (p) + return p; + p = Draw_SafeCachePic ("mcharset.lmp"); + if (p) + return p; + p = Draw_SafeCachePic ("textures/gfx/mcharset.lmp"); + if (p) + return p; + p = Draw_SafeCachePic ("textures/mcharset.lmp"); + if (p) + return p; + return NULL; +} +void Draw_BigFontString(int x, int y, const char *text) +{ + int sx, sy; + mpic_t *p; + p = QBigFontWorks(); + if (!p) + return; + + if (qrenderer == QR_OPENGL) + { //a hack for scaling + p->width = 20*8; + p->height = 20*8; + } + + while(*text) + { + if (*text >= 'A' && *text <= 'Z') + { + sx = ((*text-'A')%8)*(p->width>>3); + sy = ((*text-'A')/8)*(p->height>>3); + } + else if (*text >= 'a' && *text <= 'z') + { + sx = ((*text-'a'+26)%8)*(p->width>>3); + sy = ((*text-'a'+26)/8)*(p->height>>3); + } + else if (*text >= '0' && *text <= '1') + { + sx = ((*text-'0'+26*2)%8)*(p->width>>3); + sy = ((*text-'0'+26*2)/8)*(p->height>>3); + } + else if (*text == ':') + { + sx = ((*text-'0'+26*2+10)%8)*(p->width>>3); + sy = ((*text-'0'+26*2+10)/8)*(p->height>>3); + } + else if (*text == '/') + { + sx = ((*text-'0'+26*2+11)%8)*(p->width>>3); + sy = ((*text-'0'+26*2+11)/8)*(p->height>>3); + } + else// if (*text <= ' ') + { + sx=-1; + sy=-1; + } + if(sx>=0) + Draw_SubPic(x, y, p, sx, sy, (p->width>>3), (p->height>>3)); + x+=(p->width>>3); + text++; + } +} + char *menudotstyle; int maxdots; int mindot; @@ -151,7 +221,10 @@ void MenuDrawItems(int xpos, int ypos, menuoption_t *option, menu_t *menu) else Draw_String(xpos+option->common.posx, ypos+option->common.posy, option->button.text); break; - case mt_buttonbigfont: + case mt_hexen2buttonbigfont: + Draw_Hexen2BigFontString(xpos+option->common.posx, ypos+option->common.posy, option->button.text); + break; + case mt_qbuttonbigfont: Draw_BigFontString(xpos+option->common.posx, ypos+option->common.posy, option->button.text); break; case mt_menudot: @@ -544,6 +617,8 @@ menuedit_t *MC_AddEditCvar(menu_t *menu, int x, int y, char *text, char *name) n->caption = (char *)(n+1); strcpy((char *)(n+1), text); n->cvar = cvar; + if (!(cvar->flags & CVAR_ARCHIVE)) + Con_Printf("Warning: %s is not set for archiving\n", cvar->name); Q_strncpyz(n->text, cvar->string, sizeof(n->text)); n->common.next = menu->options; @@ -594,6 +669,10 @@ menucheck_t *MC_AddCheckBox(menu_t *menu, int x, int y, const char *text, cvar_t n->var = var; n->bits = bits; + if (var) + if (!(var->flags & CVAR_ARCHIVE)) + Con_Printf("Warning: %s is not set for archiving\n", var->name); + n->common.next = menu->options; menu->options = (menuoption_t *)n; return n; @@ -631,8 +710,13 @@ menuslider_t *MC_AddSlider(menu_t *menu, int x, int y, const char *text, cvar_t strcpy((char *)(n+1), text); if (var) + { n->current = var->value; + if (!(var->flags & CVAR_ARCHIVE)) + Con_Printf("Warning: %s is not set for archiving\n", var->name); + } + n->min = min; n->max = max; @@ -687,6 +771,9 @@ menucombo_t *MC_AddCvarCombo(menu_t *menu, int x, int y, const char *caption, cv n->values = values; n->cvar = cvar; + if (!(cvar->flags & CVAR_ARCHIVE)) + Con_Printf("Warning: %s is not set for archiving\n", cvar->name); + n->selectedoption = 0; n->common.next = menu->options; @@ -722,10 +809,29 @@ menubutton_t *MC_AddConsoleCommand(menu_t *menu, int x, int y, const char *text, menu->options = (menuoption_t *)n; return n; } -menubutton_t *MC_AddConsoleCommandBigFont(menu_t *menu, int x, int y, const char *text, const char *command) + +menubutton_t *MC_AddConsoleCommandQBigFont(menu_t *menu, int x, int y, const char *text, const char *command) { menubutton_t *n = Z_Malloc(sizeof(menubutton_t)+strlen(text)+1+strlen(command)+1); - n->common.type = mt_buttonbigfont; + n->common.type = mt_qbuttonbigfont; + n->common.iszone = true; + n->common.posx = x; + n->common.posy = y; + n->common.height = 20; + n->common.width = strlen(text)*20; + n->text = (char *)(n+1); + strcpy((char *)(n+1), text); + n->command = n->text + strlen(n->text)+1; + strcpy((char *)n->command, command); + + n->common.next = menu->options; + menu->options = (menuoption_t *)n; + return n; +} +menubutton_t *MC_AddConsoleCommandHexen2BigFont(menu_t *menu, int x, int y, const char *text, const char *command) +{ + menubutton_t *n = Z_Malloc(sizeof(menubutton_t)+strlen(text)+1+strlen(command)+1); + n->common.type = mt_hexen2buttonbigfont; n->common.iszone = true; n->common.posx = x; n->common.posy = y; @@ -766,7 +872,7 @@ menubutton_t *VARGS MC_AddConsoleCommandf(menu_t *menu, int x, int y, const char menubutton_t *n; va_start (argptr, command); - _vsnprintf (string,sizeof(string)-1, command,argptr); + vsnprintf (string,sizeof(string)-1, command,argptr); va_end (argptr); n = Z_Malloc(sizeof(menubutton_t) + strlen(string)+1); @@ -1104,12 +1210,12 @@ menuoption_t *M_NextSelectableItem(menu_t *m, menuoption_t *old) if (op == old) { - if (op->common.type == mt_slider || op->common.type == mt_checkbox || op->common.type == mt_button || op->common.type == mt_buttonbigfont || op->common.type == mt_edit || op->common.type == mt_combo || op->common.type == mt_bind || op->common.type == mt_custom) + if (op->common.type == mt_slider || op->common.type == mt_checkbox || op->common.type == mt_button || op->common.type == mt_hexen2buttonbigfont || op->common.type == mt_qbuttonbigfont || op->common.type == mt_edit || op->common.type == mt_combo || op->common.type == mt_bind || op->common.type == mt_custom) return op; return NULL; //whoops. } - if (op->common.type == mt_slider || op->common.type == mt_checkbox || op->common.type == mt_button || op->common.type == mt_buttonbigfont || op->common.type == mt_edit || op->common.type == mt_combo || op->common.type == mt_bind || op->common.type == mt_custom) + if (op->common.type == mt_slider || op->common.type == mt_checkbox || op->common.type == mt_button || op->common.type == mt_hexen2buttonbigfont || op->common.type == mt_qbuttonbigfont || op->common.type == mt_edit || op->common.type == mt_combo || op->common.type == mt_bind || op->common.type == mt_custom) if (!op->common.ishidden) return op; } @@ -1136,7 +1242,7 @@ menuoption_t *M_PrevSelectableItem(menu_t *m, menuoption_t *old) if (op == old) return old; //whoops. - if (op->common.type == mt_slider || op->common.type == mt_checkbox || op->common.type == mt_button || op->common.type == mt_buttonbigfont || op->common.type == mt_edit || op->common.type == mt_combo || op->common.type == mt_bind || op->common.type == mt_custom) + if (op->common.type == mt_slider || op->common.type == mt_checkbox || op->common.type == mt_button || op->common.type == mt_hexen2buttonbigfont || op->common.type == mt_qbuttonbigfont || op->common.type == mt_edit || op->common.type == mt_combo || op->common.type == mt_bind || op->common.type == mt_custom) if (!op->common.ishidden) return op; } @@ -1216,7 +1322,8 @@ void M_Complex_Key(int key) MC_CheckBox_Key(¤tmenu->selecteditem->check, currentmenu, key); break; case mt_button: - case mt_buttonbigfont: + case mt_hexen2buttonbigfont: + case mt_qbuttonbigfont: if (!currentmenu->selecteditem->button.command) currentmenu->selecteditem->button.key(currentmenu->selecteditem, currentmenu, key); else if (key == K_ENTER || key == K_MOUSE1) @@ -1459,27 +1566,61 @@ void M_Menu_Main_f (void) return; MC_AddPicture(mainm, (320-p->width)/2, 0, "gfx/menu/title0.lmp"); - b=MC_AddConsoleCommandBigFont (mainm, 80, 64, "Single Player", "menu_single\n"); + b=MC_AddConsoleCommandHexen2BigFont (mainm, 80, 64, "Single Player", "menu_single\n"); b->common.width = 12*20; b->common.height = 20; - b=MC_AddConsoleCommandBigFont (mainm, 80, 64+20, "MultiPlayer", "menu_multi\n"); + b=MC_AddConsoleCommandHexen2BigFont (mainm, 80, 64+20, "MultiPlayer", "menu_multi\n"); b->common.width = 12*20; b->common.height = 20; - b=MC_AddConsoleCommandBigFont (mainm, 80, 64+40, "Options", "menu_options\n"); + b=MC_AddConsoleCommandHexen2BigFont (mainm, 80, 64+40, "Options", "menu_options\n"); b->common.width = 12*20; b->common.height = 20; if (m_helpismedia.value) - b=MC_AddConsoleCommandBigFont (mainm, 80, 64+60, "Media", "menu_media\n"); + b=MC_AddConsoleCommandHexen2BigFont (mainm, 80, 64+60, "Media", "menu_media\n"); else - b=MC_AddConsoleCommandBigFont (mainm, 80, 64+60, "Help", "help\n"); + b=MC_AddConsoleCommandHexen2BigFont (mainm, 80, 64+60, "Help", "help\n"); b->common.width = 12*20; b->common.height = 20; - b=MC_AddConsoleCommandBigFont (mainm, 80, 64+80, "Quit", "menu_quit\n"); + b=MC_AddConsoleCommandHexen2BigFont (mainm, 80, 64+80, "Quit", "menu_quit\n"); b->common.width = 12*20; b->common.height = 20; mainm->cursoritem = (menuoption_t *)MC_AddCursor(mainm, 48, 64); } + else if (QBigFontWorks()) + { + m_state = m_complex; + key_dest = key_menu; + mainm = M_CreateMenu(0); + + p = Draw_SafeCachePic("gfx/ttl_main.lmp"); + if (!p) + { + MC_AddRedText(mainm, 16, 0, "MAIN MENU", false); + + mainm->selecteditem = (menuoption_t *) + MC_AddConsoleCommand (mainm, 64, 32, "Join server", "menu_servers\n"); + MC_AddConsoleCommand (mainm, 64, 40, "Options", "menu_options\n"); + MC_AddConsoleCommand (mainm, 64, 48, "Quit", "menu_quit\n"); + return; + } + mainm->key = MC_Main_Key; + MC_AddPicture(mainm, 16, 4, "gfx/qplaque.lmp"); + + MC_AddPicture(mainm, (320-p->width)/2, 4, "gfx/ttl_main.lmp"); + + mainm->selecteditem = (menuoption_t *) + MC_AddConsoleCommandQBigFont (mainm, 72, 32, "Single ", "menu_single\n"); + MC_AddConsoleCommandQBigFont (mainm, 72, 52, "Multiplayer", "menu_multi\n"); + MC_AddConsoleCommandQBigFont (mainm, 72, 72, "Options ", "menu_options\n"); + if (m_helpismedia.value) + MC_AddConsoleCommandQBigFont(mainm, 72, 92, "Media ", "menu_media\n"); + else + MC_AddConsoleCommandQBigFont(mainm, 72, 92, "Help ", "help\n"); + MC_AddConsoleCommandQBigFont (mainm, 72, 112,"Quit ", "menu_quit\n"); + + mainm->cursoritem = (menuoption_t *)MC_AddCursor(mainm, 54, 32); + } else { m_state = m_complex; diff --git a/engine/client/m_master.c b/engine/client/m_master.c index 3cbe05fcd..b631e57c5 100644 --- a/engine/client/m_master.c +++ b/engine/client/m_master.c @@ -984,11 +984,11 @@ qboolean SL_ServerKey (menucustom_t *ths, menu_t *menu, int key) server = Master_SortedServer(info->selectedpos); if (server) { - _snprintf(info->mappic->picturename, 32, "levelshots/%s", server->map); + snprintf(info->mappic->picturename, 32, "levelshots/%s", server->map); } else { - _snprintf(info->mappic->picturename, 32, "levelshots/nomap"); + snprintf(info->mappic->picturename, 32, "levelshots/nomap"); } } } @@ -1056,11 +1056,11 @@ qboolean SL_Key (int key, menu_t *menu) server = Master_SortedServer(info->selectedpos); if (server) { - _snprintf(info->mappic->picturename, 32, "levelshots/%s", server->map); + snprintf(info->mappic->picturename, 32, "levelshots/%s", server->map); } else { - _snprintf(info->mappic->picturename, 32, "levelshots/nomap"); + snprintf(info->mappic->picturename, 32, "levelshots/nomap"); } } @@ -1225,6 +1225,7 @@ void M_Menu_ServerList2_f(void) cust->key = SL_ServerKey; cust->common.height = 8; cust->common.width = vid.width-8; + cust->common.noselectionsound = true; } menu->dontexpand = true; diff --git a/engine/client/m_mp3.c b/engine/client/m_mp3.c index 4681343a1..a87def7ea 100644 --- a/engine/client/m_mp3.c +++ b/engine/client/m_mp3.c @@ -789,138 +789,176 @@ char *Media_NextTrack(void) ///temporary residence for media handling #include "roq.h" -roq_info *roqfilm; -sfxcache_t *moviesoundbuffer; -sfx_t mediaaudio = { - "movieaudio", - {NULL, true}, - NULL -}; - -qbyte *staticfilmimage; //rgba -int imagewidth; -int imageheight; #ifdef WINAVI #undef CDECL //windows is stupid at times. #define CDECL __cdecl #include -AVISTREAMINFO psi; // Pointer To A Structure Containing Stream Info -PAVISTREAM pavivideo=NULL; -PAVISTREAM pavisound=NULL; -PAVIFILE pavi=NULL; -PGETFRAME pgf=NULL; - -LPWAVEFORMAT pWaveFormat; - -HWND capturewindow; int aviinited; -int filmwidth; -int filmheight; -float filmfps; -int num_frames; -int currentframe; -float filmstarttime; -int soundpos; #pragma comment( lib, "vfw32.lib" ) #endif -static qbyte *framedata; //this buffer holds the image data temporarily.. #define MFT_CAPTURE 5 //fixme -media_filmtype_t media_filmtype; +typedef enum { + MFT_NONE, + MFT_STATIC, //non-moving, PCX, no sound + MFT_ROQ, + MFT_AVI, + MFT_CIN +} media_filmtype_t; -int filmnwidth; -int filmnheight; +typedef struct cin_s { -qboolean Media_PlayFilm(char *name) + //these are the outputs (not always power of two!) + int outtype; + int outwidth; + int outheight; + qbyte *outdata; + qbyte *outpalette; + int outunchanged; + + // + + media_filmtype_t filmtype; + +#ifdef WINAVI + struct { + AVISTREAMINFO psi; // Pointer To A Structure Containing Stream Info + PAVISTREAM pavivideo; + PAVISTREAM pavisound; + PAVIFILE pavi; + PGETFRAME pgf; + + LPWAVEFORMAT pWaveFormat; + HWND capturewindow; + } avi; +#endif + + struct { + qbyte *filmimage; //rgba + int imagewidth; + int imageheight; + } image; + + struct { + roq_info *roqfilm; + } roq; + + sfxcache_t *moviesoundbuffer; + sfx_t mediaaudio; +/* = { + "movieaudio", + {NULL, true}, + NULL + }; +*/ + + float filmstarttime; + float nextframetime; + + int currentframe; //last frame in buffer + qbyte *framedata; //Z_Malloced buffer + + //sound stuff + int soundpos; + + //source sizes + int filmwidth; + int filmheight; + + //source info + float filmfps; + int num_frames; +} cin_t; + +cin_t *fullscreenvid; + +qboolean Media_PlayingFullScreen(void) { - char *dot; - sfx_t *s; - soundcardinfo_t *sc; + return fullscreenvid!=NULL; +} - switch(media_filmtype) //shut down the old media. +void Media_ShutdownCin(cin_t *cin) +{ + soundcardinfo_t *sc; + sfx_t *s; + + if (!cin) + return; + + for (sc = sndcardinfo; sc; sc=sc->next) + { + s = sc->channel[NUM_AMBIENTS].sfx; + if (s && s == &cin->mediaaudio) + { + sc->channel[NUM_AMBIENTS].pos = 0; + sc->channel[NUM_AMBIENTS].end = 0; + sc->channel[NUM_AMBIENTS].sfx = NULL; + } + } + + switch(cin->filmtype) //shut down the old media. { case MFT_ROQ: - roq_close(roqfilm); - roqfilm=NULL; - - for (sc = sndcardinfo; sc; sc=sc->next) - { - s = sc->channel[NUM_AMBIENTS].sfx; - if (s && s == &mediaaudio) - { - sc->channel[NUM_AMBIENTS].pos = 0; - sc->channel[NUM_AMBIENTS].end = 0; - sc->channel[NUM_AMBIENTS].sfx = NULL; - } - } + roq_close(cin->roq.roqfilm); + cin->roq.roqfilm=NULL; break; case MFT_STATIC: - BZ_Free(staticfilmimage); - staticfilmimage = NULL; + BZ_Free(cin->image.filmimage); + cin->image.filmimage = NULL; break; #ifdef WINAVI case MFT_AVI: - AVIStreamGetFrameClose(pgf); - AVIStreamEndStreaming(pavivideo); - AVIStreamRelease(pavivideo); -// AVIFileRelease(pavi); - - for (sc = sndcardinfo; sc; sc=sc->next) - { - s = sc->channel[NUM_AMBIENTS].sfx; - if (s && s == &mediaaudio) - { - sc->channel[NUM_AMBIENTS].pos = 0; - sc->channel[NUM_AMBIENTS].end = 0; - sc->channel[NUM_AMBIENTS].sfx = NULL; - } - } + AVIStreamGetFrameClose(cin->avi.pgf); + AVIStreamEndStreaming(cin->avi.pavivideo); + AVIStreamRelease(cin->avi.pavivideo); + //we don't need to free the file (we freed it immediatly after getting the stream handles) break; #else case MFT_AVI: break; #endif + case MFT_CIN: CIN_FinishCinematic(); break; -#if 0 - case MFT_CAPTURE: - if (capturewindow) - { - capCaptureStop(capturewindow); - capDriverDisconnect(capturewindow); - DestroyWindow(capturewindow); - } - break; -#endif case MFT_NONE: break; } - media_filmtype = MFT_NONE; - - if (framedata) + if (cin->framedata) { - BZ_Free(framedata); - framedata = NULL; + BZ_Free(cin->framedata); + cin->framedata = NULL; } + Z_Free(cin); +} + + +cin_t *Media_StartCin(char *name) +{ + cin_t *cin = NULL; + char *dot; if (!name || !*name) //clear only. - return false; + return NULL; dot = strchr(name, '.'); //q2 cinematics work like this. if (dot && (!strcmp(dot, ".pcx") || !strcmp(dot, ".tga") || !strcmp(dot, ".png") || !strcmp(dot, ".jpg"))) { + qbyte *staticfilmimage; + int imagewidth; + int imageheight; + char fullname[MAX_QPATH]; qbyte *file; qbyte *ReadPCXFile(qbyte *buf, int length, int *width, int *height); @@ -928,10 +966,15 @@ qboolean Media_PlayFilm(char *name) qbyte *ReadJPEGFile(qbyte *infile, int length, int *width, int *height); qbyte *ReadPNGFile(qbyte *buf, int length, int *width, int *height, char *fname); - sprintf(fullname, "pics/%s", name); + sprintf(fullname, "%s", name); file = COM_LoadMallocFile(fullname); //read file if (!file) - return false; + { + sprintf(fullname, "pics/%s", name); + file = COM_LoadMallocFile(fullname); //read file + if (!file) + return NULL; + } if ((staticfilmimage = ReadPCXFile(file, com_filesize, &imagewidth, &imageheight)) || //convert to 32 rgba if not corrupt (staticfilmimage = ReadTargaFile(file, com_filesize, &imagewidth, &imageheight, false)) || @@ -947,184 +990,179 @@ qboolean Media_PlayFilm(char *name) } else { + BZ_Free(file); //got image data Con_Printf("Static cinematic format not supported.\n"); //not supported format - return false; + return NULL; } - Con_ClearNotify(); - if (key_dest != key_console) - scr_con_current=0; - media_filmtype = MFT_STATIC; - return true; + cin = Z_Malloc(sizeof(cin_t)); + cin->filmtype = MFT_STATIC; + cin->image.filmimage = staticfilmimage; + cin->image.imagewidth = imagewidth; + cin->image.imageheight = imageheight; + + return cin; } + + if (dot && (!strcmp(dot, ".cin"))) { if (CIN_PlayCinematic(name)) - media_filmtype = MFT_CIN; - return true; + { + cin = Z_Malloc(sizeof(cin_t)); + cin->filmtype = MFT_CIN; + } + return cin; } - if ((roqfilm = roq_open(name))) { - Con_ClearNotify(); - if (key_dest != key_console) - scr_con_current=0; - media_filmtype = MFT_ROQ; + roq_info *roqfilm; + if ((roqfilm = roq_open(name))) + { + cin = Z_Malloc(sizeof(cin_t)); + cin->filmtype = MFT_ROQ; + cin->roq.roqfilm = roqfilm; + cin->nextframetime = Sys_DoubleTime(); - framedata = BZ_Malloc(roqfilm->width*roqfilm->height*4); - return true; + cin->framedata = BZ_Malloc(roqfilm->width*roqfilm->height*4); + return cin; + } } + + + + + + + + + #ifdef WINAVI - -#if 0 - if (dot && (!strcmp(dot, ".cap"))) { - char drivername[256]; - capturewindow = capCreateCaptureWindow("Capture Window", WS_OVERLAPPEDWINDOW, 0, 0, 512, 512, mainwindow, 0); - ShowWindow(capturewindow, SW_NORMAL); + PAVIFILE pavi; - - - capDriverConnect(capturewindow, atoi(name)); - drivername[0] = '\0'; - capDriverGetName(capturewindow, drivername, sizeof(drivername)); -// capDlgVideoSource(capturewindow); - capCaptureSequenceNoFile(capturewindow); - Con_Printf("%s", drivername); - media_filmtype = MFT_CAPTURE; - return false; - } -#endif - - if (!aviinited) - { - aviinited=true; - AVIFileInit(); - } - if (!AVIFileOpen(&pavi, name, OF_READ, NULL))//!AVIStreamOpenFromFile(&pavi, name, streamtypeVIDEO, 0, OF_READ, NULL)) - { - if (AVIFileGetStream(pavi, &pavivideo, streamtypeVIDEO, 0)) //retrieve video stream + if (!aviinited) { - AVIFileRelease(pavi); - Con_Printf("%s contains no video stream\n", name); - return false; + aviinited=true; + AVIFileInit(); } - if (AVIFileGetStream(pavi, &pavisound, streamtypeAUDIO, 0)) //retrieve audio stream + if (!AVIFileOpen(&pavi, name, OF_READ, NULL))//!AVIStreamOpenFromFile(&pavi, name, streamtypeVIDEO, 0, OF_READ, NULL)) { - Con_Printf("%s contains no audio stream\n", name); - pavisound=NULL; - } - AVIFileRelease(pavi); + cin = Z_Malloc(sizeof(cin_t)); + cin->filmtype = MFT_AVI; + cin->avi.pavi = pavi; -//play with video - AVIStreamInfo(pavivideo, &psi, sizeof(psi)); - filmwidth=psi.rcFrame.right-psi.rcFrame.left; // Width Is Right Side Of Frame Minus Left - filmheight=psi.rcFrame.bottom-psi.rcFrame.top; // Height Is Bottom Of Frame Minus Top - framedata = BZ_Malloc(filmwidth*filmheight*4); - - num_frames=AVIStreamLength(pavivideo); // The Last Frame Of The Stream - filmfps=1000.0f*(float)num_frames/(float)AVIStreamSampleToTime(pavivideo,num_frames); // Calculate Rough Milliseconds Per Frame - - for (filmnwidth = 1; filmnwidthavi.pavi, &cin->avi.pavivideo, streamtypeVIDEO, 0)) //retrieve video stream { + AVIFileRelease(pavi); + Con_Printf("%s contains no video stream\n", name); + return NULL; + } + if (AVIFileGetStream(cin->avi.pavi, &cin->avi.pavisound, streamtypeAUDIO, 0)) //retrieve audio stream + { + Con_DPrintf("%s contains no audio stream\n", name); + cin->avi.pavisound=NULL; + } + AVIFileRelease(cin->avi.pavi); - pChunk = BZ_Malloc(sizeof(qbyte)*lSize); + //play with video + AVIStreamInfo(cin->avi.pavivideo, &cin->avi.psi, sizeof(cin->avi.psi)); + cin->filmwidth=cin->avi.psi.rcFrame.right-cin->avi.psi.rcFrame.left; // Width Is Right Side Of Frame Minus Left + cin->filmheight=cin->avi.psi.rcFrame.bottom-cin->avi.psi.rcFrame.top; // Height Is Bottom Of Frame Minus Top + cin->framedata = BZ_Malloc(cin->filmwidth*cin->filmheight*4); + + cin->num_frames=AVIStreamLength(cin->avi.pavivideo); // The Last Frame Of The Stream + cin->filmfps=1000.0f*(float)cin->num_frames/(float)AVIStreamSampleToTime(cin->avi.pavivideo,cin->num_frames); // Calculate Rough Milliseconds Per Frame - if(AVIStreamReadFormat(pavisound, AVIStreamStart(pavisound), pChunk, &lSize)) + AVIStreamBeginStreaming(cin->avi.pavivideo, 0, cin->num_frames, 100); + + cin->avi.pgf=AVIStreamGetFrameOpen(cin->avi.pavivideo, NULL); + + cin->currentframe=0; + cin->filmstarttime = Sys_DoubleTime(); + + cin->soundpos=0; + + + //play with sound + if (cin->avi.pavisound) + { + LONG lSize; + LPBYTE pChunk; + AVIStreamRead(cin->avi.pavisound, 0, AVISTREAMREAD_CONVENIENT, NULL, 0, &lSize, NULL); + + if (!lSize) + cin->avi.pWaveFormat = NULL; + else { - // error - Con_Printf("Failiure reading sound info\n"); + + pChunk = BZ_Malloc(sizeof(qbyte)*lSize); + + + if(AVIStreamReadFormat(cin->avi.pavisound, AVIStreamStart(cin->avi.pavisound), pChunk, &lSize)) + { + // error + Con_Printf("Failiure reading sound info\n"); + } + cin->avi.pWaveFormat = (LPWAVEFORMAT)pChunk; } - pWaveFormat = (LPWAVEFORMAT)pChunk; - } - - if (!pWaveFormat) - { - Con_Printf("VFW is broken\n"); - AVIStreamRelease(pavisound); - pavisound=NULL; - } - else if (pWaveFormat->wFormatTag != 1) - { - Con_Printf("Audio stream is not PCM\n"); //FIXME: so that it no longer is... - AVIStreamRelease(pavisound); - pavisound=NULL; + + if (!cin->avi.pWaveFormat) + { + Con_Printf("VFW is broken\n"); + AVIStreamRelease(cin->avi.pavisound); + cin->avi.pavisound=NULL; + } + else if (cin->avi.pWaveFormat->wFormatTag != 1) + { + Con_Printf("Audio stream is not PCM\n"); //FIXME: so that it no longer is... + AVIStreamRelease(cin->avi.pavisound); + cin->avi.pavisound=NULL; + } + } + cin->filmtype = MFT_AVI; + return cin; } - - - - - Con_ClearNotify(); - if (key_dest != key_console) - scr_con_current=0; - - media_filmtype = MFT_AVI; - return true; } #endif - - Con_Printf("Failed to find file %s\n", name); - return false; + + return NULL; } -qboolean Media_ShowFilm(void) +qboolean Media_DecodeFrame(cin_t *cin) { -// sfx_t *s; - static float lastframe=0; -// soundcardinfo_t *sc; - float curtime = Sys_DoubleTime(); - - switch (media_filmtype) + + switch (cin->filmtype) { case MFT_ROQ: - if (curtimenextframetime || roq_read_frame(cin->roq.roqfilm)==1) //0 if end, -1 if error, 1 if success { //#define LIMIT(x) ((x)<0xFFFF)?(x)>>16:0xFF; #define LIMIT(x) ((((x) > 0xffffff) ? 0xff0000 : (((x) <= 0xffff) ? 0 : (x) & 0xff0000)) >> 16) - unsigned char *pa=roqfilm->y[0]; - unsigned char *pb=roqfilm->u[0]; - unsigned char *pc=roqfilm->v[0]; - int _pixel=0; - int num_columns=(roqfilm->width)>>1; + unsigned char *pa=cin->roq.roqfilm->y[0]; + unsigned char *pb=cin->roq.roqfilm->u[0]; + unsigned char *pc=cin->roq.roqfilm->v[0]; + int pixel=0; + int num_columns=(cin->roq.roqfilm->width)>>1; + int num_rows=cin->roq.roqfilm->height; int y; int x; - if (!(curtimenextframetime)) //roq file was read properly { - lastframe += 1/30.0; //add a little bit of extra speed so we cover up a little bit of glitchy sound... :o) + cin->nextframetime += 1/30.0; //add a little bit of extra speed so we cover up a little bit of glitchy sound... :o) - if (lastframe < curtime) - lastframe = curtime; + if (cin->nextframetime < curtime) + cin->nextframetime = curtime; - for(y = 0; y < roqfilm->height; ++y) //roq playing doesn't give nice data. It's still fairly raw. + framedata = cin->framedata; + + for(y = 0; y < num_rows; ++y) //roq playing doesn't give nice data. It's still fairly raw. { //convert it properly. for(x = 0; x < num_columns; ++x) { @@ -1141,19 +1179,19 @@ qboolean Media_ShowFilm(void) b = 116130 * u; t=r+y1; - framedata[_pixel] =(unsigned char) LIMIT(t); + framedata[pixel] =(unsigned char) LIMIT(t); t=g+y1; - framedata[_pixel+1] =(unsigned char) LIMIT(t); + framedata[pixel+1] =(unsigned char) LIMIT(t); t=b+y1; - framedata[_pixel+2] =(unsigned char) LIMIT(t); + framedata[pixel+2] =(unsigned char) LIMIT(t); t=r+y2; - framedata[_pixel+4] =(unsigned char) LIMIT(t); + framedata[pixel+4] =(unsigned char) LIMIT(t); t=g+y2; - framedata[_pixel+5] =(unsigned char) LIMIT(t); + framedata[pixel+5] =(unsigned char) LIMIT(t); t=b+y2; - framedata[_pixel+6] =(unsigned char) LIMIT(t); - _pixel+=8; + framedata[pixel+6] =(unsigned char) LIMIT(t); + pixel+=8; } if(y & 0x01) { pb += num_columns; pc += num_columns; } @@ -1161,14 +1199,18 @@ qboolean Media_ShowFilm(void) } else if (vid.numpages == 1) //previous frame is still in page. { - SCR_SetUpToDrawConsole(); //animate the console at the right speed, but don't bother drawing it. + cin->outunchanged = true; return true; } - Media_ShowFrameRGBA_32(framedata, roqfilm->width, roqfilm->height); + cin->outunchanged = false; + cin->outtype = 1; + cin->outwidth = cin->roq.roqfilm->width; + cin->outheight = cin->roq.roqfilm->height; + cin->outdata = cin->framedata; - if (roqfilm->audio_channels && sndcardinfo && roqfilm->aud_pos < roqfilm->vid_pos) - if (roq_read_audio(roqfilm)>0) + if (cin->roq.roqfilm->audio_channels && sndcardinfo && cin->roq.roqfilm->aud_pos < cin->roq.roqfilm->vid_pos) + if (roq_read_audio(cin->roq.roqfilm)>0) { /* FILE *f; char wav[] = "\x52\x49\x46\x46\xea\x5f\x04\x00\x57\x41\x56\x45\x66\x6d\x74\x20\x12\x00\x00\x00\x01\x00\x02\x00\x22\x56\x00\x00\x88\x58\x01\x00\x04\x00\x10\x00\x00\x00\x66\x61\x63\x74\x04\x00\x00\x00\xee\x17\x01\x00\x64\x61\x74\x61\xb8\x5f\x04\x00"; @@ -1186,38 +1228,65 @@ qboolean Media_ShowFilm(void) fwrite(&size, sizeof(size), 1, f); fclose(f); */ - S_RawAudio(-1, roqfilm->audio, 22050, roqfilm->audio_size/roqfilm->audio_channels, roqfilm->audio_channels, 2); + S_RawAudio(-1, cin->roq.roqfilm->audio, 22050, cin->roq.roqfilm->audio_size/cin->roq.roqfilm->audio_channels, cin->roq.roqfilm->audio_channels, 2); } return true; } - - Media_PlayFilm(NULL); - - return false; - - - + else + { + cin->roq.roqfilm->frame_num = 0; + cin->roq.roqfilm->aud_pos = cin->roq.roqfilm->roq_start; + cin->roq.roqfilm->vid_pos = cin->roq.roqfilm->roq_start; + } + break; case MFT_STATIC: - Media_ShowFrameRGBA_32(staticfilmimage, imagewidth, imageheight); + cin->outunchanged = cin->outtype;//handy + cin->outtype = 1; + cin->outwidth = cin->image.imagewidth; + cin->outheight = cin->image.imageheight; + cin->outdata = cin->image.filmimage; return true; -#ifdef WINAVI + case MFT_CIN: + //FIXME! + if (CIN_RunCinematic()) + { + CIN_DrawCinematic(); + return true; + } + break; + + case MFT_AVI: { LPBITMAPINFOHEADER lpbi; // Holds The Bitmap Header Information + float newframe; + int newframei; - currentframe = (curtime - filmstarttime)*filmfps; + newframe = (curtime - cin->filmstarttime)*cin->filmfps; + newframei = newframe; - if (currentframe>=num_frames) - { - Media_PlayFilm(NULL); + if (newframe == cin->currentframe) + { + cin->outunchanged = true; + return true; + } + + if (cin->currentframe < newframei-1) + Con_DPrintf("Dropped %i frame(s)\n", (newframei - cin->currentframe)-1); + + cin->currentframe = newframei; + Con_DPrintf("%i\n", newframei); + + if (cin->currentframe>=cin->num_frames) + { return false; } - lpbi = (LPBITMAPINFOHEADER)AVIStreamGetFrame(pgf, currentframe); // Grab Data From The AVI Stream - currentframe++; + lpbi = (LPBITMAPINFOHEADER)AVIStreamGetFrame(cin->avi.pgf, cin->currentframe); // Grab Data From The AVI Stream + cin->currentframe++; if (!lpbi || lpbi->biBitCount != 24)//oops { SCR_SetUpToDrawConsole(); @@ -1229,51 +1298,110 @@ qboolean Media_ShowFilm(void) } else { - Media_ShowFrameBGR_24_Flip((char*)lpbi+lpbi->biSize, lpbi->biWidth, lpbi->biHeight); + cin->outtype = 3; + cin->outwidth = lpbi->biWidth; + cin->outheight = lpbi->biHeight; + cin->outdata = (char*)lpbi+lpbi->biSize; } - if (pavisound) + if (cin->avi.pavisound) { LONG lSize; LPBYTE pBuffer; LONG samples; - AVIStreamRead(pavisound, 0, AVISTREAMREAD_CONVENIENT, + AVIStreamRead(cin->avi.pavisound, 0, AVISTREAMREAD_CONVENIENT, NULL, 0, &lSize, &samples); - soundpos+=samples; + cin->soundpos+=samples; - pBuffer = framedata; + pBuffer = cin->framedata; - AVIStreamRead(pavisound, soundpos, AVISTREAMREAD_CONVENIENT, pBuffer, lSize, NULL, &samples); + AVIStreamRead(cin->avi.pavisound, cin->soundpos, AVISTREAMREAD_CONVENIENT, pBuffer, lSize, NULL, &samples); - S_RawAudio(-1, pBuffer, pWaveFormat->nSamplesPerSec, samples, pWaveFormat->nChannels, 2); + S_RawAudio(-1, pBuffer, cin->avi.pWaveFormat->nSamplesPerSec, samples, cin->avi.pWaveFormat->nChannels, 2); } } return true; -#else - case MFT_AVI: - break; -#endif - case MFT_CIN: - if (CIN_RunCinematic()) - { - CIN_DrawCinematic(); - return true; - } - break; -#ifdef WINAVI - case MFT_CAPTURE: - - return false; -#endif - case MFT_NONE: - break; } - Media_PlayFilm(NULL); return false; } + + +qboolean Media_PlayFilm(char *name) +{ + Media_ShutdownCin(fullscreenvid); + fullscreenvid = Media_StartCin(name); + + if (fullscreenvid) + { + Con_ClearNotify(); + if (key_dest != key_console) + scr_con_current=0; + return true; + } + else + return false; +} +qboolean Media_ShowFilm(void) +{ + if (!fullscreenvid) + return false; + if (!Media_DecodeFrame(fullscreenvid)) + { + Media_ShutdownCin(fullscreenvid); + fullscreenvid = NULL; + return false; + } + + switch(fullscreenvid->outtype) + { + case 1: + Media_ShowFrameRGBA_32(fullscreenvid->outdata, fullscreenvid->outwidth, fullscreenvid->outheight); + break; + case 2: + Media_ShowFrame8bit(fullscreenvid->outdata, fullscreenvid->outwidth, fullscreenvid->outheight, fullscreenvid->outpalette); + break; + case 3: + Media_ShowFrameBGR_24_Flip(fullscreenvid->outdata, fullscreenvid->outwidth, fullscreenvid->outheight); + break; + } + + return true; +} + +#ifdef RGLQUAKE +int Media_UpdateForShader(int texnum, cin_t *cin) +{ + if (!cin) + return 0; + if (!Media_DecodeFrame(cin)) + { + return 0; + } + + GL_Bind(100); + switch(cin->outtype) + { + case 1: + GL_Upload32("cin", (unsigned int*)cin->outdata, cin->outwidth, cin->outheight, false, false); + break; + case 2: + GL_Upload8("cin", cin->outdata, cin->outwidth, cin->outheight, false, false); + break; + case 3: + GL_Upload24BGR_Flip ("cin", cin->outdata, cin->outwidth, cin->outheight, false, false); + break; + } + + + return 100; +} +#endif + + + void Media_PlayFilm_f (void) { if (Cmd_Argc() < 2) @@ -1287,6 +1415,23 @@ void Media_PlayFilm_f (void) } + + + + + + + + + + + + + + + + + #if defined(RGLQUAKE) && defined(WINAVI) #define WINAVIRECORDING PAVIFILE recordavi_file; @@ -1544,7 +1689,7 @@ void Media_RecordFilm_f (void) if (capturetype == CT_AVI) { - _snprintf(filename, 192, "%s%s", com_gamedir, Cmd_Argv(1)); + snprintf(filename, 192, "%s%s", com_gamedir, Cmd_Argv(1)); COM_StripExtension(filename, filename); COM_DefaultExtension (filename, ".avi"); diff --git a/engine/client/m_multi.c b/engine/client/m_multi.c index c571f9bf1..6e1afc74d 100644 --- a/engine/client/m_multi.c +++ b/engine/client/m_multi.c @@ -39,6 +39,22 @@ void M_Menu_MultiPlayer_f (void) else if (mgt == MGT_HEXEN2) { } + else if (QBigFontWorks()) + { + MC_AddPicture(menu, 16, 4, "gfx/qplaque.lmp"); + MC_AddCenterPicture(menu, 4, "gfx/p_multi.lmp"); + + mgt=32; + menu->selecteditem = (menuoption_t*) + MC_AddConsoleCommandQBigFont (menu, 72, mgt, "Join A Game ", "menu_slist\n");mgt+=20; + MC_AddConsoleCommandQBigFont (menu, 72, 52, "Browser2 ", "menu_servers2\n");mgt+=20; + MC_AddConsoleCommandQBigFont (menu, 72, 72, "New Game ", "menu_newmulti\n");mgt+=20; + MC_AddConsoleCommandQBigFont (menu, 72, 92, "Setup ", "menu_setup\n");mgt+=20; + MC_AddConsoleCommandQBigFont (menu, 72, 112, "Demos ", "menu_demo\n");mgt+=20; + + menu->cursoritem = (menuoption_t*)MC_AddCursor(menu, 54, 32); + return; + } else { p = Draw_SafeCachePic("gfx/mp_menu.lmp"); diff --git a/engine/client/m_script.c b/engine/client/m_script.c index d37aaf6dd..86859666b 100644 --- a/engine/client/m_script.c +++ b/engine/client/m_script.c @@ -192,6 +192,29 @@ void M_MenuS_Text_f (void) } } +void M_MenuS_TextBig_f (void) +{ + menuoption_t *option; + int x = atoi(Cmd_Argv(1)); + int y = atoi(Cmd_Argv(2)); + char *text = Cmd_Argv(3); + char *command = Cmd_Argv(4); + + if (!menu_script) + { + Con_Printf("%s with no active menu\n", Cmd_Argv(0)); + return; + } + if (*command) + MC_AddConsoleCommandQBigFont(menu_script, x, y, text, command); + else + { + option = (menuoption_t *)MC_AddConsoleCommand(menu_script, x, y, text, va("set option %s\n%s\n", command, menualias.string)); + if (selectitem-- == 0) + menu_script->selecteditem = option; + } +} + void M_MenuS_Bind_f (void) { int x = atoi(Cmd_Argv(1)); @@ -231,6 +254,7 @@ void M_Script_Init(void) Cmd_AddCommand("menubox", M_MenuS_Box_f); Cmd_AddCommand("menuedit", M_MenuS_Edit_f); Cmd_AddCommand("menutext", M_MenuS_Text_f); + Cmd_AddCommand("menutextbig", M_MenuS_TextBig_f); Cmd_AddCommand("menupic", M_MenuS_Picture_f); Cmd_AddCommand("menucheck", M_MenuS_CheckBox_f); Cmd_AddCommand("menuslider", M_MenuS_Slider_f); diff --git a/engine/client/m_single.c b/engine/client/m_single.c index 3bb844273..ac62212f2 100644 --- a/engine/client/m_single.c +++ b/engine/client/m_single.c @@ -32,7 +32,7 @@ void M_ScanSaves (void) strcpy (m_filenames[i], "--- UNUSED SLOT ---"); loadable[i] = false; - _snprintf (line, sizeof(line), "saves/s%i/info.fsv", i); + snprintf (line, sizeof(line), "saves/s%i/info.fsv", i); f = FS_OpenVFS (line, "rb", FS_GAME); if (f) { @@ -163,11 +163,25 @@ void M_Menu_SinglePlayer_f (void) MC_AddConsoleCommand (menu, 64, 72, "Medium", "togglemenu\nskill 1;deathmatch 0; coop 0;map demo1\n"); MC_AddConsoleCommand (menu, 64, 80, "Hard", "togglemenu\nskill 2;deathmatch 0; coop 0;map demo1\n"); -// MC_AddConsoleCommand (menu, 64, 96, "Load Game", "menu_load\n"); + MC_AddConsoleCommand (menu, 64, 96, "Load Game", "menu_load\n"); MC_AddConsoleCommand (menu, 64, 104, "Save Game", "menu_save\n"); return; } + else if (QBigFontWorks()) + { + menu = M_CreateMenu(0); + MC_AddPicture(menu, 16, 0, "gfx/qplaque.lmp"); + MC_AddCenterPicture(menu, 0, "gfx/p_option.lmp"); + + menu->selecteditem = (menuoption_t*) + MC_AddConsoleCommandQBigFont (menu, 72, 32, "New Game", "togglemenu\nmaxclients 1;deathmatch 0;coop 0;map start\n"); + MC_AddConsoleCommandQBigFont (menu, 72, 52, "Load Game", "menu_load\n"); + MC_AddConsoleCommandQBigFont (menu, 72, 72, "Save Game", "menu_save\n"); + + menu->cursoritem = (menuoption_t*)MC_AddCursor(menu, 54, 32); + return; + } else { //q1 menu = M_CreateMenu(0); @@ -204,7 +218,7 @@ void M_Menu_SinglePlayer_f (void) b->common.width = p->width; b->common.height = 20; - menu->cursoritem = (menuoption_t*)MC_AddCursor(menu, 54, 32); + menu->cursoritem = (menuoption_t*)MC_AddCursor(menu, 54, 32); #endif } } diff --git a/engine/client/menu.h b/engine/client/menu.h index df86bbb75..91b46e285 100644 --- a/engine/client/menu.h +++ b/engine/client/menu.h @@ -116,7 +116,7 @@ struct menu_s; typedef enum {m_none, m_complex, m_help, m_keys, m_slist, m_media, m_plugin, m_menu_dat} m_state_t; extern m_state_t m_state; -typedef enum {mt_childwindow, mt_button, mt_buttonbigfont, mt_box, mt_colouredbox, mt_line, mt_edit, mt_text, mt_slider, mt_combo, mt_bind, mt_checkbox, mt_picture, mt_strechpic, mt_menudot, mt_custom} menutype_t; +typedef enum {mt_childwindow, mt_button, mt_qbuttonbigfont, mt_hexen2buttonbigfont, mt_box, mt_colouredbox, mt_line, mt_edit, mt_text, mt_slider, mt_combo, mt_bind, mt_checkbox, mt_picture, mt_strechpic, mt_menudot, mt_custom} menutype_t; typedef struct { //must be first of each structure type. menutype_t type; @@ -126,7 +126,7 @@ typedef struct { //must be first of each structure type. int height; qboolean noselectionsound:1; qboolean iszone:1; - qboolean ishidden; + qboolean ishidden:1; union menuoption_s *next; } menucommon_t; @@ -263,6 +263,8 @@ menuslider_t *MC_AddSlider(menu_t *menu, int x, int y, const char *text, cvar_t menucheck_t *MC_AddCheckBox(menu_t *menu, int x, int y, const char *text, cvar_t *var, int cvarbitmask); menucheck_t *MC_AddCheckBoxFunc(menu_t *menu, int x, int y, const char *text, qboolean (*func) (menucheck_t *option, menu_t *menu, chk_set_t set), int bits); menubutton_t *MC_AddConsoleCommand(menu_t *menu, int x, int y, const char *text, const char *command); +menubutton_t *MC_AddConsoleCommandQBigFont(menu_t *menu, int x, int y, const char *text, const char *command); +mpic_t *QBigFontWorks(void); menubutton_t *MC_AddCommand(menu_t *menu, int x, int y, char *text, qboolean (*command) (union menuoption_s *,struct menu_s *,int)); menucombo_t *MC_AddCombo(menu_t *menu, int x, int y, const char *caption, const char **text, int initialvalue); menubutton_t *MC_AddCommand(menu_t *menu, int x, int y, char *text, qboolean (*command) (union menuoption_s *,struct menu_s *,int)); diff --git a/engine/client/pr_csqc.c b/engine/client/pr_csqc.c index d167e8625..12c2da712 100644 --- a/engine/client/pr_csqc.c +++ b/engine/client/pr_csqc.c @@ -3468,7 +3468,7 @@ void VARGS CSQC_Abort (char *format, ...) //an error occured. char string[1024]; va_start (argptr, format); - _vsnprintf (string,sizeof(string)-1, format,argptr); + vsnprintf (string,sizeof(string)-1, format,argptr); va_end (argptr); Con_Printf("CSQC_Abort: %s\nShutting down csqc\n", string); @@ -3522,7 +3522,7 @@ qbyte *CSQC_PRLoadFile (char *path, void *buffer, int bufsize) if (!strcmp(path, "csprogs.dat")) { char newname[MAX_QPATH]; - _snprintf(newname, MAX_QPATH, "csprogsvers/%x.dat", csqcchecksum); + snprintf(newname, MAX_QPATH, "csprogsvers/%x.dat", csqcchecksum); file = COM_LoadStackFile(newname, buffer, bufsize); if (file) @@ -3553,7 +3553,7 @@ int CSQC_PRFileSize (char *path) if (!strcmp(path, "csprogs.dat")) { char newname[MAX_QPATH]; - _snprintf(newname, MAX_QPATH, "csprogsvers/%x.dat", csqcchecksum); + snprintf(newname, MAX_QPATH, "csprogsvers/%x.dat", csqcchecksum); file = COM_LoadTempFile (newname); if (file) diff --git a/engine/client/pr_menu.c b/engine/client/pr_menu.c index aec52b1e3..83c9b8991 100644 --- a/engine/client/pr_menu.c +++ b/engine/client/pr_menu.c @@ -1353,7 +1353,7 @@ void VARGS Menu_Abort (char *format, ...) char string[1024]; va_start (argptr, format); - _vsnprintf (string,sizeof(string)-1, format,argptr); + vsnprintf (string,sizeof(string)-1, format,argptr); va_end (argptr); Con_Printf("Menu_Abort: %s\nShutting down menu.dat\n", string); diff --git a/engine/client/quakedef.h b/engine/client/quakedef.h index b5f7062ab..7c57f5b4b 100644 --- a/engine/client/quakedef.h +++ b/engine/client/quakedef.h @@ -184,6 +184,18 @@ extern "C" { #define min(a,b) ((a) < (b) ? (a) : (b)) #endif + +#ifdef _WIN32 +//msvc crap +#define snprintf linuxlike_snprintf +int VARGS linuxlike_snprintf(char *buffer, int size, const char *format, ...); +#define vsnprintf linuxlike_vsnprintf +int VARGS linuxlike_vsnprintf(char *buffer, int size, const char *format, va_list argptr); + +#define _vsnprintf unsafe_vsnprintf +#define _snprintf unsafe_snprintf +#endif + //============================================================================= // the host system specifies the base of the directory tree, the diff --git a/engine/client/r_bulleten.c b/engine/client/r_bulleten.c index 83135db7a..fdb58baf3 100644 --- a/engine/client/r_bulleten.c +++ b/engine/client/r_bulleten.c @@ -399,7 +399,7 @@ player_info_t *s; { GL_Bind(a->texture->gl_texturenum); - GL_Upload8 ((qbyte *)a->texture + a->texture->offsets[0], a->texture->width, a->texture->height, false, false); + GL_Upload8 ("bulleten", (qbyte *)a->texture + a->texture->offsets[0], a->texture->width, a->texture->height, false, false); } #endif } diff --git a/engine/client/r_efrag.c b/engine/client/r_efrag.c index 73d481ba7..a3a1096b2 100644 --- a/engine/client/r_efrag.c +++ b/engine/client/r_efrag.c @@ -279,6 +279,7 @@ void R_StoreEfrags (efrag_t **ppefrag) (cl_numvisedicts < MAX_VISEDICTS)) { pent->frame1time = cl.time; + pent->frame2time = cl.time; cl_visedicts[cl_numvisedicts++] = *pent; // mark that we've recorded this entity for this frame diff --git a/engine/client/renderer.c b/engine/client/renderer.c index bb6cf9a0c..cc8a00b52 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -33,7 +33,7 @@ cvar_t r_viewmodelsize = SCVAR("r_viewmodelsize","1"); cvar_t r_drawviewmodelinvis = SCVAR("r_drawviewmodelinvis", "0"); cvar_t r_netgraph = SCVAR("r_netgraph","0"); cvar_t r_speeds = SCVARF("r_speeds","0", CVAR_CHEAT); -cvar_t r_waterwarp = SCVAR("r_waterwarp","1"); +cvar_t r_waterwarp = SCVARF("r_waterwarp","1", CVAR_ARCHIVE); cvar_t r_drawentities = SCVAR("r_drawentities","1"); cvar_t r_fullbright = SCVARF("r_fullbright","0", CVAR_CHEAT); cvar_t r_ambient = SCVARF("r_ambient", "0", CVAR_CHEAT); @@ -79,7 +79,7 @@ cvar_t r_stains = SCVARF("r_stains", "0.75", CVAR_ARCHIVE); cvar_t r_stainfadetime = SCVAR("r_stainfadetime", "1"); cvar_t r_stainfadeammount = SCVAR("r_stainfadeammount", "1"); -cvar_t _windowed_mouse = SCVAR("_windowed_mouse","1"); +cvar_t _windowed_mouse = SCVARF("_windowed_mouse","1", CVAR_ARCHIVE); cvar_t vid_wait = SCVAR("vid_wait","0"); cvar_t _vid_wait_override = SCVARF("_vid_wait_override", "", CVAR_ARCHIVE); @@ -96,16 +96,16 @@ static cvar_t vid_height = SCVARF("vid_height", "480", CVAR_ARCHIVE|CVAR_RENDERE static cvar_t vid_refreshrate = SCVARF("vid_displayfrequency", "0", CVAR_ARCHIVE|CVAR_RENDERERLATCH); cvar_t gl_texturemode = SCVAR("gl_texturemode", "GL_LINEAR_MIPMAP_NEAREST"); -cvar_t gl_motionblur = SCVAR("gl_motionblur", "0"); +cvar_t gl_motionblur = SCVARF("gl_motionblur", "0", CVAR_ARCHIVE); cvar_t gl_motionblurscale = SCVAR("gl_motionblurscale", "1"); cvar_t gl_fontedgeclamp = SCVAR("gl_fontedgeclamp", "0"); //gl blends. Set this to 1 to stop the outside of your conchars from being visible cvar_t gl_font = SCVAR("gl_font", ""); cvar_t gl_conback = SCVAR("gl_conback", ""); cvar_t gl_smoothfont = SCVAR("gl_smoothfont", "1"); cvar_t gl_part_flame = SCVAR("gl_part_flame", "1"); -cvar_t r_part_rain = SCVAR("r_part_rain", "0"); +cvar_t r_part_rain = SCVARF("r_part_rain", "0", CVAR_ARCHIVE); -cvar_t r_bouncysparks = SCVAR("r_bouncysparks", "0"); +cvar_t r_bouncysparks = SCVARF("r_bouncysparks", "0", CVAR_ARCHIVE); cvar_t r_fullbrightSkins = SCVARF("r_fullbrightSkins", "1", CVAR_SEMICHEAT); cvar_t r_fb_models = SCVARF("gl_fb_models", "1", CVAR_SEMICHEAT|CVAR_RENDERERLATCH); //as it can highlight the gun a little... ooo nooo.... @@ -114,7 +114,7 @@ cvar_t r_fb_bmodels = SCVARF("gl_fb_bmodels", "1", CVAR_SEMICHEAT|CVAR_RENDERERL cvar_t r_shadow_bumpscale_basetexture = SCVAR("r_shadow_bumpscale_basetexture", "4"); cvar_t r_shadow_bumpscale_bumpmap = SCVAR("r_shadow_bumpscale_bumpmap", "10"); cvar_t gl_nocolors = SCVAR("gl_nocolors","0"); -cvar_t gl_load24bit = SCVAR("gl_load24bit", "1"); +cvar_t gl_load24bit = SCVARF("gl_load24bit", "1", CVAR_ARCHIVE); cvar_t vid_conwidth = SCVARF("vid_conwidth", "640", CVAR_ARCHIVE); cvar_t vid_conheight = SCVARF("vid_conheight", "480", CVAR_ARCHIVE); cvar_t gl_nobind = SCVAR("gl_nobind", "0"); @@ -122,7 +122,7 @@ cvar_t gl_max_size = SCVAR("gl_max_size", "1024"); cvar_t gl_picmip = SCVAR("gl_picmip", "0"); cvar_t gl_picmip2d = SCVAR("gl_picmip2d", "0"); cvar_t r_drawdisk = SCVAR("r_drawdisk", "1"); -cvar_t gl_compress = SCVAR("gl_compress", "0"); +cvar_t gl_compress = SCVARF("gl_compress", "0", CVAR_ARCHIVE); cvar_t gl_savecompressedtex = SCVAR("gl_savecompressedtex", "0"); extern cvar_t gl_dither; extern cvar_t gl_maxdist; @@ -133,7 +133,7 @@ cvar_t gl_detail = SCVARF("gl_detail", "0", CVAR_ARCHIVE); cvar_t gl_detailscale = SCVAR("gl_detailscale", "5"); cvar_t gl_overbright = SCVARF("gl_overbright", "0", CVAR_ARCHIVE); cvar_t r_shadows = SCVARF("r_shadows", "0", CVAR_ARCHIVE|CVAR_RENDERERLATCH); -cvar_t r_shadow_realtime_world = SCVARF("r_shadow_realtime_world", "0", CVAR_CHEAT); +cvar_t r_shadow_realtime_world = SCVARF("r_shadow_realtime_world", "0", CVAR_CHEAT|CVAR_ARCHIVE); cvar_t r_shadow_realtime_world_lightmaps = SCVARF("r_shadow_realtime_world_lightmaps", "0.8", CVAR_CHEAT); cvar_t r_noaliasshadows = SCVARF("r_noaliasshadows", "0", CVAR_ARCHIVE); cvar_t gl_maxshadowlights = SCVARF("gl_maxshadowlights", "2", CVAR_ARCHIVE); @@ -199,8 +199,8 @@ extern cvar_t r_fullbright; extern cvar_t r_shadows; extern cvar_t r_mirroralpha; extern cvar_t r_wateralpha; -cvar_t r_dynamic = SCVAR("r_dynamic","1"); -cvar_t r_flashblend = SCVAR("gl_flashblend","0"); +cvar_t r_dynamic = SCVARF("r_dynamic","1", CVAR_ARCHIVE); +cvar_t r_flashblend = SCVARF("gl_flashblend","0", CVAR_ARCHIVE); cvar_t r_lightstylesmooth = SCVAR("r_lightstylesmooth", "0"); cvar_t r_lightstylespeed = SCVAR("r_lightstylespeed", "10"); extern cvar_t r_novis; @@ -1173,6 +1173,9 @@ void M_Menu_Video_f (void) extern cvar_t r_stains, v_contrast; #if defined(SWQUAKE) extern cvar_t d_smooth; +#endif +#if defined(RGLQUAKE) + extern cvar_t r_bloom; #endif extern cvar_t r_bouncysparks; static const char *modenames[128] = {"Custom"}; @@ -1313,6 +1316,7 @@ void M_Menu_Video_f (void) #endif #ifdef RGLQUAKE MC_AddCheckBox(menu, 16, y, " GL Bumpmapping", &gl_bump,0); y+=8; + MC_AddCheckBox(menu, 16, y, " Bloom", &r_bloom,0); y+=8; #endif MC_AddCheckBox(menu, 16, y, " Dynamic lights", &r_dynamic,0); y+=8; MC_AddSlider(menu, 16, y, " Screen size", &scr_viewsize, 30, 120);y+=8; diff --git a/engine/client/sbar.c b/engine/client/sbar.c index 44b27c592..8ff99f2eb 100644 --- a/engine/client/sbar.c +++ b/engine/client/sbar.c @@ -376,7 +376,7 @@ void SCR_DrawField (int x, int y, int color, int width, int value) if (width > 5) width = 5; - _snprintf (num, sizeof(num), "%i", value); + snprintf (num, sizeof(num), "%i", value); l = strlen(num); if (l > width) l = width; diff --git a/engine/client/sys_win.c b/engine/client/sys_win.c index 800f608fd..52db681d7 100644 --- a/engine/client/sys_win.c +++ b/engine/client/sys_win.c @@ -93,7 +93,7 @@ void *Sys_GetGameAPI (void *parms) #else _getcwd (cwd, sizeof(cwd)); #endif - _snprintf (name, sizeof(name), "%s/%s/%s", cwd, debugdir, gamename); + snprintf (name, sizeof(name), "%s/%s/%s", cwd, debugdir, gamename); game_library = LoadLibrary ( name ); if (game_library) { @@ -119,7 +119,7 @@ void *Sys_GetGameAPI (void *parms) path = COM_NextPath (path); if (!path) return NULL; // couldn't find one anywhere - _snprintf (name, sizeof(name), "%s/%s", path, gamename); + snprintf (name, sizeof(name), "%s/%s", path, gamename); game_library = LoadLibrary (name); if (game_library) { @@ -176,7 +176,7 @@ int VARGS Sys_DebugLog(char *file, char *fmt, ...) static char data[1024]; va_start(argptr, fmt); - _vsnprintf(data, sizeof(data)-1, fmt, argptr); + vsnprintf(data, sizeof(data)-1, fmt, argptr); va_end(argptr); #if defined(CRAZYDEBUGGING) && CRAZYDEBUGGING > 1 @@ -368,6 +368,7 @@ int Sys_EnumerateFiles (char *gpath, char *match, int (*func)(char *, int, void HANDLE r; WIN32_FIND_DATA fd; char apath[MAX_OSPATH]; + char apath2[MAX_OSPATH]; char file[MAX_OSPATH]; char *s; int go; @@ -381,21 +382,21 @@ int Sys_EnumerateFiles (char *gpath, char *match, int (*func)(char *, int, void break; } *s = '\0'; - + //this is what we ask windows for. sprintf(file, "%s/*.*", apath); //we need to make apath contain the path in match but not gpath - strcpy(apath, match); + Q_strncpyz(apath2, match, sizeof(apath)); match = s+1; - for (s = apath+strlen(apath)-1; s> apath; s--) + for (s = apath2+strlen(apath2)-1; s> apath2; s--) { if (*s == '/') break; } *s = '\0'; - if (s != apath) - strcat(apath, "/"); + if (s != apath2) + strcat(apath2, "/"); r = FindFirstFile(file, &fd); if (r==(HANDLE)-1) @@ -408,7 +409,7 @@ int Sys_EnumerateFiles (char *gpath, char *match, int (*func)(char *, int, void { if (wildcmp(match, fd.cFileName)) { - sprintf(file, "%s%s/", apath, fd.cFileName); + sprintf(file, "%s%s/", apath2, fd.cFileName); go = func(file, fd.nFileSizeLow, parm); } } @@ -416,7 +417,7 @@ int Sys_EnumerateFiles (char *gpath, char *match, int (*func)(char *, int, void { if (wildcmp(match, fd.cFileName)) { - sprintf(file, "%s%s", apath, fd.cFileName); + sprintf(file, "%s%s", apath2, fd.cFileName); go = func(file, fd.nFileSizeLow, parm); } } @@ -545,7 +546,7 @@ void VARGS Sys_Error (const char *error, ...) // DWORD dummy; va_start (argptr, error); - _vsnprintf (text, sizeof(text)-1, error, argptr); + vsnprintf (text, sizeof(text), error, argptr); va_end (argptr); SetHookState(false); @@ -571,7 +572,7 @@ void VARGS Sys_Printf (char *fmt, ...) return; va_start (argptr,fmt); - _vsnprintf (text, sizeof(text)-1, fmt, argptr); + vsnprintf (text, sizeof(text), fmt, argptr); va_end (argptr); WriteFile (houtput, text, strlen(text), &dummy, NULL); @@ -1101,9 +1102,6 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin if (!GetCurrentDirectory (sizeof(cwd), cwd)) Sys_Error ("Couldn't determine current directory"); - if (cwd[Q_strlen(cwd)-1] == '/' || cwd[Q_strlen(cwd)-1] == '\\') - cwd[Q_strlen(cwd)-1] = 0; - TL_InitLanguages(); //tprints are now allowed @@ -1233,12 +1231,12 @@ int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin #endif { // yield the CPU for a little while when paused, minimized, or not the focus - if (((cl.paused && (!ActiveApp && !DDActive)) || Minimized || block_drawing) && !media_filmtype) + if (((cl.paused && (!ActiveApp && !DDActive)) || Minimized || block_drawing) && !Media_PlayingFullScreen()) { SleepUntilInput (PAUSE_SLEEP); scr_skipupdate = 1; // no point in bothering to draw } - else if (!ActiveApp && !DDActive && !media_filmtype) + else if (!ActiveApp && !DDActive && !Media_PlayingFullScreen()) { SleepUntilInput (NOT_FOCUS_SLEEP); } diff --git a/engine/client/view.c b/engine/client/view.c index af5c2e6d5..907d7c42a 100644 --- a/engine/client/view.c +++ b/engine/client/view.c @@ -87,7 +87,7 @@ cvar_t gl_cshiftpercent = SCVAR("gl_cshiftpercent", "100"); cvar_t v_bonusflash = SCVAR("v_bonusflash", "0"); -cvar_t v_contentblend = SCVAR("v_contentblend", "0"); +cvar_t v_contentblend = SCVARF("v_contentblend", "0", CVAR_ARCHIVE); cvar_t v_damagecshift = SCVAR("v_damagecshift", "0"); cvar_t v_quadcshift = SCVAR("v_quadcshift", "0"); cvar_t v_suitcshift = SCVAR("v_suitcshift", "0"); diff --git a/engine/common/cmd.c b/engine/common/cmd.c index 75d5b33b5..8c2041367 100644 --- a/engine/common/cmd.c +++ b/engine/common/cmd.c @@ -488,7 +488,7 @@ void Cmd_Exec_f (void) f = Cmd_Argv(1); if (!*f) f = "fte"; - _snprintf(name, sizeof(name)-5, "configs/%s", f); + snprintf(name, sizeof(name)-5, "configs/%s", f); COM_DefaultExtension(name, ".cfg"); } else @@ -615,7 +615,7 @@ void Cmd_Alias_f (void) { if (Cmd_FromGamecode()) { - _snprintf(cmd, sizeof(cmd), "%s_a", s); + snprintf(cmd, sizeof(cmd), "%s_a", s); Con_Printf ("Can't register alias, %s is a cvar\nAlias has been named %s instead\n", s, cmd); s = cmd; } @@ -631,7 +631,7 @@ void Cmd_Alias_f (void) { if (Cmd_FromGamecode()) { - _snprintf(cmd, sizeof(cmd), "%s_a", s); + snprintf(cmd, sizeof(cmd), "%s_a", s); Con_Printf ("Can't register alias, %s is a command\nAlias has been named %s instead\n", s, cmd); s = cmd; } diff --git a/engine/common/common.c b/engine/common/common.c index f99e5079a..598b80d55 100644 --- a/engine/common/common.c +++ b/engine/common/common.c @@ -164,11 +164,7 @@ void VARGS Q_snprintfz (char *dest, size_t size, char *fmt, ...) va_list argptr; va_start (argptr, fmt); -#ifdef _WIN32 - _vsnprintf (dest, size, fmt, argptr); -#else vsnprintf (dest, size, fmt, argptr); -#endif va_end (argptr); dest[size-1] = 0; @@ -2336,7 +2332,7 @@ char *VARGS va(char *format, ...) bufnum &= (VA_BUFFERS-1); va_start (argptr, format); - _vsnprintf (string[bufnum],sizeof(string[bufnum])-1, format,argptr); + vsnprintf (string[bufnum],sizeof(string[bufnum])-1, format,argptr); va_end (argptr); return string[bufnum]; @@ -2669,7 +2665,7 @@ void Info_SetValueForStarKey (char *s, const char *key, const char *value, int m if (!value || !strlen(value)) return; - _snprintf (newv, sizeof(newv), "\\%s\\%s", key, value); + snprintf (newv, sizeof(newv), "\\%s\\%s", key, value); if ((int)(strlen(newv) + strlen(s) + 1) > maxsize) { @@ -3068,3 +3064,40 @@ int build_number( void ) return b; } + + + +int VARGS linuxlike_snprintf(char *buffer, int size, const char *format, ...) +{ +#undef _vsnprintf + int ret; + va_list argptr; + + if (size <= 0) + return 0; + size--; + + va_start (argptr, format); + ret = _vsnprintf (buffer,size, format,argptr); + va_end (argptr); + + buffer[size] = '\0'; + + return ret; +} + +int VARGS linuxlike_vsnprintf(char *buffer, int size, const char *format, va_list argptr) +{ +#undef _vsnprintf + int ret; + + if (size <= 0) + return 0; + size--; + + ret = _vsnprintf (buffer,size, format,argptr); + + buffer[size] = '\0'; + + return ret; +} diff --git a/engine/common/fs.c b/engine/common/fs.c index 925c6109f..376f44b33 100644 --- a/engine/common/fs.c +++ b/engine/common/fs.c @@ -269,7 +269,8 @@ vfsfile_t *VFSOS_Open(char *osname, char *mode) vfsfile_t *FSOS_OpenVFS(void *handle, flocation_t *loc, char *mode) { char diskname[MAX_OSPATH]; - _snprintf(diskname, sizeof(diskname), "%s/%s", (char*)handle, loc->rawname); + + snprintf(diskname, sizeof(diskname), "%s/%s", (char*)handle, loc->rawname); return VFSOS_Open(diskname, mode); } @@ -330,7 +331,7 @@ qboolean FSOS_FLocate(void *handle, flocation_t *loc, char *filename, void *hash */ // check a file in the directory tree - _snprintf (netpath, sizeof(netpath)-1, "%s/%s",(char*)handle, filename); + snprintf (netpath, sizeof(netpath)-1, "%s/%s",(char*)handle, filename); f = fopen(netpath, "rb"); if (!f) @@ -450,7 +451,7 @@ qboolean FSPAK_FLocate(void *handle, flocation_t *loc, char *filename, void *has if (loc) { loc->index = pf - pak->files; - _snprintf(loc->rawname, sizeof(loc->rawname), "%s/%s", pak->descname, filename); + snprintf(loc->rawname, sizeof(loc->rawname), "%s/%s", pak->descname, filename); loc->offset = pf->filepos; loc->len = pf->filelen; } @@ -1606,9 +1607,9 @@ qboolean Sys_PathProtection(char *pattern) if (strchr(pattern, '\\')) { char *s; + Con_Printf("Warning: \\ charactures in filename %s\n", pattern); while((s = strchr(pattern, '\\'))) *s = '/'; - Con_Printf("Warning: \\ charactures in filename %s\n", pattern); } if (strstr(pattern, "..")) @@ -1806,7 +1807,7 @@ vfsfile_t *FS_OpenVFS(char *filename, char *mode, int relativeto) //blanket-bans - if (Sys_PathProtection(filename)) + if (Sys_PathProtection(filename) ) return NULL; @@ -1819,38 +1820,38 @@ vfsfile_t *FS_OpenVFS(char *filename, char *mode, int relativeto) case FS_GAMEONLY: //OS access only, no paks if (*com_homedir) { - _snprintf(fullname, sizeof(fullname), "%s/%s/%s", com_homedir, gamedirfile, filename); + snprintf(fullname, sizeof(fullname), "%s%s/%s", com_homedir, gamedirfile, filename); vfs = VFSOS_Open(fullname, mode); if (vfs) return vfs; } - _snprintf(fullname, sizeof(fullname), "%s/%s/%s", com_quakedir, gamedirfile, filename); + snprintf(fullname, sizeof(fullname), "%s%s/%s", com_quakedir, gamedirfile, filename); return VFSOS_Open(fullname, mode); case FS_GAME: if (*com_homedir) - _snprintf(fullname, sizeof(fullname), "%s/%s/%s", com_homedir, gamedirfile, filename); + snprintf(fullname, sizeof(fullname), "%s%s/%s", com_homedir, gamedirfile, filename); else - _snprintf(fullname, sizeof(fullname), "%s/%s/%s", com_quakedir, gamedirfile, filename); + snprintf(fullname, sizeof(fullname), "%s%s/%s", com_quakedir, gamedirfile, filename); break; case FS_BASE: if (*com_homedir) { - _snprintf(fullname, sizeof(fullname), "%s/%s", com_homedir, filename); + snprintf(fullname, sizeof(fullname), "%s%s", com_homedir, filename); vfs = VFSOS_Open(fullname, mode); if (vfs) return vfs; } - _snprintf(fullname, sizeof(fullname), "%s/%s", com_quakedir, filename); + snprintf(fullname, sizeof(fullname), "%s%s", com_quakedir, filename); return VFSOS_Open(fullname, mode); case FS_CONFIGONLY: if (*com_homedir) { - _snprintf(fullname, sizeof(fullname), "%s/fte/%s", com_homedir, filename); + snprintf(fullname, sizeof(fullname), "%sfte/%s", com_homedir, filename); vfs = VFSOS_Open(fullname, mode); if (vfs) return vfs; } - _snprintf(fullname, sizeof(fullname), "%s/fte/%s", com_quakedir, filename); + snprintf(fullname, sizeof(fullname), "%sfte/%s", com_quakedir, filename); return VFSOS_Open(fullname, mode); default: Sys_Error("FS_CreatePath: Bad relative path"); @@ -1880,21 +1881,21 @@ int FS_Rename2(char *oldf, char *newf, int oldrelativeto, int newrelativeto) { case FS_GAME: if (*com_homedir) - _snprintf(oldfullname, sizeof(oldfullname), "%s/%s/", com_homedir, gamedirfile); + snprintf(oldfullname, sizeof(oldfullname), "%s%s/", com_homedir, gamedirfile); else - _snprintf(oldfullname, sizeof(oldfullname), "%s/%s/", com_quakedir, gamedirfile); + snprintf(oldfullname, sizeof(oldfullname), "%s%s/", com_quakedir, gamedirfile); break; case FS_SKINS: if (*com_homedir) - _snprintf(oldfullname, sizeof(oldfullname), "%s/qw/skins/", com_homedir); + snprintf(oldfullname, sizeof(oldfullname), "%sqw/skins/", com_homedir); else - _snprintf(oldfullname, sizeof(oldfullname), "%s/qw/skins/", com_quakedir); + snprintf(oldfullname, sizeof(oldfullname), "%sqw/skins/", com_quakedir); break; case FS_BASE: if (*com_homedir) - _snprintf(oldfullname, sizeof(oldfullname), "%s/", com_homedir); + snprintf(oldfullname, sizeof(oldfullname), "%s", com_homedir); else - _snprintf(oldfullname, sizeof(oldfullname), "%s/", com_quakedir); + snprintf(oldfullname, sizeof(oldfullname), "%s", com_quakedir); break; default: Sys_Error("FS_Rename case not handled\n"); @@ -1904,21 +1905,21 @@ int FS_Rename2(char *oldf, char *newf, int oldrelativeto, int newrelativeto) { case FS_GAME: if (*com_homedir) - _snprintf(newfullname, sizeof(newfullname), "%s/%s/", com_homedir, gamedirfile); + snprintf(newfullname, sizeof(newfullname), "%s%s/", com_homedir, gamedirfile); else - _snprintf(newfullname, sizeof(newfullname), "%s/%s/", com_quakedir, gamedirfile); + snprintf(newfullname, sizeof(newfullname), "%s%s/", com_quakedir, gamedirfile); break; case FS_SKINS: if (*com_homedir) - _snprintf(newfullname, sizeof(newfullname), "%s/qw/skins/", com_homedir); + snprintf(newfullname, sizeof(newfullname), "%sqw/skins/", com_homedir); else - _snprintf(newfullname, sizeof(newfullname), "%s/qw/skins/", com_quakedir); + snprintf(newfullname, sizeof(newfullname), "%sqw/skins/", com_quakedir); break; case FS_BASE: if (*com_homedir) - _snprintf(newfullname, sizeof(newfullname), "%s/", com_homedir); + snprintf(newfullname, sizeof(newfullname), "%s", com_homedir); else - _snprintf(newfullname, sizeof(newfullname), "%s/", com_quakedir); + snprintf(newfullname, sizeof(newfullname), "%s", com_quakedir); break; default: Sys_Error("FS_Rename case not handled\n"); @@ -1938,21 +1939,21 @@ int FS_Rename(char *oldf, char *newf, int relativeto) { case FS_GAME: if (*com_homedir) - _snprintf(fullname, sizeof(fullname), "%s/%s/", com_homedir, gamedirfile); + snprintf(fullname, sizeof(fullname), "%s%s/", com_homedir, gamedirfile); else - _snprintf(fullname, sizeof(fullname), "%s/%s/", com_quakedir, gamedirfile); + snprintf(fullname, sizeof(fullname), "%s%s/", com_quakedir, gamedirfile); break; case FS_SKINS: if (*com_homedir) - _snprintf(fullname, sizeof(fullname), "%s/qw/skins/", com_homedir); + snprintf(fullname, sizeof(fullname), "%sqw/skins/", com_homedir); else - _snprintf(fullname, sizeof(fullname), "%s/qw/skins/", com_quakedir); + snprintf(fullname, sizeof(fullname), "%sqw/skins/", com_quakedir); break; case FS_BASE: if (*com_homedir) - _snprintf(fullname, sizeof(fullname), "%s/", com_homedir); + snprintf(fullname, sizeof(fullname), "%s", com_homedir); else - _snprintf(fullname, sizeof(fullname), "%s/", com_quakedir); + snprintf(fullname, sizeof(fullname), "%s", com_quakedir); break; default: Sys_Error("FS_Rename case not handled\n"); @@ -1967,21 +1968,21 @@ int FS_Remove(char *fname, int relativeto) { case FS_GAME: if (*com_homedir) - _snprintf(fullname, sizeof(fullname), "%s/%s/%s", com_homedir, gamedirfile, fname); + snprintf(fullname, sizeof(fullname), "%s%s/%s", com_homedir, gamedirfile, fname); else - _snprintf(fullname, sizeof(fullname), "%s/%s/%s", com_quakedir, gamedirfile, fname); + snprintf(fullname, sizeof(fullname), "%s%s/%s", com_quakedir, gamedirfile, fname); break; case FS_SKINS: if (*com_homedir) - _snprintf(fullname, sizeof(fullname), "%s/qw/skins/%s", com_homedir, fname); + snprintf(fullname, sizeof(fullname), "%sqw/skins/%s", com_homedir, fname); else - _snprintf(fullname, sizeof(fullname), "%s/qw/skins/%s", com_quakedir, fname); + snprintf(fullname, sizeof(fullname), "%sqw/skins/%s", com_quakedir, fname); break; case FS_BASE: if (*com_homedir) - _snprintf(fullname, sizeof(fullname), "%s/%s", com_homedir, fname); + snprintf(fullname, sizeof(fullname), "%s%s", com_homedir, fname); else - _snprintf(fullname, sizeof(fullname), "%s/%s", com_quakedir, fname); + snprintf(fullname, sizeof(fullname), "%s%s", com_quakedir, fname); break; default: Sys_Error("FS_Rename case not handled\n"); @@ -1996,25 +1997,25 @@ void FS_CreatePath(char *pname, int relativeto) { case FS_GAMEONLY: case FS_GAME: - _snprintf(fullname, sizeof(fullname), "%s/%s", com_gamedir, pname); + snprintf(fullname, sizeof(fullname), "%s%s", com_gamedir, pname); break; case FS_BASE: if (*com_homedir) - _snprintf(fullname, sizeof(fullname), "%s/%s", com_homedir, pname); + snprintf(fullname, sizeof(fullname), "%s%s", com_homedir, pname); else - _snprintf(fullname, sizeof(fullname), "%s/%s", com_quakedir, pname); + snprintf(fullname, sizeof(fullname), "%s%s", com_quakedir, pname); break; case FS_SKINS: if (*com_homedir) - _snprintf(fullname, sizeof(fullname), "%s/qw/skins/%s", com_homedir, pname); + snprintf(fullname, sizeof(fullname), "%sqw/skins/%s", com_homedir, pname); else - _snprintf(fullname, sizeof(fullname), "%s/qw/skins/%s", com_quakedir, pname); + snprintf(fullname, sizeof(fullname), "%sqw/skins/%s", com_quakedir, pname); break; case FS_CONFIGONLY: if (*com_homedir) - _snprintf(fullname, sizeof(fullname), "%s/fte/%s", com_homedir, pname); + snprintf(fullname, sizeof(fullname), "%sfte/%s", com_homedir, pname); else - _snprintf(fullname, sizeof(fullname), "%s/fte/%s", com_quakedir, pname); + snprintf(fullname, sizeof(fullname), "%sfte/%s", com_quakedir, pname); break; default: Sys_Error("FS_CreatePath: Bad relative path"); @@ -2540,10 +2541,10 @@ static void COM_AddDataFiles(char *pathto, searchpath_t *search, char *extension for (i=0 ; ; i++) { - _snprintf (pakfile, sizeof(pakfile), "pak%i.%s", i, extension); + snprintf (pakfile, sizeof(pakfile), "pak%i.%s", i, extension); if (!search->funcs->FindFile(search->handle, &loc, pakfile, NULL)) break; //not found.. - _snprintf (pakfile, sizeof(pakfile), "%spak%i.%s", pathto, i, extension); + snprintf (pakfile, sizeof(pakfile), "%spak%i.%s", pathto, i, extension); vfs = search->funcs->OpenVFS(search->handle, &loc, "r"); if (!vfs) break; @@ -2551,7 +2552,7 @@ static void COM_AddDataFiles(char *pathto, searchpath_t *search, char *extension handle = funcs->OpenNew (vfs, pakfile); if (!handle) break; - _snprintf (pakfile, sizeof(pakfile), "%spak%i.%s/", pathto, i, extension); + snprintf (pakfile, sizeof(pakfile), "%spak%i.%s/", pathto, i, extension); COM_AddPathHandle(pakfile, funcs, handle, true, false, (unsigned int)-1); } @@ -2589,7 +2590,7 @@ void COM_AddGameDirectory (char *dir, unsigned int loadstuff) if ((p = strrchr(dir, '/')) != NULL) strcpy(gamedirfile, ++p); else - strcpy(gamedirfile, p); + strcpy(gamedirfile, dir); strcpy (com_gamedir, dir); for (search = com_searchpaths; search; search = search->next) @@ -2722,9 +2723,9 @@ void COM_Gamedir (char *dir) // Cache_Flush (); - COM_AddGameDirectory(va("%s/%s", com_quakedir, dir), (unsigned int)-1); + COM_AddGameDirectory(va("%s%s", com_quakedir, dir), (unsigned int)-1); if (*com_homedir) - COM_AddGameDirectory(va("%s/%s", com_homedir, dir), (unsigned int)-1); + COM_AddGameDirectory(va("%s%s", com_homedir, dir), (unsigned int)-1); #ifndef SERVERONLY @@ -3018,6 +3019,17 @@ void COM_InitFilesystem (void) else strcpy (com_quakedir, host_parms.basedir); + if (*com_quakedir) + { + if (com_quakedir[strlen(com_quakedir)-1] == '\\') + com_quakedir[strlen(com_quakedir)-1] = '/'; + else if (com_quakedir[strlen(com_quakedir)-1] != '/') + { + com_quakedir[strlen(com_quakedir)+1] = '\0'; + com_quakedir[strlen(com_quakedir)] = '/'; + } + } + Cvar_Register(&com_gamename, "evil hacks"); @@ -3026,7 +3038,7 @@ void COM_InitFilesystem (void) { if (!gamemode_info[i].auniquefile) continue; //no more - f = fopen(va("%s/%s", com_quakedir, gamemode_info[i].auniquefile), "rb"); + f = fopen(va("%s%s", com_quakedir, gamemode_info[i].auniquefile), "rb"); if (f) { fclose(f); @@ -3088,9 +3100,8 @@ void COM_InitFilesystem (void) if (*com_homedir) { + strcat(com_homedir, "/.fte/"); Con_Printf("Using home directory \"%s\"\n", com_homedir); - - strcat(com_homedir, "/.fte"); } // @@ -3101,7 +3112,7 @@ void COM_InitFilesystem (void) { do //use multiple -basegames { - COM_AddGameDirectory (va("%s/%s", com_quakedir, com_argv[i+1]), (unsigned int)-1); + COM_AddGameDirectory (va("%s%s", com_quakedir, com_argv[i+1]), (unsigned int)-1); i = COM_CheckNextParm ("-basegame", i); } @@ -3110,17 +3121,17 @@ void COM_InitFilesystem (void) else { if (gamemode_info[gamenum].dir1) - COM_AddGameDirectory (va("%s/%s", com_quakedir, gamemode_info[gamenum].dir1), (unsigned int)-1); + COM_AddGameDirectory (va("%s%s", com_quakedir, gamemode_info[gamenum].dir1), (unsigned int)-1); if (gamemode_info[gamenum].dir2) - COM_AddGameDirectory (va("%s/%s", com_quakedir, gamemode_info[gamenum].dir2), (unsigned int)-1); + COM_AddGameDirectory (va("%s%s", com_quakedir, gamemode_info[gamenum].dir2), (unsigned int)-1); if (gamemode_info[gamenum].dir3) - COM_AddGameDirectory (va("%s/%s", com_quakedir, gamemode_info[gamenum].dir3), (unsigned int)-1); + COM_AddGameDirectory (va("%s%s", com_quakedir, gamemode_info[gamenum].dir3), (unsigned int)-1); if (gamemode_info[gamenum].dir4) - COM_AddGameDirectory (va("%s/%s", com_quakedir, gamemode_info[gamenum].dir4), (unsigned int)-1); + COM_AddGameDirectory (va("%s%s", com_quakedir, gamemode_info[gamenum].dir4), (unsigned int)-1); } if (*com_homedir) - COM_AddGameDirectory (va("%s/fte", com_homedir), (unsigned int)-1); + COM_AddGameDirectory (va("%sfte", com_homedir), (unsigned int)-1); // any set gamedirs will be freed up to here com_base_searchpaths = com_searchpaths; @@ -3128,7 +3139,7 @@ void COM_InitFilesystem (void) i = COM_CheckParm ("-game"); //effectivly replace with +gamedir x (But overridable) if (i && i < com_argc-1) { - COM_AddGameDirectory (va("%s/%s", com_quakedir, com_argv[i+1]), (unsigned int)-1); + COM_AddGameDirectory (va("%s%s", com_quakedir, com_argv[i+1]), (unsigned int)-1); #ifndef CLIENTONLY Info_SetValueForStarKey (svs.info, "*gamedir", com_argv[i+1], MAX_SERVERINFO_STRING); diff --git a/engine/common/gl_q2bsp.c b/engine/common/gl_q2bsp.c index 6de938653..baeb9a08d 100644 --- a/engine/common/gl_q2bsp.c +++ b/engine/common/gl_q2bsp.c @@ -45,6 +45,8 @@ void SWMod_LoadLighting (lump_t *l); void Q2BSP_SetHullFuncs(hull_t *hull); qboolean CM_Trace(model_t *model, int forcehullnum, int frame, vec3_t start, vec3_t end, vec3_t mins, vec3_t maxs, trace_t *trace); +qboolean CM_NativeTrace(model_t *model, int forcehullnum, int frame, vec3_t start, vec3_t end, vec3_t mins, vec3_t maxs, unsigned int contents, trace_t *trace); +unsigned int CM_NativeContents(struct model_s *model, int hulloverride, int frame, vec3_t p, vec3_t mins, vec3_t maxs); unsigned int Q2BSP_PointContents(model_t *mod, vec3_t p); qbyte areabits[MAX_Q2MAP_AREAS/8]; @@ -1243,7 +1245,7 @@ void CMod_LoadTexInfo (lump_t *l) //yes I know these load from the same place if (*lwr >= 'A' && *lwr <= 'Z') *lwr = *lwr - 'A' + 'a'; } - _snprintf (name, sizeof(name), "textures/%s.wal", in->texture); + snprintf (name, sizeof(name), "textures/%s.wal", in->texture); out->texture = Mod_LoadWall (name); if (!out->texture || !out->texture->width || !out->texture->height) @@ -3621,6 +3623,8 @@ q2cmodel_t *CM_LoadMap (char *name, char *filein, qboolean clientload, unsigned #endif loadmodel->funcs.Trace = CM_Trace; loadmodel->funcs.PointContents = Q2BSP_PointContents; + loadmodel->funcs.NativeTrace = CM_NativeTrace; + loadmodel->funcs.NativeContents = CM_NativeContents; #ifndef SERVERONLY //light grid info @@ -3707,6 +3711,8 @@ q2cmodel_t *CM_LoadMap (char *name, char *filein, qboolean clientload, unsigned loadmodel->funcs.LeafnumForPoint = CM_PointLeafnum; loadmodel->funcs.Trace = CM_Trace; loadmodel->funcs.PointContents = Q2BSP_PointContents; + loadmodel->funcs.NativeTrace = CM_NativeTrace; + loadmodel->funcs.NativeContents = CM_NativeContents; break; #if defined(RGLQUAKE) @@ -3747,6 +3753,8 @@ q2cmodel_t *CM_LoadMap (char *name, char *filein, qboolean clientload, unsigned loadmodel->funcs.LeafnumForPoint = CM_PointLeafnum; loadmodel->funcs.Trace = CM_Trace; loadmodel->funcs.PointContents = Q2BSP_PointContents; + loadmodel->funcs.NativeTrace = CM_NativeTrace; + loadmodel->funcs.NativeContents = CM_NativeContents; break; #endif #if defined(SWQUAKE) @@ -3787,6 +3795,8 @@ q2cmodel_t *CM_LoadMap (char *name, char *filein, qboolean clientload, unsigned loadmodel->funcs.LeafnumForPoint = CM_PointLeafnum; loadmodel->funcs.Trace = CM_Trace; loadmodel->funcs.PointContents = Q2BSP_PointContents; + loadmodel->funcs.NativeTrace = CM_NativeTrace; + loadmodel->funcs.NativeContents = CM_NativeContents; break; #endif default: @@ -4055,6 +4065,8 @@ void CM_SetTempboxSize (vec3_t mins, vec3_t maxs) model_t *CM_TempBoxModel(vec3_t mins, vec3_t maxs) { + if (box_planes == NULL) + CM_InitBoxHull(); CM_SetTempboxSize(mins, maxs); return &box_model; } @@ -4227,6 +4239,61 @@ int CM_PointContents (model_t *mod, vec3_t p) return contents; } +unsigned int CM_NativeContents(struct model_s *model, int hulloverride, int frame, vec3_t p, vec3_t mins, vec3_t maxs) +{ + int contents; + if (!DotProduct(mins, mins) && !DotProduct(maxs, maxs)) + return CM_PointContents(model, p); + + if (!model) // map not loaded + return 0; + + + { + int i, j, k; + mleaf_t *leaf; + q2cbrush_t *brush; + q2cbrushside_t *brushside; + vec3_t absmin, absmax; + + int leaflist[64]; + + k = CM_BoxLeafnums (model, absmin, absmax, leaflist, 64, NULL); + + contents = 0; + for (k--; k >= 0; k--) + { + leaf = &map_leafs[leaflist[k]]; + if (mapisq3) + { + for (i = 0; i < leaf->numleafbrushes; i++) + { + brush = &map_brushes[map_leafbrushes[leaf->firstleafbrush + i]]; + + // check if brush actually adds something to contents + if ( (contents & brush->contents) == brush->contents ) { + continue; + } + + brushside = &map_brushsides[brush->firstbrushside]; + for ( j = 0; j < brush->numsides; j++, brushside++ ) + { + if ( PlaneDiff (p, brushside->plane) > 0 ) + break; + } + + if (j == brush->numsides) + contents |= brush->contents; + } + } + else + contents |= leaf->contents; + } + } + + return contents; +} + /* ================== CM_TransformedPointContents @@ -5020,6 +5087,11 @@ qboolean CM_Trace(model_t *model, int forcehullnum, int frame, vec3_t start, vec *trace = CM_BoxTrace(model, start, end, mins, maxs, MASK_PLAYERSOLID); return trace->fraction != 1; } +qboolean CM_NativeTrace(model_t *model, int forcehullnum, int frame, vec3_t start, vec3_t end, vec3_t mins, vec3_t maxs, unsigned int contents, trace_t *trace) +{ + *trace = CM_BoxTrace(model, start, end, mins, maxs, contents); + return trace->fraction != 1; +} /* ================== diff --git a/engine/common/log.c b/engine/common/log.c index 7434bfca1..d060c4f32 100644 --- a/engine/common/log.c +++ b/engine/common/log.c @@ -182,14 +182,14 @@ void Con_Log (char *s) i = log_rotate_files.value; // unlink file at the top of the chain - _snprintf(oldf, sizeof(oldf)-1, "%s.%i", f, i); + snprintf(oldf, sizeof(oldf)-1, "%s.%i", f, i); FS_Remove(oldf, FS_BASE); // rename files through chain for (x = i-1; x > 0; x--) { strcpy(newf, oldf); - _snprintf(oldf, sizeof(oldf)-1, "%s.%i", f, x); + snprintf(oldf, sizeof(oldf)-1, "%s.%i", f, x); // check if file exists, otherwise skip if ((fi = FS_OpenVFS(f, "rb", FS_BASE))) diff --git a/engine/common/net_chan.c b/engine/common/net_chan.c index 66c00b25a..683b128ae 100644 --- a/engine/common/net_chan.c +++ b/engine/common/net_chan.c @@ -146,7 +146,7 @@ void VARGS Netchan_OutOfBandPrint (netsrc_t sock, netadr_t adr, char *format, .. static char string[8192]; // ??? why static? va_start (argptr, format); - _vsnprintf (string,sizeof(string)-1, format,argptr); + vsnprintf (string,sizeof(string)-1, format,argptr); va_end (argptr); @@ -163,7 +163,7 @@ void VARGS Netchan_OutOfBandTPrintf (netsrc_t sock, netadr_t adr, int language, string[0] = A2C_PRINT; va_start (argptr, text); - _vsnprintf (string+1,sizeof(string)-2, format,argptr); + vsnprintf (string+1,sizeof(string)-1, format,argptr); va_end (argptr); diff --git a/engine/common/qvm.c b/engine/common/qvm.c index 1adc0f47a..302dfe5aa 100644 --- a/engine/common/qvm.c +++ b/engine/common/qvm.c @@ -87,7 +87,7 @@ void *Sys_LoadDLL(const char *name, void **vmMain, sys_calldll_t syscall) gpath = COM_NextPath (gpath); if (!gpath) return NULL; // couldn't find one anywhere - _snprintf (name, sizeof(name), "%s/%s", gpath, dllname); + snprintf (name, sizeof(name), "%s/%s", gpath, dllname); hVM = LoadLibrary (name); if (hVM) { diff --git a/engine/common/translate.c b/engine/common/translate.c index febf68179..d26e1a140 100644 --- a/engine/common/translate.c +++ b/engine/common/translate.c @@ -232,7 +232,7 @@ static char *defaultlanguagetext = "TLC_CONNECTFIRST \"Must be connected.\\n\"\n" "TLC_SYNTAX_DOWNLOAD \"Usage: download \\n\"\n" "TLC_REQUIRESSERVERMOD \"%s is only available with server support\\n\"\n" -"TLC_CLIENTCON_ERROR_ENDGAME \"Host_EndGame: %s\\n\"\n" +"TLC_CLIENTCON_ERROR_ENDGAME \"Host_EndGame: "S_ERROR"%s\\n\"\n" "TLC_HOSTFATALERROR \"Host_Error: %s\\n\"\n" "TLC_CONFIGCFG_WRITEFAILED \"Couldn't write config.cfg.\\n\"\n" "TLC_HOSTSPEEDSOUTPUT \"%3i tot %3i server %3i gfx %3i snd\\n\"\n" diff --git a/engine/common/ui_public.h b/engine/common/ui_public.h index 465920eb8..6deeb5929 100644 --- a/engine/common/ui_public.h +++ b/engine/common/ui_public.h @@ -147,7 +147,7 @@ typedef enum { UI_CVAR_RESET, UI_CVAR_CREATE, UI_CVAR_INFOSTRINGBUFFER, - UI_ARGC, + UI_ARGC,//10 UI_ARGV, UI_CMD_EXECUTETEXT, UI_FS_FOPENFILE, @@ -157,7 +157,7 @@ typedef enum { UI_FS_GETFILELIST, UI_R_REGISTERMODEL, UI_R_REGISTERSKIN, - UI_R_REGISTERSHADERNOMIP, + UI_R_REGISTERSHADERNOMIP,//20 UI_R_CLEARSCENE, UI_R_ADDREFENTITYTOSCENE, UI_R_ADDPOLYTOSCENE, @@ -167,7 +167,7 @@ typedef enum { UI_R_DRAWSTRETCHPIC, UI_UPDATESCREEN, UI_CM_LERPTAG, - UI_CM_LOADMODEL, + UI_CM_LOADMODEL,//30 UI_S_REGISTERSOUND, UI_S_STARTLOCALSOUND, UI_KEY_KEYNUMTOSTRINGBUF, @@ -177,7 +177,7 @@ typedef enum { UI_KEY_GETOVERSTRIKEMODE, UI_KEY_SETOVERSTRIKEMODE, UI_KEY_CLEARSTATES, - UI_KEY_GETCATCHER, + UI_KEY_GETCATCHER,//40 UI_KEY_SETCATCHER, UI_GETCLIPBOARDDATA, UI_GETGLCONFIG, @@ -187,7 +187,7 @@ typedef enum { UI_LAN_CLEARPING, UI_LAN_GETPING, UI_LAN_GETPINGINFO, - UI_CVAR_REGISTER, + UI_CVAR_REGISTER,//50 UI_CVAR_UPDATE, UI_MEMORY_REMAINING, UI_GET_CDKEY, @@ -197,7 +197,7 @@ typedef enum { UI_PC_ADD_GLOBAL_DEFINE, UI_PC_LOAD_SOURCE, UI_PC_FREE_SOURCE, - UI_PC_READ_TOKEN, + UI_PC_READ_TOKEN,//60 UI_PC_SOURCE_FILE_AND_LINE, UI_S_STOPBACKGROUNDTRACK, UI_S_STARTBACKGROUNDTRACK, @@ -207,7 +207,7 @@ typedef enum { UI_LAN_GETSERVERINFO, UI_LAN_MARKSERVERVISIBLE, UI_LAN_UPDATEVISIBLEPINGS, - UI_LAN_RESETPINGS, + UI_LAN_RESETPINGS,//70 UI_LAN_LOADCACHEDSERVERS, UI_LAN_SAVECACHEDSERVERS, UI_LAN_ADDSERVER, @@ -217,7 +217,7 @@ typedef enum { UI_CIN_RUNCINEMATIC, UI_CIN_DRAWCINEMATIC, UI_CIN_SETEXTENTS, - UI_R_REMAP_SHADER, + UI_R_REMAP_SHADER,//80 UI_VERIFY_CDKEY, UI_LAN_SERVERSTATUS, UI_LAN_GETSERVERPING, @@ -225,7 +225,7 @@ typedef enum { UI_LAN_COMPARESERVERS, // 1.32 UI_FS_SEEK, - UI_SET_PBCLSTATUS, + UI_SET_PBCLSTATUS,//87 UI_MEMSET = 100, UI_MEMCPY, diff --git a/engine/ftequake/ftequake.dsp b/engine/ftequake/ftequake.dsp index 1f0f7bdc1..7e2561f63 100644 --- a/engine/ftequake/ftequake.dsp +++ b/engine/ftequake/ftequake.dsp @@ -3066,6 +3066,8 @@ SOURCE=..\gl\gl_bloom.c !ELSEIF "$(CFG)" == "ftequake - Win32 Release Dedicated Server" +# PROP Exclude_From_Build 1 + !ELSEIF "$(CFG)" == "ftequake - Win32 MinSW" !ELSEIF "$(CFG)" == "ftequake - Win32 GLDebugQ3" diff --git a/engine/gl/gl_alias.c b/engine/gl/gl_alias.c index 3f6aca9e2..74ed8ca91 100644 --- a/engine/gl/gl_alias.c +++ b/engine/gl/gl_alias.c @@ -1050,12 +1050,12 @@ static galiastexnum_t *GL_ChooseSkin(galiasinfo_t *inf, char *modelname, int sur if (e->scoreboard && e->scoreboard->skin && !gl_nocolors.value) { - sprintf(hashname, "%s$%s$%i", modelname, e->scoreboard->skin->name, surfnum); + snprintf(hashname, sizeof(hashname), "%s$%s$%i", modelname, e->scoreboard->skin->name, surfnum); skinname = hashname; } else if (surfnum) { - sprintf(hashname, "%s$%i", modelname, surfnum); + snprintf(hashname, sizeof(hashname), "%s$%i", modelname, surfnum); skinname = hashname; } else @@ -2787,7 +2787,7 @@ static qboolean VARGS TryAddSkin(char *skinname, ...) va_start (argptr, skinname); - _vsnprintf (string,sizeof(string)-1, skinname,argptr); + vsnprintf (string,sizeof(string)-1, skinname,argptr); va_end (argptr); string[MAX_QPATH-1] = '\0'; @@ -2979,7 +2979,6 @@ static void *Q1_LoadFrameGroup (daliasframetype_t *pframetype, int *seamremaps) vec3_t *verts; frame = (galiasgroup_t*)((char *)galias + galias->groupofs); - frame->loop = true; for (i = 0; i < pq1inmodel->numframes; i++) { @@ -3029,6 +3028,7 @@ static void *Q1_LoadFrameGroup (daliasframetype_t *pframetype, int *seamremaps) pose = (galiaspose_t *)Hunk_Alloc(LittleLong(ingroup->numframes)*(sizeof(galiaspose_t) + sizeof(vec3_t)*2*galias->numverts)); frame->poseofs = (char *)pose - (char *)frame; frame->numposes = LittleLong(ingroup->numframes); + frame->loop = true; galias->groups++; verts = (vec3_t *)(pose+frame->numposes); @@ -3143,30 +3143,30 @@ static void *Q1_LoadSkins (daliasskintype_t *pskintype, qboolean alpha) //LH's naming scheme ("models" is likly to be ignored) fbtexture = 0; bumptexture = 0; - _snprintf(skinname, sizeof(skinname), "%s_%i.", loadmodel->name, i); + snprintf(skinname, sizeof(skinname), "%s_%i.", loadmodel->name, i); texture = Mod_LoadReplacementTexture(skinname, "models", true, false, true); if (texture) { - _snprintf(skinname, sizeof(skinname), "%s_%i_luma.", loadmodel->name, i); + snprintf(skinname, sizeof(skinname), "%s_%i_luma.", loadmodel->name, i); fbtexture = Mod_LoadReplacementTexture(skinname, "models", true, false, true); if (gl_bump.value) { - sprintf(skinname, "%s_%i_bump", loadmodel->name, i); + snprintf(skinname, sizeof(skinname), "%s_%i_bump", loadmodel->name, i); bumptexture = Mod_LoadBumpmapTexture(skinname, "models"); } } else { - sprintf(skinname, "%s_%i", loadname, i); + snprintf(skinname, sizeof(skinname), "%s_%i", loadname, i); texture = Mod_LoadReplacementTexture(skinname, "models", true, false, true); if (texture && r_fb_models.value) { - sprintf(skinname, "%s_%i_luma", loadname, i); + snprintf(skinname, sizeof(skinname), "%s_%i_luma", loadname, i); fbtexture = Mod_LoadReplacementTexture(skinname, "models", true, true, true); } if (texture && gl_bump.value) { - sprintf(skinname, "%s_%i_bump", loadname, i); + snprintf(skinname, sizeof(skinname), "%s_%i_bump", loadname, i); bumptexture = Mod_LoadBumpmapTexture(skinname, "models"); } } @@ -3182,16 +3182,16 @@ static void *Q1_LoadSkins (daliasskintype_t *pskintype, qboolean alpha) GLMod_FloodFillSkin(saved, outskin->skinwidth, outskin->skinheight); //the extra underscore is to stop - sprintf(skinname, "%s__%i", loadname, i); + snprintf(skinname, sizeof(skinname), "%s__%i", loadname, i); texture = GL_LoadTexture(skinname, outskin->skinwidth, outskin->skinheight, saved, true, alpha); if (r_fb_models.value) { - sprintf(skinname, "%s__%i_luma", loadname, i); + snprintf(skinname, sizeof(skinname), "%s__%i_luma", loadname, i); fbtexture = GL_LoadTextureFB(skinname, outskin->skinwidth, outskin->skinheight, saved, true, true); } if (gl_bump.value) { - sprintf(skinname, "%s__%i_bump", loadname, i); + snprintf(skinname, sizeof(skinname), "%s__%i_bump", loadname, i); bumptexture = GL_LoadTexture8Bump(skinname, outskin->skinwidth, outskin->skinheight, saved, true, true); } } @@ -4245,7 +4245,7 @@ void GL_LoadQ3Model(model_t *mod, void *buffer) pose->scale_origin[1] = 0; pose->scale_origin[2] = 0; - _snprintf(group->name, sizeof(group->name)-1, "frame%i", i); + snprintf(group->name, sizeof(group->name)-1, "frame%i", i); group->numposes = 1; group->rate = 1; diff --git a/engine/gl/gl_backend.c b/engine/gl/gl_backend.c index ccf28a05f..89ac33516 100644 --- a/engine/gl/gl_backend.c +++ b/engine/gl/gl_backend.c @@ -1123,7 +1123,7 @@ void R_VertexTCBase ( int tcgen, int unit ) } else if ( tcgen == TC_GEN_ENVIRONMENT ) { - RB_CalcEnvironmentTexCoords(outCoords); //use genuine q3 code, to get it totally identical + RB_CalcEnvironmentTexCoords(outCoords); //use genuine q3 code, to get it totally identical (for cell shading effects) //plus, it looks like less overhead too //I guess it depends on the size of the mesh /* @@ -1196,7 +1196,7 @@ R_ShaderpassTex */ int R_ShaderpassTex ( shaderpass_t *pass ) { - if (pass->flags & (SHADER_PASS_ANIMMAP|SHADER_PASS_LIGHTMAP|SHADER_PASS_DELUXMAP)) + if (pass->flags & (SHADER_PASS_ANIMMAP|SHADER_PASS_LIGHTMAP|SHADER_PASS_VIDEOMAP|SHADER_PASS_DELUXMAP)) { if ( pass->flags & SHADER_PASS_ANIMMAP ) { return pass->anim_frames[(int)(pass->anim_fps * r_localShaderTime) % pass->anim_numframes]; @@ -1207,7 +1207,11 @@ int R_ShaderpassTex ( shaderpass_t *pass ) } else if ( (pass->flags & SHADER_PASS_DELUXMAP) && r_lmtex >= 0 ) { - return deluxmap_textures[r_lmtex]; + return lightmap_textures[r_lmtex+1]; + } + else if ( (pass->flags & SHADER_PASS_VIDEOMAP)) + { + return Media_UpdateForShader(pass->anim_frames[0], pass->cin); } } @@ -1887,6 +1891,13 @@ void R_RenderMeshCombined ( meshbuffer_t *mb, shaderpass_t *pass ) { switch ( pass->blendmode ) { + case GL_DOT3_RGB_ARB: + GL_TexEnv (GL_COMBINE_EXT); + qglTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE); + qglTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB); + qglTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, pass->blendmode); + break; + case GL_REPLACE: case GL_MODULATE: case GL_ADD: diff --git a/engine/gl/gl_bloom.c b/engine/gl/gl_bloom.c index 180d24b7b..8a51e6639 100644 --- a/engine/gl/gl_bloom.c +++ b/engine/gl/gl_bloom.c @@ -62,7 +62,7 @@ static float Diamond4x[4][4] = { static int BLOOM_SIZE; -cvar_t r_bloom = FCVAR("r_bloom", "gl_bloom", "0", 0); +cvar_t r_bloom = FCVAR("r_bloom", "gl_bloom", "0", CVAR_ARCHIVE); cvar_t r_bloom_alpha = SCVAR("r_bloom_alpha", "0.5"); cvar_t r_bloom_diamond_size = SCVAR("r_bloom_diamond_size", "8"); cvar_t r_bloom_intensity = SCVAR("r_bloom_intensity", "1"); diff --git a/engine/gl/gl_draw.c b/engine/gl/gl_draw.c index 31c6b805e..6a4d2c538 100644 --- a/engine/gl/gl_draw.c +++ b/engine/gl/gl_draw.c @@ -194,7 +194,7 @@ void Scrap_Upload (void) { scrap_uploads++; GL_Bind(scrap_texnum); - GL_Upload8 (scrap_texels[0], BLOCK_WIDTH, BLOCK_HEIGHT, false, true); + GL_Upload8 ("scrap", scrap_texels[0], BLOCK_WIDTH, BLOCK_HEIGHT, false, true); scrap_dirty = false; } @@ -357,15 +357,13 @@ mpic_t *GLDraw_SafeCachePic (char *path) if (glmenu_numcachepics == MAX_CACHED_PICS) Sys_Error ("menu_numcachepics == MAX_CACHED_PICS"); - - // // load the pic from disk // { char *mem; char alternatename[MAX_QPATH]; - _snprintf(alternatename, MAX_QPATH-1, "pics/%s.pcx", path); + snprintf(alternatename, sizeof(alternatename), "pics/%s.pcx", path); data = COM_LoadMallocFile (alternatename); if (data) { @@ -393,7 +391,7 @@ mpic_t *GLDraw_SafeCachePic (char *path) { char *mem; char alternatename[MAX_QPATH]; - _snprintf(alternatename, MAX_QPATH-1, "%s", path); + snprintf(alternatename, MAX_QPATH-1, "%s", path); data = COM_LoadMallocFile (alternatename); if (data) { @@ -435,7 +433,7 @@ mpic_t *GLDraw_SafeCachePic (char *path) { char *mem; char alternatename[MAX_QPATH]; - _snprintf(alternatename, MAX_QPATH-1,"%s.jpg", path); + snprintf(alternatename, MAX_QPATH-1,"%s.jpg", path); data = COM_LoadMallocFile (alternatename); if (data) { @@ -2422,6 +2420,16 @@ void MediaGL_ShowFrameBGR_24_Flip(qbyte *framedata, int inwidth, int inheight) dest = uploadmemorybufferintermediate; //change from bgr bottomup to rgba topdown + for (filmnwidth = 1; filmnwidth < inwidth; filmnwidth*=2) + ; + for (filmnheight = 1; filmnheight < inheight; filmnheight*=2) + ; + + if (filmnwidth > 512) + filmnwidth = 512; + if (filmnheight > 512) + filmnheight = 512; + if (inwidth*inheight > sizeofuploadmemorybufferintermediate/4) Sys_Error("MediaGL_ShowFrameBGR_24_Flip: image too big (%i*%i)", inwidth, inheight); @@ -3122,6 +3130,154 @@ done: } } +void GL_Upload24BGR (char *name, qbyte *framedata, int inwidth, int inheight, qboolean mipmap, qboolean alpha) +{ + int outwidth, outheight; + int y, x; + + int v; + unsigned int f, fstep; + qbyte *src, *dest; + dest = uploadmemorybufferintermediate; + //change from bgr bottomup to rgba topdown + + for (outwidth = 1; outwidth < inwidth; outwidth*=2) + ; + for (outheight = 1; outheight < inheight; outheight*=2) + ; + + if (outwidth > 512) + outwidth = 512; + if (outheight > 512) + outheight = 512; + + if (outwidth*outheight > sizeofuploadmemorybufferintermediate/4) + Sys_Error("MediaGL_ShowFrameBGR_24_Flip: image too big (%i*%i)", inwidth, inheight); + + for (y=0 ; y>16)*3+2]; + *dest++ = src[(f>>16)*3+1]; + *dest++ = src[(f>>16)*3+0]; + *dest++ = 255; + f += fstep; + } + for ( ; x ; x-=4) //loop through the remaining chunks. + { + dest[0] = src[(f>>16)*3+2]; + dest[1] = src[(f>>16)*3+1]; + dest[2] = src[(f>>16)*3+0]; + dest[3] = 255; + f += fstep; + + dest[4] = src[(f>>16)*3+2]; + dest[5] = src[(f>>16)*3+1]; + dest[6] = src[(f>>16)*3+0]; + dest[7] = 255; + f += fstep; + + dest[8] = src[(f>>16)*3+2]; + dest[9] = src[(f>>16)*3+1]; + dest[10] = src[(f>>16)*3+0]; + dest[11] = 255; + f += fstep; + + dest[12] = src[(f>>16)*3+2]; + dest[13] = src[(f>>16)*3+1]; + dest[14] = src[(f>>16)*3+0]; + dest[15] = 255; + f += fstep; + + dest += 16; + } + } + } + + GL_Upload32 (name, (unsigned int*)uploadmemorybufferintermediate, outwidth, outheight, mipmap, alpha); +} +void GL_Upload24BGR_Flip (char *name, qbyte *framedata, int inwidth, int inheight, qboolean mipmap, qboolean alpha) +{ + int outwidth, outheight; + int y, x; + + int v; + unsigned int f, fstep; + qbyte *src, *dest; + dest = uploadmemorybufferintermediate; + //change from bgr bottomup to rgba topdown + + for (outwidth = 1; outwidth < inwidth; outwidth*=2) + ; + for (outheight = 1; outheight < inheight; outheight*=2) + ; + + if (outwidth > 512) + outwidth = 512; + if (outheight > 512) + outheight = 512; + + if (outwidth*outheight > sizeofuploadmemorybufferintermediate/4) + Sys_Error("MediaGL_ShowFrameBGR_24_Flip: image too big (%i*%i)", inwidth, inheight); + + for (y=1 ; y<=outheight ; y++) + { + v = ((outheight - y)*(float)inheight/outheight); + src = framedata + v*(inwidth*3); + { + f = 0; + fstep = ((inwidth)*0x10000)/outwidth; + + for (x=outwidth ; x&3 ; x--) //do the odd ones first. (bigger condition) + { + *dest++ = src[(f>>16)*3+2]; + *dest++ = src[(f>>16)*3+1]; + *dest++ = src[(f>>16)*3+0]; + *dest++ = 255; + f += fstep; + } + for ( ; x ; x-=4) //loop through the remaining chunks. + { + dest[0] = src[(f>>16)*3+2]; + dest[1] = src[(f>>16)*3+1]; + dest[2] = src[(f>>16)*3+0]; + dest[3] = 255; + f += fstep; + + dest[4] = src[(f>>16)*3+2]; + dest[5] = src[(f>>16)*3+1]; + dest[6] = src[(f>>16)*3+0]; + dest[7] = 255; + f += fstep; + + dest[8] = src[(f>>16)*3+2]; + dest[9] = src[(f>>16)*3+1]; + dest[10] = src[(f>>16)*3+0]; + dest[11] = 255; + f += fstep; + + dest[12] = src[(f>>16)*3+2]; + dest[13] = src[(f>>16)*3+1]; + dest[14] = src[(f>>16)*3+0]; + dest[15] = 255; + f += fstep; + + dest += 16; + } + } + } + + GL_Upload32 (name, (unsigned int*)uploadmemorybufferintermediate, outwidth, outheight, mipmap, alpha); +} + + void GL_Upload8Grey (unsigned char*data, int width, int height, qboolean mipmap) { int samples; @@ -3486,7 +3642,7 @@ unsigned ColorPercent[16] = 25, 51, 76, 102, 114, 127, 140, 153, 165, 178, 191, 204, 216, 229, 237, 247 }; -void GL_Upload8 (qbyte *data, int width, int height, qboolean mipmap, qboolean alpha) +void GL_Upload8 (char *name, qbyte *data, int width, int height, qboolean mipmap, qboolean alpha) { unsigned *trans = (unsigned *)uploadmemorybufferintermediate; int i, s; @@ -3583,7 +3739,7 @@ void GL_Upload8 (qbyte *data, int width, int height, qboolean mipmap, qboolean #endif #endif - GL_Upload32 (NULL, trans, width, height, mipmap, alpha); + GL_Upload32 (name, trans, width, height, mipmap, alpha); } void GL_Upload8FB (qbyte *data, int width, int height, qboolean mipmap) @@ -3753,7 +3909,7 @@ TRACE(("dbg: GL_LoadTexture: new %s\n", identifier)); GL_Bind(texture_extension_number ); - GL_Upload8 (data, width, height, mipmap, alpha); + GL_Upload8 ("8bit", data, width, height, mipmap, alpha); texture_extension_number++; @@ -3932,7 +4088,7 @@ int GL_LoadCompressed(char *name) return 0; - _snprintf(inname, sizeof(inname)-1, "tex/%s.tex", name); + snprintf(inname, sizeof(inname)-1, "tex/%s.tex", name); file = COM_LoadFile(inname, 5); if (!file) return 0; diff --git a/engine/gl/gl_draw.h b/engine/gl/gl_draw.h index 762e40b0d..46aacb2e0 100644 --- a/engine/gl/gl_draw.h +++ b/engine/gl/gl_draw.h @@ -51,3 +51,5 @@ void GLDraw_LevelPic (mpic_t *pic); void GLDraw_ImageColours(float r, float g, float b, float a); void GLDraw_Image(float x, float y, float w, float h, float s1, float t1, float s2, float t2, mpic_t *pic); + +void R_BloomRegister(void); diff --git a/engine/gl/gl_heightmap.c b/engine/gl/gl_heightmap.c index 8a5cd73d7..6d431a90c 100644 --- a/engine/gl/gl_heightmap.c +++ b/engine/gl/gl_heightmap.c @@ -10,7 +10,7 @@ //it's built into 16 seperate display lists, these display lists are individually culled, but the drivers are expected to optimise them too. //Tei claims 14x speedup with a single display list. hopefully we can achieve the same speed by culling per-texture. //we get 20->130 -//perhaps we should build it with multitexture? +//perhaps we should build it with multitexture? (no - slower on ati) #define SECTIONS 8 @@ -29,7 +29,7 @@ typedef struct { #define DISPLISTS -//#define MULTITEXTURE //ATI suck. I don't know about anyone else. +//#define MULTITEXTURE //ATI suck. I don't know about anyone else (this goes at 1/5th the speed). void GL_DrawHeightmapModel (entity_t *e) { @@ -45,17 +45,18 @@ void GL_DrawHeightmapModel (entity_t *e) model_t *m = e->model; heightmap_t *hm = m->terrain; - qglColor4f(1, 1, 1, 1); if (e->model == cl.worldmodel) { + qglColor4f(1, 1, 1, 1); + R_ClearSkyBox(); R_ForceSkyBox(); R_DrawSkyBox(NULL); } + else + qglColor4fv(e->shaderRGBAf); qglEnable(GL_CULL_FACE); - qglColor4fv(e->shaderRGBAf); - for (x = 0; x < hm->numsegs; x++) { mins[0] = (x+0)*hm->terrainscale*hm->terrainsize/hm->numsegs; @@ -273,6 +274,11 @@ unsigned int Heightmap_PointContents(model_t *model, vec3_t org) heightmap_t *hm = model->terrain; return Heightmap_PointContentsHM(hm, 0, org); } +unsigned int Heightmap_NativeBoxContents(model_t *model, int hulloverride, int frame, vec3_t org, vec3_t mins, vec3_t maxs) +{ + heightmap_t *hm = model->terrain; + return Heightmap_PointContentsHM(hm, mins[2], org); +} void Heightmap_Normal(heightmap_t *hm, vec3_t org, vec3_t norm) { @@ -568,6 +574,11 @@ qboolean Heightmap_Trace(model_t *model, int forcehullnum, int frame, vec3_t sta return trace->fraction != 1; } +qboolean Heightmap_NativeTrace(struct model_s *model, int hulloverride, int frame, vec3_t p1, vec3_t p2, vec3_t mins, vec3_t maxs, unsigned int against, struct trace_s *trace) +{ + return Heightmap_Trace(model, hulloverride, frame, p1, p2, mins, maxs, trace); +} + #endif void Heightmap_FatPVS (model_t *mod, vec3_t org, qboolean add) { @@ -602,6 +613,8 @@ int Heightmap_LeafForPoint (model_t *model, vec3_t point) return 0; } +//Heightmap_NativeBoxContents + void GL_LoadHeightmapModel (model_t *mod, void *buffer) { heightmap_t *hm; @@ -744,6 +757,10 @@ void GL_LoadHeightmapModel (model_t *mod, void *buffer) mod->funcs.Trace = Heightmap_Trace; mod->funcs.PointContents = Heightmap_PointContents; + + mod->funcs.NativeContents = Heightmap_NativeBoxContents; + mod->funcs.NativeTrace = Heightmap_NativeTrace; + mod->funcs.LightPointValues = Heightmap_LightPointValues; mod->funcs.StainNode = Heightmap_StainNode; mod->funcs.MarkLights = Heightmap_MarkLights; diff --git a/engine/gl/gl_model.c b/engine/gl/gl_model.c index 9a34ecd71..7a575c1e5 100644 --- a/engine/gl/gl_model.c +++ b/engine/gl/gl_model.c @@ -953,7 +953,7 @@ TRACE(("dbg: GLMod_LoadTextures: inittexturedescs\n")); if (r_fb_bmodels.value) { - _snprintf(altname, sizeof(altname)-1, "%s_luma", mt->name); + snprintf(altname, sizeof(altname)-1, "%s_luma", mt->name); if (gl_load24bit.value) { tx->gl_texturenumfb = Mod_LoadReplacementTexture(altname, loadname, true, false, true); @@ -971,7 +971,7 @@ TRACE(("dbg: GLMod_LoadTextures: inittexturedescs\n")); extern cvar_t gl_bump; if (gl_bump.value<2) //set to 2 to have faster loading. { - _snprintf(altname, sizeof(altname)-1, "%s_norm", mt->name); + snprintf(altname, sizeof(altname)-1, "%s_norm", mt->name); tx->gl_texturenumbumpmap = Mod_LoadHiResTexture(altname, loadname, true, false, false); if (!tx->gl_texturenumbumpmap) tx->gl_texturenumbumpmap = Mod_LoadHiResTexture(altname, "bmodels", true, false, false); @@ -980,13 +980,13 @@ TRACE(("dbg: GLMod_LoadTextures: inittexturedescs\n")); { if (gl_load24bit.value) { - _snprintf(altname, sizeof(altname)-1, "%s_bump", mt->name); + snprintf(altname, sizeof(altname)-1, "%s_bump", mt->name); tx->gl_texturenumbumpmap = Mod_LoadBumpmapTexture(altname, loadname); if (!tx->gl_texturenumbumpmap) tx->gl_texturenumbumpmap = Mod_LoadBumpmapTexture(altname, "bmodels"); } else - _snprintf(altname, sizeof(altname)-1, "%s_bump", mt->name); + snprintf(altname, sizeof(altname)-1, "%s_bump", mt->name); } if (!(tx->gl_texturenumbumpmap) && loadmodel->fromgame != fg_halflife) @@ -1001,7 +1001,7 @@ TRACE(("dbg: GLMod_LoadTextures: inittexturedescs\n")); //don't do any complex quake 8bit -> glossmap. It would likly look a little ugly... if (gl_specular.value && gl_load24bit.value) { - _snprintf(altname, sizeof(altname)-1, "%s_gloss", mt->name); + snprintf(altname, sizeof(altname)-1, "%s_gloss", mt->name); tx->gl_texturenumspec = Mod_LoadHiResTexture(altname, loadname, true, false, false); if (!tx->gl_texturenumspec) tx->gl_texturenumspec = Mod_LoadHiResTexture(altname, "bmodels", true, false, false); diff --git a/engine/gl/gl_model.h b/engine/gl/gl_model.h index 1073ebe41..20e9d674c 100644 --- a/engine/gl/gl_model.h +++ b/engine/gl/gl_model.h @@ -35,9 +35,14 @@ typedef struct { } hullfuncs_t; typedef struct { + //deals with FTECONTENTS (assumes against solid) qboolean (*Trace) (struct model_s *model, int hulloverride, int frame, vec3_t p1, vec3_t p2, vec3_t mins, vec3_t maxs, struct trace_s *trace); - qboolean (*PointContents) (struct model_s *model, vec3_t p); - qboolean (*BoxContents) (struct model_s *model, int hulloverride, int frame, vec3_t p, vec3_t mins, vec3_t maxs); + unsigned int (*PointContents) (struct model_s *model, vec3_t p); + unsigned int (*BoxContents) (struct model_s *model, int hulloverride, int frame, vec3_t p, vec3_t mins, vec3_t maxs); + + //deals with whatever is native for the bsp (gamecode is expected to distinguish this). + qboolean (*NativeTrace) (struct model_s *model, int hulloverride, int frame, vec3_t p1, vec3_t p2, vec3_t mins, vec3_t maxs, unsigned int against, struct trace_s *trace); + unsigned int (*NativeContents)(struct model_s *model, int hulloverride, int frame, vec3_t p, vec3_t mins, vec3_t maxs); void (*FatPVS) (struct model_s *model, vec3_t org, qboolean add); qboolean (*EdictInFatPVS) (struct model_s *model, struct edict_s *edict); @@ -833,6 +838,8 @@ qbyte *Mod_LeafPVS (mleaf_t *leaf, model_t *model); #ifdef Q2BSPS +void CM_InitBoxHull (void); + #ifdef __cplusplus //#pragma message (" c++ stinks") #else diff --git a/engine/gl/gl_rmain.c b/engine/gl/gl_rmain.c index a757cedf4..5363bc4ff 100644 --- a/engine/gl/gl_rmain.c +++ b/engine/gl/gl_rmain.c @@ -1622,7 +1622,7 @@ void R_RenderScene (void) { qboolean GLR_DoomWorld(void); - if (!cl.worldmodel || !cl.worldmodel->nodes) + if (!cl.worldmodel || (!cl.worldmodel->nodes && cl.worldmodel->type != mod_heightmap)) r_refdef.flags |= Q2RDF_NOWORLDMODEL; GLR_SetupFrame (); diff --git a/engine/gl/gl_shader.c b/engine/gl/gl_shader.c index edb62d7cd..dcccf3f4a 100644 --- a/engine/gl/gl_shader.c +++ b/engine/gl/gl_shader.c @@ -42,7 +42,7 @@ extern int missing_texture; cvar_t r_vertexlight = SCVAR("r_vertexlight", "0"); #define Q_stricmp stricmp -#define Com_sprintf _snprintf +#define Com_sprintf snprintf #define clamp(v,min, max) (v) = (((v)<(min))?(min):(((v)>(max))?(max):(v))); int FS_LoadFile(char *name, void **file) @@ -583,7 +583,7 @@ static void Shaderpass_Map ( shader_t *shader, shaderpass_t *pass, char **ptr ) pass->anim_frames[0] = Shader_FindImage ( token, flags ); if ( !pass->anim_frames[0] ) { - pass->anim_frames[0] = 0;//FIZME: r_notexture; + pass->anim_frames[0] = missing_texture; Con_DPrintf (S_WARNING "Shader %s has a stage with no image: %s.\n", shader->name, token ); } } @@ -612,7 +612,7 @@ static void Shaderpass_AnimMap ( shader_t *shader, shaderpass_t *pass, char **pt image = Shader_FindImage ( token, flags ); if ( !image ) { - pass->anim_frames[pass->anim_numframes++] = 0;//fizme: r_notexture; + pass->anim_frames[pass->anim_numframes++] = missing_texture; Con_DPrintf (S_WARNING "Shader %s has an animmap with no image: %s.\n", shader->name, token ); } else { pass->anim_frames[pass->anim_numframes++] = image; @@ -636,26 +636,27 @@ static void Shaderpass_ClampMap ( shader_t *shader, shaderpass_t *pass, char **p qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); if ( !pass->anim_frames[0] ) { - pass->anim_frames[0] = 0;//fizme:r_notexture; + pass->anim_frames[0] = missing_texture; Con_DPrintf (S_WARNING "Shader %s has a stage with no image: %s.\n", shader->name, token ); } } static void Shaderpass_VideoMap ( shader_t *shader, shaderpass_t *pass, char **ptr ) { -/* char *token; - char name[MAX_OSPATH]; + char *token; token = Shader_ParseString ( ptr ); - COM_StripExtension ( token, name ); if ( pass->cin ) Z_Free ( pass->cin ); - pass->cin = (cinematics_t *)Z_Malloc ( sizeof(cinematics_t) ); - pass->cin->frame = -1; - Com_sprintf ( pass->cin->name, sizeof(pass->cin->name), "video/%s.RoQ", name ); -*/ + pass->cin = Media_StartCin(token); + if (!pass->cin) + pass->cin = Media_StartCin(va("video/%s.roq", token)); + else + Con_DPrintf (S_WARNING "(shader %s) Couldn't load video %s\n", shader->name, token ); + + pass->anim_frames[0] = texture_extension_number++; pass->flags |= SHADER_PASS_VIDEOMAP; shader->flags |= SHADER_VIDEOMAP; } @@ -1170,11 +1171,11 @@ static void Shader_GetPathAndOffset ( char *name, char **path, unsigned int *off void Shader_FreePass (shaderpass_t *pass) { - if ( pass->flags & SHADER_PASS_VIDEOMAP ) { -/* GL_StopCinematic ( pass->cin ); - Z_Free ( pass->cin ); + if ( pass->flags & SHADER_PASS_VIDEOMAP ) + { + Media_ShutdownCin(pass->cin); pass->cin = NULL; -*/ } + } } void Shader_Free (shader_t *shader) @@ -1844,50 +1845,121 @@ void Shader_RunCinematic (void) void Shader_DefaultBSP(char *shortname, shader_t *s) { shaderpass_t *pass; - pass = &s->passes[0]; - pass->flags = SHADER_PASS_LIGHTMAP | SHADER_PASS_DEPTHWRITE | SHADER_PASS_NOCOLORARRAY; - pass->tcgen = TC_GEN_LIGHTMAP; - pass->anim_frames[0] = 0; - pass->depthfunc = GL_LEQUAL; - pass->blendmode = GL_REPLACE; - pass->alphagen = ALPHA_GEN_IDENTITY; - pass->rgbgen = RGB_GEN_IDENTITY; - pass->numMergedPasses = 2; - if ( qglMTexCoord2fSGIS ) + int bumptex; + extern cvar_t gl_bump; + + if (0)//this isn't working right yet gl_config.arb_texture_env_dot3) { - pass->numMergedPasses = 2; - pass->flush = R_RenderMeshMultitextured; + if (gl_bump.value) + bumptex = Mod_LoadHiResTexture(va("normalmaps/%s", shortname), NULL, true, false, false);//GL_FindImage (shortname, 0); + else + bumptex = 0; } else + bumptex = 0; + + if (bumptex) { + pass = &s->passes[s->numpasses++]; + pass->flags = SHADER_PASS_DELUXMAP | SHADER_PASS_DEPTHWRITE | SHADER_PASS_NOCOLORARRAY; + pass->tcgen = TC_GEN_LIGHTMAP; + pass->anim_frames[0] = 0; + pass->depthfunc = GL_LEQUAL; + pass->blendmode = GL_REPLACE; + pass->alphagen = ALPHA_GEN_IDENTITY; + pass->rgbgen = RGB_GEN_IDENTITY; + pass->numMergedPasses = 2; + if (pass->numMergedPasses > gl_mtexarbable) + pass->numMergedPasses = gl_mtexarbable; + pass->flush = R_RenderMeshCombined; + + + pass = &s->passes[s->numpasses++]; + pass->flags = SHADER_PASS_BLEND | SHADER_PASS_NOCOLORARRAY; + pass->tcgen = TC_GEN_BASE; + pass->anim_frames[0] = bumptex; + pass->anim_numframes = 1; + pass->blendmode = GL_DOT3_RGB_ARB; + pass->rgbgen = RGB_GEN_IDENTITY; + pass->alphagen = ALPHA_GEN_IDENTITY; + + + pass = &s->passes[s->numpasses++]; + pass->flags = SHADER_PASS_NOCOLORARRAY | SHADER_PASS_BLEND; + pass->tcgen = TC_GEN_BASE; + pass->anim_frames[0] = Mod_LoadHiResTexture(shortname, NULL, true, false, true);//GL_FindImage (shortname, 0); + if (!pass->anim_frames[0]) + pass->anim_frames[0] = missing_texture; + pass->depthfunc = GL_LEQUAL; + pass->blendsrc = GL_ZERO; + pass->blenddst = GL_SRC_COLOR; + pass->blendmode = GL_MODULATE; + pass->alphagen = ALPHA_GEN_IDENTITY; + pass->rgbgen = RGB_GEN_IDENTITY; + pass->numMergedPasses = 2; + pass->flush = R_RenderMeshMultitextured; + + pass = &s->passes[s->numpasses++]; + pass->flags = SHADER_PASS_LIGHTMAP | SHADER_PASS_NOCOLORARRAY | SHADER_PASS_BLEND; + pass->tcgen = TC_GEN_LIGHTMAP; + pass->anim_frames[0] = 0; + pass->depthfunc = GL_LEQUAL; + pass->blendsrc = GL_ZERO; + pass->blenddst = GL_SRC_COLOR; + pass->blendmode = GL_MODULATE; + pass->alphagen = ALPHA_GEN_IDENTITY; + pass->rgbgen = RGB_GEN_IDENTITY; pass->numMergedPasses = 1; pass->flush = R_RenderMeshGeneric; } - - pass = &s->passes[1]; - pass->flags = SHADER_PASS_BLEND | SHADER_PASS_NOCOLORARRAY; - pass->tcgen = TC_GEN_BASE; - pass->anim_frames[0] = Mod_LoadHiResTexture(shortname, NULL, true, false, true);//GL_FindImage (shortname, 0); - if (!pass->anim_frames[0]) - pass->anim_frames[0] = missing_texture; - pass->anim_numframes = 1; - pass->blendsrc = GL_ZERO; - pass->blenddst = GL_SRC_COLOR; - pass->blendmode = GL_MODULATE; - pass->depthfunc = GL_LEQUAL; - pass->rgbgen = RGB_GEN_IDENTITY; - pass->alphagen = ALPHA_GEN_IDENTITY; + else + { + pass = &s->passes[0]; + pass->flags = SHADER_PASS_LIGHTMAP | SHADER_PASS_DEPTHWRITE | SHADER_PASS_NOCOLORARRAY; + pass->tcgen = TC_GEN_LIGHTMAP; + pass->anim_frames[0] = 0; + pass->depthfunc = GL_LEQUAL; + pass->blendmode = GL_REPLACE; + pass->alphagen = ALPHA_GEN_IDENTITY; + pass->rgbgen = RGB_GEN_IDENTITY; + pass->numMergedPasses = 2; - pass->numMergedPasses = 1; - pass->flush = R_RenderMeshGeneric; + if ( qglMTexCoord2fSGIS ) + { + pass->numMergedPasses = 2; + pass->flush = R_RenderMeshMultitextured; + } + else + { + pass->numMergedPasses = 1; + pass->flush = R_RenderMeshGeneric; + } + + pass = &s->passes[1]; + pass->flags = SHADER_PASS_BLEND | SHADER_PASS_NOCOLORARRAY; + pass->tcgen = TC_GEN_BASE; + pass->anim_frames[0] = Mod_LoadHiResTexture(shortname, NULL, true, false, true);//GL_FindImage (shortname, 0); + if (!pass->anim_frames[0]) + pass->anim_frames[0] = missing_texture; + pass->anim_numframes = 1; + pass->blendsrc = GL_ZERO; + pass->blenddst = GL_SRC_COLOR; + pass->blendmode = GL_MODULATE; + pass->depthfunc = GL_LEQUAL; + pass->rgbgen = RGB_GEN_IDENTITY; + pass->alphagen = ALPHA_GEN_IDENTITY; - if ( !pass->anim_frames[0] ) { - Con_DPrintf (S_WARNING "Shader %s has a stage with no image: %s.\n", s->name, shortname ); - pass->anim_frames[0] = 0;//fizme:r_notexture; + pass->numMergedPasses = 1; + pass->flush = R_RenderMeshGeneric; + + if ( !pass->anim_frames[0] ) { + Con_DPrintf (S_WARNING "Shader %s has a stage with no image: %s.\n", s->name, shortname ); + pass->anim_frames[0] = missing_texture; + } + + s->numpasses = 2; } - - s->numpasses = 2; s->numdeforms = 0; s->flags = SHADER_DEPTHWRITE|SHADER_CULL_FRONT; s->features = MF_STCOORDS|MF_LMCOORDS|MF_TRNORMALS; @@ -1913,7 +1985,7 @@ void Shader_DefaultBSPVertex(char *shortname, shader_t *s) if ( !pass->anim_frames[0] ) { Con_DPrintf (S_WARNING "Shader %s has a stage with no image: %s.\n", s->name, shortname ); - pass->anim_frames[0] = 0;//fizme:r_notexture; + pass->anim_frames[0] = missing_texture; } s->numpasses = 1; @@ -1944,7 +2016,7 @@ void Shader_DefaultBSPFlare(char *shortname, shader_t *s) if ( !pass->anim_frames[0] ) { Con_DPrintf (S_WARNING "Shader %s has a stage with no image: %s.\n", s->name, shortname ); - pass->anim_frames[0] = 0;//fizme:r_notexture; + pass->anim_frames[0] = missing_texture; } s->numpasses = 1; @@ -1981,7 +2053,7 @@ void Shader_DefaultSkin(char *shortname, shader_t *s) if (!pass->anim_frames[0]) { Con_DPrintf (S_WARNING "Shader %s has a stage with no image: %s.\n", s->name, shortname ); - pass->anim_frames[0] = 0;//fizme:r_notexture; + pass->anim_frames[0] = missing_texture; } } @@ -2003,7 +2075,7 @@ void Shader_DefaultSkin(char *shortname, shader_t *s) if (!pass->anim_frames[0]) { Con_DPrintf (S_WARNING "Shader %s has a stage with no image: %s.\n", s->name, shortname ); - pass->anim_frames[0] = 0;//fizme:r_notexture; + pass->anim_frames[0] = missing_texture; } } @@ -2025,7 +2097,7 @@ void Shader_DefaultSkin(char *shortname, shader_t *s) if (!pass->anim_frames[0]) { Con_DPrintf (S_WARNING "Shader %s has a stage with no image: %s.\n", s->name, shortname ); - pass->anim_frames[0] = 0;//fizme:r_notexture; + pass->anim_frames[0] = missing_texture; } } @@ -2047,7 +2119,7 @@ void Shader_DefaultSkin(char *shortname, shader_t *s) if (!pass->anim_frames[0]) { Con_DPrintf (S_WARNING "Shader %s has a stage with no image: %s.\n", s->name, shortname); - pass->anim_frames[0] = 0;//fizme:r_notexture; + pass->anim_frames[0] = missing_texture; } } @@ -2078,7 +2150,7 @@ void Shader_DefaultSkinShell(char *shortname, shader_t *s) if ( !pass->anim_frames[0] ) { Con_DPrintf (S_WARNING "Shader %s has a stage with no image: %s.\n", s->name, shortname ); - pass->anim_frames[0] = 0;//fizme:r_notexture; + pass->anim_frames[0] = missing_texture; } s->numpasses = 1; @@ -2118,7 +2190,7 @@ void Shader_Default2D(char *shortname, shader_t *s) if ( !pass->anim_frames[0] ) { Con_DPrintf (S_WARNING "Shader %s has a stage with no image: %s.\n", s->name, shortname ); - pass->anim_frames[0] = 0;//fizme:r_notexture; + pass->anim_frames[0] = missing_texture; } s->numpasses = 1; diff --git a/engine/gl/gl_warp.c b/engine/gl/gl_warp.c index 5576780d7..3236eccb9 100644 --- a/engine/gl/gl_warp.c +++ b/engine/gl/gl_warp.c @@ -325,7 +325,7 @@ void R_LoadSkys (void) { for (s = 0; s < sizeof(skyname_suffix)/sizeof(skyname_suffix[0]); s++) { - _snprintf (name, sizeof(name), skyname_pattern[p], boxname, skyname_suffix[s][i]); + snprintf (name, sizeof(name), skyname_pattern[p], boxname, skyname_suffix[s][i]); skyboxtex[i] = Mod_LoadHiResTexture(name, NULL, false, false, true); if (skyboxtex[i]) break; diff --git a/engine/gl/glquake.h b/engine/gl/glquake.h index f9bea02fe..f33cbc8ab 100644 --- a/engine/gl/glquake.h +++ b/engine/gl/glquake.h @@ -111,7 +111,9 @@ extern gl_config_t gl_config; extern float gldepthmin, gldepthmax; void GL_Upload32 (char *name, unsigned *data, int width, int height, qboolean mipmap, qboolean alpha); //name was added for texture compression output -void GL_Upload8 (qbyte *data, int width, int height, qboolean mipmap, qboolean alpha); +void GL_Upload8 (char *name, qbyte *data, int width, int height, qboolean mipmap, qboolean alpha); +void GL_Upload24BGR_Flip (char *name, qbyte *data, int width, int height, qboolean mipmap, qboolean alpha); +void GL_Upload24BGR (char *name, qbyte *data, int width, int height, qboolean mipmap, qboolean alpha); #ifdef GL_EXT_paletted_texture void GL_Upload8_EXT (qbyte *data, int width, int height, qboolean mipmap, qboolean alpha); #endif @@ -334,6 +336,11 @@ void GLQ3_LightGrid(vec3_t point, vec3_t res_diffuse, vec3_t res_ambient, vec3_t void GL_DrawHeightmapModel (entity_t *e); void GL_LoadHeightmapModel (model_t *mod, void *buffer); +//gl_bloom.c +void R_BloomRegister(void); +void R_BloomBlend(void); +void R_InitBloomTextures(void); + // // gl_rsurf.c diff --git a/engine/gl/shader.h b/engine/gl/shader.h index 95b5183d3..fd61f4f68 100644 --- a/engine/gl/shader.h +++ b/engine/gl/shader.h @@ -108,6 +108,8 @@ typedef struct shaderpass_s { shaderfunc_t rgbgen_func; shaderfunc_t alphagen_func; + struct cin_s *cin; + unsigned int blendsrc, blenddst; // glBlendFunc args unsigned int blendmode, envmode; @@ -173,7 +175,8 @@ typedef struct shaderpass_s { SHADER_PASS_LIGHTMAP = 1 << 5, SHADER_PASS_DELUXMAP = 1 << 6, SHADER_PASS_NOCOLORARRAY = 1<< 7, - SHADER_PASS_ANIMMAP = 1 << 8 + SHADER_PASS_ANIMMAP = 1 << 8, + SHADER_PASS_GPUPROGRAM = 1 << 9 } flags; } shaderpass_t; @@ -212,7 +215,8 @@ typedef struct shader_s { SHADER_DEPTHWRITE = 1 << 11, SHADER_AGEN_PORTAL = 1 << 12, SHADER_BLEND = 1 << 13, //blend or alphatest (not 100% opaque). - SHADER_NODRAW = 1 << 14 //parsed only to pee off developers when they forget it on no-pass shaders. + SHADER_NODRAW = 1 << 14, //parsed only to pee off developers when they forget it on no-pass shaders. + SHADER_PROGRAM = 1 << 15 //run a script } flags; shaderpass_t passes[SHADER_PASS_MAX]; diff --git a/engine/http/ftpserver.c b/engine/http/ftpserver.c index f87df4865..514ccb705 100644 --- a/engine/http/ftpserver.c +++ b/engine/http/ftpserver.c @@ -213,7 +213,7 @@ void VARGS QueueMessageva(FTPclient_t *cl, char *fmt, ...) char msg[1024]; va_start (argptr, fmt); - _vsnprintf (msg,sizeof(msg)-1, fmt,argptr); + vsnprintf (msg,sizeof(msg)-1, fmt,argptr); va_end (argptr); if (send (cl->controlsock, msg, strlen(msg), 0) == -1) diff --git a/engine/http/httpclient.c b/engine/http/httpclient.c index ce2dbb31a..b466521a0 100644 --- a/engine/http/httpclient.c +++ b/engine/http/httpclient.c @@ -4,11 +4,6 @@ #include "iweb.h" -#ifdef _WIN32 -//msvc crap -#define snprintf _snprintf -#endif - #include "netinc.h" /* diff --git a/engine/http/iwebiface.c b/engine/http/iwebiface.c index 05f2d0516..7d9fbc804 100644 --- a/engine/http/iwebiface.c +++ b/engine/http/iwebiface.c @@ -326,7 +326,7 @@ void VARGS IWebDPrintf(char *fmt, ...) return; va_start (argptr,fmt); - _vsnprintf (msg,sizeof(msg)-10, fmt,argptr); //catch any nasty bugs... (this is hopefully impossible) + vsnprintf (msg,sizeof(msg)-10, fmt,argptr); //catch any nasty bugs... (this is hopefully impossible) va_end (argptr); Con_Printf("%s", msg); @@ -337,7 +337,7 @@ void VARGS IWebPrintf(char *fmt, ...) char msg[4096]; va_start (argptr,fmt); - _vsnprintf (msg,sizeof(msg)-10, fmt,argptr); //catch any nasty bugs... (this is hopefully impossible) + vsnprintf (msg,sizeof(msg)-10, fmt,argptr); //catch any nasty bugs... (this is hopefully impossible) va_end (argptr); Con_Printf("%s", msg); @@ -348,7 +348,7 @@ void VARGS IWebWarnPrintf(char *fmt, ...) char msg[4096]; va_start (argptr,fmt); - _vsnprintf (msg,sizeof(msg)-10, fmt,argptr); //catch any nasty bugs... (this is hopefully impossible) + vsnprintf (msg,sizeof(msg)-10, fmt,argptr); //catch any nasty bugs... (this is hopefully impossible) va_end (argptr); Con_Printf(S_WARNING "%s", msg); diff --git a/engine/server/pr_cmds.c b/engine/server/pr_cmds.c index 0b94d8f2f..0d1b49428 100644 --- a/engine/server/pr_cmds.c +++ b/engine/server/pr_cmds.c @@ -1523,7 +1523,7 @@ void VARGS PR_BIError(progfuncs_t *progfuncs, char *format, ...) static char string[2048]; va_start (argptr, format); - _vsnprintf (string,sizeof(string)-1, format,argptr); + vsnprintf (string,sizeof(string)-1, format,argptr); va_end (argptr); if (developer.value) @@ -2047,7 +2047,7 @@ void PF_set_puzzle_model (progfuncs_t *prinst, struct globalvars_s *pr_globals) char *shortname; char fullname[MAX_QPATH]; shortname = PR_GetStringOfs(prinst, OFS_PARM1); - _snprintf(fullname, sizeof(fullname)-1, "models/puzzle/%s.mdl", shortname); + snprintf(fullname, sizeof(fullname)-1, "models/puzzle/%s.mdl", shortname); G_INT(OFS_PARM1) = (int)(fullname - prinst->stringtable); PF_setmodel (prinst, pr_globals); G_INT(OFS_PARM1) = (int)(shortname - prinst->stringtable); //piece of mind. @@ -3758,7 +3758,7 @@ void PF_precache_puzzle_model (progfuncs_t *prinst, struct globalvars_s *pr_glob char *shortname; char fullname[MAX_QPATH]; shortname = PR_GetStringOfs(prinst, OFS_PARM0); - _snprintf(fullname, sizeof(fullname)-1, "models/puzzle/%s.mdl", shortname); + snprintf(fullname, sizeof(fullname)-1, "models/puzzle/%s.mdl", shortname); G_INT(OFS_PARM0) = (int)(fullname - prinst->stringtable); PF_precache_model (prinst, pr_globals); G_INT(OFS_PARM0) = (int)(shortname - prinst->stringtable); //piece of mind. @@ -3987,7 +3987,7 @@ void PF_lightstyle (progfuncs_t *prinst, struct globalvars_s *pr_globals) if (!*val) continue; #ifdef PEXT_LIGHTSTYLECOL - if (client->fteprotocolextensions & PEXT_LIGHTSTYLECOL && col!=7) + if ((client->fteprotocolextensions & PEXT_LIGHTSTYLECOL) && col!=7) { ClientReliableWrite_Begin (client, svc_lightstylecol, strlen(val)+4); ClientReliableWrite_Byte (client, style); @@ -4086,7 +4086,7 @@ void PF_lightstylestatic (progfuncs_t *prinst, struct globalvars_s *pr_globals) if ( client->state == cs_spawned ) { #ifdef PEXT_LIGHTSTYLECOL - if (client->fteprotocolextensions & PEXT_LIGHTSTYLECOL && col!=7) + if ((client->fteprotocolextensions & PEXT_LIGHTSTYLECOL) && col!=7) { ClientReliableWrite_Begin (client, svc_lightstylecol, strlen(val)+4); ClientReliableWrite_Char (client, style); @@ -7008,7 +7008,7 @@ void PF_log(progfuncs_t *prinst, struct globalvars_s *pr_globals) char name[MAX_OSPATH], *text; vfsfile_t *file; - _snprintf(name, MAX_OSPATH, "%s.log", PR_GetStringOfs(prinst, OFS_PARM0)); + snprintf(name, MAX_OSPATH, "%s.log", PR_GetStringOfs(prinst, OFS_PARM0)); text = PF_VarString(prinst, 2, pr_globals); PR_CleanText(text); diff --git a/engine/server/server.h b/engine/server/server.h index 12f109bde..1bc2f8384 100644 --- a/engine/server/server.h +++ b/engine/server/server.h @@ -1194,6 +1194,7 @@ void SV_FlushLevelCache(void); int SV_RateForClient(client_t *cl); +qboolean TransformedNativeTrace (struct model_s *model, int hulloverride, int frame, vec3_t start, vec3_t end, vec3_t mins, vec3_t maxs, unsigned int against, struct trace_s *trace, vec3_t origin, vec3_t angles); void SVVC_Frame (qboolean enabled); void SV_CalcPHS (void); diff --git a/engine/server/sv_init.c b/engine/server/sv_init.c index 25dba4171..b97af7098 100644 --- a/engine/server/sv_init.c +++ b/engine/server/sv_init.c @@ -659,6 +659,8 @@ void SV_SpawnServer (char *server, char *startspot, qboolean noents, qboolean us if (sv.strings.lightstyles[i]) Z_Free(sv.strings.lightstyles[i]); sv.strings.lightstyles[i] = NULL; + + sv.strings.lightstylecolours[i] = 7; } } diff --git a/engine/server/sv_main.c b/engine/server/sv_main.c index 822dc03f9..120a20984 100644 --- a/engine/server/sv_main.c +++ b/engine/server/sv_main.c @@ -235,7 +235,7 @@ void VARGS SV_Error (char *error, ...) inerror = true; va_start (argptr,error); - _vsnprintf (string,sizeof(string)-1, error,argptr); + vsnprintf (string,sizeof(string)-1, error,argptr); va_end (argptr); { @@ -988,7 +988,7 @@ void SVC_InfoQ2 (void) version = atoi (Cmd_Argv(1)); if (version != PROTOCOL_VERSION_Q2) - _snprintf (string, sizeof(string), "%s: wrong version\n", hostname.string); + snprintf (string, sizeof(string), "%s: wrong version\n", hostname.string); else { count = 0; @@ -996,7 +996,7 @@ void SVC_InfoQ2 (void) if (svs.clients[i].state >= cs_connected) count++; - _snprintf (string, sizeof(string), "%16s %8s %2i/%2i\n", hostname.string, sv.name, count, (int)maxclients.value); + snprintf (string, sizeof(string), "%16s %8s %2i/%2i\n", hostname.string, sv.name, count, (int)maxclients.value); } Netchan_OutOfBandPrint (NS_SERVER, net_from, "info\n%s", string); @@ -1248,13 +1248,13 @@ void VARGS SV_OutOfBandPrintf (int q2, netadr_t adr, char *format, ...) if (q2) { strcpy(string, "print\n"); - _vsnprintf (string+6,sizeof(string)-1-6, format+1,argptr); + vsnprintf (string+6,sizeof(string)-1-6, format+1,argptr); } else { string[0] = A2C_PRINT; string[1] = '\n'; - _vsnprintf (string+2,sizeof(string)-1-2, format,argptr); + vsnprintf (string+2,sizeof(string)-1-2, format,argptr); } va_end (argptr); @@ -1271,12 +1271,12 @@ void VARGS SV_OutOfBandTPrintf (int q2, netadr_t adr, int language, translation_ if (q2) { strcpy(string, "print\n"); - _vsnprintf (string+6,sizeof(string)-1-6, format+1,argptr); + vsnprintf (string+6,sizeof(string)-1-6, format+1,argptr); } else { string[0] = A2C_PRINT; - _vsnprintf (string+1,sizeof(string)-1-1, format,argptr); + vsnprintf (string+1,sizeof(string)-1-1, format,argptr); } va_end (argptr); @@ -1311,7 +1311,7 @@ void VARGS SV_RejectMessage(int protocol, char *format, ...) #ifdef NQPROT case SCP_NETQUAKE: string[4] = CCREP_REJECT; - _vsnprintf (string+5,sizeof(string)-1-5, format,argptr); + vsnprintf (string+5,sizeof(string)-1-5, format,argptr); len = strlen(string+4)+1+4; *(int*)string = BigLong(NETFLAG_CTL|len); NET_SendPacket(NS_SERVER, len, string, net_from); @@ -1319,7 +1319,7 @@ void VARGS SV_RejectMessage(int protocol, char *format, ...) case SCP_DARKPLACES6: case SCP_DARKPLACES7: strcpy(string, "reject "); - _vsnprintf (string+7,sizeof(string)-1-7, format,argptr); + vsnprintf (string+7,sizeof(string)-1-7, format,argptr); len = strlen(string); break; #endif @@ -1327,14 +1327,14 @@ void VARGS SV_RejectMessage(int protocol, char *format, ...) case SCP_QUAKE2: default: strcpy(string, "print\n"); - _vsnprintf (string+6,sizeof(string)-1-6, format,argptr); + vsnprintf (string+6,sizeof(string)-1-6, format,argptr); len = strlen(string); break; case SCP_QUAKEWORLD: string[0] = A2C_PRINT; string[1] = '\n'; - _vsnprintf (string+2,sizeof(string)-1-2, format,argptr); + vsnprintf (string+2,sizeof(string)-1-2, format,argptr); len = strlen(string); break; } diff --git a/engine/server/sv_mvd.c b/engine/server/sv_mvd.c index 78a9b5977..cc4830601 100644 --- a/engine/server/sv_mvd.c +++ b/engine/server/sv_mvd.c @@ -64,7 +64,7 @@ void DestClose(mvddest_t *d, qboolean destroyfiles) if (destroyfiles) { - _snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, d->path, d->name); + snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, d->path, d->name); Sys_remove(path); Q_strncpyz(path + strlen(path) - 3, "txt", MAX_OSPATH - strlen(path) + 3); @@ -952,22 +952,22 @@ static char *SV_PrintTeams(void) if (numcl == 2) // duel { - _snprintf(buf, sizeof(buf), "team1 %s\nteam2 %s\n", clients[0]->name, clients[1]->name); + snprintf(buf, sizeof(buf), "team1 %s\nteam2 %s\n", clients[0]->name, clients[1]->name); } else if (!teamplay.value) // ffa { - _snprintf(buf, sizeof(buf), "players:\n"); + snprintf(buf, sizeof(buf), "players:\n"); for (i = 0; i < numcl; i++) - _snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " %s\n", clients[i]->name); + snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " %s\n", clients[i]->name); } else { // teamplay for (j = 0; j < numt; j++) { - _snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "team %s:\n", teams[j]); + snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "team %s:\n", teams[j]); for (i = 0; i < numcl; i++) if (!strcmp(Info_ValueForKey(clients[i]->userinfo, "team"), teams[j])) - _snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " %s\n", clients[i]->name); + snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " %s\n", clients[i]->name); } } @@ -1042,7 +1042,7 @@ mvddest_t *SV_InitRecordFile (char *name) SV_TimeOfDay(&date); - _snprintf(buf, sizeof(buf), "date %s\nmap %s\nteamplay %d\ndeathmatch %d\ntimelimit %d\n%s",date.str, sv.name, (int)teamplay.value, (int)deathmatch.value, (int)timelimit.value, SV_PrintTeams()); + snprintf(buf, sizeof(buf), "date %s\nmap %s\nteamplay %d\ndeathmatch %d\ntimelimit %d\n%s",date.str, sv.name, (int)teamplay.value, (int)deathmatch.value, (int)timelimit.value, SV_PrintTeams()); fwrite(buf, strlen(buf),1,f); fflush(f); fclose(f); @@ -1579,7 +1579,7 @@ void SV_MVD_Record_f (void) sizeof(newname) - strlen(sv_demoSuffix.string) - 5); Q_strncatz(newname, sv_demoSuffix.string, MAX_MVD_NAME); - _snprintf (name, MAX_OSPATH+MAX_MVD_NAME, "%s/%s/%s", com_gamedir, sv_demoDir.string, newname); + snprintf (name, MAX_OSPATH+MAX_MVD_NAME, "%s/%s/%s", com_gamedir, sv_demoDir.string, newname); COM_StripExtension(name, name); @@ -1772,7 +1772,7 @@ void SV_MVDEasyRecord_f (void) if (teamplay.value >= 1 && i > 2) { // Teamplay - _snprintf (name, sizeof(name), "%don%d_", Dem_CountTeamPlayers(Dem_Team(1)), Dem_CountTeamPlayers(Dem_Team(2))); + snprintf (name, sizeof(name), "%don%d_", Dem_CountTeamPlayers(Dem_Team(1)), Dem_CountTeamPlayers(Dem_Team(2))); if (sv_demoExtraNames.value > 0) { Q_strncatz (name, va("[%s]_%s_vs_[%s]_%s_%s", @@ -1784,13 +1784,13 @@ void SV_MVDEasyRecord_f (void) } else { if (i == 2) { // Duel - _snprintf (name, sizeof(name), "duel_%s_vs_%s_%s", + snprintf (name, sizeof(name), "duel_%s_vs_%s_%s", Dem_PlayerName(1), Dem_PlayerName(2), sv.name); } else { // FFA - _snprintf (name, sizeof(name), "ffa_%s(%d)", sv.name, i); + snprintf (name, sizeof(name), "ffa_%s(%d)", sv.name, i); } } } @@ -1815,7 +1815,7 @@ void SV_MVDEasyRecord_f (void) i = 1; do { fclose (f); - _snprintf(name2, sizeof(name2), "%s_%02i", name, i); + snprintf(name2, sizeof(name2), "%s_%02i", name, i); // COM_StripExtension(name2, name2); strcat (name2, ".mvd"); if ((f = fopen (name2, "rb")) == 0) @@ -2069,7 +2069,7 @@ void SV_MVDRemove_f (void) SV_MVDStop_f(); // stop recording first; - _snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, sv_demoDir.string, list->name); + snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, sv_demoDir.string, list->name); if (!Sys_remove(path)) { Con_Printf("removing %s...\n", list->name); @@ -2095,7 +2095,7 @@ void SV_MVDRemove_f (void) Q_strncpyz(name, Cmd_Argv(1), MAX_MVD_NAME); COM_DefaultExtension(name, ".mvd"); - _snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, sv_demoDir.string, name); + snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, sv_demoDir.string, name); if (sv.mvdrecording && !strcmp(name, demo.name)) SV_MVDStop_f(); @@ -2138,7 +2138,7 @@ void SV_MVDRemoveNum_f (void) if (sv.mvdrecording && !strcmp(name, demo.name)) SV_MVDStop_f(); - _snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, sv_demoDir.string, name); + snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, sv_demoDir.string, name); if (!Sys_remove(path)) { Con_Printf("demo %s succesfully removed\n", name); @@ -2172,7 +2172,7 @@ void SV_MVDInfoAdd_f (void) return; } - _snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, demo.path, SV_MVDName2Txt(demo.name)); + snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, demo.path, SV_MVDName2Txt(demo.name)); } else { @@ -2184,7 +2184,7 @@ void SV_MVDInfoAdd_f (void) return; } - _snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, sv_demoDir.string, name); + snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, sv_demoDir.string, name); } if ((f = fopen(path, "a+t")) == NULL) @@ -2224,7 +2224,7 @@ void SV_MVDInfoRemove_f (void) return; } - _snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, demo.path, SV_MVDName2Txt(demo.name)); + snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, demo.path, SV_MVDName2Txt(demo.name)); } else { @@ -2236,7 +2236,7 @@ void SV_MVDInfoRemove_f (void) return; } - _snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, sv_demoDir.string, name); + snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, sv_demoDir.string, name); } if (Sys_remove(path)) @@ -2266,7 +2266,7 @@ void SV_MVDInfo_f (void) return; } - _snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, demo.path, SV_MVDName2Txt(demo.name)); + snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, demo.path, SV_MVDName2Txt(demo.name)); } else { @@ -2278,7 +2278,7 @@ void SV_MVDInfo_f (void) return; } - _snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, sv_demoDir.string, name); + snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, sv_demoDir.string, name); } if ((f = fopen(path, "rt")) == NULL) diff --git a/engine/server/sv_send.c b/engine/server/sv_send.c index c8317c5d9..46d68577f 100644 --- a/engine/server/sv_send.c +++ b/engine/server/sv_send.c @@ -279,7 +279,7 @@ void VARGS SV_ClientPrintf (client_t *cl, int level, char *fmt, ...) return; va_start (argptr,fmt); - _vsnprintf (string,sizeof(string)-1, fmt,argptr); + vsnprintf (string,sizeof(string)-1, fmt,argptr); va_end (argptr); if(strlen(string) >= sizeof(string)) @@ -309,7 +309,7 @@ void VARGS SV_ClientTPrintf (client_t *cl, int level, translation_t stringnum, . return; va_start (argptr,stringnum); - _vsnprintf (string,sizeof(string)-1, fmt,argptr); + vsnprintf (string,sizeof(string)-1, fmt,argptr); va_end (argptr); if(strlen(string) >= sizeof(string)) @@ -341,7 +341,7 @@ void VARGS SV_BroadcastPrintf (int level, char *fmt, ...) int i; va_start (argptr,fmt); - _vsnprintf (string,sizeof(string)-1, fmt,argptr); + vsnprintf (string,sizeof(string)-1, fmt,argptr); va_end (argptr); if(strlen(string) >= sizeof(string)) @@ -384,7 +384,7 @@ void VARGS SV_BroadcastTPrintf (int level, translation_t stringnum, ...) char *fmt = languagetext[stringnum][oldlang=svs.language]; va_start (argptr,stringnum); - _vsnprintf (string,sizeof(string)-1, fmt,argptr); + vsnprintf (string,sizeof(string)-1, fmt,argptr); va_end (argptr); if(strlen(string) >= sizeof(string)) @@ -406,7 +406,7 @@ void VARGS SV_BroadcastTPrintf (int level, translation_t stringnum, ...) fmt = languagetext[stringnum][oldlang=cl->language]; va_start (argptr,stringnum); - _vsnprintf (string,sizeof(string)-1, fmt,argptr); + vsnprintf (string,sizeof(string)-1, fmt,argptr); va_end (argptr); if(strlen(string) >= sizeof(string)) @@ -435,7 +435,7 @@ void VARGS SV_BroadcastCommand (char *fmt, ...) if (!sv.state) return; va_start (argptr,fmt); - _vsnprintf (string,sizeof(string)-1, fmt,argptr); + vsnprintf (string,sizeof(string), fmt,argptr); va_end (argptr); for (i=0, cl = svs.clients ; ifteprotocolextensions & PEXT_LIGHTSTYLECOL && sv.strings.lightstylecolours[i]!=7) + if ((host_client->fteprotocolextensions & PEXT_LIGHTSTYLECOL) && sv.strings.lightstylecolours[i]!=7) { ClientReliableWrite_Begin (host_client, svc_lightstylecol, 3 + (sv.strings.lightstyles[i] ? strlen(sv.strings.lightstyles[i]) : 1)); diff --git a/engine/server/svq3_game.c b/engine/server/svq3_game.c index 7b6019187..5fdcb8f9b 100644 --- a/engine/server/svq3_game.c +++ b/engine/server/svq3_game.c @@ -412,30 +412,42 @@ void Q3G_LinkEntity(q3sharedEntity_t *ent) sent->areanum2 = -1; //get all leafs, including solids - num_leafs = CM_BoxLeafnums(sv.worldmodel, ent->r.absmin, ent->r.absmax, - leafs, MAX_TOTAL_ENT_LEAFS, &topnode); - - if(!num_leafs) - return; - - // set areas - for(i=0; itype == mod_heightmap) { - clusters[i] = CM_LeafCluster(sv.worldmodel, leafs[i]); - area = CM_LeafArea(sv.worldmodel, leafs[i]); - if(area >= 0) - { - // doors may legally straggle two areas, - // but nothing should ever need more than that - if(sent->areanum >= 0 && sent->areanum != area) - { - if(sent->areanum2 >= 0 && sent->areanum2 != area && sv.state == ss_loading) - Con_DPrintf("Object touching 3 areas at %f %f %f\n", ent->r.absmin[0], ent->r.absmin[1], ent->r.absmin[2]); + sent->areanum = 0; + num_leafs = 1; + sent->num_clusters = -1; + sent->headnode = 0; + clusters[0] = 0; + topnode = 0; + } + else + { + num_leafs = CM_BoxLeafnums(sv.worldmodel, ent->r.absmin, ent->r.absmax, + leafs, MAX_TOTAL_ENT_LEAFS, &topnode); - sent->areanum2 = area; + if(!num_leafs) + return; + + // set areas + for(i=0; i= 0) + { + // doors may legally straggle two areas, + // but nothing should ever need more than that + if(sent->areanum >= 0 && sent->areanum != area) + { + if(sent->areanum2 >= 0 && sent->areanum2 != area && sv.state == ss_loading) + Con_DPrintf("Object touching 3 areas at %f %f %f\n", ent->r.absmin[0], ent->r.absmin[1], ent->r.absmin[2]); + + sent->areanum2 = area; + } + else + sent->areanum = area; } - else - sent->areanum = area; } } @@ -574,9 +586,9 @@ void SVQ3_Trace(q3trace_t *result, vec3_t start, vec3_t mins, vec3_t maxs, vec3_ result->fraction = tr.fraction; result->plane = tr.plane; result->startsolid = tr.startsolid; -// if (tr.surface) -// result->surfaceFlags = tr.surface->flags; -// else + if (tr.surface) + result->surfaceFlags = tr.surface->flags; + else result->surfaceFlags = 0; for (i = 0; i < 3; i++) @@ -668,9 +680,9 @@ int SVQ3_PointContents(vec3_t pos, int entnum) // sv.worldmodel->funcs.Trace(sv.worldmodel, 0, 0, pos, pos, vec3_origin, vec3_origin, &tr); // tr = CM_BoxTrace(sv.worldmodel, pos, pos, vec3_origin, vec3_origin, 0); - cont = CM_PointContents(sv.worldmodel, pos); + cont = sv.worldmodel->funcs.NativeContents (sv.worldmodel, 0, 0, pos, vec3_origin, vec3_origin); - if (entnum == -1) + if ((unsigned)entnum >= MAX_GENTITIES) ourowner = -1; else if ( entnum != ENTITYNUM_WORLD ) { @@ -1829,8 +1841,14 @@ qboolean SVQ3_InitGame(void) char sysinfo[8192]; extern cvar_t progs; - if (sv.worldmodel->fromgame == fg_quake || sv.worldmodel->fromgame == fg_quake2) - return false; //always fail on q1bsp + if (sv.worldmodel->type == mod_heightmap) + { + } + else + { + if (sv.worldmodel->fromgame == fg_quake || sv.worldmodel->fromgame == fg_quake2) + return false; //always fail on q1bsp + } if (*progs.string) //don't load q3 gamecode if we're explicitally told to load a progs. return false; @@ -1881,6 +1899,8 @@ qboolean SVQ3_InitGame(void) mapentspointer = sv.worldmodel->entities; VM_Call(q3gamevm, GAME_INIT, 0, rand(), false); + CM_InitBoxHull(); + SVQ3_CreateBaseline(); q3_num_snapshot_entities = 32 * Q3UPDATE_BACKUP * 32; diff --git a/engine/server/world.c b/engine/server/world.c index c8e85bbbf..a6396b08e 100644 --- a/engine/server/world.c +++ b/engine/server/world.c @@ -994,6 +994,84 @@ qboolean TransformedTrace (struct model_s *model, int hulloverride, int frame, v return result; } +qboolean TransformedNativeTrace (struct model_s *model, int hulloverride, int frame, vec3_t start, vec3_t end, vec3_t mins, vec3_t maxs, unsigned int against, struct trace_s *trace, vec3_t origin, vec3_t angles) +{ + qboolean rotated; + vec3_t start_l, end_l; + vec3_t a; + vec3_t forward, right, up; + vec3_t temp; + qboolean result; + + memset (trace, 0, sizeof(trace_t)); + trace->fraction = 1; + trace->allsolid = false; + trace->startsolid = false; + trace->inopen = true; //probably wrong... + VectorCopy (end, trace->endpos); + + // don't rotate non bsp ents. Too small to bother. + if (model) + { + rotated = (angles[0] || angles[1] || angles[2]); + if (rotated) + { + AngleVectors (angles, forward, right, up); + + VectorSubtract (start, origin, temp); + start_l[0] = DotProduct (temp, forward); + start_l[1] = -DotProduct (temp, right); + start_l[2] = DotProduct (temp, up); + + VectorSubtract (end, origin, temp); + end_l[0] = DotProduct (temp, forward); + end_l[1] = -DotProduct (temp, right); + end_l[2] = DotProduct (temp, up); + } + else + { + VectorSubtract (start, origin, start_l); + VectorSubtract (end, origin, end_l); + } + result = model->funcs.NativeTrace (model, hulloverride, frame, start_l, end_l, mins, maxs, against, trace); + if (rotated) + { + // FIXME: figure out how to do this with existing angles + // VectorNegate (angles, a); + a[0] = -angles[0]; + a[1] = -angles[1]; + a[2] = -angles[2]; + AngleVectors (a, forward, right, up); + + VectorCopy (trace->plane.normal, temp); + trace->plane.normal[0] = DotProduct (temp, forward); + trace->plane.normal[1] = -DotProduct (temp, right); + trace->plane.normal[2] = DotProduct (temp, up); + + trace->endpos[0] = start[0] + trace->fraction * (end[0] - start[0]); + trace->endpos[1] = start[1] + trace->fraction * (end[1] - start[1]); + trace->endpos[2] = start[2] + trace->fraction * (end[2] - start[2]); + } + VectorAdd (trace->endpos, origin, trace->endpos); + } + else + { + hull_t *hull = &box_hull; + + memset (trace, 0, sizeof(trace_t)); + trace->fraction = 1; + trace->allsolid = true; + + VectorSubtract (start, origin, start_l); + VectorSubtract (end, origin, end_l); + VectorCopy (end_l, trace->endpos); + result = Q1BSP_RecursiveHullCheck (hull, hull->firstclipnode, 0, 1, start_l, end_l, trace); + VectorAdd (trace->endpos, origin, trace->endpos); + } + + return result; +} + /* ================== SV_ClipMoveToEntity