Advertisement
H3LLB0Y

camera.cpp

Apr 20th, 2012
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.43 KB | None | 0 0
  1. #include "camera.h"
  2. #include "math.h"
  3.  
  4. #include <stdio.h>
  5.  
  6. Camera::Camera() {
  7.     position = vec3(0.0f,0.0f,10.0f);
  8.     rotation = vec3(-15.0f,0.0f,0.0f);
  9.     for (int i=0;i<NUM_KEYS;i++) {
  10.         keys[i]=false;
  11.     }
  12. }
  13.  
  14. void Camera::set_pos(vec3 pos) {
  15.     position=pos;
  16. }
  17.  
  18. vec3 Camera::get_pos() {
  19.     return position;
  20. }
  21.  
  22. void Camera::do_translate() {
  23.     glTranslatef(-position.x,-position.y,-position.z);
  24. }
  25.  
  26. void Camera::move_up(float up) {
  27.     position.y-=up;
  28. }
  29.  
  30. void Camera::move_forwards(float forwards) {
  31.     position.x+=cos((rotation.y+90.0f)/180.0f*PI)*forwards;
  32.     position.z-=sin((rotation.y+90.0f)/180.0f*PI)*forwards;
  33. }
  34.  
  35. void Camera::move_left(float left) {
  36.     position.x-=sin((rotation.y+90.0f)/180.0f*PI)*left;
  37.     position.z-=cos((rotation.y+90.0f)/180.0f*PI)*left;
  38. }
  39.  
  40. void Camera::move_in(float in) {
  41.     float forwards=cos(rotation.x/180.0f*PI)*in;
  42.     position.x+=cos((rotation.y+90.0f)/180.0f*PI)*forwards;
  43.     position.y+=sin(rotation.x/180.0f*PI)*in;
  44.     position.z-=sin((rotation.y+90.0f)/180.0f*PI)*forwards;
  45. }
  46.  
  47. void Camera::set_rot(vec3 rot) {
  48.     rotation=rot;
  49. }
  50.  
  51. vec3 Camera::get_rot() {
  52.     return rotation;
  53. }
  54.  
  55. void Camera::do_rotate() {
  56.     glRotatef(-rotation.x,1.0f,0.0f,0.0f);
  57.     glRotatef(-rotation.y,0.0f,1.0f,0.0f);
  58.     glRotatef(-rotation.z,0.0f,0.0f,1.0f);
  59. }
  60.  
  61. void Camera::rotate(vec3 r) {
  62.     // rotate camera by r
  63.     rotation-=r;
  64.     // clamp x rotation to +-60.0f
  65.     if (rotation.x<-60.0f) rotation.x=-60.0f;
  66.     if (rotation.x>60.0f) rotation.x=60.0f;
  67. }
  68.  
  69. void Camera::render() {
  70.     glRotatef(-rotation.x,1.0f,0.0f,0.0f);
  71.     glRotatef(-rotation.y,0.0f,1.0f,0.0f);
  72.     glRotatef(-rotation.z,0.0f,0.0f,1.0f);
  73.     glTranslatef(-position.x,-position.y,-position.z);
  74. }
  75.  
  76. void Camera::update(float deltaTime) {
  77.     float change=0.0f;
  78.     if (keys[FORWARD]^keys[BACK]) {
  79.         if (keys[FORWARD]) change=2.5f*deltaTime;
  80.         if (keys[BACK]) change=-2.5f*deltaTime;
  81.         position.x+=cos((rotation.y+90.0f)/180.0f*PI)*change;
  82.         position.z-=sin((rotation.y+90.0f)/180.0f*PI)*change;
  83.     }
  84.     if (keys[M_LEFT]^keys[M_RIGHT]) {
  85.         if (keys[M_LEFT]) change=2.5f*deltaTime;
  86.         if (keys[M_RIGHT]) change=-2.5f*deltaTime;
  87.         position.x-=sin((rotation.y+90.0f)/180.0f*PI)*change;
  88.         position.z-=cos((rotation.y+90.0f)/180.0f*PI)*change;
  89.     }
  90.     if (keys[R_LEFT]^keys[R_RIGHT]) {
  91.         if (keys[R_LEFT]) change=20.0f*deltaTime;
  92.         if (keys[R_RIGHT]) change=-20.0f*deltaTime;
  93.         rotation.y+=change;
  94.     }
  95.     if (keys[M_UP]^keys[M_DOWN]) {
  96.         if (keys[M_UP]) change=1.0f*deltaTime;
  97.         if (keys[M_DOWN]) change=-1.0f*deltaTime;
  98.         position.y+=change;
  99.     }
  100.     if (keys[R_UP]^keys[R_DOWN]) {
  101.         if (keys[R_UP]) change=7.5f*deltaTime;
  102.         if (keys[R_DOWN]) change=-7.5f*deltaTime;
  103.         rotation.x+=change;
  104.         if (rotation.x<-60.0f) rotation.x=-60.0f;
  105.         if (rotation.x>60.0f) rotation.x=60.0f;
  106.     }
  107. }
  108.  
  109. void Camera::setKey(CAMERA_KEYS key,bool value) {
  110.     keys[key]=value;
  111. }
  112.  
  113. void Camera::handleKeyUp(unsigned char key) {
  114.     switch(key) {
  115.         case 'w':
  116.             setKey(FORWARD,true);
  117.         break;
  118.         case 's':
  119.             setKey(BACK,true);
  120.         break;
  121.         case 'a':
  122.             setKey(M_LEFT,true);
  123.         break;
  124.         case 'd':
  125.             setKey(M_RIGHT,true);
  126.         break;
  127.         case 'q':
  128.             setKey(R_LEFT,true);
  129.         break;
  130.         case 'e':
  131.             setKey(R_RIGHT,true);
  132.         break;
  133.         case 'r':
  134.             setKey(M_UP,true);
  135.         break;
  136.         case 'f':
  137.             setKey(M_DOWN,true);
  138.         break;
  139.         case 't':
  140.             setKey(R_UP,true);
  141.         break;
  142.         case 'g':
  143.             setKey(R_DOWN,true);
  144.         break;
  145.     }
  146. }
  147.  
  148. void Camera::handleKeyDown(unsigned char key) {
  149.     switch(key) {
  150.         case 'w':
  151.             setKey(FORWARD,false);
  152.         break;
  153.         case 's':
  154.             setKey(BACK,false);
  155.         break;
  156.         case 'a':
  157.             setKey(M_LEFT,false);
  158.         break;
  159.         case 'd':
  160.             setKey(M_RIGHT,false);
  161.         break;
  162.         case 'q':
  163.             setKey(R_LEFT,false);
  164.         break;
  165.         case 'e':
  166.             setKey(R_RIGHT,false);
  167.         break;
  168.         case 'r':
  169.             setKey(M_UP,false);
  170.         break;
  171.         case 'f':
  172.             setKey(M_DOWN,false);
  173.         break;
  174.         case 't':
  175.             setKey(R_UP,false);
  176.         break;
  177.         case 'g':
  178.             setKey(R_DOWN,false);
  179.         break;
  180.     }
  181. }
  182.  
  183. void Camera::reset() {
  184.     //Init with standard OGL values:
  185.     position = vec3(0.0f,0.0f,10.0f);
  186.     rotation = vec3(-15.0f,0.0f,0.0f);
  187. }
  188.  
  189. void Camera::set_xmodel(XMLNode* _xmodel) {
  190.     xmodel=_xmodel;
  191. }
  192.  
  193. void Camera::update_xmodel() {
  194.     xmodel->ToElement()->SetAttribute("posx",position.x);
  195.     xmodel->ToElement()->SetAttribute("posy",position.y);
  196.     xmodel->ToElement()->SetAttribute("posz",position.z);
  197.     xmodel->ToElement()->SetAttribute("rotx",rotation.x);
  198.     xmodel->ToElement()->SetAttribute("roty",rotation.y);
  199.     xmodel->ToElement()->SetAttribute("rotz",rotation.z);
  200. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement