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.

Sprite.cpp 2.5KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. Sprite::Sprite(int _numVerts, vec3_t _vertex[4], vec2_t _texel[4], vec3_t _pos, vec_t _radius, int _texture) {
  17. numVerts = _numVerts;
  18. radius = _radius;
  19. texture = _texture;
  20. for (unsigned int i = 0; i < 3; i++) {
  21. vertex[0][i] = _vertex[0][i];
  22. vertex[1][i] = _vertex[1][i];
  23. vertex[2][i] = _vertex[2][i];
  24. vertex[3][i] = _vertex[3][i];
  25. pos[i] = _pos[i];
  26. if (i < 2) {
  27. texel[0][i] = _texel[0][i];
  28. texel[1][i] = _texel[1][i];
  29. texel[2][i] = _texel[2][i];
  30. texel[3][i] = _texel[3][i];
  31. }
  32. }
  33. }
  34. void Sprite::display() {
  35. if (!getRender().isVisible(pos[0], pos[1], pos[2],
  36. radius))
  37. return;
  38. glPushMatrix();
  39. glTranslated(pos[0], pos[1], pos[2]);
  40. // Sprites must always face camera, because they have no depth =)
  41. glRotated(OR_RAD_TO_DEG(getCamera().getRadianYaw()), 0, 1, 0);
  42. switch (getRender().getMode()) {
  43. // No vertex lighting on sprites, as far as I see in specs
  44. // So just draw normal texture, no case 2
  45. case Render::modeSolid:
  46. glBegin(GL_TRIANGLE_STRIP);
  47. glColor3f(texel[0][0], texel[0][1], 0.5);
  48. glVertex3fv(vertex[0]);
  49. glColor3f(texel[1][0], texel[1][1], 0.5);
  50. glVertex3fv(vertex[1]);
  51. glColor3f(texel[3][0], texel[3][1], 0.5);
  52. glVertex3fv(vertex[3]);
  53. glColor3f(texel[2][0], texel[2][1], 0.5);
  54. glVertex3fv(vertex[2]);
  55. glEnd();
  56. break;
  57. case Render::modeWireframe:
  58. glColor3fv(CYAN);
  59. glBegin(GL_LINE_LOOP);
  60. glVertex3fv(vertex[0]);
  61. glVertex3fv(vertex[1]);
  62. glVertex3fv(vertex[2]);
  63. glVertex3fv(vertex[3]);
  64. glEnd();
  65. glColor3fv(WHITE);
  66. break;
  67. default:
  68. glBindTexture(GL_TEXTURE_2D, texture+1);
  69. glBegin(GL_TRIANGLE_STRIP);
  70. glTexCoord2fv(texel[0]);
  71. glVertex3fv(vertex[0]);
  72. glTexCoord2fv(texel[1]);
  73. glVertex3fv(vertex[1]);
  74. glTexCoord2fv(texel[3]);
  75. glVertex3fv(vertex[3]);
  76. glTexCoord2fv(texel[2]);
  77. glVertex3fv(vertex[2]);
  78. glEnd();
  79. }
  80. glPopMatrix();
  81. }