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.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*!
  2. * \file src/Camera.cpp
  3. * \brief Camera class
  4. *
  5. * \author Mongoose
  6. * \author xythobuz
  7. */
  8. #include "global.h"
  9. #include <cmath>
  10. #include "math/Matrix.h"
  11. #include "Camera.h"
  12. Camera &getCamera() {
  13. static Camera gCamera;
  14. return gCamera;
  15. }
  16. Camera::Camera() {
  17. mViewDistance = 14.0f;
  18. mRotationDeltaX = 1.0f;
  19. mRotationDeltaY = 1.0f;
  20. mTheta = 0.0f;
  21. mTheta2 = 0.0f;
  22. mPos[0] = 0.0f;
  23. mPos[1] = 0.0f;
  24. mPos[2] = 0.0f;
  25. mTarget[0] = 0.0f;
  26. mTarget[1] = 0.0f;
  27. mTarget[2] = mViewDistance;
  28. mQ.setIdentity();
  29. }
  30. void Camera::getTarget(float target[3]) {
  31. target[0] = mTarget[0];
  32. target[1] = mTarget[1];
  33. target[2] = mTarget[2];
  34. }
  35. float Camera::getRadianYaw() {
  36. return mTheta;
  37. }
  38. float Camera::getRadianPitch() {
  39. return mTheta2;
  40. }
  41. void Camera::setPosition(float pos[3]) {
  42. mPos[0] = pos[0];
  43. mPos[1] = pos[1];
  44. mPos[2] = pos[2];
  45. }
  46. void Camera::setSensitivityX(float sens) {
  47. mRotationDeltaX = sens;
  48. }
  49. void Camera::setSensitivityY(float sens) {
  50. mRotationDeltaY = sens;
  51. }
  52. void Camera::update() {
  53. mTarget[0] = (mViewDistance * std::sin(mTheta)) + mPos[0];
  54. mTarget[1] = (mViewDistance * std::sin(mTheta2)) + mPos[1]; // + height_offset;
  55. mTarget[2] = (mViewDistance * std::cos(mTheta)) + mPos[2];
  56. }
  57. void Camera::rotate(float angle, float x, float y, float z) {
  58. Quaternion t, n;
  59. float look[4] = { 0.0f, 0.0f, -1.0f, 1.0f };
  60. t.set(angle, x, y, z);
  61. n = mQ * t;
  62. n.normalize();
  63. Matrix matrix(n);
  64. matrix.multiply4v(look, mTarget);
  65. for (int i = 0; i < 3; ++i)
  66. mTarget[i] += mPos[i];
  67. mQ = n;
  68. }
  69. void Camera::command(enum camera_command cmd) {
  70. switch (cmd) {
  71. case CAMERA_ROTATE_UP:
  72. if (mTheta2 < (OR_PI / 2)) {
  73. mTheta2 += mRotationDeltaY;
  74. rotate(mTheta2, 1.0f, 0.0f, 0.0f);
  75. }
  76. break;
  77. case CAMERA_ROTATE_DOWN:
  78. if (mTheta2 > -(OR_PI / 2)) {
  79. mTheta2 -= mRotationDeltaY;
  80. rotate(mTheta2, 1.0f, 0.0f, 0.0f);
  81. }
  82. break;
  83. case CAMERA_ROTATE_RIGHT:
  84. mTheta += mRotationDeltaX;
  85. rotate(mTheta, 0.0f, 1.0f, 0.0f);
  86. break;
  87. case CAMERA_ROTATE_LEFT:
  88. mTheta -= mRotationDeltaX;
  89. rotate(mTheta, 0.0f, 1.0f, 0.0f);
  90. break;
  91. }
  92. }