diff --git a/engine/xe_engine.cpp b/engine/xe_engine.cpp index e137d11..0ba7df5 100644 --- a/engine/xe_engine.cpp +++ b/engine/xe_engine.cpp @@ -1,17 +1,13 @@ #include "xe_engine.hpp" -#include "xe_image.hpp" - -#include -#include -#include -#include namespace xe { -XeEngine::XeEngine(int width, int height, std::string name) : xeWindow{width, height, name}, +XeEngine::XeEngine(int width, int height, std::string name) +: xeWindow{width, height, name}, xeDevice{xeWindow}, xeRenderer{xeWindow, xeDevice}, - xeCamera{} { + xeCamera{}, + xeInput{xeWindow} { loadDescriptorPool(); alutInit(0, NULL); std::cout << "Audio device: " << alcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER) << "\n"; diff --git a/engine/xe_engine.hpp b/engine/xe_engine.hpp index d86c6a9..422f4c8 100644 --- a/engine/xe_engine.hpp +++ b/engine/xe_engine.hpp @@ -1,14 +1,19 @@ #pragma once -#include "xe_window.hpp" #include "xe_device.hpp" #include "xe_renderer.hpp" #include "xe_camera.hpp" #include "xe_descriptors.hpp" #include "xe_image.hpp" +#include "xe_input.hpp" +#include "xe_sound.hpp" #include #include +#include +#include +#include + namespace xe { class XeEngine { @@ -22,7 +27,7 @@ class XeEngine { XeEngine(const XeEngine&) = delete; XeEngine operator=(const XeEngine&) = delete; - XeWindow& getWindow() {return xeWindow;} + XeInput& getInput() {return xeInput;} XeCamera& getCamera() {return xeCamera;} std::shared_ptr loadModelFromFile(const std::string &filename); @@ -44,6 +49,7 @@ class XeEngine { XeDevice xeDevice; XeRenderer xeRenderer; XeCamera xeCamera; + XeInput xeInput; std::chrono::_V2::system_clock::time_point currentTime; float frameTime; diff --git a/engine/xe_input.cpp b/engine/xe_input.cpp new file mode 100644 index 0000000..91b9cab --- /dev/null +++ b/engine/xe_input.cpp @@ -0,0 +1,46 @@ +#include "xe_input.hpp" + +#include + +namespace xe { + +static XeInput* _instance; + +XeInput::XeInput(XeWindow& window) : window{window} { + glfwSetKeyCallback(window.getGLFWwindow(), XeInput::key_callback); + glfwSetMouseButtonCallback(window.getGLFWwindow(), XeInput::mouse_callback); + _instance = this; +} + +bool XeInput::isKeyPressed(int key) { + return glfwGetKey(window.getGLFWwindow(), key) == GLFW_PRESS; +} + +bool XeInput::wasKeyPressed(int key) { + if(_pressed[key] == true) { + _pressed[key] = false; + return true; + } + return false; +} + +bool XeInput::wasKeyReleased(int key) { + if(_released[key] == true) { + _released[key] = false; + return true; + } + return false; +} + +void XeInput::key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) { + if(action == GLFW_PRESS) _instance->_pressed[key] = true; + if(action == GLFW_RELEASE) _instance->_released[key] = true; +} + +void XeInput::mouse_callback(GLFWwindow* window, int key, int action, int mods) { + if(action == GLFW_PRESS) _instance->_pressed[key] = true; + if(action == GLFW_RELEASE) _instance->_released[key] = true; +} + + +} \ No newline at end of file diff --git a/engine/xe_input.hpp b/engine/xe_input.hpp new file mode 100644 index 0000000..4465b4e --- /dev/null +++ b/engine/xe_input.hpp @@ -0,0 +1,167 @@ +#pragma once + +#include "xe_window.hpp" + +#include +#include + +#include + +namespace xe { + +class XeInput { + + public: + + bool isKeyPressed(int key); + bool wasKeyPressed(int key); + bool wasKeyReleased(int key); + + private: + + XeInput(XeWindow& window); + ~XeInput() {}; + + void setIsKeyDown(int key, bool isDown); + + std::map _pressed; + std::map _released; + XeWindow &window; + + static void key_callback( + GLFWwindow* window, int key, int scancode, int action, int mods); + + static void mouse_callback( + GLFWwindow* window, int key, int action, int mods); + + friend class XeEngine; +}; + +} + +#define KEY_SPACE 32 +#define KEY_APOSTROPHE 39 /* ' */ +#define KEY_COMMA 44 /* , */ +#define KEY_MINUS 45 /* - */ +#define KEY_PERIOD 46 /* . */ +#define KEY_SLASH 47 /* / */ +#define KEY_0 48 +#define KEY_1 49 +#define KEY_2 50 +#define KEY_3 51 +#define KEY_4 52 +#define KEY_5 53 +#define KEY_6 54 +#define KEY_7 55 +#define KEY_8 56 +#define KEY_9 57 +#define KEY_SEMICOLON 59 /* ; */ +#define KEY_EQUAL 61 /* = */ +#define KEY_A 65 +#define KEY_B 66 +#define KEY_C 67 +#define KEY_D 68 +#define KEY_E 69 +#define KEY_F 70 +#define KEY_G 71 +#define KEY_H 72 +#define KEY_I 73 +#define KEY_J 74 +#define KEY_K 75 +#define KEY_L 76 +#define KEY_M 77 +#define KEY_N 78 +#define KEY_O 79 +#define KEY_P 80 +#define KEY_Q 81 +#define KEY_R 82 +#define KEY_S 83 +#define KEY_T 84 +#define KEY_U 85 +#define KEY_V 86 +#define KEY_W 87 +#define KEY_X 88 +#define KEY_Y 89 +#define KEY_Z 90 +#define KEY_LEFT_BRACKET 91 /* [ */ +#define KEY_BACKSLASH 92 /* \ */ +#define KEY_RIGHT_BRACKET 93 /* ] */ +#define KEY_GRAVE_ACCENT 96 /* ` */ +#define KEY_WORLD_1 161 /* non-US #1 */ +#define KEY_WORLD_2 162 /* non-US #2 */ + +/* Function keys */ +#define KEY_ESCAPE 256 +#define KEY_ENTER 257 +#define KEY_TAB 258 +#define KEY_BACKSPACE 259 +#define KEY_INSERT 260 +#define KEY_DELETE 261 +#define KEY_RIGHT 262 +#define KEY_LEFT 263 +#define KEY_DOWN 264 +#define KEY_UP 265 +#define KEY_PAGE_UP 266 +#define KEY_PAGE_DOWN 267 +#define KEY_HOME 268 +#define KEY_END 269 +#define KEY_CAPS_LOCK 280 +#define KEY_SCROLL_LOCK 281 +#define KEY_NUM_LOCK 282 +#define KEY_PRINT_SCREEN 283 +#define KEY_PAUSE 284 +#define KEY_F1 290 +#define KEY_F2 291 +#define KEY_F3 292 +#define KEY_F4 293 +#define KEY_F5 294 +#define KEY_F6 295 +#define KEY_F7 296 +#define KEY_F8 297 +#define KEY_F9 298 +#define KEY_F10 299 +#define KEY_F11 300 +#define KEY_F12 301 +#define KEY_F13 302 +#define KEY_F14 303 +#define KEY_F15 304 +#define KEY_F16 305 +#define KEY_F17 306 +#define KEY_F18 307 +#define KEY_F19 308 +#define KEY_F20 309 +#define KEY_F21 310 +#define KEY_F22 311 +#define KEY_F23 312 +#define KEY_F24 313 +#define KEY_F25 314 +#define KEY_KP_0 320 +#define KEY_KP_1 321 +#define KEY_KP_2 322 +#define KEY_KP_3 323 +#define KEY_KP_4 324 +#define KEY_KP_5 325 +#define KEY_KP_6 326 +#define KEY_KP_7 327 +#define KEY_KP_8 328 +#define KEY_KP_9 329 +#define KEY_KP_DECIMAL 330 +#define KEY_KP_DIVIDE 331 +#define KEY_KP_MULTIPLY 332 +#define KEY_KP_SUBTRACT 333 +#define KEY_KP_ADD 334 +#define KEY_KP_ENTER 335 +#define KEY_KP_EQUAL 336 +#define KEY_LEFT_SHIFT 340 +#define KEY_LEFT_CONTROL 341 +#define KEY_LEFT_ALT 342 +#define KEY_LEFT_SUPER 343 +#define KEY_RIGHT_SHIFT 344 +#define KEY_RIGHT_CONTROL 345 +#define KEY_RIGHT_ALT 346 +#define KEY_RIGHT_SUPER 347 +#define KEY_MENU 348 + +#define MOUSE_BUTTON_ONE 0 +#define MOUSE_BUTTON_TWO 1 +#define MOUSE_BUTTON_THREE 2 \ No newline at end of file diff --git a/engine/xe_pipeline.cpp b/engine/xe_pipeline.cpp index d06d09b..e9fd4d1 100755 --- a/engine/xe_pipeline.cpp +++ b/engine/xe_pipeline.cpp @@ -1,7 +1,5 @@ #include "xe_pipeline.hpp" -#include "xe_model.hpp" - #include #include #include diff --git a/engine/xe_pipeline.hpp b/engine/xe_pipeline.hpp index 06bcf0f..5e2e1fb 100755 --- a/engine/xe_pipeline.hpp +++ b/engine/xe_pipeline.hpp @@ -1,6 +1,7 @@ #pragma once #include "xe_device.hpp" +#include "xe_model.hpp" #include #include diff --git a/engine/xe_render_system.cpp b/engine/xe_render_system.cpp index 1e638ad..e5954c7 100644 --- a/engine/xe_render_system.cpp +++ b/engine/xe_render_system.cpp @@ -1,19 +1,5 @@ #include "xe_render_system.hpp" -#include -#include "xe_device.hpp" -#include "xe_pipeline.hpp" -#include "xe_game_object.hpp" -#include "xe_swap_chain.hpp" -#include "xe_renderer.hpp" -#include "xe_descriptors.hpp" -#include "xe_engine.hpp" - -#include -#include - -#include - namespace xe { XeRenderSystem::XeRenderSystem( diff --git a/engine/xe_render_system.hpp b/engine/xe_render_system.hpp index a8b4145..098727c 100644 --- a/engine/xe_render_system.hpp +++ b/engine/xe_render_system.hpp @@ -1,15 +1,17 @@ #pragma once -#include #include "xe_device.hpp" #include "xe_pipeline.hpp" #include "xe_game_object.hpp" -#include "xe_descriptors.hpp" +#include "xe_swap_chain.hpp" #include "xe_renderer.hpp" +#include "xe_descriptors.hpp" #include "xe_engine.hpp" -#include "xe_image.hpp" +#include #include +#include +#include #include namespace xe { diff --git a/engine/xe_renderer.cpp b/engine/xe_renderer.cpp index 1714e46..5d901b0 100644 --- a/engine/xe_renderer.cpp +++ b/engine/xe_renderer.cpp @@ -1,17 +1,5 @@ #include "xe_renderer.hpp" -#include "xe_device.hpp" -#include "xe_game_object.hpp" -#include "xe_swap_chain.hpp" -#include "xe_descriptors.hpp" -#include "xe_window.hpp" -#include -#include - -#include -#include -#include - namespace xe { XeRenderer::XeRenderer(XeWindow& window, XeDevice& device) : xeWindow{window}, xeDevice{device} { diff --git a/engine/xe_renderer.hpp b/engine/xe_renderer.hpp index 321a4e3..994b157 100644 --- a/engine/xe_renderer.hpp +++ b/engine/xe_renderer.hpp @@ -1,13 +1,16 @@ #pragma once -#include "xe_swap_chain.hpp" -#include "xe_window.hpp" #include "xe_device.hpp" -#include "xe_model.hpp" +#include "xe_game_object.hpp" +#include "xe_swap_chain.hpp" +#include "xe_descriptors.hpp" +#include "xe_window.hpp" -#include -#include +#include #include +#include +#include +#include namespace xe { class XeRenderer { diff --git a/engine/xe_sound.cpp b/engine/xe_sound.cpp index 07d8e7b..bd21885 100644 --- a/engine/xe_sound.cpp +++ b/engine/xe_sound.cpp @@ -1,9 +1,5 @@ #include "xe_sound.hpp" -#include -#include -#include - namespace xe { XeSound::XeSound(const std::string& filename) { diff --git a/engine/xe_sound.hpp b/engine/xe_sound.hpp index b2a7a14..4a50839 100644 --- a/engine/xe_sound.hpp +++ b/engine/xe_sound.hpp @@ -4,6 +4,9 @@ #include #include #include +#include +#include +#include #define GLM_FORCE_RADIANS #define GLM_FORCE_DEPTH_ZERO_TO_ONE diff --git a/engine/xe_swap_chain.cpp b/engine/xe_swap_chain.cpp index c7a0345..79da771 100755 --- a/engine/xe_swap_chain.cpp +++ b/engine/xe_swap_chain.cpp @@ -1,14 +1,5 @@ #include "xe_swap_chain.hpp" -#include -#include -#include -#include -#include -#include -#include -#include - namespace xe { bool XeSwapChain::initialSwapChainCreated = false; diff --git a/engine/xe_swap_chain.hpp b/engine/xe_swap_chain.hpp index a15a5a0..bf07be4 100755 --- a/engine/xe_swap_chain.hpp +++ b/engine/xe_swap_chain.hpp @@ -4,10 +4,14 @@ #include +#include +#include +#include +#include +#include #include -#include -#include -#include +#include +#include namespace xe { diff --git a/engine/xe_window.cpp b/engine/xe_window.cpp index 2721279..ee19b92 100755 --- a/engine/xe_window.cpp +++ b/engine/xe_window.cpp @@ -1,8 +1,4 @@ #include "xe_window.hpp" -#include -#include - -#include namespace xe { diff --git a/engine/xe_window.hpp b/engine/xe_window.hpp index bf80bd7..02f3e3d 100755 --- a/engine/xe_window.hpp +++ b/engine/xe_window.hpp @@ -2,9 +2,12 @@ #include #define GLFW_INCLUDE_VULKAN -#include +#include +#include +#include #include + namespace xe { class XeWindow { @@ -33,6 +36,7 @@ class XeWindow { std::string windowName; GLFWwindow *window; + }; } \ No newline at end of file diff --git a/lib/openal b/lib/openal new file mode 160000 index 0000000..c52df6d --- /dev/null +++ b/lib/openal @@ -0,0 +1 @@ +Subproject commit c52df6d78ab7131a543326cd2257f267036754e1 diff --git a/src/first_app.cpp b/src/first_app.cpp index 423012a..5d8fcf1 100755 --- a/src/first_app.cpp +++ b/src/first_app.cpp @@ -1,22 +1,5 @@ #include "first_app.hpp" -#include "xe_camera.hpp" -#include "xe_engine.hpp" -#include "xe_game_object.hpp" -#include "xe_model.hpp" -#include "xe_render_system.hpp" -#include "keyboard_movement_controller.hpp" -#include "simple_renderer.hpp" -#include "xe_sound.hpp" - -#define GLM_FORCE_RADIANS -#define GLM_FORCE_DEPTH_ZERO_TO_ONE -#include -#include -#include - -#include - namespace app { FirstApp::FirstApp() : xeEngine{WIDTH, HEIGHT, "Xenon Vulkan Engine"} { @@ -45,7 +28,7 @@ void FirstApp::run() { float frameTime = xeEngine.getFrameTime(); - cameraController.moveInPlaneXZ(xeEngine.getWindow().getGLFWwindow(), frameTime, viewerObject); + cameraController.update(xeEngine.getInput(), viewerObject, frameTime); xeEngine.getCamera().setViewYXZ(viewerObject.transform.translation, viewerObject.transform.rotation); if(xeEngine.beginFrame()) { diff --git a/src/first_app.hpp b/src/first_app.hpp index d8942ab..a630d47 100755 --- a/src/first_app.hpp +++ b/src/first_app.hpp @@ -1,9 +1,16 @@ #pragma once #include "xe_engine.hpp" -#include "xe_game_object.hpp" -#include "xe_descriptors.hpp" +#include "keyboard_movement_controller.hpp" +#include "simple_renderer.hpp" + +#define GLM_FORCE_RADIANS +#define GLM_FORCE_DEPTH_ZERO_TO_ONE +#include +#include +#include +#include #include #include diff --git a/src/keyboard_movement_controller.cpp b/src/keyboard_movement_controller.cpp index 325693e..1f1a0a7 100644 --- a/src/keyboard_movement_controller.cpp +++ b/src/keyboard_movement_controller.cpp @@ -1,17 +1,13 @@ #include "keyboard_movement_controller.hpp" -#include -#include -#include -#include namespace app { -void KeyboardMovementController::moveInPlaneXZ(GLFWwindow* window, float dt, xe::XeGameObject& gameObject) { +void KeyboardMovementController::update(xe::XeInput &input, xe::XeGameObject& gameObject, float dt) { glm::vec3 rotate{0}; - if(glfwGetKey(window, keys.lookRight) == GLFW_PRESS) rotate.y += 1.f; - if(glfwGetKey(window, keys.lookLeft) == GLFW_PRESS) rotate.y -= 1.f; - if(glfwGetKey(window, keys.lookUp) == GLFW_PRESS) rotate.x -= 1.f; - if(glfwGetKey(window, keys.lookDown) == GLFW_PRESS) rotate.x += 1.f; + if(input.isKeyPressed(keys.lookRight)) rotate.y += 1.f; + if(input.isKeyPressed(keys.lookLeft)) rotate.y -= 1.f; + if(input.isKeyPressed(keys.lookUp)) rotate.x -= 1.f; + if(input.isKeyPressed(keys.lookDown)) rotate.x += 1.f; if (glm::dot(rotate, rotate) > std::numeric_limits::epsilon()) { gameObject.transform.rotation += lookSpeed * dt * glm::normalize(rotate); @@ -26,12 +22,12 @@ void KeyboardMovementController::moveInPlaneXZ(GLFWwindow* window, float dt, xe: const glm::vec3 upDir{0.f, 01.f, 0.f}; glm::vec3 moveDir{0}; - if(glfwGetKey(window, keys.moveForward) == GLFW_PRESS) moveDir += forwardDir; - if(glfwGetKey(window, keys.moveBackward) == GLFW_PRESS) moveDir -= forwardDir; - if(glfwGetKey(window, keys.moveRight) == GLFW_PRESS) moveDir += rightDir; - if(glfwGetKey(window, keys.moveLeft) == GLFW_PRESS) moveDir -= rightDir; - if(glfwGetKey(window, keys.moveUp) == GLFW_PRESS) moveDir += upDir; - if(glfwGetKey(window, keys.moveDown) == GLFW_PRESS) moveDir -= upDir; + if(input.isKeyPressed(keys.moveForward)) moveDir += forwardDir; + if(input.isKeyPressed(keys.moveBackward)) moveDir -= forwardDir; + if(input.isKeyPressed(keys.moveRight)) moveDir += rightDir; + if(input.isKeyPressed(keys.moveLeft)) moveDir -= rightDir; + if(input.isKeyPressed(keys.moveUp)) moveDir += upDir; + if(input.isKeyPressed(keys.moveDown)) moveDir -= upDir; if (glm::dot(moveDir, moveDir) > std::numeric_limits::epsilon()) { gameObject.transform.translation += moveSpeed * dt * glm::normalize(moveDir); diff --git a/src/keyboard_movement_controller.hpp b/src/keyboard_movement_controller.hpp index b3e3a15..a9ba031 100644 --- a/src/keyboard_movement_controller.hpp +++ b/src/keyboard_movement_controller.hpp @@ -1,27 +1,31 @@ #pragma once #include "xe_game_object.hpp" -#include "xe_window.hpp" -#include +#include "xe_input.hpp" + +#include +#include +#include +#include namespace app { class KeyboardMovementController { public: struct KeyMappings { - int moveLeft = GLFW_KEY_A; - int moveRight = GLFW_KEY_D; - int moveForward = GLFW_KEY_W; - int moveBackward = GLFW_KEY_S; - int moveUp = GLFW_KEY_E; - int moveDown = GLFW_KEY_Q; - int lookLeft = GLFW_KEY_LEFT; - int lookRight = GLFW_KEY_RIGHT; - int lookUp = GLFW_KEY_UP; - int lookDown = GLFW_KEY_DOWN; + int moveLeft = KEY_A; + int moveRight = KEY_D; + int moveForward = KEY_W; + int moveBackward = KEY_S; + int moveUp = KEY_E; + int moveDown = KEY_Q; + int lookLeft = KEY_LEFT; + int lookRight = KEY_RIGHT; + int lookUp = KEY_UP; + int lookDown = KEY_DOWN; }; - void moveInPlaneXZ(GLFWwindow* window, float dt, xe::XeGameObject& gameObject); + void update(xe::XeInput &input, xe::XeGameObject& gameObject, float dt); KeyMappings keys{}; float moveSpeed{3.f}; diff --git a/src/simple_renderer.cpp b/src/simple_renderer.cpp index 921019a..5a57324 100644 --- a/src/simple_renderer.cpp +++ b/src/simple_renderer.cpp @@ -1,7 +1,4 @@ #include "simple_renderer.hpp" -#include "xe_render_system.hpp" - -#include namespace app { diff --git a/src/simple_renderer.hpp b/src/simple_renderer.hpp index d9be7b2..9dbfd1c 100644 --- a/src/simple_renderer.hpp +++ b/src/simple_renderer.hpp @@ -1,6 +1,7 @@ #pragma once #include "xe_render_system.hpp" + #include namespace app {