// MassBuilderSaveTool // Copyright (C) 2021-2024 Guillaume Jacquemin // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include "../FontAwesome/IconsFontAwesome5.h" #include "../GameData/StyleNames.h" #include "Application.h" namespace mbst { void Application::drawFrameInfo() { if(!_currentMass || _currentMass->state() != GameObjects::Mass::State::Valid) { return; } if(!ImGui::BeginChild("##FrameInfo")) { ImGui::EndChild(); return; } ImGui::BeginGroup(); if(ImGui::BeginChild("##JointSliders", {(ImGui::GetContentRegionAvail().x / 2.0f) - (ImGui::GetStyle().WindowPadding.x / 2.0f), 0.0f}, ImGuiChildFlags_Border|ImGuiChildFlags_AutoResizeY, ImGuiWindowFlags_MenuBar)) { if(ImGui::BeginMenuBar()) { ImGui::TextUnformatted("Joint sliders"); drawHelpMarker("In-game values are multiplied by 100. For example, 0.500 here is equal to 50 in-game.", static_cast(windowSize().x()) / 4.0f); ImGui::EndMenuBar(); } drawJointSliders(); } ImGui::EndChild(); if(ImGui::BeginChild("##FrameStyles", {(ImGui::GetContentRegionAvail().x / 2.0f) - (ImGui::GetStyle().WindowPadding.x / 2.0f), 0.0f}, ImGuiChildFlags_Border, ImGuiWindowFlags_MenuBar)) { if(ImGui::BeginMenuBar()) { ImGui::TextUnformatted("Frame styles"); ImGui::EndMenuBar(); } drawFrameStyles(); } ImGui::EndChild(); ImGui::EndGroup(); ImGui::SameLine(); if(ImGui::BeginChild("##EyeFlare", {}, ImGuiChildFlags_Border, ImGuiWindowFlags_MenuBar)) { if(ImGui::BeginMenuBar()) { ImGui::TextUnformatted("Eye flare colour"); drawHelpMarker("Right-click the picker for more options.", 250.0f); ImGui::EndMenuBar(); } drawEyeColourPicker(); } ImGui::EndChild(); ImGui::EndChild(); } void Application::drawJointSliders() { if(!_currentMass || _currentMass->state() != GameObjects::Mass::State::Valid) { return; } ImGui::BeginGroup(); drawAlignedText("Neck:"); drawAlignedText("Body:"); drawAlignedText("Shoulders:"); drawAlignedText("Hips:"); drawAlignedText("Arms:"); drawAlignedText("Legs:"); ImGui::EndGroup(); ImGui::SameLine(); ImGui::BeginGroup(); ImGui::PushItemWidth(-1.0f); if(ImGui::SliderFloat("##NeckSlider", &_currentMass->jointSliders().neck, 0.0f, 1.0f)) { _jointsDirty = true; } if(ImGui::SliderFloat("##BodySlider", &_currentMass->jointSliders().body, 0.0f, 1.0f)) { _jointsDirty = true; } if(ImGui::SliderFloat("##ShouldersSlider", &_currentMass->jointSliders().shoulders, 0.0f, 1.0f)) { _jointsDirty = true; } if(ImGui::SliderFloat("##HipsSlider", &_currentMass->jointSliders().hips, 0.0f, 1.0f)) { _jointsDirty = true; } ImGui::PushMultiItemsWidths(2, ImGui::CalcItemWidth()); if(ImGui::SliderFloat("##UpperArmsSlider", &_currentMass->jointSliders().upperArms, 0.0f, 1.0f, "Upper: %.3f")) { _jointsDirty = true; } ImGui::PopItemWidth(); ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); if(ImGui::SliderFloat("##LowerArmsSlider", &_currentMass->jointSliders().lowerArms, 0.0f, 1.0f, "Lower: %.3f")) { _jointsDirty = true; } ImGui::PopItemWidth(); ImGui::PushMultiItemsWidths(2, ImGui::CalcItemWidth()); if(ImGui::SliderFloat("##UpperLegsSlider", &_currentMass->jointSliders().upperLegs, 0.0f, 1.0f, "Upper: %.3f")) { _jointsDirty = true; } ImGui::PopItemWidth(); ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); if(ImGui::SliderFloat("##LowerLegsSlider", &_currentMass->jointSliders().lowerLegs, 0.0f, 1.0f, "Lower: %.3f")) { _jointsDirty = true; } ImGui::PopItemWidth(); ImGui::PopItemWidth(); ImGui::EndGroup(); if(!_jointsDirty) { ImGui::BeginDisabled(); ImGui::Button(ICON_FA_SAVE " Save"); ImGui::SameLine(); ImGui::Button(ICON_FA_UNDO " Reset"); ImGui::EndDisabled(); } else { if(drawUnsafeWidget([]{ return ImGui::Button(ICON_FA_SAVE " Save"); })) { _modifiedBySaveTool = true; if(!_currentMass->writeJointSliders()) { _modifiedBySaveTool = false; _queue.addToast(Toast::Type::Error, _currentMass->lastError()); } _jointsDirty = false; } ImGui::SameLine(); if(ImGui::Button(ICON_FA_UNDO " Reset")) { _currentMass->getJointSliders(); _jointsDirty = false; } } } void Application::drawFrameStyles() { if(!_currentMass || _currentMass->state() != GameObjects::Mass::State::Valid) { return; } for(std::int32_t i = 0; i < 4; i++) { drawAlignedText("Slot %d:", i + 1); ImGui::SameLine(); ImGui::PushID(i); ImGui::PushItemWidth(-1.0f); if(ImGui::BeginCombo("##Style", getStyleName(_currentMass->frameStyles()[i], _currentMass->frameCustomStyles()).data())) { for(const auto& style : GameData::builtin_style_names) { if(ImGui::Selectable(getStyleName(style.first, _currentMass->frameCustomStyles()).data(), _currentMass->frameStyles()[i] == style.first)) { _currentMass->frameStyles()[i] = style.first; _stylesDirty = true; } } ImGui::EndCombo(); } ImGui::PopItemWidth(); ImGui::PopID(); } if(!_stylesDirty) { ImGui::BeginDisabled(); ImGui::Button(ICON_FA_SAVE " Save"); ImGui::SameLine(); ImGui::Button(ICON_FA_UNDO " Reset"); ImGui::EndDisabled(); } else { if(drawUnsafeWidget([]{ return ImGui::Button(ICON_FA_SAVE " Save"); })) { _modifiedBySaveTool = true; if(!_currentMass->writeFrameStyles()) { _modifiedBySaveTool = false; _queue.addToast(Toast::Type::Error, _currentMass->lastError()); } _stylesDirty = false; } ImGui::SameLine(); if(ImGui::Button(ICON_FA_UNDO " Reset")) { _currentMass->getFrameStyles(); _stylesDirty = false; } } } void Application::drawEyeColourPicker() { if(!_currentMass || _currentMass->state() != GameObjects::Mass::State::Valid) { return; } if(ImGui::ColorPicker3("##EyeFlarePicker", &_currentMass->eyeFlareColour().x())) { _eyeFlareDirty = true; } if(!_eyeFlareDirty) { ImGui::BeginDisabled(); ImGui::Button(ICON_FA_SAVE " Save"); ImGui::SameLine(); ImGui::Button(ICON_FA_UNDO " Reset"); ImGui::EndDisabled(); } else { if(drawUnsafeWidget([]{ return ImGui::Button(ICON_FA_SAVE " Save"); })) { _modifiedBySaveTool = true; if(!_currentMass->writeEyeFlareColour()) { _modifiedBySaveTool = false; _queue.addToast(Toast::Type::Error, _currentMass->lastError()); } _eyeFlareDirty = false; } ImGui::SameLine(); if(ImGui::Button(ICON_FA_UNDO " Reset")) { _currentMass->getEyeFlareColour(); _eyeFlareDirty = false; } } } void Application::drawCustomFrameStyles() { if(!_currentMass || _currentMass->state() != GameObjects::Mass::State::Valid) { return; } if(!ImGui::BeginChild("##FrameStyles")) { ImGui::EndChild(); return; } ImGui::TextWrapped("In-game values are multiplied by 100. For example, 0.500 here is equal to 50 in-game."); for(std::uint32_t i = 0; i < _currentMass->frameCustomStyles().size(); i++) { ImGui::PushID(int(i)); auto result = drawCustomStyle(_currentMass->frameCustomStyles()[i]); switch(result) { case DCS_ResetStyle: _currentMass->getFrameCustomStyles(); break; case DCS_Save: _modifiedBySaveTool = true; if(!_currentMass->writeFrameCustomStyle(i)) { _modifiedBySaveTool = false; _queue.addToast(Toast::Type::Error, _currentMass->lastError()); } break; default: break; } ImGui::PopID(); } ImGui::EndChild(); } }