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_SetStatInt (0, i, j);
|
||||
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:
|
||||
{
|
||||
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_HaveKills(void);
|
||||
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);
|
||||
void Stats_NewMap(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)
|
||||
{
|
||||
|
@ -678,8 +678,8 @@ int qm_strcmp(char *s1, char *s2)//not like strcmp at all...
|
|||
}
|
||||
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;
|
||||
while(*s1)
|
||||
|
|
|
@ -2369,15 +2369,38 @@ static qboolean Image_ReadDDSFile(texid_t tex, unsigned int flags, char *fname,
|
|||
divsize = 4;
|
||||
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;
|
||||
pad = 8;
|
||||
divsize = 4;
|
||||
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;
|
||||
pad = 8;
|
||||
divsize = 4;
|
||||
|
@ -3128,14 +3151,20 @@ static void Image_RoundDimensions(int *scaled_width, int *scaled_height, unsigne
|
|||
|
||||
if (flags & IF_NOMIPMAP)
|
||||
{
|
||||
*scaled_width >>= gl_picmip2d.ival;
|
||||
*scaled_height >>= gl_picmip2d.ival;
|
||||
if (gl_picmip2d.ival > 0)
|
||||
{
|
||||
*scaled_width >>= gl_picmip2d.ival;
|
||||
*scaled_height >>= gl_picmip2d.ival;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
TRACE(("dbg: GL_RoundDimensions: %f\n", gl_picmip.value));
|
||||
*scaled_width >>= gl_picmip.ival;
|
||||
*scaled_height >>= gl_picmip.ival;
|
||||
if (gl_picmip.ival > 0)
|
||||
{
|
||||
TRACE(("dbg: GL_RoundDimensions: %f\n", gl_picmip.value));
|
||||
*scaled_width >>= gl_picmip.ival;
|
||||
*scaled_height >>= gl_picmip.ival;
|
||||
}
|
||||
}
|
||||
|
||||
TRACE(("dbg: GL_RoundDimensions: %f\n", gl_max_size.value));
|
||||
|
|
|
@ -350,7 +350,7 @@ void SV_Master_Heartbeat (void)
|
|||
int i;
|
||||
qboolean enabled;
|
||||
|
||||
if (!sv_public.ival || SSV_IsSubServer())
|
||||
if (sv_public.ival<=0 || SSV_IsSubServer())
|
||||
return;
|
||||
|
||||
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))
|
||||
p = R2D_SafeCachePic("no_texture");
|
||||
G_FLOAT(OFS_RETURN) = 0;
|
||||
}
|
||||
else
|
||||
G_FLOAT(OFS_RETURN) = 0;
|
||||
G_FLOAT(OFS_RETURN) = 1;
|
||||
|
||||
r2d_be_flags = PF_SelectDPDrawFlag(flag);
|
||||
R2D_ImageColours(rgb[0], rgb[1], rgb[2], alpha);
|
||||
|
|
|
@ -1708,7 +1708,7 @@ void TP_SearchForMsgTriggers (char *s, int level)
|
|||
{
|
||||
if (level == PRINT_CHAT && (
|
||||
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
|
||||
|
||||
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"
|
||||
#elif defined(NACL)
|
||||
#define PLATFORM "Nacl"
|
||||
#elif defined(_WIN32_WCE)
|
||||
#define PLATFORM "WinCE"
|
||||
#define ARCH_DL_POSTFIX ".dll"
|
||||
#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"
|
||||
#else
|
||||
#define PLATFORM "Win32"
|
||||
#endif
|
||||
#define ARCH_DL_POSTFIX ".dll"
|
||||
#elif defined(_WIN16)
|
||||
#define PLATFORM "Win16"
|
||||
#define ARCH_DL_POSTFIX ".dll"
|
||||
#elif defined(__CYGWIN__)
|
||||
#define PLATFORM "Cygwin" /*technically also windows*/
|
||||
#define ARCH_DL_POSTFIX ".dll"
|
||||
#elif defined(ANDROID)
|
||||
#elif defined(ANDROID) || defined(__ANDROID__)
|
||||
#define PLATFORM "Android" /*technically also linux*/
|
||||
#elif defined(__linux__)
|
||||
#if defined(__amd64__)
|
||||
|
@ -509,16 +517,33 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
#else
|
||||
#define PLATFORM "Linux"
|
||||
#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__)
|
||||
#define PLATFORM "FreeBSD"
|
||||
#elif defined(__OpenBSD__)
|
||||
#define PLATFORM "OpenBSD"
|
||||
#elif defined(__NetBSD__)
|
||||
#define PLATFORM "NetBSD"
|
||||
#elif defined(BSD)
|
||||
#define PLATFORM "BSD"
|
||||
#elif defined(__MORPHOS__)
|
||||
#define PLATFORM "MorphOS"
|
||||
#elif defined(__amigaos__)
|
||||
#define PLATFORM "AmigaOS"
|
||||
#elif defined(MACOSX)
|
||||
#define PLATFORM "MacOS X"
|
||||
#elif defined(__DOS__)
|
||||
#define PLATFORM "Dos"
|
||||
#else
|
||||
#define PLATFORM "Unknown"
|
||||
#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)
|
||||
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)
|
||||
hull = &model->hulls[3]; // 32x32x36 (half-life's crouch)
|
||||
else
|
||||
else if (model->hulls[1].available)
|
||||
hull = &model->hulls[1];
|
||||
else
|
||||
hull = &model->hulls[0];
|
||||
}
|
||||
else
|
||||
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_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];
|
||||
GL_ViewportUpdate();
|
||||
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_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
|
||||
{
|
||||
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];
|
||||
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_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];
|
||||
GL_ViewportUpdate();
|
||||
|
||||
|
@ -4832,7 +4832,7 @@ void GLBE_RenderToTextureUpdate2d(qboolean destchanged)
|
|||
if (*r_refdef.rt_destcolour[0].texname)
|
||||
{
|
||||
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
|
||||
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
|
||||
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,
|
||||
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++)
|
||||
qglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_TEXTURE_2D, destcol[i]->num, 0);
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
i = qglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
|
||||
if (GL_FRAMEBUFFER_COMPLETE_EXT != i)
|
||||
|
@ -5199,7 +5209,7 @@ void GLBE_DrawLightPrePass(qbyte *vis)
|
|||
}
|
||||
|
||||
/*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();
|
||||
//FIXME: should probably clear colour buffer too.
|
||||
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*/
|
||||
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);
|
||||
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)
|
||||
{
|
||||
/*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);
|
||||
qglViewport (0, 0, texwidth[0], texheight[0]);
|
||||
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
|
||||
{
|
||||
/*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);
|
||||
qglViewport (0, 0, texwidth[i], texheight[i]);
|
||||
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[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);
|
||||
qglViewport (0, 0, texwidth[i], texheight[i]);
|
||||
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[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);
|
||||
qglViewport (0, 0, texwidth[i], texheight[i]);
|
||||
BE_SelectEntity(&r_worldentity);
|
||||
|
|
|
@ -1387,6 +1387,9 @@ qboolean R_RenderScene_Cubemap(void)
|
|||
shader_t *shader;
|
||||
int facemask;
|
||||
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*/
|
||||
if (!gl_config.arb_shader_objects)
|
||||
|
@ -1494,7 +1497,7 @@ qboolean R_RenderScene_Cubemap(void)
|
|||
else
|
||||
cmapsize = prect.height;
|
||||
}
|
||||
else
|
||||
else if (!usefbo)
|
||||
{
|
||||
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);
|
||||
saveang[2] = 0;
|
||||
|
||||
|
@ -1539,6 +1550,7 @@ qboolean R_RenderScene_Cubemap(void)
|
|||
ang[1][1] = 90;
|
||||
ang[1][2] = saveang[0];
|
||||
ang[5][0] = -saveang[0]*2;
|
||||
|
||||
//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.
|
||||
//it would at least reduce cpu load quite a bit.
|
||||
|
@ -1547,24 +1559,38 @@ qboolean R_RenderScene_Cubemap(void)
|
|||
if (!(facemask & (1<<i)))
|
||||
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_y = 90;
|
||||
r_refdef.viewangles[0] = saveang[0]+ang[i][0];
|
||||
r_refdef.viewangles[1] = saveang[1]+ang[i][1];
|
||||
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);
|
||||
|
||||
// render normal view
|
||||
R_RenderScene ();
|
||||
|
||||
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);
|
||||
if (!usefbo)
|
||||
{
|
||||
GL_MTBind(0, GL_TEXTURE_CUBE_MAP_ARB, scenepp_postproc_cube);
|
||||
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.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 h = (r_refdef.vrect.height * vid.pixelheight) / vid.height;
|
||||
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);
|
||||
GLBE_RenderToTextureUpdate2d(true);
|
||||
}
|
||||
|
@ -1745,7 +1771,7 @@ void GLR_RenderView (void)
|
|||
flags |= FBO_TEX_DEPTH;
|
||||
else
|
||||
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))
|
||||
{
|
||||
|
@ -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);
|
||||
|
||||
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;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -3207,7 +3207,7 @@ void Sh_DrawCrepuscularLight(dlight_t *dl, float *colours)
|
|||
|
||||
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();
|
||||
// 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);
|
||||
void GLBE_FBO_Pop(int oldfbo);
|
||||
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
|
||||
#ifdef D3D9QUAKE
|
||||
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 (!file || !*file)
|
||||
printf ("error%s: %s\n", wnam, string);
|
||||
printf (":: error%s: %s\n", wnam, string);
|
||||
else if (flag_msvcstyle)
|
||||
printf ("%s(%i) : error%s: %s\n", file, line, wnam, string);
|
||||
else
|
||||
|
@ -3383,7 +3383,7 @@ pbool VARGS QCC_PR_PrintWarning (int type, const char *file, int line, const cha
|
|||
else if (qccwarningaction[type] == 2)
|
||||
{ //-werror
|
||||
if (!file || !*file)
|
||||
printf ("werror%s: %s\n", wnam, string);
|
||||
printf (": werror%s: %s\n", wnam, string);
|
||||
else if (flag_msvcstyle)
|
||||
printf ("%s(%i) : werror%s: %s\n", file, line, wnam, string);
|
||||
else
|
||||
|
@ -3393,7 +3393,7 @@ pbool VARGS QCC_PR_PrintWarning (int type, const char *file, int line, const cha
|
|||
else
|
||||
{
|
||||
if (!file || !*file)
|
||||
printf ("warning%s: %s\n", wnam, string);
|
||||
printf (": warning%s: %s\n", wnam, string);
|
||||
else if (flag_msvcstyle)
|
||||
printf ("%s(%i) : warning%s: %s\n", file, line, wnam, string);
|
||||
else
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
#define EMBEDDEBUG
|
||||
|
||||
void AddSourceFile(char *format, ...);
|
||||
void AddSourceFile(const char *parentsrc, const char *filename);
|
||||
void GUI_ParseCommandLine(char *args);
|
||||
void GUI_RevealOptions(void);
|
||||
|
||||
|
@ -331,10 +331,7 @@ int PDECL QCC_PopFileSize (const char *fname)
|
|||
int len = QCC_RawFileSize(fname);
|
||||
if (len >= 0 && qcc_compileactive)
|
||||
{
|
||||
if (strcmp(compilingrootfile, fname))
|
||||
AddSourceFile("%s/%s", compilingrootfile, fname);
|
||||
else
|
||||
AddSourceFile("%s", fname);
|
||||
AddSourceFile(compilingrootfile, fname);
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
@ -4096,7 +4093,7 @@ int GUIprintf(const char *msg, ...)
|
|||
char rn[3] = "\n";
|
||||
char *st, *s;
|
||||
int args;
|
||||
MSG wmsg;
|
||||
// MSG wmsg;
|
||||
|
||||
DWORD col;
|
||||
|
||||
|
@ -4141,7 +4138,7 @@ int GUIprintf(const char *msg, ...)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (strstr(buf, ": error"))
|
||||
if (strstr(buf, ": error") || strstr(buf, ": werror"))
|
||||
{
|
||||
if (outstatus < 2)
|
||||
{
|
||||
|
@ -4336,11 +4333,12 @@ void RunCompiler(char *args, pbool quick)
|
|||
else
|
||||
logfile = NULL;
|
||||
|
||||
SendMessage(outputbox, WM_SETREDRAW, FALSE, 0);
|
||||
if (outputbox)
|
||||
SendMessage(outputbox, WM_SETREDRAW, FALSE, 0);
|
||||
|
||||
argc = GUI_BuildParms(args, argv, quick);
|
||||
|
||||
if (CompileParams(&funcs, compilecb, argc, argv))
|
||||
if (CompileParams(&funcs, outputbox?compilecb:NULL, argc, argv))
|
||||
{
|
||||
if (!quick)
|
||||
{
|
||||
|
@ -4350,8 +4348,11 @@ void RunCompiler(char *args, pbool quick)
|
|||
}
|
||||
}
|
||||
|
||||
SendMessage(outputbox, WM_SETREDRAW, TRUE, 0);
|
||||
RedrawWindow(outputbox, NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
|
||||
if (outputbox)
|
||||
{
|
||||
SendMessage(outputbox, WM_SETREDRAW, TRUE, 0);
|
||||
RedrawWindow(outputbox, NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
|
||||
}
|
||||
|
||||
if (logfile)
|
||||
fclose(logfile);
|
||||
|
@ -4457,20 +4458,19 @@ void GrepAllFiles(char *string)
|
|||
else
|
||||
GUIprintf("grep found nothing\n");
|
||||
}
|
||||
void AddSourceFile(char *format, ...)
|
||||
void AddSourceFile(const char *parentpath, const char *filename)
|
||||
{
|
||||
va_list argptr;
|
||||
char string[1024];
|
||||
|
||||
unsigned int flags = 0;
|
||||
|
||||
HANDLE pi;
|
||||
TVINSERTSTRUCT item;
|
||||
TV_ITEM parent;
|
||||
char parentstring[256];
|
||||
char *slash;
|
||||
|
||||
va_start (argptr, format);
|
||||
vsnprintf (string,sizeof(string)-1, format,argptr);
|
||||
va_end (argptr);
|
||||
QC_strlcpy(string, filename, sizeof(string));
|
||||
|
||||
|
||||
memset(&item, 0, sizeof(item));
|
||||
|
@ -4482,12 +4482,41 @@ void AddSourceFile(char *format, ...)
|
|||
item.item.state = TVIS_EXPANDED;
|
||||
item.item.stateMask = TVIS_EXPANDED;
|
||||
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)
|
||||
{
|
||||
slash = strchr(item.item.pszText, '/');
|
||||
if (slash)
|
||||
*slash++ = '\0';
|
||||
item.hParent = TreeView_GetChild(projecttree, item.hParent);
|
||||
if (parentpath)
|
||||
{
|
||||
slash = strchr(item.item.pszText, '/');
|
||||
if (slash)
|
||||
*slash++ = '\0';
|
||||
}
|
||||
else
|
||||
slash = NULL;
|
||||
|
||||
item.hParent = TreeView_GetChild(projecttree, pi);
|
||||
do
|
||||
{
|
||||
parent.hItem = item.hParent;
|
||||
|
@ -4500,10 +4529,11 @@ void AddSourceFile(char *format, ...)
|
|||
break;
|
||||
}
|
||||
} while(item.hParent=TreeView_GetNextSibling(projecttree, item.hParent));
|
||||
|
||||
if (!item.hParent)
|
||||
{ //add a directory.
|
||||
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);
|
||||
item.hParent = pi;
|
||||
}
|
||||
|
@ -4548,15 +4578,15 @@ void SetProgsSrc(void)
|
|||
if (*qcc_token == '#')
|
||||
{
|
||||
//aaaahhh! newstyle!
|
||||
AddSourceFile("%s", progssrcname);
|
||||
AddSourceFile(NULL, progssrcname);
|
||||
}
|
||||
else
|
||||
{
|
||||
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)
|
||||
{
|
||||
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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -57,15 +57,17 @@ QCC_def_t *sourcefilesdefs[MAXSOURCEFILESLIST];
|
|||
int sourcefilesnumdefs;
|
||||
int currentsourcefile;
|
||||
int numsourcefiles;
|
||||
extern char *compilingfile;
|
||||
char compilingrootfile[1024];
|
||||
extern char *compilingfile; //file currently being compiled
|
||||
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);
|
||||
|
||||
pbool compressoutput;
|
||||
|
||||
pbool newstylesource;
|
||||
char destfile[1024];
|
||||
char destfile[1024]; //the file we're going to output to
|
||||
|
||||
QCC_eval_t *qcc_pr_globals;
|
||||
unsigned int numpr_globals;
|
||||
|
@ -760,14 +762,18 @@ int WriteBodylessFuncs (int handle)
|
|||
|
||||
void QCC_DetermineNeededSymbols(QCC_def_t *endsyssym)
|
||||
{
|
||||
QCC_def_t *sym;
|
||||
QCC_def_t *sym = pr.def_head.next;
|
||||
size_t i;
|
||||
//make sure system defs are not hurt by this.
|
||||
for (sym = pr.def_head.next; sym; sym = sym->next)
|
||||
if (endsyssym)
|
||||
{
|
||||
sym->used = true;
|
||||
if (sym == endsyssym)
|
||||
break;
|
||||
for (; sym; sym = sym->next)
|
||||
{
|
||||
sym->used = true;
|
||||
sym->referenced = true; //silence warnings about unreferenced things that can't be stripped
|
||||
if (sym == endsyssym)
|
||||
break;
|
||||
}
|
||||
}
|
||||
//non-system fields should maybe be present too.
|
||||
for (; sym; sym = sym->next)
|
||||
|
@ -1573,8 +1579,10 @@ strofs = (strofs+3)&~3;
|
|||
printf(" %s)\n", QCC_VarAtOffset(statements[i].c, 1));
|
||||
}
|
||||
#endif
|
||||
if ((signed)a >= (signed)numpr_globals || (signed)b >= (signed)numpr_globals || (signed)c >= (signed)numpr_globals)
|
||||
printf("invalid offset\n");
|
||||
#ifdef _DEBUG
|
||||
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)
|
||||
statements16[i].a = PRLittleShort(a);
|
||||
else
|
||||
|
@ -2674,10 +2682,10 @@ unsigned short QCC_PR_WriteProgdefs (char *filename)
|
|||
break;
|
||||
|
||||
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;
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -3328,7 +3336,6 @@ char *qccmsrc;
|
|||
char *qccmsrc2;
|
||||
char qccmfilename[1024];
|
||||
char qccmprogsdat[1024];
|
||||
char qccmsourcedir[1024];
|
||||
|
||||
void QCC_FinishCompile(void);
|
||||
|
||||
|
@ -3502,6 +3509,65 @@ int QCC_FindQCFiles(const char *sourcedir)
|
|||
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;
|
||||
extern int accglobalsblock;
|
||||
char *originalqccmsrc; //for autoprototype.
|
||||
|
@ -3514,9 +3580,6 @@ pbool QCC_main (int argc, char **argv) //as part of the quake engine
|
|||
int p;
|
||||
extern int qccpersisthunk;
|
||||
|
||||
#ifndef QCCONLY
|
||||
char destfile2[1024], *s2;
|
||||
#endif
|
||||
char *s;
|
||||
|
||||
if (numsourcefiles && currentsourcefile == numsourcefiles)
|
||||
|
@ -3894,41 +3957,8 @@ newstyle:
|
|||
|
||||
if (!qccmsrc)
|
||||
QCC_Error (ERR_NOOUTPUT, "No destination filename. qcc -help for info.");
|
||||
strcpy (destfile, qcc_token);
|
||||
|
||||
#ifndef QCCONLY
|
||||
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
|
||||
QCC_GenerateRelativePath(destfile, sizeof(destfile), qccmprogsdat, qcc_token);
|
||||
|
||||
p = QCC_CheckParm ("-o");
|
||||
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)...
|
||||
void QCC_ContinueCompile(void)
|
||||
{
|
||||
char *s, *s2;
|
||||
currentchunk = NULL;
|
||||
if (!qcc_compileactive)
|
||||
//HEY!
|
||||
|
@ -4032,38 +4061,8 @@ void QCC_ContinueCompile(void)
|
|||
}
|
||||
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)
|
||||
printf ("prototyping %s\n", qccmfilename);
|
||||
else
|
||||
|
@ -4118,6 +4117,9 @@ void QCC_FinishCompile(void)
|
|||
// write progdefs.h
|
||||
crc = QCC_PR_WriteProgdefs ("progdefs.h");
|
||||
|
||||
if (pr_error_count)
|
||||
QCC_Error (ERR_PARSEERRORS, "compilation errors");
|
||||
|
||||
// write data file
|
||||
donesomething = QCC_WriteData (crc);
|
||||
|
||||
|
|
|
@ -685,6 +685,7 @@ void SV_DropClient (client_t *drop)
|
|||
if (drop->controlled)
|
||||
{
|
||||
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);
|
||||
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.
|
||||
if (!sv_allow_splitscreen.ival)
|
||||
if (!sv_allow_splitscreen.ival && newcl->netchan.remote_address.type != NA_LOOPBACK)
|
||||
{
|
||||
newcl->fteprotocolextensions &= ~PEXT_SPLITSCREEN;
|
||||
|
||||
for (clients = 1; clients < numssclients; clients++)
|
||||
SV_AddSplit(newcl, userinfo[clients], clients);
|
||||
if (numssclients > 1)
|
||||
SV_PrintToClient(newcl, PRINT_HIGH, "Splitscreen is disabled on this server\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
for (clients = 1; clients < numssclients; clients++)
|
||||
SV_AddSplit(newcl, userinfo[clients], clients);
|
||||
}
|
||||
#if 0
|
||||
for (clients = 1; clients < numssclients; clients++)
|
||||
{
|
||||
|
@ -3285,8 +3292,9 @@ qboolean SV_ConnectionlessPacket (void)
|
|||
SVC_ACK ();
|
||||
else if (!strcmp(c,"status"))
|
||||
{
|
||||
if (SVC_ThrottleInfo())
|
||||
SVC_Status ();
|
||||
if (sv_public.ival >= 0)
|
||||
if (SVC_ThrottleInfo())
|
||||
SVC_Status ();
|
||||
}
|
||||
else if (!strcmp(c,"log"))
|
||||
{
|
||||
|
@ -3296,8 +3304,9 @@ qboolean SV_ConnectionlessPacket (void)
|
|||
#ifdef Q2SERVER
|
||||
else if (!strcmp(c, "info"))
|
||||
{
|
||||
if (SVC_ThrottleInfo())
|
||||
SVC_InfoQ2 ();
|
||||
if (sv_public.ival >= 0)
|
||||
if (SVC_ThrottleInfo())
|
||||
SVC_InfoQ2 ();
|
||||
}
|
||||
#endif
|
||||
else if (!strncmp(c,"connect", 7))
|
||||
|
@ -3346,13 +3355,15 @@ qboolean SV_ConnectionlessPacket (void)
|
|||
/*for DP*/
|
||||
else if (!strcmp(c, "getstatus"))
|
||||
{
|
||||
if (SVC_ThrottleInfo())
|
||||
SVC_GetInfo(Cmd_Args(), true);
|
||||
if (sv_public.ival >= 0)
|
||||
if (SVC_ThrottleInfo())
|
||||
SVC_GetInfo(Cmd_Args(), true);
|
||||
}
|
||||
else if (!strcmp(c, "getinfo"))
|
||||
{
|
||||
if (SVC_ThrottleInfo())
|
||||
SVC_GetInfo(Cmd_Args(), false);
|
||||
if (sv_public.ival >= 0)
|
||||
if (SVC_ThrottleInfo())
|
||||
SVC_GetInfo(Cmd_Args(), false);
|
||||
}
|
||||
#endif
|
||||
else if (!strcmp(c, "rcon"))
|
||||
|
@ -3570,6 +3581,8 @@ qboolean SVNQ_ConnectionlessPacket(void)
|
|||
}
|
||||
return true;
|
||||
case CCREQ_SERVER_INFO:
|
||||
if (sv_public.ival < 0)
|
||||
return false;
|
||||
if (SV_BannedReason (&net_from))
|
||||
return false;
|
||||
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);
|
||||
return true;
|
||||
case CCREQ_PLAYER_INFO:
|
||||
if (sv_public.ival < 0)
|
||||
return false;
|
||||
if (SV_BannedReason (&net_from))
|
||||
return false;
|
||||
/*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);
|
||||
return true;
|
||||
case CCREQ_RULE_INFO:
|
||||
if (sv_public.ival < 0)
|
||||
return false;
|
||||
if (SV_BannedReason (&net_from))
|
||||
return false;
|
||||
|
||||
|
|
Loading…
Reference in a new issue