GUI
This commit is contained in:
@@ -28,8 +28,6 @@ void Engine::Init()
|
||||
glEnable(GL_LIGHTING);
|
||||
glEnable(GL_LINE_SMOOTH);
|
||||
glEnable(GL_CULL_FACE);
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
// Light
|
||||
GLfloat light0Pos[4] = { 0.0f, CHUNK_SIZE_Y, 0.0f, 1.0f };
|
||||
@@ -69,9 +67,17 @@ void Engine::LoadResource() {
|
||||
LoadTexture(m_textureFloor, TEXTURE_PATH "grass.png");
|
||||
LoadTexture(m_skybox.GetTexture(), TEXTURE_PATH "skybox.png");
|
||||
LoadTexture(m_textureCube1, TEXTURE_PATH "metal1.png");
|
||||
LoadTexture(m_textureCube2, TEXTURE_PATH "metal2.png");
|
||||
LoadTexture(m_textureCube3, TEXTURE_PATH "metal3.png");
|
||||
LoadTexture(m_textureCube4, TEXTURE_PATH "metal4.png");
|
||||
LoadTexture(m_textureCrosshair, TEXTURE_PATH "cross.bmp");
|
||||
LoadTexture(m_textureFont, TEXTURE_PATH "font.bmp");
|
||||
|
||||
TextureAtlas::TextureIndex texCheckerIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "checker.png");
|
||||
TextureAtlas::TextureIndex texDirtIndex = m_textureAtlas.AddTexture(TEXTURE_PATH "dirt.png");
|
||||
|
||||
if (!m_textureAtlas.Generate(128, false))
|
||||
{
|
||||
std::cout << " Unable to generate texture atlas ..." << std::endl;
|
||||
abort();
|
||||
}
|
||||
|
||||
std::cout << " Loading and compiling shaders ..." << std::endl;
|
||||
if (!m_shader01.Load(SHADER_PATH "shader01.vert", SHADER_PATH "shader01.frag", true)) {
|
||||
@@ -87,8 +93,82 @@ void Engine::LoadResource() {
|
||||
|
||||
void Engine::UnloadResource(){}
|
||||
|
||||
void Engine::Render(float elapsedTime)
|
||||
{
|
||||
void Engine::DrawHud(float elapsedTime) {
|
||||
// Setter le blend function , tout ce qui sera noir sera transparent
|
||||
glDisable(GL_LIGHTING);
|
||||
glColor4f(1.f, 1.f, 1.f, 1.f);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
||||
glEnable(GL_BLEND);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glPushMatrix();
|
||||
glLoadIdentity();
|
||||
glOrtho(0, Width(), 0, Height(), -1, 1);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPushMatrix();
|
||||
|
||||
// Bind de la texture pour le font
|
||||
m_textureFont.Bind();
|
||||
std::ostringstream ss;
|
||||
ss << " Fps : " << GetFps(elapsedTime);
|
||||
PrintText(10, Height() - 25, ss.str());
|
||||
ss.str("");
|
||||
ss << " Velocity : " << m_player.GetVelocity(); // IMPORTANT : on utilise l <20> operateur << pour afficher la position
|
||||
PrintText(10, 10, ss.str());
|
||||
ss.str("");
|
||||
ss << " Direction : " << m_player.GetDirection();
|
||||
PrintText(10, 20, ss.str());
|
||||
ss.str("");
|
||||
ss << " Position : " << m_player.GetPosition();
|
||||
PrintText(10, 30, ss.str());
|
||||
// Affichage du crosshair
|
||||
m_textureCrosshair.Bind();
|
||||
static const int crossSize = 32;
|
||||
glLoadIdentity();
|
||||
glTranslated(Width() / 2 - crossSize / 2, Height() / 2 - crossSize / 2, 0);
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(0, 0);
|
||||
glVertex2i(0, 0);
|
||||
glTexCoord2f(1, 0);
|
||||
glVertex2i(crossSize, 0);
|
||||
glTexCoord2f(1, 1);
|
||||
glVertex2i(crossSize, crossSize);
|
||||
glTexCoord2f(0, 1);
|
||||
glVertex2i(0, crossSize);
|
||||
glEnd();
|
||||
glEnable(GL_LIGHTING);
|
||||
glDisable(GL_BLEND);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glPopMatrix();
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
void Engine::PrintText(unsigned int x, unsigned int y, const std::string& t) {
|
||||
glLoadIdentity();
|
||||
glTranslated(x, y, 0);
|
||||
for (unsigned int i = 0; i < t.length(); ++i) {
|
||||
float left = (float)((t[i] - 32) % 16) / 16.f;
|
||||
float top = (float)((t[i] - 32) / 16) / 16.f;
|
||||
top += .5f;
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(left, 1.f - top - .0625f);
|
||||
glVertex2f(0, 0);
|
||||
glTexCoord2f(left + .0625f, 1.f - top - .0625f);
|
||||
glVertex2f(12, 0);
|
||||
glTexCoord2f(left + .0625f, 1.f - top);
|
||||
glVertex2f(12, 12);
|
||||
glTexCoord2f(left, 1.f - top);
|
||||
glVertex2f(0, 12);
|
||||
glEnd();
|
||||
glTranslated(8, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
int Engine::GetFps(float elapsedTime) const { return 1 / elapsedTime; }
|
||||
|
||||
void Engine::Render(float elapsedTime) {
|
||||
static float gameTime = elapsedTime;
|
||||
|
||||
gameTime += elapsedTime;
|
||||
@@ -103,6 +183,8 @@ void Engine::Render(float elapsedTime)
|
||||
glLoadIdentity();
|
||||
|
||||
m_player.Move(m_keyW, m_keyS, m_keyA, m_keyD, m_keySpace, m_keylshift, elapsedTime);
|
||||
m_audio.Update3DAudio(m_player.GetPosition(), m_player.GetDirection(), m_player.GetVelocity()); // Ajustement du positionnement 3D avec les coordonn<6E>es du joueur et
|
||||
// son vecteur de v<>locit<69> (pour l'effet Doppler)
|
||||
m_player.ApplyTransformation(all);
|
||||
m_player.ApplyTransformation(skybox, false); // Version d'ApplyTransformation qui ne tient compte que de la rotation
|
||||
// (donc l'objet ne bouge pas relativement au joueur, ce qui est pratique pour une skybox!).
|
||||
@@ -129,22 +211,20 @@ void Engine::Render(float elapsedTime)
|
||||
glEnd();
|
||||
|
||||
// Chunk
|
||||
switch ((int)(gameTime * 5) % 4) {
|
||||
case 0: m_textureCube1.Bind();
|
||||
break;
|
||||
case 1: m_textureCube2.Bind();
|
||||
break;
|
||||
case 2: m_textureCube3.Bind();
|
||||
break;
|
||||
case 3: m_textureCube4.Bind();
|
||||
break;
|
||||
}
|
||||
m_textureAtlas.Bind();
|
||||
|
||||
if (m_testChunk.IsDirty())
|
||||
m_testChunk.Update();
|
||||
|
||||
m_testChunk.Render();
|
||||
m_shader01.Disable();
|
||||
|
||||
if (m_wireframe)
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||
DrawHud(elapsedTime);
|
||||
if (m_wireframe)
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||
|
||||
}
|
||||
|
||||
void Engine::KeyPressEvent(unsigned char key)
|
||||
|
Reference in New Issue
Block a user