⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skybox.cpp

📁 小型的3D游戏引擎
💻 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 + -