Skybox.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include "cmath"
  2. #include <GL/freeglut.h>
  3. #include "Util.h"
  4. #include "stb_image.h"
  5. #include "Skybox.h"
  6. #include <string>
  7. enum{SKY_LEFT=0,SKY_BACK,SKY_RIGHT,SKY_FRONT,SKY_TOP,SKY_BOTTOM};
  8. GLuint skybox[6];
  9. Skybox::Skybox(const float &size, const std::string &folder)
  10. {
  11. this->size = size;
  12. this->folder = folder;
  13. }
  14. Skybox::~Skybox()
  15. {
  16. glDeleteTextures(6, &skybox[0]);
  17. }
  18. void Skybox::init()
  19. {
  20. skybox[SKY_LEFT] = Util::loadTexture(folder + "left.png");
  21. skybox[SKY_BACK] = Util::loadTexture(folder + "back.png");
  22. skybox[SKY_RIGHT] = Util::loadTexture(folder + "right.png");
  23. skybox[SKY_FRONT] = Util::loadTexture(folder + "front.png");
  24. skybox[SKY_TOP] = Util::loadTexture(folder + "top.png");
  25. skybox[SKY_BOTTOM] = Util::loadTexture(folder + "bottom.png");
  26. }
  27. void Skybox::draw()
  28. {
  29. bool b1 = glIsEnabled(GL_TEXTURE_2D);
  30. glDisable(GL_LIGHTING);
  31. glDisable(GL_DEPTH_TEST);
  32. glEnable(GL_TEXTURE_2D);
  33. glDisable(GL_COLOR_MATERIAL);
  34. glBindTexture(GL_TEXTURE_2D, skybox[SKY_BACK]);
  35. glBegin(GL_QUADS);
  36. glTexCoord2f(1,1);
  37. glVertex3f(size / 2, size / 2, size / 2);
  38. glTexCoord2f(0,1);
  39. glVertex3f(-size / 2, size / 2, size / 2);
  40. glTexCoord2f(0,0);
  41. glVertex3f(-size / 2, -size / 2, size / 2);
  42. glTexCoord2f(1,0);
  43. glVertex3f(size / 2, -size / 2, size / 2);
  44. glEnd();
  45. glBindTexture(GL_TEXTURE_2D, skybox[SKY_LEFT]);
  46. glBegin(GL_QUADS);
  47. //left face
  48. glTexCoord2f(1,1);
  49. glVertex3f(-size / 2, size / 2, size / 2);
  50. glTexCoord2f(0,1);
  51. glVertex3f(-size / 2, size / 2, -size / 2);
  52. glTexCoord2f(0,0);
  53. glVertex3f(-size / 2, -size / 2, -size / 2);
  54. glTexCoord2f(1,0);
  55. glVertex3f(-size / 2, -size / 2, size / 2);
  56. glEnd();
  57. glBindTexture(GL_TEXTURE_2D, skybox[SKY_FRONT]);
  58. glBegin(GL_QUADS);
  59. //front face
  60. glTexCoord2f(0, 1);
  61. glVertex3f(size / 2, size / 2, -size / 2);
  62. glTexCoord2f(1, 1);
  63. glVertex3f(-size / 2, size / 2, -size / 2);
  64. glTexCoord2f(1, 0);
  65. glVertex3f(-size / 2, -size / 2, -size / 2);
  66. glTexCoord2f(0, 0);
  67. glVertex3f(size / 2, -size / 2, -size / 2);
  68. glEnd();
  69. glBindTexture(GL_TEXTURE_2D, skybox[SKY_RIGHT]);
  70. glBegin(GL_QUADS);
  71. //right face
  72. glTexCoord2f(1, 1);
  73. glVertex3f(size / 2, size / 2, -size / 2);
  74. glTexCoord2f(0,1);
  75. glVertex3f(size / 2, size / 2, size / 2);
  76. glTexCoord2f(0,0);
  77. glVertex3f(size / 2, -size / 2, size / 2);
  78. glTexCoord2f(1, 0);
  79. glVertex3f(size / 2, -size / 2, -size / 2);
  80. glEnd();
  81. glBindTexture(GL_TEXTURE_2D, skybox[SKY_TOP]);
  82. glBegin(GL_QUADS); //top face
  83. glTexCoord2f(0,0);
  84. glVertex3f(size / 2, size / 2, size / 2);
  85. glTexCoord2f(0,1);
  86. glVertex3f(-size / 2, size / 2, size / 2);
  87. glTexCoord2f(1,1);
  88. glVertex3f(-size / 2, size / 2, -size / 2);
  89. glTexCoord2f(1,0);
  90. glVertex3f(size / 2, size / 2, -size / 2);
  91. glEnd();
  92. glBindTexture(GL_TEXTURE_2D, skybox[SKY_BOTTOM]);
  93. glBegin(GL_QUADS);
  94. //bottom face
  95. glTexCoord2f(0,1);
  96. glVertex3f(size / 2, -size / 2, size / 2);
  97. glTexCoord2f(0,0);
  98. glVertex3f(-size / 2, -size / 2, size / 2);
  99. glTexCoord2f(1,0);
  100. glVertex3f(-size / 2, -size / 2, -size / 2);
  101. glTexCoord2f(1,1);
  102. glVertex3f(size / 2, -size / 2, -size / 2);
  103. glEnd();
  104. glEnable(GL_LIGHTING); //turn everything back, which we turned on, and turn everything off, which we have turned on.
  105. glEnable(GL_DEPTH_TEST);
  106. if (!b1)
  107. glDisable(GL_TEXTURE_2D);
  108. }