117 lines
2.6 KiB
Zig
117 lines
2.6 KiB
Zig
const app = @import("./app.zig");
|
|
|
|
const coral = @import("coral");
|
|
|
|
const ext = @import("./ext.zig");
|
|
|
|
pub const file = @import("./file.zig");
|
|
|
|
const heap = @import("./heap.zig");
|
|
|
|
const kym = @import("./kym.zig");
|
|
|
|
pub const RuntimeError = error {
|
|
OutOfMemory,
|
|
InitFailure,
|
|
BadManifest,
|
|
};
|
|
|
|
fn last_sdl_error() [:0]const u8 {
|
|
return coral.io.slice_sentineled(@as(u8, 0), @as([*:0]const u8, @ptrCast(ext.SDL_GetError())));
|
|
}
|
|
|
|
pub fn run_app(file_access: file.Access) RuntimeError!void {
|
|
var info_log = app.WritableLog.make(.info, heap.allocator);
|
|
|
|
defer info_log.free();
|
|
|
|
var fail_log = app.WritableLog.make(.fail, heap.allocator);
|
|
|
|
defer fail_log.free();
|
|
|
|
if (ext.SDL_Init(ext.SDL_INIT_EVERYTHING) != 0) {
|
|
try fail_log.write(last_sdl_error());
|
|
|
|
return error.InitFailure;
|
|
}
|
|
|
|
defer ext.SDL_Quit();
|
|
|
|
var script_env = kym.RuntimeEnv.make(heap.allocator, .{
|
|
.out_writer = info_log.as_writer(),
|
|
.err_writer = fail_log.as_writer(),
|
|
}) catch {
|
|
try fail_log.write("failed to initialize script runtime");
|
|
|
|
return error.InitFailure;
|
|
};
|
|
|
|
defer script_env.free();
|
|
|
|
var manifest = app.Manifest{};
|
|
|
|
manifest.load(&script_env, file_access) catch {
|
|
fail_log.write("failed to load / execute app.ona manifest") catch {};
|
|
|
|
return error.BadManifest;
|
|
};
|
|
|
|
const window = create: {
|
|
const pos = ext.SDL_WINDOWPOS_CENTERED;
|
|
const flags = 0;
|
|
|
|
break: create ext.SDL_CreateWindow(&manifest.title, pos, pos, manifest.width, manifest.height, flags) orelse {
|
|
fail_log.write(last_sdl_error()) catch {};
|
|
|
|
return error.InitFailure;
|
|
};
|
|
};
|
|
|
|
defer ext.SDL_DestroyWindow(window);
|
|
|
|
const renderer = create: {
|
|
const defaultDriverIndex = -1;
|
|
const flags = ext.SDL_RENDERER_ACCELERATED;
|
|
|
|
break: create ext.SDL_CreateRenderer(window, defaultDriverIndex, flags) orelse {
|
|
fail_log.write(last_sdl_error()) catch {};
|
|
|
|
return error.InitFailure;
|
|
};
|
|
};
|
|
|
|
defer ext.SDL_DestroyRenderer(renderer);
|
|
|
|
{
|
|
var previous_ticks = ext.SDL_GetTicks64();
|
|
|
|
while (true) {
|
|
{
|
|
var event = @as(ext.SDL_Event, undefined);
|
|
|
|
while (ext.SDL_PollEvent(&event) != 0) {
|
|
switch (event.type) {
|
|
ext.SDL_QUIT => return,
|
|
else => {},
|
|
}
|
|
}
|
|
}
|
|
|
|
{
|
|
// Based on https://fabiensanglard.net/timer_and_framerate/index.php.
|
|
const current_ticks = ext.SDL_GetTicks64();
|
|
const milliseconds_per_second = 1000.0;
|
|
const tick_frequency = @as(u64, @intFromFloat(milliseconds_per_second / manifest.tick_rate));
|
|
|
|
while (previous_ticks < current_ticks) {
|
|
previous_ticks += tick_frequency;
|
|
}
|
|
}
|
|
|
|
_ = ext.SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
|
|
_ = ext.SDL_RenderClear(renderer);
|
|
_ = ext.SDL_RenderPresent(renderer);
|
|
}
|
|
}
|
|
}
|