1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
|
/*
* Vulkan Example base class
*
* Copyright (C) 2016 by Sascha Willems - www.saschawillems.de
*
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
*/
#pragma once
#include "vke.h"
#include "rendertarget.hpp"
#include "VulkanBuffer.hpp"
#include "shadingcontext.hpp"
//const std::string getAssetPath();
VkPipelineShaderStageCreateInfo loadShader(VkDevice device, std::string filename, VkShaderStageFlagBits stage);
// AngelCode .fnt format structs and classes
struct bmchar {
uint32_t x, y;
uint32_t width;
uint32_t height;
int32_t xoffset;
int32_t yoffset;
int32_t xadvance;
uint32_t page;
};
std::array<bmchar, 255> parsebmFont(const std::string& fileName);
namespace vks {
class VkEngine
{
private:
float fpsTimer = 0.0f;
uint32_t frameCounter = 0;
bool viewUpdated = false;
std::string getWindowTitle();
#if DEBUG
PFN_vkCreateDebugReportCallbackEXT vkCreateDebugReportCallback;
PFN_vkDestroyDebugReportCallbackEXT vkDestroyDebugReportCallback;
VkDebugReportCallbackEXT debugReportCallback;
#endif
void createInstance (const std::string& app_name, std::vector<const char*>& extentions);
protected:
vks::vkPhyInfo phyInfos;
GLFWwindow* window;
ptrSwapchain swapChain;
RenderTarget* renderTarget;
std::string title = "Vulkan Example";
std::string name = "vulkanExample";
virtual void windowResize();
public:
static std::vector<const char*> args;
VkInstance instance;
ptrVkDev device;
VkSurfaceKHR surface;
uint32_t lastFPS = 0;
float frameTimer = 1.0f;
bool prepared = false;
uint32_t width, height;
Camera camera;
glm::vec2 mousePos;
bool paused = false;
struct Settings {
bool validation = false;
bool fullscreen = false;
bool vsync = false;
bool multiSampling = true;
VkSampleCountFlagBits sampleCount = VK_SAMPLE_COUNT_4_BIT;
} settings;
struct UniformBuffers {
vks::Buffer matrices;
vks::Buffer params;
} sharedUBOs;
struct MVPMatrices {
glm::mat4 projection;
glm::mat4 view3;
glm::mat4 view;
glm::vec3 camPos;
} mvpMatrices;
struct LightingParams {
glm::vec4 lightDir = glm::vec4(0.0f, -0.5f, -0.5f, 1.0f);
float exposure = 4.5f;
float gamma = 1.0f;
float prefilteredCubeMipLevels;
} lightingParams;
glm::vec3 rotation = glm::vec3(0.0f, 135.0f, 0.0f);
struct GamePadState {
glm::vec2 axisLeft = glm::vec2(0.0f);
glm::vec2 axisRight = glm::vec2(0.0f);
} gamePadState;
bool mouseButtons[3] = {false,false,false};
VkEngine(uint32_t width, uint32_t height,
VkPhysicalDeviceType preferedGPU = VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU);
virtual ~VkEngine();
virtual void start();
virtual void render() = 0;
virtual void viewChanged();
virtual void keyDown(uint32_t key);
virtual void keyUp(uint32_t key);
virtual void keyPressed(uint32_t key);
virtual void handleMouseMove(int32_t x, int32_t y);
virtual void handleMouseButtonDown(int buttonIndex);
virtual void handleMouseButtonUp(int buttonIndex);
virtual void prepare();
void prepareUniformBuffers();
void updateUniformBuffers();
void updateParams();
void prepareFrame();
};
}
|