Program Listing for File Window.h

Return to documentation for file (src\Window.h)

#pragma once
#include <vector>
#include <string>
#include <SDL.h>
#include <vulkan/vulkan.h>
#include <optional>
#include <stdexcept>
#include <utility> // для std::pair
#include <SDL_vulkan.h>
#include <memory>
#include <set>

namespace prism {
    namespace view {

        const std::vector<const char*> validationLayers = {
                "VK_LAYER_KHRONOS_validation"
        };
        const std::vector<const char*> deviceExtensions = {
                VK_KHR_SWAPCHAIN_EXTENSION_NAME
        };

        struct QueueFamilyIndices {
            std::optional<uint32_t> graphicsFamily;
            std::optional<uint32_t> presentFamily;

            bool isComplete() {
                return graphicsFamily.has_value() && presentFamily.has_value();
            }
        };

        class Window {
        public:
            // === Конструкторы ===
            Window(const char* title, int width, int height);
            Window(const char* title, int width, int height, Uint32 sdlFlags);
            Window(const char* title, int x, int y, int width, int height);
            Window(const char* title, int width, int height, const std::string& iconPath);

            // Специальные конструкторы
            static Window CreateCentered(const char* title, int width, int height);
            Window(const char* title, int width, int height,
                int minWidth, int minHeight, int maxWidth, int maxHeight);

            // === Деструктор ===
            ~Window();

            // === Управление окном ===
            const char* getTitle() const;
            void setTitle(const char* title);
            int getWidth();
            int getHeight();
            void getSize(int* width, int* height);
            void setWidth(int width);
            void setHeight(int height);
            void setSize(int width, int height);

            // === Режимы окна ===
            void setFullscreen(bool enabled);
            void setBorderless(bool enabled);
            void setResizable(bool enabled);
            void setGrabMouse(bool enabled);
            bool isFullscreen() const;
            bool isBorderless() const;
            bool isResizable() const;
            bool isGrabMouse() const;

            // === Позиция и размер ===
            void setPosition(int x, int y);
            std::pair<int, int> getPosition() const;
            void centerWindow();
            void setMinSize(int minWidth, int minHeight);
            void setMaxSize(int maxWidth, int maxHeight);

            // === События и рендеринг ===
            bool shouldClose() const;
            void setCloseRequested(bool value);
            void handleEvents();
            void clear();
            void update();


            // === Дополнительные методы ===
            void destroy();

            static void setSDLInitialized(bool initialized) { s_sdlInitialized = initialized; }

            // === Vulkan методы ===
            void vulkanInut();
            void createInstance();
            void pickPhysicalDevice();
            bool isDeviceSuitable(VkPhysicalDevice device);

            bool checkDeviceExtensionSupport(VkPhysicalDevice device);


        private:
#ifdef NDEBUG
            const bool enableValidationLayers = false;
#else
            const bool enableValidationLayers = true;
#endif
            static bool s_sdlInitialized;
            SDL_Window* m_sdlWindow;
            bool m_isDestroyed;

            bool m_windowMinimized = false; // Флаг минимизации окна

            // Внутренний конструктор для делегирования
            Window(const char* title, int x, int y, int width, int height, Uint32 sdlFlags);

            VkInstance instance;
            VkPhysicalDevice physicalDevice;
            VkDevice device;
            VkQueue graphicsQueue;
            VkSurfaceKHR surface;
            VkQueue presentQueue;

            int rateDeviceSuitability(VkPhysicalDevice device);

            QueueFamilyIndices findQueueFamilies(VkPhysicalDevice device);
            void createLogicalDevice();
            void createSurface();
        };

        inline bool Window::s_sdlInitialized = false;
    } // namespace view
} // namespace prism