Fix chasecam to deal with the viewmodel change... Also attempt to push it away from walls in a not-so-much-of-a-wallhack kind of way.

This commit is contained in:
Shpoike 2023-07-26 11:18:06 +01:00
parent 06a1f39d43
commit 6394ea27e8
8 changed files with 26 additions and 21 deletions

View File

@ -48,14 +48,25 @@ TraceLine
TODO: impact on bmodels, monsters TODO: impact on bmodels, monsters
============== ==============
*/ */
void TraceLine (vec3_t start, vec3_t end, vec3_t impact) void TraceLine (vec3_t start, vec3_t end, float pushoff, vec3_t impact)
{ {
trace_t trace; trace_t trace;
memset (&trace, 0, sizeof(trace)); memset (&trace, 0, sizeof(trace));
trace.fraction = 1;
trace.allsolid = true;
VectorCopy (end, trace.endpos);
SV_RecursiveHullCheck (cl.worldmodel->hulls, start, end, &trace, CONTENTMASK_ANYSOLID); SV_RecursiveHullCheck (cl.worldmodel->hulls, start, end, &trace, CONTENTMASK_ANYSOLID);
VectorCopy (trace.endpos, impact); VectorCopy (trace.endpos, impact);
if (pushoff && trace.fraction < 1) //push away from the impact plane by the distance specified, so our camera's near clip plane does not intersect the wall.
{
vec3_t dir;
VectorSubtract(start, end, dir);
pushoff = pushoff / DotProduct(dir, trace.plane.normal); //distance needs to be bigger if the trace is co-planar to the surface
VectorMA(impact, pushoff, dir, impact);
}
} }
/* /*
@ -91,28 +102,26 @@ void Chase_UpdateForDrawing (void)
// calc ideal camera location before checking for walls // calc ideal camera location before checking for walls
for (i=0 ; i<3 ; i++) for (i=0 ; i<3 ; i++)
ideal[i] = cl.viewent.origin[i] ideal[i] = r_refdef.vieworg[i]
- forward[i]*chase_back.value - forward[i]*chase_back.value
+ right[i]*chase_right.value; + right[i]*chase_right.value;
//+ up[i]*chase_up.value; //+ up[i]*chase_up.value;
ideal[2] = cl.viewent.origin[2] + chase_up.value; ideal[2] = r_refdef.vieworg[2] + chase_up.value;
// make sure camera is not in or behind a wall // make sure camera is not in or behind a wall
TraceLine(r_refdef.vieworg, ideal, temp); TraceLine(r_refdef.vieworg, ideal, NEARCLIP, ideal);
if (VectorLength(temp) != 0)
VectorCopy(temp, ideal); // find the spot the player is looking at
VectorMA (r_refdef.vieworg, 1<<20, forward, temp);
TraceLine (r_refdef.vieworg, temp, 0, crosshair);
// place camera // place camera
VectorCopy (ideal, r_refdef.vieworg); VectorCopy (ideal, r_refdef.vieworg);
// find the spot the player is looking at
VectorMA (cl.viewent.origin, 1<<20, forward, temp);
TraceLine (cl.viewent.origin, temp, crosshair);
// calculate camera angles to look at the same spot // calculate camera angles to look at the same spot
VectorSubtract (crosshair, r_refdef.vieworg, temp); VectorSubtract (crosshair, r_refdef.vieworg, temp);
VectorAngles (temp, NULL, r_refdef.viewangles); VectorAngles (temp, NULL, r_refdef.viewangles);
if (r_refdef.viewangles[PITCH] == 90 || r_refdef.viewangles[PITCH] == -90) if (r_refdef.viewangles[PITCH] >= 89.9 || r_refdef.viewangles[PITCH] <= -89.9)
r_refdef.viewangles[YAW] = cl.viewangles[YAW]; r_refdef.viewangles[YAW] = cl.viewangles[YAW];
} }

View File

@ -1389,7 +1389,7 @@ void CL_Tracepos_f (void)
return; return;
VectorMA(r_refdef.vieworg, 8192.0, vpn, v); VectorMA(r_refdef.vieworg, 8192.0, vpn, v);
TraceLine(r_refdef.vieworg, v, w); TraceLine(r_refdef.vieworg, v, 0, w);
if (VectorLength(w) == 0) if (VectorLength(w) == 0)
Con_Printf ("Tracepos: trace didn't hit anything\n"); Con_Printf ("Tracepos: trace didn't hit anything\n");

View File

@ -471,7 +471,7 @@ float CL_TraceLine (vec3_t start, vec3_t end, vec3_t impact, vec3_t normal, int
extern cvar_t chase_active; extern cvar_t chase_active;
void Chase_Init (void); void Chase_Init (void);
void TraceLine (vec3_t start, vec3_t end, vec3_t impact); void TraceLine (vec3_t start, vec3_t end, float pushoff, vec3_t impact);
void Chase_UpdateForClient (void); //johnfitz void Chase_UpdateForClient (void); //johnfitz
void Chase_UpdateForDrawing (void); //johnfitz void Chase_UpdateForDrawing (void); //johnfitz

View File

@ -453,7 +453,6 @@ void R_SetFrustum (float fovx, float fovy)
GL_SetFrustum -- johnfitz -- written to replace MYgluPerspective GL_SetFrustum -- johnfitz -- written to replace MYgluPerspective
============= =============
*/ */
#define NEARCLIP 4
float frustum_skew = 0.0; //used by r_stereo float frustum_skew = 0.0; //used by r_stereo
/*void GL_SetFrustum(float fovx, float fovy) /*void GL_SetFrustum(float fovx, float fovy)
{ {

View File

@ -31,7 +31,6 @@ extern cvar_t r_clearcolor;
extern cvar_t r_drawflat; extern cvar_t r_drawflat;
extern cvar_t r_flatlightstyles; extern cvar_t r_flatlightstyles;
extern cvar_t gl_fullbrights; extern cvar_t gl_fullbrights;
extern cvar_t gl_farclip;
extern cvar_t gl_overbright; extern cvar_t gl_overbright;
extern cvar_t gl_overbright_models; extern cvar_t gl_overbright_models;
extern cvar_t r_waterwarp; extern cvar_t r_waterwarp;

View File

@ -46,7 +46,6 @@ char skybox_name[1024]; //name of current skybox, or "" if no skybox
gltexture_t *skybox_textures[6]; gltexture_t *skybox_textures[6];
gltexture_t *solidskytexture, *alphaskytexture; gltexture_t *solidskytexture, *alphaskytexture;
extern cvar_t gl_farclip;
cvar_t r_fastsky = {"r_fastsky", "0", CVAR_NONE}; cvar_t r_fastsky = {"r_fastsky", "0", CVAR_NONE};
cvar_t r_sky_quality = {"r_sky_quality", "12", CVAR_NONE}; cvar_t r_sky_quality = {"r_sky_quality", "12", CVAR_NONE};
cvar_t r_skyalpha = {"r_skyalpha", "1", CVAR_NONE}; cvar_t r_skyalpha = {"r_skyalpha", "1", CVAR_NONE};

View File

@ -154,6 +154,9 @@ extern refdef_t r_refdef;
extern mleaf_t *r_viewleaf, *r_oldviewleaf; extern mleaf_t *r_viewleaf, *r_oldviewleaf;
extern int d_lightstylevalue[MAX_LIGHTSTYLES]; // 8.8 fraction of base light value extern int d_lightstylevalue[MAX_LIGHTSTYLES]; // 8.8 fraction of base light value
extern cvar_t gl_farclip;
#define NEARCLIP 4
extern cvar_t r_norefresh; extern cvar_t r_norefresh;
extern cvar_t r_drawentities; extern cvar_t r_drawentities;
extern cvar_t r_drawworld; extern cvar_t r_drawworld;

View File

@ -6945,14 +6945,10 @@ static void PF_cl_getproperty(void)
G_FLOAT(OFS_RETURN+0) = viewprops.drawcrosshair; G_FLOAT(OFS_RETURN+0) = viewprops.drawcrosshair;
break; break;
case VF_MINDIST: case VF_MINDIST:
#define NEARCLIP 4
G_FLOAT(OFS_RETURN+0) = NEARCLIP; G_FLOAT(OFS_RETURN+0) = NEARCLIP;
break; break;
case VF_MAXDIST: //maxdist case VF_MAXDIST: //maxdist
{
extern cvar_t gl_farclip;
G_FLOAT(OFS_RETURN+0) = gl_farclip.value; G_FLOAT(OFS_RETURN+0) = gl_farclip.value;
}
break; break;
case VF_CL_VIEWANGLES: //viewangles hack case VF_CL_VIEWANGLES: //viewangles hack