added refresh interval in ms for animations

This commit is contained in:
peterc-s 2024-10-22 02:03:21 +01:00
parent e125d8f1aa
commit 020f27b203
No known key found for this signature in database
GPG Key ID: 41E806B8F7F83E59
5 changed files with 111 additions and 67 deletions

View File

@ -35,6 +35,14 @@
# matrix -> CMatrix
animation = none
# The minimum time between animation frames
# 32 -> ~30fps
# 16 -> ~60fps
# 8 -> ~120fps
# 6 -> ~144fps
# 4 -> ~240fps
animation_refresh_ms = 16
# Stop the animation after some time
# 0 -> Run forever
# 1..2e12 -> Stop the animation after this many seconds

View File

@ -50,7 +50,7 @@ pub fn realloc(self: *Doom) !void {
self.buffer = buffer;
}
pub fn draw(self: Doom) void {
pub fn draw_with_update(self: Doom) void {
for (0..self.terminal_buffer.width) |x| {
for (1..self.terminal_buffer.height) |y| {
const source = y * self.terminal_buffer.width + x;
@ -74,6 +74,18 @@ pub fn draw(self: Doom) void {
}
}
pub fn draw(self: Doom) void {
for (0..self.terminal_buffer.width) |x| {
for (1..self.terminal_buffer.height) |y| {
const source = y * self.terminal_buffer.width + x;
const buffer_source = self.buffer[source];
self.terminal_buffer.buffer[source] = toTermboxCell(FIRE[buffer_source]);
}
}
}
fn initBuffer(buffer: []u8, width: usize) void {
const length = buffer.len - width;
const slice_start = buffer[0..length];

View File

@ -68,14 +68,12 @@ pub fn realloc(self: *Matrix) !void {
self.lines = lines;
}
pub fn draw(self: *Matrix) void {
pub fn draw_with_update(self: *Matrix) void {
const buf_height = self.terminal_buffer.height;
const buf_width = self.terminal_buffer.width;
self.count += 1;
if (self.count > FRAME_DELAY) {
self.frame += 1;
if (self.frame > 4) self.frame = 1;
self.count = 0;
var x: usize = 0;
while (x < self.terminal_buffer.width) : (x += 2) {
@ -140,8 +138,13 @@ pub fn draw(self: *Matrix) void {
first_col = false;
}
}
self.draw();
}
pub fn draw(self: *Matrix) void {
const buf_width = self.terminal_buffer.width;
var x: usize = 0;
while (x < buf_width) : (x += 2) {
var y: usize = 1;

View File

@ -8,6 +8,7 @@ const Bigclock = enums.Bigclock;
animation: Animation = .none,
animation_timeout_sec: u12 = 0,
animation_refresh_ms: u16 = 16,
asterisk: ?u8 = '*',
auth_fails: u64 = 10,
bg: u16 = 0,

View File

@ -317,6 +317,11 @@ pub fn main() !void {
}
}
var animation_timer = switch(config.animation) {
.none => undefined,
else => try std.time.Timer.start()
};
const animate = config.animation != .none;
const shutdown_key = try std.fmt.parseInt(u8, config.shutdown_key[1..], 10);
const shutdown_len = try utils.strWidth(lang.shutdown);
@ -340,6 +345,7 @@ pub fn main() !void {
try info_line.addMessage(lang.err_console_dev, config.error_bg, config.error_fg);
};
while (run) {
// If there's no input or there's an animation, a resolution change needs to be checked
if (!update or config.animation != .none) {
@ -380,8 +386,22 @@ pub fn main() !void {
if (!animation_timed_out) {
switch (config.animation) {
.none => {},
.doom => doom.draw(),
.matrix => matrix.draw(),
.doom => {
if (animation_timer.read() / std.time.ns_per_ms > config.animation_refresh_ms) {
animation_timer.reset();
doom.draw_with_update();
} else {
doom.draw();
}
},
.matrix => {
if (animation_timer.read() / std.time.ns_per_ms > config.animation_refresh_ms) {
animation_timer.reset();
matrix.draw_with_update();
} else {
matrix.draw();
}
},
}
}