package renderer import "core:math/linalg" Camera :: struct { position: [3]f32, forward, up: [3]f32, fov: f32, near, far: f32, yaw, pitch: f32, } create_camera :: proc(renderer: ^Renderer, position: [3]f32, forward, up: [3]f32, fov, near, far: f32) -> Camera { c: Camera c.position = position c.forward = forward c.up = up c.fov = fov c.near = near c.far = far assert(c.forward != {}) assert(c.up != {}) assert(fov > 0) assert(near > 0) assert(far > 0) return c } get_camera_view_matrix :: proc(camera: ^Camera) -> (linalg.Matrix4f32, bool) { if camera == nil { return {}, false } center := camera.position + camera.forward view_matrix := linalg.identity(linalg.Matrix4x4f32) view_matrix *= linalg.matrix4_look_at_f32(camera.position, center, camera.up) return view_matrix, true } get_camera_projection_matrix :: proc(renderer: ^Renderer, camera: ^Camera) -> (linalg.Matrix4f32, bool) { if camera == nil { return {}, false } projection_matrix := linalg.identity(linalg.Matrix4x4f32) projection_matrix *= linalg.matrix4_perspective(camera.fov, get_aspect_ratio(renderer), camera.near, camera.far) return projection_matrix, true } set_active_camera :: proc(renderer: ^Renderer, camera: ^Camera) { renderer.active_camera = camera } get_active_camera :: proc(renderer: ^Renderer) -> ^Camera { return renderer.active_camera }