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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
|
/*
* 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 <chrono>
#include <sys/stat.h>
#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#define GLM_ENABLE_EXPERIMENTAL
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <exception>
#include <assert.h>
#include <string>
#include <iostream>
#include <sstream>
#include <fstream>
#include <array>
#include <vector>
#include <numeric>
#include <algorithm>
#include "vulkan/vulkan.h"
#include "GLFW/glfw3.h"
namespace vke {
class engine_t;
class swap_chain_t;
struct device_t;
struct Texture;
struct render_target_t;
struct buffer_t;
class ShadingContext;
struct Resource;
class Camera;
struct vkPhyInfo;
}
#if defined(__linux__)
#define KEY_ESCAPE 0x9
#define KEY_F1 0x43
#define KEY_F2 0x44
#define KEY_F3 0x45
#define KEY_F4 0x46
#define KEY_W 0x19
#define KEY_A 0x26
#define KEY_S 0x27
#define KEY_D 0x28
#define KEY_P 0x21
#define KEY_SPACE 0x41
#define KEY_KPADD 0x56
#define KEY_KPSUB 0x52
#define KEY_B 0x38
#define KEY_F 0x29
#define KEY_L 0x2E
#define KEY_N 0x39
#define KEY_O 0x20
#define KEY_T 0x1C
#endif
// 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 vke {
class engine_t
{
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:
vkPhyInfo* phyInfos;
GLFWwindow* window;
swap_chain_t* swapChain;
render_target_t* renderTarget;
std::string title = "Vulkan Example";
std::string name = "vulkanExample";
virtual void windowResize();
public:
static std::vector<const char*> args;
VkInstance instance;
device_t* 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 {
buffer_t* matrices;
buffer_t* 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};
engine_t(uint32_t width, uint32_t height,
VkPhysicalDeviceType preferedGPU = VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU);
virtual ~engine_t();
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();
};
}
|