tests: use sin approximation instead of table

This commit is contained in:
Loïc Grégoire
2026-09-03 21:05:32 -04:00
parent bbd67d065d
commit 81c3021598
2 changed files with 22 additions and 21 deletions
+22 -18
View File
@@ -4,7 +4,7 @@ const r = @import("root");
const ke = r.ke; const ke = r.ke;
const mm = r.mm; const mm = r.mm;
const ps = r.ps; const ps = r.ps;
const sintab = @import("sintab.zig"); const bv = r.bv;
var pixel_buffer: [*]u8 = undefined; var pixel_buffer: [*]u8 = undefined;
var fb_width: usize = 0; var fb_width: usize = 0;
@@ -39,15 +39,14 @@ fn rand_tsc_based() u32 {
return lo ^ hi; return lo ^ hi;
} }
var rand_gen: i64 = 0x9521af17; var rand_gen: u32 = 0x9521af17;
fn rand() i64 { fn rand() i64 {
rand_gen += @as(i32, @bitCast(@as(u32, 0xe120fc15))); rand_gen +%= 0xe120fc15;
var tmp: u64 = @bitCast(rand_gen *% 0x4a39b70d); var tmp: u64 = @as(u64, rand_gen) *% 0x4a39b70d;
const m1 = (tmp >> 32) ^ tmp; const m1: u32 = @truncate((tmp >> 32) ^ tmp);
tmp = m1 *% 0x12fad5c9; tmp = @as(u64, m1) *% 0x12fad5c9;
const m2 = (tmp >> 32) ^ tmp; return @as(u32, @truncate((tmp >> 32) ^ tmp));
return @intCast(m2 & 0x7FFFFFFF); //make it always positive.
} }
const fixed_point_shift = 16; const fixed_point_shift = 16;
@@ -65,18 +64,20 @@ fn mul_fp_fp(a: i64, b: i64) i64 {
} }
fn rand_fp() i64 { fn rand_fp() i64 {
return @rem(rand(), (1 << fixed_point_shift)); return rand() & 0xFFFF;
} }
fn rand_fp_sign() i64 { fn rand_fp_sign() i64 {
if (@rem(rand(), 2) != 0) const v = rand();
return -rand_fp(); const m = -((v >> 16) & 1);
return ((v & 0xFFFF) ^ m) - m;
return rand_fp();
} }
fn sin(angle: i64) i64 { fn sin(angle: i64) i64 {
return @divFloor(int_to_fp(sintab.SinTable[@intCast(@rem(angle, 65536))]), 32768); const x: i32 = @as(i16, @truncate(angle));
const mask = x >> 31;
const ax = (x ^ mask) - mask;
return (x * (32768 - ax)) >> 12;
} }
fn cos(angle: i64) i64 { fn cos(angle: i64) i64 {
@@ -97,7 +98,7 @@ const FireworkData = struct {
}; };
fn get_random_color() u32 { fn get_random_color() u32 {
return @intCast((rand() + 0x808080) & 0xFFFFFF); // Random pastel color return @intCast((rand() + 0x808080) & 0xFFFFFF);
} }
fn sleep(ms: usize, continuation: ?ke.Continuation) void { fn sleep(ms: usize, continuation: ?ke.Continuation) void {
@@ -156,9 +157,10 @@ fn particle(param: ?*anyopaque) void {
mm.zone.gpa.destroy(parent_data); mm.zone.gpa.destroy(parent_data);
const angle = @rem(rand(), 65536); const angle = rand();
data.vel_x = mul_fp_fp(cos(angle), rand_fp_sign()) * explosion_range; const speed = @max(rand_fp(), rand_fp());
data.vel_y = mul_fp_fp(sin(angle), rand_fp_sign()) * explosion_range; data.vel_x = mul_fp_fp(cos(angle), speed) * explosion_range;
data.vel_y = mul_fp_fp(sin(angle), speed) * explosion_range;
const expire_in = 2000 + (@rem(rand(), 1000)); const expire_in = 2000 + (@rem(rand(), 1000));
@@ -272,6 +274,8 @@ pub fn start(param: ?*anyopaque) void {
rand_gen ^= rand_tsc_based(); rand_gen ^= rand_tsc_based();
bv.disable();
if (boot_info.framebuffer) |fb| { if (boot_info.framebuffer) |fb| {
fb_bpp = fb.bpp / 8; fb_bpp = fb.bpp / 8;
fb_pitch = fb.pitch; fb_pitch = fb.pitch;
File diff suppressed because one or more lines are too long