sideros/src/systems.zig
2025-08-14 14:52:48 +02:00

75 lines
2.4 KiB
Zig

const ecs = @import("ecs");
const math = @import("math");
const std = @import("std");
const Input = ecs.Input;
pub fn render(pool: *ecs.Pool) anyerror!void {
var renderer = pool.resources.renderer;
const camera = pool.resources.camera;
const terrain = pool.resources.terrain;
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);
pool.resources.delta_time = delta_time;
renderer.previous_time = now;
renderer.setCamera(camera);
const transform_memory = renderer.graphics_pipeline.transform_buffer.mapped_memory;
try renderer.begin();
renderer.setLightCount(2);
try renderer.beginTerrain();
renderer.device.drawTerrain(@as(u32, @intCast(terrain.index_buffer.size/@sizeOf(u32))), renderer.current_frame, terrain.vertex_buffer, terrain.index_buffer);
try renderer.beginGraphics();
for (renderer.transforms.items, 0..) |transform, i| {
transform_memory[i] = transform;
renderer.setTransform(@intCast(i));
renderer.device.draw(renderer.mesh.index_count, renderer.current_frame, renderer.mesh);
}
try renderer.end();
}
pub fn moveCamera(pool: *ecs.Pool) !void {
const input = pool.resources.input;
var camera = pool.resources.camera;
const mul = @as(@Vector(3, f32), @splat(camera.speed * pool.resources.delta_time));
var forward = camera.getDirection();
forward[0] = -forward[0];
forward[1] = 0.0;
const left = math.cross(forward, camera.up);
if (input.isKeyDown(.w)) {
camera.position += forward * mul;
}
if (input.isKeyDown(.s)) {
camera.position -= forward * mul;
}
if (input.isKeyDown(.a)) {
camera.position += left * mul;
}
if (input.isKeyDown(.d)) {
camera.position -= left * mul;
}
if (input.isKeyDown(.q)) {
camera.rotateAround(camera.getTarget(), math.rad(100.0 * pool.resources.delta_time));
}
if (input.isKeyDown(.e)) {
camera.rotateAround(camera.getTarget(), math.rad(-100.0 * pool.resources.delta_time));
}
}
pub fn zoomCamera(pool: *ecs.Pool, direction: Input.ScrollDirection) !void {
var camera = pool.resources.camera;
var camera_direction = camera.getDirection();
camera_direction[0] = -camera_direction[0];
if (direction == .up) {
camera.position += camera_direction;
} else {
camera.position -= camera_direction;
}
}