From f0a6a17e4fba3510c8ba8f6b114012873035a4a1 Mon Sep 17 00:00:00 2001 From: sanine-a Date: Tue, 27 Oct 2020 23:23:22 -0500 Subject: fix minor bugs, add cube primitive binding, and implement basic first-person camera --- demo/FPSCamera.lua | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 demo/FPSCamera.lua (limited to 'demo/FPSCamera.lua') diff --git a/demo/FPSCamera.lua b/demo/FPSCamera.lua new file mode 100644 index 0000000..6b4e4f9 --- /dev/null +++ b/demo/FPSCamera.lua @@ -0,0 +1,94 @@ +local Vec3, Vec4 = require('Vector')() +local Mat3, Mat4 = require('Matrix')() + +local Basis = function(M) + local m = Mat3.new() + honey.cglm.mat4.pick3(M, m) + + local x0 = honey.cglm.get_value(m, Mat3.index(1,1)) + local x1 = honey.cglm.get_value(m, Mat3.index(2,1)) + local x2 = honey.cglm.get_value(m, Mat3.index(3,1)) + + local y0 = honey.cglm.get_value(m, Mat3.index(1,2)) + local y1 = honey.cglm.get_value(m, Mat3.index(2,2)) + local y2 = honey.cglm.get_value(m, Mat3.index(3,2)) + + local z0 = honey.cglm.get_value(m, Mat3.index(1,3)) + local z1 = honey.cglm.get_value(m, Mat3.index(2,3)) + local z2 = honey.cglm.get_value(m, Mat3.index(3,3)) + + local b = {} + b.x = Vec3.new{x0, x1, x2} + b.y = Vec3.new{y0, y1, y2} + b.z = Vec3.new{z0, z1, z2} + + return b +end + +local camera = {} + +camera.pitch = 0 +camera.yaw = 0 + +camera.sensitivity = 0.1 + +camera.movement_speed = 1 + +camera.position = Vec3.new{0,0,-1} + +camera.view = Mat4.new() +honey.cglm.mat4.identity(camera.view) + +camera.basis = Basis(camera.view) + +camera.projection = Mat4.new() +honey.cglm.camera.perspective( + camera.projection, + math.rad(90), + 640/480, + 0.1, + 8192) + +function camera:update() + local M = Mat4.new() + honey.cglm.mat4.identity(M) + honey.cglm.affine.rotate(M, Vec3.ZERO, self.basis.x, math.rad(self.pitch)) + honey.cglm.affine.rotate(M, Vec3.ZERO, Vec3.Y_UNIT, math.rad(self.yaw)) + self.basis = Basis(M) + + movement = Vec3.new() + if honey.input.key.is_down(honey.input.key.w) then honey.cglm.vec3.add(movement, self.basis.z, movement) end + if honey.input.key.is_down(honey.input.key.a) then honey.cglm.vec3.add(movement, self.basis.x, movement) end + if honey.input.key.is_down(honey.input.key.s) then honey.cglm.vec3.sub(movement, self.basis.z, movement) end + if honey.input.key.is_down(honey.input.key.d) then honey.cglm.vec3.sub(movement, self.basis.x, movement) end + + honey.cglm.set_value(movement, 1, 0) + honey.cglm.vec3.normalize(movement) + honey.cglm.vec3.muls(self.movement_speed, movement, movement) + honey.cglm.vec3.add(self.position, movement, self.position) + + honey.cglm.camera.look(self.position, self.basis.z, Vec3.Y_UNIT, self.view) +end + +camera.mouse_pos = {} +camera.mouse_pos.x = 0 +camera.mouse_pos.y = 0 + +honey.input.mouse.bind_movement( + function(xpos, ypos) + local dx = xpos - camera.mouse_pos.x + local dy = ypos - camera.mouse_pos.y + + camera.mouse_pos = { x=xpos, y=ypos } + + camera.pitch = camera.pitch + camera.sensitivity * dy + camera.yaw = camera.yaw - camera.sensitivity * dx + + if camera.pitch > 89 then camera.pitch = 89 end + if camera.pitch < -89 then camera.pitch = -89 end + end +) + +honey.input.mouse.set_mode(honey.input.mouse.mode.disabled) + +return camera -- cgit v1.2.1