float sign;
float side;
float value;
-
+
AngleVectors (angles, NULL, right, NULL);
side = DotProduct (velocity, right);
sign = side < 0 ? -1 : 1;
side = fabs(side);
value = cl_rollangle.value;
-// if (cl.inwater)
-// value *= 6;
if (side < cl_rollspeed.value)
side = side * value / cl_rollspeed.value;
// (don't count Z, or jumping messes it up)
bob = sqrt(cl.velocity[0]*cl.velocity[0] + cl.velocity[1]*cl.velocity[1]) * cl_bob.value;
- //Con_Printf ("speed: %5.1f\n", Length(cl.velocity));
bob = bob*0.3 + bob*0.7*sin(cycle);
bob = bound(-7, bob, 4);
return bob;
void V_StartPitchDrift (void)
{
-#if 1
if (cl.laststop == cl.time)
- {
return; // something else is keeping it from drifting
- }
-#endif
+
if (cl.nodrift || !cl.pitchvel)
{
cl.pitchvel = v_centerspeed.value;
move = cl.frametime * cl.pitchvel;
cl.pitchvel += cl.frametime * v_centerspeed.value;
-//Con_Printf ("move: %f (%f)\n", move, cl.frametime);
-
if (delta > 0)
{
if (move > delta)
}
-
-
-
/*
==============================================================================
void V_ParseDamage (void)
{
int i, armor, blood;
- vec3_t from, forward, right;
+ vec3_t from;
+ //vec3_t forward, right;
+ vec3_t localfrom;
entity_t *ent;
- float side, count;
+ //float side;
+ float count;
armor = MSG_ReadByte ();
blood = MSG_ReadByte ();
// calculate view angle kicks
//
ent = &cl_entities[cl.viewentity];
+ Matrix4x4_Transform(&ent->render.inversematrix, from, localfrom);
+ VectorNormalize(localfrom);
+ v_dmg_pitch = count * localfrom[0] * v_kickpitch.value;
+ v_dmg_roll = count * localfrom[1] * v_kickroll.value;
+ v_dmg_time = v_kicktime.value;
- VectorSubtract (from, ent->render.origin, from);
- VectorNormalize (from);
+ //VectorSubtract (from, ent->render.origin, from);
+ //VectorNormalize (from);
- AngleVectors (ent->render.angles, forward, right, NULL);
+ //AngleVectors (ent->render.angles, forward, right, NULL);
- side = DotProduct (from, right);
- v_dmg_roll = count*side*v_kickroll.value;
+ //side = DotProduct (from, right);
+ //v_dmg_roll = count*side*v_kickroll.value;
- side = DotProduct (from, forward);
- v_dmg_pitch = count*side*v_kickpitch.value;
+ //side = DotProduct (from, forward);
+ //v_dmg_pitch = count*side*v_kickpitch.value;
- v_dmg_time = v_kicktime.value;
+ //v_dmg_time = v_kicktime.value;
}
static cshift_t v_cshift;
float r, g, b, a, a2;
int j;
- if (cl.worldmodel == NULL)
+ if (cls.signon != SIGNONS)
{
cl.cshifts[CSHIFT_DAMAGE].percent = 0;
cl.cshifts[CSHIFT_BONUS].percent = 0;
cl.cshifts[CSHIFT_BONUS].percent = 0;
// set contents color
- switch (Mod_PointInLeaf (r_refdef.vieworg, cl.worldmodel)->contents)
+ switch (Mod_PointContents (r_refdef.vieworg, cl.worldmodel))
{
case CONTENTS_EMPTY:
case CONTENTS_SOLID:
cl.cshifts[CSHIFT_CONTENTS].destcolor[0] = 255;
cl.cshifts[CSHIFT_CONTENTS].destcolor[1] = 80;
cl.cshifts[CSHIFT_CONTENTS].destcolor[2] = 0;
- cl.cshifts[CSHIFT_CONTENTS].percent = 150;
+ cl.cshifts[CSHIFT_CONTENTS].percent = 150 >> 1;
break;
case CONTENTS_SLIME:
cl.cshifts[CSHIFT_CONTENTS].destcolor[0] = 0;
cl.cshifts[CSHIFT_CONTENTS].destcolor[1] = 25;
cl.cshifts[CSHIFT_CONTENTS].destcolor[2] = 5;
- cl.cshifts[CSHIFT_CONTENTS].percent = 150;
+ cl.cshifts[CSHIFT_CONTENTS].percent = 150 >> 1;
break;
default:
cl.cshifts[CSHIFT_CONTENTS].destcolor[0] = 130;
cl.cshifts[CSHIFT_CONTENTS].destcolor[1] = 80;
cl.cshifts[CSHIFT_CONTENTS].destcolor[2] = 50;
- cl.cshifts[CSHIFT_CONTENTS].percent = 128;
+ cl.cshifts[CSHIFT_CONTENTS].percent = 128 >> 1;
}
if (cl.items & IT_QUAD)
r_refdef.viewangles[YAW] += idle * sin(cl.time*v_iyaw_cycle.value) * v_iyaw_level.value;
}
+#define MAXVIEWMODELS 32
+extern int numviewmodels;
+extern entity_t *viewmodels[MAXVIEWMODELS];
+void V_LinkViewEntities(void)
+{
+ int i;
+ //float v[3];
+ entity_t *ent;
+ matrix4x4_t matrix, matrix2;
+
+ if (numviewmodels <= 0)
+ return;
+
+ //Matrix4x4_CreateRotate(&matrix, 1, 0, 0, r_refdef.viewangles[0]);
+ //Matrix4x4_CreateRotate(&matrix, 0, 1, 0, r_refdef.viewangles[0]);
+ //Matrix4x4_CreateRotate(&matrix, 0, 0, 1, r_refdef.viewangles[0]);
+ Matrix4x4_CreateFromQuakeEntity(&matrix, r_refdef.vieworg[0], r_refdef.vieworg[1], r_refdef.vieworg[2], r_refdef.viewangles[0], r_refdef.viewangles[1], r_refdef.viewangles[2], 0.3);
+ for (i = 0;i < numviewmodels && r_refdef.numentities < r_refdef.maxentities;i++)
+ {
+ ent = viewmodels[i];
+ r_refdef.entities[r_refdef.numentities++] = &ent->render;
+
+ //VectorCopy(ent->render.origin, v);
+ //ent->render.origin[0] = v[0] * vpn[0] + v[1] * vright[0] + v[2] * vup[0] + r_refdef.vieworg[0];
+ //ent->render.origin[1] = v[0] * vpn[1] + v[1] * vright[1] + v[2] * vup[1] + r_refdef.vieworg[1];
+ //ent->render.origin[2] = v[0] * vpn[2] + v[1] * vright[2] + v[2] * vup[2] + r_refdef.vieworg[2];
+ //ent->render.angles[0] = ent->render.angles[0] + r_refdef.viewangles[0];
+ //ent->render.angles[1] = ent->render.angles[1] + r_refdef.viewangles[1];
+ //ent->render.angles[2] = ent->render.angles[2] + r_refdef.viewangles[2];
+ //ent->render.scale *= 0.3;
+
+ //Matrix4x4_CreateFromQuakeEntity(&ent->render.matrix, ent->render.origin[0], ent->render.origin[1], ent->render.origin[2], ent->render.angles[0], ent->render.angles[1], ent->render.angles[2], ent->render.scale);
+ matrix2 = ent->render.matrix;
+ Matrix4x4_Concat(&ent->render.matrix, &matrix, &matrix2);
+ Matrix4x4_Invert_Simple(&ent->render.inversematrix, &ent->render.matrix);
+ CL_BoundingBoxForEntity(&ent->render);
+ }
+}
/*
==================
*/
void V_CalcRefdef (void)
{
- entity_t *ent, *view;
- vec3_t forward;
- vec3_t angles;
- float bob;
- float side;
+ entity_t *ent, *view;
- if (cls.state != ca_connected || !cl.worldmodel)
+ if (cls.state != ca_connected || cls.signon != SIGNONS)
return;
// ent is the player model (visible when out of body)
V_DriftPitch ();
- VectorCopy (cl.viewentorigin, r_refdef.vieworg);
+ VectorCopy (ent->render.origin, r_refdef.vieworg);
if (!intimerefresh)
VectorCopy (cl.viewangles, r_refdef.viewangles);
}
else if (chase_active.value)
{
+ view->render.model = NULL;
r_refdef.vieworg[2] += cl.viewheight;
Chase_Update ();
V_AddIdle (v_idlescale.value);
}
else
{
- side = V_CalcRoll (cl_entities[cl.viewentity].render.angles, cl.velocity);
- r_refdef.viewangles[ROLL] += side;
+ r_refdef.viewangles[ROLL] += V_CalcRoll (cl.viewangles, cl.velocity);
if (v_dmg_time > 0)
{
V_AddIdle (v_idlescale.value);
- // offsets
- angles[PITCH] = -ent->render.angles[PITCH]; // because entity pitches are actually backward
- angles[YAW] = ent->render.angles[YAW];
- angles[ROLL] = ent->render.angles[ROLL];
-
- AngleVectors (angles, forward, NULL, NULL);
-
- bob = V_CalcBob ();
+ r_refdef.vieworg[2] += cl.viewheight + V_CalcBob ();
- r_refdef.vieworg[2] += cl.viewheight + bob;
+ // LordHavoc: origin view kick added
+ if (!intimerefresh)
+ {
+ VectorAdd(r_refdef.viewangles, cl.punchangle, r_refdef.viewangles);
+ VectorAdd(r_refdef.vieworg, cl.punchvector, r_refdef.vieworg);
+ }
// set up gun
+ // (FIXME! this should be in cl_main.c with the other linking code, not view.c!)
view->state_current.modelindex = cl.stats[STAT_WEAPON];
view->state_current.frame = cl.stats[STAT_WEAPONFRAME];
- VectorCopy(r_refdef.vieworg, view->render.origin);
- //view->render.origin[0] = ent->render.origin[0] + bob * 0.4 * forward[0];
- //view->render.origin[1] = ent->render.origin[1] + bob * 0.4 * forward[1];
- //view->render.origin[2] = ent->render.origin[2] + bob * 0.4 * forward[2] + cl.viewheight + bob;
- view->render.angles[PITCH] = -r_refdef.viewangles[PITCH] - v_idlescale.value * sin(cl.time*v_iyaw_cycle.value) * v_iyaw_level.value;
- view->render.angles[YAW] = r_refdef.viewangles[YAW] - v_idlescale.value * sin(cl.time*v_ipitch_cycle.value) * v_ipitch_level.value;
- view->render.angles[ROLL] = r_refdef.viewangles[ROLL] - v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value;
+ //VectorCopy(r_refdef.vieworg, view->render.origin);
+ //view->render.angles[PITCH] = r_refdef.viewangles[PITCH] + v_idlescale.value * sin(cl.time*v_iyaw_cycle.value) * v_iyaw_level.value;
+ //view->render.angles[YAW] = r_refdef.viewangles[YAW] - v_idlescale.value * sin(cl.time*v_ipitch_cycle.value) * v_ipitch_level.value;
+ //view->render.angles[ROLL] = r_refdef.viewangles[ROLL] - v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value;
+ //view->render.scale = 1.0 / 3.0;
+ Matrix4x4_CreateFromQuakeEntity(&view->render.matrix, r_refdef.vieworg[0], r_refdef.vieworg[1], r_refdef.vieworg[2], r_refdef.viewangles[PITCH] + v_idlescale.value * sin(cl.time*v_iyaw_cycle.value) * v_iyaw_level.value, r_refdef.viewangles[YAW] - v_idlescale.value * sin(cl.time*v_ipitch_cycle.value) * v_ipitch_level.value, r_refdef.viewangles[ROLL] - v_idlescale.value * sin(cl.time*v_iroll_cycle.value) * v_iroll_level.value, 0.3);
+ Matrix4x4_Invert_Simple(&view->render.inversematrix, &view->render.matrix);
+ CL_BoundingBoxForEntity(&view->render);
// FIXME: this setup code is somewhat evil (CL_LerpUpdate should be private?)
CL_LerpUpdate(view);
view->render.colormap = -1; // no special coloring
view->render.alpha = ent->render.alpha; // LordHavoc: if the player is transparent, so is the gun
view->render.effects = ent->render.effects;
- view->render.scale = 1;
+ AngleVectors(r_refdef.viewangles, vpn, vright, vup);
- // LordHavoc: origin view kick added
- if (!intimerefresh)
+ // link into render entities list
+ if (r_drawviewmodel.integer && !chase_active.integer && !envmap && r_drawentities.integer && !(cl.items & IT_INVISIBILITY) && cl.stats[STAT_HEALTH] > 0)
{
- VectorAdd(r_refdef.viewangles, cl.punchangle, r_refdef.viewangles);
- VectorAdd(r_refdef.vieworg, cl.punchvector, r_refdef.vieworg);
+ if (r_refdef.numentities < r_refdef.maxentities && view->render.model != NULL)
+ r_refdef.entities[r_refdef.numentities++] = &view->render;
+ V_LinkViewEntities();
}
-
- // copy to refdef
- r_refdef.viewent = view->render;
}
}
Cvar_RegisterVariable (&v_kickpitch);
}
-