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.

RoomData.cpp 6.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. /*!
  2. * \file src/RoomData.cpp
  3. * \brief World Room Mesh
  4. *
  5. * \author xythobuz
  6. */
  7. #include "global.h"
  8. #include "Render.h"
  9. #include "SkeletalModel.h"
  10. #include "World.h"
  11. #include "RoomData.h"
  12. BoundingBox::BoundingBox() {
  13. a[0] = a[1] = a[2] = 0;
  14. b[0] = b[1] = b[2] = 0;
  15. }
  16. void BoundingBox::getBoundingBox(float box[2][3]) {
  17. box[0][0] = a[0];
  18. box[1][0] = b[0];
  19. box[0][1] = a[1];
  20. box[1][1] = b[1];
  21. box[0][2] = a[2];
  22. box[1][2] = b[2];
  23. }
  24. void BoundingBox::setBoundingBox(float min[3], float max[3]) {
  25. a[0] = min[0];
  26. b[0] = max[0];
  27. a[1] = min[1];
  28. b[1] = max[1];
  29. a[2] = min[2];
  30. b[2] = max[2];
  31. }
  32. bool BoundingBox::inBox(float x, float y, float z) {
  33. return ((y > a[1]) && (y < b[1]) && inBoxPlane(x, z));
  34. }
  35. bool BoundingBox::inBoxPlane(float x, float z) {
  36. return ((x > a[0]) && (x < b[0])
  37. && (z > a[2]) && (z < b[2]));
  38. }
  39. void BoundingBox::display(bool points, const unsigned char c1[4], const unsigned char c2[4]) {
  40. // Bind before entering now
  41. //glBindTexture(GL_TEXTURE_2D, 1);
  42. glPointSize(4.0);
  43. //glLineWidth(1.25);
  44. //! \fixme Need to make custom color key for this
  45. glColor3ubv(c1);
  46. glBegin(GL_POINTS);
  47. glVertex3f(b[0], b[1], b[2]);
  48. glVertex3f(a[0], a[1], a[2]);
  49. if (points)
  50. {
  51. glVertex3f(b[0], a[1], b[2]);
  52. glVertex3f(a[0], b[1], b[2]);
  53. glVertex3f(b[0], b[1], a[2]);
  54. glVertex3f(a[0], a[1], b[2]);
  55. glVertex3f(a[0], b[1], a[2]);
  56. glVertex3f(b[0], a[1], a[2]);
  57. }
  58. glEnd();
  59. glColor3ubv(c2);
  60. glBegin(GL_LINES);
  61. // max, top quad
  62. glVertex3f(b[0], b[1], b[2]);
  63. glVertex3f(b[0], a[1], b[2]);
  64. glVertex3f(b[0], b[1], b[2]);
  65. glVertex3f(a[0], b[1], b[2]);
  66. glVertex3f(b[0], b[1], b[2]);
  67. glVertex3f(b[0], b[1], a[2]);
  68. // max-min, vertical quads
  69. glVertex3f(a[0], b[1], b[2]);
  70. glVertex3f(a[0], b[1], a[2]);
  71. glVertex3f(b[0], a[1], b[2]);
  72. glVertex3f(b[0], a[1], a[2]);
  73. glVertex3f(b[0], a[1], b[2]);
  74. glVertex3f(a[0], a[1], b[2]);
  75. // min-max, vertical quads
  76. glVertex3f(b[0], b[1], a[2]);
  77. glVertex3f(b[0], a[1], a[2]);
  78. glVertex3f(b[0], b[1], a[2]);
  79. glVertex3f(a[0], b[1], a[2]);
  80. glVertex3f(a[0], b[1], b[2]);
  81. glVertex3f(a[0], a[1], b[2]);
  82. // min, bottom quad
  83. glVertex3f(a[0], a[1], a[2]);
  84. glVertex3f(a[0], b[1], a[2]);
  85. glVertex3f(a[0], a[1], a[2]);
  86. glVertex3f(b[0], a[1], a[2]);
  87. glVertex3f(a[0], a[1], a[2]);
  88. glVertex3f(a[0], a[1], b[2]);
  89. glEnd();
  90. glPointSize(1.0);
  91. //glLineWidth(1.0);
  92. }
  93. // ----------------------------------------------------------------------------
  94. Light::Light(TombRaider &tr, unsigned int room, unsigned int index) {
  95. unsigned int lightFlags, lightType;
  96. tr.getRoomLight(room, index, pos, color,
  97. dir, &att, &cutoff, &lightType, &lightFlags);
  98. switch (lightType) {
  99. case tombraiderLight_typeDirectional:
  100. type = Light::typeDirectional;
  101. break;
  102. case tombraiderLight_typeSpot:
  103. type = Light::typeSpot;
  104. break;
  105. case tombraiderLight_typePoint:
  106. default:
  107. type = Light::typePoint;
  108. }
  109. //! \todo Light flags?
  110. }
  111. void Light::getPos(float p[4]) {
  112. p[0] = pos[0];
  113. p[1] = pos[1];
  114. p[2] = pos[2];
  115. p[3] = pos[3];
  116. }
  117. void Light::getDir(float d[3]) {
  118. d[0] = dir[0];
  119. d[1] = dir[1];
  120. d[2] = dir[2];
  121. }
  122. float Light::getAtt() {
  123. return att;
  124. }
  125. void Light::getColor(float c[4]) {
  126. c[0] = color[0];
  127. c[1] = color[1];
  128. c[2] = color[2];
  129. c[3] = color[3];
  130. }
  131. float Light::getCutoff() {
  132. return cutoff;
  133. }
  134. Light::LightType Light::getType() {
  135. return type;
  136. }
  137. // ----------------------------------------------------------------------------
  138. StaticModel::StaticModel(TombRaider &tr, unsigned int room, unsigned int i) {
  139. tr.getRoomModel(room, i, &index, pos, &yaw);
  140. }
  141. void StaticModel::display() {
  142. StaticMesh &mesh = getWorld().getStaticMesh(index);
  143. if (!getRender().isVisible(pos[0], pos[1], pos[2], mesh.getRadius()))
  144. return;
  145. glPushMatrix();
  146. glTranslated(pos[0], pos[1], pos[2]);
  147. glRotated(yaw, 0, 1, 0);
  148. mesh.display();
  149. glPopMatrix();
  150. }
  151. bool StaticModel::operator<(const StaticModel &other) {
  152. float distA, distB;
  153. distA = getRender().mViewVolume.getDistToSphereFromNear(pos[0],
  154. pos[1], pos[2], 128.0f);
  155. distB = getRender().mViewVolume.getDistToSphereFromNear(other.pos[0],
  156. other.pos[1], other.pos[2], 128.0f);
  157. return (distA < distB);
  158. }
  159. bool StaticModel::compare(StaticModel *a, StaticModel *b) {
  160. return (*b) < (*a);
  161. }
  162. // ----------------------------------------------------------------------------
  163. Portal::Portal(TombRaider &tr, unsigned int room, unsigned int index, Matrix &transform) {
  164. float portalVertices[12];
  165. tr.getRoomPortal(room, index, &adjoiningRoom, normal, portalVertices);
  166. for (unsigned int j = 0; j < 4; ++j) {
  167. vertices[j][0] = portalVertices[j*3];
  168. vertices[j][1] = portalVertices[j*3+1];
  169. vertices[j][2] = portalVertices[j*3+2];
  170. // Relative coors in vis portals
  171. transform.multiply3v(vertices[j], vertices[j]);
  172. }
  173. }
  174. void Portal::getVertices(float vert[4][3]) {
  175. for (unsigned int i = 0; i < 4; i++) {
  176. for (unsigned int j = 0; j < 3; j++) {
  177. vert[i][j] = vertices[i][j];
  178. }
  179. }
  180. }
  181. int Portal::getAdjoiningRoom() {
  182. return adjoiningRoom;
  183. }
  184. // ----------------------------------------------------------------------------
  185. Box::Box(TombRaider &tr, unsigned int room, unsigned int index) {
  186. tr.getRoomBox(room, index, a, b, c, d);
  187. }
  188. // ----------------------------------------------------------------------------
  189. Sector::Sector(TombRaider &tr, unsigned int room, unsigned int index) {
  190. unsigned int sectorFlags;
  191. int floorDataIndex, boxIndex, roomBelow, roomAbove;
  192. tr.getRoomSector(room, index, &sectorFlags,
  193. &ceiling, &floor, &floorDataIndex, &boxIndex,
  194. &roomBelow, &roomAbove);
  195. wall = (sectorFlags & tombraiderSector_wall);
  196. }
  197. float Sector::getFloor() {
  198. return floor;
  199. }
  200. float Sector::getCeiling() {
  201. return ceiling;
  202. }
  203. bool Sector::isWall() {
  204. return wall;
  205. }