From: Elias Fleckenstein Date: Tue, 11 Aug 2020 11:54:12 +0000 (+0200) Subject: Yaw & Pitch bound to mouse input X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=0a25ed9a036858358367e85a86a5b3603b3015fb;p=dragonblocks3d-lua.git Yaw & Pitch bound to mouse input --- diff --git a/modules/Client/src/graphics.lua b/modules/Client/src/graphics.lua index c637cce..f4adc2a 100644 --- a/modules/Client/src/graphics.lua +++ b/modules/Client/src/graphics.lua @@ -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 diff --git a/modules/PlayerSystem/src/localplayer.lua b/modules/PlayerSystem/src/localplayer.lua index d77811e..8734541 100644 --- a/modules/PlayerSystem/src/localplayer.lua +++ b/modules/PlayerSystem/src/localplayer.lua @@ -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(pitch) + self.pitch = math.rad(pitch) + 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: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 diff --git a/modules/RenderEngine/src/init.lua b/modules/RenderEngine/src/init.lua index ceabab9..b0c8b89 100644 --- a/modules/RenderEngine/src/init.lua +++ b/modules/RenderEngine/src/init.lua @@ -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() diff --git a/modules/RenderEngine/src/inputhandler.lua b/modules/RenderEngine/src/inputhandler.lua index 4312dd1..54707f8 100644 --- a/modules/RenderEngine/src/inputhandler.lua +++ b/modules/RenderEngine/src/inputhandler.lua @@ -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 diff --git a/modules/RenderEngine/src/window.lua b/modules/RenderEngine/src/window.lua index 6d3ce04..6a37c5c 100644 --- a/modules/RenderEngine/src/window.lua +++ b/modules/RenderEngine/src/window.lua @@ -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)