Skybox.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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. #include <iostream>
  8. enum{SKY_LEFT=0,SKY_BACK,SKY_RIGHT,SKY_FRONT,SKY_TOP,SKY_BOTTOM};
  9. GLuint skybox[6];
  10. Skybox::Skybox(const float &size, const std::string &folder)
  11. {
  12. this->size = size;
  13. this->folder = folder;
  14. brightness = 80;
  15. targetBrightness = 80;
  16. }
  17. Skybox::~Skybox()
  18. {
  19. glDeleteTextures(6, &skybox[0]);
  20. }
  21. void Skybox::init()
  22. {
  23. skybox[SKY_LEFT] = Util::loadTexture(folder + "left.png");
  24. skybox[SKY_BACK] = Util::loadTexture(folder + "back.png");
  25. skybox[SKY_RIGHT] = Util::loadTexture(folder + "right.png");
  26. skybox[SKY_FRONT] = Util::loadTexture(folder + "front.png");
  27. skybox[SKY_TOP] = Util::loadTexture(folder + "top.png");
  28. skybox[SKY_BOTTOM] = Util::loadTexture(folder + "bottom.png");
  29. }
  30. void Skybox::draw()
  31. {
  32. glColor4f(brightness/255, brightness/255, brightness/255, 1);
  33. bool b1 = glIsEnabled(GL_TEXTURE_2D);
  34. glDisable(GL_LIGHTING);
  35. glDisable(GL_DEPTH_TEST);
  36. glEnable(GL_TEXTURE_2D);
  37. glDisable(GL_COLOR_MATERIAL);
  38. glBindTexture(GL_TEXTURE_2D, skybox[SKY_BACK]);
  39. glBegin(GL_QUADS);
  40. glTexCoord2f(1,1);
  41. glVertex3f(size / 2, size / 2, size / 2);
  42. glTexCoord2f(0,1);
  43. glVertex3f(-size / 2, size / 2, size / 2);
  44. glTexCoord2f(0,0);
  45. glVertex3f(-size / 2, -size / 2, size / 2);
  46. glTexCoord2f(1,0);
  47. glVertex3f(size / 2, -size / 2, size / 2);
  48. glEnd();
  49. glBindTexture(GL_TEXTURE_2D, skybox[SKY_LEFT]);
  50. glBegin(GL_QUADS);
  51. //left face
  52. glTexCoord2f(1,1);
  53. glVertex3f(-size / 2, size / 2, size / 2);
  54. glTexCoord2f(0,1);
  55. glVertex3f(-size / 2, size / 2, -size / 2);
  56. glTexCoord2f(0,0);
  57. glVertex3f(-size / 2, -size / 2, -size / 2);
  58. glTexCoord2f(1,0);
  59. glVertex3f(-size / 2, -size / 2, size / 2);
  60. glEnd();
  61. glBindTexture(GL_TEXTURE_2D, skybox[SKY_FRONT]);
  62. glBegin(GL_QUADS);
  63. //front face
  64. glTexCoord2f(0, 1);
  65. glVertex3f(size / 2, size / 2, -size / 2);
  66. glTexCoord2f(1, 1);
  67. glVertex3f(-size / 2, size / 2, -size / 2);
  68. glTexCoord2f(1, 0);
  69. glVertex3f(-size / 2, -size / 2, -size / 2);
  70. glTexCoord2f(0, 0);
  71. glVertex3f(size / 2, -size / 2, -size / 2);
  72. glEnd();
  73. glBindTexture(GL_TEXTURE_2D, skybox[SKY_RIGHT]);
  74. glBegin(GL_QUADS);
  75. //right face
  76. glTexCoord2f(1, 1);
  77. glVertex3f(size / 2, size / 2, -size / 2);
  78. glTexCoord2f(0,1);
  79. glVertex3f(size / 2, size / 2, size / 2);
  80. glTexCoord2f(0,0);
  81. glVertex3f(size / 2, -size / 2, size / 2);
  82. glTexCoord2f(1, 0);
  83. glVertex3f(size / 2, -size / 2, -size / 2);
  84. glEnd();
  85. glBindTexture(GL_TEXTURE_2D, skybox[SKY_TOP]);
  86. glBegin(GL_QUADS); //top face
  87. glTexCoord2f(0,0);
  88. glVertex3f(size / 2, size / 2, size / 2);
  89. glTexCoord2f(0,1);
  90. glVertex3f(-size / 2, size / 2, size / 2);
  91. glTexCoord2f(1,1);
  92. glVertex3f(-size / 2, size / 2, -size / 2);
  93. glTexCoord2f(1,0);
  94. glVertex3f(size / 2, size / 2, -size / 2);
  95. glEnd();
  96. glBindTexture(GL_TEXTURE_2D, skybox[SKY_BOTTOM]);
  97. glBegin(GL_QUADS);
  98. //bottom face
  99. glTexCoord2f(0,1);
  100. glVertex3f(size / 2, -size / 2, size / 2);
  101. glTexCoord2f(0,0);
  102. glVertex3f(-size / 2, -size / 2, size / 2);
  103. glTexCoord2f(1,0);
  104. glVertex3f(-size / 2, -size / 2, -size / 2);
  105. glTexCoord2f(1,1);
  106. glVertex3f(size / 2, -size / 2, -size / 2);
  107. glEnd();
  108. glEnable(GL_LIGHTING); //turn everything back, which we turned on, and turn everything off, which we have turned on.
  109. glEnable(GL_DEPTH_TEST);
  110. if (!b1)
  111. glDisable(GL_TEXTURE_2D);
  112. }
  113. void Skybox::update(float deltaTime, int curr, int max)
  114. {
  115. targetBrightness = 80 + ((255 - 80) / max) * curr;
  116. if (targetBrightness > brightness + 2)
  117. {
  118. brightness += 20 * deltaTime;
  119. }
  120. if (targetBrightness < brightness - 2)
  121. {
  122. brightness -= 20 * deltaTime;
  123. }
  124. }
  125. GLuint Skybox::loadTexture(const std::string & fileName) //load the filename named texture
  126. {
  127. int width, height, bpp;
  128. stbi_set_flip_vertically_on_load(true);
  129. unsigned char* imgData = stbi_load(fileName.c_str(), &width, &height, &bpp, 4);
  130. GLuint num;
  131. glGenTextures(1, &num);
  132. glBindTexture(GL_TEXTURE_2D, num);
  133. glTexImage2D(GL_TEXTURE_2D,
  134. 0, //level
  135. GL_RGBA, //internal format
  136. width, //width
  137. height, //height
  138. 0, //border
  139. GL_RGBA, //data format
  140. GL_UNSIGNED_BYTE, //data type
  141. imgData); //data
  142. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  143. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  144. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  145. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  146. stbi_image_free(imgData);
  147. return num;
  148. }