#include "GEApplication.h"
#include <windows.h>
#include <iostream>
#include <vector>
#include <glm/common.hpp>
//
// FUNCIÓN: GEApplication::run()
//
// PROPÓSITO: Ejecuta la aplicación
//
void GEApplication::run()
{
this->window = initWindow();
this->windowPos = initWindowPos();
mainLoop();
cleanup();
}
//
// FUNCIÓN: GEApplication::initWindow()
//
// PROPÓSITO: Inicializa la ventana
//
GLFWwindow* GEApplication::initWindow()
{
glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
GLFWwindow* w = glfwCreateWindow(WIDTH, HEIGHT, "Game Engine", nullptr, nullptr);
glfwSetWindowUserPointer(w, this);
glfwSetFramebufferSizeCallback(w, framebufferResizeCallback);
glfwSetKeyCallback(w, keyCallback);
glfwSetCursorPosCallback(w, cursorPositionCallback);
glfwSetMouseButtonCallback(w, mouseButtonCallback);
return w;
}
//
// FUNCIÓN: GEApplication::initWindowPos()
//
// PROPÓSITO: Inicializa la posición de la ventana
//
GEWindowPosition GEApplication::initWindowPos()
{
GLFWmonitor* monitor = glfwGetPrimaryMonitor();
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
GEWindowPosition wp = {};
wp.fullScreen = false;
glfwGetWindowSize(window, &wp.width, &wp.height);
glfwGetWindowPos(window, &wp.Xpos, &wp.Ypos);
wp.screenWidth = mode->width;
wp.screenHeight = mode->height;
return wp;
}
//
// FUNCIÓN: GEApplication::mainLoop()
//
// PROPÓSITO: Bucle principal que procesa los eventos de la aplicación
//
void GEApplication::mainLoop()
{
while (!glfwWindowShouldClose(window))
{
glfwPollEvents();
draw();
}
}
//
// FUNCIÓN: GEApplication::draw()
//
// PROPÓSITO: Lanza la generación del dibujo
//
void GEApplication::draw()
{
}
//
// FUNCIÓN: GEApplication::cleanup()
//
// PROPÓSITO: Libera los recursos y finaliza la aplicación
//
void GEApplication::cleanup()
{
glfwDestroyWindow(window);
glfwTerminate();
}
//
// FUNCIÓN: GEApplication::swapFullScreen()
//
// PROPÓSITO: Dibuja la ventana a pantalla completa o a tamaño configurable
//
void GEApplication::swapFullScreen()
{
if (!windowPos.fullScreen)
{
glfwGetWindowSize(window, &windowPos.width, &windowPos.height);
glfwGetWindowPos(window, &windowPos.Xpos, &windowPos.Ypos);
windowPos.fullScreen = true;
GLFWmonitor* monitor = glfwGetPrimaryMonitor();
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
glfwSetWindowMonitor(window, monitor, 0, 0, mode->width, mode->height,
mode->refreshRate);
}
else
{
windowPos.fullScreen = false;
glfwSetWindowMonitor(window, nullptr, windowPos.Xpos, windowPos.Ypos,
windowPos.width, windowPos.height, NULL);
}
}
//
// FUNCIÓN: GEApplication::framebufferResizeCallback(GLFWwindow* window, int width,
// int height)
//
// PROPÓSITO: Reconstruye los objetos con el nuevo tamaño de ventana
//
void GEApplication::resize()
{
if (!windowPos.fullScreen)
{
glfwGetWindowSize(window, &windowPos.width, &windowPos.height);
glfwGetWindowPos(window, &windowPos.Xpos, &windowPos.Ypos);
}
}
//
// FUNCIÓN: GEApplication::keyCallback(GLFWwindow* window, int key, int scancode,
// int action, int mods)
//
// PROPÓSITO: Respuesta a un evento de teclado sobre la aplicación
//
void GEApplication::keyCallback(GLFWwindow* window, int key, int scancode,
int action, int mods)
{
GEApplication* app = (GEApplication*)glfwGetWindowUserPointer(window);
if (action == GLFW_PRESS || action == GLFW_REPEAT)
{
if (key == GLFW_KEY_F12) app->swapFullScreen();
}
}
//
// FUNCIÓN: GEApplication::mouseButtonCallback(GLFWwindow* window, int button,
// int action, int mods)
//
// PROPÓSITO: Respuesta a un evento de ratón sobre la aplicación
//
void GEApplication::mouseButtonCallback(GLFWwindow* window, int button,
int action, int mods)
{
}
//
// FUNCIÓN: GEApplication::cursorPositionCallback(GLFWwindow* window, double xpos,
// double ypos)
//
// PROPÓSITO: Respuesta a un evento de movimiento del cursor sobre la aplicación
//
void GEApplication::cursorPositionCallback(GLFWwindow* window, double xpos,
double ypos)
{
}
//
// FUNCIÓN: GEApplication::framebufferResizeCallback(GLFWwindow* window, int width,
// int height)
//
// PROPÓSITO: Respuesta a un evento de redimensionamiento de la ventana de la
// aplicación
//
void GEApplication::framebufferResizeCallback(GLFWwindow* window, int width,
int height)
{
GEApplication* app = (GEApplication*)glfwGetWindowUserPointer(window);
if (height != 0)
{
app->resize();
}
}
|