#include "Skybox.h" #include "imgui/stb_image.h" Skybox::Skybox() { float side = 50.0f; //size of cube float side2 = side / 2.0f; float v[24 * 3] = { // Front -side2, -side2, side2, side2, -side2, side2, side2, side2, side2, -side2, side2, side2, // Right side2, -side2, side2, side2, -side2, -side2, side2, side2, -side2, side2, side2, side2, // Back -side2, -side2, -side2, -side2, side2, -side2, side2, side2, -side2, side2, -side2, -side2, // Left -side2, -side2, side2, //12 -side2, side2, side2, //13 -side2, side2, -side2, //14 -side2, -side2, -side2, //15 // Bottom -side2, -side2, side2, -side2, -side2, -side2, side2, -side2, -side2, side2, -side2, side2, // Top -side2, side2, side2, side2, side2, side2, side2, side2, -side2, -side2, side2, -side2 }; GLuint el[] = { 0,2,1, 0,3,2, 4,6,5, 4,7,6, 8,10,9, 8,11,10, 12,14,13, 12,15,14, 16,18,17, 16,19,18, 20,22,21, 20,23,22 }; glGenVertexArrays(1, &vao); glBindVertexArray(vao); glGenBuffers(1, &vector_vbo); glBindBuffer(GL_ARRAY_BUFFER, vector_vbo); glBufferData(GL_ARRAY_BUFFER, 24 * 3 * sizeof(GLfloat), v, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, NULL); glEnableVertexAttribArray(0); glGenBuffers(1, &ibo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); glBufferData(GL_ELEMENT_ARRAY_BUFFER, 36 * sizeof(GLuint), el, GL_STATIC_DRAW); glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, 0, NULL); glEnableVertexAttribArray(4); } void Skybox::initialize(std::string skybox_dir, Shader *sky) { glActiveTexture(GL_TEXTURE0); glGenTextures(1, &texID); //set the texID as a member variable glBindTexture(GL_TEXTURE_CUBE_MAP, texID); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); const char * suffixes[] = { "left", "right", "top", "down", "back", "front"}; GLuint targets[] = { GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z }; for (int i = 0; i < 6; i++) { int channel, width, height; unsigned char *image; std::string filename; filename = std::string(skybox_dir + suffixes[i]) + std::string(".JPG"); image = stbi_load(filename.c_str(), &width, &height, &channel, 0); glTexImage2D(targets[i], 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); glGenerateMipmap(GL_TEXTURE_2D); stbi_image_free(image); } glBindTexture(GL_TEXTURE_CUBE_MAP, 0); sky->enable(); sky->addUniform("DrawSkyBox", (int)GL_FALSE); sky->addUniform("CubeMapTex", (int)0); sky->disable(); } Skybox::~Skybox() { glDeleteBuffers(1, &vector_vbo); glDeleteBuffers(1, &ibo); glDeleteVertexArrays(1, &vao); } // //Things to add // //Per model : // // - ModelMatrix // // - MaterialColor void Skybox::draw(Shader *sky_shader, SceneContext &ctx) { sky_shader->enable(); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glm::mat4x4 modelMatrix = glm::scale(glm::mat4(1.0f), glm::vec3(scale)); glm::mat4x4 mvpMatrix = ctx.projectionMatrix * ctx.viewMatrix * modelMatrix; sky_shader->addUniform("mvp", mvpMatrix); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_CUBE_MAP, texID); glBindVertexArray(vao); sky_shader->addUniform("DrawSkyBox", (int)GL_TRUE); int size; glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size); glDrawElements(GL_TRIANGLES, size / sizeof(GLuint), GL_UNSIGNED_INT, 0); sky_shader->addUniform("DrawSkyBox", (int)GL_FALSE); glBindVertexArray(0); glBindTexture(GL_TEXTURE_CUBE_MAP, 0); glDisable(GL_CULL_FACE); sky_shader->disable(); }