Yaw & Pitch bound to mouse input

master
Elias Fleckenstein 2020-08-11 13:54:12 +02:00
parent 7332763e64
commit 0a25ed9a03
5 changed files with 57 additions and 21 deletions

View File

@ -5,7 +5,7 @@ function graphics:init()
RenderEngine.bininear_filter = false
RenderEngine.mipmap = false
RenderEngine.fov = 45
RenderEngine.mouse_sensitivity = 0.012
RenderEngine.mesh_effect_grow_time = 0.25
RenderEngine.mesh_effect_flyin_time = 1
RenderEngine.mesh_effect_flyin_offset = 20

View File

@ -3,12 +3,13 @@ table.assign(LocalPlayer, PlayerSystem.Player)
function LocalPlayer:constructor()
self:init()
self:set_speed(4)
self:set_speed(10)
self:set_fov(45)
self:set_yaw(180)
self:set_pitch(0)
self:add_event_listener("after_set_position", function(event) self:set_position_callback(event) end)
RenderEngine:add_event_listener("keypress", function(event) self:key_press_callback(event) end)
RenderEngine:add_event_listener("mousemove", function(event) self:mouse_move_callback(event) end)
RenderEngine:add_listen_key("w")
RenderEngine:add_listen_key("a")
RenderEngine:add_listen_key("s")
@ -20,25 +21,30 @@ end
function LocalPlayer:key_press_callback(event)
local keys = event.keys
local speed = self.speed * event.dtime
local yawvec, pitchvec = self.yaw_vector, self.pitch_vector
local vertvec = glm.vec3(0, 1, 0)
local hvec, vvec = self.horizontal_look, RenderEngine.camera.up
if keys["w"] then
self:move( speed * yawvec)
self:move( speed * hvec)
elseif keys["s"] then
self:move(-speed * yawvec)
self:move(-speed * hvec)
end
if keys["a"] then
self:move(-speed * (yawvec % pitchvec):normalize())
self:move(-speed * (hvec % vvec):normalize())
elseif keys["d"] then
self:move( speed * (yawvec % pitchvec):normalize())
self:move( speed * (hvec % vvec):normalize())
end
if keys["left shift"] then
self:move(-speed * vertvec)
self:move(-speed * vvec)
elseif keys["space"] then
self:move( speed * vertvec)
self:move( speed * vvec)
end
end
function LocalPlayer:mouse_move_callback(event)
self.yaw = self.yaw - event.x
self.pitch = self.pitch - event.y
self:update_look()
end
function LocalPlayer:set_position_callback(event)
RenderEngine.camera.pos = self.pos
end
@ -52,16 +58,19 @@ function LocalPlayer:set_fov(fov)
RenderEngine.fov = fov
end
function LocalPlayer:set_yaw(degrees)
local radians = math.rad(degrees)
self.yaw_vector = glm.vec3(math.sin(radians), 0, math.cos(radians)):normalize()
RenderEngine.camera.front = self.yaw_vector
function LocalPlayer:set_yaw(yaw)
self.yaw = math.rad(yaw)
self:update_look()
end
function LocalPlayer:set_pitch(degrees)
local radians = math.rad(degrees)
self.pitch_vector = glm.vec3(0, 1, 0)
RenderEngine.camera.up = self.pitch_vector
function LocalPlayer:set_pitch(pitch)
self.pitch = math.rad(pitch)
self:update_look()
end
function LocalPlayer:update_look()
self.horizontal_look = glm.vec3(math.sin(self.yaw), 0, math.cos(self.yaw)):normalize()
RenderEngine.camera.front = glm.vec3(math.sin(self.yaw or 0), math.sin(self.pitch or 0), math.cos(self.yaw or 0)):normalize()
end
return LocalPlayer

View File

@ -33,8 +33,8 @@ function RenderEngine:render_loop()
until glfw.window_should_close(self.window)
end
function RenderEngine:update_projection_matrix(width, height)
gl.uniform_matrix4f(gl.get_uniform_location(self.shaders, "projection"), true, glm.perspective(math.rad(self.fov), width / height, 0.1, 100))
function RenderEngine:update_projection_matrix()
gl.uniform_matrix4f(gl.get_uniform_location(self.shaders, "projection"), true, glm.perspective(math.rad(self.fov), self.window_width / self.window_height, 0.1, 100))
end
function RenderEngine:update_view_matrix()

View File

@ -2,6 +2,11 @@ RenderEngine.listen_keys = {}
Dragonblocks.create_event_interface(RenderEngine)
function RenderEngine:process_input(dtime)
self:process_key_input(dtime)
self:process_mouse_input(dtime)
end
function RenderEngine:process_key_input(dtime)
local keys_pressed = {}
local was_key_pressed = false
for key in pairs(self.listen_keys) do
@ -19,6 +24,19 @@ function RenderEngine:process_input(dtime)
end
end
function RenderEngine:process_mouse_input(dtime)
local dx, dy = self.cursor_delta_x or 0, self.cursor_delta_y or 0
if math.abs(dx) > 0 or math.abs(dy) > 0 then
self:fire_event({
type = "mousemove",
dtime = dtime,
x = dx * self.mouse_sensitivity,
y = dy * self.mouse_sensitivity,
})
end
self.cursor_delta_x, self.cursor_delta_y = 0, 0
end
function RenderEngine:add_listen_key(key)
self.listen_keys[key] = true
end

View File

@ -1,6 +1,13 @@
function RenderEngine:framebuffer_size_callback(_, width, height)
gl.viewport(0, 0, width, height)
self:update_projection_matrix(width, height)
self.window_width, self.window_height = width, height
self:update_projection_matrix()
end
function RenderEngine:cursor_pos_callback(_, x, y)
local last_x, last_y = self.cursor_x or x, self.cursor_y or y
self.cursor_delta_x, self.cursor_delta_y = x - last_x, y - last_y
self.cursor_x, self.cursor_y = x, y
end
function RenderEngine:init_glfw()
@ -12,7 +19,9 @@ end
function RenderEngine:create_window()
self.window = glfw.create_window(500, 500, "Unnamed Window")
glfw.make_context_current(self.window)
glfw.set_input_mode(self.window, "cursor", "disabled")
glfw.set_framebuffer_size_callback(self.window, function (...) self:framebuffer_size_callback(...) end)
glfw.set_cursor_pos_callback(self.window, function (...) self:cursor_pos_callback(...) end)
end
function RenderEngine:set_window_title(title)