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

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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::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. mQ.setIdentity();
  25. }
  26. void Camera::getTarget(float target[3]) {
  27. target[0] = mTarget[0];
  28. target[1] = mTarget[1];
  29. target[2] = mTarget[2];
  30. }
  31. void Camera::setPosition(float pos[3]) {
  32. mPos[0] = pos[0];
  33. mPos[1] = pos[1];
  34. mPos[2] = pos[2];
  35. }
  36. void Camera::update() {
  37. mTarget[0] = (mViewDistance * std::sin(mTheta)) + mPos[0];
  38. mTarget[1] = (mViewDistance * std::sin(mTheta2)) + mPos[1]; // + height_offset;
  39. mTarget[2] = (mViewDistance * std::cos(mTheta)) + mPos[2];
  40. }
  41. void Camera::rotate(float angle, float x, float y, float z) {
  42. Quaternion t, n;
  43. float look[4] = { 0.0f, 0.0f, -1.0f, 1.0f };
  44. t.set(angle, x, y, z);
  45. n = mQ * t;
  46. n.normalize();
  47. Matrix matrix(n);
  48. matrix.multiply4v(look, mTarget);
  49. for (int i = 0; i < 3; ++i)
  50. mTarget[i] += mPos[i];
  51. mQ = n;
  52. }
  53. void Camera::command(enum camera_command cmd) {
  54. switch (cmd) {
  55. case CAMERA_ROTATE_UP:
  56. if (mTheta2 < (OR_PI / 2)) {
  57. mTheta2 += mRotationDeltaY;
  58. rotate(mTheta2, 1.0f, 0.0f, 0.0f);
  59. }
  60. break;
  61. case CAMERA_ROTATE_DOWN:
  62. if (mTheta2 > -(OR_PI / 2)) {
  63. mTheta2 -= mRotationDeltaY;
  64. rotate(mTheta2, 1.0f, 0.0f, 0.0f);
  65. }
  66. break;
  67. case CAMERA_ROTATE_RIGHT:
  68. mTheta += mRotationDeltaX;
  69. rotate(mTheta, 0.0f, 1.0f, 0.0f);
  70. break;
  71. case CAMERA_ROTATE_LEFT:
  72. mTheta -= mRotationDeltaX;
  73. rotate(mTheta, 0.0f, 1.0f, 0.0f);
  74. break;
  75. }
  76. }