AnimTestbed/3rdparty/imgui-node-editor/examples/application/source/application.cpp

245 lines
5.5 KiB
C++

# include "application.h"
# include "setup.h"
# include "platform.h"
# include "renderer.h"
extern "C" {
#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_STATIC
#include "stb_image.h"
}
Application::Application(const char* name)
: Application(name, 0, nullptr)
{
}
Application::Application(const char* name, int argc, char** argv)
: m_Name(name)
, m_Platform(CreatePlatform(*this))
, m_Renderer(CreateRenderer())
{
m_Platform->ApplicationStart(argc, argv);
}
Application::~Application()
{
m_Renderer->Destroy();
m_Platform->ApplicationStop();
if (m_Context)
{
ImGui::DestroyContext(m_Context);
m_Context= nullptr;
}
}
bool Application::Create(int width /*= -1*/, int height /*= -1*/)
{
m_Context = ImGui::CreateContext();
ImGui::SetCurrentContext(m_Context);
if (!m_Platform->OpenMainWindow("Application", width, height))
return false;
if (!m_Renderer->Create(*m_Platform))
return false;
m_IniFilename = m_Name + ".ini";
ImGuiIO& io = ImGui::GetIO();
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
io.IniFilename = m_IniFilename.c_str();
io.LogFilename = nullptr;
ImGui::StyleColorsDark();
RecreateFontAtlas();
m_Platform->AcknowledgeWindowScaleChanged();
m_Platform->AcknowledgeFramebufferScaleChanged();
OnStart();
Frame();
return true;
}
int Application::Run()
{
m_Platform->ShowMainWindow();
while (m_Platform->ProcessMainWindowEvents())
{
if (!m_Platform->IsMainWindowVisible())
continue;
Frame();
}
OnStop();
return 0;
}
void Application::RecreateFontAtlas()
{
ImGuiIO& io = ImGui::GetIO();
IM_DELETE(io.Fonts);
io.Fonts = IM_NEW(ImFontAtlas);
ImFontConfig config;
config.OversampleH = 4;
config.OversampleV = 4;
config.PixelSnapH = false;
m_DefaultFont = io.Fonts->AddFontFromFileTTF("data/Play-Regular.ttf", 18.0f, &config);
m_HeaderFont = io.Fonts->AddFontFromFileTTF("data/Cuprum-Bold.ttf", 20.0f, &config);
io.Fonts->Build();
}
void Application::Frame()
{
auto& io = ImGui::GetIO();
if (m_Platform->HasWindowScaleChanged())
m_Platform->AcknowledgeWindowScaleChanged();
if (m_Platform->HasFramebufferScaleChanged())
{
RecreateFontAtlas();
m_Platform->AcknowledgeFramebufferScaleChanged();
}
const float windowScale = m_Platform->GetWindowScale();
const float framebufferScale = m_Platform->GetFramebufferScale();
if (io.WantSetMousePos)
{
io.MousePos.x *= windowScale;
io.MousePos.y *= windowScale;
}
m_Platform->NewFrame();
// Don't touch "uninitialized" mouse position
if (io.MousePos.x > -FLT_MAX && io.MousePos.y > -FLT_MAX)
{
io.MousePos.x /= windowScale;
io.MousePos.y /= windowScale;
}
io.DisplaySize.x /= windowScale;
io.DisplaySize.y /= windowScale;
io.DisplayFramebufferScale.x = framebufferScale;
io.DisplayFramebufferScale.y = framebufferScale;
m_Renderer->NewFrame();
ImGui::NewFrame();
ImGui::SetNextWindowPos(ImVec2(0, 0));
ImGui::SetNextWindowSize(io.DisplaySize);
const auto windowBorderSize = ImGui::GetStyle().WindowBorderSize;
const auto windowRounding = ImGui::GetStyle().WindowRounding;
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
ImGui::Begin("Content", nullptr, GetWindowFlags());
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, windowBorderSize);
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, windowRounding);
OnFrame(io.DeltaTime);
ImGui::PopStyleVar(2);
ImGui::End();
ImGui::PopStyleVar(2);
// Rendering
m_Renderer->Clear(ImColor(32, 32, 32, 255));
ImGui::Render();
m_Renderer->RenderDrawData(ImGui::GetDrawData());
m_Platform->FinishFrame();
}
void Application::SetTitle(const char* title)
{
m_Platform->SetMainWindowTitle(title);
}
bool Application::Close()
{
return m_Platform->CloseMainWindow();
}
void Application::Quit()
{
m_Platform->Quit();
}
const std::string& Application::GetName() const
{
return m_Name;
}
ImFont* Application::DefaultFont() const
{
return m_DefaultFont;
}
ImFont* Application::HeaderFont() const
{
return m_HeaderFont;
}
ImTextureID Application::LoadTexture(const char* path)
{
int width = 0, height = 0, component = 0;
if (auto data = stbi_load(path, &width, &height, &component, 4))
{
auto texture = CreateTexture(data, width, height);
stbi_image_free(data);
return texture;
}
else
return nullptr;
}
ImTextureID Application::CreateTexture(const void* data, int width, int height)
{
return m_Renderer->CreateTexture(data, width, height);
}
void Application::DestroyTexture(ImTextureID texture)
{
m_Renderer->DestroyTexture(texture);
}
int Application::GetTextureWidth(ImTextureID texture)
{
return m_Renderer->GetTextureWidth(texture);
}
int Application::GetTextureHeight(ImTextureID texture)
{
return m_Renderer->GetTextureHeight(texture);
}
ImGuiWindowFlags Application::GetWindowFlags() const
{
return
ImGuiWindowFlags_NoTitleBar |
ImGuiWindowFlags_NoResize |
ImGuiWindowFlags_NoMove |
ImGuiWindowFlags_NoScrollbar |
ImGuiWindowFlags_NoScrollWithMouse |
ImGuiWindowFlags_NoSavedSettings |
ImGuiWindowFlags_NoBringToFrontOnFocus;
}