mirror of
https://github.com/nzp-team/fteqw.git
synced 2025-01-31 04:30:38 +00:00
Filename security paranoia. Added a glsl extension to the shader system. using serverinfo, you can enable shaders without cheats now.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@2079 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
05ace9bdcb
commit
aeea639fc2
36 changed files with 647 additions and 298 deletions
|
@ -770,7 +770,7 @@ void CL_Record_f (void)
|
|||
f = FS_OpenVFS (name, "rb", FS_GAME);
|
||||
if (f)
|
||||
{
|
||||
COM_StripExtension(name, name);
|
||||
COM_StripExtension(name, name, sizeof(name));
|
||||
p = name + strlen(name);
|
||||
strcat(p, "_XX.qwd");
|
||||
p++;
|
||||
|
@ -1106,7 +1106,7 @@ void CL_ReRecord_f (void)
|
|||
//
|
||||
// open the demo file
|
||||
//
|
||||
COM_DefaultExtension (name, ".qwd");
|
||||
COM_DefaultExtension (name, ".qwd", sizeof(name));
|
||||
|
||||
cls.demofile = FS_OpenVFS (name, "wb", FS_GAME);
|
||||
if (!cls.demofile)
|
||||
|
@ -1181,18 +1181,18 @@ void CL_PlayDemo(char *demoname)
|
|||
// open the demo file
|
||||
//
|
||||
Q_strncpyz (name, demoname, sizeof(name));
|
||||
COM_DefaultExtension (name, ".qwd");
|
||||
COM_DefaultExtension (name, ".qwd", sizeof(name));
|
||||
cls.demofile = FS_OpenVFS(name, "rb", FS_GAME);
|
||||
if (!cls.demofile)
|
||||
{
|
||||
Q_strncpyz (name, demoname, sizeof(name));
|
||||
COM_DefaultExtension (name, ".dem");
|
||||
COM_DefaultExtension (name, ".dem", sizeof(name));
|
||||
cls.demofile = FS_OpenVFS(name, "rb", FS_GAME);
|
||||
}
|
||||
if (!cls.demofile)
|
||||
{
|
||||
Q_strncpyz (name, demoname, sizeof(name));
|
||||
COM_DefaultExtension (name, ".mvd");
|
||||
COM_DefaultExtension (name, ".mvd", sizeof(name));
|
||||
cls.demofile = FS_OpenVFS(name, "rb", FS_GAME);
|
||||
}
|
||||
if (!cls.demofile)
|
||||
|
|
|
@ -1293,6 +1293,9 @@ void CL_CheckServerInfo(void)
|
|||
char *s;
|
||||
unsigned int allowed;
|
||||
int oldstate;
|
||||
qboolean oldallowshaders;
|
||||
|
||||
oldallowshaders = cls.allow_shaders;
|
||||
|
||||
cl.teamplay = atoi(Info_ValueForKey(cl.serverinfo, "teamplay"));
|
||||
cl.deathmatch = atoi(Info_ValueForKey(cl.serverinfo, "deathmatch"));
|
||||
|
@ -1357,6 +1360,11 @@ void CL_CheckServerInfo(void)
|
|||
cls.allow_cheats = false;
|
||||
}
|
||||
|
||||
cls.allow_shaders = cls.allow_cheats;
|
||||
|
||||
if (cls.demoplayback || atoi(Info_ValueForKey(cl.serverinfo, "allow_shaders")))
|
||||
cls.allow_shaders=true;
|
||||
|
||||
|
||||
cls.maxfps = atof(Info_ValueForKey(cl.serverinfo, "maxfps"));
|
||||
if (cls.maxfps < 20)
|
||||
|
@ -1425,6 +1433,9 @@ void CL_CheckServerInfo(void)
|
|||
|
||||
Cvar_ForceCheatVars(cls.allow_semicheats, cls.allow_cheats);
|
||||
|
||||
|
||||
if (oldallowshaders != cls.allow_shaders)
|
||||
Cache_Flush(); //this will cause all models to be reloaded.
|
||||
}
|
||||
/*
|
||||
==================
|
||||
|
|
|
@ -328,7 +328,7 @@ void CL_SendDownloadRequest(char *filename, char *localname)
|
|||
// download to a temp name, and only rename
|
||||
// to the real name when done, so if interrupted
|
||||
// a runt file wont be left
|
||||
COM_StripExtension (localname, cls.downloadtempname);
|
||||
COM_StripExtension (localname, cls.downloadtempname, sizeof(cls.downloadtempname)-5);
|
||||
strcat (cls.downloadtempname, ".tmp");
|
||||
|
||||
CL_SendClientCommand(true, "download %s", filename);
|
||||
|
@ -2640,7 +2640,7 @@ void CL_NewTranslation (int slot)
|
|||
player = &cl.players[slot];
|
||||
|
||||
s = Skin_FindName (player);
|
||||
COM_StripExtension(s, s);
|
||||
COM_StripExtension(s, s, MAX_QPATH);
|
||||
if (player->skin && !stricmp(s, player->skin->name))
|
||||
player->skin = NULL;
|
||||
|
||||
|
|
|
@ -1407,7 +1407,7 @@ void SCR_EndLoadingPlaque (void)
|
|||
void SCR_ImageName (char *mapname)
|
||||
{
|
||||
strcpy(levelshotname, "levelshots/");
|
||||
COM_FileBase(mapname, levelshotname + strlen(levelshotname));
|
||||
COM_FileBase(mapname, levelshotname + strlen(levelshotname), sizeof(levelshotname)-strlen(levelshotname));
|
||||
|
||||
#ifdef RGLQUAKE
|
||||
if (qrenderer == QR_OPENGL)
|
||||
|
@ -1709,7 +1709,7 @@ void SCR_ScreenShot_f (void)
|
|||
Con_Printf("Screenshot name refused\n");
|
||||
return;
|
||||
}
|
||||
COM_DefaultExtension (pcxname, scr_sshot_type.string);
|
||||
COM_DefaultExtension (pcxname, scr_sshot_type.string, sizeof(pcxname));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -307,7 +307,7 @@ static void Stats_LoadFragFile(char *name)
|
|||
Stats_Clear();
|
||||
|
||||
strcpy(filename, name);
|
||||
COM_DefaultExtension(filename, ".dat");
|
||||
COM_DefaultExtension(filename, ".dat", sizeof(filename));
|
||||
|
||||
file = COM_LoadTempFile(filename);
|
||||
if (!file || !*file)
|
||||
|
|
|
@ -1912,7 +1912,7 @@ int Mod_LoadHiResTexture(char *name, char *subpath, qboolean mipmap, qboolean al
|
|||
|
||||
int i, e;
|
||||
|
||||
COM_StripExtension(name, nicename);
|
||||
COM_StripExtension(name, nicename, sizeof(nicename));
|
||||
|
||||
while((data = strchr(nicename, '*')))
|
||||
{
|
||||
|
@ -2036,7 +2036,7 @@ int Mod_LoadBumpmapTexture(char *name, char *subpath)
|
|||
|
||||
TRACE(("dbg: Mod_LoadBumpmapTexture: texture %s\n", name));
|
||||
|
||||
COM_StripExtension(name, nicename);
|
||||
COM_StripExtension(name, nicename, sizeof(nicename));
|
||||
|
||||
if ((len = GL_FindTexture(name))!=-1) //don't bother if it already exists.
|
||||
return len;
|
||||
|
@ -2062,7 +2062,7 @@ int Mod_LoadBumpmapTexture(char *name, char *subpath)
|
|||
Q_strncpyz(map, sv.name, sizeof(map));
|
||||
else
|
||||
#endif
|
||||
COM_FileBase(cl.model_name[1], map);
|
||||
COM_FileBase(cl.model_name[1], map, sizeof(map));
|
||||
snprintf(fname, sizeof(fname)-1, path[i], map, nicename, extensions[e]);
|
||||
}
|
||||
else
|
||||
|
|
|
@ -238,7 +238,7 @@ void MenuDrawItems(int xpos, int ypos, menuoption_t *option, menu_t *menu)
|
|||
{
|
||||
char selname[MAX_QPATH];
|
||||
Q_strncpyz(selname, option->picture.picturename, sizeof(selname));
|
||||
COM_StripExtension(selname, selname);
|
||||
COM_StripExtension(selname, selname, sizeof(selname));
|
||||
p = Draw_SafeCachePic(va("%s_sel", selname));
|
||||
}
|
||||
|
||||
|
|
|
@ -859,6 +859,7 @@ struct cin_s {
|
|||
|
||||
float filmstarttime;
|
||||
float nextframetime;
|
||||
float filmlasttime;
|
||||
|
||||
int currentframe; //last frame in buffer
|
||||
qbyte *framedata; //Z_Malloced buffer
|
||||
|
@ -1132,14 +1133,19 @@ cin_t *Media_StartCin(char *name)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
qboolean Media_DecodeFrame(cin_t *cin)
|
||||
qboolean Media_DecodeFrame(cin_t *cin, qboolean nosound)
|
||||
{
|
||||
float curtime = Sys_DoubleTime();
|
||||
|
||||
switch (cin->filmtype)
|
||||
{
|
||||
case MFT_ROQ:
|
||||
if (curtime<cin->nextframetime || roq_read_frame(cin->roq.roqfilm)==1) //0 if end, -1 if error, 1 if success
|
||||
if ((int)(cin->filmlasttime*30) == (int)((float)realtime*30))
|
||||
{
|
||||
cin->outunchanged = !!cin->outtype;
|
||||
return true;
|
||||
}
|
||||
else if (curtime<cin->nextframetime || 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)
|
||||
|
@ -1153,6 +1159,9 @@ qboolean Media_DecodeFrame(cin_t *cin)
|
|||
int x;
|
||||
|
||||
qbyte *framedata;
|
||||
|
||||
cin->filmlasttime = (float)realtime;
|
||||
|
||||
if (!(curtime<cin->nextframetime)) //roq file was read properly
|
||||
{
|
||||
cin->nextframetime += 1/30.0; //add a little bit of extra speed so we cover up a little bit of glitchy sound... :o)
|
||||
|
@ -1197,11 +1206,6 @@ qboolean Media_DecodeFrame(cin_t *cin)
|
|||
if(y & 0x01) { pb += num_columns; pc += num_columns; }
|
||||
}
|
||||
}
|
||||
else if (vid.numpages == 1) //previous frame is still in page.
|
||||
{
|
||||
cin->outunchanged = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
cin->outunchanged = false;
|
||||
cin->outtype = 1;
|
||||
|
@ -1209,6 +1213,7 @@ qboolean Media_DecodeFrame(cin_t *cin)
|
|||
cin->outheight = cin->roq.roqfilm->height;
|
||||
cin->outdata = cin->framedata;
|
||||
|
||||
if (!nosound)
|
||||
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)
|
||||
{
|
||||
|
@ -1349,7 +1354,7 @@ qboolean Media_ShowFilm(void)
|
|||
{
|
||||
if (!fullscreenvid)
|
||||
return false;
|
||||
if (!Media_DecodeFrame(fullscreenvid))
|
||||
if (!Media_DecodeFrame(fullscreenvid, false))
|
||||
{
|
||||
Media_ShutdownCin(fullscreenvid);
|
||||
fullscreenvid = NULL;
|
||||
|
@ -1377,27 +1382,30 @@ int Media_UpdateForShader(int texnum, cin_t *cin)
|
|||
{
|
||||
if (!cin)
|
||||
return 0;
|
||||
if (!Media_DecodeFrame(cin))
|
||||
if (!Media_DecodeFrame(cin, true))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
GL_Bind(100);
|
||||
switch(cin->outtype)
|
||||
if (!cin->outunchanged)
|
||||
{
|
||||
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;
|
||||
GL_Bind(texnum);
|
||||
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;
|
||||
return texnum;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -1691,8 +1699,8 @@ void Media_RecordFilm_f (void)
|
|||
if (capturetype == CT_AVI)
|
||||
{
|
||||
snprintf(filename, 192, "%s%s", com_gamedir, Cmd_Argv(1));
|
||||
COM_StripExtension(filename, filename);
|
||||
COM_DefaultExtension (filename, ".avi");
|
||||
COM_StripExtension(filename, filename, sizeof(filename));
|
||||
COM_DefaultExtension (filename, ".avi", sizeof(filename));
|
||||
|
||||
//wipe it.
|
||||
f = fopen(filename, "rb");
|
||||
|
|
|
@ -34,7 +34,7 @@ extern void (*Draw_ConsoleBackground) (int lines);
|
|||
extern void (*Draw_EditorBackground) (int lines);
|
||||
extern void (*Draw_TileClear) (int x, int y, int w, int h);
|
||||
extern void (*Draw_Fill) (int x, int y, int w, int h, int c);
|
||||
extern void (*Draw_FillRGB) (int x, int y, int w, int h, float r, float g, float b);
|
||||
extern void (*Draw_FillRGB) (int x, int y, int w, int h, float r, float g, float b);
|
||||
extern void (*Draw_FadeScreen) (void);
|
||||
extern void (*Draw_BeginDisc) (void);
|
||||
extern void (*Draw_EndDisc) (void);
|
||||
|
|
|
@ -1596,7 +1596,7 @@ void P_ReadPointFile_f (void)
|
|||
char line[1024];
|
||||
char *s;
|
||||
|
||||
COM_StripExtension(cl.worldmodel->name, name);
|
||||
COM_StripExtension(cl.worldmodel->name, name, sizeof(name));
|
||||
strcat(name, ".pts");
|
||||
|
||||
f = FS_OpenVFS(name, "rb", FS_GAME);
|
||||
|
|
|
@ -180,7 +180,7 @@ cvar_t scr_chatmodecvar = SCVAR("scr_chatmode", "0");
|
|||
cvar_t gl_shadeq3 = SCVARF("gl_shadeq3", "1", CVAR_SEMICHEAT); //use if you want.
|
||||
cvar_t gl_shadeq2 = SCVARF("gl_shadeq2", "0", CVAR_SEMICHEAT); //use if you want.
|
||||
extern cvar_t r_vertexlight;
|
||||
cvar_t gl_shadeq1 = SCVARF("gl_shadeq1", "0", CVAR_CHEAT); //FIXME: :(
|
||||
cvar_t gl_shadeq1 = SCVARF("gl_shadeq1", "0", CVAR_SEMICHEAT);
|
||||
cvar_t gl_shadeq1_name = SCVAR("gl_shadeq1_name", "*");
|
||||
#endif
|
||||
|
||||
|
|
|
@ -138,12 +138,13 @@ void Skin_Find (player_info_t *sc)
|
|||
if (*mn)
|
||||
{
|
||||
mn = va("%s/%s", mn, s);
|
||||
COM_StripExtension (mn, name);
|
||||
COM_StripExtension (mn, name, sizeof(name));
|
||||
}
|
||||
else
|
||||
|
||||
s = Skin_FindName(sc);
|
||||
COM_StripExtension (s, name);
|
||||
{
|
||||
s = Skin_FindName(sc);
|
||||
COM_StripExtension (s, name, sizeof(name));
|
||||
}
|
||||
|
||||
s = strchr(name, '/');
|
||||
if (s)
|
||||
|
|
|
@ -1599,7 +1599,7 @@ void S_RawAudio(int sourceid, qbyte *data, int speed, int samples, int channels,
|
|||
spare = s->sfxcache->length;
|
||||
if (spare > snd_speed)
|
||||
{
|
||||
Con_Printf("Sacrificed raw sound stream\n");
|
||||
Con_DPrintf("Sacrificed raw sound stream\n");
|
||||
spare = 0; //too far out. sacrifice it all
|
||||
}
|
||||
}
|
||||
|
@ -1611,7 +1611,7 @@ void S_RawAudio(int sourceid, qbyte *data, int speed, int samples, int channels,
|
|||
|
||||
if (s->sfxcache->length > snd_speed*2) // more than 2 seconds of sound
|
||||
{
|
||||
Con_Printf("Sacrificed raw sound stream\n");
|
||||
Con_DPrintf("Sacrificed raw sound stream\n");
|
||||
spare = 0; //too far out. sacrifice it all
|
||||
}
|
||||
}
|
||||
|
|
|
@ -478,13 +478,18 @@ void Sys_ServerActivity(void)
|
|||
|
||||
|
||||
|
||||
char *Sys_GetClipboard(void)
|
||||
{
|
||||
return NULL;
|
||||
|
||||
#define SYS_CLIPBOARD_SIZE 256
|
||||
static char clipboard_buffer[SYS_CLIPBOARD_SIZE] = {0};
|
||||
|
||||
char *Sys_GetClipboard(void) {
|
||||
return clipboard_buffer;
|
||||
}
|
||||
|
||||
void Sys_CloseClipboard(char *bf)
|
||||
{
|
||||
}
|
||||
void Sys_SaveClipboard(char *text)
|
||||
{
|
||||
|
||||
void Sys_SaveClipboard(char *text) {
|
||||
Q_strncpyz(clipboard_buffer, text, SYS_CLIPBOARD_SIZE);
|
||||
}
|
||||
|
|
|
@ -1438,7 +1438,7 @@ static void TP_LoadLocFile (char *filename, qbool quiet)
|
|||
return;
|
||||
|
||||
Q_snprintfz (fullpath, sizeof(fullpath) - 4, "locs/%s", filename);
|
||||
COM_DefaultExtension (fullpath, ".loc");
|
||||
COM_DefaultExtension (fullpath, ".loc", sizeof(fullpath));
|
||||
|
||||
buf = (char *) COM_LoadTempFile (fullpath);
|
||||
if (!buf) {
|
||||
|
@ -3005,7 +3005,7 @@ qbool TP_CheckSoundTrigger (char *str)
|
|||
if (!snd_initialized)
|
||||
return false;
|
||||
|
||||
COM_DefaultExtension (soundname, ".wav");
|
||||
COM_DefaultExtension (soundname, ".wav", sizeof(soundname));
|
||||
|
||||
// make sure we have it on disk (FIXME)
|
||||
if (!FS_FLocateFile (va("sound/%s", soundname), FSLFRT_IFFOUND, NULL))
|
||||
|
|
|
@ -499,7 +499,7 @@ void Cmd_Exec_f (void)
|
|||
if (!*f)
|
||||
f = "fte";
|
||||
snprintf(name, sizeof(name)-5, "configs/%s", f);
|
||||
COM_DefaultExtension(name, ".cfg");
|
||||
COM_DefaultExtension(name, ".cfg", sizeof(name));
|
||||
}
|
||||
else
|
||||
Q_strncpyz(name, Cmd_Argv(1), sizeof(name));
|
||||
|
@ -2719,6 +2719,7 @@ void Cmd_WriteConfig_f(void)
|
|||
{
|
||||
vfsfile_t *f;
|
||||
char *filename;
|
||||
char fname[MAX_OSPATH];
|
||||
|
||||
filename = Cmd_Argv(1);
|
||||
if (!*filename)
|
||||
|
@ -2733,7 +2734,8 @@ void Cmd_WriteConfig_f(void)
|
|||
|
||||
filename = va("configs/%s.cfg",filename);
|
||||
}
|
||||
COM_DefaultExtension(filename, ".cfg");
|
||||
Q_strncpyz(fname, filename, sizeof(fname));
|
||||
COM_DefaultExtension(fname, ".cfg", sizeof(fname));
|
||||
FS_CreatePath(filename, FS_CONFIGONLY);
|
||||
f = FS_OpenVFS(filename, "wb", FS_CONFIGONLY);
|
||||
if (!f)
|
||||
|
@ -2786,7 +2788,7 @@ void Cmd_Condump_f(void)
|
|||
filename = "condump";
|
||||
|
||||
filename = va("%s", filename);
|
||||
COM_DefaultExtension(filename, ".txt");
|
||||
COM_DefaultExtension(filename, ".txt", MAX_QPATH);
|
||||
|
||||
f = FS_OpenVFS (filename, "wb", FS_GAME);
|
||||
if (!f)
|
||||
|
|
|
@ -1371,11 +1371,12 @@ char *COM_SkipPath (char *pathname)
|
|||
COM_StripExtension
|
||||
============
|
||||
*/
|
||||
void COM_StripExtension (char *in, char *out)
|
||||
void COM_StripExtension (char *in, char *out, int outlen)
|
||||
{
|
||||
char *s;
|
||||
|
||||
strcpy(out, in);
|
||||
if (out != in)
|
||||
Q_strncpyz(out, in, outlen);
|
||||
|
||||
s = out+strlen(out);
|
||||
|
||||
|
@ -1467,7 +1468,7 @@ void COM_CleanUpPath(char *str)
|
|||
COM_FileBase
|
||||
============
|
||||
*/
|
||||
void COM_FileBase (char *in, char *out)
|
||||
void COM_FileBase (char *in, char *out, int outlen)
|
||||
{
|
||||
char *s, *s2;
|
||||
|
||||
|
@ -1487,8 +1488,11 @@ void COM_FileBase (char *in, char *out)
|
|||
else
|
||||
{
|
||||
s--;
|
||||
Q_strncpyS (out,s2+1, s-s2);
|
||||
out[s-s2] = 0;
|
||||
outlen--;
|
||||
if (outlen > s-s2)
|
||||
outlen = s-s2;
|
||||
Q_strncpyS (out,s2+1, outlen);
|
||||
out[outlen] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1498,7 +1502,7 @@ void COM_FileBase (char *in, char *out)
|
|||
COM_DefaultExtension
|
||||
==================
|
||||
*/
|
||||
void COM_DefaultExtension (char *path, char *extension)
|
||||
void COM_DefaultExtension (char *path, char *extension, int maxlen)
|
||||
{
|
||||
char *src;
|
||||
//
|
||||
|
@ -1514,7 +1518,7 @@ void COM_DefaultExtension (char *path, char *extension)
|
|||
src--;
|
||||
}
|
||||
|
||||
strcat (path, extension);
|
||||
Q_strncatz (path, extension, maxlen);
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
|
|
|
@ -249,9 +249,9 @@ void COM_InitArgv (int argc, char **argv);
|
|||
void COM_ParsePlusSets (void);
|
||||
|
||||
char *COM_SkipPath (char *pathname);
|
||||
void COM_StripExtension (char *in, char *out);
|
||||
void COM_FileBase (char *in, char *out);
|
||||
void COM_DefaultExtension (char *path, char *extension);
|
||||
void COM_StripExtension (char *in, char *out, int outlen);
|
||||
void COM_FileBase (char *in, char *out, int outlen);
|
||||
void COM_DefaultExtension (char *path, char *extension, int maxlen);
|
||||
char *COM_FileExtension (char *in);
|
||||
void COM_CleanUpPath(char *str);
|
||||
|
||||
|
|
|
@ -1252,29 +1252,18 @@ The filename will be prefixed by the current game directory
|
|||
*/
|
||||
void COM_WriteFile (char *filename, void *data, int len)
|
||||
{
|
||||
FILE *f;
|
||||
char name[MAX_OSPATH];
|
||||
vfsfile_t *vfs;
|
||||
|
||||
sprintf (name, "%s/%s", com_gamedir, filename);
|
||||
Sys_Printf ("COM_WriteFile: %s\n", filename);
|
||||
|
||||
COM_CreatePath(name);
|
||||
|
||||
f = fopen (name, "wb");
|
||||
if (!f)
|
||||
FS_CreatePath(filename, FS_GAMEONLY);
|
||||
vfs = FS_OpenVFS(filename, "wb", FS_GAMEONLY);
|
||||
if (vfs)
|
||||
{
|
||||
Sys_mkdir(com_gamedir);
|
||||
f = fopen (name, "wb");
|
||||
if (!f)
|
||||
{
|
||||
Con_Printf("Error opening %s for writing\n", filename);
|
||||
return;
|
||||
}
|
||||
VFS_WRITE(vfs, data, len);
|
||||
VFS_CLOSE(vfs);
|
||||
}
|
||||
|
||||
Sys_Printf ("COM_WriteFile: %s\n", name);
|
||||
fwrite (data, 1, len, f);
|
||||
fclose (f);
|
||||
|
||||
com_fschanged=true;
|
||||
}
|
||||
|
||||
|
@ -1997,7 +1986,7 @@ 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)
|
||||
|
@ -2069,7 +2058,7 @@ qbyte *COM_LoadFile (char *path, int usehunk)
|
|||
|
||||
com_filesize = len = VFS_GETLEN(f);
|
||||
// extract the filename base name for hunk tag
|
||||
COM_FileBase (path, base);
|
||||
COM_FileBase (path, base, sizeof(base));
|
||||
|
||||
if (usehunk == 0)
|
||||
buf = (qbyte*)Z_Malloc (len+1);
|
||||
|
|
|
@ -992,7 +992,7 @@ void *Mod_LoadWall(char *name)
|
|||
int width, height;
|
||||
char ln[32];
|
||||
|
||||
COM_FileBase(name, ln);
|
||||
COM_FileBase(name, ln, sizeof(ln));
|
||||
|
||||
wal = (void *)COM_LoadMallocFile (name);
|
||||
if (!wal)
|
||||
|
|
|
@ -2826,7 +2826,7 @@ int GL_BuildSkinFileList(char *modelname)
|
|||
}
|
||||
skinfilecount=0;
|
||||
|
||||
COM_StripExtension(modelname, skinfilename);
|
||||
COM_StripExtension(modelname, skinfilename, sizeof(skinfilename));
|
||||
|
||||
//try and add numbered skins, and then try fixed names.
|
||||
for (i = 0; ; i++)
|
||||
|
@ -3205,12 +3205,15 @@ static void *Q1_LoadSkins (daliasskintype_t *pskintype, qboolean alpha)
|
|||
outskin->texnums=1;
|
||||
|
||||
outskin->ofstexnums = (char *)texnums - (char *)outskin;
|
||||
/*
|
||||
|
||||
#ifdef Q3SHADERS
|
||||
sprintf(skinname, "%s_%i", loadname, i);
|
||||
texnums->shader = R_RegisterSkin(skinname);
|
||||
if (cls.allow_shaders)
|
||||
{
|
||||
sprintf(skinname, "%s_%i", loadname, i);
|
||||
texnums->shader = R_RegisterCustom (skinname, NULL);
|
||||
}
|
||||
#endif
|
||||
*/
|
||||
|
||||
|
||||
texnums->base = texture;
|
||||
texnums->fullbright = fbtexture;
|
||||
|
@ -3290,12 +3293,15 @@ static void *Q1_LoadSkins (daliasskintype_t *pskintype, qboolean alpha)
|
|||
if (t != 0) //only keep the first.
|
||||
BZ_Free(saved);
|
||||
}
|
||||
/*
|
||||
|
||||
#ifdef Q3SHADERS
|
||||
sprintf(skinname, "%s_%i_%i", loadname, i, t);
|
||||
texnums->shader = R_RegisterSkin(skinname);
|
||||
if (cls.allow_shaders)
|
||||
{
|
||||
sprintf(skinname, "%s_%i_%i", loadname, i, t);
|
||||
texnums->shader = R_RegisterCustom (skinname, NULL);
|
||||
}
|
||||
#endif
|
||||
*/
|
||||
|
||||
texnums->base = texture;
|
||||
texnums->fullbright = fbtexture;
|
||||
}
|
||||
|
@ -3471,13 +3477,13 @@ int Mod_ReadFlagsFromMD1(char *name, int md3version)
|
|||
{
|
||||
dmdl_t *pinmodel;
|
||||
char fname[MAX_QPATH];
|
||||
COM_StripExtension(name, fname);
|
||||
COM_DefaultExtension(fname, ".mdl");
|
||||
COM_StripExtension(name, fname, sizeof(fname));
|
||||
COM_DefaultExtension(fname, ".mdl", sizeof(fname));
|
||||
|
||||
if (strcmp(name, fname)) //md3 renamed as mdl
|
||||
{
|
||||
COM_StripExtension(name, fname); //seeing as the md3 is named over the mdl,
|
||||
COM_DefaultExtension(fname, ".md1");//read from a file with md1 (one, not an ell)
|
||||
COM_StripExtension(name, fname, sizeof(fname)); //seeing as the md3 is named over the mdl,
|
||||
COM_DefaultExtension(fname, ".md1", sizeof(fname));//read from a file with md1 (one, not an ell)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -276,6 +276,97 @@ int r_backendStart;
|
|||
|
||||
int r_dlighttexture;
|
||||
|
||||
extern qbyte *host_basepal;
|
||||
extern qboolean gammaworks;
|
||||
extern qbyte gammatable[256];
|
||||
|
||||
void R_FetchTopColour(int *retred, int *retgreen, int *retblue)
|
||||
{
|
||||
int i;
|
||||
if (currententity->scoreboard)
|
||||
{
|
||||
i = currententity->scoreboard->topcolor;
|
||||
//colour forcing
|
||||
if (cl.splitclients<2 && !(cl.fpd & FPD_NO_FORCE_COLOR)) //no colour/skin forcing in splitscreen.
|
||||
{
|
||||
if (cl.teamplay && !strcmp(currententity->scoreboard->team, cl.players[cl.playernum[0]].team))
|
||||
{
|
||||
if (cl_teamtopcolor>=0)
|
||||
i = cl_teamtopcolor;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (cl_enemytopcolor>=0)
|
||||
i = cl_enemytopcolor;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
i = TOP_RANGE>>4;
|
||||
if (i > 8)
|
||||
{
|
||||
i<<=4;
|
||||
}
|
||||
else
|
||||
{
|
||||
i<<=4;
|
||||
i+=15;
|
||||
}
|
||||
i*=3;
|
||||
*retred = host_basepal[i+0];
|
||||
*retgreen = host_basepal[i+1];
|
||||
*retblue = host_basepal[i+2];
|
||||
if (!gammaworks)
|
||||
{
|
||||
*retred = gammatable[*retred];
|
||||
*retgreen = gammatable[*retgreen];
|
||||
*retblue = gammatable[*retblue];
|
||||
}
|
||||
}
|
||||
void R_FetchBottomColour(int *retred, int *retgreen, int *retblue)
|
||||
{
|
||||
int i;
|
||||
if (currententity->scoreboard)
|
||||
{
|
||||
i = currententity->scoreboard->bottomcolor;
|
||||
//colour forcing
|
||||
if (cl.splitclients<2 && !(cl.fpd & FPD_NO_FORCE_COLOR)) //no colour/skin forcing in splitscreen.
|
||||
{
|
||||
if (cl.teamplay && !strcmp(currententity->scoreboard->team, cl.players[cl.playernum[0]].team))
|
||||
{
|
||||
if (cl_teambottomcolor>=0)
|
||||
i = cl_teambottomcolor;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (cl_enemybottomcolor>=0)
|
||||
i = cl_enemybottomcolor;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
i = BOTTOM_RANGE>>4;
|
||||
if (i > 8)
|
||||
{
|
||||
i<<=4;
|
||||
}
|
||||
else
|
||||
{
|
||||
i<<=4;
|
||||
i+=15;
|
||||
}
|
||||
i*=3;
|
||||
*retred = host_basepal[i+0];
|
||||
*retgreen = host_basepal[i+1];
|
||||
*retblue = host_basepal[i+2];
|
||||
if (!gammaworks)
|
||||
{
|
||||
*retred = gammatable[*retred];
|
||||
*retgreen = gammatable[*retgreen];
|
||||
*retblue = gammatable[*retblue];
|
||||
}
|
||||
}
|
||||
|
||||
void R_InitDynamicLightTexture (void)
|
||||
{
|
||||
int x, y;
|
||||
|
@ -1335,10 +1426,7 @@ R_ModifyColor
|
|||
*/
|
||||
void R_ModifyColor ( meshbuffer_t *mb, shaderpass_t *pass )
|
||||
{
|
||||
extern qbyte *host_basepal;
|
||||
extern qboolean gammaworks;
|
||||
extern qbyte gammatable[256];
|
||||
|
||||
|
||||
int i, b;
|
||||
float *table, c, a;
|
||||
vec3_t t, v;
|
||||
|
@ -1420,45 +1508,7 @@ void R_ModifyColor ( meshbuffer_t *mb, shaderpass_t *pass )
|
|||
case RGB_GEN_TOPCOLOR: //multiply vertex by topcolor (for player models)
|
||||
{
|
||||
int rc, gc, bc;
|
||||
if (currententity->scoreboard)
|
||||
{
|
||||
i = currententity->scoreboard->topcolor;
|
||||
//colour forcing
|
||||
if (cl.splitclients<2 && !(cl.fpd & FPD_NO_FORCE_COLOR)) //no colour/skin forcing in splitscreen.
|
||||
{
|
||||
if (cl.teamplay && !strcmp(currententity->scoreboard->team, cl.players[cl.playernum[0]].team))
|
||||
{
|
||||
if (cl_teamtopcolor>=0)
|
||||
i = cl_teamtopcolor;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (cl_enemytopcolor>=0)
|
||||
i = cl_enemytopcolor;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
i = TOP_RANGE>>4;
|
||||
if (i > 8)
|
||||
{
|
||||
i<<=4;
|
||||
}
|
||||
else
|
||||
{
|
||||
i<<=4;
|
||||
i+=15;
|
||||
}
|
||||
i*=3;
|
||||
rc = host_basepal[i+0];
|
||||
gc = host_basepal[i+1];
|
||||
bc = host_basepal[i+2];
|
||||
if (!gammaworks)
|
||||
{
|
||||
rc = gammatable[rc];
|
||||
gc = gammatable[gc];
|
||||
bc = gammatable[bc];
|
||||
}
|
||||
R_FetchTopColour(&rc, &gc, &bc);
|
||||
for ( i = 0; i < numColors; i++, bArray += 4, vArray += 4 ) {
|
||||
bArray[0] = (vArray[0]*rc)>>8;
|
||||
bArray[1] = (vArray[1]*gc)>>8;
|
||||
|
@ -1470,45 +1520,7 @@ void R_ModifyColor ( meshbuffer_t *mb, shaderpass_t *pass )
|
|||
case RGB_GEN_BOTTOMCOLOR: //multiply vertex by bottomcolor (for player models)
|
||||
{
|
||||
int rc, gc, bc;
|
||||
if (currententity->scoreboard)
|
||||
{
|
||||
i = currententity->scoreboard->bottomcolor;
|
||||
//colour forcing
|
||||
if (cl.splitclients<2 && !(cl.fpd & FPD_NO_FORCE_COLOR)) //no colour/skin forcing in splitscreen.
|
||||
{
|
||||
if (cl.teamplay && !strcmp(currententity->scoreboard->team, cl.players[cl.playernum[0]].team))
|
||||
{
|
||||
if (cl_teambottomcolor>=0)
|
||||
i = cl_teambottomcolor;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (cl_enemybottomcolor>=0)
|
||||
i = cl_enemybottomcolor;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
i = BOTTOM_RANGE>>4;
|
||||
if (i > 8)
|
||||
{
|
||||
i<<=4;
|
||||
}
|
||||
else
|
||||
{
|
||||
i<<=4;
|
||||
i+=15;
|
||||
}
|
||||
i*=3;
|
||||
rc = host_basepal[i+0];
|
||||
gc = host_basepal[i+1];
|
||||
bc = host_basepal[i+2];
|
||||
if (!gammaworks)
|
||||
{
|
||||
rc = gammatable[rc];
|
||||
gc = gammatable[gc];
|
||||
bc = gammatable[bc];
|
||||
}
|
||||
R_FetchBottomColour(&rc, &gc, &bc);
|
||||
for ( i = 0; i < numColors; i++, bArray += 4, vArray += 4 ) {
|
||||
bArray[0] = (vArray[0]*rc)>>8;
|
||||
bArray[1] = (vArray[1]*gc)>>8;
|
||||
|
@ -2055,6 +2067,69 @@ void R_RenderMeshCombined ( meshbuffer_t *mb, shaderpass_t *pass )
|
|||
R_FlushArraysMtex ();
|
||||
}
|
||||
|
||||
void R_RenderMeshProgram ( meshbuffer_t *mb, shaderpass_t *pass )
|
||||
{
|
||||
shader_t *s;
|
||||
int i;
|
||||
vec3_t param3;
|
||||
int r, g, b;
|
||||
|
||||
r_numUnits = pass->numMergedPasses;
|
||||
|
||||
R_SetShaderpassState ( pass, true );
|
||||
R_ModifyColor ( mb, pass );
|
||||
|
||||
GL_SelectTexture( mtexid0 );
|
||||
if ( pass->blendmode == GL_REPLACE )
|
||||
GL_TexEnv( GL_REPLACE );
|
||||
else
|
||||
GL_TexEnv( GL_MODULATE );
|
||||
R_ModifyTextureCoords ( pass, 0 );
|
||||
|
||||
for ( i = 1, pass++; i < r_numUnits; i++, pass++ )
|
||||
{
|
||||
GL_SelectTexture( mtexid0 + i );
|
||||
|
||||
R_ModifyTextureCoords ( pass, i );
|
||||
}
|
||||
|
||||
s = mb->shader;
|
||||
GLSlang_UseProgram(s->programhandle);
|
||||
for (i = 0; i < s->numprogparams; i++)
|
||||
{
|
||||
switch(s->progparm[i].type)
|
||||
{
|
||||
case SP_TIME:
|
||||
qglUniform1fARB(s->progparm[i].handle, r_localShaderTime);
|
||||
break;
|
||||
|
||||
case SP_ENTCOLOURS:
|
||||
qglUniform4fvARB(s->progparm[i].handle, 1, currententity->shaderRGBAf);
|
||||
break;
|
||||
case SP_TOPCOLOURS:
|
||||
R_FetchTopColour(&r, &g, &b);
|
||||
param3[0] = r/255;
|
||||
param3[1] = g/255;
|
||||
param3[2] = b/255;
|
||||
qglUniform3fvARB(s->progparm[i].handle, 1, param3);
|
||||
break;
|
||||
case SP_BOTTOMCOLOURS:
|
||||
R_FetchBottomColour(&r, &g, &b);
|
||||
param3[0] = r/255;
|
||||
param3[1] = g/255;
|
||||
param3[2] = b/255;
|
||||
qglUniform3fvARB(s->progparm[i].handle, 1, param3);
|
||||
break;
|
||||
|
||||
default:
|
||||
Host_EndGame("Bad shader program parameter type (%i)", s->progparm[i].type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
R_FlushArraysMtex ();
|
||||
GLSlang_UseProgram(0);
|
||||
}
|
||||
|
||||
/*
|
||||
================
|
||||
R_RenderMeshBuffer
|
||||
|
@ -2398,7 +2473,11 @@ void R_FinishMeshBuffer ( meshbuffer_t *mb )
|
|||
qboolean dlight;
|
||||
|
||||
shader = mb->shader;
|
||||
dlight = (mb->dlightbits != 0) && !(shader->flags & SHADER_FLARE);
|
||||
if ((mb->dlightbits != 0) && !(shader->flags & SHADER_FLARE))
|
||||
dlight = (currententity->model->type == mod_brush && currententity->model->fromgame == fg_quake3);
|
||||
else
|
||||
dlight = false;
|
||||
|
||||
fogged = mb->fog && ((shader->sort < SHADER_SORT_UNDERWATER &&
|
||||
(shader->flags & (SHADER_DEPTHWRITE|SHADER_SKY))) || shader->fog_dist);
|
||||
|
||||
|
@ -2410,7 +2489,7 @@ void R_FinishMeshBuffer ( meshbuffer_t *mb )
|
|||
qglDisable ( GL_ALPHA_TEST );
|
||||
qglDepthMask ( GL_FALSE );
|
||||
|
||||
if (dlight && (currententity->model->type == mod_brush && currententity->model->fromgame == fg_quake3)) //HACK: the extra check is because we play with the lightmaps in q1/q2
|
||||
if (dlight) //HACK: the extra check is because we play with the lightmaps in q1/q2
|
||||
{
|
||||
R_AddDynamicLights ( mb );
|
||||
}
|
||||
|
@ -2419,6 +2498,8 @@ void R_FinishMeshBuffer ( meshbuffer_t *mb )
|
|||
{
|
||||
R_RenderFogOnMesh ( shader, mb->fog );
|
||||
}
|
||||
|
||||
qglDepthMask ( GL_TRUE );
|
||||
}
|
||||
|
||||
if ( r_showtris.value || r_shownormals.value ) {
|
||||
|
|
|
@ -336,15 +336,15 @@ void GLMod_Think (void)
|
|||
|
||||
if (lightmodel->deluxdata)
|
||||
{
|
||||
COM_StripExtension(lightmodel->name, filename);
|
||||
COM_DefaultExtension(filename, ".lux");
|
||||
COM_StripExtension(lightmodel->name, filename, sizeof(filename));
|
||||
COM_DefaultExtension(filename, ".lux", sizeof(filename));
|
||||
FS_WriteFile(filename, lightmodel->deluxdata-8, numlightdata*3+8, FS_GAME);
|
||||
}
|
||||
|
||||
if (writelitfile) //the user might already have a lit file (don't overwrite it).
|
||||
{
|
||||
COM_StripExtension(lightmodel->name, filename);
|
||||
COM_DefaultExtension(filename, ".lit");
|
||||
COM_StripExtension(lightmodel->name, filename, sizeof(filename));
|
||||
COM_DefaultExtension(filename, ".lit", sizeof(filename));
|
||||
FS_WriteFile(filename, lightmodel->lightdata-8, numlightdata*3+8, FS_GAME);
|
||||
}
|
||||
}
|
||||
|
@ -459,7 +459,7 @@ model_t *GLMod_LoadModel (model_t *mod, qboolean crash)
|
|||
if (Q_strcasecmp(ext, "spr") && Q_strcasecmp(ext, "sp2"))
|
||||
{
|
||||
char mdlbase[MAX_QPATH];
|
||||
COM_StripExtension(mod->name, mdlbase);
|
||||
COM_StripExtension(mod->name, mdlbase, sizeof(mdlbase));
|
||||
#ifdef MD3MODELS
|
||||
if (!buf)
|
||||
buf = (unsigned *)COM_LoadStackFile (va("%s.md3", mdlbase), stackbuf, sizeof(stackbuf));
|
||||
|
@ -507,7 +507,7 @@ couldntload:
|
|||
//
|
||||
// allocate a new model
|
||||
//
|
||||
COM_FileBase (mod->name, loadname);
|
||||
COM_FileBase (mod->name, loadname, sizeof(loadname));
|
||||
Validation_IncludeFile(mod->name, (char *)buf, com_filesize);
|
||||
|
||||
//
|
||||
|
@ -1009,21 +1009,21 @@ TRACE(("dbg: GLMod_LoadTextures: inittexturedescs\n"));
|
|||
}
|
||||
}
|
||||
#ifdef Q3SHADERS //load q3 syntax shader last, after the textures inside the bsp have been loaded and stuff.
|
||||
if (gl_shadeq1.value && *gl_shadeq1_name.string)
|
||||
if (cls.allow_shaders && gl_shadeq1.value && *gl_shadeq1_name.string)
|
||||
{
|
||||
char *star;
|
||||
//find the *
|
||||
if (!strcmp(gl_shadeq1_name.string, "*"))
|
||||
tx->shader = R_RegisterShader(mt->name); //just load the regular name.
|
||||
tx->shader = R_RegisterCustom(mt->name, NULL); //just load the regular name.
|
||||
else if (!(star = strchr(gl_shadeq1_name.string, '*')) || (strlen(gl_shadeq1_name.string)+strlen(mt->name)+1>=sizeof(altname))) //it's got to fit.
|
||||
tx->shader = R_RegisterShader(gl_shadeq1_name.string);
|
||||
tx->shader = R_RegisterCustom(gl_shadeq1_name.string, NULL);
|
||||
else
|
||||
{
|
||||
strncpy(altname, gl_shadeq1_name.string, star-gl_shadeq1_name.string); //copy the left
|
||||
altname[star-gl_shadeq1_name.string] = '\0';
|
||||
strcat(altname, mt->name); //insert the *
|
||||
strcat(altname, star+1); //add any final text.
|
||||
tx->shader = R_RegisterShader(altname);
|
||||
tx->shader = R_RegisterCustom(altname, NULL);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -1247,19 +1247,19 @@ void GLMod_LoadLighting (lump_t *l)
|
|||
if (!luxdata)
|
||||
{
|
||||
strcpy(luxname, loadmodel->name);
|
||||
COM_StripExtension(loadmodel->name, luxname);
|
||||
COM_DefaultExtension(luxname, ".lux");
|
||||
COM_StripExtension(loadmodel->name, luxname, sizeof(luxname));
|
||||
COM_DefaultExtension(luxname, ".lux", sizeof(luxname));
|
||||
luxdata = COM_LoadHunkFile(luxname);
|
||||
}
|
||||
if (!luxdata)
|
||||
{
|
||||
strcpy(luxname, "luxs/");
|
||||
COM_StripExtension(COM_SkipPath(loadmodel->name), luxname+5);
|
||||
COM_StripExtension(COM_SkipPath(loadmodel->name), luxname+5, sizeof(luxname)-5);
|
||||
strcat(luxname, ".lux");
|
||||
|
||||
luxdata = COM_LoadHunkFile(luxname);
|
||||
}
|
||||
COM_StripExtension(COM_SkipPath(loadmodel->name), luxname+5);
|
||||
COM_StripExtension(COM_SkipPath(loadmodel->name), luxname+5, sizeof(luxname)-5);
|
||||
strcat(luxname, ".lux");
|
||||
if (luxdata)
|
||||
{
|
||||
|
@ -1300,13 +1300,13 @@ void GLMod_LoadLighting (lump_t *l)
|
|||
|
||||
{
|
||||
strcpy(litnamemaps, loadmodel->name);
|
||||
COM_StripExtension(loadmodel->name, litnamemaps);
|
||||
COM_DefaultExtension(litnamemaps, ".lit");
|
||||
COM_StripExtension(loadmodel->name, litnamemaps, sizeof(litnamemaps));
|
||||
COM_DefaultExtension(litnamemaps, ".lit", sizeof(litnamemaps));
|
||||
depthmaps = COM_FDepthFile(litnamemaps, false);
|
||||
}
|
||||
{
|
||||
strcpy(litnamelits, "lits/");
|
||||
COM_StripExtension(COM_SkipPath(loadmodel->name), litnamelits+5);
|
||||
COM_StripExtension(COM_SkipPath(loadmodel->name), litnamelits+5, sizeof(litnamelits) - 5);
|
||||
strcat(litnamelits, ".lit");
|
||||
depthlits = COM_FDepthFile(litnamelits, false);
|
||||
}
|
||||
|
@ -1319,7 +1319,7 @@ void GLMod_LoadLighting (lump_t *l)
|
|||
}
|
||||
|
||||
litdata = COM_LoadHunkFile(litname);
|
||||
COM_StripExtension(COM_SkipPath(loadmodel->name), litname+5);
|
||||
COM_StripExtension(COM_SkipPath(loadmodel->name), litname+5, sizeof(litname)-5);
|
||||
strcat(litname, ".lit");
|
||||
if (litdata && (litdata[0] == 'Q' && litdata[1] == 'L' && litdata[2] == 'I' && litdata[3] == 'T'))
|
||||
{
|
||||
|
@ -1994,8 +1994,8 @@ void GLMod_LoadCrouchHull(void)
|
|||
|
||||
//find a name for a ccn and try to load it.
|
||||
strcpy(crouchhullname, loadmodel->name);
|
||||
COM_StripExtension(loadmodel->name, crouchhullname);
|
||||
COM_DefaultExtension(crouchhullname, ".crh"); //crouch hull
|
||||
COM_StripExtension(loadmodel->name, crouchhullname, sizeof(crouchhullname));
|
||||
COM_DefaultExtension(crouchhullname, ".crh",sizeof(crouchhullname)); //crouch hull
|
||||
|
||||
crouchhullfile = COM_LoadMallocFile(crouchhullname); //or otherwise temporary storage. load on hunk if you want, but that would be a waste.
|
||||
if (!crouchhullfile)
|
||||
|
@ -2781,13 +2781,13 @@ void * GLMod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum
|
|||
}
|
||||
if (!pspriteframe->gl_texturenum)
|
||||
{ //the older fte way.
|
||||
COM_StripExtension(loadmodel->name, name);
|
||||
COM_StripExtension(loadmodel->name, name, sizeof(name));
|
||||
strcat(name, va("_%i", framenum));
|
||||
pspriteframe->gl_texturenum = Mod_LoadReplacementTexture(name, "sprites", true, true, true);
|
||||
}
|
||||
if (!pspriteframe->gl_texturenum)
|
||||
{ //the fuhquake way
|
||||
COM_StripExtension(COM_SkipPath(loadmodel->name), name);
|
||||
COM_StripExtension(COM_SkipPath(loadmodel->name), name, sizeof(name));
|
||||
strcat(name, va("_%i", framenum));
|
||||
pspriteframe->gl_texturenum = Mod_LoadReplacementTexture(name, "sprites", true, true, true);
|
||||
}
|
||||
|
|
|
@ -1528,11 +1528,18 @@ static void PPL_BaseTextureChain(msurface_t *first)
|
|||
|
||||
if (mb.mesh)
|
||||
R_RenderMeshBuffer ( &mb, false );
|
||||
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
qglEnable(GL_TEXTURE_2D);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
t = GLR_TextureAnimation (first->texinfo->texture);
|
||||
|
||||
if (first->flags & SURF_DRAWTURB)
|
||||
|
@ -4753,6 +4760,8 @@ qboolean PPL_AddLight(dlight_t *dl)
|
|||
qglStencilFunc( GL_ALWAYS, 0, ~0 );
|
||||
|
||||
qglDisable(GL_SCISSOR_TEST);
|
||||
qglDisable(GL_BLEND);
|
||||
GL_TexEnv(GL_REPLACE);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -905,7 +905,7 @@ void R_LoadRTLights(void)
|
|||
cl_dlights[i].radius = 0;
|
||||
}
|
||||
|
||||
COM_StripExtension(cl.worldmodel->name, fname);
|
||||
COM_StripExtension(cl.worldmodel->name, fname, sizeof(fname));
|
||||
strncat(fname, ".rtlights", MAX_QPATH-1);
|
||||
|
||||
file = COM_LoadTempFile(fname);
|
||||
|
@ -992,7 +992,7 @@ void GLR_NewMap (void)
|
|||
r_worldentity.model = cl.worldmodel;
|
||||
|
||||
|
||||
COM_StripExtension(COM_SkipPath(cl.worldmodel->name), namebuf);
|
||||
COM_StripExtension(COM_SkipPath(cl.worldmodel->name), namebuf, sizeof(namebuf));
|
||||
Cvar_Set(&host_mapname, namebuf);
|
||||
|
||||
// clear out efrags in case the level hasn't been reloaded
|
||||
|
|
|
@ -539,6 +539,111 @@ static void Shader_EntityMergable ( shader_t *shader, shaderpass_t *pass, char *
|
|||
shader->flags |= SHADER_ENTITY_MERGABLE;
|
||||
}
|
||||
|
||||
static void Shader_ProgramName ( shader_t *shader, shaderpass_t *pass, char **ptr )
|
||||
{
|
||||
char *vert, *frag;
|
||||
char *token;
|
||||
if (shader->programhandle)
|
||||
{ //this allows fallbacks
|
||||
token = Shader_ParseString ( ptr );
|
||||
token = Shader_ParseString ( ptr );
|
||||
return;
|
||||
}
|
||||
token = Shader_ParseString ( ptr );
|
||||
FS_LoadFile(token, &vert);
|
||||
token = Shader_ParseString ( ptr );
|
||||
FS_LoadFile(token, &frag);
|
||||
if (vert && frag)
|
||||
shader->programhandle = GLSlang_CreateProgram("", vert, frag);
|
||||
if (vert)
|
||||
FS_FreeFile(vert);
|
||||
if (frag)
|
||||
FS_FreeFile(frag);
|
||||
}
|
||||
|
||||
static void Shader_ProgramParam ( shader_t *shader, shaderpass_t *pass, char **ptr )
|
||||
{
|
||||
cvar_t *cv;
|
||||
int specialint = 0;
|
||||
float specialfloat = 0;
|
||||
enum shaderprogparmtype_e parmtype = SP_BAD;
|
||||
char *token;
|
||||
unsigned int uniformloc;
|
||||
|
||||
token = Shader_ParseString ( ptr );
|
||||
if (!Q_stricmp(token, "texture"))
|
||||
{
|
||||
token = Shader_ParseString ( ptr );
|
||||
specialint = atoi(token);
|
||||
parmtype = SP_TEXTURE;
|
||||
}
|
||||
else if (!Q_stricmp(token, "cvari"))
|
||||
{
|
||||
token = Shader_ParseString ( ptr );
|
||||
cv = Cvar_Get(token, "", 0, "GLSL Shader parameters");
|
||||
if (cv)
|
||||
{ //Cvar_Get returns null if the cvar is the name of a command
|
||||
specialint = atoi(cv->string);
|
||||
specialfloat = cv->value;
|
||||
}
|
||||
parmtype = SP_CVARI;
|
||||
}
|
||||
else if (!Q_stricmp(token, "cvarf"))
|
||||
{
|
||||
token = Shader_ParseString ( ptr );
|
||||
cv = Cvar_Get(token, "", 0, "GLSL Shader parameters");
|
||||
if (cv)
|
||||
{ //Cvar_Get returns null if the cvar is the name of a command
|
||||
specialint = atoi(cv->string);
|
||||
specialfloat = cv->value;
|
||||
}
|
||||
parmtype = SP_CVARF;
|
||||
}
|
||||
else if (!Q_stricmp(token, "time"))
|
||||
{
|
||||
parmtype = SP_TIME;
|
||||
}
|
||||
|
||||
|
||||
if (!shader->programhandle)
|
||||
{
|
||||
Con_Printf("shader %s: param without program set\n", shader->name);
|
||||
token = Shader_ParseString ( ptr );
|
||||
}
|
||||
else
|
||||
{
|
||||
GLSlang_UseProgram(shader->programhandle);
|
||||
|
||||
token = Shader_ParseString ( ptr );
|
||||
uniformloc = GLSlang_GetUniformLocation(shader->programhandle, token);
|
||||
|
||||
if (uniformloc == -1)
|
||||
{
|
||||
Con_Printf("shader %s: param without uniform \"%s\"\n", shader->name, token);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch(parmtype)
|
||||
{
|
||||
case SP_TEXTURE:
|
||||
case SP_CVARI:
|
||||
GLSlang_SetUniform1i(uniformloc, specialint);
|
||||
break;
|
||||
case SP_CVARF:
|
||||
GLSlang_SetUniform1f(uniformloc, specialfloat);
|
||||
break;
|
||||
default:
|
||||
shader->progparm[shader->numprogparams].type = parmtype;
|
||||
shader->progparm[shader->numprogparams].handle = uniformloc;
|
||||
shader->numprogparams++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
GLSlang_UseProgram(0);
|
||||
}
|
||||
}
|
||||
|
||||
static shaderkey_t shaderkeys[] =
|
||||
{
|
||||
{"cull", Shader_Cull },
|
||||
|
@ -552,6 +657,10 @@ static shaderkey_t shaderkeys[] =
|
|||
{"deformvertexes", Shader_DeformVertexes },
|
||||
{"portal", Shader_Portal },
|
||||
{"entitymergable", Shader_EntityMergable },
|
||||
|
||||
{"program", Shader_ProgramName }, //glsl
|
||||
{"param", Shader_ProgramParam },
|
||||
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
@ -1367,6 +1476,57 @@ static qboolean Shader_Parsetok (shader_t *shader, shaderpass_t *pass, shaderkey
|
|||
}
|
||||
}
|
||||
|
||||
if (!Q_stricmp(token, "if"))
|
||||
{
|
||||
int indent = 0;
|
||||
cvar_t *cv;
|
||||
qboolean conditiontrue = true;
|
||||
token = COM_ParseExt ( ptr, false );
|
||||
if (*token == '!')
|
||||
{
|
||||
conditiontrue = false;
|
||||
token++;
|
||||
}
|
||||
cv = Cvar_Get(token, "", 0, "Shader Conditions");
|
||||
if (cv)
|
||||
conditiontrue = conditiontrue == !!cv->value;
|
||||
|
||||
if (conditiontrue)
|
||||
{
|
||||
while ( ptr )
|
||||
{
|
||||
token = COM_ParseExt (ptr, true);
|
||||
if ( !token[0] )
|
||||
continue;
|
||||
else if (token[0] == ']' || token[0] == '}')
|
||||
indent--;
|
||||
else if (token[0] == '[')
|
||||
indent++;
|
||||
else
|
||||
Shader_Parsetok (shader, pass, keys, token, ptr);
|
||||
if (!indent)
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
while ( ptr )
|
||||
{
|
||||
token = COM_ParseExt (ptr, true);
|
||||
if (!token[0])
|
||||
continue;
|
||||
else if (token[0] == ']' || token[0] == '}')
|
||||
indent--;
|
||||
else if (token[0] == '[')
|
||||
indent++;
|
||||
if (!indent)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ( ptr && *ptr && **ptr == '}' );
|
||||
}
|
||||
|
||||
// Next Line
|
||||
while (ptr)
|
||||
{
|
||||
|
@ -1553,7 +1713,7 @@ void Shader_Finish ( shader_t *s )
|
|||
s->sort = SHADER_SORT_ADDITIVE - 1;
|
||||
}
|
||||
|
||||
if ( r_vertexlight.value )
|
||||
if ( r_vertexlight.value && !s->programhandle)
|
||||
{
|
||||
// do we have a lightmap pass?
|
||||
pass = s->passes;
|
||||
|
@ -1718,6 +1878,14 @@ done:;
|
|||
s->flags &= ~SHADER_DEPTHWRITE;
|
||||
}
|
||||
|
||||
if (s->programhandle)
|
||||
{
|
||||
if (!s->numpasses)
|
||||
s->numpasses = 1;
|
||||
s->passes->numMergedPasses = s->numpasses;
|
||||
s->passes->flush = R_RenderMeshProgram;
|
||||
}
|
||||
|
||||
Shader_SetFeatures ( s );
|
||||
}
|
||||
/*
|
||||
|
@ -1849,7 +2017,7 @@ void Shader_DefaultBSP(char *shortname, shader_t *s)
|
|||
int bumptex;
|
||||
extern cvar_t gl_bump;
|
||||
|
||||
if (0)//this isn't working right yet gl_config.arb_texture_env_dot3)
|
||||
if (gl_config.arb_texture_env_dot3)
|
||||
{
|
||||
if (gl_bump.value)
|
||||
bumptex = Mod_LoadHiResTexture(va("normalmaps/%s", shortname), NULL, true, false, false);//GL_FindImage (shortname, 0);
|
||||
|
@ -2201,15 +2369,83 @@ void Shader_Default2D(char *shortname, shader_t *s)
|
|||
s->registration_sequence = 1;//fizme: registration_sequence;
|
||||
}
|
||||
|
||||
qboolean Shader_ParseShader(char *shortname, char *usename, shader_t *s)
|
||||
{
|
||||
unsigned int offset = 0, length;
|
||||
char path[MAX_QPATH];
|
||||
char *buf = NULL, *ts = NULL;
|
||||
|
||||
Shader_GetPathAndOffset( shortname, &ts, &offset );
|
||||
|
||||
if ( ts )
|
||||
{
|
||||
Com_sprintf ( path, sizeof(path), "%s", ts );
|
||||
length = FS_LoadFile ( path, (void **)&buf );
|
||||
}
|
||||
else
|
||||
length = 0;
|
||||
|
||||
// the shader is in the shader scripts
|
||||
if ( ts && buf && (offset < length) )
|
||||
{
|
||||
char *file, *token;
|
||||
|
||||
|
||||
file = buf + offset;
|
||||
token = COM_ParseExt (&file, true);
|
||||
if ( !file || token[0] != '{' )
|
||||
{
|
||||
FS_FreeFile(buf);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
memset ( s, 0, sizeof( shader_t ) );
|
||||
|
||||
Com_sprintf ( s->name, MAX_QPATH, usename );
|
||||
|
||||
// set defaults
|
||||
s->flags = SHADER_CULL_FRONT;
|
||||
s->registration_sequence = 1;//fizme: registration_sequence;
|
||||
|
||||
// if (!strcmp(COM_FileExtension(ts), "rscript"))
|
||||
// {
|
||||
// Shader_DefaultBSP(shortname, s);
|
||||
// }
|
||||
|
||||
while ( file )
|
||||
{
|
||||
token = COM_ParseExt (&file, true);
|
||||
|
||||
if ( !token[0] )
|
||||
continue;
|
||||
else if ( token[0] == '}' )
|
||||
break;
|
||||
else if ( token[0] == '{' )
|
||||
Shader_Readpass ( s, &file );
|
||||
else if ( Shader_Parsetok (s, NULL, shaderkeys, token, &file ) )
|
||||
break;
|
||||
}
|
||||
|
||||
Shader_Finish ( s );
|
||||
|
||||
FS_FreeFile(buf);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (buf)
|
||||
FS_FreeFile(buf);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int R_LoadShader ( char *name, void(*defaultgen)(char *name, shader_t*))
|
||||
{
|
||||
int i, f = -1;
|
||||
unsigned int offset = 0, length = 0;
|
||||
char shortname[MAX_QPATH], path[MAX_QPATH];
|
||||
char *buf = NULL, *ts = NULL;
|
||||
char shortname[MAX_QPATH];
|
||||
shader_t *s;
|
||||
|
||||
COM_StripExtension ( name, shortname );
|
||||
COM_StripExtension ( name, shortname, sizeof(shortname));
|
||||
|
||||
COM_CleanUpPath(shortname);
|
||||
|
||||
|
@ -2237,65 +2473,26 @@ int R_LoadShader ( char *name, void(*defaultgen)(char *name, shader_t*))
|
|||
}
|
||||
|
||||
s = &r_shaders[f];
|
||||
memset ( s, 0, sizeof( shader_t ) );
|
||||
|
||||
Com_sprintf ( s->name, MAX_QPATH, shortname );
|
||||
|
||||
Shader_GetPathAndOffset( shortname, &ts, &offset );
|
||||
|
||||
if ( ts ) {
|
||||
Com_sprintf ( path, sizeof(path), "%s", ts );
|
||||
length = FS_LoadFile ( path, (void **)&buf );
|
||||
}
|
||||
|
||||
// the shader is in the shader scripts
|
||||
if ( ts && buf && (offset < length) )
|
||||
if (gl_config.arb_shader_objects)
|
||||
{
|
||||
char *ptr, *token;
|
||||
|
||||
// set defaults
|
||||
s->flags = SHADER_CULL_FRONT;
|
||||
s->registration_sequence = 1;//fizme: registration_sequence;
|
||||
|
||||
// if (!strcmp(COM_FileExtension(ts), "rscript"))
|
||||
// {
|
||||
// Shader_DefaultBSP(shortname, s);
|
||||
// }
|
||||
|
||||
ptr = buf + offset;
|
||||
token = COM_ParseExt (&ptr, true);
|
||||
|
||||
if ( !ptr || token[0] != '{' ) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
while ( ptr )
|
||||
{
|
||||
token = COM_ParseExt (&ptr, true);
|
||||
|
||||
if ( !token[0] ) {
|
||||
continue;
|
||||
} else if ( token[0] == '}' ) {
|
||||
break;
|
||||
} else if ( token[0] == '{' ) {
|
||||
Shader_Readpass ( s, &ptr );
|
||||
} else if ( Shader_Parsetok (s, NULL, shaderkeys, token, &ptr ) ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Shader_Finish ( s );
|
||||
FS_FreeFile ( buf );
|
||||
if (Shader_ParseShader(va("%s_glsl", shortname), shortname, s))
|
||||
return f;
|
||||
}
|
||||
else // make a default shader
|
||||
if (Shader_ParseShader(shortname, shortname, s))
|
||||
return f;
|
||||
|
||||
// make a default shader
|
||||
|
||||
if (defaultgen)
|
||||
{
|
||||
if (defaultgen)
|
||||
defaultgen(shortname, s);
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
memset ( s, 0, sizeof( shader_t ) );
|
||||
Com_sprintf ( s->name, MAX_QPATH, shortname );
|
||||
defaultgen(shortname, s);
|
||||
|
||||
return f;
|
||||
return f;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
shader_t *R_RegisterPic (char *name)
|
||||
|
|
|
@ -112,6 +112,7 @@ PFNGLGETINFOLOGARBPROC qglGetInfoLogARB;
|
|||
PFNGLLINKPROGRAMARBPROC qglLinkProgramARB;
|
||||
PFNGLGETUNIFORMLOCATIONARBPROC qglGetUniformLocationARB;
|
||||
PFNGLUNIFORM4FARBPROC qglUniform4fARB;
|
||||
PFNGLUNIFORM4FVARBPROC qglUniform4fvARB;
|
||||
PFNGLUNIFORM3FARBPROC qglUniform3fARB;
|
||||
PFNGLUNIFORM3FVARBPROC qglUniform3fvARB;
|
||||
PFNGLUNIFORM1IARBPROC qglUniform1iARB;
|
||||
|
@ -369,6 +370,7 @@ void GL_CheckExtensions (void *(*getglfunction) (char *name))
|
|||
qglLinkProgramARB = (void *)getglext("glLinkProgramARB");
|
||||
qglGetUniformLocationARB = (void *)getglext("glGetUniformLocationARB");
|
||||
qglUniform4fARB = (void *)getglext("glUniform4fARB");
|
||||
qglUniform4fvARB = (void *)getglext("glUniform4fvARB");
|
||||
qglUniform3fARB = (void *)getglext("glUniform3fARB");
|
||||
qglUniform3fvARB = (void *)getglext("glUniform3fvARB");
|
||||
qglUniform1iARB = (void *)getglext("glUniform1iARB");
|
||||
|
|
|
@ -765,6 +765,7 @@ extern PFNGLGETINFOLOGARBPROC qglGetInfoLogARB;
|
|||
extern PFNGLLINKPROGRAMARBPROC qglLinkProgramARB;
|
||||
extern PFNGLGETUNIFORMLOCATIONARBPROC qglGetUniformLocationARB;
|
||||
extern PFNGLUNIFORM4FARBPROC qglUniform4fARB;
|
||||
extern PFNGLUNIFORM4FVARBPROC qglUniform4fvARB;
|
||||
extern PFNGLUNIFORM3FARBPROC qglUniform3fARB;
|
||||
extern PFNGLUNIFORM3FVARBPROC qglUniform3fvARB;
|
||||
extern PFNGLUNIFORM1IARBPROC qglUniform1iARB;
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
#define SHADER_MAX_ANIMFRAMES 8
|
||||
#define SHADER_ANIM_FRAMES_MAX 16
|
||||
|
||||
#define SHADER_PROGPARMS_MAX 16
|
||||
|
||||
typedef enum {
|
||||
SHADER_BSP,
|
||||
SHADER_BSP_VERTEX,
|
||||
|
@ -175,8 +177,7 @@ 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_GPUPROGRAM = 1 << 9
|
||||
SHADER_PASS_ANIMMAP = 1 << 8
|
||||
} flags;
|
||||
} shaderpass_t;
|
||||
|
||||
|
@ -188,6 +189,23 @@ typedef struct
|
|||
int nearbox_textures[6];
|
||||
} skydome_t;
|
||||
|
||||
typedef struct {
|
||||
enum shaderprogparmtype_e {
|
||||
SP_BAD,
|
||||
SP_ENTCOLOURS,
|
||||
SP_TOPCOLOURS,
|
||||
SP_BOTTOMCOLOURS,
|
||||
SP_TIME,
|
||||
|
||||
//things that are set immediatly
|
||||
SP_FIRSTIMMEDIATE, //never set
|
||||
SP_CVARI,
|
||||
SP_CVARF,
|
||||
SP_TEXTURE
|
||||
} type;
|
||||
unsigned int handle;
|
||||
} shaderprogparm_t;
|
||||
|
||||
typedef struct shader_s {
|
||||
int numpasses; //careful... 0 means it's not loaded... and not actually a proper shader.
|
||||
struct shader_s *next;
|
||||
|
@ -215,10 +233,13 @@ 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_PROGRAM = 1 << 15 //run a script
|
||||
SHADER_NODRAW = 1 << 14 //parsed only to pee off developers when they forget it on no-pass shaders.
|
||||
} flags;
|
||||
|
||||
unsigned int programhandle;
|
||||
int numprogparams;
|
||||
shaderprogparm_t progparm[SHADER_PROGPARMS_MAX];
|
||||
|
||||
shaderpass_t passes[SHADER_PASS_MAX];
|
||||
|
||||
shadersort_t sort;
|
||||
|
@ -238,6 +259,7 @@ extern shader_t r_shaders[];
|
|||
void R_RenderMeshGeneric ( meshbuffer_t *mb, shaderpass_t *pass );
|
||||
void R_RenderMeshCombined ( meshbuffer_t *mb, shaderpass_t *pass );
|
||||
void R_RenderMeshMultitextured ( meshbuffer_t *mb, shaderpass_t *pass );
|
||||
void R_RenderMeshProgram ( meshbuffer_t *mb, shaderpass_t *pass );
|
||||
|
||||
shader_t *R_RegisterPic (char *name);
|
||||
shader_t *R_RegisterShader (char *name);
|
||||
|
|
|
@ -435,10 +435,11 @@ usepasv:
|
|||
else if (ret == 125) //begining transfer
|
||||
{
|
||||
if (con->type == ftp_getting)
|
||||
{
|
||||
COM_StripExtension(con->localfile, msg);
|
||||
strcat(msg, ".tmp");
|
||||
con->f = FS_OpenVFS (msg, "wb", FS_GAME);
|
||||
{
|
||||
char tempname[MAX_OSPATH];
|
||||
COM_StripExtension(con->localfile, tempname, MAX_OSPATH);
|
||||
strcat(tempname, ".tmp");
|
||||
con->f = FS_OpenVFS (tempname, "wb", FS_GAME);
|
||||
if (!con->f)
|
||||
{
|
||||
msg = va("ABOR\r\nQUIT\r\n"); //bummer. we couldn't open this file to output to.
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
#the Makefile explicitally tests for config.h, and will pass the right precompiler to gcc so that this file is actually used.
|
||||
#And so we don't break in the absence of this file.
|
||||
|
||||
if [ $1 = y ]; then
|
||||
if [ "$1" = "y" ]; then
|
||||
defaulttoyes=true
|
||||
echo "Checking installed libraries"
|
||||
else
|
||||
|
@ -26,13 +26,13 @@ echo "" >> config.h
|
|||
|
||||
query()
|
||||
{
|
||||
if [ $defaulttoyes = true ]; then
|
||||
if [ "$defaulttoyes" = "true" ]; then
|
||||
ans=y
|
||||
else
|
||||
read -n 1 -p "$1 " ans
|
||||
echo ""
|
||||
fi
|
||||
if [ $ans = y -o $ans = Y ]; then
|
||||
if [ "$ans" = "y" -o "$ans" = "Y" ]; then
|
||||
echo "#define $2" >> config.h
|
||||
else
|
||||
echo "//#define $2" >> config.h
|
||||
|
@ -48,6 +48,7 @@ querylibrary()
|
|||
query "$1" "$2"
|
||||
return
|
||||
fi
|
||||
#they don't have it, force no.
|
||||
echo "$1 n"
|
||||
echo "//#define $2" >> config.h
|
||||
}
|
||||
|
@ -84,7 +85,7 @@ query "Do you want to enable fish-eye views (only in software) ?" FISH
|
|||
query "Do you want to enable the built in http/ftp server ?" WEBSERVER
|
||||
query "Do you want to enable the built in http/ftp clients ?" WEBCLIENT
|
||||
query "Do you want to enable the deluxemap generation routine ?" RUNTIMELIGHTING
|
||||
query "Do you want to enable the 'qterm' (this is a major security risk) ?" QTERM
|
||||
#query "Do you want to enable the 'qterm' (this is a major security risk) ?" QTERM
|
||||
query "Do you want to enable the server browser ?" CL_MASTER
|
||||
query "Do you want to enable the serial-mouse support (used in splitscreen) ?" SERIALMOUSE
|
||||
query "Do you want to enable the per-pixel lighting routines ?" PPL
|
||||
|
|
|
@ -1012,7 +1012,7 @@ void Q_InitProgs(void)
|
|||
if (*progs.string && strlen(progs.string)<64 && *progs.string != '*') //a * is a special case to not load a q2 dll.
|
||||
{
|
||||
Q_strncpyz(addons, progs.string, MAX_QPATH);
|
||||
COM_DefaultExtension(addons, ".dat");
|
||||
COM_DefaultExtension(addons, ".dat", sizeof(addons));
|
||||
}
|
||||
oldprnum= AddProgs(addons);
|
||||
|
||||
|
|
|
@ -535,7 +535,7 @@ qboolean SV_LoadLevelCache(char *level, char *startspot, qboolean ignoreplayers)
|
|||
gametype = cache->gametype;
|
||||
|
||||
sprintf (name, "saves/%s", level);
|
||||
COM_DefaultExtension (name, ".lvc");
|
||||
COM_DefaultExtension (name, ".lvc", sizeof(name));
|
||||
|
||||
// Con_TPrintf (STL_LOADGAMEFROM, name);
|
||||
|
||||
|
@ -763,7 +763,7 @@ void SV_SaveLevelCache(qboolean dontharmgame)
|
|||
|
||||
|
||||
sprintf (name, "%s/saves/%s", com_gamedir, cache->mapname);
|
||||
COM_DefaultExtension (name, ".lvc");
|
||||
COM_DefaultExtension (name, ".lvc", sizeof(name));
|
||||
|
||||
COM_CreatePath(name);
|
||||
|
||||
|
|
|
@ -482,7 +482,7 @@ void SV_Map_f (void)
|
|||
|
||||
if (!strcmp(level, ".")) //restart current
|
||||
{
|
||||
COM_StripExtension(COM_SkipPath(sv.modelname), level);
|
||||
COM_StripExtension(COM_SkipPath(sv.modelname), level, sizeof(level));
|
||||
issamelevel = true;
|
||||
|
||||
Q_strncpyz(spot, Info_ValueForKey(svs.info, "*startspot"), sizeof(spot));
|
||||
|
|
|
@ -732,6 +732,26 @@ void SV_SpawnServer (char *server, char *startspot, qboolean noents, qboolean us
|
|||
|
||||
COM_FlushTempoaryPacks();
|
||||
|
||||
|
||||
//This fixes a bug where the server advertises cheats, the internal client connects, and doesn't think cheats are allowed.
|
||||
//this applies to a few other things too, but cheats is the only special one (because of the *)
|
||||
if (sv_cheats.value)
|
||||
{
|
||||
sv_allow_cheats = true;
|
||||
Info_SetValueForStarKey(svs.info, "*cheats", "ON", MAX_SERVERINFO_STRING);
|
||||
}
|
||||
else
|
||||
{
|
||||
sv_allow_cheats = false;
|
||||
Info_SetValueForStarKey(svs.info, "*cheats", "", MAX_SERVERINFO_STRING);
|
||||
}
|
||||
#ifndef CLIENTONLY
|
||||
Q_strncpyz(cl.serverinfo, svs.info, sizeof(cl.serverinfo));
|
||||
CL_CheckServerInfo();
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
if (usecinematic)
|
||||
{
|
||||
strcpy (sv.name, server);
|
||||
|
@ -781,17 +801,6 @@ void SV_SpawnServer (char *server, char *startspot, qboolean noents, qboolean us
|
|||
//
|
||||
SV_ClearWorld ();
|
||||
|
||||
if (sv_cheats.value)
|
||||
{
|
||||
sv_allow_cheats = true;
|
||||
Info_SetValueForStarKey(svs.info, "*cheats", "ON", MAX_SERVERINFO_STRING);
|
||||
}
|
||||
else
|
||||
{
|
||||
sv_allow_cheats = false;
|
||||
Info_SetValueForStarKey(svs.info, "*cheats", "", MAX_SERVERINFO_STRING);
|
||||
}
|
||||
|
||||
//do we allow csprogs?
|
||||
#ifdef PEXT_CSQC
|
||||
file = COM_LoadTempFile("csprogs.dat");
|
||||
|
|
|
@ -1582,8 +1582,8 @@ void SV_MVD_Record_f (void)
|
|||
snprintf (name, MAX_OSPATH+MAX_MVD_NAME, "%s/%s/%s", com_gamedir, sv_demoDir.string, newname);
|
||||
|
||||
|
||||
COM_StripExtension(name, name);
|
||||
COM_DefaultExtension(name, ".mvd");
|
||||
COM_StripExtension(name, name, sizeof(name));
|
||||
COM_DefaultExtension(name, ".mvd", sizeof(name));
|
||||
COM_CreatePath(name);
|
||||
|
||||
//
|
||||
|
@ -2093,7 +2093,7 @@ void SV_MVDRemove_f (void)
|
|||
}
|
||||
|
||||
Q_strncpyz(name, Cmd_Argv(1), MAX_MVD_NAME);
|
||||
COM_DefaultExtension(name, ".mvd");
|
||||
COM_DefaultExtension(name, ".mvd", sizeof(name));
|
||||
|
||||
snprintf(path, MAX_OSPATH, "%s/%s/%s", com_gamedir, sv_demoDir.string, name);
|
||||
|
||||
|
|
Loading…
Reference in a new issue