added windowGetDeltaTime

This commit is contained in:
Maciej Samborski 2025-07-27 15:46:14 +02:00
parent 0c34121cc0
commit 34cf3bde86
3 changed files with 68 additions and 1 deletions

4
main.c
View File

@ -19,11 +19,15 @@ int main(void)
{
Window * w = openWindow("Window", 800, 600);
windowSetFps(w, 300);
while (!windowKeyPressed(w, WINDOW_KEY_ESC)) {
windowHandleEvents(w);
handleInput(w);
printf("fps: %lf\n", 1 / windowGetDeltaTime(w));
glClearColor(0.1, 0.2, 0.3, 1);
glClear(GL_COLOR_BUFFER_BIT);
glViewport(0, 0, 800, 600);

View File

@ -3,7 +3,9 @@
#include "openwindow.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int initOpenGL() {
if (getOpenGLProcs() == 0) return -1;
@ -175,12 +177,20 @@ int init(Window * window, const char * name, size_t width, size_t height) {
XSync(window->x.display, False);
glXMakeCurrent(window->x.display, window->x.window, window->glx.context);
//TODO: Check for errors
PFNGLXSWAPINTERVALEXTPROC glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)
glXGetProcAddress((const GLubyte *)"glXSwapIntervalEXT");
if (glXSwapIntervalEXT) glXSwapIntervalEXT(window->x.display, window->x.window, 0);
return 0;
}
Window * openWindow(const char * name, size_t width, size_t height) {
Window * w = calloc(1, sizeof(Window));
w->fps = WINDOW_DEFAULT_FPS;
w->dt.t1 = calloc(1, sizeof(struct timespec));
w->dt.t2 = calloc(1, sizeof(struct timespec));
if (init(w, name, width, height) < 0) {
fprintf(stderr, "Failed to initialize window: X11 error!\n");
@ -199,9 +209,19 @@ void windowSetFps(Window * window, uint32_t fps) {
window->fps = fps;
}
double windowGetDeltaTime(Window *window) {
return window->dt.dt;
}
void windowDraw(Window * window) {
glXSwapBuffers(window->x.display, window->x.window);
usleep(1 / window->fps);
usleep(((float)1 / (window->fps + 1)) * 1e6);
clock_gettime(CLOCK_MONOTONIC, window->dt.t2);
window->dt.dt = (double) (window->dt.t2->tv_sec - window->dt.t1->tv_sec) + (window->dt.t2->tv_nsec - window->dt.t1->tv_nsec) / 1e9;
clock_gettime(CLOCK_MONOTONIC, window->dt.t1);
}
void resetIOState(Window * window) {
@ -209,6 +229,7 @@ void resetIOState(Window * window) {
}
void windowHandleEvents(Window * window) {
XEvent xev = {0};
resetIOState(window);
@ -227,6 +248,10 @@ void closeWindow(Window * window) {
XFreeColormap(window->x.display, window->x.cmap);
XDestroyWindow(window->x.display, window->x.window);
XCloseDisplay(window->x.display);
free(window->dt.t1);
free(window->dt.t2);
free(window);
}
@ -414,6 +439,10 @@ int init(Window * window, const char * title, size_t width, size_t height) {
SetTimer(window->wgl.window, 1, (1 / window->fps) * 1000, NULL);
//TODO: Check for errors
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT = (void *)wglGetProcAddress("wglSwapIntervalEXT");
if (wglSwapIntervalEXT) wglSwapIntervalEXT(0);
return 0;
}
@ -434,8 +463,25 @@ Window * openWindow(const char * name, size_t width, size_t height) {
return w;
}
void windowSetFps(Window * window, uint32_t fps) {
window->fps = fps;
}
double windowGetDeltaTime(Window * window) {
return window->dt.dt;
}
void windowDraw(Window * window) {
SwapBuffers(window->wgl.display);
Sleep((uint32_t)(((double)1 / (window->fps + 1)) * 1e3));
QueryPerformanceFrequency(&window->dt.freq);
QueryPerformanceCounter(&window->dt.t2);
window->dt.dt = (double) (window->dt.t2.QuadPart - window->dt.t1.QuadPart) / window->dt.freq.QuadPart;
QueryPerformanceCounter(&window->dt.t1);
}
void resetIOState(Window * window) {

View File

@ -9,6 +9,7 @@
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int gladLoadGL(void);
@ -40,12 +41,19 @@ typedef struct {
char last[WINDOW_KEY_COUNT];
} WindowIOState;
typedef struct {
struct timespec * t1;
struct timespec * t2;
double dt;
} WindowDeltaTime;
typedef struct Window Window;
typedef struct Window {
WindowIOState io;
GLX glx;
X11 x;
WindowDeltaTime dt;
uint32_t fps;
} Window;
@ -114,11 +122,19 @@ typedef struct {
BYTE last[WINDOW_KEY_COUNT];
} WindowIOState;
typedef struct {
LARGE_INTEGER t1;
LARGE_INTEGER t2;
LARGE_INTEGER freq;
double dt;
} WindowDeltaTime;
typedef struct Window Window;
typedef struct Window {
WindowIOState io;
WGL wgl;
WindowDeltaTime dt;
uint32_t fps;
} Window;
@ -175,6 +191,7 @@ bool windowKeyAlt(Window * window);
Window * openWindow(const char * name, size_t width, size_t height);
void windowSetFps(Window * window, uint32_t fps);
double windowGetDeltaTime(Window * window);
void windowDraw(Window * window);
void windowHandleEvents(Window * window);
void closeWindow(Window * window);