Added camera, use MVP.
This commit is contained in:
62
camera.odin
Normal file
62
camera.odin
Normal file
@@ -0,0 +1,62 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user