OmniaFramework/src/ogfx/GraphicsApplication.cpp
2023-10-17 23:31:17 +02:00

695 lines
No EOL
24 KiB
C++

#include "GraphicsApplication.hpp"
#include "Errors.hpp"
#include "Renderer2D.hpp"
#include "Signals.hpp"
#include "RenderCommands.hpp"
#include "RenderCore.hpp"
#include "Utils.hpp"
#include "RTData.hpp"
#include "Widgets.hpp"
namespace ogfx
{
using namespace ostd;
GraphicsApplication2D& GraphicsApplication2D::create(int32_t windowWidth, int32_t windowHeight, const ostd::String& windowTitle, tContextSettings contextSettings)
{
/** Window Code **/
m_window.create({ static_cast<float>(windowWidth), static_cast<float>(windowHeight) }, windowTitle, contextSettings);
if (!m_window.isValid())
{
ErrorHandler::pushError(GraphicsApplication2D::ERR_WINDOW_CREATE_FAIL);
String err_str = ErrorHandler::getLastErrorString();
OX_FATAL("%s", err_str.c_str());
return *this;
}
m_window.printOpenGLInfo();
// m_window.setWindowIcon(windowIconPath);
/** Subsystem initialization **/
Renderer2D::init();
SignalHandler::init();
ResourceManager::init();
Renderer2D::Text::init();
// Input::init(m_window.getGLFWWindowPtr());
RenderCommandPool::init();
RenderCore::initRenderQUeue();
oxgui::WidgetManager::init();
/******************************/
m_lastFrameTime = Timer::getEpoch() / 1000.0;
enableVSync(false);
connectSignal(tBuiltinSignals::OnGuiEvent);
if (ogfx::DebugTools::m_debugWindowEnabled)
{
DebugTools::m_timesList.updateEntry(DebugTools::FramerateCalculations);
DebugTools::m_timesList.get(DebugTools::FramerateCalculations).name = "Framerate Calculations";
DebugTools::m_timesList.updateEntry(DebugTools::OnSecondsUpdate);
DebugTools::m_timesList.get(DebugTools::OnSecondsUpdate).name = "Seconds Update";
DebugTools::m_timesList.updateEntry(DebugTools::EventHandling);
DebugTools::m_timesList.get(DebugTools::EventHandling).name = "Event Handling";
DebugTools::m_timesList.updateEntry(DebugTools::OnUpdate);
DebugTools::m_timesList.get(DebugTools::OnUpdate).name = "Update";
DebugTools::m_timesList.updateEntry(DebugTools::OnRender);
DebugTools::m_timesList.get(DebugTools::OnRender).name = "Render";
DebugTools::m_timesList.updateEntry(DebugTools::OnDisplay);
DebugTools::m_timesList.get(DebugTools::OnDisplay).name = "Render Queue Execution";
DebugTools::m_timesList.updateEntry(DebugTools::OnFrameFinalize);
DebugTools::m_timesList.get(DebugTools::OnFrameFinalize).name = "Frame Finalize";
DebugTools::m_timesList.updateEntry(DebugTools::OnSignalsRefresh);
DebugTools::m_timesList.get(DebugTools::OnSignalsRefresh).name = "Signals Refresh";
DebugTools::m_timesList.updateEntry(DebugTools::OnWindowDisplay);
DebugTools::m_timesList.get(DebugTools::OnWindowDisplay).name = "Flip Buffers";
DebugTools::m_timesList.updateEntry(DebugTools::TotalFrameTime);
DebugTools::m_timesList.get(DebugTools::TotalFrameTime).name = "Total Frame Time";
m_debugToolsWindow.create({ 5, 5 }, { 600, 410 });
m_debugToolsWindow.enable();
m_debugToolsWindow.setTitle("Debug Tools");
// m_debugToolsWindow.setBounds(5, 5, 500, 385);
oxgui::WidgetTheme theme = oxgui::WidgetManager::getGlobalTheme();
oxgui::WidgetManager::addWidget(m_debugToolsWindow);
theme.subWindow.titleBarColor_focused = { 85, 0, 85 };
theme.subWindow.backgroundColor = { 0, 0, 0, 235 };
theme.subWindow.borderColor_focused = { 85, 0, 85 };
m_debugToolsWindow.setTheme(theme);
m_debugToolsWindow.enableGlobalThemeOverride(true);
theme.tabPanel.backgroundColor = { 10, 10, 10 };
theme.tabPanel.tabBackground_focused = { 10, 10, 10 };
// theme.tabPanel.tabBarBackground = { 85, 0, 85 };
DebugTools::m_debugWindowTabPanel.setTheme(theme);
DebugTools::m_debugWindowTabPanel.enableGlobalThemeOverride(true);
DebugTools::m_debugWindowTabPanel.create(m_debugToolsWindow);
DebugTools::m_debugWindowTabPanel.addTab(DebugTools::m_debugWindowInfoTab);
DebugTools::m_debugWindowTabPanel.addTab(DebugTools::m_debugWindowWatcherTab);
DebugTools::m_debugWindowTabPanel.addTab(DebugTools::m_debugWindowTab3);
DebugTools::m_debugWindowInfoTab.setText("Debug Info");
DebugTools::m_debugWindowWatcherTab.setText("Watcher");
DebugTools::m_debugWindowTab3.setText("Tab3");
DebugTools::m_debugWindowTabPanel.selectTab(0);
DebugTools::m_debugInfoWidget.init(DebugTools::m_debugWindowInfoTab);
}
setTypeName("ogfx::GraphicsApplication2D");
validate();
onSetup();
m_window.initialize();
return *this;
}
void GraphicsApplication2D::destroy(void)
{
RenderCommandPool::destroy();
Renderer2D::shutdown();
}
void GraphicsApplication2D::nextFrame(void)
{
if (!isRunning()) return;
const bool DEBUG = ogfx::DebugTools::m_debugWindowEnabled;
if (DEBUG)
{
DebugTools::m_totalFrameTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
DebugTools::m_profileTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
}
double currTime = Timer::getEpoch() / 1000.0;
m_rtfps++;
RTData::DeltaTime = (float)(currTime - m_lastFrameTime);
m_lastFrameTime = currTime;
double timeDiff = currTime - m_prevTime;
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::FramerateCalculations).totalTime += DebugTools::m_profileTimer.end(false);
DebugTools::m_timesList.get(DebugTools::FramerateCalculations).sampleCount++;
DebugTools::m_profileTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
}
if (timeDiff >= 1.0f)
{
onSecondsUpdate();
// SoundHandler::update();
m_prevTime = currTime;
if (DEBUG)
{
DebugTools::m_fps = m_rtfps;
DebugTools::m_ups = m_rtups;
for (auto& data : DebugTools::m_timesList.data)
{
data.second.computeAvgTime();
data.second.sampleCount = 1;
data.second.totalTime = data.second.getAvgTime();
}
}
m_rtfps = 0;
m_rtups = 0;
}
// LightingManager::update();
onFrameStart();
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::OnSecondsUpdate).totalTime += DebugTools::m_profileTimer.end(false);
DebugTools::m_timesList.get(DebugTools::OnSecondsUpdate).sampleCount++;
DebugTools::m_profileTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
}
m_window.handleEvents();
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::EventHandling).totalTime += DebugTools::m_profileTimer.end(false);
DebugTools::m_timesList.get(DebugTools::EventHandling).sampleCount++;
DebugTools::m_profileTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
}
while (m_upsAccumulator > m_upsStep)
{
onUpdate();
m_upsAccumulator -= m_upsStep;
m_rtups++;
if (DEBUG)
{
SignalHandler::emitSignal(DebugTools::OnProfileDataRecieved, tSignalPriority::RealTime, DebugTools::m_timesList);
ogfx::DebugTools::m_drawBasicFrameInfo = ogfx::DebugTools::m_debugWindowTabPanel.getSelectedTab() != 0;
}
}
m_upsAccumulator += m_upsClock.restart();
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::OnUpdate).totalTime += DebugTools::m_profileTimer.end(false);
DebugTools::m_timesList.get(DebugTools::OnUpdate).sampleCount++;
DebugTools::m_profileTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
}
onRender();
onGuiRender();
Renderer2D::resetStats();
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::OnRender).totalTime += DebugTools::m_profileTimer.end(false);
DebugTools::m_timesList.get(DebugTools::OnRender).sampleCount++;
DebugTools::m_profileTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
}
RenderCore::display();
if (DEBUG)
{
DebugTools::m_renderCmdCount = RenderCore::getRenderCmdCount();
}
RenderCore::resetRenderCmdCount();
Renderer2D::setDefaultRenderTarget();
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::OnDisplay).totalTime += DebugTools::m_profileTimer.end(false);
DebugTools::m_timesList.get(DebugTools::OnDisplay).sampleCount++;
DebugTools::m_profileTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
}
SignalHandler::refresh();
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::OnSignalsRefresh).totalTime += DebugTools::m_profileTimer.end(false);
DebugTools::m_timesList.get(DebugTools::OnSignalsRefresh).sampleCount++;
DebugTools::m_profileTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
}
m_window.renderFrame();
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::OnWindowDisplay).totalTime += DebugTools::m_profileTimer.end(false);
DebugTools::m_timesList.get(DebugTools::OnWindowDisplay).sampleCount++;
DebugTools::m_profileTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
}
onFrameEnd();
RenderCommandPool::newFrame();
if (DEBUG)
{
DebugTools::m_uniformUpdates = Shader::getUniformUpdateCount();
}
Shader::resetUniformUpdateCount();
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::OnFrameFinalize).totalTime += DebugTools::m_profileTimer.end(false);
DebugTools::m_timesList.get(DebugTools::OnFrameFinalize).sampleCount++;
}
if (!isRunning())
{
destroy();
OX_DEBUG("Destroying SFML Window");
}
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::TotalFrameTime).totalTime += DebugTools::m_totalFrameTimer.end(false);
DebugTools::m_timesList.get(DebugTools::TotalFrameTime).sampleCount++;
for (auto& data : DebugTools::m_timesList.data)
{
data.second.computeAvgTime();
}
}
}
void GraphicsApplication2D::handleSignal(tSignal& signal)
{
if (signal.ID == tBuiltinSignals::OnGuiEvent)
{
Event& evt = (Event&)signal.userData;
sf::Event& event = evt.sf();
if (event.type == sf::Event::Closed)
{
m_window.close();
onClose();
}
else if (event.type == sf::Event::KeyPressed)
{
if (event.key.code == sf::Keyboard::Escape)
{
m_window.close();
onClose();
}
onKeyPressed(evt);
}
else if (event.type == sf::Event::KeyReleased)
{
// if (event.key.code == sf::Keyboard::F9)
// m_showDebugInfo = !m_showDebugInfo;
onKeyReleased(evt);
}
else if (event.type == sf::Event::Resized)
{
glViewport(0, 0, event.size.width, event.size.height);
m_window.initialize();
}
else if (event.type == sf::Event::MouseMoved)
{
onMousePressed(evt);
}
else if (event.type == sf::Event::MouseButtonPressed)
{
onMouseReleased(evt);
}
else if (event.type == sf::Event::MouseButtonReleased)
{
onMouseMoved(evt);
}
}
onSignal(signal);
}
void GraphicsApplication2D::drawDebugInfo(RenderCore& gfx, Color col)
{
if (!ogfx::DebugTools::m_debugWindowEnabled || !ogfx::DebugTools::m_drawBasicFrameInfo) return;
gfx.drawText(StringEditor("FPS: ").addi(ogfx::DebugTools::m_fps).str(), { 5, 5 }, 30.0f, col);
gfx.drawText(StringEditor("FrameTime: ").addf(DebugTools::m_timesList.get(DebugTools::TotalFrameTime).getAvgTime()).str(), { 5, 35 }, 30.0f, col);
}
// void GraphicsApplication2D::drawDebugInfo(RenderCore& gfx, Color col)
// {
// if (!m_showDebugInfo) return;
// float sp = gfx.getTextSpacing();
// ResourceID font = gfx.getFont();
// Renderer2D::Text::font = ResourceManager::getDefaultBitmapFontMono();
// gfx.setTextSpacing(-15.0f);
// gfx.setFont(ResourceManager::getDefaultBitmapFontMono());
// float fontSize = 24;
// float fontSpacing = -15;
// float strw = 0;
// float maxw = 0;
// std::vector<String> debugStrings;
// debugStrings.reserve(100);
// StringEditor str;
// str = "DrawCalls: ";
// str.addi(Renderer2D::getRenderStats().drawCalls);
// strw = Renderer2D::Text::getStringBounds(str.str(), { 0, 0 }, fontSize, fontSpacing).x;
// debugStrings.push_back(str.str());
// if (strw > maxw) maxw = strw;
// str = "Quads: ";
// str.addi(Renderer2D::getRenderStats().quadCount);
// strw = Renderer2D::Text::getStringBounds(str.str(), { 0, 0 }, fontSize, fontSpacing).x;
// debugStrings.push_back(str.str());
// if (strw > maxw) maxw = strw;
// str = "FPS: ";
// str.addi(getFps());
// strw = Renderer2D::Text::getStringBounds(str.str(), { 0, 0 }, fontSize, fontSpacing).x;
// debugStrings.push_back(str.str());
// if (strw > maxw) maxw = strw;
// str = "UPS: ";
// str.addi(m_ups);
// strw = Renderer2D::Text::getStringBounds(str.str(), { 0, 0 }, fontSize, fontSpacing).x;
// debugStrings.push_back(str.str());
// if (strw > maxw) maxw = strw;
// str = "RenderTarget Binds: ";
// str.addi(Renderer2D::getRenderStats().renderBufferBinds);
// strw = Renderer2D::Text::getStringBounds(str.str(), { 0, 0 }, fontSize, fontSpacing).x;
// debugStrings.push_back(str.str());
// if (strw > maxw) maxw = strw;
// str = "Shader Binds: ";
// str.addi(Renderer2D::getRenderStats().shaderBinds);
// strw = Renderer2D::Text::getStringBounds(str.str(), { 0, 0 }, fontSize, fontSpacing).x;
// debugStrings.push_back(str.str());
// if (strw > maxw) maxw = strw;
// str = "Uniform Updates: ";
// str.addi(m_uniformUpdates);
// strw = Renderer2D::Text::getStringBounds(str.str(), { 0, 0 }, fontSize, fontSpacing).x;
// debugStrings.push_back(str.str());
// if (strw > maxw) maxw = strw;
// str = "Render Queue: ";
// str.addi(m_renderCmdCount);
// strw = Renderer2D::Text::getStringBounds(str.str(), { 0, 0 }, fontSize, fontSpacing).x;
// debugStrings.push_back(str.str());
// if (strw > maxw) maxw = strw;
// Renderer2D::Text::font = font;
// gfx.drawQuad({ 0, 0 }, { (maxw * 2) + 40, (debugStrings.size() * fontSize * 2) + 15 }, { 0, 0, 0, 223 });
// float offsety = 20;
// int32_t i = 0;
// for (auto& str : debugStrings)
// gfx.drawText(str, { 5.0f, 10.0f + (i++ * offsety) }, fontSize, col);
// gfx.setTextSpacing(sp);
// gfx.setFont(font);
// }
GraphicsApplication& GraphicsApplication::create(int32_t windowWidth, int32_t windowHeight, const ostd::String& windowTitle, tContextSettings contextSettings)
{
/** Window Code **/
m_window.create({ static_cast<float>(windowWidth), static_cast<float>(windowHeight) }, windowTitle, contextSettings);
if (!m_window.isValid())
{
ErrorHandler::pushError(GraphicsApplication::ERR_WINDOW_CREATE_FAIL);
String err_str = ErrorHandler::getLastErrorString();
OX_FATAL("%s", err_str.c_str());
return *this;
}
m_window.printOpenGLInfo();
// m_window.setWindowIcon(windowIconPath);
/** Subsystem initialization **/
Renderer2D::init();
SignalHandler::init();
ResourceManager::init();
Renderer2D::Text::init();
RenderCommandPool::init();
RenderCore::initRenderQUeue();
oxgui::WidgetManager::init();
/******************************/
m_lastFrameTime = Timer::getEpoch() / 1000.0;
enableVSync(false);
connectSignal(tBuiltinSignals::OnGuiEvent);
if (ogfx::DebugTools::m_debugWindowEnabled)
{
DebugTools::m_timesList.updateEntry(DebugTools::FramerateCalculations);
DebugTools::m_timesList.get(DebugTools::FramerateCalculations).name = "Framerate Calculations";
DebugTools::m_timesList.updateEntry(DebugTools::OnSecondsUpdate);
DebugTools::m_timesList.get(DebugTools::OnSecondsUpdate).name = "Seconds Update";
DebugTools::m_timesList.updateEntry(DebugTools::EventHandling);
DebugTools::m_timesList.get(DebugTools::EventHandling).name = "Event Handling";
DebugTools::m_timesList.updateEntry(DebugTools::OnUpdate);
DebugTools::m_timesList.get(DebugTools::OnUpdate).name = "Update";
DebugTools::m_timesList.updateEntry(DebugTools::OnRender);
DebugTools::m_timesList.get(DebugTools::OnRender).name = "Render";
DebugTools::m_timesList.updateEntry(DebugTools::OnDisplay);
DebugTools::m_timesList.get(DebugTools::OnDisplay).name = "Render Queue Execution";
DebugTools::m_timesList.updateEntry(DebugTools::OnFrameFinalize);
DebugTools::m_timesList.get(DebugTools::OnFrameFinalize).name = "Frame Finalize";
DebugTools::m_timesList.updateEntry(DebugTools::OnSignalsRefresh);
DebugTools::m_timesList.get(DebugTools::OnSignalsRefresh).name = "Signals Refresh";
DebugTools::m_timesList.updateEntry(DebugTools::OnWindowDisplay);
DebugTools::m_timesList.get(DebugTools::OnWindowDisplay).name = "Flip Buffers";
DebugTools::m_timesList.updateEntry(DebugTools::TotalFrameTime);
DebugTools::m_timesList.get(DebugTools::TotalFrameTime).name = "Total Frame Time";
m_debugToolsWindow.create({ 5, 5 }, { 600, 410 });
m_debugToolsWindow.enable();
m_debugToolsWindow.setTitle("Debug Tools");
// m_debugToolsWindow.setBounds(5, 5, 500, 385);
oxgui::WidgetTheme theme = oxgui::WidgetManager::getGlobalTheme();
oxgui::WidgetManager::addWidget(m_debugToolsWindow);
theme.subWindow.titleBarColor_focused = { 85, 0, 85 };
theme.subWindow.backgroundColor = { 0, 0, 0, 235 };
theme.subWindow.borderColor_focused = { 85, 0, 85 };
m_debugToolsWindow.setTheme(theme);
m_debugToolsWindow.enableGlobalThemeOverride(true);
theme.tabPanel.backgroundColor = { 10, 10, 10 };
theme.tabPanel.tabBackground_focused = { 10, 10, 10 };
// theme.tabPanel.tabBarBackground = { 85, 0, 85 };
DebugTools::m_debugWindowTabPanel.setTheme(theme);
DebugTools::m_debugWindowTabPanel.enableGlobalThemeOverride(true);
DebugTools::m_debugWindowTabPanel.create(m_debugToolsWindow);
DebugTools::m_debugWindowTabPanel.addTab(DebugTools::m_debugWindowInfoTab);
DebugTools::m_debugWindowTabPanel.addTab(DebugTools::m_debugWindowWatcherTab);
DebugTools::m_debugWindowTabPanel.addTab(DebugTools::m_debugWindowTab3);
DebugTools::m_debugWindowInfoTab.setText("Debug Info");
DebugTools::m_debugWindowWatcherTab.setText("Watcher");
DebugTools::m_debugWindowTab3.setText("Tab3");
DebugTools::m_debugWindowTabPanel.selectTab(0);
DebugTools::m_debugInfoWidget.init(DebugTools::m_debugWindowInfoTab);
}
setTypeName("ogfx::GraphicsApplication");
validate();
m_window.initialize();
onSetup();
return *this;
}
void GraphicsApplication::destroy(void)
{
RenderCommandPool::destroy();
Renderer2D::shutdown();
}
void GraphicsApplication::nextFrame(void)
{
if (!isRunning()) return;
const bool DEBUG = ogfx::DebugTools::m_debugWindowEnabled;
if (DEBUG)
{
DebugTools::m_totalFrameTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
DebugTools::m_profileTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
}
double currTime = Timer::getEpoch() / 1000.0;
m_rtfps++;
RTData::DeltaTime = (float)(currTime - m_lastFrameTime);
m_lastFrameTime = currTime;
double timeDiff = currTime - m_prevTime;
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::FramerateCalculations).totalTime += DebugTools::m_profileTimer.end(false);
DebugTools::m_timesList.get(DebugTools::FramerateCalculations).sampleCount++;
DebugTools::m_profileTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
}
if (timeDiff >= 1.0f)
{
onSecondsUpdate();
// SoundHandler::update();
m_prevTime = currTime;
if (DEBUG)
{
DebugTools::m_fps = m_rtfps;
DebugTools::m_ups = m_rtups;
for (auto& data : DebugTools::m_timesList.data)
{
data.second.computeAvgTime();
data.second.sampleCount = 1;
data.second.totalTime = data.second.getAvgTime();
}
}
m_rtfps = 0;
m_rtups = 0;
}
onFrameStart();
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::OnSecondsUpdate).totalTime += DebugTools::m_profileTimer.end(false);
DebugTools::m_timesList.get(DebugTools::OnSecondsUpdate).sampleCount++;
DebugTools::m_profileTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
}
m_window.handleEvents();
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::EventHandling).totalTime += DebugTools::m_profileTimer.end(false);
DebugTools::m_timesList.get(DebugTools::EventHandling).sampleCount++;
DebugTools::m_profileTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
}
while (m_upsAccumulator > m_upsStep)
{
onUpdate();
m_upsAccumulator -= m_upsStep;
m_rtups++;
if (DEBUG)
{
SignalHandler::emitSignal(DebugTools::OnProfileDataRecieved, tSignalPriority::RealTime, DebugTools::m_timesList);
ogfx::DebugTools::m_drawBasicFrameInfo = ogfx::DebugTools::m_debugWindowTabPanel.getSelectedTab() != 0;
}
}
m_upsAccumulator += m_upsClock.restart();
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::OnUpdate).totalTime += DebugTools::m_profileTimer.end(false);
DebugTools::m_timesList.get(DebugTools::OnUpdate).sampleCount++;
DebugTools::m_profileTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
}
onRender();
onGuiRender();
Renderer2D::resetStats();
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::OnRender).totalTime += DebugTools::m_profileTimer.end(false);
DebugTools::m_timesList.get(DebugTools::OnRender).sampleCount++;
DebugTools::m_profileTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
}
RenderCore::display();
if (DEBUG)
{
DebugTools::m_renderCmdCount = RenderCore::getRenderCmdCount();
}
RenderCore::resetRenderCmdCount();
Renderer2D::setDefaultRenderTarget();
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::OnDisplay).totalTime += DebugTools::m_profileTimer.end(false);
DebugTools::m_timesList.get(DebugTools::OnDisplay).sampleCount++;
DebugTools::m_profileTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
}
SignalHandler::refresh();
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::OnSignalsRefresh).totalTime += DebugTools::m_profileTimer.end(false);
DebugTools::m_timesList.get(DebugTools::OnSignalsRefresh).sampleCount++;
DebugTools::m_profileTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
}
m_window.renderFrame();
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::OnWindowDisplay).totalTime += DebugTools::m_profileTimer.end(false);
DebugTools::m_timesList.get(DebugTools::OnWindowDisplay).sampleCount++;
DebugTools::m_profileTimer.start(false, "", ostd::eTimeUnits::Milliseconds);
}
onFrameEnd();
RenderCommandPool::newFrame();
if (DEBUG)
{
DebugTools::m_uniformUpdates = Shader::getUniformUpdateCount();
}
Shader::resetUniformUpdateCount();
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::OnFrameFinalize).totalTime += DebugTools::m_profileTimer.end(false);
DebugTools::m_timesList.get(DebugTools::OnFrameFinalize).sampleCount++;
}
if (!isRunning())
{
destroy();
OX_DEBUG("Destroying SFML Window");
}
if (DEBUG)
{
DebugTools::m_timesList.get(DebugTools::TotalFrameTime).totalTime += DebugTools::m_totalFrameTimer.end(false);
DebugTools::m_timesList.get(DebugTools::TotalFrameTime).sampleCount++;
for (auto& data : DebugTools::m_timesList.data)
{
data.second.computeAvgTime();
}
}
}
void GraphicsApplication::handleSignal(tSignal& signal)
{
if (signal.ID == tBuiltinSignals::OnGuiEvent)
{
Event& evt = (Event&)signal.userData;
sf::Event& event = evt.sf();
if (event.type == sf::Event::Closed)
{
m_window.close();
onClose();
}
else if (event.type == sf::Event::KeyPressed)
{
if (event.key.code == sf::Keyboard::Escape)
{
m_window.close();
onClose();
}
onKeyPressed(evt);
}
else if (event.type == sf::Event::KeyReleased)
{
onKeyReleased(evt);
}
else if (event.type == sf::Event::Resized)
{
glViewport(0, 0, event.size.width, event.size.height);
m_window.initialize();
}
else if (event.type == sf::Event::MouseMoved)
{
onMousePressed(evt);
}
else if (event.type == sf::Event::MouseButtonPressed)
{
onMouseReleased(evt);
}
else if (event.type == sf::Event::MouseButtonReleased)
{
onMouseMoved(evt);
}
}
onSignal(signal);
}
void GraphicsApplication::drawDebugInfo(RenderCore& gfx, Color col)
{
if (!ogfx::DebugTools::m_debugWindowEnabled || !ogfx::DebugTools::m_drawBasicFrameInfo) return;
gfx.drawText(StringEditor("FPS: ").addi(ogfx::DebugTools::m_fps).str(), { 5, 5 }, 30.0f, col);
gfx.drawText(StringEditor("FrameTime: ").addf(DebugTools::m_timesList.get(DebugTools::TotalFrameTime).getAvgTime()).str(), { 5, 35 }, 30.0f, col);
}
}