[nostalgia/core/glfw] Move wakeup time to Context

This commit is contained in:
Gary Talent 2021-05-15 01:39:41 -05:00
parent f83e814806
commit 827ba7dcdb
2 changed files with 18 additions and 21 deletions

View File

@ -9,7 +9,6 @@
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
#include <nostalgia/core/config.hpp> #include <nostalgia/core/config.hpp>
#include <nostalgia/core/core.hpp>
#include <nostalgia/core/gfx.hpp> #include <nostalgia/core/gfx.hpp>
#include <nostalgia/core/input.hpp> #include <nostalgia/core/input.hpp>
@ -17,23 +16,10 @@
namespace nostalgia::core { namespace nostalgia::core {
static event_handler g_eventHandler = nullptr; void draw(Context *ctx) noexcept;
static uint64_t g_wakeupTime;
void draw(Context *ctx);
ox::Error init(Context *ctx) noexcept {
const auto id = new GlfwImplData;
ctx->setWindowerData(id);
using namespace std::chrono;
id->startTime = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
glfwInit();
oxReturnError(initGfx(ctx));
return OxError(0);
}
static void handleGlfwKeyEvent(GLFWwindow *window, int key, int, int action, int) { static void handleGlfwKeyEvent(GLFWwindow *window, int key, int, int action, int) {
const auto ctx = ox::bit_cast<Context*>(glfwGetWindowUserPointer(window)); const auto ctx = static_cast<Context*>(glfwGetWindowUserPointer(window));
const auto id = ctx->windowerData<GlfwImplData>(); const auto id = ctx->windowerData<GlfwImplData>();
switch (action) { switch (action) {
case GLFW_PRESS: case GLFW_PRESS:
@ -46,6 +32,17 @@ static void handleGlfwKeyEvent(GLFWwindow *window, int key, int, int action, int
} }
} }
ox::Error init(Context *ctx) noexcept {
const auto id = new GlfwImplData;
ctx->setWindowerData(id);
using namespace std::chrono;
id->startTime = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
glfwInit();
oxReturnError(initGfx(ctx));
glfwSetKeyCallback(id->window, handleGlfwKeyEvent);
return OxError(0);
}
ox::Error run(Context *ctx) noexcept { ox::Error run(Context *ctx) noexcept {
const auto id = ctx->windowerData<GlfwImplData>(); const auto id = ctx->windowerData<GlfwImplData>();
id->running = true; id->running = true;
@ -54,16 +51,15 @@ ox::Error run(Context *ctx) noexcept {
// oxTrace("nostalgia::core::sdl", "Could not enable adaptive vsync, falling back on vsync"); // oxTrace("nostalgia::core::sdl", "Could not enable adaptive vsync, falling back on vsync");
// SDL_GL_SetSwapInterval(1); // fallback on normal vsync // SDL_GL_SetSwapInterval(1); // fallback on normal vsync
//} //}
glfwSetKeyCallback(id->window, handleGlfwKeyEvent);
while (id->running && !glfwWindowShouldClose(id->window)) { while (id->running && !glfwWindowShouldClose(id->window)) {
glfwPollEvents(); glfwPollEvents();
const auto ticks = ticksMs(ctx); const auto ticks = ticksMs(ctx);
if (g_wakeupTime <= ticks && g_eventHandler) { if (id->wakeupTime <= ticks && id->eventHandler) {
auto sleepTime = g_eventHandler(ctx); auto sleepTime = id->eventHandler(ctx);
if (sleepTime >= 0) { if (sleepTime >= 0) {
g_wakeupTime = ticks + static_cast<unsigned>(sleepTime); id->wakeupTime = ticks + static_cast<unsigned>(sleepTime);
} else { } else {
g_wakeupTime = ~uint64_t(0); id->wakeupTime = ~uint64_t(0);
} }
} }
draw(ctx); draw(ctx);

View File

@ -17,6 +17,7 @@ struct GlfwImplData {
int64_t startTime = 0; int64_t startTime = 0;
bool running = false; bool running = false;
event_handler eventHandler = nullptr; event_handler eventHandler = nullptr;
uint64_t wakeupTime = 0;
}; };
} }