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
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")
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
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
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()
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
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
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()
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)