Plasma Engine  2.0
Loading...
Searching...
No Matches
plJoltDefaultCharacterComponent Class Reference

An example character controller (CC) implementation build upon plJoltCharacterControllerComponent. More...

#include <JoltDefaultCharacterComponent.h>

Inheritance diagram for plJoltDefaultCharacterComponent:

Classes

struct  Config
 

Public Types

enum class  GroundState : plUInt8 { OnGround , Sliding , InAir }
 

Public Member Functions

virtual void SerializeComponent (plWorldWriter &inout_stream) const override
 Override this to save the current state of the component to the given stream.
 
virtual void DeserializeComponent (plWorldReader &inout_stream) override
 Override this to load the current state of the component from the given stream.
 
bool GetAllowJumpInAir () const
 
void SetAllowJumpInAir (bool inAllow)
 
void SetWalkSurfaceInteraction (const char *szName)
 
const char * GetWalkSurfaceInteraction () const
 
void SetFallbackWalkSurfaceFile (const char *szFile)
 
const char * GetFallbackWalkSurfaceFile () const
 
void SetHeadObjectReference (const char *szReference)
 Sets an object GUID for an object that is the 'head' (controls the camera).
 
void SetInputState (plMsgMoveCharacterController &ref_msg)
 This message is used to steer the CC.
 
float GetCurrentCapsuleHeight () const
 Returns the current height of the entire capsule (crouching or standing).
 
float GetCurrentCylinderHeight () const
 Returns the current height of the cylindrical part of the capsule (crouching or standing).
 
virtual float GetShapeRadius () const override
 Returns the radius of the shape. This never changes at runtime.
 
virtual bool IsTouchingGround () override
 Checks whether the CC is currently touching the ground.
 
GroundState GetGroundState () const
 
bool IsStandingOnGround () const
 
bool IsSlidingOnGround () const
 
bool IsInAir () const
 
virtual bool IsCrouching () override
 Checks whether the CC is currently in the crouch state.
 
virtual void TeleportCharacter (const plVec3 &vGlobalFootPosition) override
 Instantly teleports the character to the target position. Doesn't change its rotation.
 
- Public Member Functions inherited from plJoltCharacterControllerComponent
void SetObjectToIgnore (plUInt32 uiObjectFilterID)
 The CC will move through the given physics body.
 
void ClearObjectToIgnore ()
 
void SetMaxClimbingSlope (plAngle slope)
 The maximum slope that the character can walk up.
 
plAngle GetMaxClimbingSlope () const
 
void SetMass (float fMass)
 The mass with which the character will push down on objects that it is standing on.
 
float GetMass () const
 
void SetStrength (float fStrength)
 The strength with which the character will push against objects that it is running into.
 
float GetStrength () const
 
virtual void RawMove (const plVec3 &vMoveDeltaGlobal) override
 Attempts to move the character into the given direction.
 
virtual void MoveCharacter (plMsgMoveCharacterController &msg) override
 Instructs the CC to move in certain directions. An implementation can queue the request for later processing.
 
virtual bool IsDestinationUnobstructed (const plVec3 &vGlobalFootPos, float fCharacterHeight) override
 Checks whether the CC can be teleported to the target position without getting stuck.
 
- Public Member Functions inherited from plComponent
void SetActiveFlag (bool bEnabled)
 Sets the active flag of the component, which affects its active state.
 
bool GetActiveFlag () const
 Checks whether the 'active flag' is set on this component. Note that this does not mean that the component is also 'active'.
 
bool IsActive () const
 Checks whether this component is in an active state.
 
bool IsActiveAndInitialized () const
 Returns whether this component is active and initialized.
 
bool IsActiveAndSimulating () const
 Whether the component is currently active and simulation has been started as well.
 
plComponentManagerBaseGetOwningManager ()
 Returns the corresponding manager for this component.
 
const plComponentManagerBaseGetOwningManager () const
 Returns the corresponding manager for this component.
 
plGameObjectGetOwner ()
 Returns the owner game object if the component is attached to one or nullptr.
 
const plGameObjectGetOwner () const
 Returns the owner game object if the component is attached to one or nullptr.
 
plWorldGetWorld ()
 Returns the corresponding world for this component.
 
const plWorldGetWorld () const
 Returns the corresponding world for this component.
 
plComponentHandle GetHandle () const
 Returns a handle to this component.
 
plUInt32 GetUniqueID () const
 Returns the unique id for this component.
 
void SetUniqueID (plUInt32 uiUniqueID)
 Sets the unique id for this component.
 
void EnsureInitialized ()
 Ensures that the component is initialized. Must only be called from another component's Initialize callback.
 
void EnsureSimulationStarted ()
 Ensures that the OnSimulationStarted method has been called. Must only be called from another component's OnSimulationStarted callback.
 
PL_ALWAYS_INLINE bool SendMessage (plMessage &ref_msg)
 Sends a message to this component.
 
PL_ALWAYS_INLINE bool SendMessage (plMessage &ref_msg) const
 
void PostMessage (const plMessage &msg, plTime delay=plTime::MakeZero(), plObjectMsgQueueType::Enum queueType=plObjectMsgQueueType::NextFrame) const
 Queues the message for the given phase. The message is processed after the given delay in the corresponding phase.
 
virtual bool HandlesMessage (const plMessage &msg) const
 Returns whether the given Message is handled by this component.
 
void SetUserFlag (plUInt8 uiFlagIndex, bool bSet)
 Be careful to check which flags may already be in use by base classes.
 
bool GetUserFlag (plUInt8 uiFlagIndex) const
 Retrieves a custom flag. Index must be between 0 and 7.
 
void SetCreatedByPrefab ()
 Adds plObjectFlags::CreatedByPrefab to the component. See the flag for details.
 
bool WasCreatedByPrefab () const
 Checks whether the plObjectFlags::CreatedByPrefab flag is set on this component.
 
- Public Member Functions inherited from plReflectedClass
virtual const plRTTIGetDynamicRTTI () const
 
bool IsInstanceOf (const plRTTI *pType) const
 Returns whether the type of this instance is of the given type or derived from it.
 
template<typename T >
PL_ALWAYS_INLINE bool IsInstanceOf () const
 Returns whether the type of this instance is of the given type or derived from it.
 

Public Attributes

plAngle m_RotateSpeed = plAngle::MakeFromDegree(90.0f)
 How many degrees per second the character turns.
 
float m_fShapeRadius = 0.25f
 The radius of the capsule shape.
 
float m_fCylinderHeightCrouch = 0.9f
 The total cylinder height when the character crouches.
 
float m_fCylinderHeightStand = 1.7f
 The total cylinder height when the character stands.
 
float m_fFootRadius = 0.15f
 The radius of the feet area, where it is checked whether the CC properly stands on the ground.
 
float m_fWalkSpeedCrouching = 0.5f
 Meters per second movement speed when crouching.
 
float m_fWalkSpeedStanding = 1.5f
 Meters per second movement speed when standing.
 
float m_fWalkSpeedRunning = 3.5f
 Meters per second movement speed when standing and running.
 
float m_fMaxStepUp = 0.25f
 The maximum step height that the CC can step up in a single frame.
 
float m_fMaxStepDown = 0.25f
 The maximum step height that the CC can step down in a single frame (without 'falling').
 
float m_fJumpImpulse = 5.0f
 The physics impulse to use for jumping.
 
bool m_bAllowJumpInAir = false
 Do we allow the CC to jump in the air? such as double jumping.
 
plHashedString m_sWalkSurfaceInteraction
 The surface interaction to spawn regularly when walking.
 
plSurfaceResourceHandle m_hFallbackWalkSurface
 The surface type to use for interactions, when no other surface type is available.
 
float m_fWalkInteractionDistance = 1.0f
 How far the CC has to walk for spawning another surface interaction.
 
float m_fRunInteractionDistance = 3.0f
 How far the CC has to run for spawning another surface interaction.
 
float m_fAirSpeed = 2.5f
 How fast to move while falling. The higher, the more "air control" the player has.
 
float m_fAirFriction = 0.5f
 How much lateral motion to lose while falling.
 
- Public Attributes inherited from plJoltCharacterControllerComponent
plUInt8 m_uiCollisionLayer = 0
 The collision layer determines with which other actors this actor collides.
 
plUInt8 m_uiPresenceCollisionLayer = 0
 In case a 'presence shape' is used, this defines which geometry the presence bodies collides with.
 
plBitflags< plJoltCharacterDebugFlags > m_DebugFlags
 What aspects of the CC to visualize.
 

Protected Member Functions

virtual void OnSimulationStarted () override
 This method is called once for active components, at the start of the next world update, but only when the world is simulated.
 
virtual void OnActivated () override
 This method is called when the component gets activated.
 
virtual void OnDeactivated () override
 This method is called when the component gets deactivated.
 
void OnUpdateLocalBounds (plMsgUpdateLocalBounds &msg) const
 
virtual void OnApplyRootMotion (plMsgApplyRootMotion &msg)
 
virtual void DetermineConfig (Config &out_inputs)
 
virtual void UpdateCharacter () override
 Called up to once per frame, but potentially less often, if physics updates were skipped due to high framerates.
 
virtual void ApplyRotationZ ()
 
void ResetInputState ()
 Clears the input states to neutral values.
 
void ResetInternalState ()
 
virtual JPH::Ref< JPH::Shape > MakeNextCharacterShape () override
 Creates a new shape with the given height (and fixed radius)
 
void ApplyCrouchState ()
 
void InteractWithSurfaces (const ContactPoint &contact, const Config &cfg)
 
void StoreLateralVelocity ()
 
void ClampLateralVelocity ()
 
void MoveHeadObject ()
 
void DebugVisualizations ()
 
void CheckFeet ()
 
- Protected Member Functions inherited from plJoltCharacterControllerComponent
PL_ALWAYS_INLINE float GetUpdateTimeDelta () const
 Returns the time delta to use for updating the character. This may differ from the world delta.
 
PL_ALWAYS_INLINE float GetInverseUpdateTimeDelta () const
 Returns the inverse of update time delta.
 
JPH::CharacterVirtual * GetJoltCharacter ()
 Gives access to the internally used JPH::CharacterVirtual.
 
const JPH::CharacterVirtual * GetJoltCharacter () const
 
plResult TryChangeShape (JPH::Shape *pNewShape)
 Attempts to change the character shape to the new one. Fails if the new shape overlaps with surrounding geometry.
 
void RawMoveWithVelocity (const plVec3 &vVelocity, float fMaxStairStepUp, float fMaxStepDown)
 Moves the character using the given velocity and timestep, making it collide with and slide along obstacles.
 
void RawMoveIntoDirection (const plVec3 &vDirection)
 Variant of RawMoveWithVelocity() that takes a direction vector instead.
 
void RawMoveToPosition (const plVec3 &vTargetPosition)
 Variant of RawMoveWithVelocity() that takes a target position instead.
 
void TeleportToPosition (const plVec3 &vGlobalFootPos)
 Teleports the character to the destination position, even if it would get stuck there.
 
bool StickToGround (float fMaxDist)
 If the CC is slightly above the ground, this will move it down so that it touches the ground.
 
void CollectCastContacts (plDynamicArray< ContactPoint > &out_Contacts, const JPH::Shape *pShape, const plVec3 &vQueryPosition, const plQuat &qQueryRotation, const plVec3 &vSweepDir) const
 Gathers all contact points that are found by sweeping the shape along a direction.
 
void CollectContacts (plDynamicArray< ContactPoint > &out_Contacts, const JPH::Shape *pShape, const plVec3 &vQueryPosition, const plQuat &qQueryRotation, float fCollisionTolerance) const
 Gathers all contact points of the shape at the target position.
 
plVec3 GetContactVelocityAndPushAway (const ContactPoint &contact, float fPushForce)
 Detects the velocity at the contact point. If it is a dynamic body, a force pushing it away is applied.
 
void SpawnContactInteraction (const ContactPoint &contact, const plHashedString &sSurfaceInteraction, plSurfaceResourceHandle hFallbackSurface, const plVec3 &vInteractionNormal=plVec3(0, 0, 1))
 Spawns a surface interaction prefab at the given contact point.
 
void VisualizeContact (const ContactPoint &contact, const plColor &color) const
 Debug draws the contact point.
 
void VisualizeContacts (const plDynamicArray< ContactPoint > &contacts, const plColor &color) const
 Debug draws all the contact points.
 
- Protected Member Functions inherited from plComponent
 plComponent ()
 Keep the constructor private or protected in derived classes, so it cannot be called manually.
 
bool IsDynamic () const
 Returns whether this component is dynamic and thus can only be attached to dynamic game objects.
 
virtual plWorldModuleTypeId GetTypeId () const =0
 
virtual plComponentMode::Enum GetMode () const =0
 
virtual void Initialize ()
 Can be overridden for basic initialization that depends on a valid hierarchy and position.
 
virtual void Deinitialize ()
 This method is called before the component is destroyed. A derived type can override this method to do common de-initialization work.
 
void EnableUnhandledMessageHandler (bool enable)
 By default disabled. Enable to have OnUnhandledMessage() called for every unhandled message.
 
virtual bool OnUnhandledMessage (plMessage &msg, bool bWasPostedMsg)
 When EnableUnhandledMessageHandler() was activated, this is called for all messages for which there is no dedicated message handler.
 
virtual bool OnUnhandledMessage (plMessage &msg, bool bWasPostedMsg) const
 When EnableUnhandledMessageHandler() was activated, this is called for all messages for which there is no dedicated message handler.
 
bool IsInitialized () const
 
bool IsInitializing () const
 
bool IsSimulationStarted () const
 

Protected Attributes

GroundState m_LastGroundState = GroundState::InAir
 
plUInt8 m_uiInputJumpBit: 1
 
plUInt8 m_uiInputCrouchBit: 1
 
plUInt8 m_uiInputRunBit: 1
 
plUInt8 m_uiIsCrouchingBit: 1
 
plAngle m_InputRotateZ
 
plVec2 m_vInputDirection = plVec2::MakeZero()
 
float m_fVelocityUp = 0.0f
 
float m_fNextCylinderHeight = 0
 
float m_fAccumulatedWalkDistance = 0.0f
 
plVec2 m_vVelocityLateral = plVec2::MakeZero()
 
plTransform m_PreviousTransform
 
bool m_bFeetOnSolidGround = false
 
float m_fCurrentCylinderHeight = 0
 
float m_fHeadHeightOffset = 0.0f
 
float m_fHeadTargetHeight = 0.0f
 
plGameObjectHandle m_hHeadObject
 
plVec3 m_vAbsoluteRootMotion = plVec3::MakeZero()
 
plUInt32 m_uiUserDataIndex = plInvalidIndex
 
plUInt32 m_uiJoltBodyID = plInvalidIndex
 
- Protected Attributes inherited from plComponent
const plRTTIm_pMessageDispatchType = nullptr
 Messages will be dispatched to this type. Default is what GetDynamicRTTI() returns, can be redirected if necessary.
 

Additional Inherited Members

- Static Public Member Functions inherited from plNoBase
static const plRTTIGetStaticRTTI ()
 

Detailed Description

An example character controller (CC) implementation build upon plJoltCharacterControllerComponent.

This component implements typical behavior for an FPS type of game. It is mainly meant as an example, as most games would rather implement their own CC to control the exact details.

It is also possible to derive from this component and override some virtual functions to just tweak the behavior of this sample implementation, in case you only need minor tweaks.

Member Enumeration Documentation

◆ GroundState

enum class plJoltDefaultCharacterComponent::GroundState : plUInt8
strong
Enumerator
OnGround 

Character is touching the ground.

Sliding 

Character is touching a steep surface and therefore slides downwards.

InAir 

Character isn't touching any ground surface (may still touch a wall or ceiling)

Member Function Documentation

◆ DeserializeComponent()

void plJoltDefaultCharacterComponent::DeserializeComponent ( plWorldReader & inout_stream)
overridevirtual

Override this to load the current state of the component from the given stream.

The active state will be automatically serialized. The 'initialized' state is not serialized, all components will be initialized after creation, even if they were already in an initialized state when they were serialized.

Reimplemented from plJoltCharacterControllerComponent.

◆ GetShapeRadius()

float plJoltDefaultCharacterComponent::GetShapeRadius ( ) const
overridevirtual

Returns the radius of the shape. This never changes at runtime.

Implements plJoltCharacterControllerComponent.

◆ IsCrouching()

virtual bool plJoltDefaultCharacterComponent::IsCrouching ( )
inlineoverridevirtual

Checks whether the CC is currently in the crouch state.

Reimplemented from plJoltCharacterControllerComponent.

◆ IsTouchingGround()

virtual bool plJoltDefaultCharacterComponent::IsTouchingGround ( )
inlineoverridevirtual

Checks whether the CC is currently touching the ground.

Reimplemented from plJoltCharacterControllerComponent.

◆ MakeNextCharacterShape()

JPH::Ref< JPH::Shape > plJoltDefaultCharacterComponent::MakeNextCharacterShape ( )
overrideprotectedvirtual

Creates a new shape with the given height (and fixed radius)

Implements plJoltCharacterControllerComponent.

◆ OnActivated()

void plJoltDefaultCharacterComponent::OnActivated ( )
overrideprotectedvirtual

This method is called when the component gets activated.

By default a component is active, but it can be created in an inactive state. In such a case OnActivated() is only called once a component is activated. If a component gets switched between active and inactive at runtime, OnActivated() and OnDeactivated() are called accordingly. In contrast Initialize() and Deinitialize() are only ever called once.

See also
OnActivated(), OnDeactivated(), Initialize(), Deinitialize(), OnSimulationStarted()

Reimplemented from plComponent.

◆ OnDeactivated()

void plJoltDefaultCharacterComponent::OnDeactivated ( )
overrideprotectedvirtual

This method is called when the component gets deactivated.

Upon destruction, a component that is active first gets deactivated. Therefore OnDeactivated() should be used for typical game code cleanup.

See also
OnActivated(), OnDeactivated(), Initialize(), Deinitialize(), OnSimulationStarted()

Reimplemented from plJoltCharacterControllerComponent.

◆ OnSimulationStarted()

void plJoltDefaultCharacterComponent::OnSimulationStarted ( )
overrideprotectedvirtual

This method is called once for active components, at the start of the next world update, but only when the world is simulated.

This is the one preferred method to setup typical game logic. In a pure game environment there is no practical difference between OnActivated() and OnSimulationStarted(), as OnSimulationStarted() will be called right after OnActivated().

However, when a scene is open inside the editor, there is an important difference: OnActivated() is called once the component was created. OnSimulationStarted() is only called once the game simulation is started inside the editor. As an example, if a component starts a sound in OnActivated(), that sound will play right after the scene has been loaded into the editor. If instead the sound gets started in OnSimulationStarted(), it will only play once the user starts the game mode inside the editor.

Additionally, OnSimulationStarted() is only ever executed once on a component, even if the plWorld pauses and resumes world simulation multiple times. Thus components that should only execute a thing exactly once, will work correctly. In contrast OnActivated() and OnDeactivated() will be executed every time the component's active state is toggled, which could re-execute the same behavior multiple times.

See also
OnActivated(), OnDeactivated(), Initialize(), Deinitialize(), OnSimulationStarted()

Reimplemented from plJoltCharacterControllerComponent.

◆ SerializeComponent()

void plJoltDefaultCharacterComponent::SerializeComponent ( plWorldWriter & inout_stream) const
overridevirtual

Override this to save the current state of the component to the given stream.

Reimplemented from plJoltCharacterControllerComponent.

◆ TeleportCharacter()

void plJoltDefaultCharacterComponent::TeleportCharacter ( const plVec3 & vGlobalFootPosition)
overridevirtual

Instantly teleports the character to the target position. Doesn't change its rotation.

Reimplemented from plJoltCharacterControllerComponent.

◆ UpdateCharacter()

void plJoltDefaultCharacterComponent::UpdateCharacter ( )
overrideprotectedvirtual

Called up to once per frame, but potentially less often, if physics updates were skipped due to high framerates.

All shape modifications and moves should only be executed during this step. The given deltaTime should be used, rather than the world's time diff.

Implements plJoltCharacterControllerComponent.


The documentation for this class was generated from the following files: