Open Source Tomb Raider Engine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Camera.cpp 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /*!
  2. * \file src/Camera.cpp
  3. * \brief OpenGL camera class
  4. *
  5. * \author Mongoose
  6. * \author xythobuz
  7. */
  8. #include <stdio.h>
  9. #include <math.h>
  10. #include "main.h"
  11. #include "Camera.h"
  12. Camera::Camera() {
  13. mViewDistance = 14.0f;
  14. mRotationDeltaX = 1.0f;
  15. mRotationDeltaY = 1.0f;
  16. mTheta = 0.0f;
  17. mTheta2 = 0.0f;
  18. mPos[0] = 0.0f;
  19. mPos[1] = 0.0f;
  20. mPos[2] = 0.0f;
  21. mTarget[0] = 0.0f;
  22. mTarget[1] = 0.0f;
  23. mTarget[2] = mViewDistance;
  24. mSide[0] = 1.0f;
  25. mSide[1] = 0.0f;
  26. mSide[2] = 0.0f;
  27. mUp[0] = 0.0f;
  28. mUp[1] = -1.0f; // 1.0f
  29. mUp[2] = 0.0f;
  30. mQ.setIdentity();
  31. }
  32. void Camera::getPosition(vec3_t pos) {
  33. pos[0] = mPos[0];
  34. pos[1] = mPos[1];
  35. pos[2] = mPos[2];
  36. }
  37. void Camera::getTarget(vec3_t target) {
  38. target[0] = mTarget[0];
  39. target[1] = mTarget[1];
  40. target[2] = mTarget[2];
  41. }
  42. vec_t Camera::getRadianYaw() {
  43. return mTheta;
  44. }
  45. vec_t Camera::getRadianPitch() {
  46. return mTheta2;
  47. }
  48. void Camera::setPosition(vec3_t pos) {
  49. mPos[0] = pos[0];
  50. mPos[1] = pos[1];
  51. mPos[2] = pos[2];
  52. }
  53. void Camera::setSensitivityX(vec_t sens) {
  54. mRotationDeltaX = sens;
  55. }
  56. void Camera::setSensitivityY(vec_t sens) {
  57. mRotationDeltaY = sens;
  58. }
  59. void Camera::update() {
  60. mTarget[2] = (mViewDistance * cosf(mTheta)) + mPos[2];
  61. mTarget[0] = (mViewDistance * sinf(mTheta)) + mPos[0];
  62. mTarget[1] = (mViewDistance * sinf(mTheta2)) + mPos[1]; // + height_offset;
  63. }
  64. void Camera::rotate(float angle, float x, float y, float z) {
  65. Quaternion t, n;
  66. Matrix matrix;
  67. vec_t side[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
  68. vec_t up[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
  69. vec_t look[4] = { 0.0f, 0.0f, -1.0f, 1.0f };
  70. matrix_t m;
  71. t.set(angle, x, y, z);
  72. n = mQ * t;
  73. n.normalize();
  74. n.getMatrix(m);
  75. matrix.setMatrix(m);
  76. matrix.multiply4v(side, mSide);
  77. matrix.multiply4v(look, mTarget);
  78. matrix.multiply4v(up, mUp);
  79. for (int i = 0; i < 3; ++i) {
  80. mSide[i] += mPos[i];
  81. mTarget[i] += mPos[i];
  82. mUp[i] += mPos[i];
  83. }
  84. mQ = n;
  85. }
  86. void Camera::command(enum camera_command cmd) {
  87. switch (cmd) {
  88. case CAMERA_ROTATE_UP:
  89. if (mTheta2 < (M_PI / 2)) {
  90. mTheta2 += mRotationDeltaY;
  91. rotate(mTheta2, 1.0f, 0.0f, 0.0f);
  92. }
  93. break;
  94. case CAMERA_ROTATE_DOWN:
  95. if (mTheta2 > -(M_PI / 2)) {
  96. mTheta2 -= mRotationDeltaY;
  97. rotate(mTheta2, 1.0f, 0.0f, 0.0f);
  98. }
  99. break;
  100. case CAMERA_ROTATE_RIGHT:
  101. mTheta += mRotationDeltaX;
  102. rotate(mTheta, 0.0f, 1.0f, 0.0f);
  103. break;
  104. case CAMERA_ROTATE_LEFT:
  105. mTheta -= mRotationDeltaX;
  106. rotate(mTheta, 0.0f, 1.0f, 0.0f);
  107. break;
  108. }
  109. }