From 2524d93f6b6cdd0cec961356c111136910a3ccd6 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Perrier Date: Tue, 30 Mar 2021 21:43:03 +0200 Subject: [PATCH 1/3] Add Set/Get Up direction. --- .../Engine/Physics/Colliders/CharacterController.cpp | 11 +++++++++++ Source/Engine/Physics/Colliders/CharacterController.h | 10 ++++++++++ 2 files changed, 21 insertions(+) diff --git a/Source/Engine/Physics/Colliders/CharacterController.cpp b/Source/Engine/Physics/Colliders/CharacterController.cpp index 4315ce8ba..d13aca3b7 100644 --- a/Source/Engine/Physics/Colliders/CharacterController.cpp +++ b/Source/Engine/Physics/Colliders/CharacterController.cpp @@ -82,6 +82,17 @@ void CharacterController::SetStepOffset(float value) _controller->setStepOffset(value); } +void CharacterController::SetUpDirection(const Vector3& up) +{ + if (_controller) + _controller->setUpDirection(C2P(up)); +} + +Vector3 CharacterController::GetUpDirection() const +{ + return _controller ? P2C(_controller->getUpDirection()) : Vector3::Up; +} + void CharacterController::SetMinMoveDistance(float value) { _minMoveDistance = Math::Max(value, 0.0f); diff --git a/Source/Engine/Physics/Colliders/CharacterController.h b/Source/Engine/Physics/Colliders/CharacterController.h index f850b9124..5f0faa793 100644 --- a/Source/Engine/Physics/Colliders/CharacterController.h +++ b/Source/Engine/Physics/Colliders/CharacterController.h @@ -141,6 +141,16 @@ public: /// API_PROPERTY() void SetStepOffset(float value); + /// + /// Sets the character up vector. + /// + API_PROPERTY() void SetUpDirection(const Vector3& up); + + /// + /// Gets the character up vector. + /// + API_PROPERTY() Vector3 GetUpDirection() const; + /// /// Gets the minimum move distance of the character controller. The minimum traveled distance to consider. If traveled distance is smaller, the character doesn't move. This is used to stop the recursive motion algorithm when remaining distance to travel is small. /// From 60e926a62f893b08990195e385134c91abf0b9b9 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Perrier Date: Wed, 7 Apr 2021 17:01:37 +0200 Subject: [PATCH 2/3] Serialize UpDirection. --- Source/Engine/Physics/Colliders/CharacterController.cpp | 5 +++++ Source/Engine/Physics/Colliders/CharacterController.h | 1 + 2 files changed, 6 insertions(+) diff --git a/Source/Engine/Physics/Colliders/CharacterController.cpp b/Source/Engine/Physics/Colliders/CharacterController.cpp index d13aca3b7..951f79d37 100644 --- a/Source/Engine/Physics/Colliders/CharacterController.cpp +++ b/Source/Engine/Physics/Colliders/CharacterController.cpp @@ -22,6 +22,7 @@ CharacterController::CharacterController(const SpawnParams& params) , _radius(50.0f) , _height(150.0f) , _minMoveDistance(0.0f) + , _upDirection(Vector3::Up) , _isUpdatingTransform(false) , _nonWalkableMode(CharacterController::NonWalkableModes::PreventClimbing) , _lastFlags(CollisionFlags::None) @@ -86,6 +87,7 @@ void CharacterController::SetUpDirection(const Vector3& up) { if (_controller) _controller->setUpDirection(C2P(up)); + _upDirection = up; } Vector3 CharacterController::GetUpDirection() const @@ -191,6 +193,7 @@ void CharacterController::CreateActor() // Create controller _controller = (PxCapsuleController*)Physics::GetControllerManager()->createController(desc); ASSERT(_controller); + _controller->setUpDirection(C2P(_upDirection)); const auto actor = _controller->getActor(); ASSERT(actor && actor->getNbShapes() == 1); actor->getShapes(&_shape, 1); @@ -374,6 +377,7 @@ void CharacterController::Serialize(SerializeStream& stream, const void* otherOb SERIALIZE_MEMBER(Radius, _radius); SERIALIZE_MEMBER(Height, _height); SERIALIZE_MEMBER(MinMoveDistance, _minMoveDistance); + SERIALIZE_MEMBER(UpDirection, _upDirection); } void CharacterController::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) @@ -387,4 +391,5 @@ void CharacterController::Deserialize(DeserializeStream& stream, ISerializeModif DESERIALIZE_MEMBER(Radius, _radius); DESERIALIZE_MEMBER(Height, _height); DESERIALIZE_MEMBER(MinMoveDistance, _minMoveDistance); + DESERIALIZE_MEMBER(UpDirection, _upDirection); } diff --git a/Source/Engine/Physics/Colliders/CharacterController.h b/Source/Engine/Physics/Colliders/CharacterController.h index 5f0faa793..712ab6296 100644 --- a/Source/Engine/Physics/Colliders/CharacterController.h +++ b/Source/Engine/Physics/Colliders/CharacterController.h @@ -65,6 +65,7 @@ private: float _height; float _minMoveDistance; bool _isUpdatingTransform; + Vector3 _upDirection; NonWalkableModes _nonWalkableMode; CollisionFlags _lastFlags; uint32 _filterData[4]; From eff5d0899d5eab96712650b922a80485d89c54ac Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Perrier Date: Thu, 8 Apr 2021 20:35:01 +0200 Subject: [PATCH 3/3] Order + Attributes + Return _up. --- .../Engine/Physics/Colliders/CharacterController.cpp | 2 +- Source/Engine/Physics/Colliders/CharacterController.h | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Source/Engine/Physics/Colliders/CharacterController.cpp b/Source/Engine/Physics/Colliders/CharacterController.cpp index 951f79d37..419b6b052 100644 --- a/Source/Engine/Physics/Colliders/CharacterController.cpp +++ b/Source/Engine/Physics/Colliders/CharacterController.cpp @@ -92,7 +92,7 @@ void CharacterController::SetUpDirection(const Vector3& up) Vector3 CharacterController::GetUpDirection() const { - return _controller ? P2C(_controller->getUpDirection()) : Vector3::Up; + return _controller ? P2C(_controller->getUpDirection()) : _upDirection; } void CharacterController::SetMinMoveDistance(float value) diff --git a/Source/Engine/Physics/Colliders/CharacterController.h b/Source/Engine/Physics/Colliders/CharacterController.h index 712ab6296..8ae992c59 100644 --- a/Source/Engine/Physics/Colliders/CharacterController.h +++ b/Source/Engine/Physics/Colliders/CharacterController.h @@ -142,15 +142,16 @@ public: /// API_PROPERTY() void SetStepOffset(float value); + /// + /// Gets the character up vector. + /// + API_PROPERTY(Attributes="EditorOrder(240), DefaultValue(true), EditorDisplay(\"Character Controller\")") + Vector3 GetUpDirection() const; + /// /// Sets the character up vector. /// API_PROPERTY() void SetUpDirection(const Vector3& up); - - /// - /// Gets the character up vector. - /// - API_PROPERTY() Vector3 GetUpDirection() const; /// /// Gets the minimum move distance of the character controller. The minimum traveled distance to consider. If traveled distance is smaller, the character doesn't move. This is used to stop the recursive motion algorithm when remaining distance to travel is small.