Implemented rotations
This commit is contained in:
parent
7a634d53b5
commit
defdf051ec
6 changed files with 29 additions and 13 deletions
|
|
@ -15,6 +15,7 @@ layout (binding = 1) uniform ViewUniform {
|
||||||
layout (binding = 4) uniform TransformUniform {
|
layout (binding = 4) uniform TransformUniform {
|
||||||
mat4 translation;
|
mat4 translation;
|
||||||
mat4 scale;
|
mat4 scale;
|
||||||
|
mat4 rotation;
|
||||||
} transform;
|
} transform;
|
||||||
|
|
||||||
layout(location = 2) out vec3 Normal;
|
layout(location = 2) out vec3 Normal;
|
||||||
|
|
@ -22,7 +23,7 @@ layout(location = 3) out vec3 FragPos;
|
||||||
layout(location = 4) out vec2 TexCoords;
|
layout(location = 4) out vec2 TexCoords;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
mat4 transformation = transform.translation * transform.scale;
|
mat4 transformation = transform.translation * transform.scale * transform.rotation;
|
||||||
vec4 out_vec = proj.proj * view.view * transformation * vec4(vertPos, 1.0);
|
vec4 out_vec = proj.proj * view.view * transformation * vec4(vertPos, 1.0);
|
||||||
FragPos = vec3(vec4(vertPos, 1.0));
|
FragPos = vec3(vec4(vertPos, 1.0));
|
||||||
Normal = normal;
|
Normal = normal;
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ pub const Human = struct {
|
||||||
// TODO(ernesto): Move pool to its own file
|
// TODO(ernesto): Move pool to its own file
|
||||||
pub const Pool = struct {
|
pub const Pool = struct {
|
||||||
humans: std.MultiArrayList(Human),
|
humans: std.MultiArrayList(Human),
|
||||||
resources: Resources,
|
resources: *Resources,
|
||||||
allocator: Allocator,
|
allocator: Allocator,
|
||||||
system_groups: std.ArrayList(SystemGroup),
|
system_groups: std.ArrayList(SystemGroup),
|
||||||
sync_groups: std.ArrayList(SyncGroup),
|
sync_groups: std.ArrayList(SyncGroup),
|
||||||
|
|
@ -34,7 +34,7 @@ pub const Pool = struct {
|
||||||
wait_group: std.Thread.WaitGroup,
|
wait_group: std.Thread.WaitGroup,
|
||||||
mutex: std.Thread.Mutex,
|
mutex: std.Thread.Mutex,
|
||||||
|
|
||||||
pub fn init(allocator: Allocator, resources: Resources) !@This() {
|
pub fn init(allocator: Allocator, resources: *Resources) !@This() {
|
||||||
var pool = @This(){
|
var pool = @This(){
|
||||||
.humans = .{},
|
.humans = .{},
|
||||||
.resources = resources,
|
.resources = resources,
|
||||||
|
|
|
||||||
14
src/math.zig
14
src/math.zig
|
|
@ -11,18 +11,21 @@ pub const Axis = struct {
|
||||||
pub const z: [3]f32 = .{0.0, 0.0, 1.0};
|
pub const z: [3]f32 = .{0.0, 0.0, 1.0};
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const Transform = struct {
|
pub const Transform = extern struct {
|
||||||
translation: Matrix,
|
translation: Matrix,
|
||||||
scale: Matrix,
|
scale: Matrix,
|
||||||
|
rotation_matrix: Matrix,
|
||||||
rotation: Quaternion,
|
rotation: Quaternion,
|
||||||
|
|
||||||
pub fn init(position: [3]f32, scale: [3]f32, rotation: [3]f32) Transform {
|
pub fn init(position: [3]f32, scale: [3]f32, rotation: [3]f32) Transform {
|
||||||
var translation = Matrix.identity();
|
var translation = Matrix.identity();
|
||||||
translation.translate(position);
|
translation.translate(position);
|
||||||
|
const quaternion = Quaternion.fromEulerAngles(rotation);
|
||||||
|
|
||||||
return .{
|
return .{
|
||||||
.translation = translation,
|
.translation = translation,
|
||||||
.rotation = Quaternion.fromEulerAngles(rotation),
|
.rotation = quaternion,
|
||||||
|
.rotation_matrix = quaternion.matrix(),
|
||||||
.scale = Matrix.scale(scale),
|
.scale = Matrix.scale(scale),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -35,10 +38,11 @@ pub const Transform = struct {
|
||||||
const delta = Quaternion.fromAxisAngle(axis, angle);
|
const delta = Quaternion.fromAxisAngle(axis, angle);
|
||||||
self.rotation = self.rotation.mul(delta);
|
self.rotation = self.rotation.mul(delta);
|
||||||
self.rotation = self.rotation.normalize();
|
self.rotation = self.rotation.normalize();
|
||||||
|
self.rotation_matrix = self.rotation.matrix();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const Matrix = struct {
|
pub const Matrix = extern struct {
|
||||||
rows: [4][4]f32,
|
rows: [4][4]f32,
|
||||||
|
|
||||||
pub fn lookAt(eye: [3]f32, target: [3]f32, arbitrary_up: [3]f32) Matrix {
|
pub fn lookAt(eye: [3]f32, target: [3]f32, arbitrary_up: [3]f32) Matrix {
|
||||||
|
|
@ -134,7 +138,7 @@ pub const Matrix = struct {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const Quaternion = struct {
|
pub const Quaternion = extern struct {
|
||||||
w: f32,
|
w: f32,
|
||||||
x: f32,
|
x: f32,
|
||||||
y: f32,
|
y: f32,
|
||||||
|
|
@ -150,7 +154,7 @@ const Quaternion = struct {
|
||||||
.w = cos(half_angle),
|
.w = cos(half_angle),
|
||||||
.x = axis[0] * s,
|
.x = axis[0] * s,
|
||||||
.y = axis[1] * s,
|
.y = axis[1] * s,
|
||||||
.z = axis[3] * s,
|
.z = axis[2] * s,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ current_frame: u32,
|
||||||
vertex_buffer: vk.Buffer,
|
vertex_buffer: vk.Buffer,
|
||||||
index_buffer: vk.Buffer,
|
index_buffer: vk.Buffer,
|
||||||
transform: math.Transform,
|
transform: math.Transform,
|
||||||
|
previous_time: std.time.Instant,
|
||||||
|
|
||||||
pub fn init(allocator: Allocator, instance_handle: vk.c.VkInstance, surface_handle: vk.c.VkSurfaceKHR) !Renderer {
|
pub fn init(allocator: Allocator, instance_handle: vk.c.VkInstance, surface_handle: vk.c.VkSurfaceKHR) !Renderer {
|
||||||
const instance: vk.Instance = .{ .handle = instance_handle };
|
const instance: vk.Instance = .{ .handle = instance_handle };
|
||||||
|
|
@ -68,7 +69,8 @@ pub fn init(allocator: Allocator, instance_handle: vk.c.VkInstance, surface_hand
|
||||||
// TODO: Why are we storing the buffer and not the Mesh?
|
// TODO: Why are we storing the buffer and not the Mesh?
|
||||||
.vertex_buffer = triangle.vertex_buffer,
|
.vertex_buffer = triangle.vertex_buffer,
|
||||||
.index_buffer = triangle.index_buffer,
|
.index_buffer = triangle.index_buffer,
|
||||||
.transform = math.Transform.init(.{0.0, 0.0, 0.0}, .{1.0, 1.0, 1.0}, .{0.0, 0.0, 0.0}),
|
.transform = math.Transform.init(.{0.0, 0.0, 0.0}, .{1.0, 1.0, 1.0}, .{0.0, math.rad(45.0), 0.0}),
|
||||||
|
.previous_time = try std.time.Instant.now(),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -87,6 +89,10 @@ pub fn render(pool: *ecs.Pool) anyerror!void {
|
||||||
var renderer = pool.resources.renderer;
|
var renderer = pool.resources.renderer;
|
||||||
var camera = pool.resources.camera;
|
var camera = pool.resources.camera;
|
||||||
|
|
||||||
|
const now = try std.time.Instant.now();
|
||||||
|
const delta_time: f32 = @as(f32, @floatFromInt(now.since(renderer.previous_time))) / @as(f32, 1_000_000_000.0);
|
||||||
|
renderer.previous_time = now;
|
||||||
|
|
||||||
const view_memory = renderer.graphics_pipeline.view_memory;
|
const view_memory = renderer.graphics_pipeline.view_memory;
|
||||||
@memcpy(view_memory[0..@sizeOf(math.Matrix)], std.mem.asBytes(&camera.getView()));
|
@memcpy(view_memory[0..@sizeOf(math.Matrix)], std.mem.asBytes(&camera.getView()));
|
||||||
|
|
||||||
|
|
@ -96,8 +102,10 @@ pub fn render(pool: *ecs.Pool) anyerror!void {
|
||||||
view_pos[1] = camera.position[1];
|
view_pos[1] = camera.position[1];
|
||||||
view_pos[2] = camera.position[2];
|
view_pos[2] = camera.position[2];
|
||||||
|
|
||||||
|
renderer.transform.rotate(math.rad(10) * delta_time, .{0.0, 1.0, 0.0});
|
||||||
|
|
||||||
const transform_memory = renderer.graphics_pipeline.transform_memory;
|
const transform_memory = renderer.graphics_pipeline.transform_memory;
|
||||||
@memcpy(transform_memory[0..@sizeOf(math.Transform)], std.mem.asBytes(&renderer.transform));
|
@memcpy(transform_memory[0..(@sizeOf(math.Transform)-@sizeOf(math.Quaternion))], std.mem.asBytes(&renderer.transform)[0..(@sizeOf(math.Transform)-@sizeOf(math.Quaternion))]);
|
||||||
|
|
||||||
try renderer.device.waitFence(renderer.current_frame);
|
try renderer.device.waitFence(renderer.current_frame);
|
||||||
const image = try renderer.swapchain.nextImage(renderer.device, renderer.current_frame);
|
const image = try renderer.swapchain.nextImage(renderer.device, renderer.current_frame);
|
||||||
|
|
|
||||||
|
|
@ -548,7 +548,7 @@ pub fn GraphicsPipeline(comptime n: usize) type {
|
||||||
|
|
||||||
c.vkUpdateDescriptorSets(device.handle, 1, &write_view_descriptor_set, 0, null);
|
c.vkUpdateDescriptorSets(device.handle, 1, &write_view_descriptor_set, 0, null);
|
||||||
|
|
||||||
const transform_buffer = try device.createBuffer(BufferUsage{ .uniform_buffer = true, .transfer_dst = true }, BufferFlags{ .device_local = true }, @sizeOf(math.Transform));
|
const transform_buffer = try device.createBuffer(BufferUsage{ .uniform_buffer = true, .transfer_dst = true }, BufferFlags{ .device_local = true }, @sizeOf(math.Transform) - @sizeOf(math.Quaternion));
|
||||||
|
|
||||||
var transform_data: [*c]u8 = undefined;
|
var transform_data: [*c]u8 = undefined;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ var gpa = std.heap.GeneralPurposeAllocator(.{}){};
|
||||||
const allocator = gpa.allocator();
|
const allocator = gpa.allocator();
|
||||||
var pool: ecs.Pool = undefined;
|
var pool: ecs.Pool = undefined;
|
||||||
var renderer: Renderer = undefined;
|
var renderer: Renderer = undefined;
|
||||||
|
var resources: ecs.Resources = undefined;
|
||||||
|
|
||||||
fn init_mods() void {
|
fn init_mods() void {
|
||||||
var global_runtime = mods.GlobalRuntime.init(allocator);
|
var global_runtime = mods.GlobalRuntime.init(allocator);
|
||||||
|
|
@ -43,14 +44,16 @@ fn init_mods() void {
|
||||||
}
|
}
|
||||||
|
|
||||||
export fn sideros_init(init: api.GameInit) callconv(.c) void {
|
export fn sideros_init(init: api.GameInit) callconv(.c) void {
|
||||||
pool = ecs.Pool.init(allocator, .{
|
resources = .{
|
||||||
.camera = .{
|
.camera = .{
|
||||||
.position = .{ 5.0, 5.0, 5.0 },
|
.position = .{ 5.0, 5.0, 5.0 },
|
||||||
.target = .{ 0.0, 0.0, 0.0 },
|
.target = .{ 0.0, 0.0, 0.0 },
|
||||||
},
|
},
|
||||||
.renderer = undefined,
|
.renderer = undefined,
|
||||||
.input = .{ .key_pressed = .{false} ** @intFromEnum(ecs.Input.KeyCode.menu) },
|
.input = .{ .key_pressed = .{false} ** @intFromEnum(ecs.Input.KeyCode.menu) },
|
||||||
}) catch @panic("TODO: Gracefully handle error");
|
};
|
||||||
|
|
||||||
|
pool = ecs.Pool.init(allocator, &resources) catch @panic("TODO: Gracefully handle error");
|
||||||
// TODO(ernesto): I think this @ptrCast are unavoidable but maybe not?
|
// TODO(ernesto): I think this @ptrCast are unavoidable but maybe not?
|
||||||
renderer = Renderer.init(allocator, @ptrCast(init.instance), @ptrCast(init.surface)) catch @panic("TODO: Gracefully handle error");
|
renderer = Renderer.init(allocator, @ptrCast(init.instance), @ptrCast(init.surface)) catch @panic("TODO: Gracefully handle error");
|
||||||
pool.addSystemGroup(&[_]ecs.System{Renderer.render}, true) catch @panic("TODO: Gracefuly handle error");
|
pool.addSystemGroup(&[_]ecs.System{Renderer.render}, true) catch @panic("TODO: Gracefuly handle error");
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue