mirror of https://github.com/nzp-team/fteqw.git
write lightstyle changes into mvds.
don't add 'mapname' (for q3 compat) unless we actually need that in the serverinfo for q3 gamecode. fix bloom only blooming sideways. clean up R2D_RT_Configure's arguments to use TF_ constants properly, without gumming up qc apis. make InitFlyby more readable. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4782 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
2dbad9574c
commit
9602ae7247
|
@ -192,98 +192,45 @@ static qboolean Cam_IsVisible(vec3_t playerorigin, vec3_t vec)
|
|||
|
||||
static qboolean InitFlyby(playerview_t *pv, vec3_t selforigin, vec3_t playerorigin, vec3_t playerviewangles, int checkvis)
|
||||
{
|
||||
float f, max;
|
||||
vec3_t vec, vec2;
|
||||
vec3_t dirs[] = {
|
||||
{1,1,1},
|
||||
{1,-1,1},
|
||||
{1,1,0},
|
||||
{1,-1,1},
|
||||
{1,0,1},
|
||||
{1,0,-1},
|
||||
{-1,1,1},
|
||||
{-1,-1,1},
|
||||
{-1,0,0},
|
||||
{1,0,0},
|
||||
{0,0,-1},
|
||||
{0,0,1}
|
||||
};
|
||||
int dir;
|
||||
float f, max;
|
||||
vec3_t vec, vec2;
|
||||
vec3_t forward, right, up;
|
||||
|
||||
VectorCopy(playerviewangles, vec);
|
||||
vec[0] = 0;
|
||||
vec[0] = 0;
|
||||
AngleVectors (vec, forward, right, up);
|
||||
// for (i = 0; i < 3; i++)
|
||||
// forward[i] *= 3;
|
||||
|
||||
max = 1000;
|
||||
VectorAdd(forward, up, vec2);
|
||||
VectorAdd(vec2, right, vec2);
|
||||
if ((f = Cam_TryFlyby(selforigin, playerorigin, vec2, checkvis)) < max)
|
||||
max = 1000;
|
||||
for (dir = 0; dir < sizeof(dirs)/sizeof(dirs[0]); dir++)
|
||||
{
|
||||
max = f;
|
||||
VectorCopy(vec2, vec);
|
||||
}
|
||||
VectorAdd(forward, up, vec2);
|
||||
VectorSubtract(vec2, right, vec2);
|
||||
if ((f = Cam_TryFlyby(selforigin, playerorigin, vec2, checkvis)) < max)
|
||||
{
|
||||
max = f;
|
||||
VectorCopy(vec2, vec);
|
||||
}
|
||||
VectorAdd(forward, right, vec2);
|
||||
if ((f = Cam_TryFlyby(selforigin, playerorigin, vec2, checkvis)) < max)
|
||||
{
|
||||
max = f;
|
||||
VectorCopy(vec2, vec);
|
||||
}
|
||||
VectorSubtract(forward, right, vec2);
|
||||
if ((f = Cam_TryFlyby(selforigin, playerorigin, vec2, checkvis)) < max)
|
||||
{
|
||||
max = f;
|
||||
VectorCopy(vec2, vec);
|
||||
}
|
||||
VectorAdd(forward, up, vec2);
|
||||
if ((f = Cam_TryFlyby(selforigin, playerorigin, vec2, checkvis)) < max)
|
||||
{
|
||||
max = f;
|
||||
VectorCopy(vec2, vec);
|
||||
}
|
||||
VectorSubtract(forward, up, vec2);
|
||||
if ((f = Cam_TryFlyby(selforigin, playerorigin, vec2, checkvis)) < max)
|
||||
{
|
||||
max = f;
|
||||
VectorCopy(vec2, vec);
|
||||
}
|
||||
VectorAdd(up, right, vec2);
|
||||
VectorSubtract(vec2, forward, vec2);
|
||||
if ((f = Cam_TryFlyby(selforigin, playerorigin, vec2, checkvis)) < max)
|
||||
{
|
||||
max = f;
|
||||
VectorCopy(vec2, vec);
|
||||
}
|
||||
VectorSubtract(up, right, vec2);
|
||||
VectorSubtract(vec2, forward, vec2);
|
||||
if ((f = Cam_TryFlyby(selforigin, playerorigin, vec2, checkvis)) < max)
|
||||
{
|
||||
max = f;
|
||||
VectorCopy(vec2, vec);
|
||||
}
|
||||
// invert
|
||||
VectorNegate(forward, vec2);
|
||||
if ((f = Cam_TryFlyby(selforigin, playerorigin, vec2, checkvis)) < max)
|
||||
{
|
||||
max = f;
|
||||
VectorCopy(vec2, vec);
|
||||
}
|
||||
VectorCopy(forward, vec2);
|
||||
if ((f = Cam_TryFlyby(selforigin, playerorigin, vec2, checkvis)) < max)
|
||||
{
|
||||
max = f;
|
||||
VectorCopy(vec2, vec);
|
||||
}
|
||||
// invert
|
||||
VectorNegate(right, vec2);
|
||||
if ((f = Cam_TryFlyby(selforigin, playerorigin, vec2, checkvis)) < max)
|
||||
{
|
||||
max = f;
|
||||
VectorCopy(vec2, vec);
|
||||
}
|
||||
VectorCopy(right, vec2);
|
||||
if ((f = Cam_TryFlyby(selforigin, playerorigin, vec2, checkvis)) < max)
|
||||
{
|
||||
max = f;
|
||||
VectorCopy(vec2, vec);
|
||||
}
|
||||
|
||||
VectorScale(forward, dirs[dir][0], vec2);
|
||||
VectorMA(vec2, dirs[dir][1], right, vec2);
|
||||
VectorMA(vec2, dirs[dir][2], up, vec2);
|
||||
if ((f = Cam_TryFlyby(selforigin, playerorigin, vec2, checkvis)) < max)
|
||||
{
|
||||
max = f;
|
||||
VectorCopy(vec2, vec);
|
||||
}
|
||||
}
|
||||
// ack, can't find him
|
||||
if (max >= 1000)
|
||||
if (max >= 1000)
|
||||
{
|
||||
// Cam_Unlock();
|
||||
return false;
|
||||
|
@ -422,7 +369,7 @@ void Cam_Track(playerview_t *pv, usercmd_t *cmd)
|
|||
player = frame->playerstate + pv->cam_spec_track;
|
||||
self = frame->playerstate + pv->playernum;
|
||||
|
||||
if (!pv->cam_locked || !Cam_IsVisible(player->origin, pv->cam_desired_position))
|
||||
if (!cl_chasecam.value && (!pv->cam_locked || !Cam_IsVisible(player->origin, pv->cam_desired_position)))
|
||||
{
|
||||
if (!pv->cam_locked || realtime - pv->cam_lastviewtime > 0.1)
|
||||
{
|
||||
|
|
|
@ -1359,6 +1359,8 @@ void CL_ClearState (void)
|
|||
cl.playerview[i].maxspeed = 320;
|
||||
cl.playerview[i].entgravity = 1;
|
||||
}
|
||||
for (i = 0; i < MAX_CLIENTS; i++)
|
||||
cl.players[i].stats[STAT_VIEWHEIGHT] = cl.players[i].statsf[STAT_VIEWHEIGHT] = DEFAULT_VIEWHEIGHT;
|
||||
cl.minpitch = -70;
|
||||
cl.maxpitch = 80;
|
||||
|
||||
|
|
|
@ -922,6 +922,7 @@ void CL_PredictMovePNum (int seat)
|
|||
extern cvar_t cl_chasecam;
|
||||
if (!cl_chasecam.ival)
|
||||
{
|
||||
//FIXME: don't early out, so that we can smooth out angles too
|
||||
VectorCopy(pv->cam_desired_position, pv->simorg);
|
||||
VectorClear(pv->simvel);
|
||||
return;
|
||||
|
|
|
@ -3386,6 +3386,7 @@ static qboolean Image_GenMip0(struct pendingtextureinfo *mips, unsigned int flag
|
|||
BZ_Free(rawdata);
|
||||
return false;
|
||||
}
|
||||
mips->encoding = (fmt==TF_RGBA16F)?PTI_RGBA16F:TF_RGBA32F;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -269,6 +269,9 @@ struct pendingtextureinfo
|
|||
PTI_ARGB4444, //16bit format (d3d)
|
||||
PTI_RGBA5551, //16bit alpha format (gl).
|
||||
PTI_ARGB1555, //16bit alpha format (d3d).
|
||||
//floating point formats
|
||||
PTI_RGBA16F,
|
||||
PTI_RGBA32F,
|
||||
//compressed formats
|
||||
PTI_S3RGB1,
|
||||
PTI_S3RGBA1,
|
||||
|
|
|
@ -1434,7 +1434,19 @@ void QCBUILTIN PF_R_GetViewFlag(pubprogfuncs_t *prinst, struct globalvars_s *pr_
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static uploadfmt_t PR_TranslateTextureFormat(int qcformat)
|
||||
{
|
||||
switch(qcformat)
|
||||
{
|
||||
case 1: return TF_RGBA32;
|
||||
case 2: return TF_RGBA16F;
|
||||
case 3: return TF_RGBA32F;
|
||||
case 4: return TF_DEPTH16;
|
||||
case 5: return TF_DEPTH24;
|
||||
case 6: return TF_DEPTH32;
|
||||
default:return TF_INVALID;
|
||||
}
|
||||
}
|
||||
void QCBUILTIN PF_R_SetViewFlag(pubprogfuncs_t *prinst, struct globalvars_s *pr_globals)
|
||||
{
|
||||
viewflags parametertype = G_FLOAT(OFS_PARM0);
|
||||
|
@ -1585,7 +1597,7 @@ void QCBUILTIN PF_R_SetViewFlag(pubprogfuncs_t *prinst, struct globalvars_s *pr_
|
|||
{
|
||||
float fmt = G_FLOAT(OFS_PARM2);
|
||||
float *size = G_VECTOR(OFS_PARM3);
|
||||
R2D_RT_Configure(r_refdef.rt_destcolour[i].texname, size[0], size[1], fmt);
|
||||
R2D_RT_Configure(r_refdef.rt_destcolour[i].texname, size[0], size[1], PR_TranslateTextureFormat(fmt));
|
||||
}
|
||||
BE_RenderToTextureUpdate2d(true);
|
||||
}
|
||||
|
@ -1596,7 +1608,7 @@ void QCBUILTIN PF_R_SetViewFlag(pubprogfuncs_t *prinst, struct globalvars_s *pr_
|
|||
{
|
||||
float fmt = G_FLOAT(OFS_PARM2);
|
||||
float *size = G_VECTOR(OFS_PARM3);
|
||||
R2D_RT_Configure(r_refdef.rt_sourcecolour.texname, size[0], size[1], fmt);
|
||||
R2D_RT_Configure(r_refdef.rt_sourcecolour.texname, size[0], size[1], PR_TranslateTextureFormat(fmt));
|
||||
}
|
||||
BE_RenderToTextureUpdate2d(false);
|
||||
break;
|
||||
|
@ -1606,7 +1618,7 @@ void QCBUILTIN PF_R_SetViewFlag(pubprogfuncs_t *prinst, struct globalvars_s *pr_
|
|||
{
|
||||
float fmt = G_FLOAT(OFS_PARM2);
|
||||
float *size = G_VECTOR(OFS_PARM3);
|
||||
R2D_RT_Configure(r_refdef.rt_depth.texname, size[0], size[1], fmt);
|
||||
R2D_RT_Configure(r_refdef.rt_depth.texname, size[0], size[1], PR_TranslateTextureFormat(fmt));
|
||||
}
|
||||
BE_RenderToTextureUpdate2d(false);
|
||||
break;
|
||||
|
@ -1616,7 +1628,7 @@ void QCBUILTIN PF_R_SetViewFlag(pubprogfuncs_t *prinst, struct globalvars_s *pr_
|
|||
{
|
||||
float fmt = G_FLOAT(OFS_PARM2);
|
||||
float *size = G_VECTOR(OFS_PARM3);
|
||||
R2D_RT_Configure(r_refdef.rt_ripplemap.texname, size[0], size[1], fmt);
|
||||
R2D_RT_Configure(r_refdef.rt_ripplemap.texname, size[0], size[1], PR_TranslateTextureFormat(fmt));
|
||||
}
|
||||
BE_RenderToTextureUpdate2d(false);
|
||||
break;
|
||||
|
|
|
@ -1332,16 +1332,6 @@ texid_t R2D_RT_Configure(const char *id, int width, int height, uploadfmt_t rtfm
|
|||
|
||||
if (rtfmt)
|
||||
{
|
||||
switch(rtfmt)
|
||||
{
|
||||
case 1: rtfmt = TF_RGBA32; break;
|
||||
case 2: rtfmt = TF_RGBA16F; break;
|
||||
case 3: rtfmt = TF_RGBA32F; break;
|
||||
case 4: rtfmt = TF_DEPTH16; break;
|
||||
case 5: rtfmt = TF_DEPTH24; break;
|
||||
case 6: rtfmt = TF_DEPTH32; break;
|
||||
default:rtfmt = TF_INVALID; break;
|
||||
}
|
||||
Image_Upload(tid, rtfmt, NULL, NULL, width, height, RT_IMAGEFLAGS);
|
||||
tid->width = width;
|
||||
tid->height = height;
|
||||
|
|
|
@ -176,7 +176,7 @@ void D3D11_ApplyRenderTargets(qboolean usedepth)
|
|||
if (*r_refdef.rt_depth.texname)
|
||||
depth = R2D_RT_GetTexture(r_refdef.rt_depth.texname, &width, &height);
|
||||
else
|
||||
depth = R2D_RT_Configure("depth", width, height, 5);
|
||||
depth = R2D_RT_Configure("depth", width, height, TF_DEPTH24);
|
||||
}
|
||||
else
|
||||
depth = NULL;
|
||||
|
|
|
@ -52,7 +52,7 @@ static shader_t *bloomrescale;
|
|||
static shader_t *bloomblur;
|
||||
static shader_t *bloomfinal;
|
||||
|
||||
#define MAXLEVELS 3
|
||||
#define MAXLEVELS 3 //presumably this could be up to 16, but that will be too expensive.
|
||||
texid_t pingtex[2][MAXLEVELS];
|
||||
fbostate_t fbo_bloom;
|
||||
static int scrwidth, scrheight;
|
||||
|
@ -222,6 +222,7 @@ void R_BloomBlend (texid_t source, int x, int y, int w, int h)
|
|||
GLBE_FBO_Update(&fbo_bloom, 0, &pingtex[1][i], 1, r_nulltex, 0, 0);
|
||||
GLBE_FBO_Sources(pingtex[0][i], r_nulltex);
|
||||
qglViewport (0, 0, texwidth[i], texheight[i]);
|
||||
BE_SelectEntity(&r_worldentity);
|
||||
R2D_ScalePic(0, vid.height, vid.width, -(int)vid.height, bloomblur);
|
||||
|
||||
r_worldentity.glowmod[0] = 0;
|
||||
|
@ -229,6 +230,7 @@ void R_BloomBlend (texid_t source, int x, int y, int w, int h)
|
|||
GLBE_FBO_Update(&fbo_bloom, 0, &pingtex[0][i], 1, r_nulltex, 0, 0);
|
||||
GLBE_FBO_Sources(pingtex[1][i], r_nulltex);
|
||||
qglViewport (0, 0, texwidth[i], texheight[i]);
|
||||
BE_SelectEntity(&r_worldentity);
|
||||
R2D_ScalePic(0, vid.height, vid.width, -(int)vid.height, bloomblur);
|
||||
}
|
||||
r_worldentity.glowmod[0] = 0;
|
||||
|
|
|
@ -392,6 +392,12 @@ qboolean GL_LoadTextureMips(texid_t tex, struct pendingtextureinfo *mips)
|
|||
default:
|
||||
qglTexImage2D(targface, j, GL_RGBA, mips->mip[i].width, mips->mip[i].height, 0, GL_BGRA_EXT, GL_UNSIGNED_INT_8_8_8_8_REV, mips->mip[i].data);
|
||||
break;
|
||||
case PTI_RGBA16F:
|
||||
qglTexImage2D(targface, j, GL_RGBA16F_ARB, mips->mip[i].width, mips->mip[i].height, 0, GL_RGBA, GL_UNSIGNED_BYTE, mips->mip[i].data);
|
||||
break;
|
||||
case PTI_RGBA32F:
|
||||
qglTexImage2D(targface, j, GL_RGBA32F_ARB, mips->mip[i].width, mips->mip[i].height, 0, GL_RGBA, GL_UNSIGNED_BYTE, mips->mip[i].data);
|
||||
break;
|
||||
//16bit formats
|
||||
case PTI_RGBA4444:
|
||||
qglTexImage2D(targface, j, GL_RGBA, mips->mip[i].width, mips->mip[i].height, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, mips->mip[i].data);
|
||||
|
|
|
@ -1683,7 +1683,7 @@ void GLR_RenderView (void)
|
|||
vid.fbvwidth = vid.fbpwidth = (r_refdef.vrect.width * vid.pixelwidth) / vid.width;
|
||||
vid.fbvheight = vid.fbpheight = (r_refdef.vrect.height * vid.pixelheight) / vid.height;
|
||||
|
||||
sourcetex = R2D_RT_Configure("rt/$lastgameview", vid.fbpwidth, vid.fbpheight, 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);
|
||||
dofbo = true;
|
||||
|
|
|
@ -666,7 +666,7 @@ static texid_t Shader_FindImage ( char *name, int flags )
|
|||
return r_whiteimage;
|
||||
}
|
||||
if (flags & IF_RENDERTARGET)
|
||||
return R2D_RT_Configure(name, 0, 0, 0);
|
||||
return R2D_RT_Configure(name, 0, 0, TF_INVALID);
|
||||
return R_LoadHiResTexture(name, NULL, flags);
|
||||
}
|
||||
|
||||
|
|
|
@ -4038,13 +4038,13 @@ void QCBUILTIN PF_applylightstyle(int style, const char *val, vec3_t rgb)
|
|||
continue;
|
||||
if ( client->state == cs_spawned )
|
||||
{
|
||||
if (style >= MAX_STANDARDLIGHTSTYLES)
|
||||
if (style >= MAX_STANDARDLIGHTSTYLES) //only bug out clients if the styles are needed
|
||||
if (!*val)
|
||||
continue;
|
||||
#ifdef PEXT_LIGHTSTYLECOL
|
||||
if ((client->fteprotocolextensions & PEXT_LIGHTSTYLECOL) && (rgb[0] != 1 || rgb[1] != 1 || rgb[2] != 1))
|
||||
{
|
||||
ClientReliableWrite_Begin (client, svcfte_lightstylecol, strlen(val)+4);
|
||||
ClientReliableWrite_Begin (client, svcfte_lightstylecol, 3+6+strlen(val)+1);
|
||||
ClientReliableWrite_Byte (client, style);
|
||||
ClientReliableWrite_Char (client, 0x87);
|
||||
ClientReliableWrite_Short (client, rgb[0]*1024);
|
||||
|
@ -4053,14 +4053,38 @@ void QCBUILTIN PF_applylightstyle(int style, const char *val, vec3_t rgb)
|
|||
ClientReliableWrite_String (client, val);
|
||||
}
|
||||
else
|
||||
{
|
||||
#endif
|
||||
{
|
||||
ClientReliableWrite_Begin (client, svc_lightstyle, strlen(val)+3);
|
||||
ClientReliableWrite_Byte (client, style);
|
||||
ClientReliableWrite_String (client, val);
|
||||
#ifdef PEXT_LIGHTSTYLECOL
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (sv.mvdrecording)
|
||||
{
|
||||
if (style < MAX_STANDARDLIGHTSTYLES || *val)
|
||||
{
|
||||
sizebuf_t *msg = MVDWrite_Begin(dem_all, 0, 3+6+strlen(val)+1);
|
||||
#ifdef PEXT_LIGHTSTYLECOL
|
||||
if ((demo.recorder.fteprotocolextensions & PEXT_LIGHTSTYLECOL) && (rgb[0] != 1 || rgb[1] != 1 || rgb[2] != 1))
|
||||
{
|
||||
MSG_WriteByte (msg, svcfte_lightstylecol);
|
||||
MSG_WriteByte (msg, style);
|
||||
MSG_WriteChar (msg, 0x87);
|
||||
MSG_WriteShort (msg, rgb[0]*1024);
|
||||
MSG_WriteShort (msg, rgb[1]*1024);
|
||||
MSG_WriteShort (msg, rgb[2]*1024);
|
||||
MSG_WriteString (msg, val);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
MSG_WriteByte (msg, svc_lightstyle);
|
||||
MSG_WriteByte (msg, style);
|
||||
MSG_WriteString (msg, val);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4116,6 +4140,9 @@ static void QCBUILTIN PF_lightstylestatic (pubprogfuncs_t *prinst, struct global
|
|||
VectorCopy(G_VECTOR(OFS_PARM2), rgb);
|
||||
#endif
|
||||
|
||||
//with fte+dp, va("=%g", (num*2.0)/26) should work
|
||||
//but will break other clients. so that's a problem.
|
||||
|
||||
val[0] = 'a' + bound(0, num, ('z'-'a')-1);
|
||||
val[1] = 0;
|
||||
PF_applylightstyle(style, val, rgb);
|
||||
|
|
|
@ -1743,11 +1743,6 @@ static void SV_InitBotLib(void)
|
|||
bot_enable->flags |= CVAR_LATCH;
|
||||
Cvar_ForceSet(bot_enable, "0");
|
||||
}
|
||||
else
|
||||
{
|
||||
cvar_t *mapname = Cvar_Get("mapname", "", CVAR_SERVERINFO, "Q3 compatability");
|
||||
Cvar_Set(mapname, sv.name);
|
||||
}
|
||||
#else
|
||||
|
||||
//make sure it's switched off.
|
||||
|
@ -1783,6 +1778,12 @@ qboolean SVQ3_InitGame(void)
|
|||
if (!q3gamevm)
|
||||
return false;
|
||||
|
||||
//q3 needs mapname (while qw has map serverinfo)
|
||||
{
|
||||
cvar_t *mapname = Cvar_Get("mapname", "", CVAR_SERVERINFO, "Q3 compatability");
|
||||
Cvar_Set(mapname, sv.name);
|
||||
}
|
||||
|
||||
SV_InitBotLib();
|
||||
|
||||
World_ClearWorld(&sv.world);
|
||||
|
|
Loading…
Reference in New Issue