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.

Sprite.cpp 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /*!
  2. * \file src/Sprite.cpp
  3. * \brief World Sprite
  4. *
  5. * \author xythobuz
  6. */
  7. #ifdef __APPLE__
  8. #include <OpenGL/gl.h>
  9. #include <OpenGL/glu.h>
  10. #elif defined WIN32
  11. #include <gl/glew.h>
  12. #include <gl/wglew.h>
  13. #else
  14. #include <GL/gl.h>
  15. #include <GL/glu.h>
  16. #endif
  17. #include "main.h"
  18. #include "Sprite.h"
  19. SpriteSequence::SpriteSequence(TombRaider &tr, unsigned int item, unsigned int sequence) {
  20. for (int i = 0; i < (-tr.SpriteSequence()[sequence].negative_length); i++)
  21. add(*new Sprite(tr, item, sequence, i));
  22. }
  23. SpriteSequence::~SpriteSequence() {
  24. for (unsigned int i = 0; i < sprites.size(); i++)
  25. delete &sprites.at(i);
  26. }
  27. void SpriteSequence::add(Sprite &s) {
  28. sprites.push_back(&s);
  29. }
  30. unsigned int SpriteSequence::size() {
  31. return sprites.size();
  32. }
  33. Sprite &SpriteSequence::get(unsigned int index) {
  34. return *sprites.at(index);
  35. }
  36. Sprite::Sprite(TombRaider &tr, unsigned int item, unsigned int sequence, unsigned int index) {
  37. tr2_item_t *i = tr.Item();
  38. tr2_sprite_texture_t *spriteTextures = tr.Sprite();
  39. tr2_sprite_sequence_t *spriteSequence = tr.SpriteSequence();
  40. //! \fixme index was unused?!
  41. tr2_sprite_texture_t *sprite = &spriteTextures[spriteSequence[sequence].offset + index];
  42. int width = sprite->width >> 8;
  43. int height = sprite->height >> 8;
  44. int x = sprite->x;
  45. int y = sprite->y;
  46. float scale = 4.0f;
  47. float texelScale = 256.0f;
  48. int width2 = (int)(width * scale);
  49. int height2 = (int)(height * scale);
  50. // For vising use
  51. pos[0] = i[item].x;
  52. pos[1] = i[item].y;
  53. pos[2] = i[item].z;
  54. vertex[0][0] = -width2 / 2.0f;
  55. vertex[1][0] = -width2 / 2.0f;
  56. vertex[2][0] = width2 / 2.0f;
  57. vertex[3][0] = width2 / 2.0f;
  58. vertex[0][1] = 0;
  59. vertex[1][1] = -height2;
  60. vertex[2][1] = -height2;
  61. vertex[3][1] = 0;
  62. vertex[0][2] = 0;
  63. vertex[1][2] = 0;
  64. vertex[2][2] = 0;
  65. vertex[3][2] = 0;
  66. texel[3][0] = (vec_t)(x+width)/texelScale;
  67. texel[3][1] = (vec_t)(y+height)/texelScale;
  68. texel[2][0] = (vec_t)(x+width)/texelScale;
  69. texel[2][1] = (vec_t)(y)/texelScale;
  70. texel[1][0] = (vec_t)(x) /texelScale;
  71. texel[1][1] = (vec_t)(y) /texelScale;
  72. texel[0][0] = (vec_t)(x) / texelScale;
  73. texel[0][1] = (vec_t)(y+height)/texelScale;
  74. texture = sprite->tile + getGame().getTextureStart();
  75. radius = width2 / 2.0f;
  76. }
  77. Sprite::Sprite(TombRaider &tr, unsigned int room, unsigned int index) {
  78. float spriteVertices[12];
  79. float spriteTexCoords[8];
  80. tr.getRoomSprite(room, index,
  81. 10.0f, &texture, pos, spriteVertices, spriteTexCoords);
  82. texture += getGame().getTextureStart(); // OpenRaider preloads some textures
  83. for (unsigned int j = 0; j < 12; j++)
  84. vertex[j / 3][j % 3] = spriteVertices[j];
  85. for (unsigned int j = 0; j < 8; j++)
  86. texel[j / 2][j % 2] = spriteTexCoords[j];
  87. }
  88. void Sprite::display() {
  89. if (!getRender().isVisible(pos[0], pos[1], pos[2], radius))
  90. return;
  91. glPushMatrix();
  92. glTranslated(pos[0], pos[1], pos[2]);
  93. // Sprites must always face camera, because they have no depth =)
  94. glRotated(OR_RAD_TO_DEG(getCamera().getRadianYaw()), 0, 1, 0);
  95. switch (getRender().getMode()) {
  96. // No vertex lighting on sprites, as far as I see in specs
  97. // So just draw normal texture, no case 2
  98. case Render::modeSolid:
  99. glBegin(GL_TRIANGLE_STRIP);
  100. glColor3f(texel[0][0], texel[0][1], 0.5);
  101. glVertex3fv(vertex[0]);
  102. glColor3f(texel[1][0], texel[1][1], 0.5);
  103. glVertex3fv(vertex[1]);
  104. glColor3f(texel[3][0], texel[3][1], 0.5);
  105. glVertex3fv(vertex[3]);
  106. glColor3f(texel[2][0], texel[2][1], 0.5);
  107. glVertex3fv(vertex[2]);
  108. glEnd();
  109. break;
  110. case Render::modeWireframe:
  111. glColor3fv(CYAN);
  112. glBegin(GL_LINE_LOOP);
  113. glVertex3fv(vertex[0]);
  114. glVertex3fv(vertex[1]);
  115. glVertex3fv(vertex[2]);
  116. glVertex3fv(vertex[3]);
  117. glEnd();
  118. glColor3fv(WHITE);
  119. break;
  120. default:
  121. glBindTexture(GL_TEXTURE_2D, texture+1);
  122. glBegin(GL_TRIANGLE_STRIP);
  123. glTexCoord2fv(texel[0]);
  124. glVertex3fv(vertex[0]);
  125. glTexCoord2fv(texel[1]);
  126. glVertex3fv(vertex[1]);
  127. glTexCoord2fv(texel[3]);
  128. glVertex3fv(vertex[3]);
  129. glTexCoord2fv(texel[2]);
  130. glVertex3fv(vertex[2]);
  131. glEnd();
  132. }
  133. glPopMatrix();
  134. }