2021-09-24 10:15:43 -04:00
# include "engine.h"
# include <algorithm>
# include <cmath>
# include <iostream>
2021-09-27 11:30:18 -04:00
# include "transformation.h"
2021-09-27 13:15:57 -04:00
# include "player.h"
2021-09-24 10:15:43 -04:00
2021-09-27 11:30:18 -04:00
Engine : : Engine ( ) { }
2021-09-24 10:15:43 -04:00
2021-09-27 11:30:18 -04:00
Engine : : ~ Engine ( ) { }
2021-09-24 10:15:43 -04:00
void Engine : : Init ( )
{
2021-09-27 10:20:58 -04:00
glClearColor ( 0.0f , 0.0f , 0.0f , 1.0f ) ;
glEnable ( GL_TEXTURE_2D ) ;
glMatrixMode ( GL_PROJECTION ) ;
glLoadIdentity ( ) ;
gluPerspective ( 45.0f , ( float ) Width ( ) / ( float ) Height ( ) , 0.0001f , 1000.0f ) ;
glEnable ( GL_DEPTH_TEST ) ;
glHint ( GL_PERSPECTIVE_CORRECTION_HINT , GL_NICEST ) ;
glShadeModel ( GL_SMOOTH ) ;
glEnable ( GL_LIGHTING ) ;
glEnable ( GL_LINE_SMOOTH ) ;
2021-10-06 21:32:12 -04:00
glEnable ( GL_CULL_FACE ) ;
// Cull!
glCullFace ( GL_BACK ) ;
2021-09-27 10:20:58 -04:00
// Light
GLfloat light0Pos [ 4 ] = { 0.0f , CHUNK_SIZE_Y , 0.0f , 1.0f } ;
2021-09-27 14:45:59 -04:00
GLfloat light0Amb [ 4 ] = { 0.9f , 0.9f , 0.9f , 1.f } ;
GLfloat light0Diff [ 4 ] = { 1.f , 1.f , 1.f , 1.f } ;
2021-09-27 10:20:58 -04:00
GLfloat light0Spec [ 4 ] = { 0.2f , 0.2f , 0.2f , 1.0f } ;
glEnable ( GL_LIGHT0 ) ;
glLightfv ( GL_LIGHT0 , GL_POSITION , light0Pos ) ;
glLightfv ( GL_LIGHT0 , GL_AMBIENT , light0Amb ) ;
glLightfv ( GL_LIGHT0 , GL_DIFFUSE , light0Diff ) ;
glLightfv ( GL_LIGHT0 , GL_SPECULAR , light0Spec ) ;
2021-10-04 12:29:10 -04:00
// Lumi<6D> re de Skybox.
GLfloat light1Amb [ 4 ] = { 1.5f , 1.5f , 1.5f , 1.5f } ;
GLfloat light1Diff [ 4 ] = { 1.f , 1.f , 1.f , 1.f } ;
2021-10-06 21:32:12 -04:00
GLfloat light1Emi [ 4 ] = { 2.f , 2.f , 2.f , 2.f } ;
2021-10-04 12:29:10 -04:00
glLightfv ( GL_LIGHT1 , GL_AMBIENT , light1Amb ) ;
glLightfv ( GL_LIGHT1 , GL_DIFFUSE , light1Diff ) ;
2021-10-06 21:32:12 -04:00
glLightfv ( GL_LIGHT1 , GL_EMISSION , light1Emi ) ;
2021-10-04 12:29:10 -04:00
// Blend
glBlendFunc ( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA ) ;
2021-09-27 10:20:58 -04:00
CenterMouse ( ) ;
HideCursor ( ) ;
2021-09-24 10:15:43 -04:00
}
2021-09-27 11:30:18 -04:00
void Engine : : DeInit ( ) { }
2021-09-24 10:15:43 -04:00
2021-09-27 11:30:18 -04:00
void Engine : : LoadResource ( ) {
2021-10-02 15:00:48 -04:00
LoadTexture ( m_textureFloor , TEXTURE_PATH " grass.png " ) ;
LoadTexture ( m_textureSkybox , TEXTURE_PATH " skybox.png " ) ;
2021-10-04 12:29:10 -04:00
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 " ) ;
2021-09-24 10:15:43 -04:00
}
void Engine : : UnloadResource ( )
{
}
void Engine : : Render ( float elapsedTime )
{
2021-09-27 10:20:58 -04:00
static float gameTime = elapsedTime ;
gameTime + = elapsedTime ;
2021-09-27 13:15:57 -04:00
Transformation all ;
2021-09-27 13:56:29 -04:00
Transformation skybox ;
2021-09-27 11:30:18 -04:00
2021-09-27 10:20:58 -04:00
glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) ;
// Transformations initiales
glMatrixMode ( GL_MODELVIEW ) ;
glLoadIdentity ( ) ;
2021-10-04 12:29:10 -04:00
m_player . Move ( m_keyW , m_keyS , m_keyA , m_keyD , m_keySpace , m_keylshift , elapsedTime ) ;
2021-09-27 13:15:57 -04:00
m_player . ApplyTransformation ( all ) ;
2021-10-01 08:00:37 -04:00
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!).
2021-09-27 13:15:57 -04:00
2021-10-01 08:00:37 -04:00
// Skybox - Pas de normals pour avoir un <20> clairage flat?
2021-09-27 14:45:59 -04:00
skybox . Use ( ) ;
2021-09-27 10:20:58 -04:00
m_textureSkybox . Bind ( ) ;
2021-10-01 08:00:37 -04:00
glDisable ( GL_DEPTH_TEST ) ; // Pour que tout ce qui est dessin<69> apr<70> s soit dessin<69> par-dessus la skybox.
2021-10-04 12:29:10 -04:00
glDisable ( GL_LIGHT0 ) ;
glEnable ( GL_LIGHT1 ) ;
2021-09-27 10:20:58 -04:00
glBegin ( GL_QUADS ) ;
2021-10-06 21:32:12 -04:00
glTexCoord2f ( 0 , .5f ) ;
2021-10-01 08:00:37 -04:00
glVertex3f ( 5.f , - 5.f , 5.f ) ;
2021-10-06 21:32:12 -04:00
glTexCoord2f ( .25f , .5f ) ;
glVertex3f ( - 5.f , - 5.f , 5.f ) ;
2021-10-02 15:00:48 -04:00
glTexCoord2f ( .25f , .75f ) ;
2021-10-01 08:00:37 -04:00
glVertex3f ( - 5.f , 5.f , 5.f ) ;
2021-10-06 21:32:12 -04:00
glTexCoord2f ( 0 , .75f ) ;
glVertex3f ( 5.f , 5.f , 5.f ) ;
2021-09-27 10:20:58 -04:00
2021-10-06 21:32:12 -04:00
glTexCoord2f ( .25f , .5f ) ;
glVertex3f ( - 5.f , - 5.f , 5.f ) ;
glTexCoord2f ( .50f , .5f ) ;
glVertex3f ( - 5.f , - 5.f , - 5.f ) ;
2021-10-02 15:00:48 -04:00
glTexCoord2f ( .50f , .75f ) ;
glVertex3f ( - 5.f , 5.f , - 5.f ) ;
2021-10-06 21:32:12 -04:00
glTexCoord2f ( .25f , .75f ) ;
glVertex3f ( - 5.f , 5.f , 5.f ) ;
2021-10-02 15:00:48 -04:00
2021-10-06 21:32:12 -04:00
glTexCoord2f ( .50f , .5f ) ;
glVertex3f ( - 5.f , - 5.f , - 5.f ) ;
glTexCoord2f ( .75f , .5f ) ;
glVertex3f ( 5.f , - 5.f , - 5.f ) ;
2021-10-02 15:00:48 -04:00
glTexCoord2f ( .75f , .75f ) ;
glVertex3f ( 5.f , 5.f , - 5.f ) ;
2021-10-06 21:32:12 -04:00
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 ) ;
2021-10-02 15:00:48 -04:00
glTexCoord2f ( 1 , .75f ) ;
2021-10-01 08:00:37 -04:00
glVertex3f ( 5.f , 5.f , 5.f ) ;
2021-10-06 21:32:12 -04:00
glTexCoord2f ( .75f , .75f ) ;
glVertex3f ( 5.f , 5.f , - 5.f ) ;
2021-10-01 08:00:37 -04:00
2021-10-02 15:00:48 -04:00
glTexCoord2f ( .25f , 1 ) ;
glVertex3f ( 5.f , 5.f , - 5.f ) ;
2021-10-06 21:32:12 -04:00
glTexCoord2f ( .50f , 1 ) ;
glVertex3f ( 5.f , 5.f , 5.f ) ;
2021-10-02 15:00:48 -04:00
glTexCoord2f ( .50f , .75f ) ;
glVertex3f ( - 5.f , 5.f , 5.f ) ;
2021-10-06 21:32:12 -04:00
glTexCoord2f ( .25f , .75f ) ;
glVertex3f ( - 5.f , 5.f , - 5.f ) ;
2021-10-02 15:00:48 -04:00
glTexCoord2f ( .50f , .25f ) ;
glVertex3f ( - 5.f , - 5.f , 5.f ) ;
2021-10-06 21:32:12 -04:00
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 ) ;
2021-09-27 13:56:29 -04:00
2021-09-27 10:20:58 -04:00
glEnd ( ) ;
2021-09-27 11:30:18 -04:00
glEnable ( GL_DEPTH_TEST ) ;
2021-10-04 12:29:10 -04:00
glDisable ( GL_LIGHT1 ) ;
glEnable ( GL_LIGHT0 ) ;
2021-09-28 15:33:49 -04:00
2021-09-27 10:20:58 -04:00
// Plancher
// Les vertex doivent etre affiches dans le sens anti-horaire (CCW)
2021-10-04 12:29:10 -04:00
all . Use ( ) ;
2021-09-27 10:20:58 -04:00
m_textureFloor . Bind ( ) ;
2021-10-04 12:29:10 -04:00
float nbRep = 5.f ;
2021-09-27 10:20:58 -04:00
glBegin ( GL_QUADS ) ;
glNormal3f ( 0 , 1 , 0 ) ; // Normal vector
glTexCoord2f ( 0 , 0 ) ;
glVertex3f ( - 100.f , - 2.f , 100.f ) ;
glTexCoord2f ( nbRep , 0 ) ;
glVertex3f ( 100.f , - 2.f , 100.f ) ;
glTexCoord2f ( nbRep , nbRep ) ;
glVertex3f ( 100.f , - 2.f , - 100.f ) ;
glTexCoord2f ( 0 , nbRep ) ;
glVertex3f ( - 100.f , - 2.f , - 100.f ) ;
glEnd ( ) ;
2021-09-27 13:15:57 -04:00
2021-09-27 10:20:58 -04:00
// Cube
2021-09-27 13:15:57 -04:00
all . ApplyTranslation ( 0.f , 0.f , - 10.f ) ;
all . ApplyRotation ( gameTime * 100.f , 0.f , 1.f , 0.f ) ;
all . ApplyRotation ( gameTime * 100.f , 0.f , 0.f , 1.f ) ;
2021-09-27 13:40:22 -04:00
all . ApplyRotation ( gameTime * 100.f , 1.f , 0.f , 0.f ) ;
2021-09-27 13:15:57 -04:00
all . Use ( ) ;
2021-10-04 12:29:10 -04:00
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 ;
}
glEnable ( GL_BLEND ) ;
2021-09-27 10:20:58 -04:00
glBegin ( GL_QUADS ) ;
2021-09-27 13:40:22 -04:00
glNormal3f ( 0 , 0 , 1 ) ;
2021-09-27 11:30:18 -04:00
glTexCoord2f ( 0 , 1 ) ;
2021-10-01 08:00:37 -04:00
glVertex3f ( 0.5f , 0.5f , 0.5f ) ;
glTexCoord2f ( 1 , 1 ) ;
2021-09-27 11:30:18 -04:00
glVertex3f ( - 0.5f , 0.5f , 0.5f ) ;
2021-10-01 08:00:37 -04:00
glTexCoord2f ( 1 , 0 ) ;
glVertex3f ( - 0.5f , - 0.5f , 0.5f ) ;
glTexCoord2f ( 0 , 0 ) ;
glVertex3f ( 0.5f , - 0.5f , 0.5f ) ;
2021-09-27 10:20:58 -04:00
2021-10-01 08:00:37 -04:00
glNormal3f ( 0 , 0 , - 1 ) ;
glTexCoord2f ( 1 , 0 ) ;
glVertex3f ( 0.5f , - 0.5f , - 0.5f ) ;
2021-09-27 10:20:58 -04:00
glTexCoord2f ( 0 , 0 ) ;
2021-09-27 11:30:18 -04:00
glVertex3f ( - 0.5f , - 0.5f , - 0.5f ) ;
2021-09-27 13:35:50 -04:00
glTexCoord2f ( 0 , 1 ) ;
2021-09-27 11:30:18 -04:00
glVertex3f ( - 0.5f , 0.5f , - 0.5f ) ;
2021-09-27 10:20:58 -04:00
glTexCoord2f ( 1 , 1 ) ;
2021-10-01 08:00:37 -04:00
glVertex3f ( 0.5f , 0.5f , - 0.5f ) ;
glNormal3f ( - 1 , 0 , 0 ) ;
glTexCoord2f ( 0 , 1 ) ;
2021-09-27 11:30:18 -04:00
glVertex3f ( - 0.5f , 0.5f , 0.5f ) ;
2021-10-01 08:00:37 -04:00
glTexCoord2f ( 1 , 1 ) ;
glVertex3f ( - 0.5f , 0.5f , - 0.5f ) ;
2021-09-27 13:35:50 -04:00
glTexCoord2f ( 1 , 0 ) ;
2021-10-01 08:00:37 -04:00
glVertex3f ( - 0.5f , - 0.5f , - 0.5f ) ;
glTexCoord2f ( 0 , 0 ) ;
2021-09-27 11:30:18 -04:00
glVertex3f ( - 0.5f , - 0.5f , 0.5f ) ;
2021-09-27 10:20:58 -04:00
2021-09-27 13:35:50 -04:00
glNormal3f ( 1 , 0 , 0 ) ;
2021-09-27 11:30:18 -04:00
glTexCoord2f ( 0 , 1 ) ;
2021-10-01 08:00:37 -04:00
glVertex3f ( 0.5f , 0.5f , - 0.5f ) ;
glTexCoord2f ( 1 , 1 ) ;
2021-09-27 13:35:50 -04:00
glVertex3f ( 0.5f , 0.5f , 0.5f ) ;
2021-10-01 08:00:37 -04:00
glTexCoord2f ( 1 , 0 ) ;
2021-09-27 11:30:18 -04:00
glVertex3f ( 0.5f , - 0.5f , 0.5f ) ;
2021-10-01 08:00:37 -04:00
glTexCoord2f ( 0 , 0 ) ;
glVertex3f ( 0.5f , - 0.5f , - 0.5f ) ;
2021-09-27 10:20:58 -04:00
2021-09-27 13:35:50 -04:00
glNormal3f ( 0 , 1 , 0 ) ;
2021-10-01 08:00:37 -04:00
glTexCoord2f ( 0 , 0 ) ;
2021-09-27 11:30:18 -04:00
glVertex3f ( - 0.5f , 0.5f , - 0.5f ) ;
2021-10-01 08:00:37 -04:00
glTexCoord2f ( 0 , 1 ) ;
2021-09-27 11:30:18 -04:00
glVertex3f ( - 0.5f , 0.5f , 0.5f ) ;
2021-09-27 10:20:58 -04:00
glTexCoord2f ( 1 , 1 ) ;
2021-09-27 11:30:18 -04:00
glVertex3f ( 0.5f , 0.5f , 0.5f ) ;
2021-10-01 08:00:37 -04:00
glTexCoord2f ( 1 , 0 ) ;
2021-09-27 11:30:18 -04:00
glVertex3f ( 0.5f , 0.5f , - 0.5f ) ;
2021-09-27 10:20:58 -04:00
2021-09-27 13:35:50 -04:00
glNormal3f ( 0 , - 1 , 0 ) ;
2021-10-01 08:00:37 -04:00
glTexCoord2f ( 0 , 0 ) ;
2021-09-27 11:30:18 -04:00
glVertex3f ( - 0.5f , - 0.5f , 0.5f ) ;
2021-10-06 21:32:12 -04:00
glTexCoord2f ( 0 , 1 ) ;
glVertex3f ( - 0.5f , - 0.5f , - 0.5f ) ;
2021-09-27 10:20:58 -04:00
glTexCoord2f ( 1 , 1 ) ;
2021-09-27 11:30:18 -04:00
glVertex3f ( 0.5f , - 0.5f , - 0.5f ) ;
2021-10-06 21:32:12 -04:00
glTexCoord2f ( 1 , 0 ) ;
glVertex3f ( 0.5f , - 0.5f , 0.5f ) ;
2021-10-04 12:29:10 -04:00
glDisable ( GL_BLEND ) ;
2021-09-27 10:20:58 -04:00
glEnd ( ) ;
2021-09-24 10:15:43 -04:00
}
void Engine : : KeyPressEvent ( unsigned char key )
{
2021-09-27 10:20:58 -04:00
switch ( key )
{
case 36 : // ESC
Stop ( ) ;
break ;
case 94 : // F10
SetFullscreen ( ! IsFullscreen ( ) ) ;
break ;
case 22 : // W
if ( ! m_keyW ) {
std : : cout < < " W " < < std : : endl ;
m_keyW = true ;
}
break ;
case 0 : // A
if ( ! m_keyA ) {
std : : cout < < " A " < < std : : endl ;
m_keyA = true ;
}
break ;
case 18 : // S
if ( ! m_keyS ) {
std : : cout < < " S " < < std : : endl ;
m_keyS = true ;
}
break ;
case 3 : // D
if ( ! m_keyD ) {
std : : cout < < " D " < < std : : endl ;
m_keyD = true ;
}
break ;
2021-10-04 12:29:10 -04:00
case 38 : // Left Shift
if ( ! m_keylshift ) {
std : : cout < < " Dash! " < < std : : endl ;
m_keylshift = true ;
}
break ;
2021-10-01 10:52:33 -04:00
case 57 : // Space
if ( ! m_keySpace ) {
std : : cout < < " Jump! " < < std : : endl ;
m_keySpace = true ;
}
break ;
2021-09-27 10:20:58 -04:00
case 24 : // Y - Ignorer
case 255 : // Fn - Ignorer
break ;
default :
std : : cout < < " Unhandled key: " < < ( int ) key < < std : : endl ;
}
2021-09-24 10:15:43 -04:00
}
void Engine : : KeyReleaseEvent ( unsigned char key )
{
2021-09-27 10:20:58 -04:00
switch ( key )
{
case 24 : // Y
m_wireframe = ! m_wireframe ;
if ( m_wireframe )
glPolygonMode ( GL_FRONT_AND_BACK , GL_LINE ) ;
else
glPolygonMode ( GL_FRONT_AND_BACK , GL_FILL ) ;
break ;
case 22 : // W
std : : cout < < " rW " < < std : : endl ;
m_keyW = false ;
break ;
case 0 : // A
std : : cout < < " rA " < < std : : endl ;
m_keyA = false ;
break ;
case 18 : // S
std : : cout < < " rS " < < std : : endl ;
m_keyS = false ;
break ;
case 3 : // D
std : : cout < < " rD " < < std : : endl ;
m_keyD = false ;
break ;
2021-10-04 12:29:10 -04:00
case 38 : // Left Shift
std : : cout < < " rLS " < < std : : endl ;
m_keylshift = false ;
case 57 : // Espace
2021-10-01 10:52:33 -04:00
std : : cout < < " rSpace " < < std : : endl ;
m_keySpace = false ;
break ;
2021-09-27 10:20:58 -04:00
}
2021-09-24 10:15:43 -04:00
}
void Engine : : MouseMoveEvent ( int x , int y )
{
2021-10-04 12:29:10 -04:00
m_player . TurnLeftRight ( x - ( Width ( ) / 2 ) ) ;
m_player . TurnTopBottom ( y - ( Height ( ) / 2 ) ) ;
2021-09-27 13:15:57 -04:00
2021-09-27 10:20:58 -04:00
// Centrer la souris seulement si elle n'est pas d<> j<EFBFBD> centr<74> e
// Il est n<> cessaire de faire la v<> rification pour <20> viter de tomber
// dans une boucle infinie o<> l'appel <20> CenterMouse g<> n<EFBFBD> re un
// MouseMoveEvent, qui rapelle CenterMouse qui rapelle un autre
// MouseMoveEvent, etc
if ( x = = ( Width ( ) / 2 ) & & y = = ( Height ( ) / 2 ) )
return ;
CenterMouse ( ) ;
2021-09-24 10:15:43 -04:00
}
void Engine : : MousePressEvent ( const MOUSE_BUTTON & button , int x , int y )
{
}
void Engine : : MouseReleaseEvent ( const MOUSE_BUTTON & button , int x , int y )
{
}
bool Engine : : LoadTexture ( Texture & texture , const std : : string & filename , bool stopOnError )
{
2021-09-27 10:20:58 -04:00
texture . Load ( filename ) ;
if ( ! texture . IsValid ( ) )
{
std : : cerr < < " Unable to load texture ( " < < filename < < " ) " < < std : : endl ;
if ( stopOnError )
Stop ( ) ;
2021-09-24 10:15:43 -04:00
2021-09-27 10:20:58 -04:00
return false ;
}
2021-09-24 10:15:43 -04:00
2021-09-27 10:20:58 -04:00
return true ;
2021-09-24 10:15:43 -04:00
}