371 lines
10 KiB
C++
371 lines
10 KiB
C++
#include "CApplication.h"
|
|
|
|
|
|
|
|
CApplication::CApplication()
|
|
{
|
|
|
|
}
|
|
|
|
CApplication::CApplication(CApplication &&other) noexcept
|
|
{
|
|
|
|
}
|
|
|
|
CApplication::CApplication(int argcs,char** argv) noexcept
|
|
{
|
|
this->argc = argcs;
|
|
this->argv = new std::string[argc+1];
|
|
for (int i = 0; i < argcs; i++)
|
|
{
|
|
this->argv[i] = argv[i];
|
|
}
|
|
}
|
|
|
|
CApplication::CApplication(CApplication *CApp)
|
|
{
|
|
|
|
}
|
|
|
|
#ifdef _WIN32
|
|
|
|
// Data stored per platform window
|
|
struct WGL_WindowData { HDC hDC; };
|
|
|
|
// Data
|
|
static HGLRC g_hRC;
|
|
static WGL_WindowData g_MainWindow;
|
|
static int g_Width;
|
|
static int g_Height;
|
|
bool CreateDeviceWGL(HWND hWnd, WGL_WindowData* data)
|
|
{
|
|
HDC hDc = ::GetDC(hWnd);
|
|
PIXELFORMATDESCRIPTOR pfd = { 0 };
|
|
pfd.nSize = sizeof(pfd);
|
|
pfd.nVersion = 1;
|
|
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
|
|
pfd.iPixelType = PFD_TYPE_RGBA;
|
|
pfd.cColorBits = 32;
|
|
|
|
const int pf = ::ChoosePixelFormat(hDc, &pfd);
|
|
if (pf == 0)
|
|
return false;
|
|
if (::SetPixelFormat(hDc, pf, &pfd) == FALSE)
|
|
return false;
|
|
::ReleaseDC(hWnd, hDc);
|
|
|
|
data->hDC = ::GetDC(hWnd);
|
|
if (!g_hRC)
|
|
g_hRC = wglCreateContext(data->hDC);
|
|
return true;
|
|
}
|
|
|
|
void CleanupDeviceWGL(HWND hWnd, WGL_WindowData* data)
|
|
{
|
|
wglMakeCurrent(nullptr, nullptr);
|
|
::ReleaseDC(hWnd, data->hDC);
|
|
}
|
|
|
|
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
|
|
|
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam))
|
|
return true;
|
|
|
|
switch (msg)
|
|
{
|
|
case WM_SIZE:
|
|
if (wParam != SIZE_MINIMIZED)
|
|
{
|
|
g_Width = LOWORD(lParam);
|
|
g_Height = HIWORD(lParam);
|
|
}
|
|
return 0;
|
|
case WM_SYSCOMMAND:
|
|
if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu
|
|
return 0;
|
|
break;
|
|
case WM_DESTROY:
|
|
::PostQuitMessage(0);
|
|
return 0;
|
|
|
|
}
|
|
return ::DefWindowProcW(hWnd, msg, wParam, lParam);
|
|
}
|
|
|
|
std::wstring String2Wstring(std::string wstr)
|
|
{
|
|
std::wstring res;
|
|
int len = MultiByteToWideChar(CP_ACP, 0, wstr.c_str(), wstr.size(), nullptr, 0);
|
|
if( len < 0 ){
|
|
return res;
|
|
}
|
|
wchar_t* buffer = new wchar_t[len + 1];
|
|
if( buffer == nullptr){
|
|
return res;
|
|
}
|
|
MultiByteToWideChar(CP_ACP, 0, wstr.c_str(), wstr.size(), buffer, len);
|
|
buffer[len] = '\0';
|
|
res.append(buffer);
|
|
delete[] buffer;
|
|
return res;
|
|
}
|
|
|
|
#endif //
|
|
bool CApplication::WindowCreate()
|
|
{
|
|
#ifdef _WIN32
|
|
glfwSetErrorCallback(glfw_error_callback);
|
|
if (!glfwInit())
|
|
return false;
|
|
|
|
// Decide GL+GLSL versions
|
|
#if defined(IMGUI_IMPL_OPENGL_ES2)
|
|
// GL ES 2.0 + GLSL 100
|
|
glsl_version = "#version 100";
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
|
|
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);
|
|
#elif defined(__APPLE__)
|
|
// GL 3.2 + GLSL 150
|
|
glsl_version = "#version 150";
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
|
|
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only
|
|
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Required on Mac
|
|
#else
|
|
// GL 3.0 + GLSL 130
|
|
glsl_version = "#version 130";
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
|
|
glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_TRUE);
|
|
//glfwWindowHint(GLFW_DECORATED, GLFW_FALSE);
|
|
// glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only
|
|
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 3.0+ only
|
|
#endif
|
|
if(NoFrameFlag)
|
|
{
|
|
glfwWindowHint(GLFW_DECORATED, GLFW_FALSE);
|
|
glfwWindowHint(GLFW_FLOATING, GLFW_TRUE);
|
|
}
|
|
|
|
mode = (GLFWvidmode*)glfwGetVideoMode(glfwGetPrimaryMonitor());
|
|
// Create window with graphics context
|
|
window = glfwCreateWindow((int)Size.width,(int)Size.height,Title.c_str(), nullptr, nullptr);
|
|
if (window == nullptr)
|
|
return false;
|
|
WindowCreateFlag = true;
|
|
// glfwSetWindowOpacity(window,this->opacity);
|
|
if(CenterFlag)
|
|
{
|
|
int width = Size.width, height = Size.height;
|
|
Pos.X = (mode->width - width) / 2;
|
|
Pos.Y = (mode->height - height) / 2;
|
|
}
|
|
glfwSetWindowPos(window,Pos.X,Pos.Y);
|
|
glfwMakeContextCurrent(window);
|
|
glfwSwapInterval(1); // Enable vsync
|
|
|
|
// Setup Dear ImGui context
|
|
IMGUI_CHECKVERSION();
|
|
ImGui::CreateContext();
|
|
ImGuiIO& io = ImGui::GetIO(); (void)io;
|
|
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
|
|
io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
|
|
//io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // Enable Docking
|
|
|
|
ImGui::StyleColorsDark();
|
|
|
|
ImGuiStyle& style = ImGui::GetStyle();
|
|
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
|
|
{
|
|
style.WindowRounding = 15.0f;
|
|
style.Colors[ImGuiCol_WindowBg].w = 1.0f;
|
|
}
|
|
#else
|
|
glfwSetErrorCallback(glfw_error_callback);
|
|
if (!glfwInit())
|
|
return false;
|
|
|
|
// Decide GL+GLSL versions
|
|
#if defined(IMGUI_IMPL_OPENGL_ES2)
|
|
// GL ES 2.0 + GLSL 100
|
|
glsl_version = "#version 100";
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
|
|
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);
|
|
#elif defined(__APPLE__)
|
|
// GL 3.2 + GLSL 150
|
|
glsl_version = "#version 150";
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
|
|
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only
|
|
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Required on Mac
|
|
#else
|
|
// GL 3.0 + GLSL 130
|
|
glsl_version = "#version 130";
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
|
|
//glfwWindowHint(GLFW_DECORATED, GLFW_FALSE);
|
|
glfwWindowHint(GLFW_TRANSPARENT_FRAMEBUFFER, GLFW_TRUE);
|
|
//glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only
|
|
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 3.0+ only
|
|
#endif
|
|
if(NoFrameFlag)
|
|
{
|
|
glfwWindowHint(GLFW_DECORATED, GLFW_FALSE);
|
|
glfwWindowHint(GLFW_FLOATING, GLFW_TRUE);
|
|
}
|
|
|
|
mode = (GLFWvidmode*)glfwGetVideoMode(glfwGetPrimaryMonitor());
|
|
// Create window with graphics context
|
|
window = glfwCreateWindow((int)Size.width,(int)Size.height,Title.c_str(), nullptr, nullptr);
|
|
if (window == nullptr)
|
|
return false;
|
|
WindowCreateFlag = true;
|
|
|
|
//glfwSetWindowOpacity(window,this->opacity);
|
|
if(CenterFlag)
|
|
{
|
|
int width = Size.width, height = Size.height;
|
|
Pos.X = (mode->width - width) / 2;
|
|
Pos.Y = (mode->height - height) / 2;
|
|
}
|
|
glfwSetWindowPos(window,Pos.X,Pos.Y);
|
|
glfwMakeContextCurrent(window);
|
|
glfwSwapInterval(1); // Enable vsync
|
|
this->x11Window = glfwGetX11Window(window);
|
|
display = glfwGetX11Display();
|
|
|
|
// Setup Dear ImGui context
|
|
IMGUI_CHECKVERSION();
|
|
ImGui::CreateContext();
|
|
ImGuiIO& io = ImGui::GetIO(); (void)io;
|
|
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
|
|
io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
|
|
//io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // Enable Docking
|
|
|
|
ImGui::StyleColorsDark();
|
|
|
|
ImGuiStyle& style = ImGui::GetStyle();
|
|
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
|
|
{
|
|
style.WindowRounding = 15.0f;
|
|
style.Colors[ImGuiCol_WindowBg].w = 1.0f;
|
|
}
|
|
#endif
|
|
return true;
|
|
}
|
|
|
|
void CApplication::InitGL()
|
|
{
|
|
#ifdef _WIN32
|
|
#else
|
|
#endif
|
|
// Setup Platform/Renderer backends
|
|
ImGui_ImplGlfw_InitForOpenGL(window, true);
|
|
#ifdef __EMSCRIPTEN__
|
|
ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback("#canvas");
|
|
#endif
|
|
ImGui_ImplOpenGL3_Init(glsl_version.c_str());
|
|
}
|
|
|
|
bool CApplication::NewFrame()
|
|
{
|
|
#ifdef _WIN32
|
|
|
|
#else
|
|
|
|
#endif
|
|
|
|
#ifdef __EMSCRIPTEN__
|
|
// For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file.
|
|
// You may manually call LoadIniSettingsFromMemory() to load settings from your own storage.
|
|
io.IniFilename = nullptr;
|
|
EMSCRIPTEN_MAINLOOP_BEGIN
|
|
|
|
glfwPollEvents();
|
|
|
|
// Start the Dear ImGui frame
|
|
ImGui_ImplOpenGL3_NewFrame();
|
|
ImGui_ImplGlfw_NewFrame();
|
|
ImGui::NewFrame();
|
|
|
|
return true;
|
|
#else
|
|
|
|
#endif
|
|
auto flags = !glfwWindowShouldClose(window);
|
|
if(!flags)
|
|
{
|
|
|
|
}
|
|
return flags;
|
|
}
|
|
|
|
void CApplication::Render()
|
|
{
|
|
#ifdef _WIN32
|
|
|
|
#else
|
|
|
|
#endif
|
|
ImGui::Render();
|
|
int display_w, display_h;
|
|
glfwGetFramebufferSize(window, &display_w, &display_h);
|
|
glViewport(0, 0, display_w, display_h);
|
|
glClearColor(ClearGround.x * ClearGround.w, ClearGround.y * ClearGround.w, ClearGround.z * ClearGround.w, ClearGround.w);
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
|
|
|
auto io = ImGui::GetIO();
|
|
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
|
|
{
|
|
GLFWwindow* backup_current_context = glfwGetCurrentContext();
|
|
ImGui::UpdatePlatformWindows();
|
|
ImGui::RenderPlatformWindowsDefault();
|
|
glfwMakeContextCurrent(backup_current_context);
|
|
}
|
|
glfwSwapBuffers(window);
|
|
}
|
|
|
|
int CApplication::SwapBuffers()
|
|
{
|
|
#ifdef _WIN32
|
|
#else
|
|
#endif
|
|
ImGui_ImplOpenGL3_Shutdown();
|
|
ImGui_ImplGlfw_Shutdown();
|
|
delete UI_ID::Fons;
|
|
//ImGui::DestroyContext();
|
|
glfwDestroyWindow(window);
|
|
glfwTerminate();
|
|
return 0;
|
|
}
|
|
|
|
int CApplication::Stop()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
CCString CApplication::GetTheProgramDirectory() {
|
|
char buffer[PATH_MAX] = {0};
|
|
if (getcwd(buffer, sizeof(buffer)) != nullptr) {
|
|
return buffer;
|
|
} else {
|
|
perror("getcwd() error");
|
|
return "";
|
|
}
|
|
}
|
|
|
|
void CApplication::Close() {
|
|
exit(0);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|