summaryrefslogtreecommitdiff
path: root/demo/FPSCamera.lua
diff options
context:
space:
mode:
Diffstat (limited to 'demo/FPSCamera.lua')
-rw-r--r--demo/FPSCamera.lua94
1 files changed, 94 insertions, 0 deletions
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