You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Gems/PhysX/Code/Tests/PhysXTestCommon.h

142 lines
7.2 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
#include <AzCore/Asset/AssetCommon.h>
#include <AzCore/std/containers/vector.h>
#include <AzCore/std/smart_ptr/shared_ptr.h>
#include <AzCore/std/smart_ptr/make_shared.h>
#include <AzFramework/Physics/Material.h>
#include <AzFramework/Physics/Common/PhysicsTypes.h>
#include <PhysX/HeightFieldAsset.h>
#include <BoxColliderComponent.h>
#include <Configuration/PhysXSettingsRegistryManager.h>
namespace AzPhysics
{
struct RigidBody;
class Scene;
struct StaticRigidBody;
}
namespace PhysX
{
using EntityPtr = AZStd::shared_ptr<AZ::Entity>;
using PointList = AZStd::vector<AZ::Vector3>;
using VertexIndexData = AZStd::pair<PointList, AZStd::vector<AZ::u32>>;
namespace TestUtils
{
//Don't load the registry files from disk, just return defaults.
//save functions not overloaded as they don't do any saving
class Test_PhysXSettingsRegistryManager : public PhysXSettingsRegistryManager
{
public:
AZStd::optional<PhysXSystemConfiguration> LoadSystemConfiguration() const override;
AZStd::optional<AzPhysics::SceneConfiguration> LoadDefaultSceneConfiguration() const override;
AZStd::optional<Debug::DebugConfiguration> LoadDebugConfiguration() const override;
};
void ResetPhysXSystem();
// Updates the default world
void UpdateScene(AzPhysics::Scene* scene, float timeStep, AZ::u32 numSteps);
void UpdateScene(AzPhysics::SceneHandle sceneHandle, float timeStep, AZ::u32 numSteps);
// Create a flat "Terrain" for testing
EntityPtr CreateFlatTestTerrain(AzPhysics::SceneHandle sceneHandle, float width = 1.0f, float depth = 1.0f);
// Create spheres
EntityPtr CreateSphereEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position,
const float radius, const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default);
EntityPtr CreateSphereEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position,
const float radius, const AZStd::shared_ptr<Physics::ColliderConfiguration>& colliderConfig);
// Create static spheres
EntityPtr CreateStaticSphereEntity(AzPhysics::SceneHandle sceneHandle,
const AZ::Vector3& position,
const float radius,
const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default);
// Create dynamic boxes
EntityPtr CreateBoxEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, const AZ::Vector3& dimensions,
const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default, bool isTrigger = false);
EntityPtr CreateBoxEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, const AZ::Vector3& dimensions,
const AZStd::shared_ptr<Physics::ColliderConfiguration>& colliderConfig);
// Create static boxes
EntityPtr CreateStaticBoxEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position,
const AZ::Vector3& dimensions = AZ::Vector3(1.0f),
const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default);
// Create Capsules
EntityPtr CreateCapsuleEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position,
const float height, const float radius,
const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default);
// Create static Capsules
EntityPtr CreateStaticCapsuleEntity(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position,
const float height, const float radius,
const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default);
AzPhysics::SimulatedBodyHandle AddStaticTriangleMeshCubeToScene(AzPhysics::SceneHandle scene, float halfExtent);
AzPhysics::SimulatedBodyHandle AddKinematicTriangleMeshCubeToScene(AzPhysics::SceneHandle scene, float halfExtent, AzPhysics::MassComputeFlags massComputeFlags);
// Collision Filtering
void SetCollisionLayer(EntityPtr& entity, const AZStd::string& layerName, const AZStd::string& colliderTag = "");
void SetCollisionGroup(EntityPtr& entity, const AZStd::string& groupName, const AZStd::string& colliderTag = "");
void ToggleCollisionLayer(EntityPtr& entity, const AZStd::string& layerName, bool enabled, const AZStd::string& colliderTag = "");
// Generic creation functions
template<typename ColliderType = BoxColliderComponent>
EntityPtr AddUnitTestObject(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, const char* name = "TestObjectEntity");
template<typename ColliderType = BoxColliderComponent>
EntityPtr AddStaticUnitTestObject(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, const char* name = "TestObjectEntity");
template<typename ColliderT>
EntityPtr CreateTriggerAtPosition(const AZ::Vector3& position);
template<typename ColliderT>
EntityPtr CreateDynamicTriggerAtPosition(const AZ::Vector3& position);
// Misc
EntityPtr AddUnitTestBoxComponentsMix(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position, const char* name = "TestBoxEntity");
// Mesh data generation
PointList GeneratePyramidPoints(float length);
VertexIndexData GenerateCubeMeshData(float halfExtent);
AzPhysics::StaticRigidBody* AddStaticFloorToScene(AzPhysics::SceneHandle sceneHandle,
const AZ::Transform& transform = AZ::Transform::CreateIdentity());
AzPhysics::StaticRigidBody* AddStaticUnitBoxToScene(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position);
AzPhysics::RigidBody* AddUnitBoxToScene(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position);
AzPhysics::SimulatedBodyHandle AddSphereToScene(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position,
const float radius = 0.5f, const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default);
AzPhysics::SimulatedBodyHandle AddCapsuleToScene(AzPhysics::SceneHandle sceneHandle, const AZ::Vector3& position,
const float height = 2.0f, const float radius = 0.5f,
const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default);
AzPhysics::SimulatedBodyHandle AddBoxToScene(AzPhysics::SceneHandle sceneHandle,
const AZ::Vector3& position, const AZ::Vector3& dimensions = AZ::Vector3(1.0f),
const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default);
AzPhysics::SimulatedBodyHandle AddStaticBoxToScene(AzPhysics::SceneHandle sceneHandle,
const AZ::Vector3& position, const AZ::Vector3& dimensions = AZ::Vector3(1.0f),
const AzPhysics::CollisionLayer& layer = AzPhysics::CollisionLayer::Default);
float GetPositionElement(EntityPtr entity, int element);
} // namespace TestUtils
} // namespace PhysX
#include "PhysXTestCommon.inl"