Files
o3de/Gems/PhysX/Code/Tests/PhysXTestUtil.h
T
2021-04-07 14:03:29 -07:00

114 lines
5.5 KiB
C++

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#pragma once
#include "AzCore/Component/Component.h"
#include <AzFramework/Physics/Collision/CollisionEvents.h>
#include <AzFramework/Physics/Common/PhysicsSimulatedBodyEvents.h>
#include <AzFramework/Terrain/TerrainDataRequestBus.h>
namespace PhysX
{
//! CollisionCallbacksListener listens to collision events for a particular sceneHandle and simulatedBodyHandle
class CollisionCallbacksListener
{
public:
explicit CollisionCallbacksListener(AZ::EntityId entityId);
CollisionCallbacksListener(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle);
~CollisionCallbacksListener();
AZStd::vector<AzPhysics::CollisionEvent> m_beginCollisions;
AZStd::vector<AzPhysics::CollisionEvent> m_persistCollisions;
AZStd::vector<AzPhysics::CollisionEvent> m_endCollisions;
AZStd::function<void(const AzPhysics::CollisionEvent& collisionEvent)> m_onCollisionBegin;
AZStd::function<void(const AzPhysics::CollisionEvent& collisionEvent)> m_onCollisionPersist;
AZStd::function<void(const AzPhysics::CollisionEvent& collisionEvent)> m_onCollisionEnd;
private:
void InitCollisionHandlers();
AzPhysics::SimulatedBodyEvents::OnCollisionBegin::Handler m_onCollisionBeginHandler;
AzPhysics::SimulatedBodyEvents::OnCollisionPersist::Handler m_onCollisionPersistHandler;
AzPhysics::SimulatedBodyEvents::OnCollisionEnd::Handler m_onCollisionEndHandler;
};
//! TestTriggerAreaNotificationListener listens to trigger events for a particular sceneHandle and simulatedBodyHandle
class TestTriggerAreaNotificationListener
{
public:
explicit TestTriggerAreaNotificationListener(AZ::EntityId entityId);
TestTriggerAreaNotificationListener(AzPhysics::SceneHandle sceneHandle, AzPhysics::SimulatedBodyHandle bodyHandle);
~TestTriggerAreaNotificationListener();
const AZStd::vector<AzPhysics::TriggerEvent>& GetEnteredEvents() const { return m_enteredEvents; }
const AZStd::vector<AzPhysics::TriggerEvent>& GetExitedEvents() const { return m_exitedEvents; }
AZStd::function<void(const AzPhysics::TriggerEvent& event)> m_onTriggerEnter;
AZStd::function<void(const AzPhysics::TriggerEvent& event)> m_onTriggerExit;
private:
void InitTriggerHandlers();
AZStd::vector<AzPhysics::TriggerEvent> m_enteredEvents;
AZStd::vector<AzPhysics::TriggerEvent> m_exitedEvents;
AzPhysics::SimulatedBodyEvents::OnTriggerEnter::Handler m_onTriggerEnterHandler;
AzPhysics::SimulatedBodyEvents::OnTriggerExit::Handler m_onTriggerExitHandler;
};
//! Dummy component emulating presence of terrain by connecting to TerrainDataRequestBus
//! PhysX Terrain Component skips activation if there's no terrain present,
//! so in order to test it we also add the DummyTestTerrainComponent.
class DummyTestTerrainComponent
: public AZ::Component
, private AzFramework::Terrain::TerrainDataRequestBus::Handler
{
public:
AZ_COMPONENT(DummyTestTerrainComponent, "{EE4ECA23-9C27-4D5D-9C6F-271A19C0333E}");
static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
{
provided.push_back(AZ_CRC_CE("TerrainService"));
}
private:
////////////////////////////////////////////////////////////////////////
// AZ::Component interface implementation
void Activate() override
{
AzFramework::Terrain::TerrainDataRequestBus::Handler::BusConnect();
}
void Deactivate() override
{
AzFramework::Terrain::TerrainDataRequestBus::Handler::BusDisconnect();
}
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
// TerrainDataRequestBus interface dummy implementation
AZ::Vector2 GetTerrainGridResolution() const override { return {}; }
AZ::Aabb GetTerrainAabb() const override { return {}; }
float GetHeight(AZ::Vector3, Sampler, bool*) const override { return {}; }
float GetHeightFromFloats(float, float, Sampler, bool*) const override { return {}; }
AzFramework::SurfaceData::SurfaceTagWeight GetMaxSurfaceWeight(AZ::Vector3, Sampler, bool*) const override { return {}; }
AzFramework::SurfaceData::SurfaceTagWeight GetMaxSurfaceWeightFromFloats(float, float, Sampler, bool*) const override { return {}; }
const char* GetMaxSurfaceName(AZ::Vector3, Sampler, bool*) const override { return {}; }
bool GetIsHoleFromFloats(float, float, Sampler) const override { return {}; }
AZ::Vector3 GetNormal(AZ::Vector3, Sampler, bool*) const override { return {}; }
AZ::Vector3 GetNormalFromFloats(float, float, Sampler, bool*) const override { return {}; }
////////////////////////////////////////////////////////////////////////
};
} // namespace PhysX