diff --git a/engine/source/editor/source/editor_ui.cpp b/engine/source/editor/source/editor_ui.cpp index a73c6dc83..262265b36 100644 --- a/engine/source/editor/source/editor_ui.cpp +++ b/engine/source/editor/source/editor_ui.cpp @@ -29,6 +29,8 @@ namespace Pilot { std::vector> g_editor_node_state_array; int g_node_depth = -1; + void DrawVecControl(const std::string &label, Pilot::Vector3 &values, float resetValue = 0.0f, float columnWidth = 100.0f); + void DrawVecControl(const std::string &label, Pilot::Quaternion &values, float resetValue = 0.0f, float columnWidth = 100.0f); EditorUI::EditorUI(PilotEditor* editor) : m_editor(editor) { @@ -69,27 +71,10 @@ namespace Pilot { Transform* trans_ptr = static_cast(value_ptr); - float position_val[3] = {trans_ptr->m_position.x, trans_ptr->m_position.y, trans_ptr->m_position.z}; - float rotation_val[4] = { - trans_ptr->m_rotation.x, trans_ptr->m_rotation.y, trans_ptr->m_rotation.z, trans_ptr->m_rotation.w}; - float scale_val[3] = {trans_ptr->m_scale.x, trans_ptr->m_scale.y, trans_ptr->m_scale.z}; - - ImGui::TableNextColumn(); - ImGui::Text("Position"); - ImGui::TableNextColumn(); - ImGui::DragFloat3("##Position", position_val); - ImGui::TableNextColumn(); - ImGui::Text("Rotation"); - ImGui::TableNextColumn(); - ImGui::DragFloat4("##Rotation", rotation_val); - ImGui::TableNextColumn(); - ImGui::Text("Scale"); - ImGui::TableNextColumn(); - ImGui::DragFloat3("##Scale", scale_val); - - trans_ptr->m_position = Vector3(position_val[0], position_val[1], position_val[2]); - trans_ptr->m_rotation = Quaternion(rotation_val[3], rotation_val[0], rotation_val[1], rotation_val[2]); - trans_ptr->m_scale = Vector3(scale_val[0], scale_val[1], scale_val[2]); + DrawVecControl("Position", trans_ptr->m_position); + DrawVecControl("Rotation", trans_ptr->m_rotation); + DrawVecControl("Scale", trans_ptr->m_scale); + drawSelectedEntityAxis(); } }; @@ -1224,5 +1209,127 @@ namespace Pilot } m_selected_object_matrix = new_model_matrix; } + void DrawVecControl(const std::string &label, Pilot::Vector3 &values, float resetValue, float columnWidth) + { + ImGui::PushID(label.c_str()); + + ImGui::Columns(2); + ImGui::SetColumnWidth(0, columnWidth); + ImGui::Text(label.c_str()); + ImGui::NextColumn(); + + ImGui::PushMultiItemsWidths(3, ImGui::CalcItemWidth()); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2{0, 0}); + + float lineHeight = GImGui->Font->FontSize + GImGui->Style.FramePadding.y * 2.0f; + ImVec2 buttonSize = {lineHeight + 3.0f, lineHeight}; + + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{0.8f, 0.1f, 0.15f, 1.0f}); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{0.9f, 0.2f, 0.2f, 1.0f}); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{0.8f, 0.1f, 0.15f, 1.0f}); + if (ImGui::Button("X", buttonSize)) + values.x = resetValue; + ImGui::PopStyleColor(3); + + ImGui::SameLine(); + ImGui::DragFloat("##X", &values.x, 0.1f, 0.0f, 0.0f, "%.2f"); + ImGui::PopItemWidth(); + ImGui::SameLine(); + + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{0.2f, 0.45f, 0.2f, 1.0f}); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{0.3f, 0.55f, 0.3f, 1.0f}); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{0.2f, 0.45f, 0.2f, 1.0f}); + if (ImGui::Button("Y", buttonSize)) + values.y = resetValue; + ImGui::PopStyleColor(3); + + ImGui::SameLine(); + ImGui::DragFloat("##Y", &values.y, 0.1f, 0.0f, 0.0f, "%.2f"); + ImGui::PopItemWidth(); + ImGui::SameLine(); + + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{0.1f, 0.25f, 0.8f, 1.0f}); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{0.2f, 0.35f, 0.9f, 1.0f}); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{0.1f, 0.25f, 0.8f, 1.0f}); + if (ImGui::Button("Z", buttonSize)) + values.z = resetValue; + ImGui::PopStyleColor(3); + + ImGui::SameLine(); + ImGui::DragFloat("##Z", &values.z, 0.1f, 0.0f, 0.0f, "%.2f"); + ImGui::PopItemWidth(); + + ImGui::PopStyleVar(); + + ImGui::Columns(1); + ImGui::PopID(); + } + + void DrawVecControl(const std::string &label, Pilot::Quaternion &values, float resetValue, float columnWidth) + { + ImGui::PushID(label.c_str()); + ImGui::Columns(2); + ImGui::SetColumnWidth(0, columnWidth); + ImGui::Text(label.c_str()); + ImGui::NextColumn(); + + ImGui::PushMultiItemsWidths(4, ImGui::CalcItemWidth()); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2{0, 0}); + + float lineHeight = GImGui->Font->FontSize + GImGui->Style.FramePadding.y * 2.0f; + ImVec2 buttonSize = {lineHeight + 3.0f, lineHeight}; + + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{0.8f, 0.1f, 0.15f, 1.0f}); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{0.9f, 0.2f, 0.2f, 1.0f}); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{0.8f, 0.1f, 0.15f, 1.0f}); + if (ImGui::Button("X", buttonSize)) + values.x = resetValue; + ImGui::PopStyleColor(3); + + ImGui::SameLine(); + ImGui::DragFloat("##X", &values.x, 0.1f, 0.0f, 0.0f, "%.2f"); + ImGui::PopItemWidth(); + ImGui::SameLine(); + + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{0.2f, 0.45f, 0.2f, 1.0f}); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{0.3f, 0.55f, 0.3f, 1.0f}); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{0.2f, 0.45f, 0.2f, 1.0f}); + if (ImGui::Button("Y", buttonSize)) + values.y = resetValue; + ImGui::PopStyleColor(3); + + ImGui::SameLine(); + ImGui::DragFloat("##Y", &values.y, 0.1f, 0.0f, 0.0f, "%.2f"); + ImGui::PopItemWidth(); + ImGui::SameLine(); + + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{0.1f, 0.25f, 0.8f, 1.0f}); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{0.2f, 0.35f, 0.9f, 1.0f}); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{0.1f, 0.25f, 0.8f, 1.0f}); + if (ImGui::Button("Z", buttonSize)) + values.z = resetValue; + ImGui::PopStyleColor(3); + + ImGui::SameLine(); + ImGui::DragFloat("##Z", &values.z, 0.1f, 0.0f, 0.0f, "%.2f"); + ImGui::PopItemWidth(); + ImGui::SameLine(); + + ImGui::PushStyleColor(ImGuiCol_Button, ImVec4{0.5f, 0.25f, 0.5f, 1.0f}); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4{0.6f, 0.35f, 0.6f, 1.0f}); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4{0.5f, 0.25f, 0.5f, 1.0f}); + if (ImGui::Button("W", buttonSize)) + values.w = resetValue; + ImGui::PopStyleColor(3); + + ImGui::SameLine(); + ImGui::DragFloat("##W", &values.w, 0.1f, 0.0f, 0.0f, "%.2f"); + ImGui::PopItemWidth(); + + ImGui::PopStyleVar(); + + ImGui::Columns(1); + ImGui::PopID(); + } } // namespace Pilot