Files
CosmicEngine/lib/All/JoltPhysics/Samples/Tests/Character/CharacterBaseTest.h

146 lines
4.8 KiB
C++

// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
// SPDX-License-Identifier: MIT
#pragma once
#include <Tests/Test.h>
#include <Jolt/Physics/Character/Character.h>
#include <Jolt/Physics/Character/CharacterVirtual.h>
// Base class for the character tests, initializes the test scene.
class CharacterBaseTest : public Test
{
public:
JPH_DECLARE_RTTI_VIRTUAL(JPH_NO_EXPORT, CharacterBaseTest)
// Destructor
virtual ~CharacterBaseTest() override;
// Number used to scale the terrain and camera movement to the scene
virtual float GetWorldScale() const override { return 0.2f; }
// Initialize the test
virtual void Initialize() override;
// Process input
virtual void ProcessInput(const ProcessInputParams &inParams) override;
// Update the test, called before the physics update
virtual void PrePhysicsUpdate(const PreUpdateParams &inParams) override;
// Override to specify the initial camera state (local to GetCameraPivot)
virtual void GetInitialCamera(CameraState &ioState) const override;
// Override to specify a camera pivot point and orientation (world space)
virtual RMat44 GetCameraPivot(float inCameraHeading, float inCameraPitch) const override;
// Optional settings menu
virtual bool HasSettingsMenu() const override { return true; }
virtual void CreateSettingsMenu(DebugUI *inUI, UIElement *inSubMenu) override;
// Saving / restoring state for replay
virtual void SaveState(StateRecorder &inStream) const override;
virtual void RestoreState(StateRecorder &inStream) override;
// Saving / restoring controller input state for replay
virtual void SaveInputState(StateRecorder &inStream) const override;
virtual void RestoreInputState(StateRecorder &inStream) override;
protected:
// Get position of the character
virtual RVec3 GetCharacterPosition() const = 0;
// Handle user input to the character
virtual void HandleInput(Vec3Arg inMovementDirection, bool inJump, bool inSwitchStance, float inDeltaTime) = 0;
// Draw the character state
void DrawCharacterState(const CharacterBase *inCharacter, RMat44Arg inCharacterTransform, Vec3Arg inCharacterVelocity);
// Add character movement settings
virtual void AddCharacterMovementSettings(DebugUI* inUI, UIElement* inSubMenu) { /* Nothing by default */ }
// Add test configuration settings
virtual void AddConfigurationSettings(DebugUI *inUI, UIElement *inSubMenu) { /* Nothing by default */ }
// Draw the character + padding
void DrawPaddedCharacter(const Shape *inShape, float inPadding, RMat44Arg inCenterOfMass);
// Character size
static constexpr float cCharacterHeightStanding = 1.35f;
static constexpr float cCharacterRadiusStanding = 0.3f;
static constexpr float cCharacterHeightCrouching = 0.8f;
static constexpr float cCharacterRadiusCrouching = 0.3f;
static constexpr float cInnerShapeFraction = 0.9f;
// Character movement properties
inline static bool sControlMovementDuringJump = true; ///< If false the character cannot change movement direction in mid air
inline static float sCharacterSpeed = 6.0f;
inline static float sJumpSpeed = 4.0f;
// The different stances for the character
RefConst<Shape> mStandingShape;
RefConst<Shape> mCrouchingShape;
RefConst<Shape> mInnerCrouchingShape;
RefConst<Shape> mInnerStandingShape;
// List of boxes on ramp
Array<BodyID> mRampBlocks;
float mRampBlocksTimeLeft = 0.0f;
// Conveyor belt body
BodyID mConveyorBeltBody;
// Sensor body
BodyID mSensorBody;
// List of active characters in the scene so they can collide
CharacterVsCharacterCollisionSimple mCharacterVsCharacterCollision;
// Shape types
enum class EType
{
Capsule,
Cylinder,
Box,
Compound
};
// Character shape type
static inline EType sShapeType = EType::Capsule;
private:
// List of possible scene names
static const char * sScenes[];
// Filename of animation to load for this test
static const char * sSceneName;
// Scene time (for moving bodies)
float mTime = 0.0f;
// The camera pivot, recorded before the physics update to align with the drawn world
RVec3 mCameraPivot = RVec3::sZero();
// Moving bodies
BodyID mRotatingBody;
BodyID mRotatingWallBody;
BodyID mRotatingAndTranslatingBody;
BodyID mSmoothVerticallyMovingBody;
BodyID mReversingVerticallyMovingBody;
float mReversingVerticallyMovingVelocity = 1.0f;
BodyID mHorizontallyMovingBody;
// Moving characters
Ref<Character> mAnimatedCharacter;
Ref<CharacterVirtual> mAnimatedCharacterVirtual;
Ref<CharacterVirtual> mAnimatedCharacterVirtualWithInnerBody;
// Player input
Vec3 mControlInput = Vec3::sZero();
bool mJump = false;
bool mWasJump = false;
bool mSwitchStance = false;
bool mWasSwitchStance = false;
};