]> git.lizzy.rs Git - dragonblocks3d-lua.git/commitdiff
Yaw & Pitch bound to mouse input
authorElias Fleckenstein <eliasfleckenstein@web.de>
Tue, 11 Aug 2020 11:54:12 +0000 (13:54 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Tue, 11 Aug 2020 11:54:12 +0000 (13:54 +0200)
modules/Client/src/graphics.lua
modules/PlayerSystem/src/localplayer.lua
modules/RenderEngine/src/init.lua
modules/RenderEngine/src/inputhandler.lua
modules/RenderEngine/src/window.lua

index c637cce17368977e1da4e61c6de99c36f3ed2fa6..f4adc2a786c467817fd89695d3ba69ba85db63b2 100644 (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
index d77811e84281d2e1b0e60e34654776799ea571a4..873454190af275708be3abb054d2aafa9fa5dab4 100644 (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(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
index ceabab96debb1510c6dc0f028b5cfe0ccf1b0976..b0c8b89c3317e1c2176ba9c7fe4b36ae538b5fcc 100644 (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()
index 4312dd16cda87abd85617e721dc1184256f8fe3a..54707f8a190fb3d37f7578b3f335f4eea8910a6f 100644 (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
index 6d3ce04d5857127e0afb3293179cdc2b8b5c863d..6a37c5c138b0fbd478130d3d5267eb1641ae4ca2 100644 (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)