mirror of
https://github.com/Shpoike/Quakespasm.git
synced 2025-02-09 17:21:09 +00:00
Rework how the viewmodel is added to the scene. No more phantom viewmodels with csqc, please.
This commit is contained in:
parent
9b8573aa79
commit
2d76417807
6 changed files with 41 additions and 106 deletions
|
@ -848,6 +848,22 @@ void CL_RelinkEntities (void)
|
||||||
cl_numvisedicts++;
|
cl_numvisedicts++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// viewmodel. last, for transparency reasons.
|
||||||
|
ent = &cl.viewent;
|
||||||
|
if (r_drawviewmodel.value
|
||||||
|
&& !chase_active.value
|
||||||
|
&& cl.stats[STAT_HEALTH] > 0
|
||||||
|
&& !(cl.items & IT_INVISIBILITY)
|
||||||
|
&& ent->model)
|
||||||
|
{
|
||||||
|
if (cl_numvisedicts < cl_maxvisedicts)
|
||||||
|
{
|
||||||
|
cl_visedicts[cl_numvisedicts] = ent;
|
||||||
|
cl_numvisedicts++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PSET_SCRIPT
|
#ifdef PSET_SCRIPT
|
||||||
|
|
|
@ -688,6 +688,8 @@ void R_DrawEntitiesOnList (qboolean alphapass) //johnfitz -- added parameter
|
||||||
//spike -- this would be more efficient elsewhere, but its more correct here.
|
//spike -- this would be more efficient elsewhere, but its more correct here.
|
||||||
if (currententity->eflags & EFLAGS_EXTERIORMODEL)
|
if (currententity->eflags & EFLAGS_EXTERIORMODEL)
|
||||||
continue;
|
continue;
|
||||||
|
if (!currententity->model || currententity->model->needload)
|
||||||
|
continue;
|
||||||
|
|
||||||
switch (currententity->model->type)
|
switch (currententity->model->type)
|
||||||
{
|
{
|
||||||
|
@ -707,34 +709,6 @@ void R_DrawEntitiesOnList (qboolean alphapass) //johnfitz -- added parameter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
=============
|
|
||||||
R_DrawViewModel -- johnfitz -- gutted
|
|
||||||
=============
|
|
||||||
*/
|
|
||||||
void R_DrawViewModel (void)
|
|
||||||
{
|
|
||||||
if (!r_drawviewmodel.value || !r_drawentities.value || chase_active.value || skyroom_drawing/*silly depthrange*/)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (cl.items & IT_INVISIBILITY || cl.stats[STAT_HEALTH] <= 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
currententity = &cl.viewent;
|
|
||||||
if (!currententity->model)
|
|
||||||
return;
|
|
||||||
|
|
||||||
//johnfitz -- this fixes a crash
|
|
||||||
if (currententity->model->type != mod_alias)
|
|
||||||
return;
|
|
||||||
//johnfitz
|
|
||||||
|
|
||||||
// hack the depth range to prevent view model from poking into walls
|
|
||||||
glDepthRange (0, 0.3);
|
|
||||||
R_DrawAliasModel (currententity);
|
|
||||||
glDepthRange (0, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
================
|
================
|
||||||
R_EmitWirePoint -- johnfitz -- draws a wireframe cross shape for point entities
|
R_EmitWirePoint -- johnfitz -- draws a wireframe cross shape for point entities
|
||||||
|
@ -1007,8 +981,6 @@ void R_RenderScene (void)
|
||||||
|
|
||||||
Fog_DisableGFog (); //johnfitz
|
Fog_DisableGFog (); //johnfitz
|
||||||
|
|
||||||
R_DrawViewModel (); //johnfitz -- moved here from R_RenderView
|
|
||||||
|
|
||||||
R_ShowTris (); //johnfitz
|
R_ShowTris (); //johnfitz
|
||||||
|
|
||||||
R_ShowBoundingBoxes (); //johnfitz
|
R_ShowBoundingBoxes (); //johnfitz
|
||||||
|
|
|
@ -734,7 +734,7 @@ void Sky_ProcessEntities (void)
|
||||||
{
|
{
|
||||||
e = cl_visedicts[i];
|
e = cl_visedicts[i];
|
||||||
|
|
||||||
if (e->model->type != mod_brush)
|
if (!e->model || e->model->needload || e->model->type != mod_brush)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (R_CullModelForEntity(e))
|
if (R_CullModelForEntity(e))
|
||||||
|
|
|
@ -6714,10 +6714,13 @@ static void PF_cs_addentities(void)
|
||||||
|
|
||||||
if (mask & MASK_VIEWMODEL)
|
if (mask & MASK_VIEWMODEL)
|
||||||
{
|
{
|
||||||
//default viewmodel.
|
//default viewmodel. add it into the scene.
|
||||||
|
if (cl.viewent.model)
|
||||||
|
{ //make sure its relevant
|
||||||
|
cl_visedicts[cl_numvisedicts] = &cl.viewent;
|
||||||
|
cl_numvisedicts++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
static void PF_cs_addlight(void)
|
static void PF_cs_addlight(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1038,7 +1038,7 @@ void R_SetupAliasLighting (entity_t *e)
|
||||||
}
|
}
|
||||||
|
|
||||||
// minimum light value on gun (24)
|
// minimum light value on gun (24)
|
||||||
if (e == &cl.viewent)
|
if (e->eflags & EFLAGS_VIEWMODEL)
|
||||||
{
|
{
|
||||||
add = 72.0f - (lightcolor[0] + lightcolor[1] + lightcolor[2]);
|
add = 72.0f - (lightcolor[0] + lightcolor[1] + lightcolor[2]);
|
||||||
if (add > 0.0f)
|
if (add > 0.0f)
|
||||||
|
@ -1125,6 +1125,9 @@ void R_DrawAliasModel (entity_t *e)
|
||||||
|
|
||||||
if (e->eflags & EFLAGS_VIEWMODEL)
|
if (e->eflags & EFLAGS_VIEWMODEL)
|
||||||
{
|
{
|
||||||
|
if (skyroom_drawing)
|
||||||
|
return; //no viewmodels inside skyrooms!
|
||||||
|
|
||||||
//transform it relative to the view, by rebuilding the modelview matrix without the view position.
|
//transform it relative to the view, by rebuilding the modelview matrix without the view position.
|
||||||
glPushMatrix ();
|
glPushMatrix ();
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
|
@ -1132,6 +1135,10 @@ void R_DrawAliasModel (entity_t *e)
|
||||||
glRotatef (90, 0, 0, 1); // put Z going up
|
glRotatef (90, 0, 0, 1); // put Z going up
|
||||||
|
|
||||||
glDepthRange (0, 0.3);
|
glDepthRange (0, 0.3);
|
||||||
|
|
||||||
|
//FIXME: this needs to go. combine with depthrange and explicit viewmodel-only fov into a different projection matrix..
|
||||||
|
if (scr_fov.value > 90.f && cl_gun_fovscale.value)
|
||||||
|
fovscale = tan(scr_fov.value * (0.5f * M_PI / 180.f));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1147,10 +1154,6 @@ void R_DrawAliasModel (entity_t *e)
|
||||||
glPushMatrix ();
|
glPushMatrix ();
|
||||||
}
|
}
|
||||||
|
|
||||||
//FIXME: this needs to go. combine with depthrange and explicit viewmodel-only fov into a different projection matrix..
|
|
||||||
if (e == &cl.viewent && scr_fov.value > 90.f && cl_gun_fovscale.value)
|
|
||||||
fovscale = tan(scr_fov.value * (0.5f * M_PI / 180.f));
|
|
||||||
|
|
||||||
R_RotateForEntity (lerpdata.origin, lerpdata.angles, e->netstate.scale);
|
R_RotateForEntity (lerpdata.origin, lerpdata.angles, e->netstate.scale);
|
||||||
glTranslatef (paliashdr->scale_origin[0], paliashdr->scale_origin[1] * fovscale, paliashdr->scale_origin[2] * fovscale);
|
glTranslatef (paliashdr->scale_origin[0], paliashdr->scale_origin[1] * fovscale, paliashdr->scale_origin[2] * fovscale);
|
||||||
glScalef (paliashdr->scale[0], paliashdr->scale[1] * fovscale, paliashdr->scale[2] * fovscale);
|
glScalef (paliashdr->scale[0], paliashdr->scale[1] * fovscale, paliashdr->scale[2] * fovscale);
|
||||||
|
|
75
Quake/view.c
75
Quake/view.c
|
@ -606,14 +606,6 @@ void V_PolyBlend (void)
|
||||||
==============================================================================
|
==============================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
float angledelta (float a)
|
|
||||||
{
|
|
||||||
a = anglemod(a);
|
|
||||||
if (a > 180)
|
|
||||||
a -= 360;
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==================
|
==================
|
||||||
CalcGunAngle
|
CalcGunAngle
|
||||||
|
@ -621,55 +613,9 @@ CalcGunAngle
|
||||||
*/
|
*/
|
||||||
void CalcGunAngle (void)
|
void CalcGunAngle (void)
|
||||||
{
|
{
|
||||||
float yaw, pitch, move;
|
cl.viewent.angles[ROLL] = -v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value - r_refdef.viewangles[ROLL];
|
||||||
static float oldyaw = 0;
|
cl.viewent.angles[PITCH] = -v_idlescale.value * sin(cl.time*v_ipitch_cycle.value) * v_ipitch_level.value;
|
||||||
static float oldpitch = 0;
|
cl.viewent.angles[YAW] = -v_idlescale.value * sin(cl.time*v_iyaw_cycle.value) * v_iyaw_level.value;
|
||||||
|
|
||||||
yaw = r_refdef.viewangles[YAW];
|
|
||||||
pitch = -r_refdef.viewangles[PITCH];
|
|
||||||
|
|
||||||
yaw = angledelta(yaw - r_refdef.viewangles[YAW]) * 0.4;
|
|
||||||
if (yaw > 10)
|
|
||||||
yaw = 10;
|
|
||||||
if (yaw < -10)
|
|
||||||
yaw = -10;
|
|
||||||
pitch = angledelta(-pitch - r_refdef.viewangles[PITCH]) * 0.4;
|
|
||||||
if (pitch > 10)
|
|
||||||
pitch = 10;
|
|
||||||
if (pitch < -10)
|
|
||||||
pitch = -10;
|
|
||||||
move = host_frametime*20;
|
|
||||||
if (yaw > oldyaw)
|
|
||||||
{
|
|
||||||
if (oldyaw + move < yaw)
|
|
||||||
yaw = oldyaw + move;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (oldyaw - move > yaw)
|
|
||||||
yaw = oldyaw - move;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pitch > oldpitch)
|
|
||||||
{
|
|
||||||
if (oldpitch + move < pitch)
|
|
||||||
pitch = oldpitch + move;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (oldpitch - move > pitch)
|
|
||||||
pitch = oldpitch - move;
|
|
||||||
}
|
|
||||||
|
|
||||||
oldyaw = yaw;
|
|
||||||
oldpitch = pitch;
|
|
||||||
|
|
||||||
cl.viewent.angles[YAW] = r_refdef.viewangles[YAW] + yaw;
|
|
||||||
cl.viewent.angles[PITCH] = - (r_refdef.viewangles[PITCH] + pitch);
|
|
||||||
|
|
||||||
cl.viewent.angles[ROLL] -= v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value;
|
|
||||||
cl.viewent.angles[PITCH] -= v_idlescale.value * sin(cl.time*v_ipitch_cycle.value) * v_ipitch_level.value;
|
|
||||||
cl.viewent.angles[YAW] -= v_idlescale.value * sin(cl.time*v_iyaw_cycle.value) * v_iyaw_level.value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -829,17 +775,13 @@ void V_CalcRefdef (void)
|
||||||
|
|
||||||
V_BoundOffsets ();
|
V_BoundOffsets ();
|
||||||
|
|
||||||
// set up gun position
|
// set up gun stuff
|
||||||
VectorCopy (cl.viewangles, view->angles);
|
|
||||||
|
|
||||||
CalcGunAngle ();
|
CalcGunAngle ();
|
||||||
|
|
||||||
VectorCopy (ent->origin, view->origin);
|
view->eflags = EFLAGS_VIEWMODEL;
|
||||||
view->origin[2] += cl.stats[STAT_VIEWHEIGHT];
|
VectorScale(forward, 1.0/32, view->origin); //bias it very slightly sideways (so it shifts slightly when turning to mimic the 1/32 bias that used to affect it before we changed how viewmodels work)
|
||||||
|
view->origin[0] = bob*0.4; //and bob it forwards
|
||||||
for (i=0 ; i<3 ; i++)
|
view->alpha = ENTALPHA_ENCODE(r_drawviewmodel.value);
|
||||||
view->origin[i] += forward[i]*bob*0.4;
|
|
||||||
view->origin[2] += bob;
|
|
||||||
|
|
||||||
//johnfitz -- removed all gun position fudging code (was used to keep gun from getting covered by sbar)
|
//johnfitz -- removed all gun position fudging code (was used to keep gun from getting covered by sbar)
|
||||||
//MarkV -- restored this with r_viewmodel_quake cvar
|
//MarkV -- restored this with r_viewmodel_quake cvar
|
||||||
|
@ -900,7 +842,6 @@ void V_CalcRefdef (void)
|
||||||
if (ent->origin[2] - oldz > 12)
|
if (ent->origin[2] - oldz > 12)
|
||||||
oldz = ent->origin[2] - 12;
|
oldz = ent->origin[2] - 12;
|
||||||
r_refdef.vieworg[2] += oldz - ent->origin[2];
|
r_refdef.vieworg[2] += oldz - ent->origin[2];
|
||||||
view->origin[2] += oldz - ent->origin[2];
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
oldz = ent->origin[2];
|
oldz = ent->origin[2];
|
||||||
|
|
Loading…
Reference in a new issue