]> git.lizzy.rs Git - dragonblocks3d-lua.git/commitdiff
Added Movement
authorElias Fleckenstein <eliasfleckenstein@web.de>
Tue, 11 Aug 2020 10:51:26 +0000 (12:51 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Tue, 11 Aug 2020 10:51:26 +0000 (12:51 +0200)
modules/Client/src/graphics.lua
modules/Client/src/init.lua
modules/PlayerSystem/src/localplayer.lua
modules/PlayerSystem/src/player.lua
modules/RenderEngine/src/camera.lua
modules/RenderEngine/src/init.lua
modules/RenderEngine/src/inputhandler.lua [new file with mode: 0644]
modules/RenderEngine/src/window.lua
src/events.lua

index 1dc1e42a0b0c463ca12f057a7ebbd5aa730b7c03..c637cce17368977e1da4e61c6de99c36f3ed2fa6 100644 (file)
@@ -5,7 +5,6 @@ function graphics:init()
        
        RenderEngine.bininear_filter = false
        RenderEngine.mipmap = false
-       RenderEngine.camera_pos = glm.vec3(-8, -18, -40)
        RenderEngine.fov = 45
        RenderEngine.mesh_effect_grow_time = 0.25
        RenderEngine.mesh_effect_flyin_time = 1
index 0dbaa464072eb34fd6f7c21d198ff021bb5ea3ab..728f6ec1462c6660a899c644ef762086d6379a42 100644 (file)
@@ -1,7 +1,11 @@
 Client.graphics = Client:run("graphics")
 
 Client.graphics:init()
+PlayerSystem:init("client")
 
 Client.map = WorldSystem.Map()
+Client.player = PlayerSystem.LocalPlayer()
+
+Client.player:set_position(glm.vec3(8, 18, 40))
 
 RenderEngine:render_loop()
index 18465e13e0ed835c739ec55644aed29d40326ace..d77811e84281d2e1b0e60e34654776799ea571a4 100644 (file)
@@ -3,12 +3,44 @@ table.assign(LocalPlayer, PlayerSystem.Player)
 
 function LocalPlayer:constructor()
        self:init()
+       self:set_speed(4)
        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_listen_key("w")
+       RenderEngine:add_listen_key("a")
+       RenderEngine:add_listen_key("s")
+       RenderEngine:add_listen_key("d")
+       RenderEngine:add_listen_key("space")
+       RenderEngine:add_listen_key("left shift")
+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)
+       if keys["w"] then
+               self:move( speed * yawvec)
+       elseif keys["s"] then
+               self:move(-speed * yawvec)
+       end
+       if keys["a"] then
+               self:move(-speed * (yawvec % pitchvec):normalize())
+       elseif keys["d"] then
+               self:move( speed * (yawvec % pitchvec):normalize())
+       end
+       if keys["left shift"] then
+               self:move(-speed * vertvec)
+       elseif keys["space"] then
+               self:move( speed * vertvec)
+       end
 end
 
 function LocalPlayer:set_position_callback(event)
-       -- Move Camera & Report to Server
+       RenderEngine.camera.pos = self.pos
 end
 
 function LocalPlayer:move(vec)
@@ -20,4 +52,16 @@ 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
+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
+end
+
 return LocalPlayer
index 4bf03b9cf2780a309e2cca75777c3c7b73917818..c4077edcf1cd7203ca7e2a1b5738deac18e9df1c 100644 (file)
@@ -23,6 +23,8 @@ function Player:raw_set_position(event)
        })
 end
 
-
+function Player:set_speed(speed)
+       self.speed = speed
+end
 
 return Player
index 8d1c8b69c3fce7bea45c73efd06983e3c419a92f..c3236f7e2122443cee303b507c73862065c6b87b 100644 (file)
@@ -1 +1,11 @@
+local camera = {
+       pos = glm.vec3(0, 0, 0),
+       front = glm.vec3(1, 0, 0),
+       up = glm.vec3(0, 1, 0),
+}
+
+function camera:get_view_matrix()
+       return glm.look_at(self.pos, self.pos + self.front, self.up)
+end
+
+return camera
index 1d6d888b58f48bbad74ccdf540fa9d6f1b8f6ab4..ceabab96debb1510c6dc0f028b5cfe0ccf1b0976 100644 (file)
@@ -1,9 +1,10 @@
-RenderEngine:run("camera")
+RenderEngine:run("inputhandler")
 RenderEngine:run("shaders")
 RenderEngine:run("textures")
 RenderEngine:run("window")
 
 RenderEngine.Mesh = RenderEngine:run("mesh")
+RenderEngine.camera = RenderEngine:run("camera")
 
 function RenderEngine:init()
        self:init_glfw()
@@ -20,7 +21,7 @@ end
 
 function RenderEngine:add_render_task()
        Dragonblocks:add_task(function()
-
+               self:render_loop()
        end)
 end
 
@@ -32,21 +33,27 @@ 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))
+end
+
+function RenderEngine:update_view_matrix()
+       gl.uniform_matrix4f(gl.get_uniform_location(self.shaders, "view"), true, self.camera:get_view_matrix())
+end
+
 function RenderEngine:render()
        local dtime = glfw.get_time() - self.last_time
        self.last_time = glfw.get_time()
        
+       self:process_input(dtime)
+       
        gl.clear_color(self.sky)
        gl.enable("depth test")
        gl.clear("color", "depth")
        
-       gl.use_program(self.shaders)
+       gl.use_program(self.shaders)    
        
-       local view_matrix = glm.translate(self.camera_pos)
-       local projection_matrix = glm.perspective(math.rad(self.fov), self.window_width / self.window_height, 0.1, 100) 
-       
-       gl.uniform_matrix4f(self.projection_matix_location, true, projection_matrix)
-       gl.uniform_matrix4f(self.view_matix_location, true, view_matrix)
+       RenderEngine:update_view_matrix()
        
        for _, mesh in ipairs(self.Mesh.list) do
                mesh:render(dtime)
@@ -56,20 +63,6 @@ function RenderEngine:render()
        glfw.poll_events()
 end
 
-
---[[
-function RenderEngine:clear_removed_meshes()
-       local remove_indices = {} 
-       for index, mesh in pairs(self.meshes) do
-               if mesh.removed then
-                       table.insert(remove_indices, index)
-               end
-       end
-       for i, index in pairs(remove_indices)
-               table.remove(self.meshes, index - i + 1)
-       end
-end
-]]--
 function RenderEngine:set_sky(htmlcolor)
        local r, g, b = hex2rgb(htmlcolor)
        self.sky = {r, g, b, 1.0}
diff --git a/modules/RenderEngine/src/inputhandler.lua b/modules/RenderEngine/src/inputhandler.lua
new file mode 100644 (file)
index 0000000..4312dd1
--- /dev/null
@@ -0,0 +1,28 @@
+RenderEngine.listen_keys = {}
+Dragonblocks.create_event_interface(RenderEngine)
+
+function RenderEngine:process_input(dtime)
+       local keys_pressed = {}
+       local was_key_pressed = false
+       for key in pairs(self.listen_keys) do
+               if glfw.get_key(self.window, key) == "press" then
+                       keys_pressed[key] = true
+                       was_key_pressed = true
+               end
+       end
+       if was_key_pressed then
+               self:fire_event({
+                       type = "keypress",
+                       keys = keys_pressed,
+                       dtime = dtime
+               })
+       end
+end
+
+function RenderEngine:add_listen_key(key)
+       self.listen_keys[key] = true
+end
+
+function RenderEngine:remove_listen_key(key)
+       self.listen_keys[key] = nil
+end
index 88bfc9c0f6b0f8ff0a218546a0101a34a86e9f5b..6d3ce04d5857127e0afb3293179cdc2b8b5c863d 100644 (file)
@@ -1,6 +1,6 @@
 function RenderEngine:framebuffer_size_callback(_, width, height)
        gl.viewport(0, 0, width, height)
-       self:update_window_size(width, height)
+       self:update_projection_matrix(width, height)
 end
 
 function RenderEngine:init_glfw()
@@ -12,7 +12,6 @@ end
 function RenderEngine:create_window()
        self.window = glfw.create_window(500, 500, "Unnamed Window")
        glfw.make_context_current(self.window)
-       self:update_window_size()
        glfw.set_framebuffer_size_callback(self.window, function (...) self:framebuffer_size_callback(...) end) 
 end
 
@@ -26,9 +25,4 @@ end
 
 function RenderEngine:set_window_size(width, height)
        glfw.set_window_size(self.window, width, height)
-       self:update_window_size(width, height)
-end
-
-function RenderEngine:update_window_size(width, height)
-       self.window_width, self.window_height = width, height
 end
index 312a9b3388fcbf76bb7c6d46cf417c9466b25f29..ce7fbbb414f13858e126ef716f2dbceceb196e78 100644 (file)
@@ -3,7 +3,7 @@ local events = {}
 function events:fire_event(event, callback)
        event = event or {}
        event.origin = self
-       local listeners = self._event_listeners[eventtype]
+       local listeners = self.event_listeners[event.type]
        if listeners and #listeners > 0 then
                for _, listener in ipairs(listeners) do
                        listener(event)
@@ -15,12 +15,12 @@ function events:fire_event(event, callback)
 end
 
 function events:add_event_listener(eventtype, eventlistener)
-       self._event_listeners[eventtype] = self._event_listeners[eventtype] or {}
-       table.insert(self._event_listeners[eventtype], eventlistener)
+       self.event_listeners[eventtype] = self.event_listeners[eventtype] or {}
+       table.insert(self.event_listeners[eventtype], eventlistener)
 end
        
 function events:remove_event_listener(eventtype, eventlistener)
-       local listeners = self._event_listeners[eventtype]
+       local listeners = self.event_listeners[eventtype]
        if listeners then
                for k, listener in ipairs(listeners) do
                        if listener == eventlistener then
@@ -32,7 +32,7 @@ function events:remove_event_listener(eventtype, eventlistener)
 end
 
 function events:clear_event_listeners()
-       self._event_listeners = {}
+       self.event_listeners = {}
 end
 
 function Dragonblocks:create_event_interface()