const std = @import("std"); const vk = @import("vulkan"); const sdl = @import("sdl2"); const zm = @import("zmath"); const VulkanRenderer = @import("vulkan_renderer.zig").VulkanRenderer; const Vector3 = @import("utilities.zig").Vector3; pub fn main() !void { const window = try initWindow(); defer sdl.quit(); defer sdl.vulkan.unloadLibrary(); defer window.destroy(); var gpa = std.heap.GeneralPurposeAllocator(.{}){}; defer _ = gpa.deinit(); const allocator = gpa.allocator(); var vulkan_renderer = try VulkanRenderer.init(window, allocator); defer vulkan_renderer.deinit(); var angle: f32 = 0.0; var now: u64 = sdl.getPerformanceCounter(); var last: u64 = 0; var delta_time: f32 = 0.0; mainLoop: while (true) { while (sdl.pollEvent()) |ev| { switch (ev) { .quit => break :mainLoop, .key_down => |key| { if (key.keycode == sdl.Keycode.escape) { break :mainLoop; } }, else => {}, } } last = now; now = sdl.getPerformanceCounter(); delta_time = @as(f32, @floatFromInt(now - last)) * 1000.0 / @as(f32, @floatFromInt(now)); angle += 10.0 * delta_time; if (angle > 360.0) { angle -= 360.0; } var first_model = zm.rotationZ(angle); var second_model = zm.rotationZ(-angle * 2); first_model = zm.mul(first_model, zm.translation(0.0, 0.0, -2.5)); second_model = zm.mul(second_model, zm.translation(0.0, 0.0, -4.5)); try vulkan_renderer.updateModel(0, first_model); try vulkan_renderer.updateModel(1, second_model); try vulkan_renderer.draw(); } } fn initWindow() !sdl.Window { sdl.init(.{ .timer = true, .video = true, .events = true }) catch { std.log.err("Failed to initialize SDL2", .{}); }; return try sdl.createWindow( "Vulkan Test", .{ .centered = {} }, .{ .centered = {} }, 800, 600, .{ .vis = .shown, .context = .vulkan }, ); }