summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--flake.nix5
-rw-r--r--src/estd/graphics/curve.zig28
-rw-r--r--src/estd/graphics/line.zig19
-rw-r--r--src/screen/main.zig11
4 files changed, 42 insertions, 21 deletions
diff --git a/flake.nix b/flake.nix
index 5d36c11..a0e9854 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,5 +1,5 @@
{
- description = "Parz";
+ description = "Ēostre";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-24.11";
@@ -12,7 +12,7 @@
{
devShells.x86_64-linux.default = pkgs.zigStdenv.mkDerivation {
name = "zig-dev-shell";
- packages = [ pkgs.libdrm ];
+ packages = [];
buildInputs = [
pkgs.zig
pkgs.qemu_full
@@ -23,7 +23,6 @@
pkgs.elfutils
pkgs.openssl
pkgs.moreutils
- pkgs.libdrm
pkgs.pkg-config
pkgs.gdb
];
diff --git a/src/estd/graphics/curve.zig b/src/estd/graphics/curve.zig
index d4be1d7..6c591fa 100644
--- a/src/estd/graphics/curve.zig
+++ b/src/estd/graphics/curve.zig
@@ -14,6 +14,14 @@ pub const Curve = struct {
color: graphics.Color,
+ fn distance(a: u32, b: u32) u32 {
+ if (a > b) {
+ return a - b;
+ } else {
+ return b - a;
+ }
+ }
+
pub fn render(self: *const Self, canvas: *const graphics.Canvas) void {
const start_x: f64 = @floatFromInt(self.start.x);
const start_y: f64 = @floatFromInt(self.start.y);
@@ -21,16 +29,30 @@ pub const Curve = struct {
const middle_y: f64 = @floatFromInt(self.middle.y);
const end_x: f64 = @floatFromInt(self.end.x);
const end_y: f64 = @floatFromInt(self.end.y);
+ const resolution = 1 + (
+ distance(self.start.x, self.end.x) + distance(self.start.y, self.end.y)
+ ) / 8;
+
+ var last = self.start;
- for (0..100) |index| {
- const t: f64 = @as(f64, @floatFromInt(index)) / 100;
+ canvas.buffer[last.x + last.y * canvas.width] = .{ .red = 0xff, .green = 0xff, .blue = 0xff };
+
+ for (1..resolution + 1) |index| {
+ const t: f64 = @as(f64, @floatFromInt(index)) / @as(f64, @floatFromInt(resolution));
const x: u32 = @intFromFloat(@round(
(1 - t) * ((1 - t) * start_x + t * middle_x) + t * ((1 - t) * middle_x + t * end_x)
));
const y: u32 = @intFromFloat(@round(
(1 - t) * ((1 - t) * start_y + t * middle_y) + t * ((1 - t) * middle_y + t * end_y)
));
- canvas.buffer[x + canvas.width * y] = self.color;
+
+ (graphics.Line {
+ .start = .{ .x = last.x, .y = last.y },
+ .end = .{ .x = x, .y = y },
+ .color = self.color,
+ }).render(canvas);
+
+ last = .{ .x = x, .y = y };
}
}
};
diff --git a/src/estd/graphics/line.zig b/src/estd/graphics/line.zig
index 93f17ff..faf801a 100644
--- a/src/estd/graphics/line.zig
+++ b/src/estd/graphics/line.zig
@@ -42,32 +42,31 @@ pub const Line = struct {
gradient = 1;
}
-
var intersect_y: f64 = @floatFromInt(start.y);
if (steep) {
for (start.x..end.x + 1) |x| {
- const y: usize = @intFromFloat(intersect_y);
+ const y: u64 = @intFromFloat(intersect_y);
const factor = intersect_y - @as(f64, @floatFromInt(y));
- var previous_color = canvas.buffer[canvas.width * x + y];
- canvas.buffer[x * canvas.width + y] = previous_color.mix(&self.color, factor);
+ var previous_color = canvas.buffer[x * canvas.width + y];
+ canvas.buffer[x * canvas.width + y] = self.color.mix(&previous_color, factor);
- previous_color = canvas.buffer[x * canvas.width + y - 1];
- canvas.buffer[x * canvas.width + y - 1] = self.color.mix(&previous_color, factor);
+ previous_color = canvas.buffer[canvas.width * x + y + 1];
+ canvas.buffer[x * canvas.width + y + 1] = previous_color.mix(&self.color, factor);
intersect_y += gradient;
}
} else {
for (start.x..end.x + 1) |x| {
- const y: u32 = @intFromFloat(intersect_y);
+ const y: u64 = @intFromFloat(intersect_y);
const factor = intersect_y - @as(f64, @floatFromInt(y));
var previous_color = canvas.buffer[x + canvas.width * y];
- canvas.buffer[x + canvas.width * y] = previous_color.mix(&self.color, factor);
+ canvas.buffer[x + canvas.width * y] = self.color.mix(&previous_color, factor);
- previous_color = canvas.buffer[x + canvas.width * (y - 1)];
- canvas.buffer[x + canvas.width * (y - 1)] = self.color.mix(&previous_color, factor);
+ previous_color = canvas.buffer[x + canvas.width * (y + 1)];
+ canvas.buffer[x + canvas.width * (y + 1)] = previous_color.mix(&self.color, factor);
intersect_y += gradient;
}
diff --git a/src/screen/main.zig b/src/screen/main.zig
index 2cb8c03..2387f57 100644
--- a/src/screen/main.zig
+++ b/src/screen/main.zig
@@ -31,9 +31,10 @@ pub fn main() !void {
const center_x = (buffer.current.width / 2);
const center_y = (buffer.current.height / 2);
- var line = graphics.Line {
+ var curve = graphics.Curve {
.start = .{ .x = center_x, .y = center_y },
- .end = .{ .x = center_x + 110 , .y = center_y + 100 },
+ .middle = .{ .x = center_x + 200, .y = center_y - 150 },
+ .end = .{ .x = center_x + 100 , .y = center_y + 100 },
.color = .{ .red = 0xff, .green = 0, .blue = 0 },
};
@@ -56,11 +57,11 @@ pub fn main() !void {
.color = .{ .red = 0xff, .green = 0xff, .blue = 0xff },
}).render(&canvas);
- line.render(&canvas);
+ curve.render(&canvas);
const cos = @cos(std.math.degreesToRadians(angle));
const sin = @sin(std.math.degreesToRadians(angle));
- line.end.x = @intCast(@as(i64, @intCast(center_x)) + @as(i64, @intFromFloat(100 * cos)));
- line.end.y = @intCast(@as(i64, @intCast(center_y)) + @as(i64, @intFromFloat(100 * sin)));
+ curve.end.x = @intCast(@as(i64, @intCast(center_x)) + @as(i64, @intFromFloat(100 * cos)));
+ curve.end.y = @intCast(@as(i64, @intCast(center_y)) + @as(i64, @intFromFloat(100 * sin)));
angle += delta;
if (angle > 360) {