From dae5bc02b1c934075e95694953b4330676e21611 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Fri, 7 Feb 2025 20:39:58 +0100 Subject: estd: add graphics module --- src/screen/main.zig | 90 ++++++++++++++++++++++------------------------------- 1 file changed, 38 insertions(+), 52 deletions(-) (limited to 'src/screen/main.zig') diff --git a/src/screen/main.zig b/src/screen/main.zig index 0514210..7b73450 100644 --- a/src/screen/main.zig +++ b/src/screen/main.zig @@ -1,5 +1,6 @@ const std = @import("std"); const drm = @import("drm/root.zig"); +const graphics = @import("estd").graphics; pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; @@ -11,14 +12,15 @@ pub fn main() !void { var resources = try card.resources(); defer resources.deinit(); - var connector = try card.connector(resources.connector_ids[0]); + var connector = try resources.connector(0); defer connector.deinit(); - const mode = connector.modes[0]; + const mode = connector.modes[12]; + std.debug.print("using mode: {s}@{d:.2}\n", .{mode.name, mode.frame_rate()}); - var crtc = try card.crtc(resources.crtc_ids[ + var crtc = try resources.crtc( connector.compatible_crtc() orelse @panic("no crtc found") - ]); + ); defer crtc.detach(); var buffer = try card.create_buffer(mode.horizontal.size, mode.vertical.size); @@ -26,62 +28,46 @@ pub fn main() !void { try crtc.attach(&buffer, &connector, mode); - const Pos = struct { x: f32, y: f32 }; + const center_x: i64 = @intCast(buffer.current.width / 2 - 100); + const center_y: i64 = @intCast(buffer.current.height / 2 - 100); - var vec = Pos { .x = 10, .y = 10 }; - var pos = Pos { .x = 0, .y = 0 }; - var delta: f32 = 0; - const size = 100; + var box = graphics.Box { + .x = @intCast(center_x), + .y = @intCast(center_y), + .width = 200, + .height = 200, + .color = .{ .red = 0xff, .green = 0x05, .blue = 0x07 }, + .radius = 0, + }; - const width: f32 = @floatFromInt(buffer.current.width); - const height: f32 = @floatFromInt(buffer.current.height); + var last_duration: f64 = 0; + var dir: f64 = 1; + var delta: f64 = 0; + var radius: f64 = 0; while (true) { const start = try std.time.Instant.now(); - - @memset( - buffer.current.pixels, - .{ - .red = 0x25, - .green = 0x25, - .blue = 0x25 - } - ); - - pos.x += vec.x * delta; - pos.y += vec.y * delta; - - if (pos.x < 0) { - pos.x = -pos.x; - vec.x = -vec.x; - } else if (pos.x + size >= width) { - pos.x = width - size; - vec.x = -vec.x; - } - - if (pos.y < 0) { - pos.y = -pos.y; - vec.y = -vec.y; - } else if (pos.y + size >= height) { - pos.y = height - size; - vec.y = -vec.y; - } - - for (0..size) |w| { - for (0..size) |h| { - const x = @as(usize, @intFromFloat(pos.x)) + w; - const y = @as(usize, @intFromFloat(pos.y)) + h; - buffer.current.pixels[x + buffer.current.width * y] = .{ - .red = 0xff, - .green = 0, - .blue = 0, - }; - } + const canvas = buffer.canvas(); + canvas.fill(.{ .red = 0x25, .green = 0x25, .blue = 0x25 }); + box.render(&canvas); + + radius += delta * dir; + if (radius > 100) { + std.debug.print("HERE\n", .{}); + radius = 100; + dir = -1; + } else if (radius < 0) { + radius = 0; + dir = 1; } + box.radius = @intFromFloat(radius); const end = try std.time.Instant.now(); - const elapsed = (@as(f32, @floatFromInt(end.since(start))) / std.time.ns_per_s); - delta = elapsed * 60; + const duration: f64 = @floatFromInt(end.since(start)); + const average = (duration + last_duration) / 2; + last_duration = duration; + std.debug.print("@FPS: {d:.3}\r", .{ std.time.ns_per_s / average }); + delta = 60 * last_duration / std.time.ns_per_s; try crtc.page_flip(&buffer); -- cgit v1.2.3-70-g09d2