Files
fall-fever/src/Window.cpp

174 lines
4.2 KiB
C++

#include <glad/glad.h>
#include <iostream>
#include "Helper.h"
#include "Window.h"
#include "defines.h"
#include "eventActions.h"
Window::Window()
{
// Initialize GLFW
if (!glfwInit()) {
exit(-1);
}
width = INIT_WINDOW_WIDTH;
height = INIT_WINDOW_HEIGHT;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef _DEBUG
glfwSetErrorCallback(glfw_error_callback);
glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_TRUE);
#else
// Maximize in release build
glfwWindowHint(GLFW_MAXIMIZED, GLFW_TRUE);
#endif
window = glfwCreateWindow(width, height, "OpenGL", NULL, NULL);
if (!window) {
std::cout << "Failed to create window" << std::endl;
}
// Wait for window to maximize (in case)
Helper::sleep(1000);
glfwGetWindowPos(window, &posX, &posY);
glfwGetWindowSize(window, &width, &height);
// Create OpenGL context
glfwMakeContextCurrent(window);
// Initialize GLAD
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
std::cout << "Failed to initialize GLAD" << std::endl;
exit(-1);
}
#ifdef _DEBUG
std::cout << "OpenGL version: " << glGetString(GL_VERSION) << std::endl;
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
glDebugMessageCallback(Helper::gl_debug_callback, NULL);
// Disable mouse cursor
mouseCatched = false;
#endif
// Enable z buffer
glEnable(GL_DEPTH_TEST);
// Enable face culling
glEnable(GL_CULL_FACE);
glFrontFace(GL_CW);
glCullFace(GL_FRONT);
// Enable multisampling (a bit redundant because most graphics drivers do this automatically)
glEnable(GL_MULTISAMPLE);
// Disable VSync since my sleep function handles this
glfwSwapInterval(0);
setCatchedCursor(mouseCatched);
glViewport(0, 0, width, height);
// Tell GLFW which function to call when window is resized
// glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
}
Window::~Window()
{
glfwDestroyWindow(window);
glfwTerminate();
}
bool Window::isWindowResized()
{
int new_width, new_height, new_posx, new_posy;
glfwGetFramebufferSize(window, &new_width, &new_height);
glfwGetWindowPos(window, &new_posx, &new_posy);
return !(new_width == width && new_height == height && new_posx == posX && new_posy == posY);
}
void Window::updateWindowDimensions()
{
glfwGetFramebufferSize(window, &width, &height);
glfwGetWindowPos(window, &posX, &posY);
glViewport(0, 0, width, height);
}
void Window::setCatchedCursor(bool value)
{
if (value) {
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
} else {
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
}
}
void Window::handleWindowActionRegister(bool *windowActionRegister)
{
if (windowActionRegister[windowActions::wireFrameToggle]) {
windowActionRegister[windowActions::wireFrameToggle] = 0;
wireFrameMode = !wireFrameMode;
if (wireFrameMode) {
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
} else {
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
}
if (windowActionRegister[windowActions::mouseCatchToggle]) {
windowActionRegister[windowActions::mouseCatchToggle] = 0;
mouseCatched = !mouseCatched;
setCatchedCursor(mouseCatched);
}
if (windowActionRegister[windowActions::windowShouldClose]) {
glfwSetWindowShouldClose(window, true);
}
}
// GLFW error function
void Window::glfw_error_callback(int error, const char *description)
{
fprintf(stderr, "[Error] GLFW Error %d: %s\n", error, description);
}
// This function is called when the window gets resized (currently not used)
void Window::framebuffer_size_callback(GLFWwindow *window, int width, int height)
{
(void)window;
glViewport(0, 0, width, height);
}
GLFWwindow *Window::getGLFWwindow()
{
return window;
}
int Window::getWindowWidth()
{
return width;
}
int Window::getWindowHeight()
{
return height;
}
float Window::getWindowAspectRatio()
{
return (float)width / (float)height;
}
bool Window::getMouseIsCatched()
{
return mouseCatched;
}