/**
|
|
* Application.hpp
|
|
* Contributors:
|
|
* * Arthur Sonzogni (author)
|
|
* Licence:
|
|
* * MIT
|
|
*/
|
|
|
|
#include "Application.hpp"
|
|
|
|
#include <GL/glew.h>
|
|
#include <GLFW/glfw3.h>
|
|
#include <iostream>
|
|
#include <stdexcept>
|
|
|
|
using namespace std;
|
|
|
|
Application* currentApplication = NULL;
|
|
|
|
Application& Application::getInstance() {
|
|
if (currentApplication)
|
|
return *currentApplication;
|
|
else
|
|
throw std::runtime_error("There is no current Application");
|
|
}
|
|
|
|
Application::Application()
|
|
: state(stateReady), width(640), height(480), title("Application") {
|
|
currentApplication = this;
|
|
|
|
cout << "[Info] GLFW initialisation" << endl;
|
|
|
|
// initialize the GLFW library
|
|
if (!glfwInit()) {
|
|
throw std::runtime_error("Couldn't init GLFW");
|
|
}
|
|
|
|
// setting the opengl version
|
|
int major = 3;
|
|
int minor = 2;
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, major);
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, minor);
|
|
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
|
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
|
|
|
// create the window
|
|
window = glfwCreateWindow(width, height, title.c_str(), NULL, NULL);
|
|
if (!window) {
|
|
glfwTerminate();
|
|
throw std::runtime_error("Couldn't create a window");
|
|
}
|
|
|
|
glfwMakeContextCurrent(window);
|
|
|
|
glewExperimental = GL_TRUE;
|
|
GLenum err = glewInit();
|
|
|
|
if (err != GLEW_OK) {
|
|
glfwTerminate();
|
|
throw std::runtime_error(string("Could initialize GLEW, error = ") +
|
|
(const char*)glewGetErrorString(err));
|
|
}
|
|
|
|
// get version info
|
|
const GLubyte* renderer = glGetString(GL_RENDERER);
|
|
const GLubyte* version = glGetString(GL_VERSION);
|
|
cout << "Renderer: " << renderer << endl;
|
|
cout << "OpenGL version supported " << version << endl;
|
|
|
|
// opengl configuration
|
|
glEnable(GL_DEPTH_TEST); // enable depth-testing
|
|
glDepthFunc(GL_LESS); // depth-testing interprets a smaller value as "closer"
|
|
|
|
// vsync
|
|
// glfwSwapInterval(false);
|
|
}
|
|
|
|
GLFWwindow* Application::getWindow() const {
|
|
return window;
|
|
}
|
|
|
|
void Application::exit() {
|
|
state = stateExit;
|
|
}
|
|
|
|
float Application::getFrameDeltaTime() const {
|
|
return deltaTime;
|
|
}
|
|
|
|
float Application::getTime() const {
|
|
return time;
|
|
}
|
|
|
|
void Application::run() {
|
|
state = stateRun;
|
|
|
|
// Make the window's context current
|
|
glfwMakeContextCurrent(window);
|
|
|
|
time = glfwGetTime();
|
|
|
|
while (state == stateRun) {
|
|
// compute new time and delta time
|
|
float t = glfwGetTime();
|
|
deltaTime = t - time;
|
|
time = t;
|
|
|
|
// detech window related changes
|
|
detectWindowDimensionChange();
|
|
|
|
// execute the frame code
|
|
loop();
|
|
|
|
// Swap Front and Back buffers (double buffering)
|
|
glfwSwapBuffers(window);
|
|
|
|
// Pool and process events
|
|
glfwPollEvents();
|
|
}
|
|
|
|
glfwTerminate();
|
|
}
|
|
|
|
void Application::detectWindowDimensionChange() {
|
|
int w, h;
|
|
glfwGetWindowSize(getWindow(), &w, &h);
|
|
dimensionChanged = (w != width or h != height);
|
|
if (dimensionChanged) {
|
|
width = w;
|
|
height = h;
|
|
glViewport(0, 0, width, height);
|
|
}
|
|
}
|
|
|
|
void Application::loop() {
|
|
cout << "[INFO] : loop" << endl;
|
|
}
|
|
|
|
int Application::getWidth() {
|
|
return width;
|
|
}
|
|
|
|
int Application::getHeight() {
|
|
return height;
|
|
}
|
|
|
|
float Application::getWindowRatio() {
|
|
return float(width) / float(height);
|
|
}
|
|
|
|
bool Application::windowDimensionChanged() {
|
|
return dimensionChanged;
|
|
}
|