#include "skybox.h" #include "shader.h" #include "camera.h" #include #include "openglrender.h" static const float skyboxVertices[216] = { -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f }; struct mSkybox *MakeSkybox(const char *cubemap) { struct mSkybox *newskybox = (struct mSkybox *) malloc(sizeof(struct mSkybox)); newskybox->shader = MakeShader("skyvert.glsl", "skyfrag.glsl"); shader_compile(newskybox->shader); glGenVertexArrays(1, &newskybox->VAO); glGenBuffers(1, &newskybox->VBO); glBindVertexArray(newskybox->VAO); glBindBuffer(GL_ARRAY_BUFFER, newskybox->VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(skyboxVertices), &skyboxVertices, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void *) 0); shader_use(newskybox->shader); shader_setint(newskybox->shader, "skybox", 0); const char *faces[6] = { "right.jpg", "left.jpg", "top.jpg", "bottom.jpg", "front.jpg", "back.jpg" }; glGenTextures(1, &newskybox->id); glBindTexture(GL_TEXTURE_CUBE_MAP, newskybox->id); char buf[100] = { '\0' }; for (unsigned int i = 0; i < 6; i++) { buf[0] = '\0'; strcat(buf, cubemap); strcat(buf, "/"); strcat(buf, faces[i]); SDL_Surface *data = NULL; //IMG_Load(buf); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, 2048, 2048, 0, GL_RGB, GL_UNSIGNED_BYTE, data->pixels); SDL_FreeSurface(data); } glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_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); return newskybox; } void skybox_draw(const struct mSkybox *skybox, const struct mCamera *camera) { shader_use(skybox->shader); mfloat_t view[16] = { 0.f }; getviewmatrix(view, camera); shader_setmat4(skybox->shader, "skyview", view); // skybox cube glBindVertexArray(skybox->VAO); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_CUBE_MAP, skybox->id); glDrawArrays(GL_TRIANGLES, 0, 36); glBindVertexArray(0); }