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 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. /*!
  2. * \file src/Camera.cpp
  3. * \brief OpenGL camera class
  4. *
  5. * \author Mongoose
  6. */
  7. #include <stdio.h>
  8. #include <math.h>
  9. #include "main.h"
  10. #include "Camera.h"
  11. Camera::Camera() {
  12. mFlags = 0;
  13. mViewDistance = 14.0f;
  14. mTranslateDelta = 256.0f;
  15. mFlags &= Camera_FlyMode;
  16. reset();
  17. }
  18. void Camera::getPosition(vec3_t pos) {
  19. pos[0] = mPos[0];
  20. pos[1] = mPos[1];
  21. pos[2] = mPos[2];
  22. }
  23. void Camera::getUp(vec3_t up) {
  24. up[0] = mUp[0];
  25. up[1] = mUp[1];
  26. up[2] = mUp[2];
  27. }
  28. void Camera::getTarget(vec3_t target) {
  29. target[0] = mTarget[0];
  30. target[1] = mTarget[1];
  31. target[2] = mTarget[2];
  32. }
  33. float Camera::getYaw() {
  34. return OR_RAD_TO_DEG(mTheta);
  35. }
  36. vec_t Camera::getRadianYaw() {
  37. return mTheta;
  38. }
  39. vec_t Camera::getRadianPitch() {
  40. return mTheta2;
  41. }
  42. void Camera::rotate(float angle, float x, float y, float z) {
  43. Quaternion t, n;
  44. Matrix matrix;
  45. vec_t side[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
  46. vec_t up[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
  47. vec_t look[4] = { 0.0f, 0.0f, -1.0f, 1.0f };
  48. unsigned int i;
  49. matrix_t m;
  50. t.set(angle, x, y, z);
  51. n = mQ * t;
  52. n.normalize();
  53. n.getMatrix(m);
  54. matrix.setMatrix(m);
  55. matrix.multiply4v(side, mSide);
  56. matrix.multiply4v(look, mTarget);
  57. matrix.multiply4v(up, mUp);
  58. for (i = 0; i < 3; ++i) {
  59. mSide[i] += mPos[i];
  60. mTarget[i] += mPos[i];
  61. mUp[i] += mPos[i];
  62. }
  63. mQ = n;
  64. }
  65. void Camera::translate(float x, float y, float z) {
  66. int i;
  67. vec_t result[4];
  68. vec_t v[4];
  69. matrix_t m;
  70. Matrix matrix;
  71. v[0] = x;
  72. v[1] = y;
  73. v[2] = -z;
  74. v[3] = 1;
  75. m[0] = mSide[0] - mPos[0];
  76. m[1] = mUp[0] - mPos[0];
  77. m[2] = mTarget[0] - mPos[0];
  78. m[3] = 0;
  79. m[4] = mSide[1] - mPos[1];
  80. m[5] = mUp[1] - mPos[1];
  81. m[6] = mTarget[1] - mPos[1];
  82. m[7] = 0;
  83. m[8] = mSide[2] - mPos[2];
  84. m[9] = mUp[2] - mPos[2];
  85. m[10] = mTarget[2] - mPos[2];
  86. m[11] = 0;
  87. m[12] = 0;
  88. m[13] = 0;
  89. m[14] = 0;
  90. m[15] = 1;
  91. matrix.setMatrix(m);
  92. matrix.multiply4v(v, result);
  93. for (i = 0; i < 3; ++i) {
  94. mSide[i] += result[i];
  95. mUp[i] += result[i];
  96. mTarget[i] += result[i];
  97. mPos[i] += result[i];
  98. }
  99. mPos[0] = x;
  100. mPos[1] = y;
  101. mPos[2] = z;
  102. }
  103. void Camera::reset() {
  104. mTheta = 0.0f;
  105. mTheta2 = 0.0f;
  106. mPos[0] = 0.0f;
  107. mPos[1] = 0.0f;
  108. mPos[2] = 0.0f;
  109. mTarget[0] = 0.0f;
  110. mTarget[1] = 0.0f;
  111. mTarget[2] = mViewDistance;
  112. mSide[0] = 1.0f;
  113. mSide[1] = 0.0f;
  114. mSide[2] = 0.0f;
  115. mUp[0] = 0.0f;
  116. mUp[1] = 1.0f;
  117. mUp[2] = 0.0f;
  118. mQ.setIdentity();
  119. translate(0.0f, 0.0f, 0.0f);
  120. }
  121. void Camera::command(enum camera_command cmd) {
  122. switch (cmd) {
  123. case CAMERA_MOVE_FORWARD:
  124. if (mFlags & Camera_FlyMode)
  125. mPos[2] += (mTranslateDelta * cosf(mTheta));
  126. mPos[0] += (mTranslateDelta * sinf(mTheta));
  127. mPos[1] += (mTranslateDelta * sinf(mTheta2));
  128. break;
  129. case CAMERA_MOVE_BACKWARD:
  130. if (mFlags & Camera_FlyMode)
  131. mPos[2] -= (mTranslateDelta * cosf(mTheta));
  132. mPos[0] -= (mTranslateDelta * sinf(mTheta));
  133. mPos[1] -= (mTranslateDelta * sinf(mTheta2));
  134. break;
  135. case CAMERA_MOVE_LEFT:
  136. mPos[0] -= (mTranslateDelta * sinf(mTheta - 90.0f));
  137. mPos[2] -= (mTranslateDelta * cosf(mTheta - 90.0f));
  138. break;
  139. case CAMERA_MOVE_RIGHT:
  140. mPos[0] -= (mTranslateDelta * sinf(mTheta + 90.0f));
  141. mPos[2] -= (mTranslateDelta * cosf(mTheta + 90.0f));
  142. break;
  143. case CAMERA_ROTATE_UP:
  144. if (mTheta2 < (M_PI / 2)) {
  145. mTheta2 += gOpenRaider->mCameraRotationDeltaY;
  146. rotate(mTheta2, 1.0f, 0.0f, 0.0f);
  147. }
  148. break;
  149. case CAMERA_ROTATE_DOWN:
  150. if (mTheta2 > -(M_PI / 2)) {
  151. mTheta2 -= gOpenRaider->mCameraRotationDeltaY;
  152. rotate(mTheta2, 1.0f, 0.0f, 0.0f);
  153. }
  154. break;
  155. case CAMERA_ROTATE_RIGHT:
  156. mTheta += gOpenRaider->mCameraRotationDeltaX;
  157. rotate(mTheta, 0.0f, 1.0f, 0.0f);
  158. break;
  159. case CAMERA_ROTATE_LEFT:
  160. mTheta -= gOpenRaider->mCameraRotationDeltaX;
  161. rotate(mTheta, 0.0f, 1.0f, 0.0f);
  162. break;
  163. case CAMERA_MOVE_UP:
  164. mPos[1] -= mTranslateDelta / 2.0f;
  165. mTarget[1] -= mTranslateDelta / 2.0f;
  166. break;
  167. case CAMERA_MOVE_DOWN:
  168. mPos[1] += mTranslateDelta / 2.0f;
  169. mTarget[1] += mTranslateDelta / 2.0f;
  170. break;
  171. case CAMERA_SPEED_UP:
  172. ++mTranslateDelta;
  173. break;
  174. case CAMERA_SPEED_DOWN:
  175. if (--mTranslateDelta < 0.0f)
  176. mTranslateDelta = 1.0f;
  177. break;
  178. }
  179. }
  180. void Camera::setSpeed(float s) {
  181. mTranslateDelta = s;
  182. }
  183. void Camera::update() {
  184. mTarget[2] = (mViewDistance * cosf(mTheta)) + mPos[2];
  185. mTarget[0] = (mViewDistance * sinf(mTheta)) + mPos[0];
  186. mTarget[1] = (mViewDistance * sinf(mTheta2)) + mPos[1]; // + height_offset;
  187. }
  188. void Camera::setPosition(vec3_t pos) {
  189. mPos[0] = pos[0];
  190. mPos[1] = pos[1];
  191. mPos[2] = pos[2];
  192. }
  193. void Camera::setUp(vec3_t up) {
  194. mUp[0] = up[0];
  195. mUp[1] = up[1];
  196. mUp[2] = up[2];
  197. }
  198. void Camera::setTarget(vec3_t target) {
  199. mTarget[0] = target[0];
  200. mTarget[1] = target[1];
  201. mTarget[2] = target[2];
  202. }