Try to fix missing impulses bug.

Fix skybox fog glsl compile error.
Implement DP_QC_FS_SEARCH_PACKFILE, search_getpackagename, and search_fopen.


git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5737 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2020-07-21 07:58:54 +00:00
parent a3a0e1eae1
commit b005d9fdcd
16 changed files with 331 additions and 84 deletions

View file

@ -155,6 +155,26 @@ static kbutton_t in_button[19+1];
static int in_impulse[MAX_SPLITS][IN_IMPULSECACHE]; static int in_impulse[MAX_SPLITS][IN_IMPULSECACHE];
static int in_nextimpulse[MAX_SPLITS]; static int in_nextimpulse[MAX_SPLITS];
static int in_impulsespending[MAX_SPLITS]; static int in_impulsespending[MAX_SPLITS];
static void CL_QueueImpulse (int pnum, int newimp)
{
if (cl_queueimpulses.ival)
{
if (in_impulsespending[pnum]>=IN_IMPULSECACHE)
{
Con_Printf("Too many impulses, ignoring %i\n", newimp);
return;
}
in_impulse[pnum][(in_nextimpulse[pnum]+in_impulsespending[pnum])%IN_IMPULSECACHE] = newimp;
in_impulsespending[pnum]++;
}
else
{
if (in_impulsespending[pnum])
Con_DPrintf("Too many impulses, forgetting %i\n", in_impulse[pnum][(in_nextimpulse[pnum])%IN_IMPULSECACHE]);
in_impulse[pnum][(in_nextimpulse[pnum])%IN_IMPULSECACHE] = newimp;
in_impulsespending[pnum]=1;
}
}
qboolean cursor_active; qboolean cursor_active;
@ -349,10 +369,7 @@ static void IN_DoPostSelect(void)
int pnum = CL_TargettedSplit(false); int pnum = CL_TargettedSplit(false);
int best = IN_BestWeapon_Pre(pnum); int best = IN_BestWeapon_Pre(pnum);
if (best) if (best)
{ CL_QueueImpulse(pnum, best);
in_impulse[pnum][(in_nextimpulse[pnum])%IN_IMPULSECACHE] = best;
in_impulsespending[pnum]=1;
}
} }
} }
//The weapon command autoselects a prioritised weapon like multi-arg impulse does. //The weapon command autoselects a prioritised weapon like multi-arg impulse does.
@ -391,21 +408,7 @@ void IN_Weapon (void)
if (mode == 2 && !(in_attack.state[pnum]&3)) if (mode == 2 && !(in_attack.state[pnum]&3))
return; //2 changes instantly only when already firing. return; //2 changes instantly only when already firing.
if (cl_queueimpulses.ival) CL_QueueImpulse(pnum, newimp);
{
if (in_impulsespending[pnum]>=IN_IMPULSECACHE)
{
Con_Printf("Too many impulses, ignoring %i\n", newimp);
return;
}
in_impulse[pnum][(in_nextimpulse[pnum]+in_impulsespending[pnum])%IN_IMPULSECACHE] = newimp;
in_impulsespending[pnum]++;
}
else
{
in_impulse[pnum][(in_nextimpulse[pnum])%IN_IMPULSECACHE] = newimp;
in_impulsespending[pnum]=1;
}
} }
//+fire 8 7 [keycode] //+fire 8 7 [keycode]
@ -425,10 +428,7 @@ void IN_FireDown(void)
impulse = IN_BestWeapon_Args(pnum, 1, impulse); impulse = IN_BestWeapon_Args(pnum, 1, impulse);
if (impulse) if (impulse)
{ CL_QueueImpulse(pnum, impulse);
in_impulse[pnum][(in_nextimpulse[pnum])%IN_IMPULSECACHE] = impulse;
in_impulsespending[pnum]=1;
}
else else
IN_DoPostSelect(); IN_DoPostSelect();
@ -452,8 +452,7 @@ static void IN_DoWeaponHide(void)
} }
if (best) if (best)
{ //looks like we're switching away { //looks like we're switching away
in_impulse[pnum][(in_nextimpulse[pnum])%IN_IMPULSECACHE] = best; CL_QueueImpulse(pnum, best);
in_impulsespending[pnum]=1;
} }
} }
} }
@ -656,22 +655,7 @@ void IN_Impulse (void)
} }
#endif #endif
if (in_impulsespending[pnum]>=IN_IMPULSECACHE) CL_QueueImpulse(pnum, newimp);
{
Con_Printf("Too many impulses, ignoring %i\n", newimp);
return;
}
if (cl_queueimpulses.ival)
{
in_impulse[pnum][(in_nextimpulse[pnum]+in_impulsespending[pnum])%IN_IMPULSECACHE] = newimp;
in_impulsespending[pnum]++;
}
else
{
in_impulse[pnum][(in_nextimpulse[pnum])%IN_IMPULSECACHE] = newimp;
in_impulsespending[pnum]=1;
}
} }
void IN_Restart (void) void IN_Restart (void)
@ -1182,9 +1166,9 @@ static void CL_FinishMove (usercmd_t *cmd, int pnum)
if (in_impulsespending[pnum] && !cl.paused) if (in_impulsespending[pnum] && !cl.paused)
{ {
cmd->impulse = in_impulse[pnum][(in_nextimpulse[pnum])%IN_IMPULSECACHE];
in_nextimpulse[pnum]++; in_nextimpulse[pnum]++;
in_impulsespending[pnum]--; in_impulsespending[pnum]--;
cmd->impulse = in_impulse[pnum][(in_nextimpulse[pnum]-1)%IN_IMPULSECACHE];
} }
else else
cmd->impulse = 0; cmd->impulse = 0;
@ -2286,7 +2270,7 @@ void CL_SendCmd (double frametime, qboolean mainloop)
cl_pendingcmd[plnum].angles[i] = ((int)(cl.playerview[plnum].viewangles[i]*65536.0/360)&65535); cl_pendingcmd[plnum].angles[i] = ((int)(cl.playerview[plnum].viewangles[i]*65536.0/360)&65535);
CL_BaseMove (&cl_pendingcmd[plnum], plnum, cl_pendingcmd[plnum].msec, framemsecs); CL_BaseMove (&cl_pendingcmd[plnum], plnum, cl_pendingcmd[plnum].msec, framemsecs);
if (!cl_pendingcmd[plnum].msec) if (!cl_pendingcmd[plnum].msec && framemsecs)
{ {
CL_FinishMove(&cl_pendingcmd[plnum], plnum); CL_FinishMove(&cl_pendingcmd[plnum], plnum);
Cbuf_Waited(); //its okay to stop waiting now Cbuf_Waited(); //its okay to stop waiting now

View file

@ -1199,6 +1199,9 @@ void CL_CheckForResend (void)
void CL_BeginServerConnect(const char *host, int port, qboolean noproxy) void CL_BeginServerConnect(const char *host, int port, qboolean noproxy)
{ {
if (!strncmp(host, "localhost", 9))
noproxy = true; //FIXME: resolve the address here or something so that we don't end up using a proxy for lan addresses.
if (strstr(host, "://") || !*cl_proxyaddr.string || noproxy) if (strstr(host, "://") || !*cl_proxyaddr.string || noproxy)
Q_strncpyz (cls.servername, host, sizeof(cls.servername)); Q_strncpyz (cls.servername, host, sizeof(cls.servername));
else else

View file

@ -1433,7 +1433,7 @@ serverinfo_t *Master_FindRoute(netadr_t target)
return NULL; return NULL;
//never flood into a peer if its just going to be more expensive than a direct connection //never flood into a peer if its just going to be more expensive than a direct connection
if (*cl_proxyaddr.string) if (*cl_proxyaddr.string && NET_ClassifyAddress(&target, NULL) >= ASCOPE_NET)
{ {
//fixme: we don't handle chained proxies properly, as we assume we can directly hop to the named final proxy. //fixme: we don't handle chained proxies properly, as we assume we can directly hop to the named final proxy.
//fixme: we'll find the same route, we just won't display the correct expected ping. //fixme: we'll find the same route, we just won't display the correct expected ping.

View file

@ -7168,6 +7168,8 @@ static struct {
{"search_getfilename", PF_search_getfilename,447}, // #447 string search_getfilename(float handle, float num) (DP_QC_FS_SEARCH) {"search_getfilename", PF_search_getfilename,447}, // #447 string search_getfilename(float handle, float num) (DP_QC_FS_SEARCH)
{"search_getfilesize", PF_search_getfilesize, 0}, {"search_getfilesize", PF_search_getfilesize, 0},
{"search_getfilemtime", PF_search_getfilemtime, 0}, {"search_getfilemtime", PF_search_getfilemtime, 0},
{"search_getpackagename", PF_search_getpackagename, 0},
{"search_fopen", PF_search_fopen, 0},
{"cvar_string", PF_cvar_string, 448}, // #448 string(float n) cvar_string (DP_QC_CVAR_STRING) {"cvar_string", PF_cvar_string, 448}, // #448 string(float n) cvar_string (DP_QC_CVAR_STRING)
{"findflags", PF_FindFlags, 449}, // #449 entity(entity start, .entity fld, float match) findflags (DP_QC_FINDFLAGS) {"findflags", PF_FindFlags, 449}, // #449 entity(entity start, .entity fld, float match) findflags (DP_QC_FINDFLAGS)

View file

@ -2389,6 +2389,8 @@ static struct {
{"search_getfilename", PF_search_getfilename, 77}, {"search_getfilename", PF_search_getfilename, 77},
{"search_getfilesize", PF_search_getfilesize, 0}, {"search_getfilesize", PF_search_getfilesize, 0},
{"search_getfilemtime", PF_search_getfilemtime, 0}, {"search_getfilemtime", PF_search_getfilemtime, 0},
{"search_getpackagename", PF_search_getpackagename, 0},
{"search_fopen", PF_search_fopen, 0},
{"chr2str", PF_chr2str, 78}, {"chr2str", PF_chr2str, 78},
{"etof", PF_etof, 79}, {"etof", PF_etof, 79},
{"ftoe", PF_ftoe, 80}, {"ftoe", PF_ftoe, 80},
@ -2797,16 +2799,18 @@ static qboolean MP_KeyEvent(menu_t *menu, qboolean isdown, unsigned int devid, i
if (isdown) if (isdown)
{ {
#ifndef NOBUILTINMENUS #ifndef NOBUILTINMENUS
#ifdef _DEBUG
if (key == 'c') if (key == 'c')
{ {
extern qboolean keydown[K_MAX]; extern qboolean keydown[K_MAX];
if (keydown[K_LCTRL] || keydown[K_RCTRL]) if ((keydown[K_LCTRL] || keydown[K_RCTRL]) && (keydown[K_LSHIFT] || keydown[K_RSHIFT]))
{ {
MP_Shutdown(); MP_Shutdown();
M_Init_Internal(); M_Init_Internal();
return true; return true;
} }
} }
#endif
#endif #endif
mpkeysdown[key>>3] |= (1<<(key&7)); mpkeysdown[key>>3] |= (1<<(key&7));

View file

@ -476,7 +476,7 @@ cvar_t gl_mipcap = CVARAFCD("d_mipcap", "0 1000", "gl_miptexLevel",
cvar_t gl_texturemode2d = CVARFCD("gl_texturemode2d", "GL_LINEAR", cvar_t gl_texturemode2d = CVARFCD("gl_texturemode2d", "GL_LINEAR",
CVAR_ARCHIVE | CVAR_RENDERERCALLBACK, Image_TextureMode_Callback, CVAR_ARCHIVE | CVAR_RENDERERCALLBACK, Image_TextureMode_Callback,
"Specifies how 2d images are sampled. format is a 3-tupple "); "Specifies how 2d images are sampled. format is a 3-tupple ");
cvar_t r_font_linear = CVARF("r_font_linear", "1", 0); cvar_t r_font_linear = CVARF("r_font_linear", "1", CVAR_ARCHIVE);
cvar_t r_font_postprocess_outline = CVARFD("r_font_postprocess_outline", "0", 0, "Controls the number of pixels of dark borders to use around fonts."); cvar_t r_font_postprocess_outline = CVARFD("r_font_postprocess_outline", "0", 0, "Controls the number of pixels of dark borders to use around fonts.");
#if defined(HAVE_LEGACY) && defined(AVAIL_FREETYPE) #if defined(HAVE_LEGACY) && defined(AVAIL_FREETYPE)

View file

@ -1489,8 +1489,11 @@ static qboolean QDECL OpenAL_InitCard(soundcardinfo_t *sc, const char *devname)
return false; return false;
oali = sc->handle; oali = sc->handle;
Con_DPrintf(SDRVNAME" AL Extension : %s\n",palGetString(AL_EXTENSIONS)); Con_Printf( SDRVNAME" AL_VERSION: %s\n",palGetString(AL_VERSION));
Con_DPrintf(SDRVNAME" ALC Extension : %s\n",palcGetString(oali->OpenAL_Device,ALC_EXTENSIONS)); Con_Printf( SDRVNAME" AL_RENDERER: %s\n",palGetString(AL_RENDERER));
Con_Printf( SDRVNAME" AL_VENDOR: %s\n",palGetString(AL_VENDOR));
Con_DPrintf(SDRVNAME" AL_EXTENSIONS: %s\n",palGetString(AL_EXTENSIONS));
Con_DPrintf(SDRVNAME" ALC_EXTENSIONS: %s\n",palcGetString(oali->OpenAL_Device,ALC_EXTENSIONS));
sc->Shutdown = OpenAL_Shutdown; sc->Shutdown = OpenAL_Shutdown;
#ifdef USEEFX #ifdef USEEFX

View file

@ -534,7 +534,11 @@ struct vfsfile_s;
//standard return value is 0 on failure, or depth on success. //standard return value is 0 on failure, or depth on success.
int FS_FLocateFile(const char *filename, unsigned int flags, flocation_t *loc); int FS_FLocateFile(const char *filename, unsigned int flags, flocation_t *loc);
struct vfsfile_s *FS_OpenReadLocation(flocation_t *location); struct vfsfile_s *FS_OpenReadLocation(flocation_t *location);
const char *FS_WhichPackForLocation(flocation_t *loc, qboolean makereferenced); #define WP_REFERENCE 1
#define WP_FULLPATH 2
#define WP_FORCE 4
const char *FS_WhichPackForLocation(flocation_t *loc, unsigned int flags);
qboolean FS_GetLocationForPackageHandle(flocation_t *loc, searchpathfuncs_t *spath, const char *fname);
qboolean FS_GetLocMTime(flocation_t *location, time_t *modtime); qboolean FS_GetLocMTime(flocation_t *location, time_t *modtime);
const char *FS_GetPackageDownloadFilename(flocation_t *loc); //returns only packages (or null) const char *FS_GetPackageDownloadFilename(flocation_t *loc); //returns only packages (or null)
const char *FS_GetRootPackagePath(flocation_t *loc); //favours packages, but falls back on gamedirs. const char *FS_GetRootPackagePath(flocation_t *loc); //favours packages, but falls back on gamedirs.

View file

@ -37,6 +37,7 @@ int fs_finds;
void COM_CheckRegistered (void); void COM_CheckRegistered (void);
void Mods_FlushModList(void); void Mods_FlushModList(void);
static qboolean Sys_SteamHasFile(char *basepath, int basepathlen, char *steamdir, char *fname); static qboolean Sys_SteamHasFile(char *basepath, int basepathlen, char *steamdir, char *fname);
static searchpathfuncs_t *FS_OpenPackByExtension(vfsfile_t *f, searchpathfuncs_t *parent, const char *filename, const char *pakname);
static void QDECL fs_game_callback(cvar_t *var, char *oldvalue) static void QDECL fs_game_callback(cvar_t *var, char *oldvalue)
{ {
@ -1695,21 +1696,43 @@ const char *FS_GetPackageDownloadFilename(flocation_t *loc)
return sp->purepath; return sp->purepath;
return NULL; return NULL;
} }
const char *FS_WhichPackForLocation(flocation_t *loc, qboolean makereferenced) qboolean FS_GetLocationForPackageHandle(flocation_t *loc, searchpathfuncs_t *spath, const char *fname)
{
searchpath_t *search;
for (search = com_searchpaths; search; search = search->next)
{
if (search->handle == spath)
{
loc->search = search;
return spath->FindFile(spath, loc, fname, NULL);
}
}
return false;
}
const char *FS_WhichPackForLocation(flocation_t *loc, unsigned int flags)
{ {
char *ret; char *ret;
if (!loc->search) if (!loc->search)
return NULL; //huh? not a valid location. return NULL; //huh? not a valid location.
ret = strchr(loc->search->purepath, '/'); if (flags & WP_FULLPATH)
if (ret)
{ {
ret++; if (flags & WP_REFERENCE)
if (!strchr(ret, '/')) loc->search->flags |= SPF_REFERENCED;
return loc->search->purepath;
}
else
{
ret = strchr(loc->search->purepath, '/');
if (ret)
{ {
if (makereferenced) ret++;
loc->search->flags |= SPF_REFERENCED; if (!strchr(ret, '/'))
return ret; {
if (flags & WP_REFERENCE)
loc->search->flags |= SPF_REFERENCED;
return ret;
}
} }
} }
return NULL; return NULL;
@ -2645,7 +2668,87 @@ void FS_FreeFile(void *file)
} }
searchpathfuncs_t *COM_EnumerateFilesPackage (const char *match, const char *package, unsigned int flags, int (QDECL *func)(const char *, qofs_t, time_t mtime, void *, searchpathfuncs_t*), void *parm)
{ //special version that takes an explicit package name to search inside.
searchpathfuncs_t *handle;
searchpath_t *search;
const char *sp;
qboolean foundpackage = false;
for (search = com_searchpaths; search ; search = search->next)
{
if (package)
{
if (flags & WP_FULLPATH)
sp = search->purepath;
else
{
sp = strchr(search->purepath, '/');
if (sp && !strchr(++sp, '/'))
;
else
continue; //ignore packages inside other packages. they're just too weird.
}
if (strcmp(package, sp))
continue; //ignore this package
}
foundpackage = true;
// is the element a pak file?
if (!search->handle->EnumerateFiles(search->handle, match, func, parm))
break;
}
if (!foundpackage && package && (flags&WP_FORCE) && (flags & WP_FULLPATH))
{ //if we're forcing the package search then be prepared to open the gamedir or gamedir/package that was specified.
char cleanname[MAX_OSPATH];
char syspath[MAX_OSPATH];
char *sl;
package = FS_GetCleanPath(package, false, cleanname, sizeof(cleanname));
if (!package)
return NULL;
sl = strchr(package, '/');
if (sl)
{ //try to open the named package.
*sl = 0;
if (strchr(sl+1, '/') || !FS_GamedirIsOkay(package))
return NULL;
*sl = '/';
if (com_homepathenabled)
{ //try the homedir
Q_snprintfz(syspath, sizeof(syspath), "%s%s", com_homepath, package);
handle = FS_OpenPackByExtension(VFSOS_Open(package, "rb"), NULL, package, package);
}
else
handle = NULL;
if (!handle)
{ //now go for the basedir to see if ther.
Q_snprintfz(syspath, sizeof(syspath), "%s%s", com_gamepath, package);
handle = FS_OpenPackByExtension(VFSOS_Open(package, "rb"), NULL, package, package);
}
if (handle)
handle->EnumerateFiles(handle, match, func, parm);
return handle; //caller can use this for context, but is expected to tidy it up too.
}
else
{ //we use NULLs for spath context here. caller will need to figure out which basedir to read it from.
if (!FS_GamedirIsOkay(package))
return NULL;
if (com_homepathenabled)
{
Q_snprintfz(syspath, sizeof(syspath), "%s%s", com_homepath, package);
Sys_EnumerateFiles(syspath, match, func, parm, NULL);
}
Q_snprintfz(syspath, sizeof(syspath), "%s%s", com_gamepath, package);
Sys_EnumerateFiles(syspath, match, func, parm, NULL);
}
}
return NULL;
}
void COM_EnumerateFiles (const char *match, int (QDECL *func)(const char *, qofs_t, time_t mtime, void *, searchpathfuncs_t*), void *parm) void COM_EnumerateFiles (const char *match, int (QDECL *func)(const char *, qofs_t, time_t mtime, void *, searchpathfuncs_t*), void *parm)
{ {
searchpath_t *search; searchpath_t *search;

View file

@ -8,6 +8,7 @@
#ifdef SQL #ifdef SQL
#include "sv_sql.h" #include "sv_sql.h"
#endif #endif
#include "fs.h"
#include <ctype.h> #include <ctype.h>
@ -2354,6 +2355,50 @@ void QCBUILTIN PF_fopen (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals
G_FLOAT(OFS_RETURN) = -1; G_FLOAT(OFS_RETURN) = -1;
break; break;
} }
}
//internal function used by search_begin
static int PF_fopen_search (pubprogfuncs_t *prinst, const char *name, flocation_t *loc)
{
const char *fallbackread;
int i;
Con_DPrintf("qcfopen(\"%s\") called\n", name);
for (i = 0; i < MAX_QC_FILES; i++)
if (!pf_fopen_files[i].prinst)
break;
if (i == MAX_QC_FILES) //too many already open
{
Con_Printf("qcfopen(\"%s\"): too many files open\n", name);
return -1;
}
if (!QC_FixFileName(name, &name, &fallbackread) || !fallbackread)
{ //we're ignoring the data/ dir so using only the fallback, but still blocking it if its a nasty path.
Con_Printf("qcfopen(\"%s\"): Access denied\n", name);
return -1;
}
pf_fopen_files[i].accessmode = FRIK_FILE_READ_DELAY;
Q_strncpyz(pf_fopen_files[i].name, fallbackread, sizeof(pf_fopen_files[i].name));
if (loc->search->handle)
pf_fopen_files[i].file = FS_OpenReadLocation(loc);
else
pf_fopen_files[i].file = FS_OpenVFS(loc->rawname, "rb", FS_ROOT);
pf_fopen_files[i].ofs = 0;
if (pf_fopen_files[i].file)
{
pf_fopen_files[i].len = VFS_GETLEN(pf_fopen_files[i].file);
pf_fopen_files[i].prinst = prinst;
return i + FIRST_QC_FILE_INDEX;
}
else
return -1;
} }
void PF_fclose_i (int fnum) void PF_fclose_i (int fnum)
@ -2895,12 +2940,12 @@ void QCBUILTIN PF_rmtree (pubprogfuncs_t *prinst, struct globalvars_s *pr_global
void QCBUILTIN PF_whichpack (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals) void QCBUILTIN PF_whichpack (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals)
{ {
const char *srcname = PR_GetStringOfs(prinst, OFS_PARM0); const char *srcname = PR_GetStringOfs(prinst, OFS_PARM0);
qboolean makereferenced = prinst->callargc>1?G_FLOAT(OFS_PARM1):true; unsigned int flags = prinst->callargc>1?G_FLOAT(OFS_PARM1):WP_REFERENCE;
flocation_t loc; flocation_t loc;
if (FS_FLocateFile(srcname, FSLF_IFFOUND, &loc)) if (FS_FLocateFile(srcname, FSLF_IFFOUND, &loc))
{ {
srcname = FS_WhichPackForLocation(&loc, makereferenced); srcname = FS_WhichPackForLocation(&loc, flags);
if (srcname == NULL) if (srcname == NULL)
srcname = ""; srcname = "";
RETURN_TSTRING(srcname); RETURN_TSTRING(srcname);
@ -2913,19 +2958,33 @@ void QCBUILTIN PF_whichpack (pubprogfuncs_t *prinst, struct globalvars_s *pr_glo
} }
enum
{
QCSEARCH_INSENSITIVE = 1u<<0, //for dp, we're always insensitive you prick.
QCSEARCH_FULLPACKAGE = 1u<<1, //package names include gamedir prefix etc.
QCSEARCH_ALLOWDUPES = 1u<<2, //don't filter out dupes, allowing entries hidden by later packages to be shown.
QCSEARCH_FORCESEARCH = 1u<<3, //force the search to succeed even if the gamedir/package is not active.
};
searchpathfuncs_t *COM_EnumerateFilesPackage (const char *match, const char *package, unsigned int flags, int (QDECL *func)(const char *, qofs_t, time_t mtime, void *, searchpathfuncs_t*), void *parm);
typedef struct prvmsearch_s { typedef struct prvmsearch_s {
pubprogfuncs_t *fromprogs; //share across menu/server pubprogfuncs_t *fromprogs; //share across menu/server
searchpath_t searchinfo;
int entries; int entries;
struct struct
{ {
char *name; char *name;
qofs_t size; qofs_t size;
time_t mtime; time_t mtime;
searchpathfuncs_t *package;
} *entry; } *entry;
char *pattern; char *pattern;
unsigned int flags;
unsigned int fsflags;
} prvmsearch_t; } prvmsearch_t;
prvmsearch_t *pr_searches; //realloced to extend static prvmsearch_t *pr_searches; //realloced to extend
size_t numpr_searches; static size_t numpr_searches;
void search_close (pubprogfuncs_t *prinst, int handle) void search_close (pubprogfuncs_t *prinst, int handle)
{ {
@ -2943,6 +3002,8 @@ void search_close (pubprogfuncs_t *prinst, int handle)
BZ_Free(s->entry[i].name); BZ_Free(s->entry[i].name);
Z_Free(s->pattern); Z_Free(s->pattern);
BZ_Free(s->entry); BZ_Free(s->entry);
if (s->searchinfo.handle)
s->searchinfo.handle->ClosePath(s->searchinfo.handle);
memset(s, 0, sizeof(*s)); memset(s, 0, sizeof(*s));
} }
//a progs was closed... hunt down it's searches, and warn about any searches left open. //a progs was closed... hunt down it's searches, and warn about any searches left open.
@ -2984,10 +3045,13 @@ static int QDECL search_enumerate(const char *name, qofs_t fsize, time_t mtime,
prvmsearch_t *s = parm; prvmsearch_t *s = parm;
size_t i; size_t i;
for (i = 0; i < s->entries; i++) if (!(s->flags & QCSEARCH_ALLOWDUPES))
{ {
if (!Q_strcasecmp(name, s->entry[i].name)) for (i = 0; i < s->entries; i++)
return true; //already in the list, apparently. try to avoid dupes. {
if (!Q_strcasecmp(name, s->entry[i].name))
return true; //already in the list, apparently. try to avoid dupes.
}
} }
s->entry = BZ_Realloc(s->entry, ((s->entries+64)&~63) * sizeof(*s->entry)); s->entry = BZ_Realloc(s->entry, ((s->entries+64)&~63) * sizeof(*s->entry));
@ -2995,6 +3059,7 @@ static int QDECL search_enumerate(const char *name, qofs_t fsize, time_t mtime,
strcpy(s->entry[s->entries].name, name); strcpy(s->entry[s->entries].name, name);
s->entry[s->entries].size = fsize; s->entry[s->entries].size = fsize;
s->entry[s->entries].mtime = mtime; s->entry[s->entries].mtime = mtime;
s->entry[s->entries].package = spath;
s->entries++; s->entries++;
return true; return true;
@ -3005,8 +3070,9 @@ void QCBUILTIN PF_search_begin (pubprogfuncs_t *prinst, struct globalvars_s *pr_
{ //< 0 for error, >= 0 for handle. { //< 0 for error, >= 0 for handle.
//error includes bad search patterns, but not no files //error includes bad search patterns, but not no files
const char *pattern = PR_GetStringOfs(prinst, OFS_PARM0); const char *pattern = PR_GetStringOfs(prinst, OFS_PARM0);
// qboolean caseinsensitive = G_FLOAT(OFS_PARM1); unsigned int flags = G_FLOAT(OFS_PARM1);
// qboolean quiet = G_FLOAT(OFS_PARM2); // qboolean quiet = G_FLOAT(OFS_PARM2); //fte is not noisy
const char *package = (prinst->callargc>3)?PR_GetStringOfs(prinst, OFS_PARM3):NULL;
prvmsearch_t *s; prvmsearch_t *s;
size_t j; size_t j;
@ -3032,7 +3098,15 @@ void QCBUILTIN PF_search_begin (pubprogfuncs_t *prinst, struct globalvars_s *pr_
s->pattern = Z_StrDup(pattern); s->pattern = Z_StrDup(pattern);
s->fromprogs = prinst; s->fromprogs = prinst;
COM_EnumerateFiles(pattern, search_enumerate, s); s->flags = flags;
s->fsflags = 0;
if (flags&QCSEARCH_FULLPACKAGE)
s->fsflags |= WP_FULLPATH;
if (flags&QCSEARCH_FORCESEARCH)
s->fsflags |= WP_FORCE;
Q_strncpyz(s->searchinfo.purepath, package?package:"", sizeof(s->searchinfo.purepath));
s->searchinfo.handle = COM_EnumerateFilesPackage(pattern, package?s->searchinfo.purepath:NULL, s->fsflags, search_enumerate, s);
G_FLOAT(OFS_RETURN) = j; G_FLOAT(OFS_RETURN) = j;
} }
@ -3118,6 +3192,69 @@ void QCBUILTIN PF_search_getfilemtime (pubprogfuncs_t *prinst, struct globalvars
RETURN_TSTRING(timestr); RETURN_TSTRING(timestr);
} }
} }
static qboolean PF_search_getloc(flocation_t *loc, prvmsearch_t *s, int num)
{
const char *fname = s->entry[num].name;
if (s->searchinfo.handle) //we were only searching a single package...
{
loc->search = &s->searchinfo;
return loc->search->handle->FindFile(loc->search->handle, loc, fname, NULL);
}
else if (!s->entry[num].package)
{
loc->search = &s->searchinfo;
Q_snprintfz(loc->rawname, sizeof(loc->rawname), "%s/%s", s->searchinfo.purepath, fname);
return true;
}
else
return FS_GetLocationForPackageHandle(loc, s->entry[num].package, fname);
}
void QCBUILTIN PF_search_getpackagename (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals)
{
int handle = G_FLOAT(OFS_PARM0);
int num = G_FLOAT(OFS_PARM1);
prvmsearch_t *s;
flocation_t loc;
const char *pkgname;
G_INT(OFS_RETURN) = 0;
if (handle < 0 || handle >= numpr_searches || pr_searches[handle].fromprogs != prinst)
{
PF_Warningf(prinst, "PF_search_getpackagename: Invalid search handle %i\n", handle);
return;
}
s = &pr_searches[handle];
if (num < 0 || num >= s->entries)
return;
if (PF_search_getloc(&loc, s, num))
{
pkgname = FS_WhichPackForLocation(&loc, s->fsflags);
if (pkgname)
RETURN_TSTRING(pkgname);
}
}
void QCBUILTIN PF_search_fopen (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals)
{
int handle = G_FLOAT(OFS_PARM0);
int num = G_FLOAT(OFS_PARM1);
prvmsearch_t *s;
flocation_t loc;
G_FLOAT(OFS_RETURN) = -1;
if (handle < 0 || handle >= numpr_searches || pr_searches[handle].fromprogs != prinst)
{
PF_Warningf(prinst, "PF_search_getpackagename: Invalid search handle %i\n", handle);
return;
}
s = &pr_searches[handle];
if (num < 0 || num >= s->entries)
return;
if (PF_search_getloc(&loc, s, num))
G_FLOAT(OFS_RETURN) = PF_fopen_search (prinst, s->entry[num].name, &loc);
}
//closes filesystem type stuff for when a progs has stopped needing it. //closes filesystem type stuff for when a progs has stopped needing it.
void PR_fclose_progs (pubprogfuncs_t *prinst) void PR_fclose_progs (pubprogfuncs_t *prinst)
@ -6609,6 +6746,8 @@ nolength:
*f++ = 'x'; *f++ = 'x';
else if (*s == 'P') else if (*s == 'P')
*f++ = 'X'; *f++ = 'X';
else if (*s == 'S')
*f++ = 's';
else else
*f++ = *s; *f++ = *s;
*f++ = 0; *f++ = 0;
@ -7288,6 +7427,7 @@ lh_extension_t QSG_Extensions[] = {
{"DP_QC_FINDCHAINFLAGS", 1, NULL, {"findchainflags"}}, {"DP_QC_FINDCHAINFLAGS", 1, NULL, {"findchainflags"}},
{"DP_QC_FINDFLOAT", 1, NULL, {"findfloat"}}, {"DP_QC_FINDFLOAT", 1, NULL, {"findfloat"}},
{"DP_QC_FS_SEARCH", 4, NULL, {"search_begin", "search_end", "search_getsize", "search_getfilename"}}, {"DP_QC_FS_SEARCH", 4, NULL, {"search_begin", "search_end", "search_getsize", "search_getfilename"}},
{"DP_QC_FS_SEARCH_PACKFILE", 4, NULL, {"search_begin", "search_end", "search_getsize", "search_getfilename"}},
{"DP_QC_GETSURFACE", 6, NULL, {"getsurfacenumpoints", "getsurfacepoint", "getsurfacenormal", "getsurfacetexture", "getsurfacenearpoint", "getsurfaceclippedpoint"}}, {"DP_QC_GETSURFACE", 6, NULL, {"getsurfacenumpoints", "getsurfacepoint", "getsurfacenormal", "getsurfacetexture", "getsurfacenearpoint", "getsurfaceclippedpoint"}},
{"DP_QC_GETSURFACEPOINTATTRIBUTE", 1, NULL, {"getsurfacepointattribute"}}, {"DP_QC_GETSURFACEPOINTATTRIBUTE", 1, NULL, {"getsurfacepointattribute"}},
{"DP_QC_GETTAGINFO", 2, NULL, {"gettagindex", "gettaginfo"}}, {"DP_QC_GETTAGINFO", 2, NULL, {"gettagindex", "gettaginfo"}},

View file

@ -193,6 +193,8 @@ void QCBUILTIN PF_search_getsize (pubprogfuncs_t *prinst, struct globalvars_s *p
void QCBUILTIN PF_search_getfilename (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals); void QCBUILTIN PF_search_getfilename (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals);
void QCBUILTIN PF_search_getfilesize (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals); void QCBUILTIN PF_search_getfilesize (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals);
void QCBUILTIN PF_search_getfilemtime (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals); void QCBUILTIN PF_search_getfilemtime (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals);
void QCBUILTIN PF_search_getpackagename (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals);
void QCBUILTIN PF_search_fopen (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals);
void QCBUILTIN PF_isfunction (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals); void QCBUILTIN PF_isfunction (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals);
void QCBUILTIN PF_callfunction (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals); void QCBUILTIN PF_callfunction (pubprogfuncs_t *prinst, struct globalvars_s *pr_globals);
void QCBUILTIN PF_writetofile(pubprogfuncs_t *prinst, struct globalvars_s *pr_globals); void QCBUILTIN PF_writetofile(pubprogfuncs_t *prinst, struct globalvars_s *pr_globals);

View file

@ -1193,8 +1193,8 @@ typedef struct usercmd_s
short forwardmove, sidemove, upmove; short forwardmove, sidemove, upmove;
qbyte impulse; qbyte impulse;
qbyte lightlevel; qbyte lightlevel;
//end q2 compat
//freestyle
float msec; //replace msec, but with more precision float msec; //replace msec, but with more precision
int buttons; //replaces buttons, but with more bits. int buttons; //replaces buttons, but with more bits.
int weapon; //q3 has a separate weapon field to supplement impulse. int weapon; //q3 has a separate weapon field to supplement impulse.

View file

@ -3618,7 +3618,7 @@ TRACE(("dbg: Mod_LoadTextures: inittexturedescs\n"));
mt->offsets[j] = LittleLong (mt->offsets[j]); mt->offsets[j] = LittleLong (mt->offsets[j]);
if ( (mt->width & 15) || (mt->height & 15) ) if ( (mt->width & 15) || (mt->height & 15) )
Con_Printf (CON_WARNING "Warning: Texture %s is not 16 aligned", mt->name); Con_DPrintf (CON_WARNING "Warning: Texture %s is not 16 aligned", mt->name);
if (mt->width < 1 || mt->height < 1) if (mt->width < 1 || mt->height < 1)
Con_Printf (CON_WARNING "Warning: Texture %s has no size", mt->name); Con_Printf (CON_WARNING "Warning: Texture %s has no size", mt->name);
tx = ZG_Malloc(&loadmodel->memgroup, sizeof(texture_t)); tx = ZG_Malloc(&loadmodel->memgroup, sizeof(texture_t));

View file

@ -4654,7 +4654,7 @@ YOU SHOULD NOT EDIT THIS FILE BY HAND
//Fun question: should sky be fogged as if infinite, or as if an actual surface? //Fun question: should sky be fogged as if infinite, or as if an actual surface?
"#ifdef FOG\n" "#ifdef FOG\n"
"#if 1\n" "#if 1\n"
"skybox.rgb = mix(skybox.rgb, w_fogcolour_ float(r_skyfog)*w_fogalpha); //flat fog ignoring actual geometry\n" "skybox.rgb = mix(skybox.rgb, w_fogcolour, float(r_skyfog)*w_fogalpha); //flat fog ignoring actual geometry\n"
"#else\n" "#else\n"
"skybox.rgb = mix(skybox.rgb, fog3(skybox.rgb), float(r_skyfog)); //fog in terms of actual geometry distance\n" "skybox.rgb = mix(skybox.rgb, fog3(skybox.rgb), float(r_skyfog)); //fog in terms of actual geometry distance\n"
"#endif\n" "#endif\n"

View file

@ -10478,7 +10478,7 @@ static BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs
{"cvar_string", PF_Fixme, 0, 0, 0, 71, D("string(string name)", "Returns the value of a cvar, as a string.")}, {"cvar_string", PF_Fixme, 0, 0, 0, 71, D("string(string name)", "Returns the value of a cvar, as a string.")},
{"crash", PF_Fixme, 0, 0, 0, 72, D("void()", "Demonstrates that no program is bug free.")}, {"crash", PF_Fixme, 0, 0, 0, 72, D("void()", "Demonstrates that no program is bug free.")},
{"stackdump", PF_Fixme, 0, 0, 0, 73, D("void()", "Prints out the QC's stack, for console-based error reports.")}, {"stackdump", PF_Fixme, 0, 0, 0, 73, D("void()", "Prints out the QC's stack, for console-based error reports.")},
{"search_begin", PF_Fixme, 0, 0, 0, 74, "searchhandle(string pattern, float caseinsensitive, float quiet)"}, {"search_begin", PF_Fixme, 0, 0, 0, 74, "searchhandle(string pattern, enumflags:float{SB_CASEINSENSITIVE=1<<0,SB_FULLPACKAGEPATH=1<<1,SB_ALLOWDUPES=1<<2,SB_FORCESEARCH=1<<3} flags, float quiet, optional string package)"},
{"search_end", PF_Fixme, 0, 0, 0, 75, "void(searchhandle handle)"}, {"search_end", PF_Fixme, 0, 0, 0, 75, "void(searchhandle handle)"},
{"search_getsize", PF_Fixme, 0, 0, 0, 76, "float(searchhandle handle)"}, {"search_getsize", PF_Fixme, 0, 0, 0, 76, "float(searchhandle handle)"},
{"search_getfilename",PF_Fixme, 0, 0, 0, 77, "string(searchhandle handle, float num)"}, {"search_getfilename",PF_Fixme, 0, 0, 0, 77, "string(searchhandle handle, float num)"},
@ -11253,12 +11253,14 @@ static BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs
{"tokenize", PF_Tokenize, 0, 0, 0, 441, "float(string s)"},// (KRIMZON_SV_PARSECLIENTCOMMAND) {"tokenize", PF_Tokenize, 0, 0, 0, 441, "float(string s)"},// (KRIMZON_SV_PARSECLIENTCOMMAND)
{"argv", PF_ArgV, 0, 0, 0, 442, "string(float n)"},// (KRIMZON_SV_PARSECLIENTCOMMAND {"argv", PF_ArgV, 0, 0, 0, 442, "string(float n)"},// (KRIMZON_SV_PARSECLIENTCOMMAND
{"setattachment", PF_setattachment, 0, 0, 0, 443, "void(entity e, entity tagentity, string tagname)"},// (DP_GFX_QUAKE3MODELTAGS) {"setattachment", PF_setattachment, 0, 0, 0, 443, "void(entity e, entity tagentity, string tagname)"},// (DP_GFX_QUAKE3MODELTAGS)
{"search_begin", PF_search_begin, 0, 0, 0, 444, D("searchhandle(string pattern, float caseinsensitive, float quiet)", "initiate a filesystem scan based upon filenames. Be sure to call search_end on the returned handle.")}, {"search_begin", PF_search_begin, 0, 0, 0, 444, D("searchhandle(string pattern, enumflags:float{SB_CASEINSENSITIVE=1<<0,SB_FULLPACKAGEPATH=1<<1,SB_ALLOWDUPES=1<<2,SB_FORCESEARCH=1<<3} flags, float quiet, optional string filterpackage)", "initiate a filesystem scan based upon filenames. Be sure to call search_end on the returned handle. SB_FULLPACKAGEPATH interprets the filterpackage arg as a full package path to avoid gamedir ambiguity, equivelent to whichpack's WP_FULLPACKAGEPATH flag. SB_ALLOWDUPES allows returning multiple entries with the same name (but different package, useful with search_fopen). SB_FORCESEARCH requires use of the filterpackage and SB_FULLPACKAGEPATH flag, initiating searches from gamedirs/packages which are not currently active.")},
{"search_end", PF_search_end, 0, 0, 0, 445, "void(searchhandle handle)"}, {"search_end", PF_search_end, 0, 0, 0, 445, "void(searchhandle handle)"},
{"search_getsize", PF_search_getsize, 0, 0, 0, 446, D("float(searchhandle handle)", "Retrieves the number of files that were found.")}, {"search_getsize", PF_search_getsize, 0, 0, 0, 446, D("float(searchhandle handle)", "Retrieves the number of files that were found.")},
{"search_getfilename", PF_search_getfilename,0, 0, 0, 447, D("string(searchhandle handle, float num)", "Retrieves name of one of the files that was found by the initial search.")}, {"search_getfilename", PF_search_getfilename,0, 0, 0, 447, D("string(searchhandle handle, float num)", "Retrieves name of one of the files that was found by the initial search.")},
{"search_getfilesize", PF_search_getfilesize,0, 0, 0, 0, D("float(searchhandle handle, float num)", "Retrieves the size of one of the files that was found by the initial search.")}, {"search_getfilesize", PF_search_getfilesize,0, 0, 0, 0, D("float(searchhandle handle, float num)", "Retrieves the size of one of the files that was found by the initial search.")},
{"search_getfilemtime", PF_search_getfilemtime,0,0, 0, 0, D("string(searchhandle handle, float num)", "Retrieves modification time of one of the files.")}, {"search_getfilemtime", PF_search_getfilemtime,0,0, 0, 0, D("string(searchhandle handle, float num)", "Retrieves modification time of one of the files.")},
{"search_getpackagename", PF_search_getpackagename,0,0, 0, 0, D("string(searchhandle handle, float num)", "Retrieves the name of the package containing the file. Search with SB_FULLPACKAGEPATH to see gamedir/package info")},
{"search_fopen", PF_search_fopen, 0, 0, 0, 0, D("filestream(searchhandle handle, float num)", "Opens the file directly, without getting confused about entries from other packages. Read access only.")},
{"cvar_string", PF_cvar_string, 0, 0, 0, 448, "string(string cvarname)"},//DP_QC_CVAR_STRING {"cvar_string", PF_cvar_string, 0, 0, 0, 448, "string(string cvarname)"},//DP_QC_CVAR_STRING
{"findflags", PF_FindFlags, 0, 0, 0, 449, "entity(entity start, .float fld, float match)"},//DP_QC_FINDFLAGS {"findflags", PF_FindFlags, 0, 0, 0, 449, "entity(entity start, .float fld, float match)"},//DP_QC_FINDFLAGS
{"findchainflags", PF_findchainflags,0, 0, 0, 450, "entity(.float fld, float match, optional .entity chainfield)"},//DP_QC_FINDCHAINFLAGS {"findchainflags", PF_findchainflags,0, 0, 0, 450, "entity(.float fld, float match, optional .entity chainfield)"},//DP_QC_FINDCHAINFLAGS
@ -11327,7 +11329,7 @@ static BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs
{"WritePicture", PF_WritePicture, 0, 0, 0, 501, D("void(float to, string s, float sz)", "Encodes the named image across the network as-is adhering to some size limit. In FTE, this simply writes the string and is equivelent to writestring and sz is ignored. WritePicture should be paired with ReadPicture in csqc.")},//DP_SV_WRITEPICTURE {"WritePicture", PF_WritePicture, 0, 0, 0, 501, D("void(float to, string s, float sz)", "Encodes the named image across the network as-is adhering to some size limit. In FTE, this simply writes the string and is equivelent to writestring and sz is ignored. WritePicture should be paired with ReadPicture in csqc.")},//DP_SV_WRITEPICTURE
{"ReadPicture", PF_Fixme, 0, 0, 0, 501, D("string()", "Reads a picture that was written by ReadPicture, and returns a name that can be used in drawpic and other 2d drawing functions. In FTE, this acts as a readstring-with-downloadcheck - the image will appear normally once it has been downloaded, but its size may be incorrect until then.")},//DP_SV_WRITEPICTURE {"ReadPicture", PF_Fixme, 0, 0, 0, 501, D("string()", "Reads a picture that was written by ReadPicture, and returns a name that can be used in drawpic and other 2d drawing functions. In FTE, this acts as a readstring-with-downloadcheck - the image will appear normally once it has been downloaded, but its size may be incorrect until then.")},//DP_SV_WRITEPICTURE
{"boxparticles", PF_Fixme, 0, 0, 0, 502, "void(float effectindex, entity own, vector org_from, vector org_to, vector dir_from, vector dir_to, float countmultiplier, optional float flags)"}, {"boxparticles", PF_Fixme, 0, 0, 0, 502, "void(float effectindex, entity own, vector org_from, vector org_to, vector dir_from, vector dir_to, float countmultiplier, optional float flags)"},
{"whichpack", PF_whichpack, 0, 0, 0, 503, D("string(string filename, optional float makereferenced)", "Returns the pak file name that contains the file specified. progs/player.mdl will generally return something like 'pak0.pak'. If makereferenced is true, clients will automatically be told that the returned package should be pre-downloaded and used, even if allow_download_refpackages is not set.")},//DP_QC_WHICHPACK {"whichpack", PF_whichpack, 0, 0, 0, 503, D("string(string filename, optional enumflags:float{WP_REFERENCEPACKAGE,WP_FULLPACKAGEPATH} flags)", "Returns the pak file name that contains the file specified. progs/player.mdl will generally return something like 'pak0.pak'. If WP_REFERENCE, clients will automatically be told that the returned package should be pre-downloaded and used, even if allow_download_refpackages is not set.")},//DP_QC_WHICHPACK
{"getentity", PF_Fixme, 0, 0, 0, 504, D("__variant(float entnum, float fieldnum)", "Looks up fields from non-csqc-visible entities. The entity will need to be within the player's pvs. fieldnum should be one of the GE_ constants.")},//DP_CSQC_QUERYRENDERENTITY {"getentity", PF_Fixme, 0, 0, 0, 504, D("__variant(float entnum, float fieldnum)", "Looks up fields from non-csqc-visible entities. The entity will need to be within the player's pvs. fieldnum should be one of the GE_ constants.")},//DP_CSQC_QUERYRENDERENTITY
// {"undefined", PF_Fixme, 0, 0, 0, 505, ""}, // {"undefined", PF_Fixme, 0, 0, 0, 505, ""},
// {"undefined", PF_Fixme, 0, 0, 0, 506, ""}, // {"undefined", PF_Fixme, 0, 0, 0, 506, ""},
@ -12596,17 +12598,17 @@ void PR_DumpPlatform_f(void)
{"PFLAGS_CORONA", "const float", QW|NQ|CS, D("Enables support of coronas on the associated rtlights."), PFLAGS_CORONA}, {"PFLAGS_CORONA", "const float", QW|NQ|CS, D("Enables support of coronas on the associated rtlights."), PFLAGS_CORONA},
{"PFLAGS_FULLDYNAMIC", "const float", QW|NQ, D("When set in self.pflags, enables fully-customised dynamic lights. Custom rtlight information is not otherwise used."), PFLAGS_FULLDYNAMIC}, {"PFLAGS_FULLDYNAMIC", "const float", QW|NQ, D("When set in self.pflags, enables fully-customised dynamic lights. Custom rtlight information is not otherwise used."), PFLAGS_FULLDYNAMIC},
//including these for csqc stat types. //including these for csqc stat types, hash tables, etc.
// {"EV_VOID", "const float", QW|NQ|CS, NULL, ev_void}, // {"EV_VOID", "const float", QW|NQ|CS, NULL, ev_void},
{"EV_STRING", "const float", QW|NQ|CS, NULL, ev_string}, {"EV_STRING", "const float", ALL, NULL, ev_string},
{"EV_FLOAT", "const float", QW|NQ|CS, NULL, ev_float}, {"EV_FLOAT", "const float", ALL, NULL, ev_float},
{"EV_VECTOR", "const float", QW|NQ|CS, NULL, ev_vector}, {"EV_VECTOR", "const float", ALL, NULL, ev_vector},
{"EV_ENTITY", "const float", QW|NQ|CS, NULL, ev_entity}, {"EV_ENTITY", "const float", ALL, NULL, ev_entity},
{"EV_FIELD", "const float", QW|NQ|CS, NULL, ev_field}, {"EV_FIELD", "const float", ALL, NULL, ev_field},
{"EV_FUNCTION", "const float", QW|NQ|CS, NULL, ev_function}, {"EV_FUNCTION", "const float", ALL, NULL, ev_function},
{"EV_POINTER", "const float", QW|NQ|CS, NULL, ev_pointer}, {"EV_POINTER", "const float", ALL, NULL, ev_pointer},
{"EV_INTEGER", "const float", QW|NQ|CS, NULL, ev_integer}, {"EV_INTEGER", "const float", ALL, NULL, ev_integer},
{"EV_VARIANT", "const float", QW|NQ|CS, NULL, ev_variant}, {"EV_VARIANT", "const float", ALL, NULL, ev_variant},
// {"EV_STRUCT", "const float", QW|NQ|CS, NULL, ev_struct}, // {"EV_STRUCT", "const float", QW|NQ|CS, NULL, ev_struct},
// {"EV_UNION", "const float", QW|NQ|CS, NULL, ev_union}, // {"EV_UNION", "const float", QW|NQ|CS, NULL, ev_union},

View file

@ -39,7 +39,7 @@ void main ()
//Fun question: should sky be fogged as if infinite, or as if an actual surface? //Fun question: should sky be fogged as if infinite, or as if an actual surface?
#ifdef FOG #ifdef FOG
#if 1 #if 1
skybox.rgb = mix(skybox.rgb, w_fogcolour_ float(r_skyfog)*w_fogalpha); //flat fog ignoring actual geometry skybox.rgb = mix(skybox.rgb, w_fogcolour, float(r_skyfog)*w_fogalpha); //flat fog ignoring actual geometry
#else #else
skybox.rgb = mix(skybox.rgb, fog3(skybox.rgb), float(r_skyfog)); //fog in terms of actual geometry distance skybox.rgb = mix(skybox.rgb, fog3(skybox.rgb), float(r_skyfog)); //fog in terms of actual geometry distance
#endif #endif