TP3 + classe Skybox
This commit is contained in:
parent
6f3dd99ab7
commit
167548dfc2
@ -29,6 +29,7 @@
|
|||||||
<ClInclude Include="openglcontext.h" />
|
<ClInclude Include="openglcontext.h" />
|
||||||
<ClInclude Include="player.h" />
|
<ClInclude Include="player.h" />
|
||||||
<ClInclude Include="shader.h" />
|
<ClInclude Include="shader.h" />
|
||||||
|
<ClInclude Include="skybox.h" />
|
||||||
<ClInclude Include="texture.h" />
|
<ClInclude Include="texture.h" />
|
||||||
<ClInclude Include="tool.h" />
|
<ClInclude Include="tool.h" />
|
||||||
<ClInclude Include="transformation.h" />
|
<ClInclude Include="transformation.h" />
|
||||||
@ -43,6 +44,7 @@
|
|||||||
<ClCompile Include="openglcontext.cpp" />
|
<ClCompile Include="openglcontext.cpp" />
|
||||||
<ClCompile Include="player.cpp" />
|
<ClCompile Include="player.cpp" />
|
||||||
<ClCompile Include="shader.cpp" />
|
<ClCompile Include="shader.cpp" />
|
||||||
|
<ClCompile Include="skybox.cpp" />
|
||||||
<ClCompile Include="texture.cpp" />
|
<ClCompile Include="texture.cpp" />
|
||||||
<ClCompile Include="tool.cpp" />
|
<ClCompile Include="tool.cpp" />
|
||||||
<ClCompile Include="transformation.cpp" />
|
<ClCompile Include="transformation.cpp" />
|
||||||
|
@ -56,6 +56,9 @@
|
|||||||
<ClInclude Include="array2d.h">
|
<ClInclude Include="array2d.h">
|
||||||
<Filter>Fichiers d%27en-tête</Filter>
|
<Filter>Fichiers d%27en-tête</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="skybox.h">
|
||||||
|
<Filter>Fichiers d%27en-tête</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="blockinfo.cpp">
|
<ClCompile Include="blockinfo.cpp">
|
||||||
@ -91,6 +94,9 @@
|
|||||||
<ClCompile Include="vertexbuffer.cpp">
|
<ClCompile Include="vertexbuffer.cpp">
|
||||||
<Filter>Fichiers sources</Filter>
|
<Filter>Fichiers sources</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="skybox.cpp">
|
||||||
|
<Filter>Fichiers sources</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Text Include="notes.txt" />
|
<Text Include="notes.txt" />
|
||||||
|
@ -11,8 +11,7 @@ Engine::~Engine() { }
|
|||||||
void Engine::Init()
|
void Engine::Init()
|
||||||
{
|
{
|
||||||
GLenum glewErr = glewInit();
|
GLenum glewErr = glewInit();
|
||||||
if (glewErr != GLEW_OK)
|
if (glewErr != GLEW_OK) {
|
||||||
{
|
|
||||||
std::cerr << " ERREUR GLEW : " << glewGetErrorString(glewErr) << std::endl;
|
std::cerr << " ERREUR GLEW : " << glewGetErrorString(glewErr) << std::endl;
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
@ -29,6 +28,8 @@ void Engine::Init()
|
|||||||
glEnable(GL_LIGHTING);
|
glEnable(GL_LIGHTING);
|
||||||
glEnable(GL_LINE_SMOOTH);
|
glEnable(GL_LINE_SMOOTH);
|
||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
|
||||||
// Light
|
// Light
|
||||||
GLfloat light0Pos[4] = { 0.0f, CHUNK_SIZE_Y, 0.0f, 1.0f };
|
GLfloat light0Pos[4] = { 0.0f, CHUNK_SIZE_Y, 0.0f, 1.0f };
|
||||||
@ -42,16 +43,8 @@ void Engine::Init()
|
|||||||
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0Diff);
|
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0Diff);
|
||||||
glLightfv(GL_LIGHT0, GL_SPECULAR, light0Spec);
|
glLightfv(GL_LIGHT0, GL_SPECULAR, light0Spec);
|
||||||
|
|
||||||
// Lumière de Skybox.
|
// Objet de skybox avec sa propre texture et son propre shader!
|
||||||
GLfloat light1Amb[4] = { 1.5f, 1.5f, 1.5f, 1.5f };
|
m_skybox.Init(0.00013f);
|
||||||
GLfloat light1Diff[4] = { 1.f, 1.f, 1.f, 1.f };
|
|
||||||
GLfloat light1Emi[4] = { 2.f, 2.f, 2.f, 2.f };
|
|
||||||
glLightfv(GL_LIGHT1, GL_AMBIENT, light1Amb);
|
|
||||||
glLightfv(GL_LIGHT1, GL_DIFFUSE, light1Diff);
|
|
||||||
glLightfv(GL_LIGHT1, GL_EMISSION, light1Emi);
|
|
||||||
|
|
||||||
// Blend
|
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
|
|
||||||
// Init testChunk
|
// Init testChunk
|
||||||
for (int x = 0; x < CHUNK_SIZE_X; ++x) {
|
for (int x = 0; x < CHUNK_SIZE_X; ++x) {
|
||||||
@ -71,23 +64,25 @@ void Engine::DeInit() { }
|
|||||||
|
|
||||||
void Engine::LoadResource() {
|
void Engine::LoadResource() {
|
||||||
LoadTexture(m_textureFloor, TEXTURE_PATH "grass.png");
|
LoadTexture(m_textureFloor, TEXTURE_PATH "grass.png");
|
||||||
LoadTexture(m_textureSkybox, TEXTURE_PATH "skybox.png");
|
LoadTexture(m_skybox.GetTexture(), TEXTURE_PATH "skybox.png");
|
||||||
LoadTexture(m_textureCube1, TEXTURE_PATH "metal1.png");
|
LoadTexture(m_textureCube1, TEXTURE_PATH "metal1.png");
|
||||||
LoadTexture(m_textureCube2, TEXTURE_PATH "metal2.png");
|
LoadTexture(m_textureCube2, TEXTURE_PATH "metal2.png");
|
||||||
LoadTexture(m_textureCube3, TEXTURE_PATH "metal3.png");
|
LoadTexture(m_textureCube3, TEXTURE_PATH "metal3.png");
|
||||||
LoadTexture(m_textureCube4, TEXTURE_PATH "metal4.png");
|
LoadTexture(m_textureCube4, TEXTURE_PATH "metal4.png");
|
||||||
|
|
||||||
std::cout << " Loading and compiling shaders ..." << std::endl;
|
std::cout << " Loading and compiling shaders ..." << std::endl;
|
||||||
if (!m_shader01.Load(SHADER_PATH "shader01.vert", SHADER_PATH "shader01.frag", true))
|
if (!m_shader01.Load(SHADER_PATH "shader01.vert", SHADER_PATH "shader01.frag", true)) {
|
||||||
{
|
std::cout << " Failed to load shader " << std::endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_skybox.GetShader().Load(SHADER_PATH "skybox.vert", SHADER_PATH "skybox.frag", true)) {
|
||||||
std::cout << " Failed to load shader " << std::endl;
|
std::cout << " Failed to load shader " << std::endl;
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::UnloadResource()
|
void Engine::UnloadResource(){}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void Engine::Render(float elapsedTime)
|
void Engine::Render(float elapsedTime)
|
||||||
{
|
{
|
||||||
@ -108,77 +103,13 @@ void Engine::Render(float elapsedTime)
|
|||||||
m_player.ApplyTransformation(all);
|
m_player.ApplyTransformation(all);
|
||||||
m_player.ApplyTransformation(skybox, false); // Version d'ApplyTransformation qui ne tient compte que de la rotation
|
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!).
|
// (donc l'objet ne bouge pas relativement au joueur, ce qui est pratique pour une skybox!).
|
||||||
|
|
||||||
// Skybox
|
m_skybox.Render(skybox);
|
||||||
skybox.Use();
|
|
||||||
m_textureSkybox.Bind();
|
|
||||||
glDisable(GL_DEPTH_TEST); // Pour que tout ce qui est dessiné après soit dessiné par-dessus la skybox.
|
|
||||||
glDisable(GL_LIGHT0);
|
|
||||||
glEnable(GL_LIGHT1);
|
|
||||||
glBegin(GL_QUADS);
|
|
||||||
|
|
||||||
glTexCoord2f(0, .5f);
|
|
||||||
glVertex3f(5.f, -5.f, 5.f);
|
|
||||||
glTexCoord2f(.25f, .5f);
|
|
||||||
glVertex3f(-5.f, -5.f, 5.f);
|
|
||||||
glTexCoord2f(.25f, .75f);
|
|
||||||
glVertex3f(-5.f, 5.f, 5.f);
|
|
||||||
glTexCoord2f(0, .75f);
|
|
||||||
glVertex3f(5.f, 5.f, 5.f);
|
|
||||||
|
|
||||||
glTexCoord2f(.25f, .5f);
|
|
||||||
glVertex3f(-5.f, -5.f, 5.f);
|
|
||||||
glTexCoord2f(.50f, .5f);
|
|
||||||
glVertex3f(-5.f, -5.f, -5.f);
|
|
||||||
glTexCoord2f(.50f, .75f);
|
|
||||||
glVertex3f(-5.f, 5.f, -5.f);
|
|
||||||
glTexCoord2f(.25f, .75f);
|
|
||||||
glVertex3f(-5.f, 5.f, 5.f);
|
|
||||||
|
|
||||||
glTexCoord2f(.50f, .5f);
|
|
||||||
glVertex3f(-5.f, -5.f, -5.f);
|
|
||||||
glTexCoord2f(.75f, .5f);
|
|
||||||
glVertex3f(5.f, -5.f, -5.f);
|
|
||||||
glTexCoord2f(.75f, .75f);
|
|
||||||
glVertex3f(5.f, 5.f, -5.f);
|
|
||||||
glTexCoord2f(.50f, .75f);
|
|
||||||
glVertex3f(-5.f, 5.f, -5.f);
|
|
||||||
|
|
||||||
glTexCoord2f(.75f, .5f);
|
|
||||||
glVertex3f(5.f, -5.f, -5.f);
|
|
||||||
glTexCoord2f(1, .5f);
|
|
||||||
glVertex3f(5.f, -5.f, 5.f);
|
|
||||||
glTexCoord2f(1, .75f);
|
|
||||||
glVertex3f(5.f, 5.f, 5.f);
|
|
||||||
glTexCoord2f(.75f, .75f);
|
|
||||||
glVertex3f(5.f, 5.f, -5.f);
|
|
||||||
|
|
||||||
glTexCoord2f(.25f, 1);
|
|
||||||
glVertex3f(5.f, 5.f, -5.f);
|
|
||||||
glTexCoord2f(.50f, 1);
|
|
||||||
glVertex3f(5.f, 5.f, 5.f);
|
|
||||||
glTexCoord2f(.50f, .75f);
|
|
||||||
glVertex3f(-5.f, 5.f, 5.f);
|
|
||||||
glTexCoord2f(.25f, .75f);
|
|
||||||
glVertex3f(-5.f, 5.f, -5.f);
|
|
||||||
|
|
||||||
glTexCoord2f(.50f, .25f);
|
|
||||||
glVertex3f(-5.f, -5.f, 5.f);
|
|
||||||
glTexCoord2f(.75f, .25f);
|
|
||||||
glVertex3f(5.f, -5.f, 5.f);
|
|
||||||
glTexCoord2f(.75f, .5f);
|
|
||||||
glVertex3f(5.f, -5.f, -5.f);
|
|
||||||
glTexCoord2f(.50f, .5f);
|
|
||||||
glVertex3f(-5.f, -5.f, -5.f);
|
|
||||||
|
|
||||||
glEnd();
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
|
||||||
glDisable(GL_LIGHT1);
|
|
||||||
glEnable(GL_LIGHT0);
|
|
||||||
|
|
||||||
// Plancher
|
// Plancher
|
||||||
// Les vertex doivent etre affiches dans le sens anti-horaire (CCW)
|
// Les vertex doivent etre affiches dans le sens anti-horaire (CCW)
|
||||||
all.Use();
|
all.Use();
|
||||||
|
m_shader01.Use();
|
||||||
m_textureFloor.Bind();
|
m_textureFloor.Bind();
|
||||||
float nbRep = 5.f;
|
float nbRep = 5.f;
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
@ -206,9 +137,9 @@ void Engine::Render(float elapsedTime)
|
|||||||
}
|
}
|
||||||
if (m_testChunk.IsDirty())
|
if (m_testChunk.IsDirty())
|
||||||
m_testChunk.Update();
|
m_testChunk.Update();
|
||||||
m_shader01.Use();
|
|
||||||
m_testChunk.Render();
|
m_testChunk.Render();
|
||||||
Shader::Disable();
|
//Shader::Disable();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include "shader.h""
|
#include "shader.h""
|
||||||
#include "player.h"
|
#include "player.h"
|
||||||
#include "chunk.h"
|
#include "chunk.h"
|
||||||
|
#include "skybox.h"
|
||||||
|
|
||||||
class Engine : public OpenglContext
|
class Engine : public OpenglContext
|
||||||
{
|
{
|
||||||
@ -37,6 +38,7 @@ private:
|
|||||||
Texture m_textureCube3;
|
Texture m_textureCube3;
|
||||||
Texture m_textureCube4;
|
Texture m_textureCube4;
|
||||||
|
|
||||||
|
Skybox m_skybox;
|
||||||
Shader m_shader01;
|
Shader m_shader01;
|
||||||
Chunk m_testChunk;
|
Chunk m_testChunk;
|
||||||
Player m_player = Player(Vector3f(0, 0, 0));
|
Player m_player = Player(Vector3f(0, 0, 0));
|
||||||
|
12
SQCSim2021/media/shaders/skybox.frag
Normal file
12
SQCSim2021/media/shaders/skybox.frag
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
uniform sampler2D tex;
|
||||||
|
varying vec4 light;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec4 texel;
|
||||||
|
texel = texture2D(tex,gl_TexCoord[0].st);
|
||||||
|
|
||||||
|
texel *= light;
|
||||||
|
|
||||||
|
gl_FragColor = texel;
|
||||||
|
}
|
8
SQCSim2021/media/shaders/skybox.vert
Normal file
8
SQCSim2021/media/shaders/skybox.vert
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
varying vec4 light;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
light = gl_Color;
|
||||||
|
gl_TexCoord[0] = gl_MultiTexCoord0;
|
||||||
|
gl_Position = ftransform();
|
||||||
|
}
|
@ -37,7 +37,9 @@ void Player::Move(bool front, bool back, bool left, bool right, bool jump, bool
|
|||||||
|
|
||||||
if (dash) dashtimeout = 2;
|
if (dash) dashtimeout = 2;
|
||||||
|
|
||||||
if ((jump || dash) && dbljump < 2 && !jumped ) {
|
if (dbljump >= 2) jump = false;
|
||||||
|
|
||||||
|
if ((jump || dash) && !jumped ) {
|
||||||
accjmp += jump? m_jumpforce: 0.1f;
|
accjmp += jump? m_jumpforce: 0.1f;
|
||||||
jumped = true;
|
jumped = true;
|
||||||
dbljump++;
|
dbljump++;
|
||||||
|
58
SQCSim2021/skybox.cpp
Normal file
58
SQCSim2021/skybox.cpp
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#include "skybox.h"
|
||||||
|
|
||||||
|
Skybox::Skybox() {}
|
||||||
|
|
||||||
|
Skybox::~Skybox() {}
|
||||||
|
|
||||||
|
void Skybox::Init(float size){
|
||||||
|
int count = 0;
|
||||||
|
VertexBuffer::VertexData* vd = new VertexBuffer::VertexData[24];
|
||||||
|
|
||||||
|
vd[count++] = VertexBuffer::VertexData(size, -size, size, 1.f, 1.f, 1.f, 0.f, .5f);
|
||||||
|
vd[count++] = VertexBuffer::VertexData(-size, -size, size, 1.f, 1.f, 1.f, .25f, .5f);
|
||||||
|
vd[count++] = VertexBuffer::VertexData(-size, size, size, 1.f, 1.f, 1.f, .25f, .75f);
|
||||||
|
vd[count++] = VertexBuffer::VertexData(size, size, size, 1.f, 1.f, 1.f, 0.f, .75f);
|
||||||
|
|
||||||
|
vd[count++] = VertexBuffer::VertexData(-size, -size, size, 1.f, 1.f, 1.f, .25f, .5f);
|
||||||
|
vd[count++] = VertexBuffer::VertexData(-size, -size, -size, 1.f, 1.f, 1.f, .5f, .5f);
|
||||||
|
vd[count++] = VertexBuffer::VertexData(-size, size, -size, 1.f, 1.f, 1.f, .5f, .75f);
|
||||||
|
vd[count++] = VertexBuffer::VertexData(-size, size, size, 1.f, 1.f, 1.f, .25f, .75f);
|
||||||
|
|
||||||
|
vd[count++] = VertexBuffer::VertexData(-size, -size, -size, 1.f, 1.f, 1.f, .5f, .5f);
|
||||||
|
vd[count++] = VertexBuffer::VertexData(size, -size, -size, 1.f, 1.f, 1.f, .75f, .5f);
|
||||||
|
vd[count++] = VertexBuffer::VertexData(size, size, -size, 1.f, 1.f, 1.f, .75f, .75f);
|
||||||
|
vd[count++] = VertexBuffer::VertexData(-size, size, -size, 1.f, 1.f, 1.f, .5f, .75f);
|
||||||
|
|
||||||
|
vd[count++] = VertexBuffer::VertexData(size, -size, -size, 1.f, 1.f, 1.f, .75f, .5f);
|
||||||
|
vd[count++] = VertexBuffer::VertexData(size, -size, size, 1.f, 1.f, 1.f, 1.f, .5f);
|
||||||
|
vd[count++] = VertexBuffer::VertexData(size, size, size, 1.f, 1.f, 1.f, 1.f, .75f);
|
||||||
|
vd[count++] = VertexBuffer::VertexData(size, size, -size, 1.f, 1.f, 1.f, .75f, .75f);
|
||||||
|
|
||||||
|
vd[count++] = VertexBuffer::VertexData(size, size, -size, 1.f, 1.f, 1.f, .25f, 1.f);
|
||||||
|
vd[count++] = VertexBuffer::VertexData(size, size, size, 1.f, 1.f, 1.f, .5f, 1.f);
|
||||||
|
vd[count++] = VertexBuffer::VertexData(-size, size, size, 1.f, 1.f, 1.f, .5f, .75f);
|
||||||
|
vd[count++] = VertexBuffer::VertexData(-size, size, -size, 1.f, 1.f, 1.f, .25f, .75f);
|
||||||
|
|
||||||
|
vd[count++] = VertexBuffer::VertexData(-size, -size, size, 1.f, 1.f, 1.f, .5f, .25f);
|
||||||
|
vd[count++] = VertexBuffer::VertexData(size, -size, size, 1.f, 1.f, 1.f, .75f, .25f);
|
||||||
|
vd[count++] = VertexBuffer::VertexData(size, -size, -size, 1.f, 1.f, 1.f, .75f, .5f);
|
||||||
|
vd[count++] = VertexBuffer::VertexData(-size, -size, -size, 1.f, 1.f, 1.f, .5f, .5f);
|
||||||
|
|
||||||
|
m_vertexBuffer.SetMeshData(vd, count);
|
||||||
|
delete[] vd;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Skybox::Render(Transformation tran) const {
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
|
tran.Use();
|
||||||
|
m_texture.Bind();
|
||||||
|
m_shader.Use();
|
||||||
|
m_vertexBuffer.Render();
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
}
|
||||||
|
|
||||||
|
Texture& Skybox::GetTexture() { return m_texture; }
|
||||||
|
|
||||||
|
Shader& Skybox::GetShader() { return m_shader; }
|
||||||
|
|
||||||
|
|
25
SQCSim2021/skybox.h
Normal file
25
SQCSim2021/skybox.h
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#ifndef SKYBOX_H__
|
||||||
|
#define SKYBOX_H__
|
||||||
|
|
||||||
|
#include "define.h"
|
||||||
|
#include "vertexbuffer.h"
|
||||||
|
#include "texture.h"
|
||||||
|
#include "transformation.h"
|
||||||
|
#include "shader.h"
|
||||||
|
|
||||||
|
class Skybox {
|
||||||
|
private:
|
||||||
|
VertexBuffer m_vertexBuffer;
|
||||||
|
Texture m_texture;
|
||||||
|
Shader m_shader;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Skybox();
|
||||||
|
~Skybox();
|
||||||
|
void Init(float size);
|
||||||
|
void Render(Transformation trans) const;
|
||||||
|
Texture& GetTexture();
|
||||||
|
Shader& GetShader();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SKYBOX_H__
|
Loading…
Reference in New Issue
Block a user