142 lines
4.8 KiB
C
142 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 <Jolt/Physics/PhysicsSystem.h>
|
||
|
|
#include <Renderer/Renderer.h>
|
||
|
|
#include <Input/Keyboard.h>
|
||
|
|
#include <Jolt/Skeleton/SkeletonPose.h>
|
||
|
|
#include <Jolt/Core/RTTI.h>
|
||
|
|
|
||
|
|
class DebugUI;
|
||
|
|
class UIElement;
|
||
|
|
namespace JPH {
|
||
|
|
class StateRecorder;
|
||
|
|
class JobSystem;
|
||
|
|
class ContactListener;
|
||
|
|
class DebugRenderer;
|
||
|
|
}
|
||
|
|
|
||
|
|
class Test
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
JPH_DECLARE_RTTI_VIRTUAL_BASE(JPH_NO_EXPORT, Test)
|
||
|
|
|
||
|
|
// Destructor
|
||
|
|
virtual ~Test() = default;
|
||
|
|
|
||
|
|
// Set the physics system
|
||
|
|
virtual void SetPhysicsSystem(PhysicsSystem *inPhysicsSystem) { mPhysicsSystem = inPhysicsSystem; mBodyInterface = &inPhysicsSystem->GetBodyInterface(); }
|
||
|
|
|
||
|
|
// Set the job system
|
||
|
|
void SetJobSystem(JobSystem *inJobSystem) { mJobSystem = inJobSystem; }
|
||
|
|
|
||
|
|
// Set the debug renderer
|
||
|
|
void SetDebugRenderer(DebugRenderer *inDebugRenderer) { mDebugRenderer = inDebugRenderer; }
|
||
|
|
|
||
|
|
// Set the temp allocator
|
||
|
|
void SetTempAllocator(TempAllocator *inTempAllocator) { mTempAllocator = inTempAllocator; }
|
||
|
|
|
||
|
|
// Description of the test
|
||
|
|
virtual const char *GetDescription() const { return nullptr; }
|
||
|
|
|
||
|
|
// Initialize the test
|
||
|
|
virtual void Initialize() { }
|
||
|
|
|
||
|
|
// Number used to scale the terrain and camera movement to the scene
|
||
|
|
virtual float GetWorldScale() const { return 1.0f; }
|
||
|
|
|
||
|
|
// If this test implements a contact listener, it should be returned here
|
||
|
|
virtual ContactListener *GetContactListener() { return nullptr; }
|
||
|
|
|
||
|
|
class ProcessInputParams
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
float mDeltaTime;
|
||
|
|
Keyboard * mKeyboard;
|
||
|
|
CameraState mCameraState;
|
||
|
|
};
|
||
|
|
|
||
|
|
// Process input, this is called before SaveInputState is called. This allows you to determine the player input and adjust internal state accordingly.
|
||
|
|
// This state should not be applied until PrePhysicsUpdate because on replay you will receive a call to RestoreInputState to restore the stored player input state before receiving another PrePhysicsUpdate.
|
||
|
|
virtual void ProcessInput(const ProcessInputParams &inParams) { }
|
||
|
|
|
||
|
|
class PreUpdateParams
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
float mDeltaTime;
|
||
|
|
CameraState mCameraState;
|
||
|
|
#ifdef JPH_DEBUG_RENDERER
|
||
|
|
const SkeletonPose::DrawSettings * mPoseDrawSettings;
|
||
|
|
#endif // JPH_DEBUG_RENDERER
|
||
|
|
};
|
||
|
|
|
||
|
|
// Update the test, called before the physics update
|
||
|
|
virtual void PrePhysicsUpdate(const PreUpdateParams &inParams) { }
|
||
|
|
|
||
|
|
// Update the test, called after the physics update
|
||
|
|
virtual void PostPhysicsUpdate(float inDeltaTime) { }
|
||
|
|
|
||
|
|
// Override to specify the initial camera state (local to GetCameraPivot)
|
||
|
|
virtual void GetInitialCamera(CameraState &ioState) const { }
|
||
|
|
|
||
|
|
// Override to specify a camera pivot point and orientation (world space)
|
||
|
|
virtual RMat44 GetCameraPivot(float inCameraHeading, float inCameraPitch) const { return RMat44::sIdentity(); }
|
||
|
|
|
||
|
|
// Offset around which to center drawing. This floating point accuracy issues when the camera is far from the origin.
|
||
|
|
virtual RVec3 GetDrawOffset() const { return RVec3::sZero(); }
|
||
|
|
|
||
|
|
// Optional settings menu
|
||
|
|
virtual bool HasSettingsMenu() const { return false; }
|
||
|
|
virtual void CreateSettingsMenu(DebugUI *inUI, UIElement *inSubMenu) { }
|
||
|
|
|
||
|
|
// Force the application to restart the test
|
||
|
|
void RestartTest() { mNeedsRestart = true; }
|
||
|
|
bool NeedsRestart() const { return mNeedsRestart; }
|
||
|
|
|
||
|
|
// If this test is supposed to be deterministic
|
||
|
|
virtual bool IsDeterministic() const { return true; }
|
||
|
|
|
||
|
|
// Saving / restoring state for replay
|
||
|
|
virtual void SaveState(StateRecorder &inStream) const { }
|
||
|
|
virtual void RestoreState(StateRecorder &inStream) { }
|
||
|
|
|
||
|
|
// Saving / restoring controller input state for replay
|
||
|
|
virtual void SaveInputState(StateRecorder &inStream) const { }
|
||
|
|
virtual void RestoreInputState(StateRecorder &inStream) { }
|
||
|
|
|
||
|
|
// Return a string that is displayed in the top left corner of the screen
|
||
|
|
virtual String GetStatusString() const { return String(); }
|
||
|
|
|
||
|
|
// Draw the body labels
|
||
|
|
void DrawBodyLabels();
|
||
|
|
|
||
|
|
protected:
|
||
|
|
// Utility function to create a static floor body
|
||
|
|
Body & CreateFloor(float inSize = 200.0f);
|
||
|
|
|
||
|
|
// Utility function to create a floor consisting of very large triangles
|
||
|
|
Body & CreateLargeTriangleFloor();
|
||
|
|
|
||
|
|
// Create an uneven terrain floor body
|
||
|
|
Body & CreateMeshTerrain();
|
||
|
|
Body & CreateHeightFieldTerrain();
|
||
|
|
|
||
|
|
// Add a label to a body
|
||
|
|
void SetBodyLabel(const BodyID &inBodyID, const String &inLabel) { mBodyLabels[inBodyID] = inLabel; }
|
||
|
|
|
||
|
|
JobSystem * mJobSystem = nullptr;
|
||
|
|
PhysicsSystem * mPhysicsSystem = nullptr;
|
||
|
|
BodyInterface * mBodyInterface = nullptr;
|
||
|
|
DebugRenderer * mDebugRenderer = nullptr;
|
||
|
|
TempAllocator * mTempAllocator = nullptr;
|
||
|
|
|
||
|
|
private:
|
||
|
|
bool mNeedsRestart = false;
|
||
|
|
|
||
|
|
using BodyLabels = unordered_map<BodyID, String>;
|
||
|
|
BodyLabels mBodyLabels;
|
||
|
|
};
|