diff --git a/Source/Engine/Physics/Actors/RigidBody.cpp b/Source/Engine/Physics/Actors/RigidBody.cpp index a58911dfb..08b8eb0ed 100644 --- a/Source/Engine/Physics/Actors/RigidBody.cpp +++ b/Source/Engine/Physics/Actors/RigidBody.cpp @@ -338,6 +338,34 @@ void RigidBody::AddMovement(const Vector3& translation, const Quaternion& rotati SetTransform(t); } +#if USE_EDITOR + +#include "Engine/Debug/DebugDraw.h" + +void RigidBody::OnDebugDrawSelected() +{ + // Draw center of mass + if (!_centerOfMassOffset.IsZero()) + { + DEBUG_DRAW_WIRE_SPHERE(BoundingSphere(GetPosition() + (GetOrientation() * (GetCenterOfMass() - GetCenterOfMassOffset())), 5.0f), Color::Red, 0, false); + } + DEBUG_DRAW_WIRE_SPHERE(BoundingSphere(GetPosition() + (GetOrientation() * GetCenterOfMass()), 2.5f), Color::Aqua, 0, false); + + // Draw all attached colliders + for (Actor* child : Children) + { + const auto collider = Cast(child); + if (collider && collider->GetAttachedRigidBody() == this) + { + collider->OnDebugDrawSelf(); + } + } + + Actor::OnDebugDrawSelected(); +} + +#endif + void RigidBody::OnCollisionEnter(const Collision& c) { CollisionEnter(c); diff --git a/Source/Engine/Physics/Actors/RigidBody.h b/Source/Engine/Physics/Actors/RigidBody.h index f9f36edf9..82599ebb8 100644 --- a/Source/Engine/Physics/Actors/RigidBody.h +++ b/Source/Engine/Physics/Actors/RigidBody.h @@ -487,6 +487,9 @@ public: void Serialize(SerializeStream& stream, const void* otherObj) override; void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) override; void AddMovement(const Vector3& translation, const Quaternion& rotation) override; +#if USE_EDITOR + void OnDebugDrawSelected() override; +#endif // [IPhysicsActor] void* GetPhysicsActor() const override; diff --git a/Source/Engine/Physics/Colliders/BoxCollider.cpp b/Source/Engine/Physics/Colliders/BoxCollider.cpp index 37a38dfd4..59e5ebfd3 100644 --- a/Source/Engine/Physics/Colliders/BoxCollider.cpp +++ b/Source/Engine/Physics/Colliders/BoxCollider.cpp @@ -111,18 +111,11 @@ namespace } } -void BoxCollider::OnDebugDrawSelected() +void BoxCollider::OnDebugDrawSelf() { const Color color = Color::GreenYellow; DEBUG_DRAW_WIRE_BOX(_bounds, color * 0.3f, 0, false); - if (_contactOffset > 0) - { - OrientedBoundingBox contactBounds = _bounds; - contactBounds.Extents += Vector3(_contactOffset) / contactBounds.Transformation.Scale; - DEBUG_DRAW_WIRE_BOX(contactBounds, Color::Blue.AlphaMultiplied(0.2f), 0, false); - } - Vector3 corners[8]; _bounds.GetCorners(corners); const float margin = Math::Min(1.0f, _bounds.GetSize().MinValue() * 0.01f); @@ -146,8 +139,19 @@ void BoxCollider::OnDebugDrawSelected() { DEBUG_DRAW_WIRE_BOX(_bounds, wiresColor, 0, true); } +} + +void BoxCollider::OnDebugDrawSelected() +{ + OnDebugDrawSelf(); + + if (_contactOffset > 0) + { + OrientedBoundingBox contactBounds = _bounds; + contactBounds.Extents += Vector3(_contactOffset) / contactBounds.Transformation.Scale; + DEBUG_DRAW_WIRE_BOX(contactBounds, Color::Blue.AlphaMultiplied(0.2f), 0, false); + } - // Base Collider::OnDebugDrawSelected(); } diff --git a/Source/Engine/Physics/Colliders/BoxCollider.h b/Source/Engine/Physics/Colliders/BoxCollider.h index c0eeaea5c..7dbbc830d 100644 --- a/Source/Engine/Physics/Colliders/BoxCollider.h +++ b/Source/Engine/Physics/Colliders/BoxCollider.h @@ -52,6 +52,7 @@ public: // [Collider] #if USE_EDITOR void OnDebugDraw() override; + void OnDebugDrawSelf() override; void OnDebugDrawSelected() override; #endif bool IntersectsItself(const Ray& ray, Real& distance, Vector3& normal) override; diff --git a/Source/Engine/Physics/Colliders/CapsuleCollider.cpp b/Source/Engine/Physics/Colliders/CapsuleCollider.cpp index 8a9e1d1cf..83ce85115 100644 --- a/Source/Engine/Physics/Colliders/CapsuleCollider.cpp +++ b/Source/Engine/Physics/Colliders/CapsuleCollider.cpp @@ -52,6 +52,17 @@ void CapsuleCollider::DrawPhysicsDebug(RenderView& view) DEBUG_DRAW_WIRE_CAPSULE(_transform.LocalToWorld(_center), rotation, radius, height, Color::GreenYellow * 0.8f, 0, true); } +void CapsuleCollider::OnDebugDrawSelf() +{ + Quaternion rotation; + Quaternion::Multiply(_transform.Orientation, Quaternion::Euler(0, 90, 0), rotation); + const float minSize = 0.001f; + const float radius = Math::Max(Math::Abs(_radius) * _cachedScale, minSize); + const float height = Math::Max(Math::Abs(_height) * _cachedScale, minSize); + const Vector3 position = _transform.LocalToWorld(_center); + DEBUG_DRAW_WIRE_CAPSULE(position, rotation, radius, height, Color::GreenYellow, 0, false); +} + void CapsuleCollider::OnDebugDrawSelected() { Quaternion rotation; diff --git a/Source/Engine/Physics/Colliders/CapsuleCollider.h b/Source/Engine/Physics/Colliders/CapsuleCollider.h index 234916f87..784d346eb 100644 --- a/Source/Engine/Physics/Colliders/CapsuleCollider.h +++ b/Source/Engine/Physics/Colliders/CapsuleCollider.h @@ -56,6 +56,7 @@ public: public: // [Collider] #if USE_EDITOR + void OnDebugDrawSelf() override; void OnDebugDrawSelected() override; #endif bool IntersectsItself(const Ray& ray, Real& distance, Vector3& normal) override; diff --git a/Source/Engine/Physics/Colliders/Collider.h b/Source/Engine/Physics/Colliders/Collider.h index 5c7db4c72..1aa2ce385 100644 --- a/Source/Engine/Physics/Colliders/Collider.h +++ b/Source/Engine/Physics/Colliders/Collider.h @@ -160,6 +160,10 @@ protected: private: void OnMaterialChanged(); + friend RigidBody; +#if USE_EDITOR + virtual void OnDebugDrawSelf() {} +#endif public: // [PhysicsColliderActor] diff --git a/Source/Engine/Physics/Colliders/MeshCollider.cpp b/Source/Engine/Physics/Colliders/MeshCollider.cpp index 0902f1106..2af533ca3 100644 --- a/Source/Engine/Physics/Colliders/MeshCollider.cpp +++ b/Source/Engine/Physics/Colliders/MeshCollider.cpp @@ -85,13 +85,18 @@ void MeshCollider::DrawPhysicsDebug(RenderView& view) } } -void MeshCollider::OnDebugDrawSelected() +void MeshCollider::OnDebugDrawSelf() { if (CollisionData && CollisionData->IsLoaded()) { const auto& debugLines = CollisionData->GetDebugLines(); DEBUG_DRAW_LINES(Span(debugLines.Get(), debugLines.Count()), _transform.GetWorld(), Color::GreenYellow, 0, false); } +} + +void MeshCollider::OnDebugDrawSelected() +{ + OnDebugDrawSelf(); // Base Collider::OnDebugDrawSelected(); diff --git a/Source/Engine/Physics/Colliders/MeshCollider.h b/Source/Engine/Physics/Colliders/MeshCollider.h index 99f2980f6..8d0e77179 100644 --- a/Source/Engine/Physics/Colliders/MeshCollider.h +++ b/Source/Engine/Physics/Colliders/MeshCollider.h @@ -31,6 +31,7 @@ public: bool CanAttach(RigidBody* rigidBody) const override; bool CanBeTrigger() const override; #if USE_EDITOR + void OnDebugDrawSelf() override; void OnDebugDrawSelected() override; #endif bool IntersectsItself(const Ray& ray, Real& distance, Vector3& normal) override; diff --git a/Source/Engine/Physics/Colliders/SphereCollider.cpp b/Source/Engine/Physics/Colliders/SphereCollider.cpp index f40d9e4af..0576ae6cf 100644 --- a/Source/Engine/Physics/Colliders/SphereCollider.cpp +++ b/Source/Engine/Physics/Colliders/SphereCollider.cpp @@ -35,9 +35,14 @@ void SphereCollider::DrawPhysicsDebug(RenderView& view) DEBUG_DRAW_WIRE_SPHERE(_sphere, Color::GreenYellow * 0.8f, 0, true); } -void SphereCollider::OnDebugDrawSelected() +void SphereCollider::OnDebugDrawSelf() { DEBUG_DRAW_WIRE_SPHERE(_sphere, Color::GreenYellow, 0, false); +} + +void SphereCollider::OnDebugDrawSelected() +{ + OnDebugDrawSelf(); if (_contactOffset > 0) { diff --git a/Source/Engine/Physics/Colliders/SphereCollider.h b/Source/Engine/Physics/Colliders/SphereCollider.h index 67addf17b..47459cf34 100644 --- a/Source/Engine/Physics/Colliders/SphereCollider.h +++ b/Source/Engine/Physics/Colliders/SphereCollider.h @@ -36,6 +36,7 @@ public: public: // [Collider] #if USE_EDITOR + void OnDebugDrawSelf() override; void OnDebugDrawSelected() override; #endif bool IntersectsItself(const Ray& ray, Real& distance, Vector3& normal) override;