📄 skybox.cpp
字号:
#include "../camera.h"
#include "skybox.h"
GcSkybox::GcSkybox()
{
Create();
}
GcSkybox::~GcSkybox()
{
Unload();
}
bool GcSkybox::Draw()
{
if(!AllSidesLoaded()) {
return false;
}
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_ALPHA_TEST);
glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
/* glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);*/
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
float array[16];
glGetFloatv(GL_MODELVIEW_MATRIX, array);
// Set the translation to 0
array[12] = 0.0f;
array[13] = 0.0f;
array[14] = 0.0f;
// Push and load matrix
glPushMatrix();
glLoadMatrixf(array);
// Draw east side
m_side[0]->Bind();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // Gets rid of the seams
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-10.0f, -10.0f, -10.0f);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(10, -10, -10);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(10, 10, -10);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-10, 10, -10);
glEnd();
// Draw north side
m_side[1]->Bind();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(10, -10, -10);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(10, -10, 10);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(10, 10, 10);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(10, 10, -10);
glEnd();
// Draw west side
m_side[2]->Bind();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(10, -10, 10);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-10, -10, 10);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-10, 10, 10);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(10, 10, 10);
glEnd();
// Draw south side
m_side[3]->Bind();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-10, -10, 10);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(-10, -10, -10);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(-10, 10, -10);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-10, 10, 10);
glEnd();
m_side[4]->Bind();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-10, 10, -10);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(10, 10, -10);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(10, 10, 10);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-10, 10, 10);
glEnd();
m_side[5]->Bind();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-10, -10, 10);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(10, -10, 10);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(10, -10, -10);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-10, -10, -10);
glEnd();
glPopMatrix();
glEnable(GL_DEPTH_TEST);
glEnable(GL_ALPHA_TEST);
glDepthMask(GL_TRUE);
return true;
}
bool GcSkybox::LoadSide( char * filename, CardinalPoint side )
{
// If it's reloaded set the loaded sides to 0
if(m_sides_loaded == 6) {
m_sides_loaded = 0;
}
switch( side )
{
case East:
if( !m_side[0]->Create(filename) )
{
g_Debug->Log("Failed to load skybox north\n");
}
break;
case North:
if( !m_side[1]->Create(filename) )
{
g_Debug->Log("Failed to load skybox shout\n");
}
break;
case West:
if( !m_side[2]->Create(filename) )
{
g_Debug->Log("Failed to load skybox west\n");
}
break;
case South:
if( !m_side[3]->Create(filename) )
{
g_Debug->Log("Failed to load skybox east\n");
}
break;
case Up:
if( !m_side[4]->Create(filename) )
{
g_Debug->Log("Failed to load skybox up\n");
}
break;
case Down:
if( !m_side[5]->Create(filename) )
{
g_Debug->Log("Failed to load skybox down\n");
}
break;
}
m_sides_loaded++;
if(m_sides_loaded == 6) {
g_Debug->Log("Skybox loaded\n");
}
return true;
}
bool GcSkybox::Unload()
{
int i;
for( i = 0; i < 6; i++ )
{
delete m_side[i];
}
return true;
}
bool GcSkybox::Create()
{
int i;
for( i = 0; i < 6; i++ )
{
m_side[i] = new GcTexture;
}
m_sides_loaded = 0;
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -