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.

Entity.cpp 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. /*!
  2. * \file src/Entity.cpp
  3. * \brief World Entities
  4. *
  5. * \author xythobuz
  6. */
  7. #include <glm/glm.hpp>
  8. #include "global.h"
  9. #include "Log.h"
  10. #include "World.h"
  11. #include "Entity.h"
  12. Entity::Entity(float p[3], float a[3], int id, long r, unsigned int model) {
  13. for (int i = 0; i < 3; i++) {
  14. pos[i] = p[i];
  15. angles[i] = a[i];
  16. }
  17. objectId = id;
  18. moveType = MoveTypeWalk;
  19. room = r;
  20. skeletalModel = model;
  21. boneFrame = 0;
  22. animationFrame = 0;
  23. idleAnimation = 0;
  24. state = 0;
  25. }
  26. void Entity::display() {
  27. /*
  28. glPushMatrix();
  29. glTranslatef(pos[0], pos[1], pos[2]);
  30. glRotatef(glm::degrees(angles[1]), 0, 1, 0);
  31. glRotatef(glm::degrees(angles[0]), 1, 0, 0);
  32. //glRotatef(glm::degrees(angles[2]), 0, 0, 1);
  33. getWorld().getSkeletalModel(skeletalModel).display(animationFrame, boneFrame);
  34. glPopMatrix();
  35. */
  36. }
  37. void Entity::move(char movement) {
  38. const float moved = 180.0f;
  39. const float testd = 220.0f;
  40. const float camHeight = 8.0f;
  41. float x, y, z, pitch, h, floor, ceiling;
  42. long roomNew, sector;
  43. bool wall;
  44. unsigned int roomFlags;
  45. switch (moveType) {
  46. case MoveTypeWalkNoSwim:
  47. case MoveTypeWalk:
  48. pitch = 0.0f; // in the future pitch could control jump up blocks here
  49. break;
  50. case MoveTypeNoClipping:
  51. case MoveTypeFly:
  52. case MoveTypeSwim:
  53. pitch = angles[2];
  54. break;
  55. }
  56. switch (movement) {
  57. case 'f':
  58. x = pos[0] + (testd * sinf(angles[1]));
  59. y = pos[1] + (testd * sinf(pitch));
  60. z = pos[2] + (testd * cosf(angles[1]));
  61. break;
  62. case 'b':
  63. x = pos[0] - (testd * sinf(angles[1]));
  64. y = pos[1] - (testd * sinf(pitch));
  65. z = pos[2] - (testd * cosf(angles[1]));
  66. break;
  67. case 'l':
  68. x = pos[0] - (testd * sinf(angles[1] + 90.0f));
  69. y = pos[1];
  70. z = pos[2] - (testd * cosf(angles[1] + 90.0f));
  71. break;
  72. case 'r':
  73. x = pos[0] + (testd * sinf(angles[1] + 90.0f));
  74. y = pos[1];
  75. z = pos[2] + (testd * cosf(angles[1] + 90.0f));
  76. break;
  77. default:
  78. return;
  79. }
  80. roomNew = getWorld().getRoomByLocation(room, x, y, z);
  81. if (roomNew == -1) { // Will we hit a portal?
  82. roomNew = getWorld().getRoom(room).getAdjoiningRoom(pos[0], pos[1], pos[2],
  83. x, y, z);
  84. if (roomNew > -1)
  85. getLog() << "Crossing from room " << room << " to " << roomNew << Log::endl;
  86. else
  87. //! \fixme mRooms, sectors, ... are now std::vector, but often upper bound checks are missing
  88. return;
  89. }
  90. roomFlags = getWorld().getRoom(roomNew).getFlags();
  91. sector = getWorld().getRoom(roomNew).getSector(x, z, &floor, &ceiling);
  92. wall = getWorld().getRoom(roomNew).isWall(sector);
  93. // If you're underwater you may want to swim =)
  94. // ...if you're worldMoveType_walkNoSwim, you better hope it's shallow
  95. if ((roomFlags & RoomFlagUnderWater) && (moveType == MoveTypeWalk))
  96. moveType = MoveTypeSwim;
  97. // Don't swim on land
  98. if (!(roomFlags & RoomFlagUnderWater) && (moveType == MoveTypeSwim))
  99. moveType = MoveTypeWalk;
  100. // Mongoose 2002.09.02, Add check for room -> room transition
  101. // (Only allow by movement between rooms by using portals)
  102. if (((moveType == MoveTypeNoClipping) ||
  103. (moveType == MoveTypeFly) ||
  104. (moveType == MoveTypeSwim)) ||
  105. ((roomNew > -1) && (!wall))) {
  106. room = roomNew;
  107. switch (movement) {
  108. case 'f':
  109. x = pos[0] + (moved * sinf(angles[1]));
  110. y = pos[1] + (moved * sinf(pitch));
  111. z = pos[2] + (moved * cosf(angles[1]));
  112. break;
  113. case 'b':
  114. x = pos[0] - (moved * sinf(angles[1]));
  115. y = pos[1] - (moved * sinf(pitch));
  116. z = pos[2] - (moved * cosf(angles[1]));
  117. break;
  118. case 'l':
  119. x = pos[0] - (moved * sinf(angles[1] + 90.0f));
  120. z = pos[2] - (moved * cosf(angles[1] + 90.0f));
  121. break;
  122. case 'r':
  123. x = pos[0] + (moved * sinf(angles[1] + 90.0f));
  124. z = pos[2] + (moved * cosf(angles[1] + 90.0f));
  125. break;
  126. }
  127. /*! \fixme Test for vector (move vector) / plane (portal) collision here
  128. * to see if we need to switch rooms... man...
  129. */
  130. h = y;
  131. getWorld().getRoom(room).getHeightAtPosition(x, &h, z);
  132. switch (moveType) {
  133. case MoveTypeFly:
  134. case MoveTypeSwim:
  135. // Don't fall out of world, avoid a movement that does
  136. if (h > y - camHeight) {
  137. pos[0] = x;
  138. pos[1] = y;
  139. pos[2] = z;
  140. }
  141. break;
  142. case MoveTypeWalk:
  143. case MoveTypeWalkNoSwim:
  144. y = pos[1]; // Override vector movement walking ( er, not pretty )
  145. // Now fake gravity
  146. // Mongoose 2002.08.14, Remember TR is upside down ( you fall 'up' )
  147. //ddist = h - pos[1];
  148. // This is to force false gravity, by making camera stay on ground
  149. pos[1] = h; //roomFloor->bbox_min[1];
  150. // Check for camera below terrian and correct
  151. if (pos[1] < h - camHeight)
  152. pos[1] = h - camHeight;
  153. pos[0] = x;
  154. pos[2] = z;
  155. break;
  156. case MoveTypeNoClipping:
  157. pos[0] = x;
  158. pos[1] = y;
  159. pos[2] = z;
  160. break;
  161. }
  162. }
  163. }
  164. void Entity::print() {
  165. getLog() << "Entity " << objectId << ":" << Log::endl
  166. << " Room " << room << " (" << getWorld().getRoom(room).getFlags()
  167. << ")" << Log::endl
  168. << " " << pos[0] << "x " << pos[1] << "y " << pos[2] << "z"
  169. << Log::endl
  170. << " " << glm::degrees(angles[1]) << " Yaw" << Log::endl;
  171. }
  172. SkeletalModel& Entity::getModel() {
  173. return getWorld().getSkeletalModel(skeletalModel);
  174. }
  175. void Entity::setSkeletalModel(unsigned int model) {
  176. skeletalModel = model;
  177. animationFrame = 0;
  178. boneFrame = 0;
  179. idleAnimation = 0;
  180. }
  181. Entity::MoveType Entity::getMoveType() {
  182. return moveType;
  183. }
  184. void Entity::setMoveType(MoveType m) {
  185. moveType = m;
  186. }
  187. int Entity::getObjectId() {
  188. return objectId;
  189. }
  190. void Entity::setAngles(float a[3]) {
  191. for (unsigned int i = 0; i < 3; i++)
  192. angles[i] = a[i];
  193. }
  194. float Entity::getPos(unsigned int i) {
  195. return pos[i];
  196. }
  197. float Entity::getAngle(unsigned int i) {
  198. return angles[i];
  199. }
  200. long Entity::getRoom() {
  201. return room;
  202. }
  203. unsigned long Entity::getAnimation() {
  204. return animationFrame;
  205. }
  206. void Entity::setAnimation(unsigned long index) {
  207. animationFrame = index;
  208. boneFrame = 0;
  209. }
  210. unsigned long Entity::getBoneFrame() {
  211. return boneFrame;
  212. }
  213. void Entity::setBoneFrame(unsigned long index) {
  214. boneFrame = index;
  215. }
  216. unsigned long Entity::getIdleAnimation() {
  217. return idleAnimation;
  218. }
  219. void Entity::setIdleAnimation(unsigned long index) {
  220. idleAnimation = index;
  221. }