Cleanup int collision math, which is still wrong
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user