From f119acdb65ed5da5f4230685975d0e32cc646e46 Mon Sep 17 00:00:00 2001 From: Sri Sham Haran Date: Tue, 22 Nov 2022 21:15:18 +0800 Subject: [PATCH 1/3] collider tag panel --- .../ColliderTagPanel/SHColliderTagPanel.cpp | 62 +++++++++++++++++++ .../ColliderTagPanel/SHColliderTagPanel.h | 19 ++++++ .../EditorWindow/SHEditorWindowIncludes.h | 3 +- SHADE_Engine/src/Editor/SHEditor.cpp | 1 + 4 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.cpp create mode 100644 SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.h diff --git a/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.cpp b/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.cpp new file mode 100644 index 00000000..5ff3842e --- /dev/null +++ b/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.cpp @@ -0,0 +1,62 @@ +#include "SHpch.h" +#include "SHColliderTagPanel.h" +#include "ECS_Base/Managers/SHSystemManager.h" +#include "Physics/Collision/SHCollisionTagMatrix.h" +#include "Editor/SHEditorWidgets.hpp" + +namespace SHADE +{ + + void SHColliderTagPanel::Update() + { + if (Begin()) + { + ImGui::BeginTable("CollisionMtxTable", SHCollisionTag::NUM_LAYERS + 1, ImGuiTableRowFlags_Headers); + ImGui::TableNextRow(); + for (int i = 0; i <= SHCollisionTag::NUM_LAYERS; ++i) + { + ImGui::TableNextColumn(); + if(i == 0) continue; + std::string const& tagName = SHCollisionTagMatrix::GetTagName(i- 1); + auto tag = SHCollisionTagMatrix::GetTag(i - 1); + if (!tag) + continue; + //ImGui::Text(tagName.data()); + SHEditorWidgets::InputText("##" + std::to_string(i), [i]{return SHCollisionTagMatrix::GetTagName(i- 1);}, [i](std::string const& value){SHCollisionTagMatrix::GetTag(i)->SetName(value);}, tagName.data(), ImGuiInputTextFlags_EnterReturnsTrue); + } + for (int i = SHCollisionTag::NUM_LAYERS - 1; i >= 0; --i) + { + std::string tagName = SHCollisionTagMatrix::GetTagName(i); + auto tag = SHCollisionTagMatrix::GetTag(i); + if(!tag) + continue; + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text(tagName.data()); + for (int j = 0; j < SHCollisionTag::NUM_LAYERS - i; ++j) + { + std::string tagName2 = SHCollisionTagMatrix::GetTagName(j); + auto tag2 = SHCollisionTagMatrix::GetTag(j); + + if(!tag2) + continue; + + if(tagName.empty()) + tagName = std::to_string(i); + if(tagName2.empty()) + tagName2 = std::to_string(j); + + ImGui::TableNextColumn(); + //if(i == j) + // continue; + std::string_view label = std::format("##{} vs {}", tagName, tagName2).data(); + SHEditorWidgets::CheckBox(label, [tag, &j]{return tag->GetLayerState(j);}, [tag, i, j](bool const& value){tag->SetLayerState(j, value); SHCollisionTagMatrix::GetTag(j)->SetLayerState(i, value);}, label.substr(2)); + + } + } + ImGui::EndTable(); + } + ImGui::End(); + } + +} \ No newline at end of file diff --git a/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.h b/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.h new file mode 100644 index 00000000..94d17a6d --- /dev/null +++ b/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.h @@ -0,0 +1,19 @@ +#pragma once + +#include "Editor/EditorWindow/SHEditorWindow.h" +#include + +namespace SHADE +{ + class SH_API SHColliderTagPanel final : public SHEditorWindow + { + public: + SHColliderTagPanel():SHEditorWindow("Collider Tag Panel", ImGuiWindowFlags_MenuBar), isDirty(false){} + //void Init(); + void Update() override; + //void Exit(); + + private: + bool isDirty; + }; +} \ No newline at end of file diff --git a/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindowIncludes.h b/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindowIncludes.h index 2fcde2b2..9aad6ede 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindowIncludes.h +++ b/SHADE_Engine/src/Editor/EditorWindow/SHEditorWindowIncludes.h @@ -5,4 +5,5 @@ #include "Profiling/SHEditorProfiler.h" //Profiler #include "ViewportWindow/SHEditorViewport.h" //Editor Viewport #include "AssetBrowser/SHAssetBrowser.h" //Asset Browser -#include "MaterialInspector/SHMaterialInspector.h" //Material Inspector \ No newline at end of file +#include "MaterialInspector/SHMaterialInspector.h" //Material Inspector +#include "ColliderTagPanel/SHColliderTagPanel.h" //Collider Tag Panel \ No newline at end of file diff --git a/SHADE_Engine/src/Editor/SHEditor.cpp b/SHADE_Engine/src/Editor/SHEditor.cpp index abddf457..dd24e158 100644 --- a/SHADE_Engine/src/Editor/SHEditor.cpp +++ b/SHADE_Engine/src/Editor/SHEditor.cpp @@ -101,6 +101,7 @@ namespace SHADE SHEditorWindowManager::CreateEditorWindow(); SHEditorWindowManager::CreateEditorWindow(); SHEditorWindowManager::CreateEditorWindow(); + SHEditorWindowManager::CreateEditorWindow(); SHEditorWindowManager::CreateEditorWindow(); From 82765648c41765a0e94b389c27ea83dee47486ee Mon Sep 17 00:00:00 2001 From: Sri Sham Haran Date: Mon, 12 Dec 2022 11:49:52 +0800 Subject: [PATCH 2/3] fix colliderpanel --- .../ColliderTagPanel/SHColliderTagPanel.cpp | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.cpp b/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.cpp index 5ff3842e..1dd0047d 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.cpp @@ -13,18 +13,18 @@ namespace SHADE { ImGui::BeginTable("CollisionMtxTable", SHCollisionTag::NUM_LAYERS + 1, ImGuiTableRowFlags_Headers); ImGui::TableNextRow(); - for (int i = 0; i <= SHCollisionTag::NUM_LAYERS; ++i) + for (int i = SHCollisionTag::NUM_LAYERS; i >= 0; --i) { ImGui::TableNextColumn(); - if(i == 0) continue; - std::string const& tagName = SHCollisionTagMatrix::GetTagName(i- 1); - auto tag = SHCollisionTagMatrix::GetTag(i - 1); + if(i == SHCollisionTag::NUM_LAYERS) continue; + std::string const& tagName = SHCollisionTagMatrix::GetTagName(i); + auto tag = SHCollisionTagMatrix::GetTag(i); if (!tag) continue; //ImGui::Text(tagName.data()); - SHEditorWidgets::InputText("##" + std::to_string(i), [i]{return SHCollisionTagMatrix::GetTagName(i- 1);}, [i](std::string const& value){SHCollisionTagMatrix::GetTag(i)->SetName(value);}, tagName.data(), ImGuiInputTextFlags_EnterReturnsTrue); + SHEditorWidgets::InputText("##" + std::to_string(i), [i]{return SHCollisionTagMatrix::GetTagName(i);}, [i](std::string const& value){SHCollisionTagMatrix::GetTag(i)->SetName(value);}, tagName.data(), ImGuiInputTextFlags_EnterReturnsTrue); } - for (int i = SHCollisionTag::NUM_LAYERS - 1; i >= 0; --i) + for (int i = 0; i < SHCollisionTag::NUM_LAYERS; ++i) { std::string tagName = SHCollisionTagMatrix::GetTagName(i); auto tag = SHCollisionTagMatrix::GetTag(i); @@ -33,10 +33,11 @@ namespace SHADE ImGui::TableNextRow(); ImGui::TableNextColumn(); ImGui::Text(tagName.data()); - for (int j = 0; j < SHCollisionTag::NUM_LAYERS - i; ++j) + for (int j = (SHCollisionTag::NUM_LAYERS) - 1; j >= i; --j) { - std::string tagName2 = SHCollisionTagMatrix::GetTagName(j); - auto tag2 = SHCollisionTagMatrix::GetTag(j); + int idx = j; + std::string tagName2 = SHCollisionTagMatrix::GetTagName(idx); + auto tag2 = SHCollisionTagMatrix::GetTag(idx); if(!tag2) continue; @@ -44,14 +45,13 @@ namespace SHADE if(tagName.empty()) tagName = std::to_string(i); if(tagName2.empty()) - tagName2 = std::to_string(j); + tagName2 = std::to_string(idx); ImGui::TableNextColumn(); - //if(i == j) + //if(i == idx) // continue; std::string_view label = std::format("##{} vs {}", tagName, tagName2).data(); - SHEditorWidgets::CheckBox(label, [tag, &j]{return tag->GetLayerState(j);}, [tag, i, j](bool const& value){tag->SetLayerState(j, value); SHCollisionTagMatrix::GetTag(j)->SetLayerState(i, value);}, label.substr(2)); - + SHEditorWidgets::CheckBox(label, [tag, &idx]{return tag->GetLayerState(idx);}, [tag, i, idx](bool const& value){tag->SetLayerState(idx, value); SHCollisionTagMatrix::GetTag(idx)->SetLayerState(i, value);}, label.substr(2)); } } ImGui::EndTable(); From 37f62fdd24889f368d7f29f81f6c858ccc2455a7 Mon Sep 17 00:00:00 2001 From: Sri Sham Haran Date: Mon, 26 Dec 2022 14:35:48 +0800 Subject: [PATCH 3/3] Collision Tag Matrix --- .../ColliderTagPanel/SHColliderTagPanel.cpp | 9 ++++-- .../Inspector/SHEditorComponentView.hpp | 29 +++++++++++++++---- .../src/Serialization/SHYAMLConverters.h | 8 ++++- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.cpp b/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.cpp index 1dd0047d..8169aa5c 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.cpp @@ -13,6 +13,8 @@ namespace SHADE { ImGui::BeginTable("CollisionMtxTable", SHCollisionTag::NUM_LAYERS + 1, ImGuiTableRowFlags_Headers); ImGui::TableNextRow(); + ImGui::PushID("CollisionTagNames"); + for (int i = SHCollisionTag::NUM_LAYERS; i >= 0; --i) { ImGui::TableNextColumn(); @@ -22,8 +24,11 @@ namespace SHADE if (!tag) continue; //ImGui::Text(tagName.data()); - SHEditorWidgets::InputText("##" + std::to_string(i), [i]{return SHCollisionTagMatrix::GetTagName(i);}, [i](std::string const& value){SHCollisionTagMatrix::GetTag(i)->SetName(value);}, tagName.data(), ImGuiInputTextFlags_EnterReturnsTrue); + ImGui::PushID(i); + SHEditorWidgets::InputText("##", [i]{return SHCollisionTagMatrix::GetTagName(i);}, [i](std::string const& value){SHCollisionTagMatrix::GetTag(i)->SetName(value);}, tagName.data(), ImGuiInputTextFlags_EnterReturnsTrue); + ImGui::PopID(); } + ImGui::PopID(); for (int i = 0; i < SHCollisionTag::NUM_LAYERS; ++i) { std::string tagName = SHCollisionTagMatrix::GetTagName(i); @@ -50,7 +55,7 @@ namespace SHADE ImGui::TableNextColumn(); //if(i == idx) // continue; - std::string_view label = std::format("##{} vs {}", tagName, tagName2).data(); + std::string label = std::format("##{} vs {}", tagName, tagName2); SHEditorWidgets::CheckBox(label, [tag, &idx]{return tag->GetLayerState(idx);}, [tag, i, idx](bool const& value){tag->SetLayerState(idx, value); SHCollisionTagMatrix::GetTag(idx)->SetLayerState(i, value);}, label.substr(2)); } } diff --git a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp index 0f3dce3e..e4ec8d58 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp +++ b/SHADE_Engine/src/Editor/EditorWindow/Inspector/SHEditorComponentView.hpp @@ -18,7 +18,7 @@ #include "Physics/Interface/SHColliderComponent.h" #include "Reflection/SHReflectionMetadata.h" #include "Resource/SHResourceManager.h" - +#include "Physics/Collision/SHCollisionTagMatrix.h" namespace SHADE { template @@ -314,6 +314,12 @@ namespace SHADE if (!component) return; ImGui::PushID(SHFamilyID::GetID()); + std::vector collisionTagNames(SHCollisionTag::NUM_LAYERS); + //Fetch tag names + for(int i{}; i < SHCollisionTag::NUM_LAYERS; ++i) + { + collisionTagNames[i] = SHCollisionTagMatrix::GetTagName(i).c_str(); + } const auto componentType = rttr::type::get(*component); SHEditorWidgets::CheckBox("##IsActive", [component]() {return component->isActive; }, [component](bool const& active) {component->isActive = active; }, "Is Component Active"); @@ -332,7 +338,7 @@ namespace SHADE SHCollisionShape* collider = &component->GetCollisionShape(i); auto cursorPos = ImGui::GetCursorPos(); - //collider->IsTrigger + if (collider->GetType() == SHCollisionShape::Type::BOX) { SHEditorWidgets::BeginPanel(std::format("{} Box #{}", ICON_FA_CUBE, i).data(), { ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y }); @@ -361,7 +367,7 @@ namespace SHADE { SHEditorWidgets::CheckBox("Is Trigger", [collider] { return collider->IsTrigger(); }, [collider](bool value) { collider->SetIsTrigger(value); }); - + SHEditorWidgets::ComboBox("Tag", collisionTagNames, [collider]{return SHCollisionTagMatrix::GetTagIndex(collider->GetCollisionTag().GetName());}, [collider](int const& value){collider->SetCollisionTag(SHCollisionTagMatrix::GetTag(value));}); if(ImGui::CollapsingHeader("Physics Material")) { SHEditorWidgets::DragFloat("Friction", [collider] { return collider->GetFriction(); }, [collider](float value) { collider->SetFriction(value); }, "Friction", 0.05f, 0.0f, 1.0f); @@ -388,6 +394,7 @@ namespace SHADE { colliderToDelete = i; } + SHEditorWidgets::EndPanel(); ImGui::PopID(); } @@ -399,14 +406,26 @@ namespace SHADE if (ImGui::BeginMenu("Add Collider")) { + int newColl = -1; + if (ImGui::Selectable("Box Collider")) { - component->AddBoundingBox(); + newColl = component->AddBoundingBox(); } if (ImGui::Selectable("Sphere Collider")) { - component->AddBoundingSphere(); + newColl = component->AddBoundingSphere(); } + + //No idea why this doesn't work + //if (newColl > 0) + //{ + // auto newCollisionShape = component->GetCollisionShape(newColl); + // auto prevCollisionShapeInSeq = component->GetCollisionShape(newColl - 1); + // newCollisionShape.SetCollisionTag(SHCollisionTagMatrix::GetTag(prevCollisionShapeInSeq.GetCollisionTag().GetName())); + + //} + ImGui::EndMenu(); } } diff --git a/SHADE_Engine/src/Serialization/SHYAMLConverters.h b/SHADE_Engine/src/Serialization/SHYAMLConverters.h index e1cb8181..efb49c4b 100644 --- a/SHADE_Engine/src/Serialization/SHYAMLConverters.h +++ b/SHADE_Engine/src/Serialization/SHYAMLConverters.h @@ -14,6 +14,7 @@ #include "Physics/Interface/SHColliderComponent.h" #include "Graphics/MiddleEnd/TextRendering/SHTextRenderableComponent.h" #include "Graphics/MiddleEnd/TextRendering/SHFont.h" +#include "Physics/Collision/SHCollisionTagMatrix.h" namespace YAML { @@ -117,13 +118,14 @@ namespace YAML static constexpr const char* Density = "Density"; static constexpr const char* PositionOffset = "Position Offset"; static constexpr const char* RotationOffset = "Rotation Offset"; + static constexpr const char* CollisionTag = "Collision Tag"; static Node encode(SHCollisionShape& rhs) { Node node; node[IsTrigger] = rhs.IsTrigger(); - + node[CollisionTag] = rhs.GetCollisionTag().GetName(); rttr::type const shapeRttrType = rttr::type::get(); rttr::enumeration const enumAlign = shapeRttrType.get_enumeration(); SHCollisionShape::Type colliderType = rhs.GetType(); @@ -160,6 +162,10 @@ namespace YAML { if (node[IsTrigger].IsDefined()) rhs.SetIsTrigger(node[IsTrigger].as()); + + if(node[CollisionTag].IsDefined()) + rhs.SetCollisionTag(SHCollisionTagMatrix::GetTag(node[CollisionTag].as())); + if (!node[Type].IsDefined()) return false; rttr::type const shapeRttrType = rttr::type::get();