fix matrix issue and compile errors relating to table (one remains)
This commit is contained in:
parent
742f966e14
commit
73a91195b6
3 changed files with 53 additions and 63 deletions
|
@ -3,48 +3,9 @@ const vec = @import("vec.zig");
|
||||||
const Vec3f = vec.Vec3f;
|
const Vec3f = vec.Vec3f;
|
||||||
const Vec4f = vec.Vec4f;
|
const Vec4f = vec.Vec4f;
|
||||||
|
|
||||||
pub const Mat3f = Mat(3, Vec3f);
|
// Intentionally use Vec4f to hopefully improve vectorization.
|
||||||
|
pub const Mat3f = Mat(3, Vec4f);
|
||||||
pub const Mat4f = packed struct {
|
pub const Mat4f = Mat(4, Vec4f);
|
||||||
const Self = @This();
|
|
||||||
pub const zero = Mat(4, Vec4f).zero;
|
|
||||||
pub const id = Mat(4, Vec4f).id;
|
|
||||||
|
|
||||||
pub usingnamespace Mat(4, Vec4f);
|
|
||||||
|
|
||||||
pub inline fn lookAt(eye: Vec4f, at: Vec4f, up: Vec4f) Self {
|
|
||||||
// right-handed (ew)
|
|
||||||
const f = at.sub(eye).normalize3();
|
|
||||||
const s = f.cross3(up).normalize3();
|
|
||||||
const u = s.cross3(f).normalize3();
|
|
||||||
|
|
||||||
const tx = -s.dot3(eye);
|
|
||||||
const ty = -u.dot3(eye);
|
|
||||||
const tz = f.dot3(eye);
|
|
||||||
return Self{
|
|
||||||
.c0 = .{ .x = s.x, .y = u.x, .z = -f.x, .w = 0 },
|
|
||||||
.c1 = .{ .x = s.y, .y = u.y, .z = -f.y, .w = 0 },
|
|
||||||
.c2 = .{ .x = s.z, .y = u.z, .z = -f.z, .w = 0 },
|
|
||||||
.c3 = .{ .x = tx, .y = ty, .z = tz, .w = 1 },
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn glPerspective(fov_y: f32, aspect: f32, z_near: f32, z_far: f32) Self {
|
|
||||||
const t = std.math.tan(fov_y * 0.5);
|
|
||||||
var m = zero;
|
|
||||||
m.c0.x = 1.0 / (aspect * t);
|
|
||||||
m.c1.y = 1.0 / t;
|
|
||||||
m.c2.z = -1.0 * (z_far * z_near) / (z_far - z_near);
|
|
||||||
m.c3.z = -2.0 * (z_far * z_near) / (z_far - z_near);
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub inline fn vkPerspective(fov_y: f32, aspect: f32, z_near: f32, z_far: f32) Self {
|
|
||||||
var m = glPerspective(fov_y, aspect, z_near, z_far);
|
|
||||||
m.c1.y *= -1.0;
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
pub fn Mat(comptime nelem: comptime_int, comptime Vec: type) type {
|
pub fn Mat(comptime nelem: comptime_int, comptime Vec: type) type {
|
||||||
return packed struct {
|
return packed struct {
|
||||||
|
@ -80,5 +41,41 @@ pub fn Mat(comptime nelem: comptime_int, comptime Vec: type) type {
|
||||||
.c3 = if (nelem > 3) a.mulCol(b.c3) else {},
|
.c3 = if (nelem > 3) a.mulCol(b.c3) else {},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Special methods specifically for Mat4f.
|
||||||
|
pub usingnamespace if (nelem == 4 and Vec == Vec4f) struct {
|
||||||
|
pub inline fn lookAt(eye: Vec4f, at: Vec4f, up: Vec4f) Self {
|
||||||
|
// right-handed (ew)
|
||||||
|
const f = at.sub(eye).normalize3();
|
||||||
|
const s = f.cross3(up).normalize3();
|
||||||
|
const u = s.cross3(f).normalize3();
|
||||||
|
|
||||||
|
const tx = -s.dot3(eye);
|
||||||
|
const ty = -u.dot3(eye);
|
||||||
|
const tz = f.dot3(eye);
|
||||||
|
return Self{
|
||||||
|
.c0 = .{ .x = s.x, .y = u.x, .z = -f.x, .w = 0 },
|
||||||
|
.c1 = .{ .x = s.y, .y = u.y, .z = -f.y, .w = 0 },
|
||||||
|
.c2 = .{ .x = s.z, .y = u.z, .z = -f.z, .w = 0 },
|
||||||
|
.c3 = .{ .x = tx, .y = ty, .z = tz, .w = 1 },
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub inline fn glPerspective(fov_y: f32, aspect: f32, z_near: f32, z_far: f32) Self {
|
||||||
|
const t = std.math.tan(fov_y * 0.5);
|
||||||
|
var m = Mat(4, Vec4f).zero;
|
||||||
|
m.c0.x = 1.0 / (aspect * t);
|
||||||
|
m.c1.y = 1.0 / t;
|
||||||
|
m.c2.z = -1.0 * (z_far * z_near) / (z_far - z_near);
|
||||||
|
m.c3.z = -2.0 * (z_far * z_near) / (z_far - z_near);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub inline fn vkPerspective(fov_y: f32, aspect: f32, z_near: f32, z_far: f32) Self {
|
||||||
|
var m = glPerspective(fov_y, aspect, z_near, z_far);
|
||||||
|
m.c1.y *= -1.0;
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
} else struct {};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@ const UUID = @import("../common/uuid.zig").UUID;
|
||||||
const Table = @import("../containers/table.zig").Table;
|
const Table = @import("../containers/table.zig").Table;
|
||||||
const Vec2i = @import("../math/vec.zig").Vec2i;
|
const Vec2i = @import("../math/vec.zig").Vec2i;
|
||||||
|
|
||||||
const TTable = Table(UUID, Texture.Id);
|
const TTable = Table(UUID, Texture);
|
||||||
var s_table: TTable = undefined;
|
var s_table: TTable = undefined;
|
||||||
|
|
||||||
pub fn init() void {
|
pub fn init() void {
|
||||||
|
@ -22,6 +22,8 @@ pub fn getTable() *const TTable {
|
||||||
pub const Texture = packed struct {
|
pub const Texture = packed struct {
|
||||||
const Self = @This();
|
const Self = @This();
|
||||||
|
|
||||||
|
pub const Id = TTable.Id;
|
||||||
|
|
||||||
const PalRow = enum {
|
const PalRow = enum {
|
||||||
white,
|
white,
|
||||||
brown,
|
brown,
|
||||||
|
@ -48,18 +50,13 @@ pub const Texture = packed struct {
|
||||||
format: vk.Format,
|
format: vk.Format,
|
||||||
slot: Id,
|
slot: Id,
|
||||||
|
|
||||||
pub fn get(id: Id) *const Self {
|
pub fn get(id: Id) ?*const Self {
|
||||||
return s_table.get(id);
|
return s_table.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn isCurrent(id: Id) bool {
|
pub fn isCurrent(id: Id) bool {
|
||||||
return s_table.exists(id);
|
return s_table.exists(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const Id = packed struct {
|
|
||||||
version: u8,
|
|
||||||
index: u24,
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const DiskTexture = packed struct {
|
pub const DiskTexture = packed struct {
|
||||||
|
@ -67,8 +64,4 @@ pub const DiskTexture = packed struct {
|
||||||
format: vk.Format,
|
format: vk.Format,
|
||||||
name: []u8,
|
name: []u8,
|
||||||
size: Vec2i,
|
size: Vec2i,
|
||||||
|
|
||||||
pub const Id = packed struct {
|
|
||||||
id: UUID,
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -427,19 +427,19 @@ const OpaquePass = struct {
|
||||||
|
|
||||||
const ents = Entities.get();
|
const ents = Entities.get();
|
||||||
for (ents.meshes.items) |mesh, i| {
|
for (ents.meshes.items) |mesh, i| {
|
||||||
const albedo = Texture.get(ents.materials.items[i].albedo);
|
const mAlbedo = Texture.get(ents.materials.items[i].albedo);
|
||||||
const rome = Texture.get(ents.materials.items[i].rome);
|
const mRome = Texture.get(ents.materials.items[i].rome);
|
||||||
const normal = Texture.get(ents.materials.items[i].normal);
|
const mNormal = Texture.get(ents.materials.items[i].normal);
|
||||||
|
|
||||||
const pc = PushConstants{
|
const pc = PushConstants{
|
||||||
.kLocalToWorld = ents.matrices[i],
|
.kLocalToWorld = ents.matrices.items[i],
|
||||||
.kIMc0 = ents.invMatrices[i].c0,
|
.kIMc0 = ents.inv_matrices.items[i].c0,
|
||||||
.kIMc1 = ents.invMatrices[i].c1,
|
.kIMc1 = ents.inv_matrices.items[i].c1,
|
||||||
.kIMc2 = ents.invMatrices[i].c2,
|
.kIMc2 = ents.inv_matrices.items[i].c2,
|
||||||
.kTexInds = .{
|
.kTexInds = .{
|
||||||
.x = if (albedo) albedo.slot.index else 0,
|
.x = if (mAlbedo) |albedo| albedo.slot.index else 0,
|
||||||
.y = if (rome) rome.slot.index else 0,
|
.y = if (mRome) |rome| rome.slot.index else 0,
|
||||||
.z = if (normal) normal.slot.index else 0,
|
.z = if (mNormal) |normal| normal.slot.index else 0,
|
||||||
.w = 0,
|
.w = 0,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue