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.3KB

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