From 2ee46f33df1f8cd4eeb03402baed49c663c2e213 Mon Sep 17 00:00:00 2001 From: Glence Date: Fri, 3 Feb 2023 21:28:50 +0800 Subject: [PATCH] update collision tag to have a save button and clamp raycast draw --- Assets/Scripts/Gameplay/Item/SC_Breakable.cs | 4 -- .../Gameplay/Player/SC_PickAndThrow.cs | 47 ++++++++++++------- .../ColliderTagPanel/SHColliderTagPanel.cpp | 23 ++++++++- .../ColliderTagPanel/SHColliderTagPanel.h | 1 + .../RP3DWrapper/SHCollisionListener.cpp | 4 +- .../src/Physics/System/SHPhysicsSystem.cpp | 2 +- 6 files changed, 55 insertions(+), 26 deletions(-) diff --git a/Assets/Scripts/Gameplay/Item/SC_Breakable.cs b/Assets/Scripts/Gameplay/Item/SC_Breakable.cs index 19f950a5..8c792697 100644 --- a/Assets/Scripts/Gameplay/Item/SC_Breakable.cs +++ b/Assets/Scripts/Gameplay/Item/SC_Breakable.cs @@ -12,7 +12,6 @@ public class Breakable : Script private Transform trans; public bool isBreak { get; set; } private List itemPieces = new List(); - public bool print = false; protected override void awake() { @@ -44,9 +43,6 @@ public class Breakable : Script if (ignoreRaccoon && info.GameObject.GetScript()) return; - if(print) - Debug.Log($"COLLIED {rb.LinearVelocity.GetSqrMagnitude()} with EiD: {info.GameObject.Name}"); - if (rb.LinearVelocity.GetSqrMagnitude() > threshHold && !info.GameObject.GetScript()) { isBreak = true; diff --git a/Assets/Scripts/Gameplay/Player/SC_PickAndThrow.cs b/Assets/Scripts/Gameplay/Player/SC_PickAndThrow.cs index f933f9bc..c650f619 100644 --- a/Assets/Scripts/Gameplay/Player/SC_PickAndThrow.cs +++ b/Assets/Scripts/Gameplay/Player/SC_PickAndThrow.cs @@ -200,25 +200,36 @@ public class PickAndThrow : Script { if (pc != null) { - Vector3 dirNor = pc.tranform.Forward; - Vector3 playerRayPos = pc.tranform.GlobalPosition; - playerRayPos.y += 0.05f; - dirNor.Normalise(); - List rayList1 = Physics.Raycast(new Ray(playerRayPos, Vector3.RotateY(dirNor, SHADE.Math.DegreesToRadians(22.5f))), rayDistance, false, (ushort)65535); - List rayList2 = Physics.Raycast(new Ray(playerRayPos, Vector3.RotateY(dirNor, SHADE.Math.DegreesToRadians(-22.5f))), rayDistance, false, (ushort)65535); - List rayList3 = Physics.Raycast(new Ray(playerRayPos, dirNor), rayDistance * 0.75f, false, (ushort)65535); + Vector3 dirNor = pc.tranform.Forward; + Vector3 playerRayPos = pc.tranform.GlobalPosition; + playerRayPos.y += 0.05f; + dirNor.Normalise(); + List rayList1 = Physics.Raycast(new Ray(playerRayPos, Vector3.RotateY(dirNor, SHADE.Math.DegreesToRadians(22.5f))), rayDistance, false, (ushort)65535); + List rayList2 = Physics.Raycast(new Ray(playerRayPos, Vector3.RotateY(dirNor, SHADE.Math.DegreesToRadians(-22.5f))), rayDistance, false, (ushort)65535); + List rayList3 = Physics.Raycast(new Ray(playerRayPos, dirNor), rayDistance * 0.75f, false, (ushort)65535); - if (rayList1.Count > 0 && rayList2.Count > 0 && rayList3.Count > 0) - { - RaycastHit ray1 = rayList1[0]; - RaycastHit ray2 = rayList2[0]; - RaycastHit ray3 = rayList3[0]; - inRange = CheckForItem(ray1) || CheckForItem(ray2) || CheckForItem(ray3); - } - else - { - inRange = false; - } + if (rayList1.Count > 0) + { + RaycastHit ray1 = rayList1[0]; + inRange = CheckForItem(ray1); + return; + } + else if (rayList2.Count > 0) + { + RaycastHit ray2 = rayList2[0]; + inRange = CheckForItem(ray2); + return; + } + else if (rayList3.Count > 0) + { + RaycastHit ray3 = rayList3[0]; + inRange = CheckForItem(ray3); + return; + } + else + { + inRange = false; + } } } diff --git a/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.cpp b/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.cpp index f28e29c5..e40bb643 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.cpp @@ -11,6 +11,7 @@ namespace SHADE { if (Begin()) { + DrawMenuBar(); ImGui::BeginTable("CollisionMtxTable", SHCollisionTag::NUM_LAYERS + 1, ImGuiTableRowFlags_Headers); ImGui::TableNextRow(); ImGui::PushID("CollisionTagNames"); @@ -56,7 +57,10 @@ namespace SHADE 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)); + if (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))) + { + isDirty = true; + } } } ImGui::EndTable(); @@ -64,4 +68,21 @@ namespace SHADE ImGui::End(); } + void SHColliderTagPanel::DrawMenuBar() + { + if (ImGui::BeginMenuBar()) + { + ImGui::BeginDisabled(!isDirty); + if (ImGui::Button("Save")) + { + std::filesystem::path defaultCollisionTagNameFilePath{ ASSET_ROOT }; + defaultCollisionTagNameFilePath.append("CollisionTags.SHConfig"); + SHCollisionTagMatrix::Exit(defaultCollisionTagNameFilePath); + isDirty = false; + } + ImGui::EndDisabled(); + ImGui::EndMenuBar(); + } + } + } \ 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 index 94d17a6d..a0e63f6a 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.h +++ b/SHADE_Engine/src/Editor/EditorWindow/ColliderTagPanel/SHColliderTagPanel.h @@ -14,6 +14,7 @@ namespace SHADE //void Exit(); private: + void DrawMenuBar(); bool isDirty; }; } \ No newline at end of file diff --git a/SHADE_Engine/src/Physics/RP3DWrapper/SHCollisionListener.cpp b/SHADE_Engine/src/Physics/RP3DWrapper/SHCollisionListener.cpp index 98f6bdc1..63970131 100644 --- a/SHADE_Engine/src/Physics/RP3DWrapper/SHCollisionListener.cpp +++ b/SHADE_Engine/src/Physics/RP3DWrapper/SHCollisionListener.cpp @@ -94,8 +94,8 @@ namespace SHADE { const bool CLEAR_EVENT = C_INFO.GetCollisionState() == SHCollisionInfo::State::EXIT || C_INFO.GetCollisionState() == SHCollisionInfo::State::INVALID; - const bool INACTIVE_OBJECT = !SHSceneManager::CheckNodeAndComponentsActive(C_INFO.GetEntityA()) - || !SHSceneManager::CheckNodeAndComponentsActive(C_INFO.GetEntityB()); + const bool INACTIVE_OBJECT = !SHSceneManager::CheckNodeAndHasComponentsActive(C_INFO.GetEntityA()) + || !SHSceneManager::CheckNodeAndHasComponentsActive(C_INFO.GetEntityB()); if (CLEAR_EVENT || INACTIVE_OBJECT) { diff --git a/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp b/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp index 0a016c6f..dd4a1490 100644 --- a/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp +++ b/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp @@ -155,7 +155,7 @@ namespace SHADE // Load start and end points into the container for debug drawing #ifdef SHEDITOR - SHVec3 endPos = info.ray.position + info.ray.direction * SHRay::MAX_RAYCAST_DIST; + SHVec3 endPos = info.ray.position + info.ray.direction * std::clamp(info.distance,0.0f, SHRay::MAX_RAYCAST_DIST); if (!results.empty()) endPos = results.back().position;