source: opengl-game/vulkan-game.hpp@ e1308e8

feature/imgui-sdl points-test
Last change on this file since e1308e8 was 06d959f, checked in by Dmitry Portnoy <dmp1488@…>, 5 years ago

Add an addVertexNormals method to VulkanGame that calculates the normals given a list of vertices

  • Property mode set to 100644
File size: 6.2 KB
RevLine 
[99d44b2]1#ifndef _VULKAN_GAME_H
2#define _VULKAN_GAME_H
[e8ebc76]3
[771b33a]4#include <glm/glm.hpp>
[15104a8]5#include <glm/gtc/matrix_transform.hpp>
[771b33a]6
[0df3c9a]7#include "game-gui-sdl.hpp"
[7d2b0b9]8#include "graphics-pipeline_vulkan.hpp"
[0df3c9a]9
[b794178]10#include "vulkan-utils.hpp"
11
[15104a8]12using namespace glm;
13
[2e77b3f]14#ifdef NDEBUG
15 const bool ENABLE_VALIDATION_LAYERS = false;
16#else
17 const bool ENABLE_VALIDATION_LAYERS = true;
18#endif
19
[b8777b7]20struct ModelVertex {
[15104a8]21 vec3 pos;
22 vec3 color;
23 vec2 texCoord;
[771b33a]24};
25
26struct OverlayVertex {
[15104a8]27 vec3 pos;
28 vec2 texCoord;
29};
30
[3782d66]31struct ShipVertex {
32 vec3 pos;
33 vec3 color;
[06d959f]34 vec3 normal;
[3782d66]35};
36
[8e02b6b]37struct UBO_MvpMat {
[15104a8]38 alignas(16) mat4 model;
39 alignas(16) mat4 view;
40 alignas(16) mat4 proj;
[771b33a]41};
42
[99d44b2]43class VulkanGame {
[e8ebc76]44 public:
[34bdf3a]45 VulkanGame(int maxFramesInFlight);
[99d44b2]46 ~VulkanGame();
[0df3c9a]47
[b6e60b4]48 void run(int width, int height, unsigned char guiFlags);
[0df3c9a]49
50 private:
[34bdf3a]51 const int MAX_FRAMES_IN_FLIGHT;
52
[5ab1b20]53 const float NEAR_CLIP = 0.1f;
54 const float FAR_CLIP = 100.0f;
55 const float FOV_ANGLE = 67.0f;
56
[15104a8]57 vec3 cam_pos;
58
[8e02b6b]59 UBO_MvpMat modelMvpMats;
[3782d66]60 UBO_MvpMat shipMvpMats;
[15104a8]61
[0df3c9a]62 GameGui* gui;
[c559904]63
[b8777b7]64 GraphicsPipeline_Vulkan<ModelVertex> modelPipeline;
65 GraphicsPipeline_Vulkan<OverlayVertex> overlayPipeline;
[3782d66]66 GraphicsPipeline_Vulkan<ShipVertex> shipPipeline;
[7d2b0b9]67
[c559904]68 SDL_version sdlVersion;
[b794178]69 SDL_Window* window = nullptr;
70 SDL_Renderer* renderer = nullptr;
71
72 SDL_Texture* uiOverlay = nullptr;
[c1d9b2a]73
74 VkInstance instance;
75 VkDebugUtilsMessengerEXT debugMessenger;
[fe5c3ba]76 VkSurfaceKHR surface; // TODO: Change the variable name to vulkanSurface
[90a424f]77 VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;
[c1c2021]78 VkDevice device;
79
80 VkQueue graphicsQueue;
81 VkQueue presentQueue;
[0df3c9a]82
[502bd0b]83 VkSwapchainKHR swapChain;
84 vector<VkImage> swapChainImages;
85 VkFormat swapChainImageFormat;
[603b5bc]86 VkExtent2D swapChainExtent;
[f94eea9]87 vector<VkImageView> swapChainImageViews;
[603b5bc]88 vector<VkFramebuffer> swapChainFramebuffers;
[fa9fa1c]89
[6fc24c7]90 VkRenderPass renderPass;
[fa9fa1c]91 VkCommandPool commandPool;
[603b5bc]92 vector<VkCommandBuffer> commandBuffers;
[502bd0b]93
[603b5bc]94 VulkanImage depthImage;
[b794178]95
96 VkSampler textureSampler;
97
98 // These are currently to store the MVP matrix
99 // I should figure out if it makes sense to use them for other uniforms in the future
100 // If not, I should rename them to better indicate their purpose.
101 vector<VkBuffer> uniformBuffers;
102 vector<VkDeviceMemory> uniformBuffersMemory;
103
[f97c5e7]104 vector<VkDescriptorBufferInfo> uniformBufferInfoList;
105
[3782d66]106 vector<VkBuffer> uniformBuffers_shipPipeline;
107 vector<VkDeviceMemory> uniformBuffersMemory_shipPipeline;
108
109 vector<VkDescriptorBufferInfo> uniformBufferInfoList_shipPipeline;
110
[b794178]111 VulkanImage floorTextureImage;
112 VkDescriptorImageInfo floorTextureImageDescriptor;
113
114 VulkanImage sdlOverlayImage;
115 VkDescriptorImageInfo sdlOverlayImageDescriptor;
116
[1f25a71]117 TTF_Font* font;
118 SDL_Texture* fontSDLTexture;
119
120 SDL_Texture* imageSDLTexture;
121
[34bdf3a]122 vector<VkSemaphore> imageAvailableSemaphores;
123 vector<VkSemaphore> renderFinishedSemaphores;
124 vector<VkFence> inFlightFences;
125
[87c8f1a]126 size_t currentFrame;
127
128 bool framebufferResized;
[0e09340]129
[b6e60b4]130 bool initWindow(int width, int height, unsigned char guiFlags);
[0df3c9a]131 void initVulkan();
[f97c5e7]132 void initGraphicsPipelines();
[15104a8]133 void initMatrices();
[0df3c9a]134 void mainLoop();
[8e02b6b]135 void updateScene(uint32_t currentImage);
[a0c5f28]136 void renderUI();
137 void renderScene();
[0df3c9a]138 void cleanup();
[c1d9b2a]139
140 void createVulkanInstance(const vector<const char*> &validationLayers);
141 void setupDebugMessenger();
142 void populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo);
[90a424f]143 void createVulkanSurface();
[fe5c3ba]144 void pickPhysicalDevice(const vector<const char*>& deviceExtensions);
[fa9fa1c]145 bool isDeviceSuitable(VkPhysicalDevice physicalDevice, const vector<const char*>& deviceExtensions);
[c1c2021]146 void createLogicalDevice(
147 const vector<const char*> validationLayers,
148 const vector<const char*>& deviceExtensions);
[502bd0b]149 void createSwapChain();
[f94eea9]150 void createImageViews();
[6fc24c7]151 void createRenderPass();
152 VkFormat findDepthFormat();
[fa9fa1c]153 void createCommandPool();
[603b5bc]154 void createImageResources();
155
[b794178]156 void createTextureSampler();
[603b5bc]157 void createFramebuffers();
158 void createCommandBuffers();
[34bdf3a]159 void createSyncObjects();
[f94eea9]160
[06d959f]161 template<class VertexType>
162 vector<VertexType> addVertexNormals(vector<VertexType> vertices);
163
[f97c5e7]164 template<class UniformType>
165 void createUniformBuffers(vector<VkBuffer>& buffers, vector<VkDeviceMemory>& buffersMemory,
166 vector<VkDescriptorBufferInfo>& bufferInfoList);
167
[d2d9286]168 void recreateSwapChain();
169
[c1c2021]170 void cleanupSwapChain();
[c1d9b2a]171
172 static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(
173 VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
174 VkDebugUtilsMessageTypeFlagsEXT messageType,
175 const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
176 void* pUserData);
[e8ebc76]177};
178
[f97c5e7]179template<class UniformType>
180void VulkanGame::createUniformBuffers(vector<VkBuffer>& buffers, vector<VkDeviceMemory>& buffersMemory,
181 vector<VkDescriptorBufferInfo>& bufferInfoList) {
182 buffers.resize(swapChainImages.size());
183 buffersMemory.resize(swapChainImages.size());
184 bufferInfoList.resize(swapChainImages.size());
185
186 for (size_t i = 0; i < swapChainImages.size(); i++) {
187 VulkanUtils::createBuffer(device, physicalDevice, sizeof(UniformType), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
188 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
189 buffers[i], buffersMemory[i]);
190
191 bufferInfoList[i].buffer = buffers[i];
192 bufferInfoList[i].offset = 0;
193 bufferInfoList[i].range = sizeof(UniformType);
194 }
195}
196
[06d959f]197template<class VertexType>
198vector<VertexType> VulkanGame::addVertexNormals(vector<VertexType> vertices) {
199 for (unsigned int i = 0; i < vertices.size(); i += 3) {
200 vec3 p1 = vertices[i].pos;
201 vec3 p2 = vertices[i+1].pos;
202 vec3 p3 = vertices[i+2].pos;
203
204 vec3 normal = normalize(cross(p2 - p1, p3 - p1));
205 normal.z = -normal.z;
206
207 // Add the same normal for all 3 vertices
208 vertices[i].normal = normal;
209 vertices[i+1].normal = normal;
210 vertices[i+2].normal = normal;
211 }
212
213 return vertices;
214}
215
[99d44b2]216#endif // _VULKAN_GAME_H
Note: See TracBrowser for help on using the repository browser.