From 8e27b83b22549545fe61d316ed58c92cd3081212 Mon Sep 17 00:00:00 2001 From: InkSoul Date: Sat, 17 Jun 2023 01:18:15 +0800 Subject: [PATCH] reconstruct UI complete --- base/ui.hpp | 48 ++++++----- src/render/render.cpp | 192 +++++++++++++++++++++++++----------------- 2 files changed, 142 insertions(+), 98 deletions(-) diff --git a/base/ui.hpp b/base/ui.hpp index 42121ef..fe4340c 100644 --- a/base/ui.hpp +++ b/base/ui.hpp @@ -241,24 +241,7 @@ public: vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); vkDestroyDescriptorPool(device, descriptorPool, nullptr); } - std::string string_to_utf8(const std::string& str) - { - int nwLen = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0); - wchar_t* pwBuf = new wchar_t[nwLen + 1]; - memset(pwBuf, 0, nwLen * 2 + 2); - MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen); - int nLen = WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL); - char* pBuf = new char[nLen + 1]; - memset(pBuf, 0, nLen + 1); - WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL); - - std::string ret = pBuf; - delete[]pwBuf; - delete[]pBuf; - - return ret; - } void draw(VkCommandBuffer cmdBuffer) { vkCmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); vkCmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, nullptr); @@ -334,19 +317,38 @@ public: bool button(const char *caption) { return ImGui::Button(caption); } + bool beginChild(const char* caption, ImVec2 size, bool border) + { + return ImGui::BeginChild(caption, size, border); + } - bool beginMenu(const char* caption) { + void endChild() + { + return ImGui::EndChild(); + } + + // menu GUI + bool beginMainMenuBar() { + return ImGui::BeginMainMenuBar(); + } + + bool beginMenu(const char* caption) + { return ImGui::BeginMenu(caption); } - bool menuItem(const char* caption,const char* shortcut) + bool menuItem(const char* caption) { - return ImGui::MenuItem(caption, shortcut); + return ImGui::MenuItem(caption); + } + void endMenu() + { + return ImGui::EndMenu(); } - bool beginMenuBar() - { - return ImGui::BeginMenuBar(); + + void endMainMenuBar() { + return ImGui::EndMainMenuBar(); } void text(const char *formatstr, ...) { diff --git a/src/render/render.cpp b/src/render/render.cpp index 528e0d2..8952128 100644 --- a/src/render/render.cpp +++ b/src/render/render.cpp @@ -1675,93 +1675,135 @@ PlumageRender::PlumageRender() bool updateShaderParams = false; bool updateCBs = false; float scale = 1.0f; + bool boolTitleWindowShow = false; ImGui::NewFrame(); - ImGui::SetNextWindowPos(ImVec2(10, 10)); - ImGui::SetNextWindowSize(ImVec2(200 * scale, (models.scene.animations.size() > 0 ? 440 : 360) * scale), ImGuiSetCond_Always); - ImGui::Begin("Plumage Render", nullptr, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove); + ImGui::SetNextWindowPos(ImVec2(10000, 10000)); + //ImGui::SetNextWindowSize(ImVec2(200 * scale, (models.scene.animations.size() > 0 ? 440 : 360) * scale), ImGuiSetCond_Always); + ImGui::Begin("", nullptr, ImGuiWindowFlags_NoFocusOnAppearing|ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoBringToFrontOnFocus); + ImGui::PushItemWidth(100.0f * scale); - gui->text("%.1d fps (%.2f ms)", lastFPS, (1000.0f / lastFPS)); - // TO DO : language switch - if (gui->header(chineseUI.model)) { - if (gui->button(chineseUI.openNewModel)) { - std::wstring filename = L""; - wchar_t buffer[MAX_PATH]; - OPENFILENAMEW ofn; - ZeroMemory(&buffer, sizeof(buffer)); - ZeroMemory(&ofn, sizeof(ofn)); - ofn.lStructSize = sizeof(ofn); - ofn.lpstrFilter = L"glTF files\0*.gltf;*.glb\0"; - ofn.lpstrFile = buffer; - ofn.nMaxFile = MAX_PATH; - ofn.lpstrTitle = L"Select a glTF file to load"; - ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR; - if (GetOpenFileNameW(&ofn)) { - filename = buffer; - + + + if(gui->beginMainMenuBar()) { + if (gui->beginMenu("file")) + { + if (gui->menuItem("open")) + { + std::wstring filename = L""; + wchar_t buffer[MAX_PATH]; + OPENFILENAMEW ofn; + ZeroMemory(&buffer, sizeof(buffer)); + ZeroMemory(&ofn, sizeof(ofn)); + ofn.lStructSize = sizeof(ofn); + ofn.lpstrFilter = L"glTF files\0*.gltf;*.glb\0"; + ofn.lpstrFile = buffer; + ofn.nMaxFile = MAX_PATH; + ofn.lpstrTitle = L"Select a glTF file to load"; + ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR; + if (GetOpenFileNameW(&ofn)) { + filename = buffer; + + } + + if (!filename.empty()) { + vkDeviceWaitIdle(device); + std::wstring_convert> converter; + std::string stringFilename = converter.to_bytes(filename); + loadScene(stringFilename); + setupDescriptors(); + updateCBs = true; + } } - - if (!filename.empty()) { - vkDeviceWaitIdle(device); - std::wstring_convert> converter; - std::string stringFilename = converter.to_bytes(filename); - loadScene(stringFilename); - setupDescriptors(); - updateCBs = true; + gui->endMenu(); + } + if (gui->beginMenu("environment")) + { + if (gui->beginMenu("config")) + { + if (gui->combo(chineseUI.environmentMap, selectedEnvironment, environments)) { + vkDeviceWaitIdle(device); + loadEnvironment(environments[selectedEnvironment]); + setupDescriptors(); + updateCBs = true; + } + if (gui->checkbox("Background", &displayBackground)) { + updateShaderParams = true; + } + if (gui->slider("Exposure", &shaderData.exposure, 0.1f, 10.0f)) { + updateShaderParams = true; + } + if (gui->slider("Gamma", &shaderData.gamma, 0.1f, 4.0f)) { + updateShaderParams = true; + } + if (gui->slider("IBL", &shaderData.scaleIBLAmbient, 0.0f, 1.0f)) { + updateShaderParams = true; + } + gui->endMenu(); } + gui->endMenu(); } - if (gui->combo(chineseUI.environmentMap, selectedEnvironment, environments)) { - vkDeviceWaitIdle(device); - loadEnvironment(environments[selectedEnvironment]); - setupDescriptors(); - updateCBs = true; - } - } - - if (gui->header(chineseUI.environment)) { - if (gui->checkbox("Background", &displayBackground)) { - updateShaderParams = true; - } - if (gui->slider("Exposure", &shaderData.exposure, 0.1f, 10.0f)) { - updateShaderParams = true; - } - if (gui->slider("Gamma", &shaderData.gamma, 0.1f, 4.0f)) { - updateShaderParams = true; - } - if (gui->slider("IBL", &shaderData.scaleIBLAmbient, 0.0f, 1.0f)) { - updateShaderParams = true; - } - } - - if (gui->header("Debug ")) { - const std::vector debugNamesInputs = { + if (gui->beginMenu("debug")) + { + if (gui->beginMenu("input")) + { + const std::vector debugNamesInputs = { "none", "Base color", "Normal", "Occlusion", "Emissive", "Metallic", "Roughness" - }; - if (gui->combo(chineseUI.debugInput, &debugViewInputs, debugNamesInputs)) { - shaderData.debugViewInputs = static_cast(debugViewInputs); - updateShaderParams = true; - } - const std::vector debugNamesEquation = { - "none", "Diff (l,n)", "F (l,h)", "G (l,v,h)", "D (h)", "Specular" - }; - if (gui->combo(chineseUI.debugPBREquation, &debugViewEquation, debugNamesEquation)) { - shaderData.debugViewEquation = static_cast(debugViewEquation); - updateShaderParams = true; - } - } - - if (models.scene.animations.size() > 0) { - if (gui->header(chineseUI.animation)) { - gui->checkbox(chineseUI.pauseAnimation, &animate); - std::vector animationNames; - for (auto animation : models.scene.animations) { - animationNames.push_back(animation.name); + }; + if (gui->combo(chineseUI.debugInput, &debugViewInputs, debugNamesInputs)) { + shaderData.debugViewInputs = static_cast(debugViewInputs); + updateShaderParams = true; + } + gui->endMenu(); } - gui->combo(chineseUI.animationSeq, &animationIndex, animationNames); + if (gui->beginMenu("PBR")) + { + const std::vector debugNamesEquation = { + "none", "Diff (l,n)", "F (l,h)", "G (l,v,h)", "D (h)", "Specular" + }; + if (gui->combo(chineseUI.debugPBREquation, &debugViewEquation, debugNamesEquation)) { + shaderData.debugViewEquation = static_cast(debugViewEquation); + updateShaderParams = true; + } + gui->endMenu(); + } + if (gui->beginMenu("frame rate")) + { + gui->text("%.1d fps (%.2f ms)", lastFPS, (1000.0f / lastFPS)); + gui->endMenu(); + } + gui->endMenu(); } + if (gui->beginMenu("animation")) + { + if (models.scene.animations.size() > 0) + { + if (gui->beginMenu("activation")) + { + gui->checkbox(chineseUI.pauseAnimation, &animate); + gui->endMenu(); + } + if (gui->beginMenu("anmation sequence")) + { + std::vector animationNames; + for (auto animation : models.scene.animations) { + animationNames.push_back(animation.name); + } + gui->combo(chineseUI.animationSeq, &animationIndex, animationNames); + gui->endMenu(); + } + } + else + { + gui->text("no animation in loaded model"); + } + gui->endMenu(); + } + gui->endMainMenuBar(); } + ImGui::PopItemWidth(); ImGui::End();