diff --git a/codegen/luau/runtime/numeric.lua b/codegen/luau/runtime/numeric.lua index ebca101..41c38c5 100644 --- a/codegen/luau/runtime/numeric.lua +++ b/codegen/luau/runtime/numeric.lua @@ -28,13 +28,37 @@ local from_u32, into_u32, from_u64, into_u64 local num_add, num_subtract, num_multiply, num_divide_unsigned, num_negate, num_not local num_is_negative, num_is_zero, num_is_equal, num_is_less_unsigned, num_is_greater_unsigned --- TODO: Eventually support Vector3 -function Numeric.from_u32(data_1, data_2) - return table_freeze({ data_1, data_2 }) -end +if Vector3 then + local bit_extract = bit32.extract + local constructor = Vector3.new -function Numeric.into_u32(data) - return data[1], data[2] + -- X: a[0 ..21] + -- Y: a[22..31] + -- | b[0 ..11] + -- Z: b[12..31] + + function Numeric.from_u32(data_1, data_2) + local x = bit_and(data_1, 0x3FFFFF) + local y = bit_or(bit_and(data_1, 0xFFC00000), bit_and(data_2, 0xFFF)) + local z = bit_extract(data_2, 12, 20) + + return constructor(x, y, z) + end + + function Numeric.into_u32(data) + local data_1 = bit_or(bit_and(data.X, 0x3FFFFF), bit_and(data.Y, 0xFFC00000)) + local data_2 = bit_replace(bit_and(data.Y, 0xFFF), bit_and(data.Z, 0xFFFFF), 12, 20) + + return data_1, data_2 + end +else + function Numeric.from_u32(data_1, data_2) + return table_freeze({ data_1, data_2 }) + end + + function Numeric.into_u32(data) + return data[1], data[2] + end end function Numeric.from_u64(value)