Merge branch 'rot-colliders' of https://github.com/Tryibion/FlaxEngine into Tryibion-rot-colliders

# Conflicts:
#	Source/Engine/Physics/Colliders/CapsuleCollider.cpp
#	Source/Engine/Physics/Colliders/Collider.cpp
This commit is contained in:
Wojtek Figat
2024-03-04 20:12:32 +01:00
4 changed files with 124 additions and 12 deletions

View File

@@ -6,7 +6,9 @@ CapsuleCollider::CapsuleCollider(const SpawnParams& params)
: Collider(params)
, _radius(20.0f)
, _height(100.0f)
, _direction(ColliderOrientationDirection::YAxis)
{
SetColliderDirection(_direction);
}
void CapsuleCollider::SetRadius(const float value)
@@ -31,6 +33,24 @@ void CapsuleCollider::SetHeight(const float value)
UpdateBounds();
}
void CapsuleCollider::SetColliderDirection(ColliderOrientationDirection value)
{
_direction = value;
switch (value)
{
case ColliderOrientationDirection::XAxis:
SetColliderOrientation(Quaternion::Identity);
break;
case ColliderOrientationDirection::YAxis:
SetColliderOrientation(Quaternion::Euler(0, 0, 90));
break;
case ColliderOrientationDirection::ZAxis:
SetColliderOrientation(Quaternion::Euler(0, 90, 0));
break;
default: ;
}
}
#if USE_EDITOR
#include "Engine/Debug/DebugDraw.h"
@@ -41,8 +61,10 @@ void CapsuleCollider::DrawPhysicsDebug(RenderView& view)
const BoundingSphere sphere(_sphere.Center - view.Origin, _sphere.Radius);
if (!view.CullingFrustum.Intersects(sphere))
return;
Quaternion collRot;
Quaternion::Multiply( _colliderOrientation, Quaternion::Euler(0, 90, 0), collRot);
Quaternion rotation;
Quaternion::Multiply(_transform.Orientation, Quaternion::Euler(0, 90, 0), rotation);
Quaternion::Multiply(_transform.Orientation, collRot, rotation);
const float scaling = _cachedScale.GetAbsolute().MaxValue();
const float minSize = 0.001f;
const float radius = Math::Max(Math::Abs(_radius) * scaling, minSize);
@@ -55,8 +77,10 @@ void CapsuleCollider::DrawPhysicsDebug(RenderView& view)
void CapsuleCollider::OnDebugDrawSelected()
{
Quaternion collRot;
Quaternion::Multiply( _colliderOrientation, Quaternion::Euler(0, 90, 0), collRot);
Quaternion rotation;
Quaternion::Multiply(_transform.Orientation, Quaternion::Euler(0, 90, 0), rotation);
Quaternion::Multiply(_transform.Orientation, collRot, rotation);
const float scaling = _cachedScale.GetAbsolute().MaxValue();
const float minSize = 0.001f;
const float radius = Math::Max(Math::Abs(_radius) * scaling, minSize);
@@ -85,7 +109,11 @@ void CapsuleCollider::UpdateBounds()
// Cache bounds
const float radiusTwice = _radius * 2.0f;
OrientedBoundingBox::CreateCentered(_center, Vector3(_height + radiusTwice, radiusTwice, radiusTwice), _orientedBox);
_orientedBox.Transform(_transform);
Transform transform = _transform;
Quaternion rot;
Quaternion::Multiply(transform.Orientation, _colliderOrientation, rot);
transform.Orientation = rot;
_orientedBox.Transform(transform);
_orientedBox.GetBoundingBox(_box);
BoundingSphere::FromBox(_box, _sphere);
}