Advertisement
Guest User

Untitled

a guest
Jul 18th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.70 KB | None | 0 0
  1. //========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============
  2. //
  3. // Purpose:
  4. //
  5. // $NoKeywords: $
  6. //=============================================================================
  7.  
  8. #include "hud.h"
  9. #include "cl_util.h"
  10. #include "camera.h"
  11. #include "kbutton.h"
  12. #include "cvardef.h"
  13. #include "usercmd.h"
  14. #include "const.h"
  15. #include "camera.h"
  16. #include "in_defs.h"
  17.  
  18. float CL_KeyState( kbutton_t *key );
  19.  
  20. extern "C"
  21. {
  22. void DLLEXPORT CAM_Think( void );
  23. int DLLEXPORT CL_IsThirdPerson( void );
  24. void DLLEXPORT CL_CameraOffset( float *ofs );
  25. }
  26.  
  27. extern cl_enginefunc_t gEngfuncs;
  28.  
  29. extern vec3_t realOrigin;
  30.  
  31. extern float realViewOrg[3];
  32.  
  33. //-------------------------------------------------- Constants
  34.  
  35. #define CAM_DIST_DELTA 1.0
  36. #define CAM_ANGLE_DELTA 2.5
  37. #define CAM_ANGLE_SPEED 2.5
  38. #define CAM_MIN_DIST 30.0
  39. #define CAM_ANGLE_MOVE .5
  40. #define MAX_ANGLE_DIFF 10.0
  41. #define PITCH_MAX 90.0
  42. #define PITCH_MIN 0
  43. #define YAW_MAX 135.0
  44. #define YAW_MIN -135.0
  45.  
  46. enum ECAM_Command
  47. {
  48. CAM_COMMAND_NONE = 0,
  49. CAM_COMMAND_TOTHIRDPERSON = 1,
  50. CAM_COMMAND_TOFIRSTPERSON = 2
  51. };
  52.  
  53. //-------------------------------------------------- Global Variables
  54.  
  55. cvar_t *cam_command;
  56. cvar_t *cam_snapto;
  57. cvar_t *cam_idealyaw;
  58. cvar_t *cam_idealpitch;
  59. cvar_t *cam_idealdist;
  60. cvar_t *cam_contain;
  61.  
  62. cvar_t *c_maxpitch;
  63. cvar_t *c_minpitch;
  64. cvar_t *c_maxyaw;
  65. cvar_t *c_minyaw;
  66. cvar_t *c_maxdistance;
  67. cvar_t *c_mindistance;
  68.  
  69. cvar_t *cam_minDist;
  70. cvar_t *cam_maxDist;
  71. cvar_t *cam_smooth;
  72. cvar_t *cam_lookahead;
  73.  
  74. extern float camYaw;
  75.  
  76. // pitch, yaw, dist
  77. vec3_t cam_ofs;
  78.  
  79.  
  80. // In third person
  81. int cam_thirdperson;
  82. int cam_mousemove; //true if we are moving the cam with the mouse, False if not
  83. int iMouseInUse = 0;
  84. int cam_distancemove;
  85. extern int mouse_x, mouse_y; //used to determine what the current x and y values are
  86. int cam_old_mouse_x, cam_old_mouse_y; //holds the last ticks mouse movement
  87. POINT cam_mouse;
  88. //-------------------------------------------------- Local Variables
  89.  
  90. static kbutton_t cam_pitchup, cam_pitchdown, cam_yawleft, cam_yawright;
  91. static kbutton_t cam_in, cam_out, cam_move;
  92.  
  93. //-------------------------------------------------- Prototypes
  94.  
  95. void CAM_ToThirdPerson(void);
  96. void CAM_ToFirstPerson(void);
  97. void CAM_StartDistance(void);
  98. void CAM_EndDistance(void);
  99.  
  100. void SDL_GetCursorPos(POINT *p)
  101. {
  102. gEngfuncs.GetMousePosition((int *)&p->x, (int *)&p->y);
  103. // SDL_GetMouseState( (int *)&p->x, (int *)&p->y );
  104. }
  105.  
  106. void SDL_SetCursorPos(const int x, const int y)
  107. {
  108. }
  109.  
  110. //-------------------------------------------------- Local Functions
  111.  
  112. float MoveToward( float cur, float goal, float maxspeed )
  113. {
  114. if( cur != goal )
  115. {
  116. if( fabs( cur - goal ) > 180.0 )
  117. {
  118. if( cur < goal )
  119. cur += 360.0;
  120. else
  121. cur -= 360.0;
  122. }
  123.  
  124. if( cur < goal )
  125. {
  126. if( cur < goal - 1.0 )
  127. cur += ( goal - cur ) / 4.0;
  128. else
  129. cur = goal;
  130. }
  131. else
  132. {
  133. if( cur > goal + 1.0 )
  134. cur -= ( cur - goal ) / 4.0;
  135. else
  136. cur = goal;
  137. }
  138. }
  139.  
  140.  
  141. // bring cur back into range
  142. if( cur < 0 )
  143. cur += 360.0;
  144. else if( cur >= 360 )
  145. cur -= 360;
  146.  
  147. return cur;
  148. }
  149.  
  150.  
  151. //-------------------------------------------------- Gobal Functions
  152.  
  153. typedef struct
  154. {
  155. vec3_t boxmins, boxmaxs;// enclose the test object along entire move
  156. float *mins, *maxs; // size of the moving object
  157. vec3_t mins2, maxs2; // size when clipping against mosnters
  158. float *start, *end;
  159. trace_t trace;
  160. int type;
  161. edict_t *passedict;
  162. qboolean monsterclip;
  163. } moveclip_t;
  164.  
  165. extern trace_t SV_ClipMoveToEntity( edict_t *ent, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end );
  166.  
  167. void DLLEXPORT CAM_Think( void )
  168. {
  169. vec3_t origin;
  170. vec3_t ext, pnt, camForward, camRight, camUp;
  171. moveclip_t clip;
  172. float dist;
  173. vec3_t camAngles;
  174. float flSensitivity;
  175. #ifdef LATER
  176. int i;
  177. #endif
  178. vec3_t viewangles;
  179.  
  180. switch( (int)cam_command->value )
  181. {
  182. case CAM_COMMAND_TOTHIRDPERSON:
  183. CAM_ToThirdPerson();
  184. break;
  185. case CAM_COMMAND_TOFIRSTPERSON:
  186. CAM_ToFirstPerson();
  187. break;
  188. case CAM_COMMAND_NONE:
  189. default:
  190. break;
  191. }
  192.  
  193. if( !cam_thirdperson )
  194. return;
  195. #ifdef LATER
  196. if( cam_contain->value )
  197. {
  198. gEngfuncs.GetClientOrigin( origin );
  199. ext[0] = ext[1] = ext[2] = 0.0;
  200. }
  201. #endif
  202.  
  203. if (cam_contain->value == 0){
  204. cam_idealdist->value = cam_maxDist->value;
  205. }
  206. else{
  207. pmtrace_t * trace;
  208. Vector startPos = realOrigin + Vector(realViewOrg[0], realViewOrg[1], cam_minDist->value);
  209. Vector endPos = realOrigin + Vector(realViewOrg[0], realViewOrg[1], cam_maxDist->value);//Vector(realOrigin.x + realViewOrg[0], realOrigin.y + realViewOrg[1], realOrigin.z + cam_maxDist->value);
  210. trace = gEngfuncs.PM_TraceLine(startPos, endPos, 1, 2, -1);
  211. float traceDist = trace->endpos.z - (realOrigin.z + 25); //Have to add 25 because for whatever reason the trace puts the camera a bit above the object
  212. if (cam_smooth->value != 0){
  213. cam_idealdist->value -= (cam_idealdist->value - traceDist) * (.25);
  214. }
  215. else{
  216. cam_idealdist->value = traceDist;
  217. }
  218. }
  219.  
  220. camAngles[PITCH] = cam_idealpitch->value;
  221. camAngles[YAW] = cam_idealyaw->value;
  222. dist = cam_idealdist->value;
  223.  
  224. //
  225. //movement of the camera with the mouse
  226. //
  227. if( cam_mousemove )
  228. {
  229. //get windows cursor position
  230. GetCursorPos( &cam_mouse );
  231.  
  232. //check for X delta values and adjust accordingly
  233. //eventually adjust YAW based on amount of movement
  234. //don't do any movement of the cam using YAW/PITCH if we are zooming in/out the camera
  235. if( !cam_distancemove )
  236. {
  237. //keep the camera within certain limits around the player (ie avoid certain bad viewing angles)
  238. if( cam_mouse.x>gEngfuncs.GetWindowCenterX() )
  239. {
  240. //if( ( camAngles[YAW] >= 225.0 ) || ( camAngles[YAW] < 135.0 ) )
  241. if( camAngles[YAW] < c_maxyaw->value )
  242. {
  243. camAngles[YAW] += CAM_ANGLE_MOVE * ( ( cam_mouse.x - gEngfuncs.GetWindowCenterX() ) / 2 );
  244. }
  245. if( camAngles[YAW] > c_maxyaw->value )
  246. {
  247. camAngles[YAW] = c_maxyaw->value;
  248. }
  249. }
  250. else if( cam_mouse.x<gEngfuncs.GetWindowCenterX() )
  251. {
  252. //if( ( camAngles[YAW] <= 135.0 ) || ( camAngles[YAW] > 225.0 ) )
  253. if( camAngles[YAW] > c_minyaw->value )
  254. {
  255. camAngles[YAW] -= CAM_ANGLE_MOVE * ( ( gEngfuncs.GetWindowCenterX() - cam_mouse.x ) / 2 );
  256. }
  257. if( camAngles[YAW] < c_minyaw->value )
  258. {
  259. camAngles[YAW] = c_minyaw->value;
  260.  
  261. }
  262. }
  263.  
  264. //check for y delta values and adjust accordingly
  265. //eventually adjust PITCH based on amount of movement
  266. //also make sure camera is within bounds
  267. if( cam_mouse.y>gEngfuncs.GetWindowCenterY() )
  268. {
  269. if( camAngles[PITCH] < c_maxpitch->value )
  270. {
  271. camAngles[PITCH] += CAM_ANGLE_MOVE * ( ( cam_mouse.y - gEngfuncs.GetWindowCenterY() ) / 2 );
  272. }
  273. if( camAngles[PITCH] > c_maxpitch->value )
  274. {
  275. camAngles[PITCH] = c_maxpitch->value;
  276. }
  277. }
  278. else if( cam_mouse.y<gEngfuncs.GetWindowCenterY() )
  279. {
  280. if( camAngles[PITCH] > c_minpitch->value )
  281. {
  282. camAngles[PITCH] -= CAM_ANGLE_MOVE * ( ( gEngfuncs.GetWindowCenterY() - cam_mouse.y ) / 2 );
  283. }
  284. if( camAngles[PITCH] < c_minpitch->value )
  285. {
  286. camAngles[PITCH] = c_minpitch->value;
  287. }
  288. }
  289.  
  290. //set old mouse coordinates to current mouse coordinates
  291. //since we are done with the mouse
  292. if( ( flSensitivity = gHUD.GetSensitivity() ) != 0 )
  293. {
  294. cam_old_mouse_x = cam_mouse.x * flSensitivity;
  295. cam_old_mouse_y = cam_mouse.y * flSensitivity;
  296. }
  297. else
  298. {
  299. cam_old_mouse_x = cam_mouse.x;
  300. cam_old_mouse_y = cam_mouse.y;
  301. }
  302. SetCursorPos( gEngfuncs.GetWindowCenterX(), gEngfuncs.GetWindowCenterY() );
  303. }
  304. }
  305.  
  306. //Nathan code here
  307. if( CL_KeyState( &cam_pitchup ) )
  308. camAngles[PITCH] += CAM_ANGLE_DELTA;
  309. else if( CL_KeyState( &cam_pitchdown ) )
  310. camAngles[PITCH] -= CAM_ANGLE_DELTA;
  311.  
  312. if( CL_KeyState( &cam_yawleft ) )
  313. camAngles[YAW] -= CAM_ANGLE_DELTA;
  314. else if( CL_KeyState( &cam_yawright ) )
  315. camAngles[YAW] += CAM_ANGLE_DELTA;
  316.  
  317. if( CL_KeyState( &cam_in ) )
  318. {
  319. dist -= CAM_DIST_DELTA;
  320. if( dist < CAM_MIN_DIST )
  321. {
  322. // If we go back into first person, reset the angle
  323. camAngles[PITCH] = 0;
  324. camAngles[YAW] = 0;
  325. dist = CAM_MIN_DIST;
  326. }
  327.  
  328. }
  329. else if( CL_KeyState( &cam_out ) )
  330. dist += CAM_DIST_DELTA;
  331.  
  332. if( cam_distancemove )
  333. {
  334. if( cam_mouse.y > gEngfuncs.GetWindowCenterY() )
  335. {
  336. if( dist < c_maxdistance->value )
  337. {
  338. dist += CAM_DIST_DELTA * ( ( cam_mouse.y - gEngfuncs.GetWindowCenterY() ) / 2);
  339. }
  340. if( dist > c_maxdistance->value )
  341. {
  342. dist = c_maxdistance->value;
  343. }
  344. }
  345. else if( cam_mouse.y < gEngfuncs.GetWindowCenterY() )
  346. {
  347. if( dist > c_mindistance->value )
  348. {
  349. dist -= CAM_DIST_DELTA * ( ( gEngfuncs.GetWindowCenterY() - cam_mouse.y ) / 2 );
  350. }
  351. if ( dist < c_mindistance->value )
  352. {
  353. dist = c_mindistance->value;
  354. }
  355. }
  356. //set old mouse coordinates to current mouse coordinates
  357. //since we are done with the mouse
  358. cam_old_mouse_x = cam_mouse.x * gHUD.GetSensitivity();
  359. cam_old_mouse_y = cam_mouse.y * gHUD.GetSensitivity();
  360. SetCursorPos( gEngfuncs.GetWindowCenterX(), gEngfuncs.GetWindowCenterY() );
  361. }
  362. #ifdef LATER
  363. if( cam_contain->value )
  364. {
  365. // check new ideal
  366. VectorCopy( origin, pnt );
  367. AngleVectors( camAngles, camForward, camRight, camUp );
  368. for( i = 0; i < 3; i++ )
  369. pnt[i] += -dist * camForward[i];
  370.  
  371. // check line from r_refdef.vieworg to pnt
  372. memset( &clip, 0, sizeof(moveclip_t) );
  373. clip.trace = SV_ClipMoveToEntity( sv.edicts, r_refdef.vieworg, ext, ext, pnt );
  374. if( clip.trace.fraction == 1.0 )
  375. {
  376. // update ideal
  377. cam_idealpitch->value = camAngles[PITCH];
  378. cam_idealyaw->value = camAngles[YAW];
  379. cam_idealdist->value = dist;
  380. }
  381. }
  382. else
  383. #endif
  384. {
  385. // update ideal
  386. cam_idealpitch->value = camAngles[PITCH];
  387. cam_idealyaw->value = camAngles[YAW];
  388. cam_idealdist->value = dist;
  389. }
  390.  
  391. // Move towards ideal
  392. VectorCopy( cam_ofs, camAngles );
  393.  
  394. gEngfuncs.GetViewAngles( (float *)viewangles );
  395.  
  396. if( cam_snapto->value )
  397. {
  398. camAngles[YAW] = cam_idealyaw->value + viewangles[YAW];
  399. camAngles[PITCH] = cam_idealpitch->value + viewangles[PITCH];
  400. camAngles[2] = cam_idealdist->value;
  401. }
  402. else
  403. {
  404. if( camAngles[YAW] - viewangles[YAW] != cam_idealyaw->value )
  405. camAngles[YAW] = MoveToward( camAngles[YAW], cam_idealyaw->value + viewangles[YAW], CAM_ANGLE_SPEED );
  406.  
  407. if( camAngles[PITCH] - viewangles[PITCH] != cam_idealpitch->value )
  408. camAngles[PITCH] = MoveToward( camAngles[PITCH], cam_idealpitch->value + viewangles[PITCH], CAM_ANGLE_SPEED );
  409.  
  410. if( fabs( camAngles[2] - cam_idealdist->value ) < 2.0 )
  411. camAngles[2] = cam_idealdist->value;
  412. else
  413. camAngles[2] += ( cam_idealdist->value - camAngles[2] ) / 4.0;
  414. }
  415. #ifdef LATER
  416. if( cam_contain->value )
  417. {
  418. // Test new position
  419. dist = camAngles[ROLL];
  420. camAngles[ROLL] = 0;
  421.  
  422. VectorCopy( origin, pnt );
  423. AngleVectors( camAngles, camForward, camRight, camUp );
  424. for( i = 0; i < 3; i++ )
  425. pnt[i] += -dist * camForward[i];
  426.  
  427. // check line from r_refdef.vieworg to pnt
  428. memset( &clip, 0, sizeof(moveclip_t) );
  429. ext[0] = ext[1] = ext[2] = 0.0;
  430. clip.trace = SV_ClipMoveToEntity( sv.edicts, r_refdef.vieworg, ext, ext, pnt );
  431. if( clip.trace.fraction != 1.0 )
  432. return;
  433. }
  434. #endif
  435. cam_ofs[0] = camAngles[0];
  436. cam_ofs[1] = camAngles[1];
  437. cam_ofs[2] = dist;
  438. }
  439.  
  440. extern void KeyDown( kbutton_t *b ); // HACK
  441. extern void KeyUp( kbutton_t *b ); // HACK
  442.  
  443. void CAM_PitchUpDown( void )
  444. {
  445. KeyDown( &cam_pitchup );
  446. }
  447.  
  448. void CAM_PitchUpUp( void )
  449. {
  450. KeyUp( &cam_pitchup );
  451. }
  452.  
  453. void CAM_PitchDownDown( void )
  454. {
  455. KeyDown( &cam_pitchdown );
  456. }
  457.  
  458. void CAM_PitchDownUp( void )
  459. {
  460. KeyUp( &cam_pitchdown );
  461. }
  462.  
  463. void CAM_YawLeftDown( void )
  464. {
  465. KeyDown( &cam_yawleft );
  466. }
  467.  
  468. void CAM_YawLeftUp( void )
  469. {
  470. KeyUp( &cam_yawleft );
  471. }
  472.  
  473. void CAM_YawRightDown( void )
  474. {
  475. KeyDown( &cam_yawright );
  476. }
  477.  
  478. void CAM_YawRightUp( void )
  479. {
  480. KeyUp( &cam_yawright );
  481. }
  482.  
  483. void CAM_InDown( void )
  484. {
  485. KeyDown( &cam_in );
  486. }
  487.  
  488. void CAM_InUp( void )
  489. {
  490. KeyUp( &cam_in );
  491. }
  492.  
  493. void CAM_OutDown( void )
  494. {
  495. KeyDown( &cam_out );
  496. }
  497.  
  498. void CAM_OutUp( void )
  499. {
  500. KeyUp( &cam_out );
  501. }
  502.  
  503. void CAM_ToThirdPerson( void )
  504. {
  505. vec3_t viewangles;
  506. #if !defined( _DEBUG )
  507. if( gEngfuncs.GetMaxClients() > 1 )
  508. {
  509. // no thirdperson in multiplayer.
  510. return;
  511. }
  512. #endif
  513. gEngfuncs.GetViewAngles( (float *)viewangles );
  514.  
  515. if( !cam_thirdperson )
  516. {
  517. cam_thirdperson = 1;
  518.  
  519. cam_ofs[YAW] = viewangles[YAW];
  520. cam_ofs[PITCH] = viewangles[PITCH];
  521. cam_ofs[2] = CAM_MIN_DIST;
  522. }
  523.  
  524. gEngfuncs.Cvar_SetValue( "cam_command", 0 );
  525. }
  526.  
  527. void CAM_ToFirstPerson( void )
  528. {
  529. cam_thirdperson = 0;
  530.  
  531. gEngfuncs.Cvar_SetValue( "cam_command", 0 );
  532. }
  533.  
  534. void CAM_ToggleSnapto( void )
  535. {
  536. cam_snapto->value = !cam_snapto->value;
  537. }
  538.  
  539. void CAM_Init( void )
  540. {
  541. gEngfuncs.pfnAddCommand( "+campitchup", CAM_PitchUpDown );
  542. gEngfuncs.pfnAddCommand( "-campitchup", CAM_PitchUpUp );
  543. gEngfuncs.pfnAddCommand( "+campitchdown", CAM_PitchDownDown );
  544. gEngfuncs.pfnAddCommand( "-campitchdown", CAM_PitchDownUp );
  545. gEngfuncs.pfnAddCommand( "+camyawleft", CAM_YawLeftDown );
  546. gEngfuncs.pfnAddCommand( "-camyawleft", CAM_YawLeftUp );
  547. gEngfuncs.pfnAddCommand( "+camyawright", CAM_YawRightDown );
  548. gEngfuncs.pfnAddCommand( "-camyawright", CAM_YawRightUp );
  549. gEngfuncs.pfnAddCommand( "+camin", CAM_InDown );
  550. gEngfuncs.pfnAddCommand( "-camin", CAM_InUp );
  551. gEngfuncs.pfnAddCommand( "+camout", CAM_OutDown );
  552. gEngfuncs.pfnAddCommand( "-camout", CAM_OutUp );
  553. gEngfuncs.pfnAddCommand( "thirdperson", CAM_ToThirdPerson );
  554. gEngfuncs.pfnAddCommand( "firstperson", CAM_ToFirstPerson );
  555. gEngfuncs.pfnAddCommand( "+cammousemove",CAM_StartMouseMove);
  556. gEngfuncs.pfnAddCommand( "-cammousemove",CAM_EndMouseMove);
  557. gEngfuncs.pfnAddCommand( "+camdistance", CAM_StartDistance );
  558. gEngfuncs.pfnAddCommand( "-camdistance", CAM_EndDistance );
  559. gEngfuncs.pfnAddCommand( "snapto", CAM_ToggleSnapto );
  560.  
  561. cam_command = gEngfuncs.pfnRegisterVariable( "cam_command", "0", 0 ); // tells camera to go to thirdperson
  562. cam_snapto = gEngfuncs.pfnRegisterVariable( "cam_snapto", "0", 0 ); // snap to thirdperson view
  563. cam_idealyaw = gEngfuncs.pfnRegisterVariable( "cam_idealyaw", "90", 0 ); // thirdperson yaw
  564. cam_idealpitch = gEngfuncs.pfnRegisterVariable( "cam_idealpitch", "0", 0 ); // thirperson pitch
  565. cam_idealdist = gEngfuncs.pfnRegisterVariable( "cam_idealdist", "64", 0 ); // thirdperson distance
  566. cam_contain = gEngfuncs.pfnRegisterVariable( "cam_contain", "0", 0 ); // contain camera to world
  567.  
  568. c_maxpitch = gEngfuncs.pfnRegisterVariable( "c_maxpitch", "90.0", 0 );
  569. c_minpitch = gEngfuncs.pfnRegisterVariable( "c_minpitch", "0.0", 0 );
  570. c_maxyaw = gEngfuncs.pfnRegisterVariable( "c_maxyaw", "135.0", 0 );
  571. c_minyaw = gEngfuncs.pfnRegisterVariable( "c_minyaw", "-135.0", 0 );
  572. c_maxdistance = gEngfuncs.pfnRegisterVariable( "c_maxdistance", "200.0", 0 );
  573. c_mindistance = gEngfuncs.pfnRegisterVariable( "c_mindistance", "30.0", 0 );
  574. }
  575.  
  576. void CAM_ClearStates( void )
  577. {
  578. vec3_t viewangles;
  579.  
  580. gEngfuncs.GetViewAngles( (float *)viewangles );
  581.  
  582. cam_pitchup.state = 0;
  583. cam_pitchdown.state = 0;
  584. cam_yawleft.state = 0;
  585. cam_yawright.state = 0;
  586. cam_in.state = 0;
  587. cam_out.state = 0;
  588.  
  589. cam_thirdperson = 0;
  590. cam_command->value = 0;
  591. cam_mousemove=0;
  592.  
  593. cam_snapto->value = 0;
  594. cam_distancemove = 0;
  595.  
  596. cam_ofs[0] = 0.0;
  597. cam_ofs[1] = 0.0;
  598. cam_ofs[2] = CAM_MIN_DIST;
  599.  
  600. cam_idealpitch->value = viewangles[PITCH];
  601. cam_idealyaw->value = viewangles[YAW];
  602. cam_idealdist->value = CAM_MIN_DIST;
  603. }
  604.  
  605. void CAM_StartMouseMove( void )
  606. {
  607. float flSensitivity;
  608.  
  609. //only move the cam with mouse if we are in third person.
  610. if( cam_thirdperson )
  611. {
  612. //set appropriate flags and initialize the old mouse position
  613. //variables for mouse camera movement
  614. if( !cam_mousemove )
  615. {
  616. cam_mousemove = 1;
  617. iMouseInUse = 1;
  618. GetCursorPos( &cam_mouse );
  619.  
  620. if( ( flSensitivity = gHUD.GetSensitivity() ) != 0 )
  621. {
  622. cam_old_mouse_x = cam_mouse.x * flSensitivity;
  623. cam_old_mouse_y = cam_mouse.y * flSensitivity;
  624. }
  625. else
  626. {
  627. cam_old_mouse_x = cam_mouse.x;
  628. cam_old_mouse_y = cam_mouse.y;
  629. }
  630. }
  631. }
  632. //we are not in 3rd person view..therefore do not allow camera movement
  633. else
  634. {
  635. cam_mousemove = 0;
  636. iMouseInUse = 0;
  637. }
  638. }
  639.  
  640. //the key has been released for camera movement
  641. //tell the engine that mouse camera movement is off
  642. void CAM_EndMouseMove( void )
  643. {
  644. cam_mousemove = 0;
  645. iMouseInUse = 0;
  646. }
  647.  
  648.  
  649. //----------------------------------------------------------
  650. //routines to start the process of moving the cam in or out
  651. //using the mouse
  652. //----------------------------------------------------------
  653. void CAM_StartDistance( void )
  654. {
  655. //only move the cam with mouse if we are in third person.
  656. if( cam_thirdperson )
  657. {
  658. //set appropriate flags and initialize the old mouse position
  659. //variables for mouse camera movement
  660. if( !cam_distancemove )
  661. {
  662. cam_distancemove = 1;
  663. cam_mousemove = 1;
  664. iMouseInUse = 1;
  665. GetCursorPos( &cam_mouse );
  666. cam_old_mouse_x = cam_mouse.x * gHUD.GetSensitivity();
  667. cam_old_mouse_y = cam_mouse.y * gHUD.GetSensitivity();
  668. }
  669. }
  670. //we are not in 3rd person view..therefore do not allow camera movement
  671. else
  672. {
  673. cam_distancemove = 0;
  674. cam_mousemove = 0;
  675. iMouseInUse = 0;
  676. }
  677. }
  678.  
  679. //the key has been released for camera movement
  680. //tell the engine that mouse camera movement is off
  681. void CAM_EndDistance( void )
  682. {
  683. cam_distancemove = 0;
  684. cam_mousemove = 0;
  685. iMouseInUse = 0;
  686. }
  687.  
  688. int DLLEXPORT CL_IsThirdPerson( void )
  689. {
  690. return ( cam_thirdperson ? 1 : 0 ) || ( g_iUser1 && ( g_iUser2 == gEngfuncs.GetLocalPlayer()->index ) );
  691. }
  692.  
  693. void DLLEXPORT CL_CameraOffset( float *ofs )
  694. {
  695. VectorCopy( cam_ofs, ofs );
  696. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement