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
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()
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)
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
})
end
-
+function Player:set_speed(speed)
+ self.speed = speed
+end
return Player
-
+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
-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()
function RenderEngine:add_render_task()
Dragonblocks:add_task(function()
-
+ self:render_loop()
end)
end
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)
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}
--- /dev/null
+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
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()
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
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
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)
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
end
function events:clear_event_listeners()
- self._event_listeners = {}
+ self.event_listeners = {}
end
function Dragonblocks:create_event_interface()