diff --git a/src/math.zig b/src/math.zig index 4ba09a2..21cf734 100644 --- a/src/math.zig +++ b/src/math.zig @@ -79,5 +79,5 @@ pub inline fn wideMulDivFloor(a: i32, mul: i32, div: i32) i32 { } pub inline fn wideMulDivCeil(a: i32, mul: i32, div: i32) i32 { - return @intCast(@divFloor(@as(i64, a) * @as(i64, mul) + @as(i64, div) - 1, div)); + return @intCast(@divFloor(@as(i64, a) * @as(i64, mul) + @as(i64, div) - std.math.sign(div), div)); } diff --git a/src/voxels.zig b/src/voxels.zig index 8779c92..7b853f6 100644 --- a/src/voxels.zig +++ b/src/voxels.zig @@ -1,12 +1,44 @@ +const std = @import("std"); + +const c = @import("const.zig"); + const Materials = @import("assets/Materials.zig"); pub const Orientation = enum(u3) { - negative_x, - positive_x, - negative_y, - positive_y, - negative_z, - positive_z, + negative_x = 0b111, + positive_x = 0b000, + negative_y = 0b110, + positive_y = 0b001, + negative_z = 0b101, + positive_z = 0b010, + + pub fn initSignIndex(sign: i2, index: u2) Orientation { + std.debug.assert(sign == -1 or sign == 1); + std.debug.assert(index < 3); + const value: u3 = (if (sign > 0) @as(u3, 0b100) else @as(u3, 0b000)) | index; + return @enumFromInt(value); + } + + /// 0 for ±X + /// 1 for ±Y + /// 2 for ±Z + pub fn getIndex(self: Orientation) u2 { + return if (@intFromEnum(self) & 0b100 != 0) @intCast(~@intFromEnum(self)) else @intCast(@intFromEnum(self)); + } + + /// +1 for positive + /// -1 for negative + pub fn getSign(self: Orientation) i2 { + return if (@intFromEnum(self) & 0b100 != 0) -1 else 1; + } + + pub fn getOffsetVx(self: Orientation) i32 { + return if (@intFromEnum(self) & 0b100 != 0) 1 else 0; + } + + pub fn getOffsetSv(self: Orientation) i32 { + return if (@intFromEnum(self) & 0b100 != 0) c.sv_per_vx else 0; + } }; pub const Transform = enum(u3) {