Separate input component
This commit is contained in:
parent
29e7b5e499
commit
705f498daa
9 changed files with 318 additions and 178 deletions
56
ecs/camera_system.odin
Normal file
56
ecs/camera_system.odin
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
package ecs
|
||||
|
||||
import "core:math"
|
||||
import "core:math/linalg"
|
||||
|
||||
import sa "../sokol/app"
|
||||
|
||||
CameraSystem :: struct {
|
||||
using base: SystemBase,
|
||||
}
|
||||
|
||||
|
||||
camera_system_init :: proc(camera_system: ^CameraSystem) {
|
||||
|
||||
}
|
||||
|
||||
camera_system_update :: proc(camera_system: ^CameraSystem, coordinator: ^Coordinator, dt: f32) {
|
||||
for entity in camera_system.entities {
|
||||
camera := coordinator_get_component(CameraComponent, coordinator, entity)
|
||||
input := coordinator_get_component(InputComponent, coordinator, entity)
|
||||
|
||||
if input.key_down[.ESCAPE] do sa.quit()
|
||||
|
||||
move_input: Vec3
|
||||
if input.key_down[.W] do move_input.y = 1
|
||||
else if input.key_down[.S] do move_input.y = -1
|
||||
|
||||
if input.key_down[.D] do move_input.x = 1
|
||||
else if input.key_down[.A] do move_input.x = -1
|
||||
|
||||
if input.key_down[.SPACE] do move_input.z = 1
|
||||
else if input.key_down[.LEFT_SHIFT] do move_input.z = -1
|
||||
|
||||
look_input: Vec2 = -input.mouse_movement * camera.look_sensitivity
|
||||
camera.look += look_input
|
||||
camera.look.x = math.wrap(camera.look.x, 360)
|
||||
camera.look.y = math.clamp(camera.look.y, -89.5, 89.5)
|
||||
|
||||
look_mat := linalg.matrix4_from_yaw_pitch_roll_f32(
|
||||
linalg.to_radians(camera.look.x),
|
||||
linalg.to_radians(camera.look.y),
|
||||
0,
|
||||
)
|
||||
|
||||
forward := (look_mat * Vec4{0, 0, -1, 1}).xyz
|
||||
right := (look_mat * Vec4{1, 0, 0, 1}).xyz
|
||||
up := (look_mat * Vec4{0, 1, 0, 1}).xyz
|
||||
|
||||
move_dir := forward * move_input.y + right * move_input.x + up * move_input.z
|
||||
motion := linalg.normalize0(move_dir) * camera.movement_speed * dt
|
||||
camera.position += motion
|
||||
|
||||
camera.target = camera.position + forward
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue