Merge remote-tracking branch 'origin/master' into 1.11

# Conflicts:
#	Source/Engine/Physics/Colliders/Collider.h
This commit is contained in:
Wojtek Figat
2025-10-11 00:16:10 +02:00
17 changed files with 105 additions and 31 deletions

View File

@@ -86,7 +86,7 @@ void BoxCollider::OnDebugDraw()
namespace
{
OrientedBoundingBox GetWriteBox(const Vector3& min, const Vector3& max, const float margin)
OrientedBoundingBox GetWireBox(const Vector3& min, const Vector3& max, const float margin)
{
OrientedBoundingBox box;
const Vector3 vec = max - min;
@@ -111,11 +111,40 @@ namespace
}
}
void BoxCollider::OnDebugDrawSelected()
void BoxCollider::OnDebugDrawSelf()
{
const Color color = Color::GreenYellow;
DEBUG_DRAW_WIRE_BOX(_bounds, color * 0.3f, 0, false);
Vector3 corners[8];
_bounds.GetCorners(corners);
const float margin = Math::Min(1.0f, (float)_bounds.GetSize().MinValue() * 0.01f);
const Color wiresColor = color.AlphaMultiplied(0.6f);
if (margin > 0.05f)
{
DEBUG_DRAW_BOX(GetWireBox(corners[0], corners[1], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWireBox(corners[0], corners[3], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWireBox(corners[0], corners[4], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWireBox(corners[1], corners[2], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWireBox(corners[1], corners[5], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWireBox(corners[2], corners[3], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWireBox(corners[2], corners[6], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWireBox(corners[3], corners[7], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWireBox(corners[4], corners[5], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWireBox(corners[4], corners[7], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWireBox(corners[5], corners[6], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWireBox(corners[6], corners[7], margin), wiresColor, 0, true);
}
else
{
DEBUG_DRAW_WIRE_BOX(_bounds, wiresColor, 0, true);
}
}
void BoxCollider::OnDebugDrawSelected()
{
OnDebugDrawSelf();
if (_contactOffset > 0)
{
OrientedBoundingBox contactBounds = _bounds;
@@ -123,24 +152,6 @@ void BoxCollider::OnDebugDrawSelected()
DEBUG_DRAW_WIRE_BOX(contactBounds, Color::Blue.AlphaMultiplied(0.2f), 0, false);
}
Vector3 corners[8];
_bounds.GetCorners(corners);
const float margin = 1.0f;
const Color wiresColor = color.AlphaMultiplied(0.6f);
DEBUG_DRAW_BOX(GetWriteBox(corners[0], corners[1], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWriteBox(corners[0], corners[3], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWriteBox(corners[0], corners[4], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWriteBox(corners[1], corners[2], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWriteBox(corners[1], corners[5], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWriteBox(corners[2], corners[3], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWriteBox(corners[2], corners[6], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWriteBox(corners[3], corners[7], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWriteBox(corners[4], corners[5], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWriteBox(corners[4], corners[7], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWriteBox(corners[5], corners[6], margin), wiresColor, 0, true);
DEBUG_DRAW_BOX(GetWriteBox(corners[6], corners[7], margin), wiresColor, 0, true);
// Base
Collider::OnDebugDrawSelected();
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -158,6 +158,12 @@ protected:
/// </summary>
void RemoveStaticActor();
private:
friend RigidBody;
#if USE_EDITOR
virtual void OnDebugDrawSelf() {}
#endif
public:
// [PhysicsColliderActor]
RigidBody* GetAttachedRigidBody() const override;

View File

@@ -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<Float3>(debugLines.Get(), debugLines.Count()), _transform.GetWorld(), Color::GreenYellow, 0, false);
}
}
void MeshCollider::OnDebugDrawSelected()
{
OnDebugDrawSelf();
// Base
Collider::OnDebugDrawSelected();

View File

@@ -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;

View File

@@ -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)
{

View File

@@ -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;