diff --git a/src/Engine/Graphics/GraphicsEnums.h b/src/Engine/Graphics/GraphicsEnums.h index 970ff32..f63cb84 100644 --- a/src/Engine/Graphics/GraphicsEnums.h +++ b/src/Engine/Graphics/GraphicsEnums.h @@ -2,6 +2,151 @@ #include "MinimalEngine.h" namespace Seele { + +enum class KeyCode +{ + /* Printable keys */ + KEY_SPACE = 32, + KEY_APOSTROPHE = 39 /* ' */, + KEY_COMMA = 44 /* , */, + KEY_MINUS = 45 /* - */, + KEY_PERIOD = 46 /* . */, + KEY_SLASH = 47 /* / */, + KEY_0 = 48, + KEY_1 = 49, + KEY_2 = 50, + KEY_3 = 51, + KEY_4 = 52, + KEY_5 = 53, + KEY_6 = 54, + KEY_7 = 55, + KEY_8 = 56, + KEY_9 = 57, + KEY_SEMICOLON = 59 /* ; */, + KEY_EQUAL = 61 /* = */, + KEY_A = 65, + KEY_B = 66, + KEY_C = 67, + KEY_D = 68, + KEY_E = 69, + KEY_F = 70, + KEY_G = 71, + KEY_H = 72, + KEY_I = 73, + KEY_J = 74, + KEY_K = 75, + KEY_L = 76, + KEY_M = 77, + KEY_N = 78, + KEY_O = 79, + KEY_P = 80, + KEY_Q = 81, + KEY_R = 82, + KEY_S = 83, + KEY_T = 84, + KEY_U = 85, + KEY_V = 86, + KEY_W = 87, + KEY_X = 88, + KEY_Y = 89, + KEY_Z = 90, + KEY_LEFT_BRACKET = 91 /* [ */, + KEY_BACKSLASH = 92 /* \ */, + KEY_RIGHT_BRACKET = 93 /* ] */, + KEY_GRAVE_ACCENT = 96 /* ` */, + KEY_WORLD_1 = 161 /* non-US #1 */, + KEY_WORLD_2 = 162 /* non-US #2 */, + /* Function keys */ + KEY_ESCAPE = 256, + KEY_ENTER = 257, + KEY_TAB = 258, + KEY_BACKSPACE = 259, + KEY_INSERT = 260, + KEY_DELETE = 261, + KEY_RIGHT = 262, + KEY_LEFT = 263, + KEY_DOWN = 264, + KEY_UP = 265, + KEY_PAGE_UP = 266, + KEY_PAGE_DOWN = 267, + KEY_HOME = 268, + KEY_END = 269, + KEY_CAPS_LOCK = 280, + KEY_SCROLL_LOCK = 281, + KEY_NUM_LOCK = 282, + KEY_PRINT_SCREEN = 283, + KEY_PAUSE = 284, + KEY_F1 = 290, + KEY_F2 = 291, + KEY_F3 = 292, + KEY_F4 = 293, + KEY_F5 = 294, + KEY_F6 = 295, + KEY_F7 = 296, + KEY_F8 = 297, + KEY_F9 = 298, + KEY_F10 = 299, + KEY_F11 = 300, + KEY_F12 = 301, + KEY_F13 = 302, + KEY_F14 = 303, + KEY_F15 = 304, + KEY_F16 = 305, + KEY_F17 = 306, + KEY_F18 = 307, + KEY_F19 = 308, + KEY_F20 = 309, + KEY_F21 = 310, + KEY_F22 = 311, + KEY_F23 = 312, + KEY_F24 = 313, + KEY_F25 = 314, + KEY_KP_0 = 320, + KEY_KP_1 = 321, + KEY_KP_2 = 322, + KEY_KP_3 = 323, + KEY_KP_4 = 324, + KEY_KP_5 = 325, + KEY_KP_6 = 326, + KEY_KP_7 = 327, + KEY_KP_8 = 328, + KEY_KP_9 = 329, + KEY_KP_DECIMAL = 330, + KEY_KP_DIVIDE = 331, + KEY_KP_MULTIPLY = 332, + KEY_KP_SUBTRACT = 333, + KEY_KP_ADD = 334, + KEY_KP_ENTER = 335, + KEY_KP_EQUAL = 336, + KEY_LEFT_SHIFT = 340, + KEY_LEFT_CONTROL = 341, + KEY_LEFT_ALT = 342, + KEY_LEFT_SUPER = 343, + KEY_RIGHT_SHIFT = 344, + KEY_RIGHT_CONTROL = 345, + KEY_RIGHT_ALT = 346, + KEY_RIGHT_SUPER = 347, + KEY_MENU = 348, +}; + +enum class KeyAction +{ + RELEASE = 0, + PRESS = 1, + REPEAT = 2 +}; + +enum class KeyModifier +{ + MOD_SHIFT = 0x0001, + MOD_CONTROL = 0x0002, + MOD_ALT = 0x0004, + MOD_SUPER = 0x0008, + MOD_CAPS_LOCK = 0x0010, + MOD_NUM_LOCK = 0x0020 +}; +typedef uint32 KeyModifierFlags; + namespace Gfx { static constexpr bool useAsyncCompute = true; @@ -30,6 +175,22 @@ enum class RenderPassType : uint8 BasePass }; +enum class QueueType +{ + GRAPHICS = 1, + COMPUTE = 2, + TRANSFER = 3, + DEDICATED_TRANSFER = 4 +}; +enum class VertexAttribute +{ + POSITION, + TEXCOORD, + NORMAL, + TANGENT, + BITANGENT +}; + typedef uint32_t SeFlags; typedef uint32_t SeBool32; typedef uint64_t SeDeviceSize; @@ -1885,20 +2046,5 @@ typedef union SeClearValue { SeClearDepthStencilValue depthStencil; } SeClearValue; -enum class QueueType -{ - GRAPHICS = 1, - COMPUTE = 2, - TRANSFER = 3, - DEDICATED_TRANSFER = 4 -}; -enum class VertexAttribute -{ - POSITION, - TEXCOORD, - NORMAL, - TANGENT, - BITANGENT -}; } // namespace Gfx } // namespace Seele \ No newline at end of file diff --git a/src/Engine/Graphics/GraphicsResources.h b/src/Engine/Graphics/GraphicsResources.h index a2669fc..7a3973d 100644 --- a/src/Engine/Graphics/GraphicsResources.h +++ b/src/Engine/Graphics/GraphicsResources.h @@ -5,6 +5,7 @@ #include "GraphicsInitializer.h" #include "MeshBatch.h" #include +#include #ifndef ENABLE_VALIDATION @@ -499,6 +500,7 @@ public: virtual void endFrame() = 0; virtual void onWindowCloseEvent() = 0; virtual PTexture2D getBackBuffer() = 0; + virtual void setKeyCallback(std::function callback) = 0; SeFormat getSwapchainFormat() const { return pixelFormat; diff --git a/src/Engine/Graphics/SceneView.cpp b/src/Engine/Graphics/SceneView.cpp index b3d9494..c41fec7 100644 --- a/src/Engine/Graphics/SceneView.cpp +++ b/src/Engine/Graphics/SceneView.cpp @@ -3,6 +3,8 @@ #include "Scene/Scene.h" #include "Window.h" #include "Scene/Actor/CameraActor.h" +#include "Scene/Components/CameraComponent.h" +#include using namespace Seele; @@ -10,11 +12,17 @@ Seele::SceneView::SceneView(Gfx::PGraphics graphics, PWindow owner, const Viewpo : View(graphics, owner, createInfo) { scene = new Scene(graphics); - PCameraActor camera = new CameraActor(); - scene->addActor(camera); - renderer = new SceneRenderPath(scene, graphics, viewport, camera); + activeCamera = new CameraActor(); + scene->addActor(activeCamera); + renderer = new SceneRenderPath(scene, graphics, viewport, activeCamera); } Seele::SceneView::~SceneView() { } + +void SceneView::keyCallback(KeyCode code, KeyAction action, KeyModifier modifier) +{ + std::cout << "Key callback " << (uint32)code << std::endl; + activeCamera->getCameraComponent()->moveOrigin(1); +} diff --git a/src/Engine/Graphics/SceneView.h b/src/Engine/Graphics/SceneView.h index 0fdd8c5..1e2b1dd 100644 --- a/src/Engine/Graphics/SceneView.h +++ b/src/Engine/Graphics/SceneView.h @@ -3,6 +3,7 @@ namespace Seele { DECLARE_REF(Scene); +DECLARE_REF(CameraActor); class SceneView : public View { public: @@ -11,6 +12,8 @@ public: PScene getScene() const { return scene; } private: PScene scene; + PCameraActor activeCamera; + virtual void keyCallback(KeyCode code, KeyAction action, KeyModifier modifier) override; }; DEFINE_REF(SceneView); } // namespace Seele \ No newline at end of file diff --git a/src/Engine/Graphics/View.cpp b/src/Engine/Graphics/View.cpp index 491e912..fa30572 100644 --- a/src/Engine/Graphics/View.cpp +++ b/src/Engine/Graphics/View.cpp @@ -30,3 +30,8 @@ void Seele::View::applyArea(URect area) { renderer->applyArea(area); } + +void View::setFocused() +{ + owner->setFocused(this); +} diff --git a/src/Engine/Graphics/View.h b/src/Engine/Graphics/View.h index 7d21895..6f2685c 100644 --- a/src/Engine/Graphics/View.h +++ b/src/Engine/Graphics/View.h @@ -13,12 +13,16 @@ public: void render(); void endFrame(); void applyArea(URect area); + void setFocused(); protected: Gfx::PGraphics graphics; Gfx::PViewport viewport; PWindow owner; PRenderPath renderer; + + virtual void keyCallback(KeyCode code, KeyAction action, KeyModifier modifier) = 0; + friend class Window; }; DEFINE_REF(View) diff --git a/src/Engine/Graphics/Vulkan/VulkanGraphicsResources.h b/src/Engine/Graphics/Vulkan/VulkanGraphicsResources.h index 05ba3c6..17c54e3 100644 --- a/src/Engine/Graphics/Vulkan/VulkanGraphicsResources.h +++ b/src/Engine/Graphics/Vulkan/VulkanGraphicsResources.h @@ -315,7 +315,9 @@ public: virtual void endFrame() override; virtual Gfx::PTexture2D getBackBuffer() override; virtual void onWindowCloseEvent() override; + virtual void setKeyCallback(std::function callback) override; + std::function keyCallback; protected: void advanceBackBuffer(); void recreateSwapchain(const WindowCreateInfo &createInfo); @@ -324,6 +326,7 @@ protected: void createSwapchain(); void chooseSurfaceFormat(const Array &available, Gfx::SeFormat preferred); void choosePresentMode(const Array &modes); + PTexture2D backBufferImages[Gfx::numFramesBuffered]; PSemaphore renderFinished[Gfx::numFramesBuffered]; PSemaphore imageAcquired[Gfx::numFramesBuffered]; diff --git a/src/Engine/Graphics/Vulkan/VulkanInitializer.cpp b/src/Engine/Graphics/Vulkan/VulkanInitializer.cpp index 2f4bb5d..395184e 100644 --- a/src/Engine/Graphics/Vulkan/VulkanInitializer.cpp +++ b/src/Engine/Graphics/Vulkan/VulkanInitializer.cpp @@ -768,9 +768,9 @@ VkPipelineShaderStageCreateInfo init::PipelineShaderStageCreateInfo(VkShaderStag #pragma warning(disable : 4100) VkBool32 Seele::Vulkan::debugCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t obj, size_t location, int32_t code, const char *layerPrefix, const char *msg, void *userDataManager) { - if(flags & VK_DEBUG_REPORT_ERROR_BIT_EXT) + if(flags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT) { - std::cerr << layerPrefix << ": " << msg << std::endl; + //std::cerr << layerPrefix << ": " << msg << std::endl; } else { diff --git a/src/Engine/Graphics/Vulkan/VulkanPipelineCache.cpp b/src/Engine/Graphics/Vulkan/VulkanPipelineCache.cpp index 2a5bb2c..92d1b10 100644 --- a/src/Engine/Graphics/Vulkan/VulkanPipelineCache.cpp +++ b/src/Engine/Graphics/Vulkan/VulkanPipelineCache.cpp @@ -285,7 +285,7 @@ PGraphicsPipeline PipelineCache::createPipeline(const GraphicsPipelineCreateInfo VK_CHECK(vkCreateGraphicsPipelines(graphics->getDevice(), cache, 1, &createInfo, nullptr, &pipelineHandle)); auto endTime = std::chrono::high_resolution_clock::now(); int64 delta = std::chrono::duration_cast(endTime - beginTime).count(); - std::cout << "Gfx creation time: " << delta << std::endl; + //std::cout << "Gfx creation time: " << delta << std::endl; PGraphicsPipeline result = new GraphicsPipeline(graphics, pipelineHandle, layout, gfxInfo); return result; diff --git a/src/Engine/Graphics/Vulkan/VulkanViewport.cpp b/src/Engine/Graphics/Vulkan/VulkanViewport.cpp index c817a41..6a026c3 100644 --- a/src/Engine/Graphics/Vulkan/VulkanViewport.cpp +++ b/src/Engine/Graphics/Vulkan/VulkanViewport.cpp @@ -8,14 +8,22 @@ using namespace Seele; using namespace Seele::Vulkan; +void glfwKeyCallback(GLFWwindow* handle, int key, int scancode, int action, int modifier) +{ + Window* window = (Window*)glfwGetWindowUserPointer(handle); + std::cout << "glfw callback: " << key << std::endl; + window->keyCallback((KeyCode)key, (KeyAction)action, (KeyModifier)modifier); +} + Window::Window(PGraphics graphics, const WindowCreateInfo &createInfo) : Gfx::Window(createInfo), graphics(graphics), instance(graphics->getInstance()), swapchain(VK_NULL_HANDLE), numSamples(createInfo.numSamples), pixelFormat(cast(createInfo.pixelFormat)) { glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); GLFWwindow *handle = glfwCreateWindow(createInfo.width, createInfo.height, createInfo.title, createInfo.bFullscreen ? glfwGetPrimaryMonitor() : nullptr, nullptr); windowHandle = handle; + glfwSetWindowUserPointer(handle, this); - //TODO: callbacks + glfwSetKeyCallback(handle, &glfwKeyCallback); glfwCreateWindowSurface(instance, handle, nullptr, &surface); @@ -69,6 +77,11 @@ Gfx::PTexture2D Window::getBackBuffer() return backBufferImages[currentImageIndex]; } +void Window::setKeyCallback(std::function callback) +{ + keyCallback = callback; +} + void Window::advanceBackBuffer() { VkResult res = VK_ERROR_OUT_OF_DATE_KHR; @@ -258,9 +271,13 @@ void Window::choosePresentMode(const Array &modes) Viewport::Viewport(PGraphics graphics, PWindow owner, const ViewportCreateInfo &viewportInfo) : Gfx::Viewport(owner, viewportInfo), graphics(graphics) { - handle = init::Viewport(static_cast(viewportInfo.sizeX), static_cast(viewportInfo.sizeY), 0.f, 1.f); + handle.width = static_cast(viewportInfo.sizeX); + handle.height = static_cast(viewportInfo.sizeY); handle.x = static_cast(viewportInfo.offsetX); - handle.y = static_cast(viewportInfo.offsetY); + handle.y = static_cast(viewportInfo.offsetY) + handle.height; + handle.height = -handle.height; + handle.minDepth = 0.f; + handle.maxDepth = 1.f; } Viewport::~Viewport() @@ -271,10 +288,15 @@ void Viewport::resize(uint32 newX, uint32 newY) { sizeX = newX; sizeY = newY; + handle.width = static_cast(sizeX); + handle.y = static_cast(sizeY + offsetX); + handle.height = -static_cast(sizeY); } void Viewport::move(uint32 newOffsetX, uint32 newOffsetY) { offsetX = newOffsetX; offsetY = newOffsetY; + handle.x = static_cast(offsetX); + handle.y = static_cast(offsetY + sizeY); } \ No newline at end of file diff --git a/src/Engine/Graphics/Window.cpp b/src/Engine/Graphics/Window.cpp index 562b618..85cca4a 100644 --- a/src/Engine/Graphics/Window.cpp +++ b/src/Engine/Graphics/Window.cpp @@ -1,4 +1,5 @@ #include "Window.h" +#include Seele::Window::Window(Gfx::PWindow handle) : gfxHandle(handle) @@ -43,4 +44,11 @@ void Seele::Window::endFrame() Gfx::PWindow Seele::Window::getGfxHandle() { return gfxHandle; -} \ No newline at end of file +} + +void Window::setFocused(PView view) +{ + focusedView = view; + auto boundFunction = std::bind(&View::keyCallback, view.getHandle(), std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); + gfxHandle->setKeyCallback(boundFunction); +} diff --git a/src/Engine/Graphics/Window.h b/src/Engine/Graphics/Window.h index a1c53e9..61f58f0 100644 --- a/src/Engine/Graphics/Window.h +++ b/src/Engine/Graphics/Window.h @@ -15,9 +15,11 @@ public: void render(); void endFrame(); Gfx::PWindow getGfxHandle(); + void setFocused(PView view); private: Array viewports; + PView focusedView; Gfx::PWindow gfxHandle; }; DEFINE_REF(Window); diff --git a/src/Engine/main.cpp b/src/Engine/main.cpp index be15ca8..d89a399 100644 --- a/src/Engine/main.cpp +++ b/src/Engine/main.cpp @@ -20,7 +20,9 @@ int main() sceneViewInfo.offsetX = 0; sceneViewInfo.offsetY = 0; PSceneView sceneView = new SceneView(core.getWindowManager()->getGraphics(), window, sceneViewInfo); + sceneView->applyArea(URect(1280/2, 720/2, 10, 10)); window->addView(sceneView); + sceneView->setFocused(); AssetRegistry::init("D:\\Private\\Programming\\C++\\TestSeeleProject"); AssetRegistry::importFile("D:\\Private\\Programming\\Unreal Engine\\Assets\\Arissa\\Arissa.fbx"); PPrimitiveComponent arissa = new PrimitiveComponent(AssetRegistry::findMesh("Arissa"));