diff --git a/SHADE_Engine/src/Physics/System/SHPhysicsDebugDrawSystem.cpp b/SHADE_Engine/src/Physics/System/SHPhysicsDebugDrawSystem.cpp index 3c80883c..1ca7ae39 100644 --- a/SHADE_Engine/src/Physics/System/SHPhysicsDebugDrawSystem.cpp +++ b/SHADE_Engine/src/Physics/System/SHPhysicsDebugDrawSystem.cpp @@ -120,21 +120,25 @@ namespace SHADE } rp3d::DebugRenderer* rp3dRenderer = nullptr; - #ifdef SHEDITOR - const auto* EDITOR = SHSystemManager::GetSystem(); - if (EDITOR && EDITOR->editorState != SHEditor::State::STOP) - { + if (system->physicsSystem->worldState.world) rp3dRenderer = &system->physicsSystem->worldState.world->getDebugRenderer(); - rp3dRenderer->setIsDebugItemDisplayed(rp3d::DebugRenderer::DebugItem::CONTACT_POINT, false); - rp3dRenderer->setIsDebugItemDisplayed(rp3d::DebugRenderer::DebugItem::CONTACT_NORMAL, false); - } - #endif for (int i = 0; i < SHUtilities::ConvertEnum(DebugDrawFlags::NUM_FLAGS); ++i) { const bool DRAW = (system->debugDrawFlags & (1U << i)) > 0; if (DRAW) + { drawFunctions[i](debugDrawSystem, rp3dRenderer); + } + else + { + if (rp3dRenderer && (i == 3 || i == 4)) + { + rp3dRenderer->setIsDebugItemDisplayed(reactphysics3d::DebugRenderer::DebugItem::CONTACT_POINT, false); + rp3dRenderer->setIsDebugItemDisplayed(reactphysics3d::DebugRenderer::DebugItem::CONTACT_NORMAL, false); + } + } + } // Automatically clear the container of raycasts despite debug drawing state @@ -180,6 +184,7 @@ namespace SHADE void SHPhysicsDebugDrawSystem::drawContactPoints(SHDebugDrawSystem* debugRenderer, rp3d::DebugRenderer* rp3dRenderer) noexcept { #ifdef SHEDITOR + const auto* EDITOR = SHSystemManager::GetSystem(); if (EDITOR && EDITOR->editorState != SHEditor::State::STOP) { @@ -192,6 +197,18 @@ namespace SHADE for (int i = 0; i < NUM_TRIS; ++i) debugRenderer->DrawTri(SHColour::RED, TRI_ARRAY[i].point1, TRI_ARRAY[i].point2, TRI_ARRAY[i].point3); } + + #else + + rp3dRenderer->setIsDebugItemDisplayed(rp3d::DebugRenderer::DebugItem::CONTACT_POINT, true); + const int NUM_TRIS = static_cast(rp3dRenderer->getNbTriangles()); + if (NUM_TRIS == 0) + return; + + const auto& TRI_ARRAY = rp3dRenderer->getTrianglesArray(); + for (int i = 0; i < NUM_TRIS; ++i) + debugRenderer->DrawTri(SHColour::RED, TRI_ARRAY[i].point1, TRI_ARRAY[i].point2, TRI_ARRAY[i].point3); + #endif } @@ -210,6 +227,18 @@ namespace SHADE for (int i = 0; i < NUM_LINES; ++i) debugRenderer->DrawLine(SHColour::RED, LINE_ARRAY[i].point1, LINE_ARRAY[i].point2); } + + #else + + rp3dRenderer->setIsDebugItemDisplayed(rp3d::DebugRenderer::DebugItem::CONTACT_NORMAL, true); + const int NUM_LINES = static_cast(rp3dRenderer->getNbLines()); + if (NUM_LINES == 0) + return; + + const auto& LINE_ARRAY = rp3dRenderer->getLinesArray(); + for (int i = 0; i < NUM_LINES; ++i) + debugRenderer->DrawLine(SHColour::RED, LINE_ARRAY[i].point1, LINE_ARRAY[i].point2); + #endif } diff --git a/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp b/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp index a9e5a9e9..dd2cc091 100644 --- a/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp +++ b/SHADE_Engine/src/Physics/System/SHPhysicsSystem.cpp @@ -163,8 +163,6 @@ namespace SHADE // Destroy an existing world if (worldState.world != nullptr) { - - objectManager.RemoveAllObjects(); objectManager.SetWorld(nullptr); @@ -174,12 +172,8 @@ namespace SHADE worldState.DestroyWorld(factory); } - worldState.CreateWorld(factory); - #ifdef _PUBLISH - worldState.world->setIsDebugRenderingEnabled(false); - #else - worldState.world->setIsDebugRenderingEnabled(true); - #endif + worldState.CreateWorld(factory); + worldState.world->setIsDebugRenderingEnabled(true); // Link Collision Listener & Raycaster collisionListener.BindToWorld(worldState.world); @@ -444,11 +438,7 @@ namespace SHADE return onPlayEvent->handle; worldState.CreateWorld(factory); - #ifdef _PUBLISH - worldState.world->setIsDebugRenderingEnabled(false); - #else worldState.world->setIsDebugRenderingEnabled(true); - #endif // Link Collision Listener & Raycaster collisionListener.BindToWorld(worldState.world); diff --git a/SHADE_Engine/src/Physics/System/SHPhysicsSystemRoutines.cpp b/SHADE_Engine/src/Physics/System/SHPhysicsSystemRoutines.cpp index be1d968e..d133f562 100644 --- a/SHADE_Engine/src/Physics/System/SHPhysicsSystemRoutines.cpp +++ b/SHADE_Engine/src/Physics/System/SHPhysicsSystemRoutines.cpp @@ -334,10 +334,6 @@ namespace SHADE if (physicsObject.GetRigidBody()->isActive()) physicsObject.prevTransform = CURRENT_TF; - // Skip sleeping objects - if (physicsObject.GetRigidBody()->isSleeping()) - return; - // Sync with rigid bodies if (rigidBodyComponent && SHSceneManager::CheckNodeAndComponentsActive(physicsObject.entityID)) { @@ -369,7 +365,7 @@ namespace SHADE colliderComponent->orientation = CURRENT_TF.getOrientation(); } - // Set transform for rendering + // Set transform for rendering if (transformComponent) { transformComponent->SetWorldPosition(renderPos); diff --git a/SHADE_Managed/src/Math/Vector3.cxx b/SHADE_Managed/src/Math/Vector3.cxx index edd78f6b..d2862ac7 100644 --- a/SHADE_Managed/src/Math/Vector3.cxx +++ b/SHADE_Managed/src/Math/Vector3.cxx @@ -21,6 +21,9 @@ of DigiPen Institute of Technology is prohibited. #include // Project Headers #include "Math.hxx" +#include "Quaternion.hxx" +#include "Math/Vector/SHVec3.h" +#include "Utility/Convert.hxx" namespace SHADE { @@ -148,21 +151,21 @@ namespace SHADE { return vec - (Project(vec, normal.GetNormalised()) * 2.0f); } - Vector3 Vector3::RotateRadians(Vector3 vec, float radians) + Vector3 Vector3::RotateX(Vector3 vec, float radians) { - const float SINE = sin(radians); - const float COSINE = cos(radians); - - return Vector3 - ( - vec.x * COSINE - vec.y * SINE, - vec.x * SINE + vec.y * COSINE, - vec.z - ); + return Convert::ToCLI(SHVec3::RotateX(Convert::ToNative(vec), radians)); } - Vector3 Vector3::RotateDegrees(Vector3 vec, float degrees) + Vector3 Vector3::RotateY(Vector3 vec, float radians) { - return RotateRadians(vec, Math::DegreesToRadians(degrees)); + return Convert::ToCLI(SHVec3::RotateY(Convert::ToNative(vec), radians)); + } + Vector3 Vector3::RotateZ(Vector3 vec, float radians) + { + return Convert::ToCLI(SHVec3::RotateZ(Convert::ToNative(vec), radians)); + } + Vector3 Vector3::Rotate(Vector3 vec, Vector3 axis, float radians) + { + return Convert::ToCLI(SHVec3::Rotate(Convert::ToNative(vec), Convert::ToNative(axis), radians)); } Vector3 Vector3::Min(Vector3 lhs, Vector3 rhs) { diff --git a/SHADE_Managed/src/Math/Vector3.hxx b/SHADE_Managed/src/Math/Vector3.hxx index 189f2930..76b11420 100644 --- a/SHADE_Managed/src/Math/Vector3.hxx +++ b/SHADE_Managed/src/Math/Vector3.hxx @@ -19,6 +19,8 @@ of DigiPen Institute of Technology is prohibited. // Project Includes #include "Vector2.hxx" +value struct Quaternion; + namespace SHADE { /// @@ -266,7 +268,7 @@ namespace SHADE /// The Vector3 that represents vec reflected across normal. static Vector3 Reflect(Vector3 vec, Vector3 normal); /// - /// Rotates a Vector3 on the Z-axis by a specified angle in an anti-clockwise + /// Rotates a Vector3 about the X-axis by a specified angle in an anti-clockwise /// direction. /// /// A Vector3 to rotate. @@ -274,17 +276,37 @@ namespace SHADE /// Angle to rotate the vector by in an anti-clockwise direction in radians. /// /// The Vector3 that represents the rotated vector. - static Vector3 RotateRadians(Vector3 vec, float radians); + static Vector3 RotateX(Vector3 vec, float radians); /// - /// Rotates a Vector3 on the Z-axis by a specified angle in an anti-clockwise + /// Rotates a Vector3 about the Y-axis by a specified angle in an anti-clockwise /// direction. /// /// A Vector3 to rotate. - /// - /// Angle to rotate the vector by in an anti-clockwise direction in degrees. + /// + /// Angle to rotate the vector by in an anti-clockwise direction in radians. /// /// The Vector3 that represents the rotated vector. - static Vector3 RotateDegrees(Vector3 vec, float degrees); + static Vector3 RotateY(Vector3 vec, float radians); + /// + /// Rotates a Vector3 about the Z-axis by a specified angle in an anti-clockwise + /// direction. + /// + /// A Vector3 to rotate. + /// + /// Angle to rotate the vector by in an anti-clockwise direction in radians. + /// + /// The Vector3 that represents the rotated vector. + static Vector3 RotateZ(Vector3 vec, float radians); + /// + /// Rotates a Vector3 about an arbitrary axis by a specified angle in an anti-clockwise + /// direction. + /// + /// A Vector3 to rotate. + /// + /// Angle to rotate the vector by in an anti-clockwise direction in radians. + /// + /// The Vector3 that represents the rotated vector. + static Vector3 Rotate(Vector3 vec, Vector3 axis, float radians); /// /// Computes and returns a Vector3 that is made from the smallest components of /// the two specified Vector3s. diff --git a/SHADE_Managed/src/Utility/Convert.hxx b/SHADE_Managed/src/Utility/Convert.hxx index 04407f77..fb373c51 100644 --- a/SHADE_Managed/src/Utility/Convert.hxx +++ b/SHADE_Managed/src/Utility/Convert.hxx @@ -25,7 +25,6 @@ of DigiPen Institute of Technology is prohibited. // Project Includes #include "Engine/Entity.hxx" #include "Math/Vector2.hxx" -#include "Math/Vector3.hxx" #include "Math/Quaternion.hxx" #include "Math/Ray.hxx" #include "Physics/RaycastHit.hxx" @@ -34,6 +33,8 @@ of DigiPen Institute of Technology is prohibited. #include "Graphics/Color.hxx" #include "Physics/Collision/SHPhysicsRaycastResult.h" +value struct Vector3; + namespace SHADE { ///