Cleanup int collision math, which is still wrong

This commit is contained in:
2025-12-20 22:31:32 +01:00
parent 1453b2bbd7
commit d63aeba562
2 changed files with 112 additions and 68 deletions

View File

@@ -38,6 +38,61 @@ pub const sv_per_vx = 4096;
pub const vx_per_ck = 16;
pub const sv_per_ck = sv_per_vx * vx_per_ck;
pub inline fn sv(comptime vx: comptime_float) comptime_int {
return @intFromFloat(@round(vx * sv_per_vx));
pub const RoundingMode = enum {
border_down,
border_up,
};
/// SV to VX
pub inline fn subvoxelsToVoxels(comptime rounding_mode: RoundingMode, sv: i32) i32 {
return switch (rounding_mode) {
.border_down => @divFloor(sv, sv_per_vx - 1),
.border_up => @divFloor(sv, sv_per_vx),
};
}
/// SV to CK
pub inline fn subvoxelsToChunks(comptime rounding_mode: RoundingMode, sv: i32) i32 {
return switch (rounding_mode) {
.border_down => @divFloor(sv, sv_per_ck - 1),
.border_up => @divFloor(sv, sv_per_ck),
};
}
/// SV to CKSV
pub inline fn subvoxelsToChunkSubvoxels(sv: i32) std.math.IntFittingRange(0, sv_per_ck - 1) {
return @intCast(@mod(sv, sv_per_ck));
}
/// SV to VXSV
pub inline fn subvoxelsToVoxelSubvoxels(sv: i32) std.math.IntFittingRange(0, sv_per_vx - 1) {
return @intCast(@mod(sv, sv_per_vx));
}
/// VX to SV
pub inline fn voxelsToSubvoxels(vx: i32) i32 {
return vx * sv_per_vx;
}
/// VX to CK
pub inline fn voxelsToChunks(comptime rounding_mode: RoundingMode, vx: i32) i32 {
return switch (rounding_mode) {
.border_down => @divFloor(vx, vx_per_ck - 1),
.border_up => @divFloor(vx, vx_per_ck),
};
}
/// VX to CKVX
pub inline fn voxelsToChunkVoxels(vx: i32) std.math.IntFittingRange(0, vx_per_ck) {
return @intCast(@mod(vx, vx_per_ck));
}
/// CK to SV
pub inline fn chunksToSubvoxels(ck: i32) i32 {
return ck * sv_per_ck;
}
/// CK to VX
pub inline fn chunksToVoxels(ck: i32) i32 {
return ck * vx_per_ck;
}