#ifndef _VULKAN_GAME_H #define _VULKAN_GAME_H #include #include "game-gui-sdl.hpp" #include "graphics-pipeline_vulkan.hpp" #include "vulkan-utils.hpp" #ifdef NDEBUG const bool ENABLE_VALIDATION_LAYERS = false; #else const bool ENABLE_VALIDATION_LAYERS = true; #endif struct ModelVertex { glm::vec3 pos; glm::vec3 color; glm::vec2 texCoord; }; struct OverlayVertex { glm::vec3 pos; glm::vec2 texCoord; }; class VulkanGame { public: VulkanGame(int maxFramesInFlight); ~VulkanGame(); void run(int width, int height, unsigned char guiFlags); private: const int MAX_FRAMES_IN_FLIGHT; const float NEAR_CLIP = 0.1f; const float FAR_CLIP = 100.0f; const float FOV_ANGLE = 67.0f; GameGui* gui; GraphicsPipeline_Vulkan modelPipeline; GraphicsPipeline_Vulkan overlayPipeline; SDL_version sdlVersion; SDL_Window* window = nullptr; SDL_Renderer* renderer = nullptr; SDL_Texture* uiOverlay = nullptr; VkInstance instance; VkDebugUtilsMessengerEXT debugMessenger; VkSurfaceKHR surface; // TODO: Change the variable name to vulkanSurface VkPhysicalDevice physicalDevice = VK_NULL_HANDLE; VkDevice device; VkQueue graphicsQueue; VkQueue presentQueue; VkSwapchainKHR swapChain; vector swapChainImages; VkFormat swapChainImageFormat; VkExtent2D swapChainExtent; vector swapChainImageViews; vector swapChainFramebuffers; VkRenderPass renderPass; VkCommandPool commandPool; vector commandBuffers; VulkanImage depthImage; VkSampler textureSampler; vector uniformBufferInfoList; // These are currently to store the MVP matrix // I should figure out if it makes sense to use them for other uniforms in the future // If not, I should rename them to better indicate their purpose. // I should also decide if I can use these for all shaders, or if I need a separapte set of buffers for each one vector uniformBuffers; vector uniformBuffersMemory; VulkanImage floorTextureImage; VkDescriptorImageInfo floorTextureImageDescriptor; VulkanImage sdlOverlayImage; VkDescriptorImageInfo sdlOverlayImageDescriptor; TTF_Font* font; SDL_Texture* fontSDLTexture; SDL_Texture* imageSDLTexture; vector imageAvailableSemaphores; vector renderFinishedSemaphores; vector inFlightFences; size_t currentFrame; size_t numPlanes = 0; // temp bool framebufferResized; bool initWindow(int width, int height, unsigned char guiFlags); void initVulkan(); void mainLoop(); void renderUI(); void renderScene(); void cleanup(); void createVulkanInstance(const vector &validationLayers); void setupDebugMessenger(); void populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo); void createVulkanSurface(); void pickPhysicalDevice(const vector& deviceExtensions); bool isDeviceSuitable(VkPhysicalDevice physicalDevice, const vector& deviceExtensions); void createLogicalDevice( const vector validationLayers, const vector& deviceExtensions); void createSwapChain(); void createImageViews(); void createRenderPass(); VkFormat findDepthFormat(); void createCommandPool(); void createImageResources(); void createTextureSampler(); void createFramebuffers(); void createUniformBuffers(); void createCommandBuffers(); void createSyncObjects(); void recreateSwapChain(); void updateUniformBuffer(uint32_t currentImage); void cleanupSwapChain(); static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback( VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData); }; #endif // _VULKAN_GAME_H