#pragma once #include #include #include namespace XCEngine { namespace Editor { namespace UI { inline bool DrawVec3( const char* label, ::XCEngine::Math::Vector3& values, float resetValue = 0.0f, float columnWidth = 100.0f, float dragSpeed = 0.1f ) { bool changed = false; ImGui::PushID(label); ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2{0, 1}); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2{4, 1}); if (ImGui::BeginTable("##Vec3Table", 2, ImGuiTableFlags_NoSavedSettings)) { ImGui::TableSetupColumn("##label", ImGuiTableColumnFlags_WidthFixed, columnWidth); ImGui::TableSetupColumn("##controls", ImGuiTableColumnFlags_WidthStretch); ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetFontSize() + 2.0f); ImGui::TableNextColumn(); ImGui::AlignTextToFramePadding(); ImGui::Text(label); ImGui::TableNextColumn(); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2{0, 0}); float lineHeight = ImGui::GetFontSize() + ImGui::GetStyle().FramePadding.y * 2.0f; ImVec2 buttonSize = {lineHeight + 3.0f, lineHeight}; float itemWidth = (ImGui::GetContentRegionAvail().x - buttonSize.x * 3.0f) / 3.0f; auto drawAxisControl = [&](const char* axisLabel, float& value, ImVec4 color, ImVec4 colorHovered) { bool axisChanged = false; ImGui::PushStyleColor(ImGuiCol_Button, color); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, colorHovered); ImGui::PushStyleColor(ImGuiCol_ButtonActive, color); if (ImGui::Button(axisLabel, buttonSize)) { value = resetValue; axisChanged = true; } ImGui::PopStyleColor(3); ImGui::SameLine(); ImGui::SetNextItemWidth(itemWidth); if (ImGui::DragFloat((std::string("##") + axisLabel).c_str(), &value, dragSpeed, 0.0f, 0.0f, "%.2f")) { axisChanged = true; } ImGui::SameLine(); return axisChanged; }; changed |= drawAxisControl("X", values.x, ImVec4{0.8f, 0.1f, 0.15f, 1.0f}, ImVec4{0.9f, 0.2f, 0.2f, 1.0f}); changed |= drawAxisControl("Y", values.y, ImVec4{0.2f, 0.7f, 0.2f, 1.0f}, ImVec4{0.3f, 0.8f, 0.3f, 1.0f}); changed |= drawAxisControl("Z", values.z, ImVec4{0.1f, 0.25f, 0.8f, 1.0f}, ImVec4{0.2f, 0.35f, 0.9f, 1.0f}); ImGui::PopStyleVar(); ImGui::EndTable(); } ImGui::PopStyleVar(2); ImGui::PopID(); return changed; } inline bool DrawVec2( const char* label, ::XCEngine::Math::Vector2& values, float resetValue = 0.0f, float columnWidth = 100.0f, float dragSpeed = 0.1f ) { bool changed = false; ImGui::PushID(label); ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, ImVec2{0, 1}); ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2{4, 1}); if (ImGui::BeginTable("##Vec2Table", 2, ImGuiTableFlags_NoSavedSettings)) { ImGui::TableSetupColumn("##label", ImGuiTableColumnFlags_WidthFixed, columnWidth); ImGui::TableSetupColumn("##controls", ImGuiTableColumnFlags_WidthStretch); ImGui::TableNextRow(ImGuiTableRowFlags_None, ImGui::GetFontSize() + 2.0f); ImGui::TableNextColumn(); ImGui::AlignTextToFramePadding(); ImGui::Text(label); ImGui::TableNextColumn(); ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2{0, 0}); float lineHeight = ImGui::GetFontSize() + ImGui::GetStyle().FramePadding.y * 2.0f; ImVec2 buttonSize = {lineHeight + 3.0f, lineHeight}; float itemWidth = (ImGui::GetContentRegionAvail().x - buttonSize.x * 2.0f) / 2.0f; auto drawAxisControl = [&](const char* axisLabel, float& value, ImVec4 color, ImVec4 colorHovered) { bool axisChanged = false; ImGui::PushStyleColor(ImGuiCol_Button, color); ImGui::PushStyleColor(ImGuiCol_ButtonHovered, colorHovered); ImGui::PushStyleColor(ImGuiCol_ButtonActive, color); if (ImGui::Button(axisLabel, buttonSize)) { value = resetValue; axisChanged = true; } ImGui::PopStyleColor(3); ImGui::SameLine(); ImGui::SetNextItemWidth(itemWidth); if (ImGui::DragFloat((std::string("##") + axisLabel).c_str(), &value, dragSpeed, 0.0f, 0.0f, "%.2f")) { axisChanged = true; } ImGui::SameLine(); return axisChanged; }; changed |= drawAxisControl("X", values.x, ImVec4{0.8f, 0.1f, 0.15f, 1.0f}, ImVec4{0.9f, 0.2f, 0.2f, 1.0f}); changed |= drawAxisControl("Y", values.y, ImVec4{0.2f, 0.7f, 0.2f, 1.0f}, ImVec4{0.3f, 0.8f, 0.3f, 1.0f}); ImGui::PopStyleVar(); ImGui::EndTable(); } ImGui::PopStyleVar(2); ImGui::PopID(); return changed; } } } }