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 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. #else
  11. #include <GL/gl.h>
  12. #include <GL/glu.h>
  13. #endif
  14. #include "main.h"
  15. #include "Sprite.h"
  16. SpriteSequence::~SpriteSequence() {
  17. for (unsigned int i = 0; i < sprites.size(); i++)
  18. delete &sprites.at(i);
  19. }
  20. void SpriteSequence::add(Sprite &s) {
  21. sprites.push_back(&s);
  22. }
  23. unsigned int SpriteSequence::size() {
  24. return sprites.size();
  25. }
  26. Sprite &SpriteSequence::get(unsigned int index) {
  27. return *sprites.at(index);
  28. }
  29. Sprite::Sprite(vec3_t _vertex[4], vec2_t _texel[4], vec3_t _pos, vec_t _radius, int _texture) {
  30. radius = _radius;
  31. texture = _texture;
  32. for (unsigned int i = 0; i < 3; i++) {
  33. vertex[0][i] = _vertex[0][i];
  34. vertex[1][i] = _vertex[1][i];
  35. vertex[2][i] = _vertex[2][i];
  36. vertex[3][i] = _vertex[3][i];
  37. pos[i] = _pos[i];
  38. if (i < 2) {
  39. texel[0][i] = _texel[0][i];
  40. texel[1][i] = _texel[1][i];
  41. texel[2][i] = _texel[2][i];
  42. texel[3][i] = _texel[3][i];
  43. }
  44. }
  45. }
  46. void Sprite::display() {
  47. if (!getRender().isVisible(pos[0], pos[1], pos[2],
  48. radius))
  49. return;
  50. glPushMatrix();
  51. glTranslated(pos[0], pos[1], pos[2]);
  52. // Sprites must always face camera, because they have no depth =)
  53. glRotated(OR_RAD_TO_DEG(getCamera().getRadianYaw()), 0, 1, 0);
  54. switch (getRender().getMode()) {
  55. // No vertex lighting on sprites, as far as I see in specs
  56. // So just draw normal texture, no case 2
  57. case Render::modeSolid:
  58. glBegin(GL_TRIANGLE_STRIP);
  59. glColor3f(texel[0][0], texel[0][1], 0.5);
  60. glVertex3fv(vertex[0]);
  61. glColor3f(texel[1][0], texel[1][1], 0.5);
  62. glVertex3fv(vertex[1]);
  63. glColor3f(texel[3][0], texel[3][1], 0.5);
  64. glVertex3fv(vertex[3]);
  65. glColor3f(texel[2][0], texel[2][1], 0.5);
  66. glVertex3fv(vertex[2]);
  67. glEnd();
  68. break;
  69. case Render::modeWireframe:
  70. glColor3fv(CYAN);
  71. glBegin(GL_LINE_LOOP);
  72. glVertex3fv(vertex[0]);
  73. glVertex3fv(vertex[1]);
  74. glVertex3fv(vertex[2]);
  75. glVertex3fv(vertex[3]);
  76. glEnd();
  77. glColor3fv(WHITE);
  78. break;
  79. default:
  80. glBindTexture(GL_TEXTURE_2D, texture+1);
  81. glBegin(GL_TRIANGLE_STRIP);
  82. glTexCoord2fv(texel[0]);
  83. glVertex3fv(vertex[0]);
  84. glTexCoord2fv(texel[1]);
  85. glVertex3fv(vertex[1]);
  86. glTexCoord2fv(texel[3]);
  87. glVertex3fv(vertex[3]);
  88. glTexCoord2fv(texel[2]);
  89. glVertex3fv(vertex[2]);
  90. glEnd();
  91. }
  92. glPopMatrix();
  93. }