aboutsummaryrefslogtreecommitdiffstatsci
path: root/src/VkEngine.h
blob: 7a5e5e2358a1ed714fab10b580fe301f97a25c95 (plain)
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();
    };
}