Skip to content

Commit 5d713ff

Browse files
committed
-
1 parent 979005c commit 5d713ff

17 files changed

Lines changed: 100 additions & 81 deletions

src/AiCharacterController.cpp

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ inline eMapDirection GetMapDirectionFromHeading(float angleDegrees)
3131
{270.0f, eMapDirection_N},
3232
};
3333

34-
angleDegrees = cxx::normalize_angle_360(angleDegrees);
34+
angleDegrees = cxx::wrap_angle_360(angleDegrees);
3535

3636
for (const auto& curr: Directions)
3737
{
@@ -356,10 +356,9 @@ bool AiCharacterController::ContinueWalkToWaypoint(float distance)
356356
}
357357

358358
// setup sign direction
359-
glm::vec2 toTarget = glm::normalize(mDestinationPoint - currentPos2);
360-
mCharacter->SetOrientation(toTarget);
361-
362-
// set control
359+
glm::vec2 toTarget = mDestinationPoint - currentPos2;
360+
mCtlState.mDesiredRotationAngle = cxx::angle_t::from_radians(::atan2f(toTarget.y, toTarget.x));
361+
mCtlState.mRotateToDesiredAngle = true;
363362
mCtlState.mWalkForward = true;
364363
mCtlState.mRun = mRunToTarget;
365364
return true;
@@ -490,14 +489,9 @@ void AiCharacterController::UpdateFollowTarget()
490489
ContinueWalkToWaypoint(mFollowNearDistance);
491490
}
492491

493-
void AiCharacterController::EnableAiFlags(PedestrianAiFlags aiFlags)
494-
{
495-
mAiFlags = (mAiFlags | aiFlags);
496-
}
497-
498-
void AiCharacterController::DisableAiFlags(PedestrianAiFlags aiFlags)
492+
void AiCharacterController::ChangeAiFlags(PedestrianAiFlags enableFlags, PedestrianAiFlags disableFlags)
499493
{
500-
mAiFlags = (mAiFlags & ~aiFlags);
494+
mAiFlags = (mAiFlags & ~disableFlags) | enableFlags;
501495
}
502496

503497
bool AiCharacterController::HasAiFlags(PedestrianAiFlags aiFlags) const

src/AiCharacterController.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@ class AiCharacterController final: public CharacterController
4444
void DebugDraw(DebugRenderer& debugRender) override;
4545
void OnCharacterUpdateFrame() override;
4646

47-
void EnableAiFlags(PedestrianAiFlags aiFlags);
48-
void DisableAiFlags(PedestrianAiFlags aiFlags);
47+
void ChangeAiFlags(PedestrianAiFlags enableFlags, PedestrianAiFlags disableFlags);
4948
bool HasAiFlags(PedestrianAiFlags aiFlags) const;
5049

5150
// objectives

src/GameDefs.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -887,6 +887,10 @@ struct PedestrianCtlState
887887
bool mShoot = false;
888888
bool mJump = false;
889889
bool mSpecial = false;
890+
891+
// overrides mTurnLeft/mTurnRight
892+
bool mRotateToDesiredAngle = false;
893+
cxx::angle_t mDesiredRotationAngle;
890894
};
891895
struct // in car control actions
892896
{

src/HumanPlayer.cpp

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -437,14 +437,7 @@ void HumanPlayer::UpdateMouseAiming()
437437
raycastResult.mOrigin.x + (raycastResult.mDirection.x * distanceFromCameraToCharacter),
438438
raycastResult.mOrigin.z + (raycastResult.mDirection.z * distanceFromCameraToCharacter)
439439
);
440-
glm::vec2 mousePointVector = worldPosition - mCharacter->mTransform.GetPosition2();
441-
if (glm::length2(mousePointVector) > 0.0f)
442-
{
443-
mousePointVector = glm::normalize(mousePointVector);
444-
445-
glm::vec2 characterRightVector = mCharacter->mTransform.GetRightVector();
446-
float dot_ = glm::dot(characterRightVector, mousePointVector);
447-
mCtlState.mTurnLeft = (dot_ < -0.1f);
448-
mCtlState.mTurnRight = (dot_ > 0.1f);
449-
}
440+
glm::vec2 toTarget = worldPosition - mCharacter->mTransform.GetPosition2();
441+
mCtlState.mRotateToDesiredAngle = true;
442+
mCtlState.mDesiredRotationAngle = cxx::angle_t::from_radians(::atan2f(toTarget.y, toTarget.x));
450443
}

src/HumanPlayer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class HumanPlayer final: public CharacterController
2222
// override CharacterController
2323
bool IsHumanPlayer() const override;
2424
void OnCharacterUpdateFrame() override;
25-
void OnCharacterChangeState(ePedestrianState prevState, ePedestrianState newState);
25+
void OnCharacterChangeState(ePedestrianState prevState, ePedestrianState newState) override;
2626

2727
// Get or set current police attention level
2828
int GetWantedLevel() const;

src/Pedestrian.cpp

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ void Pedestrian::SimulationStep()
231231
ReceiveDamage(damageInfo);
232232
}
233233

234+
UpdateRotation();
234235
UpdateLocomotion();
235236
}
236237

@@ -269,8 +270,7 @@ void Pedestrian::UpdateDrawOrder()
269270

270271
void Pedestrian::UpdateLocomotion()
271272
{
272-
if (mPhysicsBody == nullptr)
273-
return;
273+
debug_assert(mPhysicsBody);
274274

275275
float walkingSpeed = 0.0f;
276276

@@ -325,6 +325,48 @@ void Pedestrian::UpdateLocomotion()
325325
mPhysicsBody->SetLinearVelocity(desiredVelocity);
326326
}
327327

328+
void Pedestrian::UpdateRotation()
329+
{
330+
cxx::angle_t angularVelocity;
331+
332+
bool isSlideOverCar = (ePedestrianState_SlideOnCar == GetCurrentStateID());
333+
if (isSlideOverCar || IsIdle())
334+
{
335+
const PedestrianCtlState& ctlState = GetCtlState();
336+
if (ctlState.mTurnLeft || ctlState.mTurnRight || ctlState.mRotateToDesiredAngle)
337+
{
338+
if (ctlState.mRotateToDesiredAngle)
339+
{
340+
static const float instantTurnSpeed = 360.0f * 10.0f;
341+
342+
float turnSpeed = instantTurnSpeed;
343+
344+
const float angleDelta = cxx::wrap_angle_neg_180((ctlState.mDesiredRotationAngle - mPhysicsBody->GetOrientation()).to_degrees());
345+
const float desiredSpeedPerTurn = gPhysics.GetSimulationStepTime() * turnSpeed;
346+
if (angleDelta < desiredSpeedPerTurn)
347+
{
348+
turnSpeed = angleDelta / gPhysics.GetSimulationStepTime();
349+
}
350+
351+
if (::fabs(turnSpeed) > 1.0f)
352+
{
353+
angularVelocity.set_angle(turnSpeed, cxx::angle_t::units::degrees);
354+
}
355+
}
356+
else
357+
{
358+
float turnSpeed = isSlideOverCar ?
359+
gGameParams.mPedestrianTurnSpeedSlideOnCar :
360+
gGameParams.mPedestrianTurnSpeed;
361+
362+
angularVelocity = cxx::angle_t::from_degrees(turnSpeed * (ctlState.mTurnLeft ? -1.0f : 1.0f));
363+
}
364+
}
365+
}
366+
367+
mPhysicsBody->SetAngularVelocity(angularVelocity);
368+
}
369+
328370
void Pedestrian::DebugDraw(DebugRenderer& debugRender)
329371
{
330372
if (mCurrentCar == nullptr)

src/Pedestrian.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ class Pedestrian final: public GameObject, public SpriteAnimListener
151151
void UpdateDrawOrder();
152152

153153
void UpdateLocomotion();
154+
void UpdateRotation();
154155

155156
// Detects identifier of current pedestrian state
156157
ePedestrianState GetCurrentStateID() const;

src/PedestrianStates.cpp

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -135,27 +135,6 @@ void PedestrianStatesManager::InitFuncsTable()
135135

136136
//////////////////////////////////////////////////////////////////////////
137137

138-
void PedestrianStatesManager::ProcessRotateActions()
139-
{
140-
const PedestrianCtlState& ctlState = mPedestrian->GetCtlState();
141-
if (ctlState.mTurnLeft || ctlState.mTurnRight)
142-
{
143-
float turnSpeed = gGameParams.mPedestrianTurnSpeed;
144-
if (mCurrentStateID == ePedestrianState_SlideOnCar)
145-
{
146-
turnSpeed = gGameParams.mPedestrianTurnSpeedSlideOnCar;
147-
}
148-
149-
cxx::angle_t angularVelocity = cxx::angle_t::from_degrees(turnSpeed * (ctlState.mTurnLeft ? -1.0f : 1.0f));
150-
mPedestrian->mPhysicsBody->SetAngularVelocity(angularVelocity);
151-
}
152-
else
153-
{
154-
cxx::angle_t angularVelocity;
155-
mPedestrian->mPhysicsBody->SetAngularVelocity(angularVelocity);
156-
}
157-
}
158-
159138
ePedestrianState PedestrianStatesManager::GetNextIdleState()
160139
{
161140
const PedestrianCtlState& ctlState = mPedestrian->GetCtlState();
@@ -512,8 +491,6 @@ void PedestrianStatesManager::StateEnterCar_ProcessEnter(const PedestrianStateEv
512491

513492
void PedestrianStatesManager::StateSlideCar_ProcessFrame()
514493
{
515-
ProcessRotateActions();
516-
517494
if (mPedestrian->mCurrentAnimID == ePedestrianAnim_JumpOntoCar)
518495
{
519496
if (!mPedestrian->mCurrentAnimState.IsActive())
@@ -701,8 +678,6 @@ void PedestrianStatesManager::StateIdle_ProcessFrame()
701678
}
702679
}
703680

704-
ProcessRotateActions();
705-
706681
if (isShooting)
707682
{
708683
mPedestrian->GetWeapon().Fire(mPedestrian);

src/PedestrianStates.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,6 @@ class PedestrianStatesManager: public cxx::noncopyable
6464
private:
6565
void InitFuncsTable();
6666

67-
// state helpers
68-
void ProcessRotateActions();
69-
7067
ePedestrianState GetNextIdleState();
7168

7269
// anims helpers

src/PhysicsBody.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
#include "Box2D_Helpers.h"
1111
#include "CarnageGame.h"
1212
#include "Collider.h"
13+
#include "Cvars.h"
14+
#include <glm/gtx/fast_trigonometry.hpp>
1315

1416
//////////////////////////////////////////////////////////////////////////
1517

@@ -243,7 +245,7 @@ cxx::angle_t PhysicsBody::GetOrientation() const
243245

244246
void PhysicsBody::SetSignVector(const glm::vec2& signDirection)
245247
{
246-
float rotationAngleRadians = atan2f(signDirection.y, signDirection.x);
248+
float rotationAngleRadians = ::atan2f(signDirection.y, signDirection.x);
247249
mBox2Body->SetTransform(mBox2Body->GetPosition(), rotationAngleRadians);
248250
}
249251

@@ -407,4 +409,4 @@ void PhysicsBody::SetAwake(bool isAwake)
407409
float PhysicsBody::GetMass() const
408410
{
409411
return mBox2Body->GetMass();
410-
}
412+
}

0 commit comments

Comments
 (0)