Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "camera.h"
- #include "math.h"
- #include <stdio.h>
- Camera::Camera() {
- position = vec3(0.0f,0.0f,10.0f);
- rotation = vec3(-15.0f,0.0f,0.0f);
- for (int i=0;i<NUM_KEYS;i++) {
- keys[i]=false;
- }
- }
- void Camera::set_pos(vec3 pos) {
- position=pos;
- }
- vec3 Camera::get_pos() {
- return position;
- }
- void Camera::do_translate() {
- glTranslatef(-position.x,-position.y,-position.z);
- }
- void Camera::move_up(float up) {
- position.y-=up;
- }
- void Camera::move_forwards(float forwards) {
- position.x+=cos((rotation.y+90.0f)/180.0f*PI)*forwards;
- position.z-=sin((rotation.y+90.0f)/180.0f*PI)*forwards;
- }
- void Camera::move_left(float left) {
- position.x-=sin((rotation.y+90.0f)/180.0f*PI)*left;
- position.z-=cos((rotation.y+90.0f)/180.0f*PI)*left;
- }
- void Camera::move_in(float in) {
- float forwards=cos(rotation.x/180.0f*PI)*in;
- position.x+=cos((rotation.y+90.0f)/180.0f*PI)*forwards;
- position.y+=sin(rotation.x/180.0f*PI)*in;
- position.z-=sin((rotation.y+90.0f)/180.0f*PI)*forwards;
- }
- void Camera::set_rot(vec3 rot) {
- rotation=rot;
- }
- vec3 Camera::get_rot() {
- return rotation;
- }
- void Camera::do_rotate() {
- glRotatef(-rotation.x,1.0f,0.0f,0.0f);
- glRotatef(-rotation.y,0.0f,1.0f,0.0f);
- glRotatef(-rotation.z,0.0f,0.0f,1.0f);
- }
- void Camera::rotate(vec3 r) {
- // rotate camera by r
- rotation-=r;
- // clamp x rotation to +-60.0f
- if (rotation.x<-60.0f) rotation.x=-60.0f;
- if (rotation.x>60.0f) rotation.x=60.0f;
- }
- void Camera::render() {
- glRotatef(-rotation.x,1.0f,0.0f,0.0f);
- glRotatef(-rotation.y,0.0f,1.0f,0.0f);
- glRotatef(-rotation.z,0.0f,0.0f,1.0f);
- glTranslatef(-position.x,-position.y,-position.z);
- }
- void Camera::update(float deltaTime) {
- float change=0.0f;
- if (keys[FORWARD]^keys[BACK]) {
- if (keys[FORWARD]) change=2.5f*deltaTime;
- if (keys[BACK]) change=-2.5f*deltaTime;
- position.x+=cos((rotation.y+90.0f)/180.0f*PI)*change;
- position.z-=sin((rotation.y+90.0f)/180.0f*PI)*change;
- }
- if (keys[M_LEFT]^keys[M_RIGHT]) {
- if (keys[M_LEFT]) change=2.5f*deltaTime;
- if (keys[M_RIGHT]) change=-2.5f*deltaTime;
- position.x-=sin((rotation.y+90.0f)/180.0f*PI)*change;
- position.z-=cos((rotation.y+90.0f)/180.0f*PI)*change;
- }
- if (keys[R_LEFT]^keys[R_RIGHT]) {
- if (keys[R_LEFT]) change=20.0f*deltaTime;
- if (keys[R_RIGHT]) change=-20.0f*deltaTime;
- rotation.y+=change;
- }
- if (keys[M_UP]^keys[M_DOWN]) {
- if (keys[M_UP]) change=1.0f*deltaTime;
- if (keys[M_DOWN]) change=-1.0f*deltaTime;
- position.y+=change;
- }
- if (keys[R_UP]^keys[R_DOWN]) {
- if (keys[R_UP]) change=7.5f*deltaTime;
- if (keys[R_DOWN]) change=-7.5f*deltaTime;
- rotation.x+=change;
- if (rotation.x<-60.0f) rotation.x=-60.0f;
- if (rotation.x>60.0f) rotation.x=60.0f;
- }
- }
- void Camera::setKey(CAMERA_KEYS key,bool value) {
- keys[key]=value;
- }
- void Camera::handleKeyUp(unsigned char key) {
- switch(key) {
- case 'w':
- setKey(FORWARD,true);
- break;
- case 's':
- setKey(BACK,true);
- break;
- case 'a':
- setKey(M_LEFT,true);
- break;
- case 'd':
- setKey(M_RIGHT,true);
- break;
- case 'q':
- setKey(R_LEFT,true);
- break;
- case 'e':
- setKey(R_RIGHT,true);
- break;
- case 'r':
- setKey(M_UP,true);
- break;
- case 'f':
- setKey(M_DOWN,true);
- break;
- case 't':
- setKey(R_UP,true);
- break;
- case 'g':
- setKey(R_DOWN,true);
- break;
- }
- }
- void Camera::handleKeyDown(unsigned char key) {
- switch(key) {
- case 'w':
- setKey(FORWARD,false);
- break;
- case 's':
- setKey(BACK,false);
- break;
- case 'a':
- setKey(M_LEFT,false);
- break;
- case 'd':
- setKey(M_RIGHT,false);
- break;
- case 'q':
- setKey(R_LEFT,false);
- break;
- case 'e':
- setKey(R_RIGHT,false);
- break;
- case 'r':
- setKey(M_UP,false);
- break;
- case 'f':
- setKey(M_DOWN,false);
- break;
- case 't':
- setKey(R_UP,false);
- break;
- case 'g':
- setKey(R_DOWN,false);
- break;
- }
- }
- void Camera::reset() {
- //Init with standard OGL values:
- position = vec3(0.0f,0.0f,10.0f);
- rotation = vec3(-15.0f,0.0f,0.0f);
- }
- void Camera::set_xmodel(XMLNode* _xmodel) {
- xmodel=_xmodel;
- }
- void Camera::update_xmodel() {
- xmodel->ToElement()->SetAttribute("posx",position.x);
- xmodel->ToElement()->SetAttribute("posy",position.y);
- xmodel->ToElement()->SetAttribute("posz",position.z);
- xmodel->ToElement()->SetAttribute("rotx",rotation.x);
- xmodel->ToElement()->SetAttribute("roty",rotation.y);
- xmodel->ToElement()->SetAttribute("rotz",rotation.z);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement