aboutsummaryrefslogtreecommitdiff
path: root/src/core/application.h
blob: 8df5afb21d7dda3053e08c331ee73acc10ca5c42 (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
#pragma once

#include <cstdint>
#include <memory>
#include <string>

namespace Hsdbg
{
    class Window;
    class WindowManager;

    struct ApplicationSpec
    {
        std::string name = "hsdbg";
        uint32_t width = 1600;
        uint32_t height = 900;
        bool vsync = true;
    };

    class Application
    {
    public:
        explicit Application(const ApplicationSpec& spec);
        ~Application();

        Application(const Application&) = delete;
        Application(Application&&) = delete;
        auto operator=(const Application&) -> Application& = delete;
        auto operator=(Application&&) -> Application& = delete;

        static auto get() -> Application&;

        auto run() -> void;
        auto close() -> void;

        auto window() -> Window& { return *m_window; }
        auto spec() const -> const ApplicationSpec& { return m_spec; }
        auto is_running() const -> bool { return m_running; }
        auto delta_time() const -> float { return m_delta_time; }
        auto time() const -> float { return m_time; }
        auto frame_count() const -> uint64_t { return m_frame_count; }

    private:
        auto update() -> void;
        auto render() -> void;

        static Application* s_instance;

        ApplicationSpec m_spec;
        std::unique_ptr<WindowManager> m_window_manager;
        Window* m_window = nullptr;
        bool m_running = false;
        float m_delta_time = 0.0f;
        float m_time = 0.0f;
        uint64_t m_frame_count = 0;
    };
}