diff --git a/core/Input.cpp b/core/Input.cpp index 4e2756e..0f2b368 100644 --- a/core/Input.cpp +++ b/core/Input.cpp @@ -7,12 +7,16 @@ Input *Input::instance = nullptr; Input *Input::GetInstance() { if (!instance) { instance = new Input(); + instance->lastx = 0.0; + instance->lasty = 0.0; } return instance; } void Input::Use(Window *window){ + glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); glfwSetKeyCallback(window, (GLFWkeyfun)HandleKeys); + glfwSetCursorPosCallback(window, (GLFWcursorposfun)HandleMousePosition); } void Input::HandleKeys(Window *window, int keys, int code, int action, int mods) { @@ -26,3 +30,19 @@ void Input::HandleKeys(Window *window, int keys, int code, int action, int mods) lua_call(L, 4, 0); #endif // LUA_SCRIPTING } + +void Input::HandleMousePosition(Window *window, double xpos, double ypos) { + double relx = xpos - instance->lastx; + double rely = ypos - instance->lasty; +#ifdef LUA_SCRIPTING + lua_State *L = (lua_State*) glfwGetWindowUserPointer(window); + lua_getglobal(L, "onmousemotion"); + lua_pushnumber(L, xpos); + lua_pushnumber(L, ypos); + lua_pushnumber(L, relx); + lua_pushnumber(L, rely); + lua_call(L, 4, 0); +#endif // LUA_SCRIPTING + instance->lastx = xpos; + instance->lasty = ypos; +} diff --git a/core/Input.h b/core/Input.h index d5459bd..987890c 100644 --- a/core/Input.h +++ b/core/Input.h @@ -16,7 +16,9 @@ public: static Input *GetInstance(); void Use(Window *window); private: + double lastx, lasty; Input(); static void HandleKeys(Window *window, int key, int code, int action, int mods); + static void HandleMousePosition(Window *window, double xpos, double ypos); static Input *instance; }; diff --git a/main.lua b/main.lua index 3013461..d6079cf 100644 --- a/main.lua +++ b/main.lua @@ -13,6 +13,7 @@ local vz = 0.0 local ballvy = -1.0 local cam_rot_x = 0.0 +local cam_rot_y = 0.0 function init() camera = couch.Camera() @@ -30,7 +31,10 @@ end function update(delta) camera.transform:Translate(vx * delta, 0.0, vz * delta) - camera.transform.rotation.y = camera.transform.rotation.y + cam_rot_x * delta + camera.transform.rotation.y = camera.transform.rotation.y - cam_rot_x * delta + cam_rot_x = 0.0 + camera.transform.rotation.x = camera.transform.rotation.x - cam_rot_y * delta + cam_rot_y = 0.0 local loc = ball1.transform.position if loc.y > 4.0 then @@ -46,7 +50,6 @@ function update(delta) end function onkey(key, code, action, mod) - print(key, code, action, mod) if key == LEFT and action == 1 then vx = -1.0 elseif key == RIGHT and action == 1 then @@ -71,3 +74,8 @@ function onkey(key, code, action, mod) end end end + +function onmousemotion(_, _, relx, rely) + cam_rot_x = relx + cam_rot_y = rely +end