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..8169aa5c --- /dev/null +++ b/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.cpp @@ -0,0 +1,67 @@ +#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(); + ImGui::PushID("CollisionTagNames"); + + for (int i = SHCollisionTag::NUM_LAYERS; i >= 0; --i) + { + ImGui::TableNextColumn(); + 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()); + 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); + auto tag = SHCollisionTagMatrix::GetTag(i); + if(!tag) + continue; + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text(tagName.data()); + for (int j = (SHCollisionTag::NUM_LAYERS) - 1; j >= i; --j) + { + int idx = j; + std::string tagName2 = SHCollisionTagMatrix::GetTagName(idx); + auto tag2 = SHCollisionTagMatrix::GetTag(idx); + + if(!tag2) + continue; + + if(tagName.empty()) + tagName = std::to_string(i); + if(tagName2.empty()) + tagName2 = std::to_string(idx); + + ImGui::TableNextColumn(); + //if(i == idx) + // continue; + 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)); + } + } + 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/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/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 a12a19f7..93b42418 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(); diff --git a/SHADE_Engine/src/Math/SHQuaternion.cpp b/SHADE_Engine/src/Math/SHQuaternion.cpp index 8904cb05..1fa4e246 100644 --- a/SHADE_Engine/src/Math/SHQuaternion.cpp +++ b/SHADE_Engine/src/Math/SHQuaternion.cpp @@ -443,4 +443,16 @@ namespace SHADE return result; } + SHQuaternion SHQuaternion::FromWXYZ(float w, float x, float y, float z) noexcept + { + return SHQuaternion{ x, y, z, w }; + } + + void SHQuaternion::ToWXYZ(const SHQuaternion& from, float& w, float& x, float& y, float& z) noexcept + { + x = from.x; + y = from.y; + z = from.z; + w = from.w; + } } // namespace SHADE \ No newline at end of file diff --git a/SHADE_Engine/src/Math/SHQuaternion.h b/SHADE_Engine/src/Math/SHQuaternion.h index fa5b5d36..29f6df7e 100644 --- a/SHADE_Engine/src/Math/SHQuaternion.h +++ b/SHADE_Engine/src/Math/SHQuaternion.h @@ -125,9 +125,12 @@ namespace SHADE [[nodiscard]] static SHQuaternion ClampedLerp (const SHQuaternion& q1, const SHQuaternion& q2, float t, float tMin = 0.0f, float tMax = 1.0f) noexcept; [[nodiscard]] static SHQuaternion ClampedSlerp (const SHQuaternion& q1, const SHQuaternion& q2, float t, float tMin = 0.0f, float tMax = 1.0f) noexcept; - [[nodiscard]] static SHQuaternion FromToRotation (const SHVec3& from, const SHVec3& to) noexcept; - [[nodiscard]] static SHQuaternion LookRotation (const SHVec3& forward, const SHVec3& up) noexcept; - [[nodiscard]] static SHQuaternion RotateTowards (const SHQuaternion& from, const SHQuaternion& to, float maxAngleInRad) noexcept; + [[nodiscard]] static SHQuaternion FromToRotation (const SHVec3& from, const SHVec3& to) noexcept; + [[nodiscard]] static SHQuaternion LookRotation (const SHVec3& forward, const SHVec3& up) noexcept; + [[nodiscard]] static SHQuaternion RotateTowards (const SHQuaternion& from, const SHQuaternion& to, float maxAngleInRad) noexcept; + + [[nodiscard]] static SHQuaternion FromWXYZ (float w, float x, float y, float z) noexcept; + static void ToWXYZ (const SHQuaternion& from, float& w, float& x, float& y, float& z) noexcept; }; SHQuaternion operator*(float lhs, const SHQuaternion& rhs) noexcept; 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();