|
|
1.1 ! root 1: // chase.c -- chase camera code ! 2: ! 3: #include "quakedef.h" ! 4: ! 5: cvar_t chase_back = {"chase_back", "100"}; ! 6: cvar_t chase_up = {"chase_up", "16"}; ! 7: cvar_t chase_right = {"chase_right", "0"}; ! 8: cvar_t chase_active = {"chase_active", "0"}; ! 9: ! 10: vec3_t chase_pos; ! 11: vec3_t chase_angles; ! 12: ! 13: vec3_t chase_dest; ! 14: vec3_t chase_dest_angles; ! 15: ! 16: ! 17: void Chase_Init (void) ! 18: { ! 19: Cvar_RegisterVariable (&chase_back); ! 20: Cvar_RegisterVariable (&chase_up); ! 21: Cvar_RegisterVariable (&chase_right); ! 22: Cvar_RegisterVariable (&chase_active); ! 23: } ! 24: ! 25: void Chase_Reset (void) ! 26: { ! 27: // for respawning and teleporting ! 28: // start position 12 units behind head ! 29: } ! 30: ! 31: void TraceLine (vec3_t start, vec3_t end, vec3_t impact) ! 32: { ! 33: trace_t trace; ! 34: ! 35: memset (&trace, 0, sizeof(trace)); ! 36: SV_RecursiveHullCheck (cl.worldmodel->hulls, 0, 0, 1, start, end, &trace); ! 37: ! 38: VectorCopy (trace.endpos, impact); ! 39: } ! 40: ! 41: void Chase_Update (void) ! 42: { ! 43: int i; ! 44: float dist; ! 45: vec3_t forward, up, right; ! 46: vec3_t dest, stop; ! 47: ! 48: ! 49: // if can't see player, reset ! 50: AngleVectors (cl.viewangles, forward, right, up); ! 51: ! 52: // calc exact destination ! 53: for (i=0 ; i<3 ; i++) ! 54: chase_dest[i] = r_refdef.vieworg[i] ! 55: - forward[i]*chase_back.value ! 56: - right[i]*chase_right.value; ! 57: chase_dest[2] = r_refdef.vieworg[2] + chase_up.value; ! 58: ! 59: // find the spot the player is looking at ! 60: VectorMA (r_refdef.vieworg, 4096, forward, dest); ! 61: TraceLine (r_refdef.vieworg, dest, stop); ! 62: ! 63: // calculate pitch to look at the same spot from camera ! 64: VectorSubtract (stop, r_refdef.vieworg, stop); ! 65: dist = DotProduct (stop, forward); ! 66: if (dist < 1) ! 67: dist = 1; ! 68: r_refdef.viewangles[PITCH] = -atan(stop[2] / dist) / M_PI * 180; ! 69: ! 70: // move towards destination ! 71: VectorCopy (chase_dest, r_refdef.vieworg); ! 72: } ! 73:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.