Plasma Engine  2.0
Loading...
Searching...
No Matches
plJoltCharacterControllerComponent Class Referenceabstract

Base class for character controllers (CC). More...

#include <JoltCharacterControllerComponent.h>

Inheritance diagram for plJoltCharacterControllerComponent:

Classes

struct  ContactPoint
 Describes a point where the CC collided with other geometry. More...
 

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.
 
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 void TeleportCharacter (const plVec3 &vGlobalFootPos) override
 Teleports the CC to the desired global position. Ignores obstacles on the path.
 
virtual bool IsDestinationUnobstructed (const plVec3 &vGlobalFootPos, float fCharacterHeight) override
 Checks whether the CC can be teleported to the target position without getting stuck.
 
virtual bool IsTouchingGround () override
 Checks whether the CC is currently touching the ground.
 
virtual bool IsCrouching () override
 Checks whether the CC is currently in the crouch state.
 
- 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

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 OnDeactivated () override
 This method is called when the component gets deactivated.
 
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.
 
virtual JPH::Ref< JPH::Shape > MakeNextCharacterShape ()=0
 Returns the shape that the character is supposed to use next.
 
virtual float GetShapeRadius () const =0
 Returns the radius of the shape. This never changes at runtime.
 
virtual void UpdateCharacter ()=0
 Called up to once per frame, but potentially less often, if physics updates were skipped due to high framerates.
 
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.
 
virtual void OnActivated ()
 This method is called when the component gets activated.
 
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
 

Friends

class plJoltWorldModule
 

Additional Inherited Members

- Static Public Member Functions inherited from plNoBase
static const plRTTIGetStaticRTTI ()
 
- 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.
 

Detailed Description

Base class for character controllers (CC).

This class provides general functionality for building a character controller. It tries not to implement things that are game specific. It is assumed that most games implement their own character controller to be able to build very specific behavior. The plJoltDefaultCharacterComponent is an example implementation that shows how this can be achieved on top of this class.

Member Function Documentation

◆ ClearObjectToIgnore()

void plJoltCharacterControllerComponent::ClearObjectToIgnore ( )

◆ CollectContacts()

void plJoltCharacterControllerComponent::CollectContacts ( plDynamicArray< ContactPoint > & out_Contacts,
const JPH::Shape * pShape,
const plVec3 & vQueryPosition,
const plQuat & qQueryRotation,
float fCollisionTolerance ) const
protected

Gathers all contact points of the shape at the target position.

Use fCollisionTolerance > 0 (e.g. 0.02f) to find contacts with walls/ground that the shape is touching but not penetrating.

◆ DeserializeComponent()

void plJoltCharacterControllerComponent::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 plCharacterControllerComponent.

Reimplemented in plJoltDefaultCharacterComponent.

◆ GetContactVelocityAndPushAway()

plVec3 plJoltCharacterControllerComponent::GetContactVelocityAndPushAway ( const ContactPoint & contact,
float fPushForce )
protected

Detects the velocity at the contact point. If it is a dynamic body, a force pushing it away is applied.

This is mainly used to get the velocity of the kinematic object that a character is standing on. It can then be incorporated into the movement, such that the character rides along. If the body at the contact point is dynamic, optionally a force can be applied, simulating that the character's weight pushes down on it.

◆ GetShapeRadius()

virtual float plJoltCharacterControllerComponent::GetShapeRadius ( ) const
protectedpure virtual

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

Implemented in plJoltDefaultCharacterComponent.

◆ IsCrouching()

virtual bool plJoltCharacterControllerComponent::IsCrouching ( )
inlineoverridevirtual

Checks whether the CC is currently in the crouch state.

Implements plCharacterControllerComponent.

Reimplemented in plJoltDefaultCharacterComponent.

◆ IsDestinationUnobstructed()

virtual bool plJoltCharacterControllerComponent::IsDestinationUnobstructed ( const plVec3 & vGlobalFootPos,
float fCharacterHeight )
inlineoverridevirtual

Checks whether the CC can be teleported to the target position without getting stuck.

This can be used to check before using TeleportCharacter(). It can also be used to check whether a character can stand up from a crouching position, by passing a non-zero character height.

If a character height of 0 is passed in, the current height is used.

Implements plCharacterControllerComponent.

◆ IsTouchingGround()

virtual bool plJoltCharacterControllerComponent::IsTouchingGround ( )
inlineoverridevirtual

Checks whether the CC is currently touching the ground.

Implements plCharacterControllerComponent.

Reimplemented in plJoltDefaultCharacterComponent.

◆ MakeNextCharacterShape()

virtual JPH::Ref< JPH::Shape > plJoltCharacterControllerComponent::MakeNextCharacterShape ( )
protectedpure virtual

Returns the shape that the character is supposed to use next.

The desired target state (radius, height, etc) has to be stored somewhere else (e.g. as members in derived classes). The shape can be cached. The shape may not get applied to the character, in case this is used by things like TryResize and the next shape is determined to not fit.

Implemented in plJoltDefaultCharacterComponent.

◆ MoveCharacter()

virtual void plJoltCharacterControllerComponent::MoveCharacter ( plMsgMoveCharacterController & msg)
inlineoverridevirtual

Instructs the CC to move in certain directions. An implementation can queue the request for later processing.

It can also add further functionality, such as adding gravity, stair stepping, etc.

Implements plCharacterControllerComponent.

◆ OnDeactivated()

void plJoltCharacterControllerComponent::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 plComponent.

Reimplemented in plJoltDefaultCharacterComponent.

◆ OnSimulationStarted()

void plJoltCharacterControllerComponent::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 plComponent.

Reimplemented in plJoltDefaultCharacterComponent.

◆ RawMove()

virtual void plJoltCharacterControllerComponent::RawMove ( const plVec3 & vMoveDeltaGlobal)
inlineoverridevirtual

Attempts to move the character into the given direction.

Implements the specific constraints, such as colliding with geometry and sliding along walls. Should NOT add further functionality, such as gravity. This function applies the result immediately and moves the owner object to the final location.

Implements plCharacterControllerComponent.

◆ SerializeComponent()

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

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

Reimplemented from plCharacterControllerComponent.

Reimplemented in plJoltDefaultCharacterComponent.

◆ SetObjectToIgnore()

void plJoltCharacterControllerComponent::SetObjectToIgnore ( plUInt32 uiObjectFilterID)

The CC will move through the given physics body.

Currently only one such object can be set. This is mainly used to ignore an object that the player is currently carrying, so that there are no unintended collisions.

Call ClearObjectToIgnore() to re-enable collisions.

◆ SpawnContactInteraction()

void plJoltCharacterControllerComponent::SpawnContactInteraction ( const ContactPoint & contact,
const plHashedString & sSurfaceInteraction,
plSurfaceResourceHandle hFallbackSurface,
const plVec3 & vInteractionNormal = plVec3(0, 0, 1) )
protected

Spawns a surface interaction prefab at the given contact point.

hFallbackSurface is used, if no other surface could be determined from the contact point.

◆ StickToGround()

bool plJoltCharacterControllerComponent::StickToGround ( float fMaxDist)
protected

If the CC is slightly above the ground, this will move it down so that it touches the ground.

If within the max distance no ground contact is found, the function does nothing and returns false.

◆ TeleportCharacter()

virtual void plJoltCharacterControllerComponent::TeleportCharacter ( const plVec3 & vGlobalFootPos)
inlineoverridevirtual

Teleports the CC to the desired global position. Ignores obstacles on the path.

Careful, the CC may get stuck in the new location, if it is inside static geometry. If it teleports into dynamic geometry, the result may also be undesirable.

Implements plCharacterControllerComponent.

Reimplemented in plJoltDefaultCharacterComponent.

◆ UpdateCharacter()

virtual void plJoltCharacterControllerComponent::UpdateCharacter ( )
protectedpure virtual

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.

Implemented in plJoltDefaultCharacterComponent.

Member Data Documentation

◆ m_uiCollisionLayer

plUInt8 plJoltCharacterControllerComponent::m_uiCollisionLayer = 0

The collision layer determines with which other actors this actor collides.

See also
plJoltActorComponent

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