#include #include "rendering/wrapper/GLFWWrapper.h" #include "rendering/wrapper/GLWrapper.h" #include "rendering/WindowSize.h" #include "rendering/wrapper/Window.h" #include "utils/Clock.h" #include "rendering/wrapper/Shader.h" #include "input/Controller.h" #include "rendering/Renderer.h" #include "Game.h" bool initGLEW() { GLenum err = glewInit(); if(err != GLEW_OK) { std::cout << "could not initialize GLEW: " << glewGetErrorString(err) << "\n"; return true; } std::cout << "using GLEW " << glewGetString(GLEW_VERSION) << "\n"; return false; } void initCallbacks(Window& w, WindowSize& size) { static WindowSize& cSize = size; w.setFramebufferSizeCallback([](GLFWwindow*, int newWidth, int newHeight) { glViewport(0, 0, newWidth, newHeight); cSize.width = newWidth; cSize.height = newHeight; }); } int main() { if(GLFWWrapper::hasError()) { return 0; } WindowSize size(800, 480); Window window(size, "Test"); if(window.hasError() || initGLEW()) { return 0; } Shader shader("resources/shader/vertex.vs", "resources/shader/fragment.fs"); if(shader.hasError()) { return 0; } Renderer renderer(size, shader); Controller controller; Clock fps; Clock tps; static Game game(controller, fps, tps); initCallbacks(window, size); window.show(); const u64 nanosPerTick = 10'000'000; u64 lag = 0; while(!window.shouldClose() && game.isRunning()) { GLWrapper::checkAndPrintError("GL-Error"); lag += fps.update(); while(lag >= nanosPerTick) { lag -= nanosPerTick; tps.update(); controller.tick(); game.tick(); } Matrix view; view.translate(-1.0f, 1.0f); view.scale(2.0f / size.width, -2.0f / size.height); shader.setMatrix("view", view.getValues()); game.render((float) lag / nanosPerTick, renderer); window.swapBuffers(); glfwPollEvents(); } return 0; }