v/main.cpp
2026-04-28 19:46:41 +02:00

120 lines
2.4 KiB
C++

#include <print>
#include <vector>
#include <fstream>
#include <cassert>
#include <cstdint>
#ifdef __EMSCRIPTEN__
#include <GLFW/emscripten_glfw3.h>
#include <emscripten.h>
#else
#include <GLFW/glfw3.h>
#endif
#include "renderer/graphics.h"
#include "renderer/texture_sheet.h"
#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>
GLFWwindow *window;
int32_t window_width = 640;
int32_t window_height = 480;
uint64_t t = 0;
uint64_t accumulator = 0;
uint64_t dt = glfwGetTimerFrequency() / 60; // 1/60 s
uint64_t current_time = glfwGetTimerValue();
sprite_t sprite {
.origin = {0.5, 0.5},
.scale = {512, 512},
.rotation = 0.0,
.colour = {1.0, 1.0, 1.0, 1.0},
.alpha = 1.0,
.window_space = false,
.maintain_ar = false,
.texture = "assets/boy.png"
};
int init() {
if (!glfwInit())
return -1;
std::println("Hello, Sailor!");
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
window = glfwCreateWindow(window_width, window_height, "Hello World", nullptr, nullptr);
if (!window) {
glfwTerminate();
return -1;
}
graphics_init(window);
texture_manager.load("assets/boy.png");
return 0;
}
bool is_running() {
return !glfwWindowShouldClose(window);
}
void main_loop(void *data) {
uint64_t new_time = glfwGetTimerValue();
uint64_t frame_time = new_time - current_time;
current_time = new_time;
accumulator += frame_time;
glfwPollEvents();
uint64_t updates = 0;
while (accumulator >= dt) {
accumulator -= dt;
t += dt;
updates++;
}
// std::println("Updates: {}", updates);
// std::println("frame time: {}", ((double) (frame_time) / (double) glfwGetTimerFrequency()));
// std::println("fps: {}", 1.0 / ((double) (frame_time) / (double) glfwGetTimerFrequency()));
begin_frame();
double f = (t / (double) glfwGetTimerFrequency());
std::println("{}", f);
for (int x = sprite.scale.x / 2; x < window_width; x += sprite.scale.x) {
submit_sprite({x + 30 * cos(f), 200 + 30 * sin(f)}, sprite);
}
end_frame(window);
}
void deinit() {
graphics_deinit();
glfwDestroyWindow(window);
glfwTerminate();
}
int main() {
init();
#ifdef __EMSCRIPTEN__
emscripten_set_main_loop_arg(main_loop, nullptr, 0, true);
#else
while (is_running()) {
main_loop(nullptr);
}
#endif
deinit();
return 0;
}