Refactored project structure

- Test project is now separated from engine code
 - Engine code can now initialize OpenGL and GLUT correctly
 - Moved vectors and quaternions to a Math subdirectory

Fixed reorder warning
This commit is contained in:
Teo-CD 2019-11-02 16:25:02 +01:00
parent 205ef0e7aa
commit 9a52587149
14 changed files with 155 additions and 101 deletions

19
example/CMakeLists.txt Normal file
View file

@ -0,0 +1,19 @@
add_executable(tests_opengl
main.cpp
displayers.h
displayers.cpp)
target_link_directories(tests_opengl PRIVATE
${PROJECT_SOURCE_DIR}/src)
target_include_directories(tests_opengl PRIVATE
${PROJECT_SOURCE_DIR}/src)
target_link_libraries(tests_opengl
${OPENGL_LIBRARIES}
${GLUT_LIBRARIES}
engine)
target_include_directories(tests_opengl PRIVATE
${OPENGL_INCLUDE_DIR}
${GLUT_INCLUDE_DIR})

102
example/displayers.cpp Normal file
View file

@ -0,0 +1,102 @@
//
// Created by trotfunky on 24/09/2019.
//
#include "displayers.h"
void display_pyramid(float x, float y, float z, float c, float h)
{
glBegin(GL_TRIANGLES);
// First side
glColor3f(1,0,0);
// Summit
glVertex3f(x,y+h,z);
glVertex3f(x+c/2,y,z+c/2);
glVertex3f(x-c/2,y,z+c/2);
// Second side
glColor3f(0,1,0);
glVertex3f(x,y+h,z);
glVertex3f(x+c/2,y,z+c/2);
glVertex3f(x+c/2,y,z-c/2);
// Third side
glColor3f(0,0,1);
glVertex3f(x,y+h,z);
glVertex3f(x-c/2,y,z+c/2);
glVertex3f(x-c/2,y,z-c/2);
// Fourth side
glColor3f(1,1,0);
glVertex3f(x,y+h,z);
glVertex3f(x-c/2,y,z-c/2);
glVertex3f(x+c/2,y,z-c/2);
glEnd();
// Bottom
glBegin(GL_QUADS);
glColor3f(0,1,1);
glVertex3f(x-c/2,y,z-c/2);
glVertex3f(x-c/2,y,z+c/2);
glVertex3f(x+c/2,y,z+c/2);
glVertex3f(x+c/2,y,z-c/2);
glEnd();
}
void display_rotating_pyramid(float x, float y, float z, float c, float h, float alpha)
{
glPushMatrix();
glTranslatef(x,0,z);
glRotatef(alpha,0,1,0);
glTranslatef(-x,0,-z);
display_pyramid(x,y,z,c,h);
glPopMatrix();
}
void display_tree(float x, float y, float z, float h, float w, const Texture& tree_texture)
{
glEnable(GL_ALPHA_TEST);
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glBindTexture(GL_TEXTURE_2D,tree_texture.opengl_id[0]);
glColor4f(1.0f, 1.0f, 1.0f,1.00);
glBegin(GL_QUADS);
// First rectangle
glTexCoord2f(1,0);
glVertex3f(x+w/2,y,z);
glTexCoord2f(0,0);
glVertex3f(x-w/2,y,z);
glTexCoord2f(0,1);
glVertex3f(x-w/2,y+h,z);
glTexCoord2f(1,1);
glVertex3f(x+w/2,y+h,z);
// Second rectangle
glTexCoord2f(1,0);
glVertex3f(x,y,z+w/2);
glTexCoord2f(0,0);
glVertex3f(x,y,z-w/2);
glTexCoord2f(0,1);
glVertex3f(x,y+h,z-w/2);
glTexCoord2f(1,1);
glVertex3f(x,y+h,z+w/2);
glEnd();
glDisable(GL_ALPHA_TEST);
}

26
example/displayers.h Normal file
View file

@ -0,0 +1,26 @@
//
// Created by trotfunky on 24/09/2019.
//
#ifndef TESTS_OPENGL_DISPLAYERS_H
#define TESTS_OPENGL_DISPLAYERS_H
#include <GL/glut.h>
#include "DataHandling/Texture.h"
/// Displays a square based pyramid from a base position, height and side length
/// \param x X coordinate of the center
/// \param y Y coordinate of the center
/// \param z Z coordinate of the center
/// \param c Side length of the square
/// \param h Height of the pyramid
void display_pyramid(float x, float y, float z, float c, float h);
/// Draw a pyramid rotated around its axis
void display_rotating_pyramid(float x, float y, float z, float c, float h, float alpha);
/// Draw a tree with two quadrilaterals
void display_tree(float x, float y, float z, float h, float w, const Texture& tree_texture);
#endif //TESTS_OPENGL_DISPLAYERS_H

131
example/main.cpp Normal file
View file

@ -0,0 +1,131 @@
#include <GL/glut.h>
#include <GL/gl.h>
#include "Engine.h"
#include "displayers.h"
#include "DataHandling/Texture.h"
#include "DataHandling/Model3D.h"
#include "InputStatus.h"
#include "Camera.h"
volatile unsigned long long int timer_ticks = 0;
static Texture tree_texture;
static Model3D raptor;
static Texture raptor_texture;
void manage_inputs()
{
if (InputStatus::is_mouse_button_pressed(GLUT_LEFT_BUTTON))
{
glClearColor(0,0,0.5,1);
}
else if (InputStatus::is_key_pressed(' '))
{
glClearColor(0.5,0,0,1);
}
else if (InputStatus::is_key_pressed(0x1B))
{
glutDestroyWindow(glutGetWindow());
exit(EXIT_SUCCESS);
}
else
{
glClearColor(0,0,0,1);
}
if (InputStatus::is_special_key_pressed(GLUT_KEY_RIGHT))
{
timer_ticks += 5;
OGLE::camera.translate({0,0,0.1});
}
if (InputStatus::is_special_key_pressed(GLUT_KEY_LEFT))
{
timer_ticks -= 5;
OGLE::camera.translate({0,0,-0.1});
}
if (InputStatus::is_key_pressed(' '))
{
OGLE::camera.translate({0,0.1,0});
}
if (InputStatus::is_special_key_pressed(GLUT_KEY_PAGE_DOWN))
{
OGLE::camera.translate({0,-0.1,0});
}
if (InputStatus::is_special_key_pressed(GLUT_KEY_UP))
{
OGLE::camera.translate({0.1,0,0});
}
if (InputStatus::is_special_key_pressed(GLUT_KEY_DOWN))
{
OGLE::camera.translate({-0.1,0,0});
}
// Get mouse delta since last frame
static Vec2i mouse_delta;
mouse_delta = InputStatus::get_mouse_delta(true);
if (mouse_delta.x != 0 || mouse_delta.y != 0)
{
OGLE::camera.rotate({0,
-mouse_delta.x / InputStatus::mouse_sensitivity.x,
-mouse_delta.y / InputStatus::mouse_sensitivity.y});
}
}
void display()
{
manage_inputs();
float angleY = 1*timer_ticks;
display_rotating_pyramid(-5,-2,-5,2,4,angleY);
display_rotating_pyramid(5,-2,0,1,5,angleY);
display_rotating_pyramid(-2,-2,4,3,2,angleY);
display_tree(0,-5,0,3,5,tree_texture);
glPushMatrix();
glRotatef(angleY,0,-1,0);
raptor.draw_model();
glPopMatrix();
}
void update_angle(int value)
{
timer_ticks++;
glutTimerFunc(50,update_angle,0);
}
int main(int argc, char** argv)
{
OGLE::setup(argc,argv,display);
// Load and generate tree texture
tree_texture.load_rgba_tga("resources/arbre.tga","resources/arbre_masque.tga");
glGenTextures(1,tree_texture.opengl_id);
// TODO : Put in the Texture class
glBindTexture(GL_TEXTURE_2D,tree_texture.opengl_id[0]);
gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGBA8,tree_texture.width,tree_texture.height,GL_RGBA,GL_UNSIGNED_BYTE,tree_texture.image_data);
// Load and generate raptor texture
raptor_texture.load_rgb_tga("resources/RAPTOR.tga");
glGenTextures(1, raptor_texture.opengl_id);
// TODO : Put in the Texture class
glBindTexture(GL_TEXTURE_2D, raptor_texture.opengl_id[0]);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, raptor_texture.width, raptor_texture.height, GL_RGB, GL_UNSIGNED_BYTE, raptor_texture.image_data);
// Load raptor model
raptor.load_ascii_off_file("resources/RAPTOR.off");
raptor.assign_texture(raptor_texture);
raptor.set_scaling(0.01,0.01,0.01);
raptor.set_rotation(-90,1,0,0);
glutTimerFunc(50,update_angle,0);
// Enters main loop, managed by GLUT
glutMainLoop();
return 0;
}