123 lines
3.1 KiB
C
123 lines
3.1 KiB
C
#include "skybox.h"
|
|
|
|
#include "shader.h"
|
|
#include "camera.h"
|
|
#include <string.h>
|
|
|
|
#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);
|
|
}
|