| /* |
| Copyright (C) 1996-1997 Id Software, Inc. |
| |
| This program is free software; you can redistribute it and/or |
| modify it under the terms of the GNU General Public License |
| as published by the Free Software Foundation; either version 2 |
| of the License, or (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| |
| See the GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program; if not, write to the Free Software |
| Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| |
| */ |
| // chase.c -- chase camera code |
| |
| #include "quakedef.h" |
| |
| cvar_t chase_back = CVAR2("chase_back", "100"); |
| cvar_t chase_up = CVAR2("chase_up", "16"); |
| cvar_t chase_right = CVAR2("chase_right", "0"); |
| cvar_t chase_active = CVAR2("chase_active", "0"); |
| |
| vec3_t chase_pos; |
| vec3_t chase_angles; |
| |
| vec3_t chase_dest; |
| vec3_t chase_dest_angles; |
| |
| |
| void Chase_Init (void) |
| { |
| Cvar_RegisterVariable (&chase_back); |
| Cvar_RegisterVariable (&chase_up); |
| Cvar_RegisterVariable (&chase_right); |
| Cvar_RegisterVariable (&chase_active); |
| } |
| |
| void Chase_Reset (void) |
| { |
| // for respawning and teleporting |
| // start position 12 units behind head |
| } |
| |
| void TraceLine (vec3_t start, vec3_t end, vec3_t impact) |
| { |
| trace_t trace; |
| |
| memset (&trace, 0, sizeof(trace)); |
| SV_RecursiveHullCheck (cl.worldmodel->hulls, 0, 0, 1, start, end, &trace); |
| |
| VectorCopy (trace.endpos, impact); |
| } |
| |
| void Chase_Update (void) |
| { |
| int i; |
| float dist; |
| vec3_t forward, up, right; |
| vec3_t dest, stop; |
| |
| |
| // if can't see player, reset |
| AngleVectors (cl.viewangles, forward, right, up); |
| |
| // calc exact destination |
| for (i=0 ; i<3 ; i++) |
| chase_dest[i] = r_refdef.vieworg[i] |
| - forward[i]*chase_back.value |
| - right[i]*chase_right.value; |
| chase_dest[2] = r_refdef.vieworg[2] + chase_up.value; |
| |
| // find the spot the player is looking at |
| VectorMA (r_refdef.vieworg, 4096, forward, dest); |
| TraceLine (r_refdef.vieworg, dest, stop); |
| |
| // calculate pitch to look at the same spot from camera |
| VectorSubtract (stop, r_refdef.vieworg, stop); |
| dist = DotProduct (stop, forward); |
| if (dist < 1) |
| dist = 1; |
| r_refdef.viewangles[PITCH] = -atan(stop[2] / dist) / M_PI * 180; |
| |
| // move towards destination |
| VectorCopy (chase_dest, r_refdef.vieworg); |
| } |
| |