cae  0.0.0
Cross-API graphics engine
Loading...
Searching...
No Matches
engine.cpp
Go to the documentation of this file.
1#include "Engine/Engine.hpp"
2
3#include "Utils/Logger.hpp"
4#include "Utils/Path.hpp"
5
6#include <numeric>
7#include <ranges>
8
9void printFps(std::array<float, 10> &fpsBuffer, int &fpsIndex, const float deltaTime)
10{
11 fpsBuffer[fpsIndex % 10] = 1.0F / deltaTime;
12 fpsIndex++;
13
14 float avgFps = std::accumulate(fpsBuffer.begin(), fpsBuffer.end(), 0.0F) / 10.0F;
15 utl::Logger::log(std::format("FPS: {}", avgFps), utl::LogLevel::INFO);
16}
17
18cae::Engine::Engine(const EngineConfig &config, const std::function<std::shared_ptr<IAudio>()> &audioFactory,
19 const std::function<std::shared_ptr<INetwork>()> &networkFactory,
20 const std::function<std::shared_ptr<IRenderer>()> &rendererFactory,
21 const std::function<std::shared_ptr<IShaderIR>()> &shaderIRFactory,
22 const std::vector<std::function<std::shared_ptr<IShaderFrontend>()>> &shaderFrontendFactories,
23 const std::function<std::shared_ptr<IWindow>()> &windowFactory)
24 : m_audioPlugin(audioFactory()), m_networkPlugin(networkFactory()), m_rendererPlugin(rendererFactory()),
25 m_windowPlugin(windowFactory()), m_clock(std::make_unique<utl::Clock>()),
26 m_shaderManager(std::make_unique<ShaderManager>(shaderFrontendFactories, shaderIRFactory)),
27 m_camera(std::make_unique<Camera>(config.camera_position, config.camera_rotation, config.camera_direction,
28 config.camera_move_speed, config.camera_look_speed, config.camera_fov,
29 config.camera_near_plane, config.camera_far_plane)),
30 m_logFps(config.log_fps)
31{
32 constexpr auto boolToStr = [](const bool b) { return b ? "true" : "false"; };
33 std::ostringstream msg;
34 msg << "Starting engine with configuration:\n"
35 << "\tAudio master volume: " << config.audio_master_volume << "\n"
36 << "\tAudio muted: " << boolToStr(config.audio_muted) << "\n"
37 << "\tLog FPS: " << boolToStr(config.log_fps) << "\n"
38 << "\tNetwork host: " << config.network_host << "\n"
39 << "\tNetwork port: " << config.network_port << "\n"
40 << "\tRenderer vsync: " << boolToStr(config.renderer_vsync) << "\n"
41 << "\tRenderer frame rate limit: " << config.renderer_frame_rate_limit << "\n"
42 << "\tRenderer clear color: (" << config.renderer_clear_color.r << ", " << config.renderer_clear_color.g << ", "
43 << config.renderer_clear_color.b << ", " << config.renderer_clear_color.a << ")\n"
44 << "\tWindow width: " << config.window_width << "\n"
45 << "\tWindow height: " << config.window_height << "\n"
46 << "\tWindow fullscreen: " << boolToStr(config.window_fullscreen) << "\n"
47 << "\tWindow name: " << config.window_name << "\n\tWindow icon path: " << config.window_icon_path << '\n';
49
50 initWindow(config.window_name, {.width = config.window_width, .height = config.window_height},
51 config.window_icon_path);
52 m_rendererPlugin->initialize(m_windowPlugin->getNativeHandle(), config.renderer_clear_color);
53}
54
55void cae::Engine::initializeRenderResources(const std::vector<ShaderSourceDesc> &shaderSources,
56 const std::vector<float> &vertices) const
57{
58 initShaders(shaderSources);
59 m_rendererPlugin->createMesh(vertices);
60}
61
63{
64 constexpr auto model = glm::mat4(1.0F);
65
66 const glm::mat4 mvp = m_camera->getViewProjection(static_cast<float>(m_windowPlugin->getWindowSize().width) /
67 m_windowPlugin->getWindowSize().height) *
68 model;
69 m_rendererPlugin->draw(m_windowPlugin->getWindowSize(), "basic", mvp);
70}
71
72void cae::Engine::update(std::array<float, 10> &fpsBuffer, int &fpsIndex)
73{
74 if (m_logFps)
75 {
76 printFps(fpsBuffer, fpsIndex, m_clock->getDeltaSeconds());
77 }
78 m_clock->restart();
79}
80
82{
83 utl::Logger::log("Stopping engine...", utl::LogLevel::INFO);
84 m_windowPlugin->close();
85
86 m_audioPlugin = nullptr;
87 m_networkPlugin = nullptr;
88 m_rendererPlugin = nullptr;
89 m_windowPlugin = nullptr;
90
91 m_clock = nullptr;
92 m_shaderManager = nullptr;
93 m_camera = nullptr;
94}
95
96void cae::Engine::initWindow(const std::string &windowName, const WindowSize &windowSize,
97 const std::string &iconPath) const
98{
99 m_windowPlugin->create(windowName, windowSize);
100 if (!iconPath.empty())
101 {
102 m_windowPlugin->setIcon(iconPath);
103 }
104}
105
106void cae::Engine::initShaders(const std::vector<ShaderSourceDesc> &shaderSources) const
107{
108 auto shaders = m_shaderManager->build(shaderSources, ShaderSourceType::SPIRV);
109 m_shaderManager->optimizeAll(ShaderSourceType::SPIRV, shaders | std::views::values);
110 m_rendererPlugin->createPipeline("basic", shaders["basic_vertex"], shaders["basic_fragment"]);
111}
This file contains the engine class declaration.
This file contains the Logger class.
This file contains Path resolution utilities.
Class for camera.
Definition Camera.hpp:24
void update(std::array< float, 10 > &fpsBuffer, int &fpsIndex)
Definition engine.cpp:72
std::shared_ptr< IRenderer > m_rendererPlugin
Definition Engine.hpp:119
void initializeRenderResources(const std::vector< ShaderSourceDesc > &shaderSources, const std::vector< float > &vertices) const
Initialize render resources.
Definition engine.cpp:55
void initShaders(const std::vector< ShaderSourceDesc > &shaderSources) const
Initialize shaders.
Definition engine.cpp:106
void render()
Definition engine.cpp:62
void initWindow(const std::string &windowName, const WindowSize &windowSize, const std::string &iconPath) const
Initialize the window.
Definition engine.cpp:96
void stop()
Stop the engine.
Definition engine.cpp:81
std::shared_ptr< IWindow > m_windowPlugin
Definition Engine.hpp:120
Engine(const EngineConfig &config, const std::function< std::shared_ptr< IAudio >()> &audioFactory, const std::function< std::shared_ptr< INetwork >()> &networkFactory, const std::function< std::shared_ptr< IRenderer >()> &rendererFactory, const std::function< std::shared_ptr< IShaderIR >()> &shaderIRFactory, const std::vector< std::function< std::shared_ptr< IShaderFrontend >()> > &shaderFrontendFactories, const std::function< std::shared_ptr< IWindow >()> &windowFactory)
Definition engine.cpp:18
Class for managing shaders.
static void log(const std::string &message, const LogLevel &logLevel)
Log a message with a specific log level.
Definition Logger.hpp:71
void printFps(std::array< float, 10 > &fpsBuffer, int &fpsIndex, const float deltaTime)
Definition engine.cpp:9
Struct for engine configuration.
Definition Engine.hpp:28
Color renderer_clear_color
Definition Engine.hpp:48
uint16_t window_height
Definition Engine.hpp:54
uint16_t network_port
Definition Engine.hpp:44
uint16_t window_width
Definition Engine.hpp:53
uint16_t renderer_frame_rate_limit
Definition Engine.hpp:47
std::string window_name
Definition Engine.hpp:56
std::string network_host
Definition Engine.hpp:43
float audio_master_volume
Definition Engine.hpp:29
std::string window_icon_path
Definition Engine.hpp:57
bool window_fullscreen
Definition Engine.hpp:55
Struct for window size.
Definition IWindow.hpp:23