Open Source Tomb Raider Engine
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

Camera.cpp 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  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 <MatMath.h>
  10. #include <Camera.h>
  11. #ifdef DEBUG_MEMORY
  12. #include <memory_test.h>
  13. #endif
  14. unsigned int Camera::mCounter = 0;
  15. ////////////////////////////////////////////////////////////
  16. // Constructors
  17. ////////////////////////////////////////////////////////////
  18. Camera::Camera()
  19. {
  20. mId = ++mCounter;
  21. mFlags = 0;
  22. mViewDistance = 14.0f;
  23. mTranslateDelta = 256.0f;
  24. mRotateDelta = HEL_DEG_TO_RAD(15.0f);
  25. mRotateDelta2 = HEL_DEG_TO_RAD(5.0f);
  26. mFlags &= Camera_FlyMode;
  27. reset();
  28. }
  29. Camera::~Camera()
  30. {
  31. }
  32. ////////////////////////////////////////////////////////////
  33. // Public Accessors
  34. ////////////////////////////////////////////////////////////
  35. unsigned int Camera::getId()
  36. {
  37. return mId;
  38. }
  39. void Camera::getPosition(vec3_t pos)
  40. {
  41. pos[0] = mPos[0];
  42. pos[1] = mPos[1];
  43. pos[2] = mPos[2];
  44. }
  45. void Camera::getUp(vec3_t up)
  46. {
  47. up[0] = mUp[0];
  48. up[1] = mUp[1];
  49. up[2] = mUp[2];
  50. }
  51. void Camera::getTarget(vec3_t target)
  52. {
  53. target[0] = mTarget[0];
  54. target[1] = mTarget[1];
  55. target[2] = mTarget[2];
  56. }
  57. float Camera::getYaw()
  58. {
  59. return HEL_RAD_TO_DEG(mTheta);
  60. }
  61. vec_t Camera::getRadianYaw()
  62. {
  63. return mTheta;
  64. }
  65. vec_t Camera::getRadianPitch()
  66. {
  67. return mTheta2;
  68. }
  69. ////////////////////////////////////////////////////////////
  70. // Public Mutators
  71. ////////////////////////////////////////////////////////////
  72. void Camera::rotate(float angle, float x, float y, float z)
  73. {
  74. Quaternion t, n;
  75. Matrix matrix;
  76. vec_t side[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
  77. vec_t up[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
  78. vec_t look[4] = { 0.0f, 0.0f, -1.0f, 1.0f };
  79. unsigned int i;
  80. matrix_t m;
  81. t.set(angle, x, y, z);
  82. n = mQ * t;
  83. n.normalize();
  84. n.getMatrix(m);
  85. matrix.setMatrix(m);
  86. matrix.multiply4v(side, mSide);
  87. matrix.multiply4v(look, mTarget);
  88. matrix.multiply4v(up, mUp);
  89. for (i = 0; i < 3; ++i)
  90. {
  91. mSide[i] += mPos[i];
  92. mTarget[i] += mPos[i];
  93. mUp[i] += mPos[i];
  94. }
  95. mQ = n;
  96. }
  97. void Camera::translate(float x, float y, float z)
  98. {
  99. int i;
  100. vec_t result[4];
  101. vec_t v[4];
  102. matrix_t m;
  103. Matrix matrix;
  104. v[0] = x;
  105. v[1] = y;
  106. v[2] = -z;
  107. v[3] = 1;
  108. m[0] = mSide[0] - mPos[0];
  109. m[1] = mUp[0] - mPos[0];
  110. m[2] = mTarget[0] - mPos[0];
  111. m[3] = 0;
  112. m[4] = mSide[1] - mPos[1];
  113. m[5] = mUp[1] - mPos[1];
  114. m[6] = mTarget[1] - mPos[1];
  115. m[7] = 0;
  116. m[8] = mSide[2] - mPos[2];
  117. m[9] = mUp[2] - mPos[2];
  118. m[10] = mTarget[2] - mPos[2];
  119. m[11] = 0;
  120. m[12] = 0;
  121. m[13] = 0;
  122. m[14] = 0;
  123. m[15] = 1;
  124. matrix.setMatrix(m);
  125. matrix.multiply4v(v, result);
  126. for (i = 0; i < 3; ++i)
  127. {
  128. mSide[i] += result[i];
  129. mUp[i] += result[i];
  130. mTarget[i] += result[i];
  131. mPos[i] += result[i];
  132. }
  133. mPos[0] = x;
  134. mPos[1] = y;
  135. mPos[2] = z;
  136. }
  137. void Camera::reset()
  138. {
  139. mTheta = 0.0f;
  140. mTheta2 = 0.0f;
  141. mPos[0] = 0.0f;
  142. mPos[1] = 0.0f;
  143. mPos[2] = 0.0f;
  144. mTarget[0] = 0.0f;
  145. mTarget[1] = 0.0f;
  146. mTarget[2] = mViewDistance;
  147. mSide[0] = 1.0f;
  148. mSide[1] = 0.0f;
  149. mSide[2] = 0.0f;
  150. mUp[0] = 0.0f;
  151. mUp[1] = 1.0f;
  152. mUp[2] = 0.0f;
  153. mQ.setIdentity();
  154. translate(0.0f, 0.0f, 0.0f);
  155. }
  156. void Camera::setSensitivityY(float angle)
  157. {
  158. mRotateDelta2 = HEL_DEG_TO_RAD(angle);
  159. }
  160. void Camera::setSensitivityX(float angle)
  161. {
  162. mRotateDelta = HEL_DEG_TO_RAD(angle);
  163. }
  164. ////////
  165. void Camera::command(enum camera_command cmd)
  166. {
  167. switch (cmd)
  168. {
  169. case CAMERA_MOVE_FORWARD:
  170. if (mFlags & Camera_FlyMode)
  171. {
  172. mPos[2] += (mTranslateDelta * cosf(mTheta));
  173. }
  174. mPos[0] += (mTranslateDelta * sinf(mTheta));
  175. mPos[1] += (mTranslateDelta * sinf(mTheta2));
  176. break;
  177. case CAMERA_MOVE_BACKWARD:
  178. if (mFlags & Camera_FlyMode)
  179. {
  180. mPos[2] -= (mTranslateDelta * cosf(mTheta));
  181. }
  182. mPos[0] -= (mTranslateDelta * sinf(mTheta));
  183. mPos[1] -= (mTranslateDelta * sinf(mTheta2));
  184. break;
  185. case CAMERA_MOVE_LEFT:
  186. mPos[0] -= (mTranslateDelta * sinf(mTheta - 90.0f));
  187. mPos[2] -= (mTranslateDelta * cosf(mTheta - 90.0f));
  188. break;
  189. case CAMERA_MOVE_RIGHT:
  190. mPos[0] -= (mTranslateDelta * sinf(mTheta + 90.0f));
  191. mPos[2] -= (mTranslateDelta * cosf(mTheta + 90.0f));
  192. break;
  193. case CAMERA_ROTATE_UP:
  194. if (mTheta2 < (M_PI / 2)) {
  195. mTheta2 += mRotateDelta2;
  196. rotate(mTheta2, 1.0f, 0.0f, 0.0f);
  197. }
  198. break;
  199. case CAMERA_ROTATE_DOWN:
  200. if (mTheta2 > -(M_PI / 2)) {
  201. mTheta2 -= mRotateDelta2;
  202. rotate(mTheta2, 1.0f, 0.0f, 0.0f);
  203. }
  204. break;
  205. case CAMERA_ROTATE_RIGHT:
  206. mTheta += mRotateDelta;
  207. rotate(mTheta, 0.0f, 1.0f, 0.0f);
  208. break;
  209. case CAMERA_ROTATE_LEFT:
  210. mTheta -= mRotateDelta;
  211. rotate(mTheta, 0.0f, 1.0f, 0.0f);
  212. break;
  213. case CAMERA_MOVE_UP:
  214. mPos[1] -= mTranslateDelta / 2.0f;
  215. mTarget[1] -= mTranslateDelta / 2.0f;
  216. break;
  217. case CAMERA_MOVE_DOWN:
  218. mPos[1] += mTranslateDelta / 2.0f;
  219. mTarget[1] += mTranslateDelta / 2.0f;
  220. break;
  221. case CAMERA_SPEED_UP:
  222. ++mTranslateDelta;
  223. break;
  224. case CAMERA_SPEED_DOWN:
  225. if (--mTranslateDelta < 0.0f)
  226. mTranslateDelta = 1.0f;
  227. break;
  228. }
  229. }
  230. //! \fixme Mostly invalid for QUAT_CAM (can rotate on XYZ)
  231. bool Camera::isBehind(int x, int z)
  232. {
  233. vec_t bTheta, bCameraX, bCameraZ, Distance;
  234. // Set up a "virtual camera" a huge distance behind us
  235. bTheta = mTheta + HEL_PI;
  236. if (bTheta > HEL_PI)
  237. bTheta -= HEL_2_PI;
  238. // 64k is a fair distance away...
  239. bCameraX = (65536.0f * sinf(bTheta)) + mPos[0];
  240. bCameraZ = (65536.0f * cosf(bTheta)) + mPos[2];
  241. bCameraX -= x;
  242. bCameraZ -= z;
  243. Distance = sqrtf((bCameraX * bCameraX) + (bCameraZ * bCameraZ));
  244. return (Distance < 65536.0f);
  245. }
  246. void Camera::setSpeed(float s)
  247. {
  248. mTranslateDelta = s;
  249. }
  250. void Camera::update()
  251. {
  252. mTarget[2] = (mViewDistance * cosf(mTheta)) + mPos[2];
  253. mTarget[0] = (mViewDistance * sinf(mTheta)) + mPos[0];
  254. mTarget[1] = (mViewDistance * sinf(mTheta2)) + mPos[1]; // + height_offset;
  255. }
  256. void Camera::setPosition(vec3_t pos)
  257. {
  258. mPos[0] = pos[0];
  259. mPos[1] = pos[1];
  260. mPos[2] = pos[2];
  261. }
  262. void Camera::setUp(vec3_t up)
  263. {
  264. mUp[0] = up[0];
  265. mUp[1] = up[1];
  266. mUp[2] = up[2];
  267. }
  268. void Camera::setTarget(vec3_t target)
  269. {
  270. mTarget[0] = target[0];
  271. mTarget[1] = target[1];
  272. mTarget[2] = target[2];
  273. }
  274. ////////////////////////////////////////////////////////////
  275. // Private Accessors
  276. ////////////////////////////////////////////////////////////
  277. ////////////////////////////////////////////////////////////
  278. // Private Mutators
  279. ////////////////////////////////////////////////////////////