mirror of
https://github.com/nzp-team/fteqw.git
synced 2025-02-23 12:00:59 +00:00
fix HOM issue with out-of-world r_projection. also gave 20% speedup.
refuse to load certain dxt images for premultiplied alpha, as these cannot otherwise work. fteqcc now tries to be more relative with its paths, so #pragma sourcefile "subdir/foo.src" can work as expected. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4932 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
83f0179906
commit
d789a2c81a
18 changed files with 317 additions and 164 deletions
|
@ -7175,6 +7175,19 @@ void CLNQ_ParseServerMessage (void)
|
||||||
CL_SetStatFloat (0, i, j);
|
CL_SetStatFloat (0, i, j);
|
||||||
CL_SetStatInt (0, i, j);
|
CL_SetStatInt (0, i, j);
|
||||||
break;
|
break;
|
||||||
|
case svcfte_updatestatstring:
|
||||||
|
i = MSG_ReadByte();
|
||||||
|
s = MSG_ReadString();
|
||||||
|
CL_SetStatString (destsplit, i, s);
|
||||||
|
break;
|
||||||
|
case svcfte_updatestatfloat:
|
||||||
|
i = MSG_ReadByte();
|
||||||
|
{
|
||||||
|
float f = MSG_ReadFloat();
|
||||||
|
CL_SetStatInt (destsplit, i, f);
|
||||||
|
CL_SetStatFloat (destsplit, i, f);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case svc_setangle:
|
case svc_setangle:
|
||||||
{
|
{
|
||||||
inframe_t *inf = &cl.inframes[cls.netchan.incoming_sequence&UPDATE_MASK];
|
inframe_t *inf = &cl.inframes[cls.netchan.incoming_sequence&UPDATE_MASK];
|
||||||
|
|
|
@ -1500,8 +1500,6 @@ int Stats_GetCaptures(int playernum);
|
||||||
qboolean Stats_HaveFlags(int mode);
|
qboolean Stats_HaveFlags(int mode);
|
||||||
qboolean Stats_HaveKills(void);
|
qboolean Stats_HaveKills(void);
|
||||||
void VARGS Stats_Message(char *msg, ...) LIKEPRINTF(1);
|
void VARGS Stats_Message(char *msg, ...) LIKEPRINTF(1);
|
||||||
int qm_strcmp(char *s1, char *s2);
|
|
||||||
int qm_stricmp(char *s1, char *s2);
|
|
||||||
qboolean Stats_ParsePrintLine(char *line);
|
qboolean Stats_ParsePrintLine(char *line);
|
||||||
void Stats_NewMap(void);
|
void Stats_NewMap(void);
|
||||||
void Stats_Clear(void);
|
void Stats_Clear(void);
|
||||||
|
|
|
@ -668,8 +668,8 @@ static void Stats_LoadFragFile(char *name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
int qm_strcmp(char *s1, char *s2)//not like strcmp at all...
|
static int qm_strcmp(char *s1, char *s2)//not like strcmp at all...
|
||||||
{
|
{
|
||||||
while(*s1)
|
while(*s1)
|
||||||
{
|
{
|
||||||
|
@ -678,8 +678,8 @@ int qm_strcmp(char *s1, char *s2)//not like strcmp at all...
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
int qm_stricmp(char *s1, char *s2)//not like strcmp at all...
|
static int qm_stricmp(char *s1, char *s2)//not like strcmp at all...
|
||||||
{
|
{
|
||||||
int c1,c2;
|
int c1,c2;
|
||||||
while(*s1)
|
while(*s1)
|
||||||
|
|
|
@ -2369,15 +2369,38 @@ static qboolean Image_ReadDDSFile(texid_t tex, unsigned int flags, char *fname,
|
||||||
divsize = 4;
|
divsize = 4;
|
||||||
blocksize = 8;
|
blocksize = 8;
|
||||||
}
|
}
|
||||||
else if (*(int*)&fmtheader.ddpfPixelFormat.dwFourCC == *(int*)"DXT2" || *(int*)&fmtheader.ddpfPixelFormat.dwFourCC == *(int*)"DXT3")
|
else if (*(int*)&fmtheader.ddpfPixelFormat.dwFourCC == *(int*)"DXT2") //dx3 with premultiplied alpha
|
||||||
{
|
{
|
||||||
|
// if (!(tex->flags & IF_PREMULTIPLYALPHA))
|
||||||
|
return false;
|
||||||
encoding = PTI_S3RGBA3;
|
encoding = PTI_S3RGBA3;
|
||||||
pad = 8;
|
pad = 8;
|
||||||
divsize = 4;
|
divsize = 4;
|
||||||
blocksize = 16;
|
blocksize = 16;
|
||||||
}
|
}
|
||||||
else if (*(int*)&fmtheader.ddpfPixelFormat.dwFourCC == *(int*)"DXT4" || *(int*)&fmtheader.ddpfPixelFormat.dwFourCC == *(int*)"DXT5")
|
else if (*(int*)&fmtheader.ddpfPixelFormat.dwFourCC == *(int*)"DXT3")
|
||||||
{
|
{
|
||||||
|
if (tex->flags & IF_PREMULTIPLYALPHA)
|
||||||
|
return false;
|
||||||
|
encoding = PTI_S3RGBA3;
|
||||||
|
pad = 8;
|
||||||
|
divsize = 4;
|
||||||
|
blocksize = 16;
|
||||||
|
}
|
||||||
|
else if (*(int*)&fmtheader.ddpfPixelFormat.dwFourCC == *(int*)"DXT4") //dx5 with premultiplied alpha
|
||||||
|
{
|
||||||
|
// if (!(tex->flags & IF_PREMULTIPLYALPHA))
|
||||||
|
return false;
|
||||||
|
encoding = PTI_S3RGBA5;
|
||||||
|
pad = 8;
|
||||||
|
divsize = 4;
|
||||||
|
blocksize = 16;
|
||||||
|
}
|
||||||
|
else if (*(int*)&fmtheader.ddpfPixelFormat.dwFourCC == *(int*)"DXT5")
|
||||||
|
{
|
||||||
|
if (tex->flags & IF_PREMULTIPLYALPHA)
|
||||||
|
return false;
|
||||||
|
|
||||||
encoding = PTI_S3RGBA5;
|
encoding = PTI_S3RGBA5;
|
||||||
pad = 8;
|
pad = 8;
|
||||||
divsize = 4;
|
divsize = 4;
|
||||||
|
@ -3127,16 +3150,22 @@ static void Image_RoundDimensions(int *scaled_width, int *scaled_height, unsigne
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flags & IF_NOMIPMAP)
|
if (flags & IF_NOMIPMAP)
|
||||||
|
{
|
||||||
|
if (gl_picmip2d.ival > 0)
|
||||||
{
|
{
|
||||||
*scaled_width >>= gl_picmip2d.ival;
|
*scaled_width >>= gl_picmip2d.ival;
|
||||||
*scaled_height >>= gl_picmip2d.ival;
|
*scaled_height >>= gl_picmip2d.ival;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if (gl_picmip.ival > 0)
|
||||||
{
|
{
|
||||||
TRACE(("dbg: GL_RoundDimensions: %f\n", gl_picmip.value));
|
TRACE(("dbg: GL_RoundDimensions: %f\n", gl_picmip.value));
|
||||||
*scaled_width >>= gl_picmip.ival;
|
*scaled_width >>= gl_picmip.ival;
|
||||||
*scaled_height >>= gl_picmip.ival;
|
*scaled_height >>= gl_picmip.ival;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TRACE(("dbg: GL_RoundDimensions: %f\n", gl_max_size.value));
|
TRACE(("dbg: GL_RoundDimensions: %f\n", gl_max_size.value));
|
||||||
|
|
||||||
|
|
|
@ -350,7 +350,7 @@ void SV_Master_Heartbeat (void)
|
||||||
int i;
|
int i;
|
||||||
qboolean enabled;
|
qboolean enabled;
|
||||||
|
|
||||||
if (!sv_public.ival || SSV_IsSubServer())
|
if (sv_public.ival<=0 || SSV_IsSubServer())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (realtime-HEARTBEAT_SECONDS - svs.last_heartbeat < HEARTBEAT_SECONDS)
|
if (realtime-HEARTBEAT_SECONDS - svs.last_heartbeat < HEARTBEAT_SECONDS)
|
||||||
|
|
|
@ -476,9 +476,10 @@ void QCBUILTIN PF_CL_drawpic (pubprogfuncs_t *prinst, struct globalvars_s *pr_gl
|
||||||
{
|
{
|
||||||
if (!CL_IsDownloading(picname))
|
if (!CL_IsDownloading(picname))
|
||||||
p = R2D_SafeCachePic("no_texture");
|
p = R2D_SafeCachePic("no_texture");
|
||||||
|
G_FLOAT(OFS_RETURN) = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
G_FLOAT(OFS_RETURN) = 0;
|
G_FLOAT(OFS_RETURN) = 1;
|
||||||
|
|
||||||
r2d_be_flags = PF_SelectDPDrawFlag(flag);
|
r2d_be_flags = PF_SelectDPDrawFlag(flag);
|
||||||
R2D_ImageColours(rgb[0], rgb[1], rgb[2], alpha);
|
R2D_ImageColours(rgb[0], rgb[1], rgb[2], alpha);
|
||||||
|
|
|
@ -1708,7 +1708,7 @@ void TP_SearchForMsgTriggers (char *s, int level)
|
||||||
{
|
{
|
||||||
if (level == PRINT_CHAT && (
|
if (level == PRINT_CHAT && (
|
||||||
strstr (s, "f_version") || strstr (s, "f_system") ||
|
strstr (s, "f_version") || strstr (s, "f_system") ||
|
||||||
strstr (s, "f_speed") || strstr (s, "f_modified")))
|
strstr (s, "f_speed") || strstr (s, "f_modified") || strstr (s, "f_ruleset")))
|
||||||
continue; // don't let llamas fake proxy replies
|
continue; // don't let llamas fake proxy replies
|
||||||
|
|
||||||
string = Cmd_AliasExist (t->name, RESTRICT_LOCAL);
|
string = Cmd_AliasExist (t->name, RESTRICT_LOCAL);
|
||||||
|
|
|
@ -491,17 +491,25 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
#define PLATFORM "Web"
|
#define PLATFORM "Web"
|
||||||
#elif defined(NACL)
|
#elif defined(NACL)
|
||||||
#define PLATFORM "Nacl"
|
#define PLATFORM "Nacl"
|
||||||
|
#elif defined(_WIN32_WCE)
|
||||||
|
#define PLATFORM "WinCE"
|
||||||
|
#define ARCH_DL_POSTFIX ".dll"
|
||||||
#elif defined(_WIN32)
|
#elif defined(_WIN32)
|
||||||
#if defined(__amd64__)
|
#if defined(WINRT)
|
||||||
|
#define PLATFORM "WinRT" /*those poor poor souls. maybe just maybe I'll actually get the tools for a port, its just a shame that I won't be able to release said port*/
|
||||||
|
#elif defined(__amd64__)
|
||||||
#define PLATFORM "Win64"
|
#define PLATFORM "Win64"
|
||||||
#else
|
#else
|
||||||
#define PLATFORM "Win32"
|
#define PLATFORM "Win32"
|
||||||
#endif
|
#endif
|
||||||
#define ARCH_DL_POSTFIX ".dll"
|
#define ARCH_DL_POSTFIX ".dll"
|
||||||
|
#elif defined(_WIN16)
|
||||||
|
#define PLATFORM "Win16"
|
||||||
|
#define ARCH_DL_POSTFIX ".dll"
|
||||||
#elif defined(__CYGWIN__)
|
#elif defined(__CYGWIN__)
|
||||||
#define PLATFORM "Cygwin" /*technically also windows*/
|
#define PLATFORM "Cygwin" /*technically also windows*/
|
||||||
#define ARCH_DL_POSTFIX ".dll"
|
#define ARCH_DL_POSTFIX ".dll"
|
||||||
#elif defined(ANDROID)
|
#elif defined(ANDROID) || defined(__ANDROID__)
|
||||||
#define PLATFORM "Android" /*technically also linux*/
|
#define PLATFORM "Android" /*technically also linux*/
|
||||||
#elif defined(__linux__)
|
#elif defined(__linux__)
|
||||||
#if defined(__amd64__)
|
#if defined(__amd64__)
|
||||||
|
@ -509,16 +517,33 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
#else
|
#else
|
||||||
#define PLATFORM "Linux"
|
#define PLATFORM "Linux"
|
||||||
#endif
|
#endif
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
#include "TargetConditionals.h"
|
||||||
|
#if TARGET_IPHONE_SIMULATOR
|
||||||
|
#define PLATFORM "iOSSim"
|
||||||
|
#elif TARGET_OS_IPHONE
|
||||||
|
#define PLATFORM "iOS"
|
||||||
|
#elif TARGET_OS_MAC
|
||||||
|
#define PLATFORM "Mac"
|
||||||
|
#else
|
||||||
|
#define PLATFORM "Apple"
|
||||||
|
#endif
|
||||||
#elif defined(__FreeBSD__)
|
#elif defined(__FreeBSD__)
|
||||||
#define PLATFORM "FreeBSD"
|
#define PLATFORM "FreeBSD"
|
||||||
#elif defined(__OpenBSD__)
|
#elif defined(__OpenBSD__)
|
||||||
#define PLATFORM "OpenBSD"
|
#define PLATFORM "OpenBSD"
|
||||||
#elif defined(__NetBSD__)
|
#elif defined(__NetBSD__)
|
||||||
#define PLATFORM "NetBSD"
|
#define PLATFORM "NetBSD"
|
||||||
|
#elif defined(BSD)
|
||||||
|
#define PLATFORM "BSD"
|
||||||
#elif defined(__MORPHOS__)
|
#elif defined(__MORPHOS__)
|
||||||
#define PLATFORM "MorphOS"
|
#define PLATFORM "MorphOS"
|
||||||
|
#elif defined(__amigaos__)
|
||||||
|
#define PLATFORM "AmigaOS"
|
||||||
#elif defined(MACOSX)
|
#elif defined(MACOSX)
|
||||||
#define PLATFORM "MacOS X"
|
#define PLATFORM "MacOS X"
|
||||||
|
#elif defined(__DOS__)
|
||||||
|
#define PLATFORM "Dos"
|
||||||
#else
|
#else
|
||||||
#define PLATFORM "Unknown"
|
#define PLATFORM "Unknown"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -850,12 +850,14 @@ hull_t *Q1BSP_ChooseHull(model_t *model, int forcehullnum, vec3_t mins, vec3_t m
|
||||||
{
|
{
|
||||||
if (size[0] < 3 || !model->hulls[1].available)
|
if (size[0] < 3 || !model->hulls[1].available)
|
||||||
hull = &model->hulls[0];
|
hull = &model->hulls[0];
|
||||||
else if (size[0] <= 32.1)
|
else if (size[0] <= 32.1 || !model->hulls[2].available)
|
||||||
{
|
{
|
||||||
if (size[2] < 54.1 && model->hulls[3].available)
|
if (size[2] < 54.1 && model->hulls[3].available)
|
||||||
hull = &model->hulls[3]; // 32x32x36 (half-life's crouch)
|
hull = &model->hulls[3]; // 32x32x36 (half-life's crouch)
|
||||||
else
|
else if (model->hulls[1].available)
|
||||||
hull = &model->hulls[1];
|
hull = &model->hulls[1];
|
||||||
|
else
|
||||||
|
hull = &model->hulls[0];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
hull = &model->hulls[2];
|
hull = &model->hulls[2];
|
||||||
|
|
|
@ -4572,7 +4572,7 @@ static void GLBE_SubmitMeshesSortList(batch_t *sortlist)
|
||||||
qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
}
|
}
|
||||||
oldfbo = GLBE_FBO_Update(&shaderstate.fbo_reflectrefrac, FBO_RB_DEPTH, &shaderstate.tex_reflection, 1, r_nulltex, shaderstate.tex_reflection->width, shaderstate.tex_reflection->height);
|
oldfbo = GLBE_FBO_Update(&shaderstate.fbo_reflectrefrac, FBO_RB_DEPTH, &shaderstate.tex_reflection, 1, r_nulltex, shaderstate.tex_reflection->width, shaderstate.tex_reflection->height, 0);
|
||||||
r_refdef.pxrect.maxheight = shaderstate.fbo_reflectrefrac.rb_size[1];
|
r_refdef.pxrect.maxheight = shaderstate.fbo_reflectrefrac.rb_size[1];
|
||||||
GL_ViewportUpdate();
|
GL_ViewportUpdate();
|
||||||
GL_ForceDepthWritable();
|
GL_ForceDepthWritable();
|
||||||
|
@ -4635,11 +4635,11 @@ static void GLBE_SubmitMeshesSortList(batch_t *sortlist)
|
||||||
qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
}
|
}
|
||||||
oldfbo = GLBE_FBO_Update(&shaderstate.fbo_reflectrefrac, FBO_TEX_DEPTH, &shaderstate.tex_refraction, 1, shaderstate.tex_refractiondepth, r_refdef.pxrect.width, r_refdef.pxrect.height);
|
oldfbo = GLBE_FBO_Update(&shaderstate.fbo_reflectrefrac, FBO_TEX_DEPTH, &shaderstate.tex_refraction, 1, shaderstate.tex_refractiondepth, r_refdef.pxrect.width, r_refdef.pxrect.height, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
oldfbo = GLBE_FBO_Update(&shaderstate.fbo_reflectrefrac, FBO_RB_DEPTH, &shaderstate.tex_refraction, 1, r_nulltex, r_refdef.pxrect.width, r_refdef.pxrect.height);
|
oldfbo = GLBE_FBO_Update(&shaderstate.fbo_reflectrefrac, FBO_RB_DEPTH, &shaderstate.tex_refraction, 1, r_nulltex, r_refdef.pxrect.width, r_refdef.pxrect.height, 0);
|
||||||
}
|
}
|
||||||
r_refdef.pxrect.maxheight = shaderstate.fbo_reflectrefrac.rb_size[1];
|
r_refdef.pxrect.maxheight = shaderstate.fbo_reflectrefrac.rb_size[1];
|
||||||
GL_ViewportUpdate();
|
GL_ViewportUpdate();
|
||||||
|
@ -4688,7 +4688,7 @@ static void GLBE_SubmitMeshesSortList(batch_t *sortlist)
|
||||||
qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
}
|
}
|
||||||
oldfbo = GLBE_FBO_Update(&shaderstate.fbo_reflectrefrac, 0, &shaderstate.tex_ripplemap, 1, r_nulltex, r_refdef.pxrect.width, r_refdef.pxrect.height);
|
oldfbo = GLBE_FBO_Update(&shaderstate.fbo_reflectrefrac, 0, &shaderstate.tex_ripplemap, 1, r_nulltex, r_refdef.pxrect.width, r_refdef.pxrect.height, 0);
|
||||||
r_refdef.pxrect.maxheight = shaderstate.fbo_reflectrefrac.rb_size[1];
|
r_refdef.pxrect.maxheight = shaderstate.fbo_reflectrefrac.rb_size[1];
|
||||||
GL_ViewportUpdate();
|
GL_ViewportUpdate();
|
||||||
|
|
||||||
|
@ -4832,7 +4832,7 @@ void GLBE_RenderToTextureUpdate2d(qboolean destchanged)
|
||||||
if (*r_refdef.rt_destcolour[0].texname)
|
if (*r_refdef.rt_destcolour[0].texname)
|
||||||
{
|
{
|
||||||
texid_t tex = R2D_RT_GetTexture(r_refdef.rt_destcolour[0].texname, &width, &height);
|
texid_t tex = R2D_RT_GetTexture(r_refdef.rt_destcolour[0].texname, &width, &height);
|
||||||
GLBE_FBO_Update(&shaderstate.fbo_2dfbo, 0, &tex, 1, r_nulltex, width, height);
|
GLBE_FBO_Update(&shaderstate.fbo_2dfbo, 0, &tex, 1, r_nulltex, width, height, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
GLBE_FBO_Push(NULL);
|
GLBE_FBO_Push(NULL);
|
||||||
|
@ -4895,7 +4895,7 @@ void GLBE_FBO_Destroy(fbostate_t *state)
|
||||||
}
|
}
|
||||||
|
|
||||||
//state->colour is created if usedepth is set and it doesn't previously exist
|
//state->colour is created if usedepth is set and it doesn't previously exist
|
||||||
int GLBE_FBO_Update(fbostate_t *state, unsigned int enables, texid_t *destcol, int mrt, texid_t destdepth, int width, int height)
|
int GLBE_FBO_Update(fbostate_t *state, unsigned int enables, texid_t *destcol, int mrt, texid_t destdepth, int width, int height, int layer)
|
||||||
{
|
{
|
||||||
GLenum allcolourattachments[] ={GL_COLOR_ATTACHMENT0_EXT,GL_COLOR_ATTACHMENT1_EXT,GL_COLOR_ATTACHMENT2_EXT,GL_COLOR_ATTACHMENT3_EXT,
|
GLenum allcolourattachments[] ={GL_COLOR_ATTACHMENT0_EXT,GL_COLOR_ATTACHMENT1_EXT,GL_COLOR_ATTACHMENT2_EXT,GL_COLOR_ATTACHMENT3_EXT,
|
||||||
GL_COLOR_ATTACHMENT4_EXT,GL_COLOR_ATTACHMENT5_EXT,GL_COLOR_ATTACHMENT6_EXT,GL_COLOR_ATTACHMENT7_EXT};
|
GL_COLOR_ATTACHMENT4_EXT,GL_COLOR_ATTACHMENT5_EXT,GL_COLOR_ATTACHMENT6_EXT,GL_COLOR_ATTACHMENT7_EXT};
|
||||||
|
@ -4996,7 +4996,17 @@ int GLBE_FBO_Update(fbostate_t *state, unsigned int enables, texid_t *destcol, i
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < mrt; i++)
|
for (i = 0; i < mrt; i++)
|
||||||
|
{
|
||||||
|
if ((destcol[i]->flags & IF_TEXTYPE) == IF_CUBEMAP)
|
||||||
|
{
|
||||||
|
//fixme: we should probably support whole-cubemap rendering for shadowmaps or something.
|
||||||
|
qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + layer, destcol[i]->num, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ //layer does not make sense here
|
||||||
qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_TEXTURE_2D, destcol[i]->num, 0);
|
qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_TEXTURE_2D, destcol[i]->num, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
i = qglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
|
i = qglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
|
||||||
if (GL_FRAMEBUFFER_COMPLETE_EXT != i)
|
if (GL_FRAMEBUFFER_COMPLETE_EXT != i)
|
||||||
|
@ -5199,7 +5209,7 @@ void GLBE_DrawLightPrePass(qbyte *vis)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*set the FB up to draw surface info*/
|
/*set the FB up to draw surface info*/
|
||||||
oldfbo = GLBE_FBO_Update(&shaderstate.fbo_lprepass, FBO_RB_DEPTH, &shaderstate.tex_normals, 1, r_nulltex, vid.pixelwidth, vid.pixelheight);
|
oldfbo = GLBE_FBO_Update(&shaderstate.fbo_lprepass, FBO_RB_DEPTH, &shaderstate.tex_normals, 1, r_nulltex, vid.pixelwidth, vid.pixelheight, 0);
|
||||||
GL_ForceDepthWritable();
|
GL_ForceDepthWritable();
|
||||||
//FIXME: should probably clear colour buffer too.
|
//FIXME: should probably clear colour buffer too.
|
||||||
qglClear(GL_DEPTH_BUFFER_BIT);
|
qglClear(GL_DEPTH_BUFFER_BIT);
|
||||||
|
@ -5215,7 +5225,7 @@ void GLBE_DrawLightPrePass(qbyte *vis)
|
||||||
|
|
||||||
/*reconfigure - now drawing diffuse light info using the previous fb image as a source image*/
|
/*reconfigure - now drawing diffuse light info using the previous fb image as a source image*/
|
||||||
GLBE_FBO_Sources(shaderstate.tex_normals, r_nulltex);
|
GLBE_FBO_Sources(shaderstate.tex_normals, r_nulltex);
|
||||||
GLBE_FBO_Update(&shaderstate.fbo_lprepass, FBO_RB_DEPTH, &shaderstate.tex_diffuse, 1, r_nulltex, vid.pixelwidth, vid.pixelheight);
|
GLBE_FBO_Update(&shaderstate.fbo_lprepass, FBO_RB_DEPTH, &shaderstate.tex_diffuse, 1, r_nulltex, vid.pixelwidth, vid.pixelheight, 0);
|
||||||
|
|
||||||
BE_SelectMode(BEM_STANDARD);
|
BE_SelectMode(BEM_STANDARD);
|
||||||
qglClearColor (0,0,0,1);
|
qglClearColor (0,0,0,1);
|
||||||
|
|
|
@ -197,7 +197,7 @@ void R_BloomBlend (texid_t source, int x, int y, int w, int h)
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
{
|
{
|
||||||
/*filter the screen into a downscaled image*/
|
/*filter the screen into a downscaled image*/
|
||||||
oldfbo = GLBE_FBO_Update(&fbo_bloom, 0, &pingtex[0][0], 1, r_nulltex, 0, 0);
|
oldfbo = GLBE_FBO_Update(&fbo_bloom, 0, &pingtex[0][0], 1, r_nulltex, 0, 0, 0);
|
||||||
GLBE_FBO_Sources(source, r_nulltex);
|
GLBE_FBO_Sources(source, r_nulltex);
|
||||||
qglViewport (0, 0, texwidth[0], texheight[0]);
|
qglViewport (0, 0, texwidth[0], texheight[0]);
|
||||||
R2D_ScalePic(0, vid.height, vid.width, -(int)vid.height, bloomfilter);
|
R2D_ScalePic(0, vid.height, vid.width, -(int)vid.height, bloomfilter);
|
||||||
|
@ -205,7 +205,7 @@ void R_BloomBlend (texid_t source, int x, int y, int w, int h)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/*simple downscale that multiple times*/
|
/*simple downscale that multiple times*/
|
||||||
GLBE_FBO_Update(&fbo_bloom, 0, &pingtex[0][i], 1, r_nulltex, 0, 0);
|
GLBE_FBO_Update(&fbo_bloom, 0, &pingtex[0][i], 1, r_nulltex, 0, 0, 0);
|
||||||
GLBE_FBO_Sources(pingtex[0][i-1], r_nulltex);
|
GLBE_FBO_Sources(pingtex[0][i-1], r_nulltex);
|
||||||
qglViewport (0, 0, texwidth[i], texheight[i]);
|
qglViewport (0, 0, texwidth[i], texheight[i]);
|
||||||
R2D_ScalePic(0, vid.height, vid.width, -(int)vid.height, bloomrescale);
|
R2D_ScalePic(0, vid.height, vid.width, -(int)vid.height, bloomrescale);
|
||||||
|
@ -219,7 +219,7 @@ void R_BloomBlend (texid_t source, int x, int y, int w, int h)
|
||||||
*/
|
*/
|
||||||
r_worldentity.glowmod[0] = 1.2 / texwidth[i];
|
r_worldentity.glowmod[0] = 1.2 / texwidth[i];
|
||||||
r_worldentity.glowmod[1] = 0;
|
r_worldentity.glowmod[1] = 0;
|
||||||
GLBE_FBO_Update(&fbo_bloom, 0, &pingtex[1][i], 1, r_nulltex, 0, 0);
|
GLBE_FBO_Update(&fbo_bloom, 0, &pingtex[1][i], 1, r_nulltex, 0, 0, 0);
|
||||||
GLBE_FBO_Sources(pingtex[0][i], r_nulltex);
|
GLBE_FBO_Sources(pingtex[0][i], r_nulltex);
|
||||||
qglViewport (0, 0, texwidth[i], texheight[i]);
|
qglViewport (0, 0, texwidth[i], texheight[i]);
|
||||||
BE_SelectEntity(&r_worldentity);
|
BE_SelectEntity(&r_worldentity);
|
||||||
|
@ -227,7 +227,7 @@ void R_BloomBlend (texid_t source, int x, int y, int w, int h)
|
||||||
|
|
||||||
r_worldentity.glowmod[0] = 0;
|
r_worldentity.glowmod[0] = 0;
|
||||||
r_worldentity.glowmod[1] = 1.2 / texheight[i];
|
r_worldentity.glowmod[1] = 1.2 / texheight[i];
|
||||||
GLBE_FBO_Update(&fbo_bloom, 0, &pingtex[0][i], 1, r_nulltex, 0, 0);
|
GLBE_FBO_Update(&fbo_bloom, 0, &pingtex[0][i], 1, r_nulltex, 0, 0, 0);
|
||||||
GLBE_FBO_Sources(pingtex[1][i], r_nulltex);
|
GLBE_FBO_Sources(pingtex[1][i], r_nulltex);
|
||||||
qglViewport (0, 0, texwidth[i], texheight[i]);
|
qglViewport (0, 0, texwidth[i], texheight[i]);
|
||||||
BE_SelectEntity(&r_worldentity);
|
BE_SelectEntity(&r_worldentity);
|
||||||
|
|
|
@ -1387,6 +1387,9 @@ qboolean R_RenderScene_Cubemap(void)
|
||||||
shader_t *shader;
|
shader_t *shader;
|
||||||
int facemask;
|
int facemask;
|
||||||
extern cvar_t r_projection;
|
extern cvar_t r_projection;
|
||||||
|
int oldfbo = -1;
|
||||||
|
qboolean usefbo = true; //this appears to be a 20% speedup in my tests.
|
||||||
|
static fbostate_t fbostate; //FIXME
|
||||||
|
|
||||||
/*needs glsl*/
|
/*needs glsl*/
|
||||||
if (!gl_config.arb_shader_objects)
|
if (!gl_config.arb_shader_objects)
|
||||||
|
@ -1494,7 +1497,7 @@ qboolean R_RenderScene_Cubemap(void)
|
||||||
else
|
else
|
||||||
cmapsize = prect.height;
|
cmapsize = prect.height;
|
||||||
}
|
}
|
||||||
else
|
else if (!usefbo)
|
||||||
{
|
{
|
||||||
while (cmapsize > prect.width || cmapsize > prect.height)
|
while (cmapsize > prect.width || cmapsize > prect.height)
|
||||||
{
|
{
|
||||||
|
@ -1502,6 +1505,14 @@ qboolean R_RenderScene_Cubemap(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (usefbo)
|
||||||
|
{
|
||||||
|
r_refdef.flags |= RDF_FISHEYE;
|
||||||
|
vid.fbpwidth = vid.fbpheight = cmapsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
//FIXME: gl_max_size
|
||||||
|
|
||||||
VectorCopy(r_refdef.viewangles, saveang);
|
VectorCopy(r_refdef.viewangles, saveang);
|
||||||
saveang[2] = 0;
|
saveang[2] = 0;
|
||||||
|
|
||||||
|
@ -1539,6 +1550,7 @@ qboolean R_RenderScene_Cubemap(void)
|
||||||
ang[1][1] = 90;
|
ang[1][1] = 90;
|
||||||
ang[1][2] = saveang[0];
|
ang[1][2] = saveang[0];
|
||||||
ang[5][0] = -saveang[0]*2;
|
ang[5][0] = -saveang[0]*2;
|
||||||
|
|
||||||
//in theory, we could use a geometry shader to duplicate the polygons to each face.
|
//in theory, we could use a geometry shader to duplicate the polygons to each face.
|
||||||
//that would of course require that every bit of glsl had such a geometry shader.
|
//that would of course require that every bit of glsl had such a geometry shader.
|
||||||
//it would at least reduce cpu load quite a bit.
|
//it would at least reduce cpu load quite a bit.
|
||||||
|
@ -1547,23 +1559,37 @@ qboolean R_RenderScene_Cubemap(void)
|
||||||
if (!(facemask & (1<<i)))
|
if (!(facemask & (1<<i)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (usefbo)
|
||||||
|
{
|
||||||
|
int r = GLBE_FBO_Update(&fbostate, FBO_RB_DEPTH, &scenepp_postproc_cube, 1, r_nulltex, cmapsize, cmapsize, i);
|
||||||
|
if (oldfbo < 0)
|
||||||
|
oldfbo = r;
|
||||||
|
}
|
||||||
|
|
||||||
r_refdef.fov_x = 90;
|
r_refdef.fov_x = 90;
|
||||||
r_refdef.fov_y = 90;
|
r_refdef.fov_y = 90;
|
||||||
r_refdef.viewangles[0] = saveang[0]+ang[i][0];
|
r_refdef.viewangles[0] = saveang[0]+ang[i][0];
|
||||||
r_refdef.viewangles[1] = saveang[1]+ang[i][1];
|
r_refdef.viewangles[1] = saveang[1]+ang[i][1];
|
||||||
r_refdef.viewangles[2] = saveang[2]+ang[i][2];
|
r_refdef.viewangles[2] = saveang[2]+ang[i][2];
|
||||||
|
|
||||||
R_Clear (false);
|
R_Clear (usefbo);
|
||||||
|
if (r_clear.ival)
|
||||||
|
qglClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
GL_SetShaderState2D(false);
|
GL_SetShaderState2D(false);
|
||||||
|
|
||||||
// render normal view
|
// render normal view
|
||||||
R_RenderScene ();
|
R_RenderScene ();
|
||||||
|
|
||||||
|
if (!usefbo)
|
||||||
|
{
|
||||||
GL_MTBind(0, GL_TEXTURE_CUBE_MAP_ARB, scenepp_postproc_cube);
|
GL_MTBind(0, GL_TEXTURE_CUBE_MAP_ARB, scenepp_postproc_cube);
|
||||||
//FIXME: use a render target instead.
|
|
||||||
qglCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + i, 0, 0, 0, 0, vid.pixelheight - (prect.y + cmapsize), cmapsize, cmapsize);
|
qglCopyTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB + i, 0, 0, 0, 0, vid.pixelheight - (prect.y + cmapsize), cmapsize, cmapsize);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (usefbo)
|
||||||
|
GLBE_FBO_Pop(oldfbo);
|
||||||
|
|
||||||
r_refdef.vrect = vrect;
|
r_refdef.vrect = vrect;
|
||||||
r_refdef.pxrect = prect;
|
r_refdef.pxrect = prect;
|
||||||
|
@ -1614,7 +1640,7 @@ texid_t R_RenderPostProcess (texid_t sourcetex, int type, shader_t *shader, char
|
||||||
int w = (r_refdef.vrect.width * vid.pixelwidth) / vid.width;
|
int w = (r_refdef.vrect.width * vid.pixelwidth) / vid.width;
|
||||||
int h = (r_refdef.vrect.height * vid.pixelheight) / vid.height;
|
int h = (r_refdef.vrect.height * vid.pixelheight) / vid.height;
|
||||||
sourcetex = R2D_RT_Configure(restexname, w, h, TF_RGBA32);
|
sourcetex = R2D_RT_Configure(restexname, w, h, TF_RGBA32);
|
||||||
GLBE_FBO_Update(&fbo_postproc, 0, &sourcetex, 1, r_nulltex, w, h);
|
GLBE_FBO_Update(&fbo_postproc, 0, &sourcetex, 1, r_nulltex, w, h, 0);
|
||||||
R2D_ScalePic(0, vid.pixelheight-r_refdef.vrect.height, r_refdef.vrect.width, r_refdef.vrect.height, scenepp_waterwarp);
|
R2D_ScalePic(0, vid.pixelheight-r_refdef.vrect.height, r_refdef.vrect.width, r_refdef.vrect.height, scenepp_waterwarp);
|
||||||
GLBE_RenderToTextureUpdate2d(true);
|
GLBE_RenderToTextureUpdate2d(true);
|
||||||
}
|
}
|
||||||
|
@ -1745,7 +1771,7 @@ void GLR_RenderView (void)
|
||||||
flags |= FBO_TEX_DEPTH;
|
flags |= FBO_TEX_DEPTH;
|
||||||
else
|
else
|
||||||
flags |= FBO_RB_DEPTH;
|
flags |= FBO_RB_DEPTH;
|
||||||
GLBE_FBO_Update(&fbo_gameview, flags, col, mrt, depth, vid.fbpwidth, vid.fbpheight);
|
GLBE_FBO_Update(&fbo_gameview, flags, col, mrt, depth, vid.fbpwidth, vid.fbpheight, 0);
|
||||||
}
|
}
|
||||||
else if (r_refdef.flags & (RDF_ALLPOSTPROC))
|
else if (r_refdef.flags & (RDF_ALLPOSTPROC))
|
||||||
{
|
{
|
||||||
|
@ -1755,7 +1781,7 @@ void GLR_RenderView (void)
|
||||||
|
|
||||||
sourcetex = R2D_RT_Configure("rt/$lastgameview", vid.fbpwidth, vid.fbpheight, /*(r_refdef.flags&RDF_BLOOM)?TF_RGBA16F:*/TF_RGBA32);
|
sourcetex = R2D_RT_Configure("rt/$lastgameview", vid.fbpwidth, vid.fbpheight, /*(r_refdef.flags&RDF_BLOOM)?TF_RGBA16F:*/TF_RGBA32);
|
||||||
|
|
||||||
GLBE_FBO_Update(&fbo_gameview, FBO_RB_DEPTH, &sourcetex, 1, r_nulltex, vid.fbpwidth, vid.fbpheight);
|
GLBE_FBO_Update(&fbo_gameview, FBO_RB_DEPTH, &sourcetex, 1, r_nulltex, vid.fbpwidth, vid.fbpheight, 0);
|
||||||
dofbo = true;
|
dofbo = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -3207,7 +3207,7 @@ void Sh_DrawCrepuscularLight(dlight_t *dl, float *colours)
|
||||||
|
|
||||||
BE_Scissor(NULL);
|
BE_Scissor(NULL);
|
||||||
|
|
||||||
oldfbo = GLBE_FBO_Update(&crepuscular_fbo, FBO_RB_DEPTH, &crepuscular_texture_id, 1, r_nulltex, vid.pixelwidth, vid.pixelheight);
|
oldfbo = GLBE_FBO_Update(&crepuscular_fbo, FBO_RB_DEPTH, &crepuscular_texture_id, 1, r_nulltex, vid.pixelwidth, vid.pixelheight, 0);
|
||||||
|
|
||||||
GL_ForceDepthWritable();
|
GL_ForceDepthWritable();
|
||||||
// qglClearColor(0, 0, 0, 1);
|
// qglClearColor(0, 0, 0, 1);
|
||||||
|
|
|
@ -721,7 +721,7 @@ void GLBE_FBO_Sources(texid_t sourcecolour, texid_t sourcedepth);
|
||||||
int GLBE_FBO_Push(fbostate_t *state);
|
int GLBE_FBO_Push(fbostate_t *state);
|
||||||
void GLBE_FBO_Pop(int oldfbo);
|
void GLBE_FBO_Pop(int oldfbo);
|
||||||
void GLBE_FBO_Destroy(fbostate_t *state);
|
void GLBE_FBO_Destroy(fbostate_t *state);
|
||||||
int GLBE_FBO_Update(fbostate_t *state, unsigned int enables, texid_t *destcol, int colourbuffers, texid_t destdepth, int width, int height);
|
int GLBE_FBO_Update(fbostate_t *state, unsigned int enables, texid_t *destcol, int colourbuffers, texid_t destdepth, int width, int height, int layer);
|
||||||
#endif
|
#endif
|
||||||
#ifdef D3D9QUAKE
|
#ifdef D3D9QUAKE
|
||||||
void D3D9BE_Init(void);
|
void D3D9BE_Init(void);
|
||||||
|
|
|
@ -3373,7 +3373,7 @@ pbool VARGS QCC_PR_PrintWarning (int type, const char *file, int line, const cha
|
||||||
if (type >= ERR_PARSEERRORS)
|
if (type >= ERR_PARSEERRORS)
|
||||||
{
|
{
|
||||||
if (!file || !*file)
|
if (!file || !*file)
|
||||||
printf ("error%s: %s\n", wnam, string);
|
printf (":: error%s: %s\n", wnam, string);
|
||||||
else if (flag_msvcstyle)
|
else if (flag_msvcstyle)
|
||||||
printf ("%s(%i) : error%s: %s\n", file, line, wnam, string);
|
printf ("%s(%i) : error%s: %s\n", file, line, wnam, string);
|
||||||
else
|
else
|
||||||
|
@ -3383,7 +3383,7 @@ pbool VARGS QCC_PR_PrintWarning (int type, const char *file, int line, const cha
|
||||||
else if (qccwarningaction[type] == 2)
|
else if (qccwarningaction[type] == 2)
|
||||||
{ //-werror
|
{ //-werror
|
||||||
if (!file || !*file)
|
if (!file || !*file)
|
||||||
printf ("werror%s: %s\n", wnam, string);
|
printf (": werror%s: %s\n", wnam, string);
|
||||||
else if (flag_msvcstyle)
|
else if (flag_msvcstyle)
|
||||||
printf ("%s(%i) : werror%s: %s\n", file, line, wnam, string);
|
printf ("%s(%i) : werror%s: %s\n", file, line, wnam, string);
|
||||||
else
|
else
|
||||||
|
@ -3393,7 +3393,7 @@ pbool VARGS QCC_PR_PrintWarning (int type, const char *file, int line, const cha
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!file || !*file)
|
if (!file || !*file)
|
||||||
printf ("warning%s: %s\n", wnam, string);
|
printf (": warning%s: %s\n", wnam, string);
|
||||||
else if (flag_msvcstyle)
|
else if (flag_msvcstyle)
|
||||||
printf ("%s(%i) : warning%s: %s\n", file, line, wnam, string);
|
printf ("%s(%i) : warning%s: %s\n", file, line, wnam, string);
|
||||||
else
|
else
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
#define EMBEDDEBUG
|
#define EMBEDDEBUG
|
||||||
|
|
||||||
void AddSourceFile(char *format, ...);
|
void AddSourceFile(const char *parentsrc, const char *filename);
|
||||||
void GUI_ParseCommandLine(char *args);
|
void GUI_ParseCommandLine(char *args);
|
||||||
void GUI_RevealOptions(void);
|
void GUI_RevealOptions(void);
|
||||||
|
|
||||||
|
@ -331,10 +331,7 @@ int PDECL QCC_PopFileSize (const char *fname)
|
||||||
int len = QCC_RawFileSize(fname);
|
int len = QCC_RawFileSize(fname);
|
||||||
if (len >= 0 && qcc_compileactive)
|
if (len >= 0 && qcc_compileactive)
|
||||||
{
|
{
|
||||||
if (strcmp(compilingrootfile, fname))
|
AddSourceFile(compilingrootfile, fname);
|
||||||
AddSourceFile("%s/%s", compilingrootfile, fname);
|
|
||||||
else
|
|
||||||
AddSourceFile("%s", fname);
|
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
@ -4096,7 +4093,7 @@ int GUIprintf(const char *msg, ...)
|
||||||
char rn[3] = "\n";
|
char rn[3] = "\n";
|
||||||
char *st, *s;
|
char *st, *s;
|
||||||
int args;
|
int args;
|
||||||
MSG wmsg;
|
// MSG wmsg;
|
||||||
|
|
||||||
DWORD col;
|
DWORD col;
|
||||||
|
|
||||||
|
@ -4141,7 +4138,7 @@ int GUIprintf(const char *msg, ...)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strstr(buf, ": error"))
|
if (strstr(buf, ": error") || strstr(buf, ": werror"))
|
||||||
{
|
{
|
||||||
if (outstatus < 2)
|
if (outstatus < 2)
|
||||||
{
|
{
|
||||||
|
@ -4336,11 +4333,12 @@ void RunCompiler(char *args, pbool quick)
|
||||||
else
|
else
|
||||||
logfile = NULL;
|
logfile = NULL;
|
||||||
|
|
||||||
|
if (outputbox)
|
||||||
SendMessage(outputbox, WM_SETREDRAW, FALSE, 0);
|
SendMessage(outputbox, WM_SETREDRAW, FALSE, 0);
|
||||||
|
|
||||||
argc = GUI_BuildParms(args, argv, quick);
|
argc = GUI_BuildParms(args, argv, quick);
|
||||||
|
|
||||||
if (CompileParams(&funcs, compilecb, argc, argv))
|
if (CompileParams(&funcs, outputbox?compilecb:NULL, argc, argv))
|
||||||
{
|
{
|
||||||
if (!quick)
|
if (!quick)
|
||||||
{
|
{
|
||||||
|
@ -4350,8 +4348,11 @@ void RunCompiler(char *args, pbool quick)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (outputbox)
|
||||||
|
{
|
||||||
SendMessage(outputbox, WM_SETREDRAW, TRUE, 0);
|
SendMessage(outputbox, WM_SETREDRAW, TRUE, 0);
|
||||||
RedrawWindow(outputbox, NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
|
RedrawWindow(outputbox, NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
|
||||||
|
}
|
||||||
|
|
||||||
if (logfile)
|
if (logfile)
|
||||||
fclose(logfile);
|
fclose(logfile);
|
||||||
|
@ -4457,20 +4458,19 @@ void GrepAllFiles(char *string)
|
||||||
else
|
else
|
||||||
GUIprintf("grep found nothing\n");
|
GUIprintf("grep found nothing\n");
|
||||||
}
|
}
|
||||||
void AddSourceFile(char *format, ...)
|
void AddSourceFile(const char *parentpath, const char *filename)
|
||||||
{
|
{
|
||||||
va_list argptr;
|
|
||||||
char string[1024];
|
char string[1024];
|
||||||
|
|
||||||
|
unsigned int flags = 0;
|
||||||
|
|
||||||
HANDLE pi;
|
HANDLE pi;
|
||||||
TVINSERTSTRUCT item;
|
TVINSERTSTRUCT item;
|
||||||
TV_ITEM parent;
|
TV_ITEM parent;
|
||||||
char parentstring[256];
|
char parentstring[256];
|
||||||
char *slash;
|
char *slash;
|
||||||
|
|
||||||
va_start (argptr, format);
|
QC_strlcpy(string, filename, sizeof(string));
|
||||||
vsnprintf (string,sizeof(string)-1, format,argptr);
|
|
||||||
va_end (argptr);
|
|
||||||
|
|
||||||
|
|
||||||
memset(&item, 0, sizeof(item));
|
memset(&item, 0, sizeof(item));
|
||||||
|
@ -4482,12 +4482,41 @@ void AddSourceFile(char *format, ...)
|
||||||
item.item.state = TVIS_EXPANDED;
|
item.item.state = TVIS_EXPANDED;
|
||||||
item.item.stateMask = TVIS_EXPANDED;
|
item.item.stateMask = TVIS_EXPANDED;
|
||||||
item.item.mask = TVIF_TEXT|TVIF_STATE|TVIF_PARAM;
|
item.item.mask = TVIF_TEXT|TVIF_STATE|TVIF_PARAM;
|
||||||
|
|
||||||
|
if (parentpath && stricmp(parentpath, filename))
|
||||||
|
{
|
||||||
|
item.hParent = TreeView_GetChild(projecttree, item.hParent);
|
||||||
|
do
|
||||||
|
{
|
||||||
|
parent.hItem = item.hParent;
|
||||||
|
parent.mask = TVIF_TEXT;
|
||||||
|
parent.pszText = parentstring;
|
||||||
|
parent.cchTextMax = sizeof(parentstring)-1;
|
||||||
|
if (TreeView_GetItem(projecttree, &parent))
|
||||||
|
{
|
||||||
|
if (!stricmp(parent.pszText, parentpath))
|
||||||
|
{
|
||||||
|
pi = item.hParent;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while(item.hParent=TreeView_GetNextSibling(projecttree, item.hParent));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
parentpath = NULL;
|
||||||
|
|
||||||
while(item.item.pszText)
|
while(item.item.pszText)
|
||||||
|
{
|
||||||
|
if (parentpath)
|
||||||
{
|
{
|
||||||
slash = strchr(item.item.pszText, '/');
|
slash = strchr(item.item.pszText, '/');
|
||||||
if (slash)
|
if (slash)
|
||||||
*slash++ = '\0';
|
*slash++ = '\0';
|
||||||
item.hParent = TreeView_GetChild(projecttree, item.hParent);
|
}
|
||||||
|
else
|
||||||
|
slash = NULL;
|
||||||
|
|
||||||
|
item.hParent = TreeView_GetChild(projecttree, pi);
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
parent.hItem = item.hParent;
|
parent.hItem = item.hParent;
|
||||||
|
@ -4500,10 +4529,11 @@ void AddSourceFile(char *format, ...)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while(item.hParent=TreeView_GetNextSibling(projecttree, item.hParent));
|
} while(item.hParent=TreeView_GetNextSibling(projecttree, item.hParent));
|
||||||
|
|
||||||
if (!item.hParent)
|
if (!item.hParent)
|
||||||
{ //add a directory.
|
{ //add a directory.
|
||||||
item.hParent = pi;
|
item.hParent = pi;
|
||||||
item.item.lParam = !slash;
|
item.item.lParam = !slash; //lparam = false if we're only adding this node to get at a child.
|
||||||
pi = (HANDLE)SendMessage(projecttree,TVM_INSERTITEM,0,(LPARAM)&item);
|
pi = (HANDLE)SendMessage(projecttree,TVM_INSERTITEM,0,(LPARAM)&item);
|
||||||
item.hParent = pi;
|
item.hParent = pi;
|
||||||
}
|
}
|
||||||
|
@ -4548,15 +4578,15 @@ void SetProgsSrc(void)
|
||||||
if (*qcc_token == '#')
|
if (*qcc_token == '#')
|
||||||
{
|
{
|
||||||
//aaaahhh! newstyle!
|
//aaaahhh! newstyle!
|
||||||
AddSourceFile("%s", progssrcname);
|
AddSourceFile(NULL, progssrcname);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pr_file_p = QCC_COM_Parse(pr_file_p); //we dont care about the produced progs.dat
|
pr_file_p = QCC_COM_Parse(pr_file_p); //we dont care about the produced progs.dat
|
||||||
AddSourceFile("%s", progssrcname);
|
AddSourceFile(NULL, progssrcname);
|
||||||
while(pr_file_p)
|
while(pr_file_p)
|
||||||
{
|
{
|
||||||
AddSourceFile("%s/%s", progssrcname, qcc_token);
|
AddSourceFile(progssrcname, qcc_token);
|
||||||
pr_file_p = QCC_COM_Parse(pr_file_p); //we dont care about the produced progs.dat
|
pr_file_p = QCC_COM_Parse(pr_file_p); //we dont care about the produced progs.dat
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,15 +57,17 @@ QCC_def_t *sourcefilesdefs[MAXSOURCEFILESLIST];
|
||||||
int sourcefilesnumdefs;
|
int sourcefilesnumdefs;
|
||||||
int currentsourcefile;
|
int currentsourcefile;
|
||||||
int numsourcefiles;
|
int numsourcefiles;
|
||||||
extern char *compilingfile;
|
extern char *compilingfile; //file currently being compiled
|
||||||
char compilingrootfile[1024];
|
char compilingrootfile[1024]; //the .src file we started from (the current one, not original)
|
||||||
|
|
||||||
|
char qccmsourcedir[1024]; //the -src path, for #includes
|
||||||
|
|
||||||
void QCC_PR_ResetErrorScope(void);
|
void QCC_PR_ResetErrorScope(void);
|
||||||
|
|
||||||
pbool compressoutput;
|
pbool compressoutput;
|
||||||
|
|
||||||
pbool newstylesource;
|
pbool newstylesource;
|
||||||
char destfile[1024];
|
char destfile[1024]; //the file we're going to output to
|
||||||
|
|
||||||
QCC_eval_t *qcc_pr_globals;
|
QCC_eval_t *qcc_pr_globals;
|
||||||
unsigned int numpr_globals;
|
unsigned int numpr_globals;
|
||||||
|
@ -760,15 +762,19 @@ int WriteBodylessFuncs (int handle)
|
||||||
|
|
||||||
void QCC_DetermineNeededSymbols(QCC_def_t *endsyssym)
|
void QCC_DetermineNeededSymbols(QCC_def_t *endsyssym)
|
||||||
{
|
{
|
||||||
QCC_def_t *sym;
|
QCC_def_t *sym = pr.def_head.next;
|
||||||
size_t i;
|
size_t i;
|
||||||
//make sure system defs are not hurt by this.
|
//make sure system defs are not hurt by this.
|
||||||
for (sym = pr.def_head.next; sym; sym = sym->next)
|
if (endsyssym)
|
||||||
|
{
|
||||||
|
for (; sym; sym = sym->next)
|
||||||
{
|
{
|
||||||
sym->used = true;
|
sym->used = true;
|
||||||
|
sym->referenced = true; //silence warnings about unreferenced things that can't be stripped
|
||||||
if (sym == endsyssym)
|
if (sym == endsyssym)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
//non-system fields should maybe be present too.
|
//non-system fields should maybe be present too.
|
||||||
for (; sym; sym = sym->next)
|
for (; sym; sym = sym->next)
|
||||||
{
|
{
|
||||||
|
@ -1573,8 +1579,10 @@ strofs = (strofs+3)&~3;
|
||||||
printf(" %s)\n", QCC_VarAtOffset(statements[i].c, 1));
|
printf(" %s)\n", QCC_VarAtOffset(statements[i].c, 1));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if ((signed)a >= (signed)numpr_globals || (signed)b >= (signed)numpr_globals || (signed)c >= (signed)numpr_globals)
|
#ifdef _DEBUG
|
||||||
printf("invalid offset\n");
|
if (((signed)a >= (signed)numpr_globals && statements[i].a.sym) || ((signed)b >= (signed)numpr_globals && statements[i].b.sym) || ((signed)c >= (signed)numpr_globals && statements[i].c.sym))
|
||||||
|
printf("invalid offset on %s instruction\n", pr_opcodes[statements[i].op].opname);
|
||||||
|
#endif
|
||||||
if (a < 0)
|
if (a < 0)
|
||||||
statements16[i].a = PRLittleShort(a);
|
statements16[i].a = PRLittleShort(a);
|
||||||
else
|
else
|
||||||
|
@ -2674,10 +2682,10 @@ unsigned short QCC_PR_WriteProgdefs (char *filename)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 32401:
|
case 32401:
|
||||||
QCC_PR_Warning(WARN_SYSTEMCRC, NULL, 0, "Warning: please update your tenebrae system defs.\n");
|
QCC_PR_Warning(WARN_SYSTEMCRC, NULL, 0, "please update your tenebrae system defs.\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
QCC_PR_Warning(WARN_SYSTEMCRC, NULL, 0, "Warning: progs CRC not recognised from quake nor clones\n");
|
QCC_PR_Warning(WARN_SYSTEMCRC, NULL, 0, "progs CRC not recognised from quake nor clones\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3328,7 +3336,6 @@ char *qccmsrc;
|
||||||
char *qccmsrc2;
|
char *qccmsrc2;
|
||||||
char qccmfilename[1024];
|
char qccmfilename[1024];
|
||||||
char qccmprogsdat[1024];
|
char qccmprogsdat[1024];
|
||||||
char qccmsourcedir[1024];
|
|
||||||
|
|
||||||
void QCC_FinishCompile(void);
|
void QCC_FinishCompile(void);
|
||||||
|
|
||||||
|
@ -3502,6 +3509,65 @@ int QCC_FindQCFiles(const char *sourcedir)
|
||||||
return numfiles;
|
return numfiles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void QCC_GenerateRelativePath(char *dest, size_t destsize, char *base, char *relative)
|
||||||
|
{
|
||||||
|
int p;
|
||||||
|
char *s1, *s2;
|
||||||
|
QC_strlcpy (dest, base, destsize);
|
||||||
|
s1 = strchr(dest, '\\');
|
||||||
|
s2 = strchr(dest, '/');
|
||||||
|
if (s2 > s1)
|
||||||
|
s1 = s2;
|
||||||
|
if (s1)
|
||||||
|
*s1 = 0;
|
||||||
|
else
|
||||||
|
*dest = 0;
|
||||||
|
|
||||||
|
p=0;
|
||||||
|
s2 = relative;
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
if (!strncmp(s2, "./", 2))
|
||||||
|
s2+=2;
|
||||||
|
else if(!strncmp(s2, "../", 3))
|
||||||
|
{
|
||||||
|
s2+=3;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (s1=dest+strlen(dest)-1;p && s1>=dest; s1--)
|
||||||
|
{
|
||||||
|
if (*s1 == '/' || *s1 == '\\')
|
||||||
|
{
|
||||||
|
*s1 = '\0';
|
||||||
|
p--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (*dest)
|
||||||
|
{
|
||||||
|
if (p)
|
||||||
|
{ //we were still looking for a separator, but didn't find one, so kill the entire path.
|
||||||
|
QC_strlcpy(dest, "", destsize);
|
||||||
|
p--;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
QC_strlcat(dest, "/", destsize);
|
||||||
|
}
|
||||||
|
QC_strlcat(dest, s2, destsize);
|
||||||
|
|
||||||
|
while (p>0 && strlen(dest)+3 < destsize)
|
||||||
|
{
|
||||||
|
memmove(dest+3, dest, strlen(dest)+1);
|
||||||
|
dest[0] = '.';
|
||||||
|
dest[1] = '.';
|
||||||
|
dest[2] = '/';
|
||||||
|
p--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int qcc_compileactive = false;
|
int qcc_compileactive = false;
|
||||||
extern int accglobalsblock;
|
extern int accglobalsblock;
|
||||||
char *originalqccmsrc; //for autoprototype.
|
char *originalqccmsrc; //for autoprototype.
|
||||||
|
@ -3514,9 +3580,6 @@ pbool QCC_main (int argc, char **argv) //as part of the quake engine
|
||||||
int p;
|
int p;
|
||||||
extern int qccpersisthunk;
|
extern int qccpersisthunk;
|
||||||
|
|
||||||
#ifndef QCCONLY
|
|
||||||
char destfile2[1024], *s2;
|
|
||||||
#endif
|
|
||||||
char *s;
|
char *s;
|
||||||
|
|
||||||
if (numsourcefiles && currentsourcefile == numsourcefiles)
|
if (numsourcefiles && currentsourcefile == numsourcefiles)
|
||||||
|
@ -3894,41 +3957,8 @@ newstyle:
|
||||||
|
|
||||||
if (!qccmsrc)
|
if (!qccmsrc)
|
||||||
QCC_Error (ERR_NOOUTPUT, "No destination filename. qcc -help for info.");
|
QCC_Error (ERR_NOOUTPUT, "No destination filename. qcc -help for info.");
|
||||||
strcpy (destfile, qcc_token);
|
|
||||||
|
|
||||||
#ifndef QCCONLY
|
QCC_GenerateRelativePath(destfile, sizeof(destfile), qccmprogsdat, qcc_token);
|
||||||
p=0;
|
|
||||||
s2 = strcpy(destfile2, destfile);
|
|
||||||
if (!strncmp(s2, "./", 2))
|
|
||||||
s2+=2;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
while(!strncmp(s2, "../", 3))
|
|
||||||
{
|
|
||||||
s2+=3;
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
strcpy(qccmfilename, qccmsourcedir);
|
|
||||||
for (s=qccmfilename+strlen(qccmfilename);p && s>=qccmfilename; s--)
|
|
||||||
{
|
|
||||||
if (*s == '/' || *s == '\\')
|
|
||||||
{
|
|
||||||
*(s+1) = '\0';
|
|
||||||
p--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sprintf(destfile, "%s", s2);
|
|
||||||
|
|
||||||
while (p>0)
|
|
||||||
{
|
|
||||||
memmove(destfile+3, destfile, strlen(destfile)+1);
|
|
||||||
destfile[0] = '.';
|
|
||||||
destfile[1] = '.';
|
|
||||||
destfile[2] = '/';
|
|
||||||
p--;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
p = QCC_CheckParm ("-o");
|
p = QCC_CheckParm ("-o");
|
||||||
if (p > 0 && p < argc-1 && argv[p+1][0] != '-')
|
if (p > 0 && p < argc-1 && argv[p+1][0] != '-')
|
||||||
|
@ -3977,7 +4007,6 @@ void new_QCC_ContinueCompile(void);
|
||||||
//called between exe frames - won't loose net connection (is the theory)...
|
//called between exe frames - won't loose net connection (is the theory)...
|
||||||
void QCC_ContinueCompile(void)
|
void QCC_ContinueCompile(void)
|
||||||
{
|
{
|
||||||
char *s, *s2;
|
|
||||||
currentchunk = NULL;
|
currentchunk = NULL;
|
||||||
if (!qcc_compileactive)
|
if (!qcc_compileactive)
|
||||||
//HEY!
|
//HEY!
|
||||||
|
@ -4032,38 +4061,8 @@ void QCC_ContinueCompile(void)
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
s = qcc_token;
|
QCC_GenerateRelativePath(qccmfilename, sizeof(qccmfilename), compilingrootfile, qcc_token);
|
||||||
|
|
||||||
strcpy (qccmfilename, qccmsourcedir);
|
|
||||||
while(1)
|
|
||||||
{
|
|
||||||
if (!strncmp(s, "..\\", 3) || !strncmp(s, "../", 3))
|
|
||||||
{
|
|
||||||
s2 = qccmfilename + strlen(qccmfilename)-2;
|
|
||||||
while (s2>=qccmfilename)
|
|
||||||
{
|
|
||||||
if (*s2 == '/' || *s2 == '\\')
|
|
||||||
{
|
|
||||||
s2[1] = '\0';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
s2--;
|
|
||||||
}
|
|
||||||
if (s2>=qccmfilename)
|
|
||||||
{
|
|
||||||
s+=3;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!strncmp(s, ".\\", 2) || !strncmp(s, "./", 2))
|
|
||||||
{
|
|
||||||
s+=2;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
strcat (qccmfilename, s);
|
|
||||||
if (autoprototype)
|
if (autoprototype)
|
||||||
printf ("prototyping %s\n", qccmfilename);
|
printf ("prototyping %s\n", qccmfilename);
|
||||||
else
|
else
|
||||||
|
@ -4118,6 +4117,9 @@ void QCC_FinishCompile(void)
|
||||||
// write progdefs.h
|
// write progdefs.h
|
||||||
crc = QCC_PR_WriteProgdefs ("progdefs.h");
|
crc = QCC_PR_WriteProgdefs ("progdefs.h");
|
||||||
|
|
||||||
|
if (pr_error_count)
|
||||||
|
QCC_Error (ERR_PARSEERRORS, "compilation errors");
|
||||||
|
|
||||||
// write data file
|
// write data file
|
||||||
donesomething = QCC_WriteData (crc);
|
donesomething = QCC_WriteData (crc);
|
||||||
|
|
||||||
|
|
|
@ -685,6 +685,7 @@ void SV_DropClient (client_t *drop)
|
||||||
if (drop->controlled)
|
if (drop->controlled)
|
||||||
{
|
{
|
||||||
drop->controlled->controller = NULL;
|
drop->controlled->controller = NULL;
|
||||||
|
drop->controlled->protocol = SCP_BAD; //with the controller dead, make sure we don't try sending anything to it
|
||||||
SV_DropClient(drop->controlled);
|
SV_DropClient(drop->controlled);
|
||||||
drop->controlled = NULL;
|
drop->controlled = NULL;
|
||||||
}
|
}
|
||||||
|
@ -2904,11 +2905,17 @@ client_t *SVC_DirectConnect(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
//only advertise PEXT_SPLITSCREEN when splitscreen is allowed, to avoid spam. this might mean people need to reconnect after its enabled. oh well.
|
//only advertise PEXT_SPLITSCREEN when splitscreen is allowed, to avoid spam. this might mean people need to reconnect after its enabled. oh well.
|
||||||
if (!sv_allow_splitscreen.ival)
|
if (!sv_allow_splitscreen.ival && newcl->netchan.remote_address.type != NA_LOOPBACK)
|
||||||
|
{
|
||||||
newcl->fteprotocolextensions &= ~PEXT_SPLITSCREEN;
|
newcl->fteprotocolextensions &= ~PEXT_SPLITSCREEN;
|
||||||
|
if (numssclients > 1)
|
||||||
|
SV_PrintToClient(newcl, PRINT_HIGH, "Splitscreen is disabled on this server\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
for (clients = 1; clients < numssclients; clients++)
|
for (clients = 1; clients < numssclients; clients++)
|
||||||
SV_AddSplit(newcl, userinfo[clients], clients);
|
SV_AddSplit(newcl, userinfo[clients], clients);
|
||||||
|
}
|
||||||
#if 0
|
#if 0
|
||||||
for (clients = 1; clients < numssclients; clients++)
|
for (clients = 1; clients < numssclients; clients++)
|
||||||
{
|
{
|
||||||
|
@ -3285,6 +3292,7 @@ qboolean SV_ConnectionlessPacket (void)
|
||||||
SVC_ACK ();
|
SVC_ACK ();
|
||||||
else if (!strcmp(c,"status"))
|
else if (!strcmp(c,"status"))
|
||||||
{
|
{
|
||||||
|
if (sv_public.ival >= 0)
|
||||||
if (SVC_ThrottleInfo())
|
if (SVC_ThrottleInfo())
|
||||||
SVC_Status ();
|
SVC_Status ();
|
||||||
}
|
}
|
||||||
|
@ -3296,6 +3304,7 @@ qboolean SV_ConnectionlessPacket (void)
|
||||||
#ifdef Q2SERVER
|
#ifdef Q2SERVER
|
||||||
else if (!strcmp(c, "info"))
|
else if (!strcmp(c, "info"))
|
||||||
{
|
{
|
||||||
|
if (sv_public.ival >= 0)
|
||||||
if (SVC_ThrottleInfo())
|
if (SVC_ThrottleInfo())
|
||||||
SVC_InfoQ2 ();
|
SVC_InfoQ2 ();
|
||||||
}
|
}
|
||||||
|
@ -3346,11 +3355,13 @@ qboolean SV_ConnectionlessPacket (void)
|
||||||
/*for DP*/
|
/*for DP*/
|
||||||
else if (!strcmp(c, "getstatus"))
|
else if (!strcmp(c, "getstatus"))
|
||||||
{
|
{
|
||||||
|
if (sv_public.ival >= 0)
|
||||||
if (SVC_ThrottleInfo())
|
if (SVC_ThrottleInfo())
|
||||||
SVC_GetInfo(Cmd_Args(), true);
|
SVC_GetInfo(Cmd_Args(), true);
|
||||||
}
|
}
|
||||||
else if (!strcmp(c, "getinfo"))
|
else if (!strcmp(c, "getinfo"))
|
||||||
{
|
{
|
||||||
|
if (sv_public.ival >= 0)
|
||||||
if (SVC_ThrottleInfo())
|
if (SVC_ThrottleInfo())
|
||||||
SVC_GetInfo(Cmd_Args(), false);
|
SVC_GetInfo(Cmd_Args(), false);
|
||||||
}
|
}
|
||||||
|
@ -3570,6 +3581,8 @@ qboolean SVNQ_ConnectionlessPacket(void)
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
case CCREQ_SERVER_INFO:
|
case CCREQ_SERVER_INFO:
|
||||||
|
if (sv_public.ival < 0)
|
||||||
|
return false;
|
||||||
if (SV_BannedReason (&net_from))
|
if (SV_BannedReason (&net_from))
|
||||||
return false;
|
return false;
|
||||||
if (Q_strcmp (MSG_ReadString(), NQ_NETCHAN_GAMENAME) != 0)
|
if (Q_strcmp (MSG_ReadString(), NQ_NETCHAN_GAMENAME) != 0)
|
||||||
|
@ -3598,6 +3611,8 @@ qboolean SVNQ_ConnectionlessPacket(void)
|
||||||
NET_SendPacket(NS_SERVER, sb.cursize, sb.data, &net_from);
|
NET_SendPacket(NS_SERVER, sb.cursize, sb.data, &net_from);
|
||||||
return true;
|
return true;
|
||||||
case CCREQ_PLAYER_INFO:
|
case CCREQ_PLAYER_INFO:
|
||||||
|
if (sv_public.ival < 0)
|
||||||
|
return false;
|
||||||
if (SV_BannedReason (&net_from))
|
if (SV_BannedReason (&net_from))
|
||||||
return false;
|
return false;
|
||||||
/*one request per player, ouch ouch ouch, what will it make of 32 players, I wonder*/
|
/*one request per player, ouch ouch ouch, what will it make of 32 players, I wonder*/
|
||||||
|
@ -3628,6 +3643,8 @@ qboolean SVNQ_ConnectionlessPacket(void)
|
||||||
NET_SendPacket(NS_SERVER, sb.cursize, sb.data, &net_from);
|
NET_SendPacket(NS_SERVER, sb.cursize, sb.data, &net_from);
|
||||||
return true;
|
return true;
|
||||||
case CCREQ_RULE_INFO:
|
case CCREQ_RULE_INFO:
|
||||||
|
if (sv_public.ival < 0)
|
||||||
|
return false;
|
||||||
if (SV_BannedReason (&net_from))
|
if (SV_BannedReason (&net_from))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue