Merge remote-tracking branch 'origin/master' into 1.9
This commit is contained in:
@@ -19,6 +19,7 @@ CharacterController::CharacterController(const SpawnParams& params)
|
||||
, _minMoveDistance(0.0f)
|
||||
, _isUpdatingTransform(false)
|
||||
, _upDirection(Vector3::Up)
|
||||
, _gravityDisplacement(Vector3::Zero)
|
||||
, _nonWalkableMode(NonWalkableModes::PreventClimbing)
|
||||
, _lastFlags(CollisionFlags::None)
|
||||
{
|
||||
@@ -148,10 +149,16 @@ CharacterController::CollisionFlags CharacterController::GetFlags() const
|
||||
CharacterController::CollisionFlags CharacterController::SimpleMove(const Vector3& speed)
|
||||
{
|
||||
const float deltaTime = Time::GetCurrentSafe()->DeltaTime.GetTotalSeconds();
|
||||
Vector3 displacement = speed;
|
||||
displacement += GetPhysicsScene()->GetGravity() * deltaTime;
|
||||
displacement *= deltaTime;
|
||||
return Move(displacement);
|
||||
Vector3 displacement = speed + _gravityDisplacement;
|
||||
CollisionFlags result = Move(displacement * deltaTime);
|
||||
if ((static_cast<int>(result) & static_cast<int>(CollisionFlags::Below)) != 0)
|
||||
{
|
||||
// Reset accumulated gravity acceleration when we touch the ground
|
||||
_gravityDisplacement = Vector3::Zero;
|
||||
}
|
||||
else
|
||||
_gravityDisplacement += GetPhysicsScene()->GetGravity() * deltaTime;
|
||||
return result;
|
||||
}
|
||||
|
||||
CharacterController::CollisionFlags CharacterController::Move(const Vector3& displacement)
|
||||
|
||||
@@ -66,6 +66,7 @@ private:
|
||||
float _minMoveDistance;
|
||||
bool _isUpdatingTransform;
|
||||
Vector3 _upDirection;
|
||||
Vector3 _gravityDisplacement;
|
||||
NonWalkableModes _nonWalkableMode;
|
||||
CollisionFlags _lastFlags;
|
||||
|
||||
|
||||
@@ -133,7 +133,13 @@ void MeshCollider::GetGeometry(CollisionShape& collision)
|
||||
// Prepare scale
|
||||
Float3 scale = _cachedScale;
|
||||
const float minSize = 0.001f;
|
||||
scale = Float3::Max(scale.GetAbsolute(), minSize);
|
||||
Float3 scaleAbs = scale.GetAbsolute();
|
||||
if (scaleAbs.X < minSize)
|
||||
scale.X = Math::Sign(scale.X) * minSize;
|
||||
if (scaleAbs.Y < minSize)
|
||||
scale.Y = Math::Sign(scale.Y) * minSize;
|
||||
if (scaleAbs.Z < minSize)
|
||||
scale.Z = Math::Sign(scale.Z) * minSize;
|
||||
|
||||
// Setup shape (based on type)
|
||||
CollisionDataType type = CollisionDataType::None;
|
||||
|
||||
@@ -321,7 +321,12 @@ class CharacterControllerHitReportPhysX : public PxUserControllerHitReport
|
||||
{
|
||||
void onHit(const PxControllerHit& hit, Collision& c)
|
||||
{
|
||||
ASSERT_LOW_LAYER(c.ThisActor && c.OtherActor);
|
||||
if (c.ThisActor == nullptr || c.OtherActor == nullptr)
|
||||
{
|
||||
// One of the actors was deleted (eg. via RigidBody destroyed by gameplay) then skip processing this collision
|
||||
return;
|
||||
}
|
||||
|
||||
c.Impulse = Vector3::Zero;
|
||||
c.ThisVelocity = P2C(hit.dir) * hit.length;
|
||||
c.OtherVelocity = Vector3::Zero;
|
||||
@@ -564,6 +569,7 @@ namespace
|
||||
Array<PxBase*> DeleteObjects;
|
||||
|
||||
bool _queriesHitTriggers = true;
|
||||
bool _enableCCD = true;
|
||||
PhysicsCombineMode _frictionCombineMode = PhysicsCombineMode::Average;
|
||||
PhysicsCombineMode _restitutionCombineMode = PhysicsCombineMode::Average;
|
||||
|
||||
@@ -697,6 +703,8 @@ PxFilterFlags FilterShader(
|
||||
pairFlags |= PxPairFlag::eNOTIFY_TOUCH_LOST;
|
||||
pairFlags |= PxPairFlag::ePOST_SOLVER_VELOCITY;
|
||||
pairFlags |= PxPairFlag::eNOTIFY_CONTACT_POINTS;
|
||||
if (_enableCCD)
|
||||
pairFlags |= PxPairFlag::eDETECT_CCD_CONTACT;
|
||||
return PxFilterFlag::eDEFAULT;
|
||||
}
|
||||
|
||||
@@ -1220,6 +1228,7 @@ void PhysicsBackend::Shutdown()
|
||||
void PhysicsBackend::ApplySettings(const PhysicsSettings& settings)
|
||||
{
|
||||
_queriesHitTriggers = settings.QueriesHitTriggers;
|
||||
_enableCCD = !settings.DisableCCD;
|
||||
_frictionCombineMode = settings.FrictionCombineMode;
|
||||
_restitutionCombineMode = settings.RestitutionCombineMode;
|
||||
|
||||
@@ -1256,6 +1265,8 @@ void* PhysicsBackend::CreateScene(const PhysicsSettings& settings)
|
||||
sceneDesc.simulationEventCallback = &scenePhysX->EventsCallback;
|
||||
sceneDesc.filterShader = FilterShader;
|
||||
sceneDesc.bounceThresholdVelocity = settings.BounceThresholdVelocity;
|
||||
if (settings.EnableEnhancedDeterminism)
|
||||
sceneDesc.flags |= PxSceneFlag::eENABLE_ENHANCED_DETERMINISM;
|
||||
switch (settings.SolverType)
|
||||
{
|
||||
case PhysicsSolverType::ProjectedGaussSeidelIterativeSolver:
|
||||
|
||||
@@ -94,10 +94,16 @@ public:
|
||||
API_FIELD(Attributes="EditorOrder(71), EditorDisplay(\"Simulation\")")
|
||||
PhysicsBroadPhaseType BroadPhaseType = PhysicsBroadPhaseType::ParallelAutomaticBoxPruning;
|
||||
|
||||
/// <summary>
|
||||
/// Enables enhanced determinism in the simulation. This has a performance impact.
|
||||
/// </summary>
|
||||
API_FIELD(Attributes="EditorOrder(71), EditorDisplay(\"Simulation\")")
|
||||
bool EnableEnhancedDeterminism = false;
|
||||
|
||||
/// <summary>
|
||||
/// The solver type to use in the simulation.
|
||||
/// </summary>
|
||||
API_FIELD(Attributes="EditorOrder(72), EditorDisplay(\"Simulation\")")
|
||||
API_FIELD(Attributes="EditorOrder(73), EditorDisplay(\"Simulation\")")
|
||||
PhysicsSolverType SolverType = PhysicsSolverType::ProjectedGaussSeidelIterativeSolver;
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user