From de79ccb507427b69d835133910675a52ef01553b Mon Sep 17 00:00:00 2001 From: Nathan Date: Wed, 12 Mar 2025 10:16:35 -0500 Subject: [PATCH] restart gui from scratch --- .../calculator/src/calculator.cpp} | 0 modules/gui/events/event.cpp | 9 - modules/gui/events/event.h | 20 - modules/gui/events/eventHandler.cpp | 39 - modules/gui/events/eventHandler.h | 14 - modules/gui/events/keyEvent.cpp | 10 - modules/gui/events/keyEvent.h | 28 - modules/gui/events/mouseEvent.cpp | 13 - modules/gui/events/mouseEvent.h | 33 - modules/gui/events/windowEvent.cpp | 5 - modules/gui/events/windowEvent.h | 27 - modules/gui/layers/baseLayer.cpp | 92 -- modules/gui/layers/baseLayer.h | 32 - modules/gui/layers/layer.cpp | 8 - modules/gui/layers/layer.h | 35 - modules/gui/layers/layerstack.cpp | 77 - modules/gui/layers/layerstack.h | 32 - modules/gui/layers/overlay.cpp | 271 --- modules/gui/layers/overlay.h | 209 --- modules/gui/renderer/vulkanRenderer.cpp | 1469 ----------------- modules/gui/renderer/vulkanRenderer.h | 296 ---- modules/gui/shaders/s.frag | 14 - modules/gui/shaders/s.vert | 21 - modules/gui/src/application.cpp | 47 - modules/gui/src/application.h | 49 - modules/gui/src/engine.cpp | 9 - modules/gui/src/engine.h | 58 - modules/gui/window/glfwWindow.cpp | 87 - modules/gui/window/glfwWindow.h | 42 - modules/gui/window/sdl2Window.cpp | 94 -- modules/gui/window/sdl2Window.h | 42 - modules/gui/window/window.cpp | 31 - modules/gui/window/window.h | 42 - .../{gui => mainGUI}/assets/viking_room.obj | 0 .../{gui => mainGUI}/assets/viking_room.png | Bin .../openglRenderer.h => mainGUI/src/gui.cpp} | 0 .../renderer/renderer.h => mainGUI/src/gui.h} | 0 modules/renderer/src/renderer.cpp | 0 modules/renderer/src/renderer.h | 0 39 files changed, 3255 deletions(-) rename modules/{gui/renderer/openglRenderer.cpp => GUImodules/calculator/src/calculator.cpp} (100%) mode change 100755 => 100644 delete mode 100755 modules/gui/events/event.cpp delete mode 100755 modules/gui/events/event.h delete mode 100755 modules/gui/events/eventHandler.cpp delete mode 100755 modules/gui/events/eventHandler.h delete mode 100755 modules/gui/events/keyEvent.cpp delete mode 100755 modules/gui/events/keyEvent.h delete mode 100755 modules/gui/events/mouseEvent.cpp delete mode 100755 modules/gui/events/mouseEvent.h delete mode 100755 modules/gui/events/windowEvent.cpp delete mode 100755 modules/gui/events/windowEvent.h delete mode 100755 modules/gui/layers/baseLayer.cpp delete mode 100755 modules/gui/layers/baseLayer.h delete mode 100755 modules/gui/layers/layer.cpp delete mode 100755 modules/gui/layers/layer.h delete mode 100755 modules/gui/layers/layerstack.cpp delete mode 100755 modules/gui/layers/layerstack.h delete mode 100755 modules/gui/layers/overlay.cpp delete mode 100755 modules/gui/layers/overlay.h delete mode 100755 modules/gui/renderer/vulkanRenderer.cpp delete mode 100755 modules/gui/renderer/vulkanRenderer.h delete mode 100755 modules/gui/shaders/s.frag delete mode 100755 modules/gui/shaders/s.vert delete mode 100755 modules/gui/src/application.cpp delete mode 100755 modules/gui/src/application.h delete mode 100755 modules/gui/src/engine.cpp delete mode 100755 modules/gui/src/engine.h delete mode 100755 modules/gui/window/glfwWindow.cpp delete mode 100755 modules/gui/window/glfwWindow.h delete mode 100755 modules/gui/window/sdl2Window.cpp delete mode 100755 modules/gui/window/sdl2Window.h delete mode 100755 modules/gui/window/window.cpp delete mode 100755 modules/gui/window/window.h rename modules/{gui => mainGUI}/assets/viking_room.obj (100%) rename modules/{gui => mainGUI}/assets/viking_room.png (100%) rename modules/{gui/renderer/openglRenderer.h => mainGUI/src/gui.cpp} (100%) mode change 100755 => 100644 rename modules/{gui/renderer/renderer.h => mainGUI/src/gui.h} (100%) mode change 100755 => 100644 create mode 100644 modules/renderer/src/renderer.cpp create mode 100644 modules/renderer/src/renderer.h diff --git a/modules/gui/renderer/openglRenderer.cpp b/modules/GUImodules/calculator/src/calculator.cpp old mode 100755 new mode 100644 similarity index 100% rename from modules/gui/renderer/openglRenderer.cpp rename to modules/GUImodules/calculator/src/calculator.cpp diff --git a/modules/gui/events/event.cpp b/modules/gui/events/event.cpp deleted file mode 100755 index 252d725..0000000 --- a/modules/gui/events/event.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "event.h" - -Event::Event() { - -} - -Event::~Event() -{ -} diff --git a/modules/gui/events/event.h b/modules/gui/events/event.h deleted file mode 100755 index c35462b..0000000 --- a/modules/gui/events/event.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include "engine.h" - -enum class EventType { - None = 0, - WindowClose, WindowResize, WindowFocus, WindowLostFocus, WindowMoved, - KeyPressed, KeyReleased, KeyTyped, - MouseButtonPressed, MouseButtonReleased, MouseMoved, MouseScrolled -}; - -class Event { - - public: - Event(); - virtual ~Event(); - - virtual EventType getType() const = 0; - -}; diff --git a/modules/gui/events/eventHandler.cpp b/modules/gui/events/eventHandler.cpp deleted file mode 100755 index b01f221..0000000 --- a/modules/gui/events/eventHandler.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "eventHandler.h" -#include "application.h" - -EventHandler::EventHandler() { - -} - -bool EventHandler::handleEvent(const Event* e, Layer* layer) { - //std::cout << (int)e->getType() << '\n'; - switch(e->getType()) { - case EventType::KeyPressed: - return layer->onKeyPressed(static_cast(e)); - case EventType::KeyReleased: - return layer->onKeyReleased(static_cast(e)); - case EventType::KeyTyped: - return layer->onKeyTyped(static_cast(e)); - case EventType::MouseButtonPressed: - return layer->onMouseButtonPressed(static_cast(e)); - case EventType::MouseButtonReleased: - return layer->onMouseButtonReleased(static_cast(e)); - case EventType::MouseScrolled: - return layer->onMouseScrolled(static_cast(e)); - case EventType::MouseMoved: - return layer->onMouseMoved(static_cast(e)); - case EventType::WindowClose: - return layer->onWindowClose(static_cast(e)); - case EventType::WindowFocus: - return layer->onWindowFocus(static_cast(e)); - case EventType::WindowLostFocus: - return layer->onWindowFocusLost(static_cast(e)); - case EventType::WindowMoved: - return layer->onWindowMoved(static_cast(e)); - case EventType::WindowResize: - return layer->onWindowResize(static_cast(e)); - //default: - - } - return false; -} \ No newline at end of file diff --git a/modules/gui/events/eventHandler.h b/modules/gui/events/eventHandler.h deleted file mode 100755 index f15b3f5..0000000 --- a/modules/gui/events/eventHandler.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "engine.h" - -#include "event.h" - - -class EventHandler { - - public: - EventHandler(); - - bool handleEvent(const Event*, Layer*); -}; diff --git a/modules/gui/events/keyEvent.cpp b/modules/gui/events/keyEvent.cpp deleted file mode 100755 index d083977..0000000 --- a/modules/gui/events/keyEvent.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "keyEvent.h" - -KeyEvent::KeyEvent(int k, int s, int m, int r, bool p) : key(k), scancode(s), mod(m), repeat(r), pressed(p) { - -} - -KeyTypedEvent::KeyTypedEvent(int w, char* t) : windowID(w), text(t) -{ - -} diff --git a/modules/gui/events/keyEvent.h b/modules/gui/events/keyEvent.h deleted file mode 100755 index 98453e4..0000000 --- a/modules/gui/events/keyEvent.h +++ /dev/null @@ -1,28 +0,0 @@ -#include "engine.h" -#include "event.h" - -class KeyEvent : public Event { - const int key; - const int scancode; - const int mod; - const int repeat; - const bool pressed; - public: - KeyEvent(int, int, int, int, bool); - inline int getKey() const { return key; } - inline int getScancode() const { return scancode; } - inline int getMod() const { return mod; } - inline bool getPressed() const { return pressed; } - EventType getType() const { return pressed ? EventType::KeyPressed : EventType::KeyReleased; } -}; - -class KeyTypedEvent : public Event { - const std::string text; - const int windowID; - - public: - KeyTypedEvent(int, char*); - inline int getWindowID() const { return windowID; } - inline const char* getText() const { return text.c_str(); } - EventType getType() const { return EventType::KeyTyped; } -}; diff --git a/modules/gui/events/mouseEvent.cpp b/modules/gui/events/mouseEvent.cpp deleted file mode 100755 index e2d8905..0000000 --- a/modules/gui/events/mouseEvent.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "mouseEvent.h" - -MouseButtonEvent::MouseButtonEvent(int b, bool p) : button(b), pressed(p) { - -} - -MouseMovedEvent::MouseMovedEvent(int _x, int _y, double _dx, double _dy) : x(_x), y(_y), dx(_dx), dy(_dy) { - -} - -MouseScrolledEvent::MouseScrolledEvent(int _x, int _y) : x(_x), y(_y) { - -} \ No newline at end of file diff --git a/modules/gui/events/mouseEvent.h b/modules/gui/events/mouseEvent.h deleted file mode 100755 index 9a2ac57..0000000 --- a/modules/gui/events/mouseEvent.h +++ /dev/null @@ -1,33 +0,0 @@ -#include "engine.h" -#include "event.h" - -class MouseButtonEvent : public Event { - const int button; - const bool pressed; - public: - MouseButtonEvent(int, bool); - inline int getButton() const { return button; } - inline bool getPressed() const { return pressed; } - EventType getType() const { return pressed ? EventType::MouseButtonPressed : EventType::MouseButtonReleased; } -}; - -class MouseMovedEvent : public Event { - const int x, y; - const double dx, dy; - public: - MouseMovedEvent(int, int, double, double); - inline int getX() const { return x; } - inline int getY() const { return y; } - inline double getDeltaX() const { return dx; } - inline double getDeltaY() const { return dy; } - EventType getType() const { return EventType::MouseMoved; } -}; - -class MouseScrolledEvent : public Event { - const int x, y; - public: - MouseScrolledEvent(int, int); - inline int getX() const { return x; } - inline int getY() const { return y; } - EventType getType() const { return EventType::MouseScrolled; } -}; diff --git a/modules/gui/events/windowEvent.cpp b/modules/gui/events/windowEvent.cpp deleted file mode 100755 index 540d978..0000000 --- a/modules/gui/events/windowEvent.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "windowEvent.h" - -WindowEvent::WindowEvent(int id, int e) : windowID(id), event(e) { - -} \ No newline at end of file diff --git a/modules/gui/events/windowEvent.h b/modules/gui/events/windowEvent.h deleted file mode 100755 index 25da4b0..0000000 --- a/modules/gui/events/windowEvent.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#include "engine.h" -#include "event.h" - - -class WindowEvent : public Event { - const int windowID, event; - public: - WindowEvent(int, int); - - inline int getWindowID() const { return windowID; } - - EventType getType() const { - switch(event) { - case SDL_WINDOWEVENT_CLOSE: - return EventType::WindowClose; - case SDL_WINDOWEVENT_RESIZED: - return EventType::WindowResize; - case SDL_WINDOWEVENT_FOCUS_GAINED: - return EventType::WindowFocus; - case SDL_WINDOWEVENT_FOCUS_LOST: - return EventType::WindowLostFocus; - } - return EventType::None; - } -}; diff --git a/modules/gui/layers/baseLayer.cpp b/modules/gui/layers/baseLayer.cpp deleted file mode 100755 index 4c81f0d..0000000 --- a/modules/gui/layers/baseLayer.cpp +++ /dev/null @@ -1,92 +0,0 @@ -#include "baseLayer.h" -#include "application.h" - -BaseLayer::BaseLayer() -{ -} - -BaseLayer::~BaseLayer() -{ -} - -void BaseLayer::onAttach() -{ -} - -void BaseLayer::onDetach() -{ -} - -void BaseLayer::onUpdate() -{ -} - -bool BaseLayer::onEvent(const Event* e) -{ - EventHandler eh; - return eh.handleEvent(e, this); -} - -bool BaseLayer::onMouseButtonPressed(const MouseButtonEvent *e) -{ - return true; -} - -bool BaseLayer::onMouseButtonReleased(const MouseButtonEvent *e) -{ - App::Get().show = !App::Get().show; - return true; -} - -bool BaseLayer::onMouseMoved(const MouseMovedEvent *e) -{ - return true; -} - -bool BaseLayer::onMouseScrolled(const MouseScrolledEvent *e) -{ - return true; -} - -bool BaseLayer::onKeyPressed(const KeyEvent *e) -{ - return true; -} - -bool BaseLayer::onKeyReleased(const KeyEvent *e) -{ - return true; -} - -bool BaseLayer::onKeyTyped(const KeyTypedEvent *) -{ - return true; -} - -bool BaseLayer::onWindowClose(const WindowEvent *e) -{ - if (e->getWindowID() == SDL_GetWindowID(App::Get().getWindow())) { - App::Get().done = true; - } - return true; -} - -bool BaseLayer::onWindowFocus(const WindowEvent *e) -{ - return true; -} - -bool BaseLayer::onWindowFocusLost(const WindowEvent *e) -{ - return true; -} - -bool BaseLayer::onWindowMoved(const WindowEvent *e) -{ - return true; -} - -bool BaseLayer::onWindowResize(const WindowEvent *e) -{ - return true; -} diff --git a/modules/gui/layers/baseLayer.h b/modules/gui/layers/baseLayer.h deleted file mode 100755 index 3197760..0000000 --- a/modules/gui/layers/baseLayer.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once -#include "engine.h" -#include "layer.h" -#include "eventHandler.h" - -class BaseLayer : public Layer { - - public: - - BaseLayer(); - ~BaseLayer(); - - virtual void onAttach(); - virtual void onDetach(); - virtual void onUpdate(); - virtual bool onEvent(const Event*); - - protected: - virtual bool onMouseButtonPressed(const MouseButtonEvent*); - virtual bool onMouseButtonReleased(const MouseButtonEvent*); - virtual bool onMouseMoved(const MouseMovedEvent*); - virtual bool onMouseScrolled(const MouseScrolledEvent*); - virtual bool onKeyPressed(const KeyEvent*); - virtual bool onKeyReleased(const KeyEvent*); - virtual bool onKeyTyped(const KeyTypedEvent*); - - virtual bool onWindowClose(const WindowEvent*); - virtual bool onWindowFocus(const WindowEvent*); - virtual bool onWindowFocusLost(const WindowEvent*); - virtual bool onWindowMoved(const WindowEvent*); - virtual bool onWindowResize(const WindowEvent*); -}; diff --git a/modules/gui/layers/layer.cpp b/modules/gui/layers/layer.cpp deleted file mode 100755 index c3c9ee7..0000000 --- a/modules/gui/layers/layer.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include "layer.h" - -#include "application.h" - - -Layer::Layer() {} - -Layer::~Layer() {} \ No newline at end of file diff --git a/modules/gui/layers/layer.h b/modules/gui/layers/layer.h deleted file mode 100755 index f805d3e..0000000 --- a/modules/gui/layers/layer.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include "engine.h" - -#include "event.h" - -class Layer { - - friend class EventHandler; - - public: - - Layer(); - virtual ~Layer(); - - virtual void onAttach() = 0; - virtual void onDetach() = 0; - virtual void onUpdate() = 0; - virtual bool onEvent(const Event* event) = 0; - - protected: - virtual bool onMouseButtonPressed(const MouseButtonEvent* event) = 0; - virtual bool onMouseButtonReleased(const MouseButtonEvent* event) = 0; - virtual bool onMouseMoved(const MouseMovedEvent* event) = 0; - virtual bool onMouseScrolled(const MouseScrolledEvent* event) = 0; - virtual bool onKeyPressed(const KeyEvent* event) = 0; - virtual bool onKeyReleased(const KeyEvent* event) = 0; - virtual bool onKeyTyped(const KeyTypedEvent* event) = 0; - virtual bool onWindowResize(const WindowEvent* event) = 0; - virtual bool onWindowFocus(const WindowEvent* event) = 0; - virtual bool onWindowFocusLost(const WindowEvent* event) = 0; - virtual bool onWindowClose(const WindowEvent* event) = 0; - virtual bool onWindowMoved(const WindowEvent* event) = 0; - -}; diff --git a/modules/gui/layers/layerstack.cpp b/modules/gui/layers/layerstack.cpp deleted file mode 100755 index 4fc2883..0000000 --- a/modules/gui/layers/layerstack.cpp +++ /dev/null @@ -1,77 +0,0 @@ -#include "layerstack.h" -#include "application.h" - - -LayerStack::LayerStack() { - - insert = layers.begin(); -} - -LayerStack::~LayerStack() { - - for(Layer* layer : layers) { - delete layer; - } -} - -void LayerStack::pushLayer(Layer* layer) { - layers.emplace(insert, layer); - layer->onAttach(); -} - -void LayerStack::pushOverlay(Layer* layer) { - layers.emplace_back(layer); - layer->onAttach(); -} - -void LayerStack::popLayer(Layer* layer) { - auto it = find(layers.begin(), layers.end(), layer); - if(it != layers.end()) { - layers.erase(it); - insert--; - } - layer->onDetach(); -} - -void LayerStack::popOverlay(Layer* layer) { - auto it = find(layers.begin(), layers.end(), layer); - if(it != layers.end()) { - layers.erase(it); - } - layer->onDetach(); -} - -void LayerStack::propagateEvent(const Event* e) { - eventHandled = false; - if(e == nullptr) - return; - else { - if(layers.size() > 0) { - for(int i = layers.size() - 1; i >= 0; i--) { - if(!eventHandled) - eventHandled = layers.at(i)->onEvent(e); - else - break; - } - } - delete e; - } -} - -void LayerStack::updateLayers() { - if(layers.size() > 0) { - for(Layer* layer : layers) { - layer->onUpdate(); - } - } -} - -void LayerStack::shutdown() { - if(layers.size() > 0) { - for(Layer* layer : layers) { - popLayer(layer); - layer->onDetach(); - delete layer; - } - } -} \ No newline at end of file diff --git a/modules/gui/layers/layerstack.h b/modules/gui/layers/layerstack.h deleted file mode 100755 index 8688fb3..0000000 --- a/modules/gui/layers/layerstack.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include "engine.h" - -#include "layer.h" - - -class LayerStack { - - public: - LayerStack(); - ~LayerStack(); - - void pushLayer(Layer*); - void pushOverlay(Layer*); - void popLayer(Layer*); - void popOverlay(Layer*); - - void propagateEvent(const Event*); - void updateLayers(); - void shutdown(); - - inline Layer* getLayer(unsigned long i) { return layers.at(i); } - - std::vector::iterator begin() {return layers.begin();} - std::vector::iterator end() {return layers.end();} - - private: - std::vector layers; - std::vector::iterator insert; - bool eventHandled; -}; diff --git a/modules/gui/layers/overlay.cpp b/modules/gui/layers/overlay.cpp deleted file mode 100755 index 2e58f06..0000000 --- a/modules/gui/layers/overlay.cpp +++ /dev/null @@ -1,271 +0,0 @@ -#include "overlay.h" -#include "application.h" - -static void check_vk_result(VkResult err) -{ - if (err == 0) - return; - fprintf(stderr, "[vulkan] Error: VkResult = %d\n", err); - if (err < 0) - abort(); -} - -Overlay::Overlay() { - -} - -Overlay::~Overlay() { - - -} - -void Overlay::onAttach() { - - init(); -} - -void Overlay::onDetach() { - - -} - -void Overlay::onUpdate() { - - newFrame(); - - define(nullptr, [](Overlay& overlay, void** data) { - - if(App::Get().show) - ImGui::ShowDemoWindow(); - - { - static char filename[24] = "test.py"; - static std::vector text(2048); - static std::fstream file; - - - - ImGui::Begin("Main Editor"); - - ImGui::InputText("File Name", filename, 24); - - ImGui::SameLine(); - - if(ImGui::Button("load", ImVec2(48, 16))) { - file.open(filename, std::ios::in); - if(file.is_open()) { - for(int i = 0; i < text.size(); i++) { - if(!file.eof()) - text.at(i) = file.get(); - else - text.at(i) = '\r'; - } - file.close(); - } else { - std::cout << "file does not exist!\n"; - } - } - - ImGui::InputTextMultiline("Editor", text.data(), text.size(), - ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16), - ImGuiInputTextFlags_AllowTabInput); - - if(ImGui::Button("save", ImVec2(48, 16))) { - file.open(filename, std::ios::out | std::ios::trunc); - if(file.is_open()){ - for(char c : text) - file.put(c == '\0' ? ' ' : c); - file.close(); - } else { - std::cout << "file could not be opened!\n"; - } - } - - ImGui::SameLine(); - - if(ImGui::Button("run", ImVec2(48, 16))) { - if (system(("python " + std::string(filename)).c_str())) - std::cout << "command failed!\n"; - } - ImGui::End(); - } - - return 0; - }); - - render(); -} - -bool Overlay::onEvent(const Event* event) { - - EventHandler eh; - return eh.handleEvent(event, this); -} - -bool Overlay::onMouseButtonPressed(const MouseButtonEvent* event) { - - ImGuiIO& io = ImGui::GetIO(); - if(io.WantCaptureMouse) - io.AddMouseButtonEvent(event->getButton(), event->getPressed()); - return io.WantCaptureMouse; -} - -bool Overlay::onMouseButtonReleased(const MouseButtonEvent* event) { - - ImGuiIO& io = ImGui::GetIO(); - if(io.WantCaptureMouse) - io.AddMouseButtonEvent(event->getButton(), event->getPressed()); - return io.WantCaptureMouse; -} - -bool Overlay::onMouseMoved(const MouseMovedEvent* event) { - - ImGuiIO& io = ImGui::GetIO(); - if(io.WantCaptureMouse) - io.AddMousePosEvent(event->getX(), event->getY()); - return io.WantCaptureMouse; -} - -bool Overlay::onMouseScrolled(const MouseScrolledEvent* event) { - - ImGuiIO& io = ImGui::GetIO(); - if(io.WantCaptureMouse) - io.AddMouseWheelEvent(event->getX(), event->getY()); - return io.WantCaptureMouse; -} - -bool Overlay::onKeyPressed(const KeyEvent* event) { - - ImGuiIO& io = ImGui::GetIO(); - if(io.WantCaptureKeyboard) { - ImGui_ImplSDL2_UpdateKeyModifiers((SDL_Keymod)event->getMod()); - io.AddKeyEvent(ImGui_ImplSDL2_KeyEventToImGuiKey(event->getKey(), (SDL_Scancode)event->getScancode()), - event->getPressed()); - } - return io.WantCaptureKeyboard; -} - -bool Overlay::onKeyReleased(const KeyEvent* event) { - - ImGuiIO& io = ImGui::GetIO(); - if(io.WantCaptureKeyboard) { - ImGui_ImplSDL2_UpdateKeyModifiers((SDL_Keymod)event->getMod()); - io.AddKeyEvent(ImGui_ImplSDL2_KeyEventToImGuiKey(event->getKey(), (SDL_Scancode)event->getScancode()), - event->getPressed()); - } - return io.WantCaptureKeyboard; -} - -bool Overlay::onKeyTyped(const KeyTypedEvent *e) -{ - ImGuiIO& io = ImGui::GetIO(); - if(io.WantCaptureKeyboard) - io.AddInputCharactersUTF8(e->getText()); - return io.WantCaptureKeyboard; -} - -bool Overlay::onWindowClose(const WindowEvent *e) -{ - return false; -} - -bool Overlay::onWindowFocus(const WindowEvent *e) -{ - return false; -} - -bool Overlay::onWindowFocusLost(const WindowEvent *e) -{ - return false; -} - -bool Overlay::onWindowMoved(const WindowEvent *e) -{ - return false; -} - -bool Overlay::onWindowResize(const WindowEvent *e) -{ - Window& window = App::Get().getWindow(); - window.getSize(); - ImGui::GetIO().DisplaySize = ImVec2(window.x, window.y); - return false; -} - -void Overlay::init() { - - App& app = App::Get(); - Renderer& renderer = app.getRenderer(); - - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); - ImGuiIO& io = ImGui::GetIO(); (void)io; - io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls - io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // Enable Docking - io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; // Enable Multi-Viewport / Platform Windows - - ImGui::StyleColorsDark(); - - ImGuiStyle& style = ImGui::GetStyle(); - - if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) - { - style.WindowRounding = 0.0f; - style.Colors[ImGuiCol_WindowBg].w = 1.0f; - } - - ImGui_ImplSDL2_InitForVulkan(app.getWindow()); - - ImGui_ImplVulkan_InitInfo init_info = {}; - init_info.Instance = renderer.getInstance(); - init_info.Queue = renderer.getPresentQueue(); - init_info.DescriptorPool = renderer.getDescriptorPool(); - init_info.RenderPass = renderer.getRenderPass(); - init_info.Device = renderer.getDevice(); - init_info.PhysicalDevice = renderer.getPhysicalDevice(); - // init_info.MSAASamples = renderer.getMSAASamples(); - init_info.MinImageCount = renderer.getNumImages(); - init_info.ImageCount = renderer.getNumImages(); - ImGui_ImplVulkan_Init(&init_info); - - ImGui_ImplVulkan_CreateFontsTexture(); -} - -void Overlay::shutdown() { - ImGui_ImplVulkan_Shutdown(); - ImGui_ImplSDL2_Shutdown(); - ImGui::DestroyContext(); -} - -void Overlay::newFrame() { - - ImGui_ImplVulkan_NewFrame(); - ImGui_ImplSDL2_NewFrame(); - ImGui::NewFrame(); -} - -void Overlay::renderPlatformWindows() { - - if (ImGui::GetIO().ConfigFlags & ImGuiConfigFlags_ViewportsEnable) { - ImGui::UpdatePlatformWindows(); - ImGui::RenderPlatformWindowsDefault(); - } -} - - - -void Overlay::render() { - - Renderer& renderer = App::Get().getRenderer(); - - ImGui::Render(); - main_draw_data = ImGui::GetDrawData(); - mainMinimized = (main_draw_data->DisplaySize.x <= 0.0f || main_draw_data->DisplaySize.y <= 0.0f); - ImGui_ImplVulkan_RenderDrawData(main_draw_data, renderer.getCommandBuffer(renderer.getFrame())); - renderPlatformWindows(); -} - -bool Overlay::isMinimized() { - return mainMinimized; -} \ No newline at end of file diff --git a/modules/gui/layers/overlay.h b/modules/gui/layers/overlay.h deleted file mode 100755 index 902ce68..0000000 --- a/modules/gui/layers/overlay.h +++ /dev/null @@ -1,209 +0,0 @@ -#pragma once - -#include "engine.h" - -#include "layer.h" - -#include "sdl2Window.h" - -#include "vulkanRenderer.h" - - - - -class Overlay : public Layer { - - public: - - Overlay(); - - ~Overlay(); - - virtual void onAttach(); - - virtual void onDetach(); - - virtual void onUpdate(); - - virtual bool onEvent(const Event*); - - protected: - - virtual bool onMouseButtonPressed(const MouseButtonEvent*); - virtual bool onMouseButtonReleased(const MouseButtonEvent*); - virtual bool onMouseMoved(const MouseMovedEvent*); - virtual bool onMouseScrolled(const MouseScrolledEvent*); - virtual bool onKeyPressed(const KeyEvent*); - virtual bool onKeyReleased(const KeyEvent*); - virtual bool onKeyTyped(const KeyTypedEvent*); - - virtual bool onWindowClose(const WindowEvent*); - virtual bool onWindowFocus(const WindowEvent*); - virtual bool onWindowFocusLost(const WindowEvent*); - virtual bool onWindowMoved(const WindowEvent*); - virtual bool onWindowResize(const WindowEvent*); - - public: - - void init(); - - void shutdown(); - - void newFrame(); - - void renderPlatformWindows(); - - //template - inline int define(void** data, int(*func)(Overlay&, void**)) - { return func(*this, data); } - - void render(); - - bool isMinimized(); - - //private: - - ImDrawData* main_draw_data = nullptr; - bool mainMinimized; - - -}; - -///////////////////////////////////////////// -static ImGuiKey ImGui_ImplSDL2_KeyEventToImGuiKey(SDL_Keycode keycode, SDL_Scancode scancode) -{ - IM_UNUSED(scancode); - switch (keycode) - { - case SDLK_TAB: return ImGuiKey_Tab; - case SDLK_LEFT: return ImGuiKey_LeftArrow; - case SDLK_RIGHT: return ImGuiKey_RightArrow; - case SDLK_UP: return ImGuiKey_UpArrow; - case SDLK_DOWN: return ImGuiKey_DownArrow; - case SDLK_PAGEUP: return ImGuiKey_PageUp; - case SDLK_PAGEDOWN: return ImGuiKey_PageDown; - case SDLK_HOME: return ImGuiKey_Home; - case SDLK_END: return ImGuiKey_End; - case SDLK_INSERT: return ImGuiKey_Insert; - case SDLK_DELETE: return ImGuiKey_Delete; - case SDLK_BACKSPACE: return ImGuiKey_Backspace; - case SDLK_SPACE: return ImGuiKey_Space; - case SDLK_RETURN: return ImGuiKey_Enter; - case SDLK_ESCAPE: return ImGuiKey_Escape; - case SDLK_QUOTE: return ImGuiKey_Apostrophe; - case SDLK_COMMA: return ImGuiKey_Comma; - case SDLK_MINUS: return ImGuiKey_Minus; - case SDLK_PERIOD: return ImGuiKey_Period; - case SDLK_SLASH: return ImGuiKey_Slash; - case SDLK_SEMICOLON: return ImGuiKey_Semicolon; - case SDLK_EQUALS: return ImGuiKey_Equal; - case SDLK_LEFTBRACKET: return ImGuiKey_LeftBracket; - case SDLK_BACKSLASH: return ImGuiKey_Backslash; - case SDLK_RIGHTBRACKET: return ImGuiKey_RightBracket; - case SDLK_BACKQUOTE: return ImGuiKey_GraveAccent; - case SDLK_CAPSLOCK: return ImGuiKey_CapsLock; - case SDLK_SCROLLLOCK: return ImGuiKey_ScrollLock; - case SDLK_NUMLOCKCLEAR: return ImGuiKey_NumLock; - case SDLK_PRINTSCREEN: return ImGuiKey_PrintScreen; - case SDLK_PAUSE: return ImGuiKey_Pause; - case SDLK_KP_0: return ImGuiKey_Keypad0; - case SDLK_KP_1: return ImGuiKey_Keypad1; - case SDLK_KP_2: return ImGuiKey_Keypad2; - case SDLK_KP_3: return ImGuiKey_Keypad3; - case SDLK_KP_4: return ImGuiKey_Keypad4; - case SDLK_KP_5: return ImGuiKey_Keypad5; - case SDLK_KP_6: return ImGuiKey_Keypad6; - case SDLK_KP_7: return ImGuiKey_Keypad7; - case SDLK_KP_8: return ImGuiKey_Keypad8; - case SDLK_KP_9: return ImGuiKey_Keypad9; - case SDLK_KP_PERIOD: return ImGuiKey_KeypadDecimal; - case SDLK_KP_DIVIDE: return ImGuiKey_KeypadDivide; - case SDLK_KP_MULTIPLY: return ImGuiKey_KeypadMultiply; - case SDLK_KP_MINUS: return ImGuiKey_KeypadSubtract; - case SDLK_KP_PLUS: return ImGuiKey_KeypadAdd; - case SDLK_KP_ENTER: return ImGuiKey_KeypadEnter; - case SDLK_KP_EQUALS: return ImGuiKey_KeypadEqual; - case SDLK_LCTRL: return ImGuiKey_LeftCtrl; - case SDLK_LSHIFT: return ImGuiKey_LeftShift; - case SDLK_LALT: return ImGuiKey_LeftAlt; - case SDLK_LGUI: return ImGuiKey_LeftSuper; - case SDLK_RCTRL: return ImGuiKey_RightCtrl; - case SDLK_RSHIFT: return ImGuiKey_RightShift; - case SDLK_RALT: return ImGuiKey_RightAlt; - case SDLK_RGUI: return ImGuiKey_RightSuper; - case SDLK_APPLICATION: return ImGuiKey_Menu; - case SDLK_0: return ImGuiKey_0; - case SDLK_1: return ImGuiKey_1; - case SDLK_2: return ImGuiKey_2; - case SDLK_3: return ImGuiKey_3; - case SDLK_4: return ImGuiKey_4; - case SDLK_5: return ImGuiKey_5; - case SDLK_6: return ImGuiKey_6; - case SDLK_7: return ImGuiKey_7; - case SDLK_8: return ImGuiKey_8; - case SDLK_9: return ImGuiKey_9; - case SDLK_a: return ImGuiKey_A; - case SDLK_b: return ImGuiKey_B; - case SDLK_c: return ImGuiKey_C; - case SDLK_d: return ImGuiKey_D; - case SDLK_e: return ImGuiKey_E; - case SDLK_f: return ImGuiKey_F; - case SDLK_g: return ImGuiKey_G; - case SDLK_h: return ImGuiKey_H; - case SDLK_i: return ImGuiKey_I; - case SDLK_j: return ImGuiKey_J; - case SDLK_k: return ImGuiKey_K; - case SDLK_l: return ImGuiKey_L; - case SDLK_m: return ImGuiKey_M; - case SDLK_n: return ImGuiKey_N; - case SDLK_o: return ImGuiKey_O; - case SDLK_p: return ImGuiKey_P; - case SDLK_q: return ImGuiKey_Q; - case SDLK_r: return ImGuiKey_R; - case SDLK_s: return ImGuiKey_S; - case SDLK_t: return ImGuiKey_T; - case SDLK_u: return ImGuiKey_U; - case SDLK_v: return ImGuiKey_V; - case SDLK_w: return ImGuiKey_W; - case SDLK_x: return ImGuiKey_X; - case SDLK_y: return ImGuiKey_Y; - case SDLK_z: return ImGuiKey_Z; - case SDLK_F1: return ImGuiKey_F1; - case SDLK_F2: return ImGuiKey_F2; - case SDLK_F3: return ImGuiKey_F3; - case SDLK_F4: return ImGuiKey_F4; - case SDLK_F5: return ImGuiKey_F5; - case SDLK_F6: return ImGuiKey_F6; - case SDLK_F7: return ImGuiKey_F7; - case SDLK_F8: return ImGuiKey_F8; - case SDLK_F9: return ImGuiKey_F9; - case SDLK_F10: return ImGuiKey_F10; - case SDLK_F11: return ImGuiKey_F11; - case SDLK_F12: return ImGuiKey_F12; - case SDLK_F13: return ImGuiKey_F13; - case SDLK_F14: return ImGuiKey_F14; - case SDLK_F15: return ImGuiKey_F15; - case SDLK_F16: return ImGuiKey_F16; - case SDLK_F17: return ImGuiKey_F17; - case SDLK_F18: return ImGuiKey_F18; - case SDLK_F19: return ImGuiKey_F19; - case SDLK_F20: return ImGuiKey_F20; - case SDLK_F21: return ImGuiKey_F21; - case SDLK_F22: return ImGuiKey_F22; - case SDLK_F23: return ImGuiKey_F23; - case SDLK_F24: return ImGuiKey_F24; - case SDLK_AC_BACK: return ImGuiKey_AppBack; - case SDLK_AC_FORWARD: return ImGuiKey_AppForward; - default: break; - } - return ImGuiKey_None; -} - -static void ImGui_ImplSDL2_UpdateKeyModifiers(SDL_Keymod sdl_key_mods) -{ - ImGuiIO& io = ImGui::GetIO(); - io.AddKeyEvent(ImGuiMod_Ctrl, (sdl_key_mods & KMOD_CTRL) != 0); - io.AddKeyEvent(ImGuiMod_Shift, (sdl_key_mods & KMOD_SHIFT) != 0); - io.AddKeyEvent(ImGuiMod_Alt, (sdl_key_mods & KMOD_ALT) != 0); - io.AddKeyEvent(ImGuiMod_Super, (sdl_key_mods & KMOD_GUI) != 0); -} diff --git a/modules/gui/renderer/vulkanRenderer.cpp b/modules/gui/renderer/vulkanRenderer.cpp deleted file mode 100755 index f677543..0000000 --- a/modules/gui/renderer/vulkanRenderer.cpp +++ /dev/null @@ -1,1469 +0,0 @@ -#include "vulkanRenderer.h" -#include "application.h" - - -#define STB_IMAGE_IMPLEMENTATION -#include - -#define TINYOBJLOADER_IMPLEMENTATION -#include - - -Renderer::Renderer() { - -} - -Renderer::~Renderer() { - -} - - -void Renderer::init() { - - createInstance(); - createSurface(); - pickPhysicalDevice(); - createLogicalDevice(); - createSwapChain(); - createImageViews(); - createRenderPass(); - createDescriptorSetLayout(); - createGraphicsPipeline(); - createCommandPool(); - createDepthResources(); - createFramebuffers(); - createTextureImage(); - createTextureImageView(); - createTextureSampler(); - //loadModel(); - createVertexBuffer(); - createIndexBuffer(); - createUniformBuffers(); - createDescriptorPool(); - createDescriptorSets(); - createCommandBuffer(); - createSyncObjects(); -} - -void Renderer::shutdown() { - - vkDeviceWaitIdle(device); - - for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) { - vkDestroySemaphore(device, renderFinishedSemaphores[i], nullptr); - vkDestroySemaphore(device, imageAvailableSemaphores[i], nullptr); - vkDestroyFence(device, inFlightFences[i], nullptr); - } - vkDestroyCommandPool(device, commandPool, nullptr); - - cleanupSwapChain(); - - vkDestroySampler(device, textureSampler, nullptr); - vkDestroyImageView(device, textureImageView, nullptr); - vkDestroyImage(device, textureImage, nullptr); - vkFreeMemory(device, textureImageMemory, nullptr); - - for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) { - vkDestroyBuffer(device, uniformBuffers[i], nullptr); - vkFreeMemory(device, uniformBuffersMemory[i], nullptr); - } - - vkDestroyDescriptorPool(device, descriptorPool, nullptr); - - vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); - - vkDestroyBuffer(device, indexBuffer, nullptr); - vkFreeMemory(device, indexBufferMemory, nullptr); - - vkDestroyBuffer(device, vertexBuffer, nullptr); - vkFreeMemory(device, vertexBufferMemory, nullptr); - - vkDestroyPipeline(device, graphicsPipeline, nullptr); - vkDestroyPipelineLayout(device, pipelineLayout, nullptr); - vkDestroyRenderPass(device, renderPass, nullptr); - - vkDestroyDevice(device, nullptr); - vkDestroySurfaceKHR(instance, surface, nullptr); - vkDestroyInstance(instance, nullptr); - -} - -uint32_t Renderer::getQueueFamily() { - QueueFamilyIndices queueFamilyIndices = findQueueFamilies(physicalDevice); - return queueFamilyIndices.graphicsFamily.value(); -} - -void Renderer::draw() { - - - vkWaitForFences(device, 1, &inFlightFences[currentFrame], VK_TRUE, UINT64_MAX); - - uint32_t imageIndex; - err = vkAcquireNextImageKHR(device, swapChain, UINT64_MAX, imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex); - - if (err == VK_ERROR_OUT_OF_DATE_KHR) { - recreateSwapChain(); - return; - } else if (err != VK_SUCCESS && err != VK_SUBOPTIMAL_KHR) { - throw std::runtime_error("failed to acquire swap chain image!"); - } - - vkResetCommandBuffer(commandBuffers[currentFrame], 0); - - - updateUniformBuffer(currentFrame); - - recordCommandBuffer(commandBuffers[currentFrame], imageIndex); - - vkResetFences(device, 1, &inFlightFences[currentFrame]); - - VkSubmitInfo submitInfo{}; - submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - - VkSemaphore waitSemaphores[] = {imageAvailableSemaphores[currentFrame]}; - VkPipelineStageFlags waitStages[] = {VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT}; - submitInfo.waitSemaphoreCount = 1; - submitInfo.pWaitSemaphores = waitSemaphores; - submitInfo.pWaitDstStageMask = waitStages; - submitInfo.commandBufferCount = 1; - submitInfo.pCommandBuffers = &commandBuffers[currentFrame]; - - - VkSemaphore signalSemaphores[] = {renderFinishedSemaphores[currentFrame]}; - submitInfo.signalSemaphoreCount = 1; - submitInfo.pSignalSemaphores = signalSemaphores; - - if (vkQueueSubmit(graphicsQueue, 1, &submitInfo, inFlightFences[currentFrame]) != VK_SUCCESS) { - throw std::runtime_error("failed to submit draw command buffer!"); - } - - VkPresentInfoKHR presentInfo{}; - presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; - - presentInfo.waitSemaphoreCount = 1; - presentInfo.pWaitSemaphores = signalSemaphores; - - VkSwapchainKHR swapChains[] = {swapChain}; - presentInfo.swapchainCount = 1; - presentInfo.pSwapchains = swapChains; - presentInfo.pImageIndices = &imageIndex; - presentInfo.pResults = nullptr; // Optional - - err = vkQueuePresentKHR(presentQueue, &presentInfo); - - if (err == VK_ERROR_OUT_OF_DATE_KHR || err == VK_SUBOPTIMAL_KHR) { - recreateSwapChain(); - } else if (err != VK_SUCCESS) { - throw std::runtime_error("failed to present swap chain image!"); - } - - currentFrame = (currentFrame + 1) % MAX_FRAMES_IN_FLIGHT; -} - -void Renderer::createInstance() { - VkApplicationInfo appInfo{}; - appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; - appInfo.pApplicationName = App::Get().getWindow().title.c_str(); - appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0); - appInfo.pEngineName = "No Engine"; - appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0); - appInfo.apiVersion = VK_API_VERSION_1_0; - - VkInstanceCreateInfo createInfo{}; - createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; - createInfo.pApplicationInfo = &appInfo; - - uint32_t extensionCount = 0; - - vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr); - - std::vector properties(extensionCount); - - const char** extensions = new const char*[extensionCount]; - - err = vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, properties.data()); - - check_vk_result(); - - for(int i = 0; i < extensionCount; i++) { - extensions[i] = properties.at(i).extensionName; - } - - createInfo.enabledExtensionCount = extensionCount; - createInfo.ppEnabledExtensionNames = extensions; - - createInfo.enabledLayerCount = 0; - - err = vkCreateInstance(&createInfo, nullptr, &instance); - check_vk_result(); -} - -void Renderer::pickPhysicalDevice() { - - uint32_t deviceCount = 0; - vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr); - - if (deviceCount == 0) { - throw std::runtime_error("failed to find GPUs with Vulkan support!"); - } - - std::vector devices(deviceCount); - vkEnumeratePhysicalDevices(instance, &deviceCount, devices.data()); - - for (const auto& device : devices) { - if (isDeviceSuitable(device)) { - physicalDevice = device; - msaaSamples = getMaxUsableSampleCount(); - break; - } - } - - if (physicalDevice == VK_NULL_HANDLE) { - throw std::runtime_error("failed to find a suitable GPU!"); - } -} - -void Renderer::createLogicalDevice() { - - QueueFamilyIndices indices = findQueueFamilies(physicalDevice); - - std::vector queueCreateInfos; - std::set uniqueQueueFamilies = {indices.graphicsFamily.value(), indices.presentFamily.value()}; - - float queuePriority = 1.0f; - for (uint32_t queueFamily : uniqueQueueFamilies) { - VkDeviceQueueCreateInfo queueCreateInfo{}; - queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; - queueCreateInfo.queueFamilyIndex = queueFamily; - queueCreateInfo.queueCount = 1; - queueCreateInfo.pQueuePriorities = &queuePriority; - queueCreateInfos.push_back(queueCreateInfo); - } - - - VkPhysicalDeviceFeatures deviceFeatures{}; - deviceFeatures.samplerAnisotropy = VK_TRUE; - - VkDeviceCreateInfo createInfo{}; - createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; - - createInfo.queueCreateInfoCount = static_cast(queueCreateInfos.size()); - createInfo.pQueueCreateInfos = queueCreateInfos.data(); - - createInfo.pEnabledFeatures = &deviceFeatures; - - createInfo.enabledExtensionCount = static_cast(deviceExtensions.size()); - createInfo.ppEnabledExtensionNames = deviceExtensions.data(); - - //something about validation layers? - createInfo.enabledLayerCount = 0; - - - if (vkCreateDevice(physicalDevice, &createInfo, nullptr, &device) != VK_SUCCESS) { - throw std::runtime_error("failed to create logical device!"); - } - - vkGetDeviceQueue(device, indices.graphicsFamily.value(), 0, &graphicsQueue); - vkGetDeviceQueue(device, indices.presentFamily.value(), 0, &presentQueue); -} - -void Renderer::createSurface() { - - Window& window = App::Get().getWindow(); - - if (SDL_Vulkan_CreateSurface(window, instance, &surface) == 0) - { - throw std::runtime_error("Failed to create Vulkan surface.\n"); - } -} - -void Renderer::createSwapChain() { - - SwapChainSupportDetails swapChainSupport = querySwapChainSupport(physicalDevice); - - VkSurfaceFormatKHR surfaceFormat = chooseSwapSurfaceFormat(swapChainSupport.formats); - VkPresentModeKHR presentMode = chooseSwapPresentMode(swapChainSupport.presentModes); - VkExtent2D extent = chooseSwapExtent(swapChainSupport.capabilities); - - swapChainImageFormat = surfaceFormat.format; - swapChainExtent = extent; - - uint32_t imageCount = swapChainSupport.capabilities.minImageCount + 1; - - if (swapChainSupport.capabilities.maxImageCount > 0 && imageCount > swapChainSupport.capabilities.maxImageCount) { - imageCount = swapChainSupport.capabilities.maxImageCount; - } - - VkSwapchainCreateInfoKHR createInfo{}; - createInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; - createInfo.surface = surface; - - createInfo.minImageCount = imageCount; - createInfo.imageFormat = surfaceFormat.format; - createInfo.imageColorSpace = surfaceFormat.colorSpace; - createInfo.imageExtent = extent; - createInfo.imageArrayLayers = 1; - createInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; - - QueueFamilyIndices indices = findQueueFamilies(physicalDevice); - uint32_t queueFamilyIndices[] = {indices.graphicsFamily.value(), indices.presentFamily.value()}; - - if (indices.graphicsFamily != indices.presentFamily) { - createInfo.imageSharingMode = VK_SHARING_MODE_CONCURRENT; - createInfo.queueFamilyIndexCount = 2; - createInfo.pQueueFamilyIndices = queueFamilyIndices; - } else { - createInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE; - createInfo.queueFamilyIndexCount = 0; // Optional - createInfo.pQueueFamilyIndices = nullptr; // Optional - } - - createInfo.preTransform = swapChainSupport.capabilities.currentTransform; - createInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; - createInfo.presentMode = presentMode; - createInfo.clipped = VK_TRUE; - createInfo.oldSwapchain = VK_NULL_HANDLE; - - if (vkCreateSwapchainKHR(device, &createInfo, nullptr, &swapChain) != VK_SUCCESS) { - throw std::runtime_error("failed to create swap chain!"); - } - - vkGetSwapchainImagesKHR(device, swapChain, &imageCount, nullptr); - swapChainImages.resize(imageCount); - vkGetSwapchainImagesKHR(device, swapChain, &imageCount, swapChainImages.data()); -} - -void Renderer::createImageViews() { - swapChainImageViews.resize(swapChainImages.size()); - - for (uint32_t i = 0; i < swapChainImages.size(); i++) { - swapChainImageViews[i] = createImageView(swapChainImages[i], swapChainImageFormat, VK_IMAGE_ASPECT_COLOR_BIT); - } -} - -void Renderer::createDescriptorPool() { - std::array poolSizes{}; - poolSizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - poolSizes[0].descriptorCount = static_cast(MAX_FRAMES_IN_FLIGHT); - poolSizes[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - poolSizes[1].descriptorCount = static_cast(MAX_FRAMES_IN_FLIGHT) * 2; - - VkDescriptorPoolCreateInfo poolInfo{}; - poolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; - poolInfo.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; - poolInfo.poolSizeCount = static_cast(poolSizes.size()); - poolInfo.pPoolSizes = poolSizes.data(); - poolInfo.maxSets = static_cast(MAX_FRAMES_IN_FLIGHT) * 2; - - if (vkCreateDescriptorPool(device, &poolInfo, nullptr, &descriptorPool) != VK_SUCCESS) { - throw std::runtime_error("failed to create descriptor pool!"); - } -} - -void Renderer::createDescriptorSets() { - std::vector layouts(MAX_FRAMES_IN_FLIGHT, descriptorSetLayout); - VkDescriptorSetAllocateInfo allocInfo{}; - allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - allocInfo.descriptorPool = descriptorPool; - allocInfo.descriptorSetCount = static_cast(MAX_FRAMES_IN_FLIGHT); - allocInfo.pSetLayouts = layouts.data(); - - descriptorSets.resize(MAX_FRAMES_IN_FLIGHT); - if (vkAllocateDescriptorSets(device, &allocInfo, descriptorSets.data()) != VK_SUCCESS) { - throw std::runtime_error("failed to allocate descriptor sets!"); - } - - for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) { - VkDescriptorBufferInfo bufferInfo{}; - bufferInfo.buffer = uniformBuffers[i]; - bufferInfo.offset = 0; - bufferInfo.range = sizeof(UniformBufferObject); - - VkDescriptorImageInfo imageInfo{}; - imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - imageInfo.imageView = textureImageView; - imageInfo.sampler = textureSampler; - - std::array descriptorWrites{}; - - descriptorWrites[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - descriptorWrites[0].dstSet = descriptorSets[i]; - descriptorWrites[0].dstBinding = 0; - descriptorWrites[0].dstArrayElement = 0; - descriptorWrites[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - descriptorWrites[0].descriptorCount = 1; - descriptorWrites[0].pBufferInfo = &bufferInfo; - - descriptorWrites[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - descriptorWrites[1].dstSet = descriptorSets[i]; - descriptorWrites[1].dstBinding = 1; - descriptorWrites[1].dstArrayElement = 0; - descriptorWrites[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - descriptorWrites[1].descriptorCount = 1; - descriptorWrites[1].pImageInfo = &imageInfo; - - vkUpdateDescriptorSets(device, static_cast(descriptorWrites.size()), descriptorWrites.data(), 0, nullptr); - } -} - -void Renderer::createDescriptorSetLayout() { - VkDescriptorSetLayoutBinding uboLayoutBinding{}; - uboLayoutBinding.binding = 0; - uboLayoutBinding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - uboLayoutBinding.descriptorCount = 1; - uboLayoutBinding.stageFlags = VK_SHADER_STAGE_VERTEX_BIT; - uboLayoutBinding.pImmutableSamplers = nullptr; // Optional - - VkDescriptorSetLayoutBinding samplerLayoutBinding{}; - samplerLayoutBinding.binding = 1; - samplerLayoutBinding.descriptorCount = 1; - samplerLayoutBinding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - samplerLayoutBinding.pImmutableSamplers = nullptr; - samplerLayoutBinding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; - - std::array bindings = {uboLayoutBinding, samplerLayoutBinding}; - VkDescriptorSetLayoutCreateInfo layoutInfo{}; - layoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - layoutInfo.bindingCount = static_cast(bindings.size()); - layoutInfo.pBindings = bindings.data(); - - - if (vkCreateDescriptorSetLayout(device, &layoutInfo, nullptr, &descriptorSetLayout) != VK_SUCCESS) { - throw std::runtime_error("failed to create descriptor set layout!"); - } -} - -void Renderer::createGraphicsPipeline() { - - #ifdef SHDR_PATH - auto vertShaderCode = readFile(STRINGIZE_VALUE_OF(SHDR_PATH/vert.spv)); - auto fragShaderCode = readFile(STRINGIZE_VALUE_OF(SHDR_PATH/frag.spv)); - #else - auto vertShaderCode = readFile("result/bin/vert.spv"); - auto fragShaderCode = readFile("result/bin/frag.spv"); - #endif - - VkShaderModule vertShaderModule = createShaderModule(vertShaderCode); - VkShaderModule fragShaderModule = createShaderModule(fragShaderCode); - - VkPipelineShaderStageCreateInfo vertShaderStageInfo{}; - vertShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; - vertShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT; - - vertShaderStageInfo.module = vertShaderModule; - vertShaderStageInfo.pName = "main"; - - VkPipelineShaderStageCreateInfo fragShaderStageInfo{}; - fragShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; - fragShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT; - fragShaderStageInfo.module = fragShaderModule; - fragShaderStageInfo.pName = "main"; - - VkPipelineShaderStageCreateInfo shaderStages[] = {vertShaderStageInfo, fragShaderStageInfo}; - - auto bindingDescription = Vertex::getBindingDescription(); - auto attributeDescriptions = Vertex::getAttributeDescriptions(); - - VkPipelineVertexInputStateCreateInfo vertexInputInfo{}; - vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; - vertexInputInfo.vertexBindingDescriptionCount = 1; - vertexInputInfo.vertexAttributeDescriptionCount = static_cast(attributeDescriptions.size()); - vertexInputInfo.pVertexBindingDescriptions = &bindingDescription; - vertexInputInfo.pVertexAttributeDescriptions = attributeDescriptions.data(); - - VkPipelineDepthStencilStateCreateInfo depthStencil{}; - depthStencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; - depthStencil.depthTestEnable = VK_TRUE; - depthStencil.depthWriteEnable = VK_TRUE; - depthStencil.depthCompareOp = VK_COMPARE_OP_LESS; - depthStencil.depthBoundsTestEnable = VK_FALSE; - depthStencil.minDepthBounds = 0.0f; // Optional - depthStencil.maxDepthBounds = 1.0f; // Optional - depthStencil.stencilTestEnable = VK_FALSE; - depthStencil.front = {}; // Optional - depthStencil.back = {}; // Optional - - VkPipelineInputAssemblyStateCreateInfo inputAssembly{}; - inputAssembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; - inputAssembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; - inputAssembly.primitiveRestartEnable = VK_FALSE; - - VkViewport viewport{}; - viewport.x = 0.0f; - viewport.y = 0.0f; - viewport.width = (float) swapChainExtent.width; - viewport.height = (float) swapChainExtent.height; - viewport.minDepth = 0.0f; - viewport.maxDepth = 1.0f; - - VkRect2D scissor{}; - scissor.offset = {0, 0}; - scissor.extent = swapChainExtent; - - VkPipelineViewportStateCreateInfo viewportState{}; - viewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; - viewportState.viewportCount = 1; - viewportState.pViewports = &viewport; - viewportState.scissorCount = 1; - viewportState.pScissors = &scissor; - - VkPipelineRasterizationStateCreateInfo rasterizer{}; - rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; - rasterizer.depthClampEnable = VK_FALSE; - rasterizer.rasterizerDiscardEnable = VK_FALSE; - rasterizer.polygonMode = VK_POLYGON_MODE_FILL; - rasterizer.lineWidth = 1.0f; - rasterizer.cullMode = VK_CULL_MODE_BACK_BIT; - rasterizer.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; - rasterizer.depthBiasEnable = VK_FALSE; - rasterizer.depthBiasConstantFactor = 0.0f; // Optional - rasterizer.depthBiasClamp = 0.0f; // Optional - rasterizer.depthBiasSlopeFactor = 0.0f; // Optional - - VkPipelineMultisampleStateCreateInfo multisampling{}; - multisampling.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; - multisampling.sampleShadingEnable = VK_FALSE; - multisampling.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; - multisampling.minSampleShading = 1.0f; // Optional - multisampling.pSampleMask = nullptr; // Optional - multisampling.alphaToCoverageEnable = VK_FALSE; // Optional - multisampling.alphaToOneEnable = VK_FALSE; // Optional - - VkPipelineColorBlendAttachmentState colorBlendAttachment{}; - colorBlendAttachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; - colorBlendAttachment.blendEnable = VK_FALSE; - colorBlendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_ONE; // Optional - colorBlendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ZERO; // Optional - colorBlendAttachment.colorBlendOp = VK_BLEND_OP_ADD; // Optional - colorBlendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE; // Optional - colorBlendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; // Optional - colorBlendAttachment.alphaBlendOp = VK_BLEND_OP_ADD; // Optional - - VkPipelineColorBlendStateCreateInfo colorBlending{}; - colorBlending.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; - colorBlending.logicOpEnable = VK_FALSE; - colorBlending.logicOp = VK_LOGIC_OP_COPY; // Optional - colorBlending.attachmentCount = 1; - colorBlending.pAttachments = &colorBlendAttachment; - colorBlending.blendConstants[0] = 0.0f; // Optional - colorBlending.blendConstants[1] = 0.0f; // Optional - colorBlending.blendConstants[2] = 0.0f; // Optional - colorBlending.blendConstants[3] = 0.0f; // Optional - - VkPipelineLayoutCreateInfo pipelineLayoutInfo{}; - pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; - pipelineLayoutInfo.setLayoutCount = 1; - pipelineLayoutInfo.pSetLayouts = &descriptorSetLayout; - pipelineLayoutInfo.pushConstantRangeCount = 0; // Optional - pipelineLayoutInfo.pPushConstantRanges = nullptr; // Optional - - if (vkCreatePipelineLayout(device, &pipelineLayoutInfo, nullptr, &pipelineLayout) != VK_SUCCESS) { - throw std::runtime_error("failed to create pipeline layout!"); - } - - std::vector dynamicStates = { - VK_DYNAMIC_STATE_VIEWPORT, - VK_DYNAMIC_STATE_SCISSOR - }; - - VkPipelineDynamicStateCreateInfo dynamicState{}; - dynamicState.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; - dynamicState.dynamicStateCount = static_cast(dynamicStates.size()); - dynamicState.pDynamicStates = dynamicStates.data(); - - VkGraphicsPipelineCreateInfo pipelineInfo{}; - pipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; - pipelineInfo.stageCount = 2; - pipelineInfo.pStages = shaderStages; - pipelineInfo.pVertexInputState = &vertexInputInfo; - pipelineInfo.pInputAssemblyState = &inputAssembly; - pipelineInfo.pViewportState = &viewportState; - pipelineInfo.pRasterizationState = &rasterizer; - pipelineInfo.pMultisampleState = &multisampling; - pipelineInfo.pDepthStencilState = nullptr; // Optional - pipelineInfo.pColorBlendState = &colorBlending; - pipelineInfo.pDynamicState = &dynamicState; - pipelineInfo.layout = pipelineLayout; - pipelineInfo.renderPass = renderPass; - pipelineInfo.subpass = 0; - pipelineInfo.basePipelineHandle = VK_NULL_HANDLE; // Optional - pipelineInfo.basePipelineIndex = -1; // Optional - pipelineInfo.pDepthStencilState = &depthStencil; - - if (vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, &graphicsPipeline) != VK_SUCCESS) { - throw std::runtime_error("failed to create graphics pipeline!"); - } - - vkDestroyShaderModule(device, fragShaderModule, nullptr); - vkDestroyShaderModule(device, vertShaderModule, nullptr); -} - -void Renderer::createRenderPass() { - VkAttachmentDescription depthAttachment{}; - depthAttachment.format = findDepthFormat(); - depthAttachment.samples = VK_SAMPLE_COUNT_1_BIT; - depthAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; - depthAttachment.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - depthAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - depthAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - depthAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - depthAttachment.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - - VkAttachmentReference depthAttachmentRef{}; - depthAttachmentRef.attachment = 1; - depthAttachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; - - - VkAttachmentDescription colorAttachment{}; - colorAttachment.format = swapChainImageFormat; - colorAttachment.samples = VK_SAMPLE_COUNT_1_BIT; - colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; - colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; - colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - colorAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - colorAttachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; - - VkAttachmentReference colorAttachmentRef{}; - colorAttachmentRef.attachment = 0; - colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - - VkSubpassDescription subpass{}; - subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; - subpass.colorAttachmentCount = 1; - subpass.pColorAttachments = &colorAttachmentRef; - subpass.pDepthStencilAttachment = &depthAttachmentRef; - - std::array attachments = {colorAttachment, depthAttachment}; - VkRenderPassCreateInfo renderPassInfo{}; - renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; - renderPassInfo.attachmentCount = static_cast(attachments.size()); - renderPassInfo.pAttachments = attachments.data(); - renderPassInfo.subpassCount = 1; - renderPassInfo.pSubpasses = &subpass; - - - VkSubpassDependency dependency{}; - dependency.srcSubpass = VK_SUBPASS_EXTERNAL; - dependency.dstSubpass = 0; - dependency.srcAccessMask = 0; - dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT; - dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT; - dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; - - renderPassInfo.dependencyCount = 1; - renderPassInfo.pDependencies = &dependency; - - if (vkCreateRenderPass(device, &renderPassInfo, nullptr, &renderPass) != VK_SUCCESS) { - throw std::runtime_error("failed to create render pass!"); - } -} - -void Renderer::createFramebuffers() { - swapChainFramebuffers.resize(swapChainImageViews.size()); - - for (size_t i = 0; i < swapChainImageViews.size(); i++) { - std::vector attachments = { - swapChainImageViews[i], - depthImageView - }; - - VkFramebufferCreateInfo framebufferInfo{}; - framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; - framebufferInfo.renderPass = renderPass; - framebufferInfo.attachmentCount = static_cast(attachments.size()); - framebufferInfo.pAttachments = attachments.data(); - framebufferInfo.width = swapChainExtent.width; - framebufferInfo.height = swapChainExtent.height; - framebufferInfo.layers = 1; - - if (vkCreateFramebuffer(device, &framebufferInfo, nullptr, &swapChainFramebuffers[i]) != VK_SUCCESS) { - throw std::runtime_error("failed to create framebuffer!"); - } - } -} - -void Renderer::createCommandPool() { - QueueFamilyIndices queueFamilyIndices = findQueueFamilies(physicalDevice); - - VkCommandPoolCreateInfo poolInfo{}; - poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; - poolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; - poolInfo.queueFamilyIndex = queueFamilyIndices.graphicsFamily.value(); - - if (vkCreateCommandPool(device, &poolInfo, nullptr, &commandPool) != VK_SUCCESS) { - throw std::runtime_error("failed to create command pool!"); - } -} - -void Renderer::createCommandBuffer() { - commandBuffers.resize(MAX_FRAMES_IN_FLIGHT); - - VkCommandBufferAllocateInfo allocInfo{}; - allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; - allocInfo.commandPool = commandPool; - allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; - allocInfo.commandBufferCount = (uint32_t) commandBuffers.size(); - - if (vkAllocateCommandBuffers(device, &allocInfo, commandBuffers.data()) != VK_SUCCESS) { - throw std::runtime_error("failed to allocate command buffers!"); - } -} - -void Renderer::recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex) { - VkCommandBufferBeginInfo beginInfo{}; - beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - beginInfo.pInheritanceInfo = nullptr; // Optional - - if (vkBeginCommandBuffer(commandBuffer, &beginInfo) != VK_SUCCESS) { - throw std::runtime_error("failed to begin recording command buffer!"); - } - - VkRenderPassBeginInfo renderPassInfo{}; - renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; - renderPassInfo.renderPass = renderPass; - - renderPassInfo.framebuffer = swapChainFramebuffers[imageIndex]; - - renderPassInfo.renderArea.offset = {0, 0}; - renderPassInfo.renderArea.extent = swapChainExtent; - - std::array clearValues{}; - clearValues[0].color = {{0.0f, 0.0f, 0.0f, 1.0f}}; - clearValues[1].depthStencil = {1.0f, 0}; - - renderPassInfo.clearValueCount = static_cast(clearValues.size()); - renderPassInfo.pClearValues = clearValues.data(); - - vkCmdBeginRenderPass(commandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE); - - vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline); - - - VkViewport viewport{}; - viewport.x = 0.0f; - viewport.y = 0.0f; - viewport.width = static_cast(swapChainExtent.width); - viewport.height = static_cast(swapChainExtent.height); - viewport.minDepth = 0.0f; - viewport.maxDepth = 1.0f; - vkCmdSetViewport(commandBuffer, 0, 1, &viewport); - - VkRect2D scissor{}; - scissor.offset = {0, 0}; - scissor.extent = swapChainExtent; - vkCmdSetScissor(commandBuffer, 0, 1, &scissor); - - VkBuffer vertexBuffers[] = {vertexBuffer}; - VkDeviceSize offsets[] = {0}; - vkCmdBindVertexBuffers(commandBuffer, 0, 1, vertexBuffers, offsets); - - vkCmdBindIndexBuffer(commandBuffer, indexBuffer, 0, VK_INDEX_TYPE_UINT32); - - vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets[currentFrame], 0, nullptr); - - vkCmdDrawIndexed(commandBuffer, static_cast(indices.size()), 1, 0, 0, 0); - - App::Get().getLayerStack().updateLayers(); - - vkCmdEndRenderPass(commandBuffer); - - if (vkEndCommandBuffer(commandBuffer) != VK_SUCCESS) { - throw std::runtime_error("failed to record command buffer!"); - } -} - -void Renderer::createSyncObjects() { - imageAvailableSemaphores.resize(MAX_FRAMES_IN_FLIGHT); - renderFinishedSemaphores.resize(MAX_FRAMES_IN_FLIGHT); - inFlightFences.resize(MAX_FRAMES_IN_FLIGHT); - - VkSemaphoreCreateInfo semaphoreInfo{}; - semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; - - VkFenceCreateInfo fenceInfo{}; - fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; - fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT; - - for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) { - if (vkCreateSemaphore(device, &semaphoreInfo, nullptr, &imageAvailableSemaphores[i]) != VK_SUCCESS || - vkCreateSemaphore(device, &semaphoreInfo, nullptr, &renderFinishedSemaphores[i]) != VK_SUCCESS || - vkCreateFence(device, &fenceInfo, nullptr, &inFlightFences[i]) != VK_SUCCESS) { - - throw std::runtime_error("failed to create synchronization objects for a frame!"); - } - } -} - -void Renderer::createVertexBuffer() { - VkDeviceSize bufferSize = sizeof(vertices[0]) * vertices.size(); - - VkBuffer stagingBuffer; - VkDeviceMemory stagingBufferMemory; - createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, stagingBuffer, stagingBufferMemory); - - void* data; - vkMapMemory(device, stagingBufferMemory, 0, bufferSize, 0, &data); - memcpy(data, vertices.data(), (size_t) bufferSize); - vkUnmapMemory(device, stagingBufferMemory); - - createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, vertexBuffer, vertexBufferMemory); - - copyBuffer(stagingBuffer, vertexBuffer, bufferSize); - - vkDestroyBuffer(device, stagingBuffer, nullptr); - vkFreeMemory(device, stagingBufferMemory, nullptr); -} - -void Renderer::createIndexBuffer() { - VkDeviceSize bufferSize = sizeof(indices[0]) * indices.size(); - - VkBuffer stagingBuffer; - VkDeviceMemory stagingBufferMemory; - createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, stagingBuffer, stagingBufferMemory); - - void* data; - vkMapMemory(device, stagingBufferMemory, 0, bufferSize, 0, &data); - memcpy(data, indices.data(), (size_t) bufferSize); - vkUnmapMemory(device, stagingBufferMemory); - - createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, indexBuffer, indexBufferMemory); - - copyBuffer(stagingBuffer, indexBuffer, bufferSize); - - vkDestroyBuffer(device, stagingBuffer, nullptr); - vkFreeMemory(device, stagingBufferMemory, nullptr); -} - -void Renderer::createUniformBuffers() { - VkDeviceSize bufferSize = sizeof(UniformBufferObject); - - uniformBuffers.resize(MAX_FRAMES_IN_FLIGHT); - uniformBuffersMemory.resize(MAX_FRAMES_IN_FLIGHT); - uniformBuffersMapped.resize(MAX_FRAMES_IN_FLIGHT); - - for (size_t i = 0; i < MAX_FRAMES_IN_FLIGHT; i++) { - createBuffer(bufferSize, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, uniformBuffers[i], uniformBuffersMemory[i]); - - vkMapMemory(device, uniformBuffersMemory[i], 0, bufferSize, 0, &uniformBuffersMapped[i]); - } -} - -void Renderer::updateUniformBuffer(uint32_t currentImage) { - static auto startTime = std::chrono::high_resolution_clock::now(); - - auto currentTime = std::chrono::high_resolution_clock::now(); - float time = std::chrono::duration(currentTime - startTime).count(); - - UniformBufferObject ubo{}; - ubo.model = glm::rotate(glm::mat4(1.0f), time * glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 1.0f)); - ubo.view = glm::lookAt(glm::vec3(2.0f, 2.0f, 2.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f)); - ubo.proj = glm::perspective(glm::radians(45.0f), swapChainExtent.width / (float) swapChainExtent.height, 0.1f, 10.0f); - ubo.proj[1][1] *= -1; - memcpy(uniformBuffersMapped[currentImage], &ubo, sizeof(ubo)); -} - -void Renderer::createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory) { - VkBufferCreateInfo bufferInfo{}; - bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; - bufferInfo.size = size; - bufferInfo.usage = usage; - bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - - if (vkCreateBuffer(device, &bufferInfo, nullptr, &buffer) != VK_SUCCESS) { - throw std::runtime_error("failed to create buffer!"); - } - - VkMemoryRequirements memRequirements; - vkGetBufferMemoryRequirements(device, buffer, &memRequirements); - - VkMemoryAllocateInfo allocInfo{}; - allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; - allocInfo.allocationSize = memRequirements.size; - allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, properties); - - if (vkAllocateMemory(device, &allocInfo, nullptr, &bufferMemory) != VK_SUCCESS) { - throw std::runtime_error("failed to allocate buffer memory!"); - } - - vkBindBufferMemory(device, buffer, bufferMemory, 0); -} - - - - - - - - - - - - - -void Renderer::loadModel() { - tinyobj::attrib_t attrib; - std::vector shapes; - std::vector materials; - std::string warn, err; - - if (!tinyobj::LoadObj(&attrib, &shapes, &materials, &warn, &err, MODEL_PATH.c_str())) { - throw std::runtime_error(warn + err); - } - - for (const auto& shape : shapes) { - for (const auto& index : shape.mesh.indices) { - Vertex vertex{}; - - //vertices.push_back(vertex); - //indices.push_back(indices.size()); - - vertex.pos = { - attrib.vertices[3 * index.vertex_index + 0], - attrib.vertices[3 * index.vertex_index + 1], - attrib.vertices[3 * index.vertex_index + 2] - }; - - vertex.texCoord = { - attrib.texcoords[2 * index.texcoord_index + 0], - 1.0f - attrib.texcoords[2 * index.texcoord_index + 1] - }; - - vertex.color = {1.0f, 1.0f, 1.0f}; - } - } - -} - -bool Renderer::hasStencilComponent(VkFormat format) { - return format == VK_FORMAT_D32_SFLOAT_S8_UINT || format == VK_FORMAT_D24_UNORM_S8_UINT; -} - -VkFormat Renderer::findDepthFormat() { - return findSupportedFormat( - {VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT}, - VK_IMAGE_TILING_OPTIMAL, - VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT - ); -} - -VkFormat Renderer::findSupportedFormat(const std::vector& candidates, VkImageTiling tiling, VkFormatFeatureFlags features) { - for (VkFormat format : candidates) { - VkFormatProperties props; - vkGetPhysicalDeviceFormatProperties(physicalDevice, format, &props); - - if (tiling == VK_IMAGE_TILING_LINEAR && (props.linearTilingFeatures & features) == features) { - return format; - } else if (tiling == VK_IMAGE_TILING_OPTIMAL && (props.optimalTilingFeatures & features) == features) { - return format; - } - } - - throw std::runtime_error("failed to find supported format!"); -} - -void Renderer::createDepthResources() { - VkFormat depthFormat = findDepthFormat(); - - createImage(swapChainExtent.width, swapChainExtent.height, depthFormat, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, depthImage, depthImageMemory); - depthImageView = createImageView(depthImage, depthFormat, VK_IMAGE_ASPECT_DEPTH_BIT); - - transitionImageLayout(depthImage, depthFormat, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); -} - -void Renderer::createTextureSampler() { - - VkPhysicalDeviceProperties properties{}; - vkGetPhysicalDeviceProperties(physicalDevice, &properties); - - VkSamplerCreateInfo samplerInfo{}; - samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; - samplerInfo.magFilter = VK_FILTER_LINEAR; - samplerInfo.minFilter = VK_FILTER_LINEAR; - - samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT; - samplerInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT; - samplerInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT; - - samplerInfo.anisotropyEnable = VK_TRUE; - samplerInfo.maxAnisotropy = properties.limits.maxSamplerAnisotropy; - - samplerInfo.borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK; - - samplerInfo.unnormalizedCoordinates = VK_FALSE; - - samplerInfo.compareEnable = VK_FALSE; - samplerInfo.compareOp = VK_COMPARE_OP_ALWAYS; - - samplerInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR; - samplerInfo.mipLodBias = 0.0f; - samplerInfo.minLod = 0.0f; - samplerInfo.maxLod = 0.0f; - - if (vkCreateSampler(device, &samplerInfo, nullptr, &textureSampler) != VK_SUCCESS) { - throw std::runtime_error("failed to create texture sampler!"); - } -} - -VkImageView Renderer::createImageView(VkImage image, VkFormat format, VkImageAspectFlags aspectFlags) { - VkImageViewCreateInfo viewInfo{}; - viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; - viewInfo.image = image; - viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D; - viewInfo.format = format; - viewInfo.subresourceRange.aspectMask = aspectFlags; - viewInfo.subresourceRange.baseMipLevel = 0; - viewInfo.subresourceRange.levelCount = 1; - viewInfo.subresourceRange.baseArrayLayer = 0; - viewInfo.subresourceRange.layerCount = 1; - - VkImageView imageView; - if (vkCreateImageView(device, &viewInfo, nullptr, &imageView) != VK_SUCCESS) { - throw std::runtime_error("failed to create texture image view!"); - } - - return imageView; -} - -void Renderer::createTextureImageView() { - textureImageView = createImageView(textureImage, VK_FORMAT_R8G8B8A8_SRGB, VK_IMAGE_ASPECT_COLOR_BIT); -} - -void Renderer::copyBufferToImage(VkBuffer buffer, VkImage image, uint32_t width, uint32_t height) { - VkCommandBuffer commandBuffer = beginSingleTimeCommands(); - - VkBufferImageCopy region{}; - region.bufferOffset = 0; - region.bufferRowLength = 0; - region.bufferImageHeight = 0; - - region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - region.imageSubresource.mipLevel = 0; - region.imageSubresource.baseArrayLayer = 0; - region.imageSubresource.layerCount = 1; - - region.imageOffset = {0, 0, 0}; - region.imageExtent = { - width, - height, - 1 - }; - - vkCmdCopyBufferToImage( - commandBuffer, - buffer, - image, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 1, - ®ion - ); - - endSingleTimeCommands(commandBuffer); -} - -void Renderer::transitionImageLayout(VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout) { - VkCommandBuffer commandBuffer = beginSingleTimeCommands(); - - VkImageMemoryBarrier barrier{}; - barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - barrier.oldLayout = oldLayout; - barrier.newLayout = newLayout; - barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.image = image; - barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - barrier.subresourceRange.baseMipLevel = 0; - barrier.subresourceRange.levelCount = 1; - barrier.subresourceRange.baseArrayLayer = 0; - barrier.subresourceRange.layerCount = 1; - barrier.srcAccessMask = 0; // TODO - barrier.dstAccessMask = 0; // TODO - - VkPipelineStageFlags sourceStage; - VkPipelineStageFlags destinationStage; - - if (newLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) { - barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; - - if (hasStencilComponent(format)) { - barrier.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; - } - } else { - barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - } - - if (oldLayout == VK_IMAGE_LAYOUT_UNDEFINED && newLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) { - barrier.srcAccessMask = 0; - barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - - sourceStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; - destinationStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - } else if (oldLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL && newLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) { - barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - - sourceStage = VK_PIPELINE_STAGE_TRANSFER_BIT; - destinationStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; - } else if (oldLayout == VK_IMAGE_LAYOUT_UNDEFINED && newLayout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL) { - barrier.srcAccessMask = 0; - barrier.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; - - sourceStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; - destinationStage = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT; - } else { - throw std::invalid_argument("unsupported layout transition!"); - } - - vkCmdPipelineBarrier( - commandBuffer, - sourceStage, destinationStage, - 0, - 0, nullptr, - 0, nullptr, - 1, &barrier - ); - - - - endSingleTimeCommands(commandBuffer); - - -} - -VkCommandBuffer Renderer::beginSingleTimeCommands() { - VkCommandBufferAllocateInfo allocInfo{}; - allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; - allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; - allocInfo.commandPool = commandPool; - allocInfo.commandBufferCount = 1; - - VkCommandBuffer commandBuffer; - vkAllocateCommandBuffers(device, &allocInfo, &commandBuffer); - - VkCommandBufferBeginInfo beginInfo{}; - beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - - vkBeginCommandBuffer(commandBuffer, &beginInfo); - - return commandBuffer; -} - -void Renderer::endSingleTimeCommands(VkCommandBuffer commandBuffer) { - vkEndCommandBuffer(commandBuffer); - - VkSubmitInfo submitInfo{}; - submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - submitInfo.commandBufferCount = 1; - submitInfo.pCommandBuffers = &commandBuffer; - - vkQueueSubmit(graphicsQueue, 1, &submitInfo, VK_NULL_HANDLE); - vkQueueWaitIdle(graphicsQueue); - - vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer); -} - -void Renderer::createImage(uint32_t width, uint32_t height, VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags properties, VkImage& image, VkDeviceMemory& imageMemory) { - VkImageCreateInfo imageInfo{}; - imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; - imageInfo.imageType = VK_IMAGE_TYPE_2D; - imageInfo.extent.width = width; - imageInfo.extent.height = height; - imageInfo.extent.depth = 1; - imageInfo.mipLevels = 1; - imageInfo.arrayLayers = 1; - imageInfo.format = format; - imageInfo.tiling = tiling; - imageInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - imageInfo.usage = usage; - imageInfo.samples = VK_SAMPLE_COUNT_1_BIT; - imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - - if (vkCreateImage(device, &imageInfo, nullptr, &image) != VK_SUCCESS) { - throw std::runtime_error("failed to create image!"); - } - - VkMemoryRequirements memRequirements; - vkGetImageMemoryRequirements(device, image, &memRequirements); - - VkMemoryAllocateInfo allocInfo{}; - allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; - allocInfo.allocationSize = memRequirements.size; - allocInfo.memoryTypeIndex = findMemoryType(memRequirements.memoryTypeBits, properties); - - if (vkAllocateMemory(device, &allocInfo, nullptr, &imageMemory) != VK_SUCCESS) { - throw std::runtime_error("failed to allocate image memory!"); - } - - vkBindImageMemory(device, image, imageMemory, 0); -} - -void Renderer::createTextureImage() { - int texWidth, texHeight, texChannels; - stbi_uc* pixels = stbi_load(TEXTURE_PATH.c_str(), &texWidth, &texHeight, &texChannels, STBI_rgb_alpha); - VkDeviceSize imageSize = texWidth * texHeight * 4; - - if (!pixels) { - throw std::runtime_error("failed to load texture image!"); - } - - VkBuffer stagingBuffer; - VkDeviceMemory stagingBufferMemory; - createBuffer(imageSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, stagingBuffer, stagingBufferMemory); - - void* data; - vkMapMemory(device, stagingBufferMemory, 0, imageSize, 0, &data); - memcpy(data, pixels, static_cast(imageSize)); - vkUnmapMemory(device, stagingBufferMemory); - - stbi_image_free(pixels); - - createImage(texWidth, texHeight, VK_FORMAT_R8G8B8A8_SRGB, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, textureImage, textureImageMemory); - - transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_SRGB, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); - copyBufferToImage(stagingBuffer, textureImage, static_cast(texWidth), static_cast(texHeight)); - transitionImageLayout(textureImage, VK_FORMAT_R8G8B8A8_SRGB, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - - vkDestroyBuffer(device, stagingBuffer, nullptr); - vkFreeMemory(device, stagingBufferMemory, nullptr); -} - -VkSampleCountFlagBits Renderer::getMaxUsableSampleCount() { - VkPhysicalDeviceProperties physicalDeviceProperties; - vkGetPhysicalDeviceProperties(physicalDevice, &physicalDeviceProperties); - - VkSampleCountFlags counts = physicalDeviceProperties.limits.framebufferColorSampleCounts & physicalDeviceProperties.limits.framebufferDepthSampleCounts; - if (counts & VK_SAMPLE_COUNT_64_BIT) { return VK_SAMPLE_COUNT_64_BIT; } - if (counts & VK_SAMPLE_COUNT_32_BIT) { return VK_SAMPLE_COUNT_32_BIT; } - if (counts & VK_SAMPLE_COUNT_16_BIT) { return VK_SAMPLE_COUNT_16_BIT; } - if (counts & VK_SAMPLE_COUNT_8_BIT) { return VK_SAMPLE_COUNT_8_BIT; } - if (counts & VK_SAMPLE_COUNT_4_BIT) { return VK_SAMPLE_COUNT_4_BIT; } - if (counts & VK_SAMPLE_COUNT_2_BIT) { return VK_SAMPLE_COUNT_2_BIT; } - - return VK_SAMPLE_COUNT_1_BIT; -} - -void Renderer::copyBuffer(VkBuffer srcBuffer, VkBuffer dstBuffer, VkDeviceSize size) { - VkCommandBuffer commandBuffer = beginSingleTimeCommands(); - - VkBufferCopy copyRegion{}; - copyRegion.size = size; - vkCmdCopyBuffer(commandBuffer, srcBuffer, dstBuffer, 1, ©Region); - - endSingleTimeCommands(commandBuffer); -} - -uint32_t Renderer::findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties) { - - VkPhysicalDeviceMemoryProperties memProperties; - vkGetPhysicalDeviceMemoryProperties(physicalDevice, &memProperties); - - for (uint32_t i = 0; i < memProperties.memoryTypeCount; i++) { - if ((typeFilter & (1 << i)) && (memProperties.memoryTypes[i].propertyFlags & properties) == properties) { - return i; - } - } - - throw std::runtime_error("failed to find suitable memory type!"); -} - -void Renderer::recreateSwapChain() { - Window& window = App::Get().getWindow(); - - while (window.x == 0 || window.y == 0) { - window.getSize(); - SDL_WaitEvent(NULL); - } - - vkDeviceWaitIdle(device); - - cleanupSwapChain(); - - createSwapChain(); - createImageViews(); - createDepthResources(); - createFramebuffers(); -} - -void Renderer::cleanupSwapChain() { - - vkDestroyImageView(device, depthImageView, nullptr); - vkDestroyImage(device, depthImage, nullptr); - vkFreeMemory(device, depthImageMemory, nullptr); - - for (size_t i = 0; i < swapChainFramebuffers.size(); i++) { - vkDestroyFramebuffer(device, swapChainFramebuffers[i], nullptr); - } - - for (size_t i = 0; i < swapChainImageViews.size(); i++) { - vkDestroyImageView(device, swapChainImageViews[i], nullptr); - } - - vkDestroySwapchainKHR(device, swapChain, nullptr); -} - -VkShaderModule Renderer::createShaderModule(const std::vector& code) { - VkShaderModuleCreateInfo createInfo{}; - createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - createInfo.codeSize = code.size(); - createInfo.pCode = reinterpret_cast(code.data()); - - VkShaderModule shaderModule; - if (vkCreateShaderModule(device, &createInfo, nullptr, &shaderModule) != VK_SUCCESS) { - throw std::runtime_error("failed to create shader module!"); - } - - return shaderModule; -} - -VkExtent2D Renderer::chooseSwapExtent(const VkSurfaceCapabilitiesKHR& capabilities) { - if (capabilities.currentExtent.width != std::numeric_limits::max()) { - return capabilities.currentExtent; - } else { - Window& window = App::Get().getWindow(); - window.getSize(); - - VkExtent2D actualExtent = { - static_cast(window.x), - static_cast(window.y) - }; - - actualExtent.width = std::clamp(actualExtent.width, capabilities.minImageExtent.width, capabilities.maxImageExtent.width); - actualExtent.height = std::clamp(actualExtent.height, capabilities.minImageExtent.height, capabilities.maxImageExtent.height); - - return actualExtent; - } -} - -VkPresentModeKHR Renderer::chooseSwapPresentMode(const std::vector& availablePresentModes) { - for (const auto& availablePresentMode : availablePresentModes) { - if (availablePresentMode == VK_PRESENT_MODE_MAILBOX_KHR) { - return availablePresentMode; - } - } - - return VK_PRESENT_MODE_FIFO_KHR; -} - -VkSurfaceFormatKHR Renderer::chooseSwapSurfaceFormat(const std::vector& availableFormats) { - - for (const auto& availableFormat : availableFormats) { - if (availableFormat.format == VK_FORMAT_B8G8R8A8_UNORM && availableFormat.colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) { - return availableFormat; - } - } - - return availableFormats[0]; -} - -SwapChainSupportDetails Renderer::querySwapChainSupport(VkPhysicalDevice device) { - SwapChainSupportDetails details; - - vkGetPhysicalDeviceSurfaceCapabilitiesKHR(device, surface, &details.capabilities); - - uint32_t formatCount; - vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount, nullptr); - - if (formatCount != 0) { - details.formats.resize(formatCount); - vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount, details.formats.data()); - } - - uint32_t presentModeCount; - vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &presentModeCount, nullptr); - - if (presentModeCount != 0) { - details.presentModes.resize(presentModeCount); - vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &presentModeCount, details.presentModes.data()); - } - - - return details; -} - -bool Renderer::checkDeviceExtensionSupport(VkPhysicalDevice device) { - - uint32_t extensionCount; - vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, nullptr); - - std::vector availableExtensions(extensionCount); - vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, availableExtensions.data()); - - std::set requiredExtensions(deviceExtensions.begin(), deviceExtensions.end()); - - for (const auto& extension : availableExtensions) { - requiredExtensions.erase(extension.extensionName); - } - - return requiredExtensions.empty(); -} - -QueueFamilyIndices Renderer::findQueueFamilies(VkPhysicalDevice device) { - QueueFamilyIndices indices; - - VkBool32 presentSupport = false; - - uint32_t queueFamilyCount = 0; - vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr); - - std::vector queueFamilies(queueFamilyCount); - vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.data()); - - int i = 0; - for (const auto& queueFamily : queueFamilies) { - if (queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT) { - indices.graphicsFamily = i; - } - - vkGetPhysicalDeviceSurfaceSupportKHR(device, i, surface, &presentSupport); - - if (presentSupport) { - indices.presentFamily = i; - } - - if (indices.isComplete()) { - break; - } - - i++; - } - - return indices; -} - - -bool Renderer::isDeviceSuitable(VkPhysicalDevice device) { - - - QueueFamilyIndices indices = findQueueFamilies(device); - - bool extensionsSupported = checkDeviceExtensionSupport(device); - - bool swapChainAdequate = false; - if (extensionsSupported) { - SwapChainSupportDetails swapChainSupport = querySwapChainSupport(device); - swapChainAdequate = !swapChainSupport.formats.empty() && !swapChainSupport.presentModes.empty(); - } - - VkPhysicalDeviceFeatures supportedFeatures; - vkGetPhysicalDeviceFeatures(device, &supportedFeatures); - - return indices.isComplete() && extensionsSupported && swapChainAdequate && supportedFeatures.samplerAnisotropy; -} - -bool Renderer::isExtensionAvailable(const std::vector& properties, const char* extension) -{ - for (const VkExtensionProperties& p : properties) - if (strcmp(p.extensionName, extension) == 0) - return true; - return false; -} - -void Renderer::check_vk_result() { - if (err == 0) - return; - fprintf(stderr, "[vulkan] Error: VkResult = %d\n", err); - if (err < 0) - abort(); -} diff --git a/modules/gui/renderer/vulkanRenderer.h b/modules/gui/renderer/vulkanRenderer.h deleted file mode 100755 index 8eb51fb..0000000 --- a/modules/gui/renderer/vulkanRenderer.h +++ /dev/null @@ -1,296 +0,0 @@ -#pragma once - -#include "engine.h" - -#include "sdl2Window.h" - -const std::string MODEL_PATH = "/home/nathan/Projects/terminal/assets/viking_room.obj"; -const std::string TEXTURE_PATH = "/home/nathan/Pictures/Mountain.png"; - -struct QueueFamilyIndices { - std::optional graphicsFamily; - std::optional presentFamily; - - bool isComplete() { - return graphicsFamily.has_value() && presentFamily.has_value(); - } -}; - -struct SwapChainSupportDetails { - VkSurfaceCapabilitiesKHR capabilities; - std::vector formats; - std::vector presentModes; -}; - -static std::vector readFile(const std::string& filename) { - std::ifstream file(filename, std::ios::ate | std::ios::binary); - - if (!file.is_open()) { - throw std::runtime_error("failed to open file!"); - } - - size_t fileSize = (size_t) file.tellg(); - std::vector buffer(fileSize); - - file.seekg(0); - file.read(buffer.data(), fileSize); - - file.close(); - - return buffer; -} - -struct Vertex { - glm::vec3 pos; - glm::vec3 color; - glm::vec2 texCoord; - - static VkVertexInputBindingDescription getBindingDescription() { - VkVertexInputBindingDescription bindingDescription{}; - bindingDescription.binding = 0; - bindingDescription.stride = sizeof(Vertex); - bindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; - - return bindingDescription; - } - - static std::array getAttributeDescriptions() { - std::array attributeDescriptions{}; - - attributeDescriptions[0].binding = 0; - attributeDescriptions[0].location = 0; - attributeDescriptions[0].format = VK_FORMAT_R32G32B32_SFLOAT; - attributeDescriptions[0].offset = offsetof(Vertex, pos); - - attributeDescriptions[1].binding = 0; - attributeDescriptions[1].location = 1; - attributeDescriptions[1].format = VK_FORMAT_R32G32B32_SFLOAT; - attributeDescriptions[1].offset = offsetof(Vertex, color); - - attributeDescriptions[2].binding = 0; - attributeDescriptions[2].location = 2; - attributeDescriptions[2].format = VK_FORMAT_R32G32_SFLOAT; - attributeDescriptions[2].offset = offsetof(Vertex, texCoord); - - return attributeDescriptions; - } -}; - -struct UniformBufferObject { - alignas(16) glm::mat4 model; - alignas(16) glm::mat4 view; - alignas(16) glm::mat4 proj; -}; - -const std::vector vertices = { - {{-0.5f, -0.5f, 0.0f}, {1.0f, 0.0f, 0.0f}, {0.0f, 0.0f}}, - {{0.5f, -0.5f, 0.0f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f}}, - {{0.5f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}}, - {{-0.5f, 0.5f, 0.0f}, {1.0f, 1.0f, 1.0f}, {0.0f, 1.0f}}, - - {{-0.5f, -0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}, {0.0f, 0.0f}}, - {{0.5f, -0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f}}, - {{0.5f, 0.5f, -0.5f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}}, - {{-0.5f, 0.5f, -0.5f}, {1.0f, 1.0f, 1.0f}, {0.0f, 1.0f}} -}; - -const std::vector indices = { - 0, 1, 2, 2, 3, 0, - 4, 5, 6, 6, 7, 4 -}; - -class Renderer { - - public: - - Renderer(); - - ~Renderer(); - - inline VkInstance getInstance() { return instance; } - inline VkPhysicalDevice getPhysicalDevice() { return physicalDevice; } - inline VkDevice getDevice() { return device; } - uint32_t getQueueFamily(); - inline VkQueue getGraphicsQueue() { return graphicsQueue; } - inline VkQueue getPresentQueue() { return presentQueue; } - inline VkSurfaceKHR getSurface() { return surface; } - inline VkRenderPass getRenderPass() { return renderPass; } - inline VkDescriptorPool getDescriptorPool() { return descriptorPool; } - inline VkCommandBuffer getCommandBuffer(int frame) { return commandBuffers[frame]; } - inline VkPipeline getPipeline() { return graphicsPipeline; } - inline int getNumImages() { return MAX_FRAMES_IN_FLIGHT; } - inline int getFrame() { return currentFrame; } - inline VkSampleCountFlagBits getMSAASamples() { return msaaSamples; } - - private: - const int MAX_FRAMES_IN_FLIGHT = 2; - - VkInstance instance; - VkPhysicalDevice physicalDevice = VK_NULL_HANDLE; - VkDevice device; - VkQueue graphicsQueue; - VkQueue presentQueue; - VkSurfaceKHR surface; - VkSwapchainKHR swapChain; - std::vector swapChainImages; - VkFormat swapChainImageFormat; - VkExtent2D swapChainExtent; - VkRenderPass renderPass; - VkDescriptorPool descriptorPool; - std::vector descriptorSets; - VkDescriptorSetLayout descriptorSetLayout; - VkPipelineLayout pipelineLayout; - VkPipeline graphicsPipeline; - std::vector swapChainFramebuffers; - std::vector swapChainImageViews; - VkCommandPool commandPool; - std::vector commandBuffers; - std::vector imageAvailableSemaphores; - std::vector renderFinishedSemaphores; - std::vector inFlightFences; - uint32_t currentFrame = 0; - - VkBuffer vertexBuffer; - VkDeviceMemory vertexBufferMemory; - VkBuffer indexBuffer; - VkDeviceMemory indexBufferMemory; - std::vector uniformBuffers; - std::vector uniformBuffersMemory; - std::vector uniformBuffersMapped; - VkImage textureImage; - VkDeviceMemory textureImageMemory; - VkImageView textureImageView; - VkSampler textureSampler; - VkImage depthImage; - VkDeviceMemory depthImageMemory; - VkImageView depthImageView; - - - VkSampleCountFlagBits msaaSamples = VK_SAMPLE_COUNT_1_BIT; - VkImage colorImage; - VkDeviceMemory colorImageMemory; - VkImageView colorImageView; - - - - - VkResult err; - - bool enableValidationLayers = false; - - const std::vector deviceExtensions = { - VK_KHR_SWAPCHAIN_EXTENSION_NAME - }; - - - public: - - void init(); - - void shutdown(); - - void draw(); - - void createInstance(); - - void pickPhysicalDevice(); - - void createLogicalDevice(); - - void createSurface(); - - void createSwapChain(); - - void createImageViews(); - - void createDescriptorPool(); - - void createDescriptorSets(); - - void createDescriptorSetLayout(); - - void createGraphicsPipeline(); - - void createRenderPass(); - - void createFramebuffers(); - - void createCommandPool(); - - void createVertexBuffer(); - - void createIndexBuffer(); - - void createUniformBuffers(); - - void updateUniformBuffer(uint32_t); - - void createBuffer(VkDeviceSize, VkBufferUsageFlags, VkMemoryPropertyFlags, VkBuffer&, VkDeviceMemory&); - - void createCommandBuffer(); - - void recordCommandBuffer(VkCommandBuffer, uint32_t); - - void createSyncObjects(); - - - - void loadModel(); - - bool hasStencilComponent(VkFormat); - - VkFormat findDepthFormat(); - - VkFormat findSupportedFormat(const std::vector&, VkImageTiling, VkFormatFeatureFlags); - - void createDepthResources(); - - VkImageView createImageView(VkImage, VkFormat, VkImageAspectFlags); - - void copyBufferToImage(VkBuffer, VkImage, uint32_t, uint32_t); - - void createTextureSampler(); - - void createTextureImageView(); - - void transitionImageLayout(VkImage, VkFormat, VkImageLayout, VkImageLayout); - - VkCommandBuffer beginSingleTimeCommands(); - - void endSingleTimeCommands(VkCommandBuffer); - - void createImage(uint32_t, uint32_t, VkFormat, VkImageTiling, VkImageUsageFlags, VkMemoryPropertyFlags, VkImage&, VkDeviceMemory&); - - void createTextureImage(); - - VkSampleCountFlagBits getMaxUsableSampleCount(); - - void copyBuffer(VkBuffer, VkBuffer, VkDeviceSize); - - uint32_t findMemoryType(uint32_t, VkMemoryPropertyFlags); - - void recreateSwapChain(); - - void cleanupSwapChain(); - - VkShaderModule createShaderModule(const std::vector&); - - VkExtent2D chooseSwapExtent(const VkSurfaceCapabilitiesKHR&); - - VkPresentModeKHR chooseSwapPresentMode(const std::vector&); - - VkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector&); - - SwapChainSupportDetails querySwapChainSupport(VkPhysicalDevice); - - bool checkDeviceExtensionSupport(VkPhysicalDevice); - - QueueFamilyIndices findQueueFamilies(VkPhysicalDevice); - - bool isDeviceSuitable(VkPhysicalDevice); - - bool isExtensionAvailable(const std::vector&, const char*); - - void check_vk_result(); - -}; diff --git a/modules/gui/shaders/s.frag b/modules/gui/shaders/s.frag deleted file mode 100755 index f2488b5..0000000 --- a/modules/gui/shaders/s.frag +++ /dev/null @@ -1,14 +0,0 @@ -#version 450 - -layout(binding = 1) uniform sampler2D texSampler; - -layout(location = 0) in vec3 fragColor; -layout(location = 1) in vec2 fragTexCoord; - -layout(location = 0) out vec4 outColor; - - -void main() { - outColor = texture(texSampler, fragTexCoord); - //outColor = vec4(1.0f, 1.0f, 1.0f, 1.0f); -} \ No newline at end of file diff --git a/modules/gui/shaders/s.vert b/modules/gui/shaders/s.vert deleted file mode 100755 index f21aeae..0000000 --- a/modules/gui/shaders/s.vert +++ /dev/null @@ -1,21 +0,0 @@ -#version 450 - - -layout(binding = 0) uniform UniformBufferObject { - mat4 model; - mat4 view; - mat4 proj; -} ubo; - -layout(location = 0) in vec3 inPosition; -layout(location = 1) in vec3 inColor; -layout(location = 2) in vec2 inTexCoord; - -layout(location = 0) out vec3 fragColor; -layout(location = 1) out vec2 fragTexCoord; - -void main() { - gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 1.0); - fragColor = inColor; - fragTexCoord = inTexCoord; -} \ No newline at end of file diff --git a/modules/gui/src/application.cpp b/modules/gui/src/application.cpp deleted file mode 100755 index ca914a1..0000000 --- a/modules/gui/src/application.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include "application.h" - -App* App::instance = nullptr; - -App::App() { - - if(instance != nullptr) { - std::cout << "App already exists\nThere can only be one!\n"; - std::abort(); - } - - std::cout << "Initializing...\n"; - - instance = this; - - window.init("test", 640, 640); - - renderer.init(); - -} - -App::~App() { - - lStack.shutdown(); - - renderer.shutdown(); - - window.shutdown(); - - std::cout << "\nExiting..."; -} - -void App::run() { - std::cout << "\nTesting...\n"; - - lStack.pushLayer(new BaseLayer()); - lStack.pushOverlay(new Overlay()); - - // Main loop - while (!done) { - - lStack.propagateEvent(window.pollEvents()); - - renderer.draw(); - } -} - diff --git a/modules/gui/src/application.h b/modules/gui/src/application.h deleted file mode 100755 index 0ed1c72..0000000 --- a/modules/gui/src/application.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include "engine.h" - -#include "sdl2Window.h" -#include "vulkanRenderer.h" -#include "event.h" -#include "eventHandler.h" -#include "layer.h" -#include "layerstack.h" -#include "baseLayer.h" -#include "overlay.h" - - - - -class App { - - public: - - App(); - - ~App(); - - void run(); - - inline Window& getWindow() { return window; } - - inline Renderer& getRenderer() { return renderer; } - - inline LayerStack& getLayerStack() { return lStack; } - - inline static App& Get() { return *instance; } - - bool done = false; - - bool show = true; - - private: - - static App* instance; - - Window window; - - Renderer renderer; - - LayerStack lStack; - -}; diff --git a/modules/gui/src/engine.cpp b/modules/gui/src/engine.cpp deleted file mode 100755 index da361bb..0000000 --- a/modules/gui/src/engine.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "application.h" - -int main() { - - App app; - - app.run(); - -} diff --git a/modules/gui/src/engine.h b/modules/gui/src/engine.h deleted file mode 100755 index 8b68260..0000000 --- a/modules/gui/src/engine.h +++ /dev/null @@ -1,58 +0,0 @@ -#pragma once - - -//macros -#ifdef SHDR_PATH -#define STRINGIZE(x) #x -#define STRINGIZE_VALUE_OF(x) STRINGIZE(x) -#endif - - -#include -#include // printf, fprintf -#include // abort - -#include -#include -#include -#include // Necessary for uint32_t -#include // Necessary for std::numeric_limits -#include // Necessary for std::clamp -#include -#include -#include - -#define GLM_FORCE_RADIANS -#define GLM_FORCE_DEPTH_ZERO_TO_ONE -#include -#include - - -#include - -#include -#include -#include - - - -#include "imgui.h" -#include "imconfig.h" -#include "imgui_internal.h" -#include "imgui_impl_sdl2.h" -#include "imgui_impl_vulkan.h" - - - -//Forward declarations -class App; -class MouseButtonEvent; -class MouseMovedEvent; -class MouseScrolledEvent; -class KeyEvent; -class KeyTypedEvent; -class WindowEvent; -class Layer; - - - diff --git a/modules/gui/window/glfwWindow.cpp b/modules/gui/window/glfwWindow.cpp deleted file mode 100755 index a9e19fd..0000000 --- a/modules/gui/window/glfwWindow.cpp +++ /dev/null @@ -1,87 +0,0 @@ -#include "glfwWindow.h" - - - -WindowGLFW::WindowGLFW() { - -} - -WindowGLFW::~WindowGLFW() { - - glfwTerminate(); -} - -void WindowGLFW::init( std::string title, int x, int y) : title(title), x(x), y(y) { - - if(!glfwInit()) { - std::cout << "glfwInit failed!\n"; - error = true; - return; - } - - window = glfwCreateWindow(x, y, title.c_str(), NULL, NULL); - if(!window) { - glfwTerminate(); - std::cout << "glfwCreateWindow failed!"; - error = true; - return; - } - - glfwMakeContextCurrent(window); -} - -void WindowGLFW::shutdown() { - ~WindowGLFW(); -} - -void WindowGLFW::getSize() { - - SDL_GetWindowSize(window, &x, &y); -} - -const Event* WindowGLFW::createEvent() { - switch(event.type) { - case SDL_KEYDOWN: - return new KeyEvent(event.key.keysym.sym, event.key.keysym.scancode, - event.key.keysym.mod, event.key.repeat, true); - - case SDL_KEYUP: - return new KeyEvent(event.key.keysym.sym, event.key.keysym.scancode, - event.key.keysym.mod, event.key.repeat, false); - - case SDL_TEXTINPUT: - return new KeyTypedEvent(event.text.windowID, event.text.text); - - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - - switch(event.button.button) { - case SDL_BUTTON_LEFT: return new MouseButtonEvent(0, (event.type == SDL_MOUSEBUTTONDOWN)); - case SDL_BUTTON_RIGHT: return new MouseButtonEvent(1, (event.type == SDL_MOUSEBUTTONDOWN)); - case SDL_BUTTON_MIDDLE: return new MouseButtonEvent(2, (event.type == SDL_MOUSEBUTTONDOWN)); - case SDL_BUTTON_X1: return new MouseButtonEvent(3, (event.type == SDL_MOUSEBUTTONDOWN)); - case SDL_BUTTON_X2: return new MouseButtonEvent(4, (event.type == SDL_MOUSEBUTTONDOWN)); - } - - - case SDL_MOUSEMOTION: - return new MouseMovedEvent(event.motion.x, event.motion.y, event.motion.xrel, event.motion.yrel); - - case SDL_MOUSEWHEEL: - return new MouseScrolledEvent(event.wheel.x, event.wheel.y); - - case SDL_WINDOWEVENT: - return new WindowEvent(event.window.windowID, event.window.event); - } - return nullptr; -} - - -const Event* WindowGLFW::pollEvents() { - - while (SDL_PollEvent(&event)) { - - return createEvent(); - } - return nullptr; -} \ No newline at end of file diff --git a/modules/gui/window/glfwWindow.h b/modules/gui/window/glfwWindow.h deleted file mode 100755 index ed9a98d..0000000 --- a/modules/gui/window/glfwWindow.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include "terminal.h" - -#include "event.h" -#include "mouseEvent.h" -#include "keyEvent.h" -#include "windowEvent.h" - - -class WindowGLFW { - - public: - - WindowGLFW(); - - ~WindowGLFW(); - - void init( std::string, int, int); - - void shutdown(); - - void getSize(); - - const Event* pollEvents(); - - operator GLFWwindow*() { return window; } - - //private: - - const Event* createEvent(); - - int x, y; - - std::string title; - - GLFWwindow* window = nullptr; - - SDL_Event event; - - bool error = false; -}; \ No newline at end of file diff --git a/modules/gui/window/sdl2Window.cpp b/modules/gui/window/sdl2Window.cpp deleted file mode 100755 index 2ad5ae9..0000000 --- a/modules/gui/window/sdl2Window.cpp +++ /dev/null @@ -1,94 +0,0 @@ -#include "sdl2Window.h" - - - -WindowSDL2::WindowSDL2() { - - -} - -WindowSDL2::~WindowSDL2() { - - SDL_DestroyWindow(window); - SDL_Quit(); -} - -void WindowSDL2::init( std::string title, int x, int y) : title(title), x(x), y(y) { - - if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) - { - printf("Error: %s\n", SDL_GetError()); - error = true; - return; - } - - SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); - window = SDL_CreateWindow(title.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, x, y, window_flags); - if (window == nullptr) - { - printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); - error = true; - return; - } - - // int test = SDL_SetWindowOpacity(this->window, 0.1f); - // float t; - // SDL_GetWindowOpacity(this->window, &t); - // std::cout << test << " " << t << std::endl; -} - -void WindowSDL2::shutdown() { - ~WindowSDL2(); -} - -void WindowSDL2::getSize() { - - SDL_GetWindowSize(window, &x, &y); -} - -const Event* WindowSDL2::createEvent() { - switch(event.type) { - case SDL_KEYDOWN: - return new KeyEvent(event.key.keysym.sym, event.key.keysym.scancode, - event.key.keysym.mod, event.key.repeat, true); - - case SDL_KEYUP: - return new KeyEvent(event.key.keysym.sym, event.key.keysym.scancode, - event.key.keysym.mod, event.key.repeat, false); - - case SDL_TEXTINPUT: - return new KeyTypedEvent(event.text.windowID, event.text.text); - - case SDL_MOUSEBUTTONDOWN: - case SDL_MOUSEBUTTONUP: - - switch(event.button.button) { - case SDL_BUTTON_LEFT: return new MouseButtonEvent(0, (event.type == SDL_MOUSEBUTTONDOWN)); - case SDL_BUTTON_RIGHT: return new MouseButtonEvent(1, (event.type == SDL_MOUSEBUTTONDOWN)); - case SDL_BUTTON_MIDDLE: return new MouseButtonEvent(2, (event.type == SDL_MOUSEBUTTONDOWN)); - case SDL_BUTTON_X1: return new MouseButtonEvent(3, (event.type == SDL_MOUSEBUTTONDOWN)); - case SDL_BUTTON_X2: return new MouseButtonEvent(4, (event.type == SDL_MOUSEBUTTONDOWN)); - } - - - case SDL_MOUSEMOTION: - return new MouseMovedEvent(event.motion.x, event.motion.y, event.motion.xrel, event.motion.yrel); - - case SDL_MOUSEWHEEL: - return new MouseScrolledEvent(event.wheel.x, event.wheel.y); - - case SDL_WINDOWEVENT: - return new WindowEvent(event.window.windowID, event.window.event); - } - return nullptr; -} - - -const Event* WindowSDL2::pollEvents() { - - while (SDL_PollEvent(&event)) { - - return createEvent(); - } - return nullptr; -} \ No newline at end of file diff --git a/modules/gui/window/sdl2Window.h b/modules/gui/window/sdl2Window.h deleted file mode 100755 index c404a57..0000000 --- a/modules/gui/window/sdl2Window.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include "terminal.h" - -#include "event.h" -#include "mouseEvent.h" -#include "keyEvent.h" -#include "windowEvent.h" - - -class WindowSDL2 { - - public: - - WindowSDL2(); - - ~WindowSDL2(); - - void init( std::string, int, int); - - void shutdown(); - - void getSize(); - - const Event* pollEvents(); - - operator SDL_Window*() { return window; } - - //private: - - const Event* createEvent(); - - int x, y; - - std::string title; - - SDL_Window* window = nullptr; - - SDL_Event event; - - bool error = false; -}; \ No newline at end of file diff --git a/modules/gui/window/window.cpp b/modules/gui/window/window.cpp deleted file mode 100755 index 47812b3..0000000 --- a/modules/gui/window/window.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "window.h" - -Window::Window() -{ -} - -Window::~Window() -{ -} - -void Window::init(std::string, int, int) -{ -} - -void Window::shutdown() -{ -} - -void Window::getSize() -{ -} - -const Event *Window::pollEvents() -{ - return nullptr; -} - -const Event *Window::createEvent() -{ - return nullptr; -} diff --git a/modules/gui/window/window.h b/modules/gui/window/window.h deleted file mode 100755 index dc7e6ec..0000000 --- a/modules/gui/window/window.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include "engine.h" - -#include "event.h" -#include "mouseEvent.h" -#include "keyEvent.h" -#include "windowEvent.h" - - -class Window { - - public: - - Window(); - - ~Window(); - - void init( std::string, int, int); - - void shutdown(); - - void getSize(); - - const Event* pollEvents(); - - operator SDL_Window*() { return window; } - - //private: - - const Event* createEvent(); - - int x, y; - - std::string title; - - SDL_Window* window = nullptr; - - SDL_Event event; - - bool error = false; -}; diff --git a/modules/gui/assets/viking_room.obj b/modules/mainGUI/assets/viking_room.obj similarity index 100% rename from modules/gui/assets/viking_room.obj rename to modules/mainGUI/assets/viking_room.obj diff --git a/modules/gui/assets/viking_room.png b/modules/mainGUI/assets/viking_room.png similarity index 100% rename from modules/gui/assets/viking_room.png rename to modules/mainGUI/assets/viking_room.png diff --git a/modules/gui/renderer/openglRenderer.h b/modules/mainGUI/src/gui.cpp old mode 100755 new mode 100644 similarity index 100% rename from modules/gui/renderer/openglRenderer.h rename to modules/mainGUI/src/gui.cpp diff --git a/modules/gui/renderer/renderer.h b/modules/mainGUI/src/gui.h old mode 100755 new mode 100644 similarity index 100% rename from modules/gui/renderer/renderer.h rename to modules/mainGUI/src/gui.h diff --git a/modules/renderer/src/renderer.cpp b/modules/renderer/src/renderer.cpp new file mode 100644 index 0000000..e69de29 diff --git a/modules/renderer/src/renderer.h b/modules/renderer/src/renderer.h new file mode 100644 index 0000000..e69de29