Big vecmath package
This commit is contained in:
@@ -1,7 +1,11 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
|
||||||
pub fn build(b: *std.Build) void {
|
pub fn build(b: *std.Build) void {
|
||||||
_ = b.addModule("media", .{
|
const vm_dep = b.dependency("vecmath", .{});
|
||||||
|
const vm_module = vm_dep.module("vecmath");
|
||||||
|
|
||||||
|
const root_module = b.addModule("media", .{
|
||||||
.root_source_file = b.path("src/root.zig"),
|
.root_source_file = b.path("src/root.zig"),
|
||||||
});
|
});
|
||||||
|
root_module.addImport("vecmath", vm_module);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,4 +8,9 @@
|
|||||||
"build.zig.zon",
|
"build.zig.zon",
|
||||||
},
|
},
|
||||||
.fingerprint = 0x6a2ca10cfcadaa2b,
|
.fingerprint = 0x6a2ca10cfcadaa2b,
|
||||||
|
.dependencies = .{
|
||||||
|
.vecmath = .{
|
||||||
|
.path = "../vecmath",
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,227 +0,0 @@
|
|||||||
const std = @import("std");
|
|
||||||
|
|
||||||
pub const ColorU8 = extern struct {
|
|
||||||
r: u8,
|
|
||||||
g: u8,
|
|
||||||
b: u8,
|
|
||||||
a: u8,
|
|
||||||
|
|
||||||
pub const Array = [4]u8;
|
|
||||||
pub const Vector = @Vector(4, u8);
|
|
||||||
|
|
||||||
pub const clear = ColorU8.init(0, 0, 0, 0);
|
|
||||||
pub const black = ColorU8.init(0, 0, 0, 255);
|
|
||||||
pub const white = ColorU8.init(255, 255, 255, 255);
|
|
||||||
|
|
||||||
pub inline fn init(r: u8, g: u8, b: u8, a: u8) ColorU8 {
|
|
||||||
return .{ .r = r, .g = g, .b = b, .a = a };
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn initArray(array: Array) ColorU8 {
|
|
||||||
return @bitCast(array);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn initVector(vector: Vector) ColorU8 {
|
|
||||||
return @bitCast(@as(Array, vector));
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn initColorF16(color: ColorF16) ColorU8 {
|
|
||||||
const zero: ColorF16.Vector = @splat(0);
|
|
||||||
const one: ColorF16.Vector = @splat(1);
|
|
||||||
const scale: ColorF16.Vector = @splat(255);
|
|
||||||
|
|
||||||
const vector = @round(std.math.clamp(color.asVector(), zero, one) * scale);
|
|
||||||
return .{
|
|
||||||
.r = @intFromFloat(vector[0]),
|
|
||||||
.g = @intFromFloat(vector[1]),
|
|
||||||
.b = @intFromFloat(vector[2]),
|
|
||||||
.a = @intFromFloat(vector[3]),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn initColorF32(color: ColorF32) ColorU8 {
|
|
||||||
const zero: ColorF32.Vector = @splat(0);
|
|
||||||
const one: ColorF32.Vector = @splat(1);
|
|
||||||
const scale: ColorF32.Vector = @splat(255);
|
|
||||||
|
|
||||||
const vector = @round(std.math.clamp(color.asVector(), zero, one) * scale);
|
|
||||||
return .{
|
|
||||||
.r = @intFromFloat(vector[0]),
|
|
||||||
.g = @intFromFloat(vector[1]),
|
|
||||||
.b = @intFromFloat(vector[2]),
|
|
||||||
.a = @intFromFloat(vector[3]),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn asArray(self: ColorU8) Array {
|
|
||||||
return @bitCast(self);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn asVector(self: ColorU8) Vector {
|
|
||||||
return @as(Array, @bitCast(self));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
pub const ColorF16 = extern struct {
|
|
||||||
r: f16,
|
|
||||||
g: f16,
|
|
||||||
b: f16,
|
|
||||||
a: f16,
|
|
||||||
|
|
||||||
pub const Array = [4]f16;
|
|
||||||
pub const Vector = @Vector(4, f16);
|
|
||||||
|
|
||||||
pub const clear = ColorF16.init(0.0, 0.0, 0.0, 0.0);
|
|
||||||
pub const black = ColorF16.init(0.0, 0.0, 0.0, 1.0);
|
|
||||||
pub const white = ColorF16.init(1.0, 1.0, 1.0, 1.0);
|
|
||||||
|
|
||||||
pub inline fn init(r: f16, g: f16, b: f16, a: f16) ColorF16 {
|
|
||||||
return .{ .r = r, .g = g, .b = b, .a = a };
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn initArray(array: Array) ColorF16 {
|
|
||||||
return @bitCast(array);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn initVector(vector: Vector) ColorF16 {
|
|
||||||
return @bitCast(@as(Array, vector));
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn initColorU8(color: ColorU8) ColorF16 {
|
|
||||||
const vector = Vector{
|
|
||||||
@as(f32, color.r),
|
|
||||||
@as(f32, color.g),
|
|
||||||
@as(f32, color.b),
|
|
||||||
@as(f32, color.a),
|
|
||||||
} / @as(Vector, @splat(255.0));
|
|
||||||
|
|
||||||
return @bitCast(@as(Array, vector));
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn initColorF32(color: ColorF32) ColorF16 {
|
|
||||||
return @bitCast(@as(Array, @as(Vector, @floatCast(color.asVector()))));
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn asArray(self: ColorF16) Array {
|
|
||||||
return @bitCast(self);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn asVector(self: ColorF16) Vector {
|
|
||||||
return @as(Array, @bitCast(self));
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn add(self: ColorF16, other: ColorF16) ColorF16 {
|
|
||||||
return .initVector(self.asVector() + other.asVector());
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn sub(self: ColorF16, other: ColorF16) ColorF16 {
|
|
||||||
return .initVector(self.asVector() - other.asVector());
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn mul(self: ColorF16, other: ColorF16) ColorF16 {
|
|
||||||
return .initVector(self.asVector() * other.asVector());
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn div(self: ColorF16, other: ColorF16) ColorF16 {
|
|
||||||
return .initVector(self.asVector() / other.asVector());
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn mulScalar(self: ColorF16, scalar: f16) ColorF16 {
|
|
||||||
const scalar_vector: Vector = @splat(scalar);
|
|
||||||
return .initVector(self.asVector() * scalar_vector);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn divScalar(self: ColorF16, scalar: f16) ColorF16 {
|
|
||||||
const scalar_vector: Vector = @splat(scalar);
|
|
||||||
return .initVector(self.asVector() / scalar_vector);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn lerp(self: ColorF16, other: ColorF16, t: f16) ColorF16 {
|
|
||||||
const s = 1.0 - t;
|
|
||||||
const t_vector: Vector = @splat(t);
|
|
||||||
const s_vector: Vector = @splat(s);
|
|
||||||
return .initVector(self.asVector() * s_vector + other.asVector() * t_vector);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
pub const ColorF32 = extern struct {
|
|
||||||
r: f32,
|
|
||||||
g: f32,
|
|
||||||
b: f32,
|
|
||||||
a: f32,
|
|
||||||
|
|
||||||
pub const Array = [4]f32;
|
|
||||||
pub const Vector = @Vector(4, f32);
|
|
||||||
|
|
||||||
pub const clear = ColorF32.init(0.0, 0.0, 0.0, 0.0);
|
|
||||||
pub const black = ColorF32.init(0.0, 0.0, 0.0, 1.0);
|
|
||||||
pub const white = ColorF32.init(1.0, 1.0, 1.0, 1.0);
|
|
||||||
|
|
||||||
pub inline fn init(r: f32, g: f32, b: f32, a: f32) ColorF32 {
|
|
||||||
return .{ .r = r, .g = g, .b = b, .a = a };
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn initArray(array: Array) ColorF32 {
|
|
||||||
return @bitCast(array);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn initVector(vector: Vector) ColorF32 {
|
|
||||||
return @bitCast(@as(Array, vector));
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn initColorU8(color: ColorU8) ColorF32 {
|
|
||||||
const vector = Vector{
|
|
||||||
@as(f32, color.r),
|
|
||||||
@as(f32, color.g),
|
|
||||||
@as(f32, color.b),
|
|
||||||
@as(f32, color.a),
|
|
||||||
} / @as(Vector, @splat(255.0));
|
|
||||||
|
|
||||||
return @bitCast(@as(Array, vector));
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn initColorF16(color: ColorF16) ColorF32 {
|
|
||||||
return @bitCast(@as(Array, @as(Vector, @floatCast(color.asVector()))));
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn asArray(self: ColorF32) Array {
|
|
||||||
return @bitCast(self);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn asVector(self: ColorF32) Vector {
|
|
||||||
return @as(Array, @bitCast(self));
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn add(self: ColorF32, other: ColorF32) ColorF32 {
|
|
||||||
return .initVector(self.asVector() + other.asVector());
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn sub(self: ColorF32, other: ColorF32) ColorF32 {
|
|
||||||
return .initVector(self.asVector() - other.asVector());
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn mul(self: ColorF32, other: ColorF32) ColorF32 {
|
|
||||||
return .initVector(self.asVector() * other.asVector());
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn div(self: ColorF32, other: ColorF32) ColorF32 {
|
|
||||||
return .initVector(self.asVector() / other.asVector());
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn mulScalar(self: ColorF32, scalar: f32) ColorF32 {
|
|
||||||
const scalar_vector: Vector = @splat(scalar);
|
|
||||||
return .initVector(self.asVector() * scalar_vector);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn divScalar(self: ColorF32, scalar: f32) ColorF32 {
|
|
||||||
const scalar_vector: Vector = @splat(scalar);
|
|
||||||
return .initVector(self.asVector() / scalar_vector);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn lerp(self: ColorF32, other: ColorF32, t: f32) ColorF32 {
|
|
||||||
const s = 1.0 - t;
|
|
||||||
const t_vector: Vector = @splat(t);
|
|
||||||
const s_vector: Vector = @splat(s);
|
|
||||||
return .initVector(self.asVector() * s_vector + other.asVector() * t_vector);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,25 +1,24 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
const vm = @import("vecmath");
|
||||||
const Color = @import("color.zig").Color;
|
|
||||||
|
|
||||||
pub fn Static(comptime W: u32, comptime H: u32) type {
|
pub fn Static(comptime W: u32, comptime H: u32) type {
|
||||||
return struct {
|
return struct {
|
||||||
data: [W * H]Color,
|
data: [W * H]vm.Color,
|
||||||
|
|
||||||
pub const width = W;
|
pub const width = W;
|
||||||
pub const height = H;
|
pub const height = H;
|
||||||
|
|
||||||
pub fn getPixel(self: *const @This(), x: u32, y: u32) Color {
|
pub fn getPixel(self: *const @This(), x: u32, y: u32) vm.Color {
|
||||||
std.debug.assert(x < width and y < height);
|
std.debug.assert(x < width and y < height);
|
||||||
return self.data[y * width + x];
|
return self.data[y * width + x];
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn setPixel(self: *@This(), x: u32, y: u32, color: Color) void {
|
pub fn setPixel(self: *@This(), x: u32, y: u32, color: vm.Color) void {
|
||||||
std.debug.assert(x < width and y < height);
|
std.debug.assert(x < width and y < height);
|
||||||
self.data[y * width + x] = color;
|
self.data[y * width + x] = color;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn fill(self: *@This(), color: Color) void {
|
pub fn fill(self: *@This(), color: vm.Color) void {
|
||||||
@memset(self.data, color);
|
@memset(self.data, color);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -29,9 +28,9 @@ pub const Dynamic = struct {
|
|||||||
width: u32,
|
width: u32,
|
||||||
height: u32,
|
height: u32,
|
||||||
|
|
||||||
data: [*]Color,
|
data: [*]vm.Color,
|
||||||
|
|
||||||
pub fn initBuffer(width: u32, height: u32, buffer: []Color) @This() {
|
pub fn initBuffer(width: u32, height: u32, buffer: []vm.Color) @This() {
|
||||||
std.debug.assert(buffer.len == width * height);
|
std.debug.assert(buffer.len == width * height);
|
||||||
return .{
|
return .{
|
||||||
.width = width,
|
.width = width,
|
||||||
@@ -41,7 +40,7 @@ pub const Dynamic = struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn initAlloc(width: u32, height: u32, allocator: std.mem.Allocator) !@This() {
|
pub fn initAlloc(width: u32, height: u32, allocator: std.mem.Allocator) !@This() {
|
||||||
const buffer = try allocator.alloc(Color, width * height);
|
const buffer = try allocator.alloc(vm.Color, width * height);
|
||||||
return .{
|
return .{
|
||||||
.width = width,
|
.width = width,
|
||||||
.height = height,
|
.height = height,
|
||||||
@@ -53,17 +52,17 @@ pub const Dynamic = struct {
|
|||||||
allocator.free(self.data[0 .. self.width * self.height]);
|
allocator.free(self.data[0 .. self.width * self.height]);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn getPixel(self: *const @This(), x: u32, y: u32) Color {
|
pub fn getPixel(self: *const @This(), x: u32, y: u32) vm.Color {
|
||||||
std.debug.assert(x < self.width and y < self.height);
|
std.debug.assert(x < self.width and y < self.height);
|
||||||
return self.data[y * self.width + x];
|
return self.data[y * self.width + x];
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn setPixel(self: *@This(), x: u32, y: u32, color: Color) void {
|
pub fn setPixel(self: *@This(), x: u32, y: u32, color: vm.Color) void {
|
||||||
std.debug.assert(x < self.width and y < self.height);
|
std.debug.assert(x < self.width and y < self.height);
|
||||||
self.data[y * self.width + x] = color;
|
self.data[y * self.width + x] = color;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn fill(self: *@This(), color: Color) void {
|
pub fn fill(self: *@This(), color: vm.Color) void {
|
||||||
@memset(self.data[0 .. self.width * self.height], color);
|
@memset(self.data[0 .. self.width * self.height], color);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -35,9 +35,7 @@ pub fn info(buffer: []const u8) ?Header {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (samples == 0) {
|
if (samples == 0) {
|
||||||
return .{
|
return .streaming;
|
||||||
.streaming = {},
|
|
||||||
};
|
|
||||||
} else {
|
} else {
|
||||||
return .{
|
return .{
|
||||||
.static = .{
|
.static = .{
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
pub const audio = @import("audio.zig");
|
pub const audio = @import("audio.zig");
|
||||||
pub const color = @import("color.zig");
|
|
||||||
pub const image = @import("image.zig");
|
pub const image = @import("image.zig");
|
||||||
pub const qoa = @import("qoa.zig");
|
pub const qoa = @import("qoa.zig");
|
||||||
pub const qoi = @import("qoi.zig");
|
pub const qoi = @import("qoi.zig");
|
||||||
|
|||||||
7
packages/vecmath/build.zig
Normal file
7
packages/vecmath/build.zig
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
const std = @import("std");
|
||||||
|
|
||||||
|
pub fn build(b: *std.Build) void {
|
||||||
|
_ = b.addModule("vecmath", .{
|
||||||
|
.root_source_file = b.path("src/root.zig"),
|
||||||
|
});
|
||||||
|
}
|
||||||
11
packages/vecmath/build.zig.zon
Normal file
11
packages/vecmath/build.zig.zon
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
.{
|
||||||
|
.name = .vecmath,
|
||||||
|
.version = "0.0.0",
|
||||||
|
.minimum_zig_version = "0.15.2",
|
||||||
|
.paths = .{
|
||||||
|
"src",
|
||||||
|
"build.zig",
|
||||||
|
"build.zig.zon",
|
||||||
|
},
|
||||||
|
.fingerprint = 0x1c1c724ae9962a2d,
|
||||||
|
}
|
||||||
2651
packages/vecmath/src/root.zig
Normal file
2651
packages/vecmath/src/root.zig
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user