TerraForge3D  2.3.1
3D Terrain And Landscape Generator
Application.cpp
1#pragma once
2
3#include "Base/Application.h"
4#include "implot.h"
5
6#include <imgui/imgui.h>
7#include <imgui/backends/imgui_impl_glfw.h>
8#include <imgui/backends/imgui_impl_opengl3.h>
9
10#include <imnodes/imnodes.h>
11
12#include <glad/glad.h>
13#include <GLFW/glfw3.h>
14#include <iostream>
15#include <string>
16
17static void Log(const char *log)
18{
19 std::cout << log << std::endl;
20};
21
22static void InitGlad()
23{
24 if (!gladLoadGL())
25 {
26 Log("Failed to Initialize GLAD!");
27 exit(-1);
28 }
29}
30
31static void InitImGui(std::string &configPath)
32{
33 IMGUI_CHECKVERSION();
34 ImGui::CreateContext();
35 ImPlot::CreateContext();
36 ImNodes::CreateContext();
37 ImGuiIO &io = ImGui::GetIO();
38 (void)io;
39 io.IniFilename = configPath.c_str();
40 io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
41 io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
42#ifdef TERR3D_WIN32 // Multiviewport is not supported stable on linux
43 io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
44#endif
45 io.ConfigViewportsNoTaskBarIcon = false;
46 io.ConfigViewportsNoAutoMerge = true;
47 ImGui::StyleColorsDark();
48 ImGuiStyle &style = ImGui::GetStyle();
49
50 if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
51 {
52 style.WindowRounding = 0.0f;
53 style.Colors[ImGuiCol_WindowBg].w = 1.0f;
54 }
55
56 ImGui_ImplGlfw_InitForOpenGL(static_cast<GLFWwindow *>(Application::Get()->GetWindow()->GetNativeWindow()), true);
57 ImGui_ImplOpenGL3_Init("#version 330");
58}
59
60static void ImGuiShutdown()
61{
62 ImGui_ImplOpenGL3_Shutdown();
63 ImGui_ImplGlfw_Shutdown();
64 ImNodes::DestroyContext();
65 ImPlot::DestroyContext();
66 ImGui::DestroyContext();
67}
68
69Application *Application::s_App;
70
71
72
73Application::Application()
74{
75}
76
77void Application::SetWindowConfigPath(std::string path)
78{
79 windowConfigPath = path;
80}
81
82void Application::SetLogsDir(std::string ld)
83{
84 logsDir = ld;
85}
86
87void Application::SetTitle(std::string title)
88{
89 m_WindowTitle = title;
90}
91
92void Application::Init()
93{
94 m_Window = new Window(m_WindowTitle);
95 m_Window->SetVSync(true);
96 m_Window->SetVisible(false);
97 isActive = true;
98 s_App = this;
99 InitGlad();
100 InitImGui(windowConfigPath);
101}
102
103void Application::Render()
104{
105}
106
107void Application::ImGuiRenderBegin()
108{
109 ImGuiIO &io = ImGui::GetIO();
110 ImGui_ImplGlfw_NewFrame();
111 ImGui_ImplOpenGL3_NewFrame();
112 ImGui::NewFrame();
113}
114
115void Application::ImGuiRenderEnd()
116{
117 ImGui::EndFrame();
118 ImGui::Render();
119 ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
120 ImGuiIO &io = ImGui::GetIO();
121
122 if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
123 {
124 GLFWwindow *backup_current_context = glfwGetCurrentContext();
125 ImGui::UpdatePlatformWindows();
126 ImGui::RenderPlatformWindowsDefault();
127 glfwMakeContextCurrent(backup_current_context);
128 }
129}
130
131bool Application::IsActive()
132{
133 return isActive;
134}
135
136void Application::RenderImGui()
137{
138 glEnable(GL_BLEND);
139 ImGuiRenderBegin();
140 OnImGuiRender();
141 ImGuiRenderEnd();
142 glDisable(GL_BLEND);
143}
144
145void Application::Run(std::string loadFile)
146{
147 m_Window->SetVisible(true);
148 float oneSecCounter = 0;
149
150 while (isActive)
151 {
152 float currentTime = glfwGetTime();
153 float deltaTime = currentTime - previousTime;
154 previousTime = currentTime;
155 oneSecCounter += deltaTime;
156 OnUpdate(deltaTime);
157
158 if (oneSecCounter >= 1)
159 {
160 OnOneSecondTick();
161 oneSecCounter = 0;
162 }
163
164 Render();
165 m_Window->Update();
166 }
167
168 OnEnd();
169 ImGuiShutdown();
170}
171
172
173Application::~Application()
174{
175 std::cout << "Shutting down Application" << std::endl;
176 delete m_Window;
177}
Definition: Window.h:26