You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

124 lines
4.5 KiB

#include "skybox.h"
#include "utils.h"
void SkyBox::Init(const char *imageDir) {
mShader = new Shader[6];
mVertexBuffer = new VertexBuffer[6];
InitFront(imageDir);
InitBack(imageDir);
InitLeft(imageDir);
InitRight(imageDir);
InitTop(imageDir);
InitBottom(imageDir);
}
void SkyBox::InitFront(const char *imageDir) {
mShader[0].Init("Res/skybox.vs", "Res/skybox.fs");
char temp[256];
memset(temp, 0, 256);
strcpy(temp, imageDir);
strcat(temp, "front.bmp");
mShader[0].SetTexture("U_Texture", temp);
mVertexBuffer[0].SetSize(4);
mVertexBuffer[0].SetPosition(0, -0.5f, -0.5f, -0.5f);
mVertexBuffer[0].SetTexcoord(0, 0.0f, 0.0f);
mVertexBuffer[0].SetPosition(1, 0.5f, -0.5f, -0.5f);
mVertexBuffer[0].SetTexcoord(1, 1.0f, 0.0f);
mVertexBuffer[0].SetPosition(2, -0.5f, 0.5f, -0.5f);
mVertexBuffer[0].SetTexcoord(2, 0.0f, 1.0f);
mVertexBuffer[0].SetPosition(3, 0.5f, 0.5f, -0.5f);
mVertexBuffer[0].SetTexcoord(3, 1.0f, 1.0f);
}
void SkyBox::InitBack(const char *imageDir) {
mShader[1].Init("Res/skybox.vs", "Res/skybox.fs");
char temp[256];
memset(temp, 0, 256);
strcpy(temp, imageDir);
strcat(temp, "back.bmp");
mShader[1].SetTexture("U_Texture", temp);
mVertexBuffer[1].SetSize(4);
mVertexBuffer[1].SetPosition(0, 0.5f, -0.5f, 0.5f);
mVertexBuffer[1].SetTexcoord(0, 0.0f, 0.0f);
mVertexBuffer[1].SetPosition(1, -0.5f, -0.5f, 0.5f);
mVertexBuffer[1].SetTexcoord(1, 1.0f, 0.0f);
mVertexBuffer[1].SetPosition(2, 0.5f, 0.5f, 0.5f);
mVertexBuffer[1].SetTexcoord(2, 0.0f, 1.0f);
mVertexBuffer[1].SetPosition(3, -0.5f, 0.5f, 0.5f);
mVertexBuffer[1].SetTexcoord(3, 1.0f, 1.0f);
}
void SkyBox::InitLeft(const char *imageDir) {
mShader[2].Init("Res/skybox.vs", "Res/skybox.fs");
char temp[256];
memset(temp, 0, 256);
strcpy(temp, imageDir);
strcat(temp, "left.bmp");
mShader[2].SetTexture("U_Texture", temp);
mVertexBuffer[2].SetSize(4);
mVertexBuffer[2].SetPosition(0, -0.5f, -0.5f, 0.5f);
mVertexBuffer[2].SetTexcoord(0, 0.0f, 0.0f);
mVertexBuffer[2].SetPosition(1, -0.5f, -0.5f, -0.5f);
mVertexBuffer[2].SetTexcoord(1, 1.0f, 0.0f);
mVertexBuffer[2].SetPosition(2, -0.5f, 0.5f, 0.5f);
mVertexBuffer[2].SetTexcoord(2, 0.0f, 1.0f);
mVertexBuffer[2].SetPosition(3, -0.5f, 0.5f, -0.5f);
mVertexBuffer[2].SetTexcoord(3, 1.0f, 1.0f);
}
void SkyBox::InitRight(const char *imageDir) {
mShader[3].Init("Res/skybox.vs", "Res/skybox.fs");
char temp[256];
memset(temp, 0, 256);
strcpy(temp, imageDir);
strcat(temp, "right.bmp");
mShader[3].SetTexture("U_Texture", temp);
mVertexBuffer[3].SetSize(4);
mVertexBuffer[3].SetPosition(0, 0.5f, -0.5f, -0.5f);
mVertexBuffer[3].SetTexcoord(0, 0.0f, 0.0f);
mVertexBuffer[3].SetPosition(1, 0.5f, -0.5f, 0.5f);
mVertexBuffer[3].SetTexcoord(1, 1.0f, 0.0f);
mVertexBuffer[3].SetPosition(2, 0.5f, 0.5f, -0.5f);
mVertexBuffer[3].SetTexcoord(2, 0.0f, 1.0f);
mVertexBuffer[3].SetPosition(3, 0.5f, 0.5f, 0.5f);
mVertexBuffer[3].SetTexcoord(3, 1.0f, 1.0f);
}
void SkyBox::InitTop(const char *imageDir) {
mShader[4].Init("Res/skybox.vs", "Res/skybox.fs");
char temp[256];
memset(temp, 0, 256);
strcpy(temp, imageDir);
strcat(temp, "top.bmp");
mShader[4].SetTexture("U_Texture", temp);
mVertexBuffer[4].SetSize(4);
mVertexBuffer[4].SetPosition(0, -0.5f, 0.5f, -0.5f);
mVertexBuffer[4].SetTexcoord(0, 0.0f, 0.0f);
mVertexBuffer[4].SetPosition(1, 0.5f, 0.5f, -0.5f);
mVertexBuffer[4].SetTexcoord(1, 1.0f, 0.0f);
mVertexBuffer[4].SetPosition(2, -0.5f, 0.5f, 0.5f);
mVertexBuffer[4].SetTexcoord(2, 0.0f, 1.0f);
mVertexBuffer[4].SetPosition(3, 0.5f, 0.5f, 0.5f);
mVertexBuffer[4].SetTexcoord(3, 1.0f, 1.0f);
}
void SkyBox::InitBottom(const char *imageDir) {
mShader[5].Init("Res/skybox.vs", "Res/skybox.fs");
char temp[256];
memset(temp, 0, 256);
strcpy(temp, imageDir);
strcat(temp, "bottom.bmp");
mShader[5].SetTexture("U_Texture", temp);
mVertexBuffer[5].SetSize(4);
mVertexBuffer[5].SetPosition(0, -0.5f, -0.5f, 0.5f);
mVertexBuffer[5].SetTexcoord(0, 0.0f, 0.0f);
mVertexBuffer[5].SetPosition(1, 0.5f, -0.5f, 0.5f);
mVertexBuffer[5].SetTexcoord(1, 1.0f, 0.0f);
mVertexBuffer[5].SetPosition(2, -0.5f, -0.5f, -0.5f);
mVertexBuffer[5].SetTexcoord(2, 0.0f, 1.0f);
mVertexBuffer[5].SetPosition(3, 0.5f, -0.5f, -0.5f);
mVertexBuffer[5].SetTexcoord(3, 1.0f, 1.0f);
}
void SkyBox::Draw(glm::mat4 &V, glm::mat4&P, float x, float y, float z) {
glDisable(GL_DEPTH_TEST);
mModelMatrix = glm::translate(x, y, z);
for (int i = 0; i < 6; ++i) {
mVertexBuffer[i].Bind();
mShader[i].Bind(glm::value_ptr(mModelMatrix), glm::value_ptr(V), glm::value_ptr(P));
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
mVertexBuffer[i].Unbind();
}
}