/* * 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. * */ #ifdef AZ_TESTS_ENABLED #include "PhysicsTests.h" #include #include #include #include #include #include namespace Physics { ErrorHandler::ErrorHandler(const char* errorPattern) : m_errorCount(0) , m_warningCount(0) , m_errorPattern(errorPattern) { AZ::Debug::TraceMessageBus::Handler::BusConnect(); } ErrorHandler::~ErrorHandler() { AZ::Debug::TraceMessageBus::Handler::BusDisconnect(); } int ErrorHandler::GetErrorCount() const { return m_errorCount; } int ErrorHandler::GetWarningCount() const { return m_warningCount; } bool ErrorHandler::SuppressExpectedErrors(const char* window, const char* message) { return AZStd::string(message).find(m_errorPattern) != AZStd::string::npos; } bool ErrorHandler::OnPreError(const char* window, const char* fileName, int line, const char* func, const char* message) { m_errorCount++; return SuppressExpectedErrors(window, message); } bool ErrorHandler::OnPreWarning(const char* window, const char* fileName, int line, const char* func, const char* message) { m_warningCount++; return SuppressExpectedErrors(window, message); } bool ErrorHandler::OnPrintf(const char* window, const char* message) { return SuppressExpectedErrors(window, message); } // helper functions AZStd::shared_ptr GenericPhysicsFixture::CreateTestWorld() { AZStd::shared_ptr world; WorldConfiguration worldConfiguration; worldConfiguration.m_gravity = AZ::Vector3(0.0f, 0.0f, -10.0f); SystemRequestBus::BroadcastResult(world, &SystemRequests::CreateWorldCustom, AZ_CRC("testWorld"), worldConfiguration); return world; } AZStd::shared_ptr AddStaticFloorToWorld(World* world, const AZ::Transform& transform) { WorldBodyConfiguration rigidBodySettings; AZStd::shared_ptr floor; SystemRequestBus::BroadcastResult(floor, &SystemRequests::CreateStaticRigidBody, rigidBodySettings); Physics::ColliderConfiguration colliderConfig; Physics::BoxShapeConfiguration shapeConfiguration(AZ::Vector3(20.0f, 20.0f, 1.0f)); AZStd::shared_ptr shape; SystemRequestBus::BroadcastResult(shape, &SystemRequests::CreateShape, colliderConfig, shapeConfiguration); floor->AddShape(shape); world->AddBody(*floor); floor->SetTransform(transform); return floor; } AZStd::shared_ptr AddStaticUnitBoxToWorld(World* world, const AZ::Vector3& position) { WorldBodyConfiguration rigidBodySettings; rigidBodySettings.m_position = position; AZStd::shared_ptr box; SystemRequestBus::BroadcastResult(box, &SystemRequests::CreateStaticRigidBody, rigidBodySettings); Physics::ColliderConfiguration colliderConfig; Physics::BoxShapeConfiguration shapeConfiguration; AZStd::shared_ptr shape; SystemRequestBus::BroadcastResult(shape, &SystemRequests::CreateShape, colliderConfig, shapeConfiguration); box->AddShape(shape); world->AddBody(*box); return box; } AZStd::shared_ptr AddUnitBoxToWorld(World* world, const AZ::Vector3& position) { RigidBodyConfiguration rigidBodySettings; rigidBodySettings.m_linearDamping = 0.0f; AZStd::shared_ptr box; SystemRequestBus::BroadcastResult(box, &SystemRequests::CreateRigidBody, rigidBodySettings); Physics::ColliderConfiguration colliderConfig; Physics::BoxShapeConfiguration shapeConfiguration; AZStd::shared_ptr shape; SystemRequestBus::BroadcastResult(shape, &SystemRequests::CreateShape, colliderConfig, shapeConfiguration); box->AddShape(shape); world->AddBody(*box.get()); box->SetTransform(AZ::Transform::CreateTranslation(position)); return box; } AZStd::shared_ptr AddSphereToWorld(World* world, const AZ::Vector3& position) { RigidBodyConfiguration rigidBodySettings; rigidBodySettings.m_linearDamping = 0.0f; AZStd::shared_ptr sphere; SystemRequestBus::BroadcastResult(sphere, &SystemRequests::CreateRigidBody, rigidBodySettings); Physics::ColliderConfiguration colliderConfig; Physics::SphereShapeConfiguration shapeConfiguration; AZStd::shared_ptr shape; SystemRequestBus::BroadcastResult(shape, &SystemRequests::CreateShape, colliderConfig, shapeConfiguration); sphere->AddShape(shape); world->AddBody(*sphere.get()); sphere->SetTransform(AZ::Transform::CreateTranslation(position)); return sphere; } AZStd::shared_ptr AddCapsuleToWorld(World* world, const AZ::Vector3& position) { RigidBodyConfiguration rigidBodySettings; AZStd::shared_ptr capsule = nullptr; SystemRequestBus::BroadcastResult(capsule, &SystemRequests::CreateRigidBody, rigidBodySettings); Physics::ColliderConfiguration colliderConfig; colliderConfig.m_rotation = AZ::Quaternion::CreateRotationX(AZ::Constants::HalfPi); Physics::CapsuleShapeConfiguration shapeConfig(2.0f, 0.5f); AZStd::shared_ptr shape; SystemRequestBus::BroadcastResult(shape, &SystemRequests::CreateShape, colliderConfig, shapeConfig); capsule->AddShape(shape); world->AddBody(*capsule.get()); capsule->SetTransform(AZ::Transform::CreateTranslation(position)); return capsule; } void UpdateWorld(World* world, float timeStep, AZ::u32 numSteps) { for (AZ::u32 i = 0; i < numSteps; i++) { world->Update(timeStep); } } void UpdateWorldSplitSim(World* world, float timeStep, AZ::u32 numSteps) { for (AZ::u32 i = 0; i < numSteps; i++) { world->StartSimulation(timeStep); world->FinishSimulation(); } } void UpdateDefaultWorld(AZ::u32 numSteps, float timeStep) { AZStd::shared_ptr defaultWorld; DefaultWorldBus::BroadcastResult(defaultWorld, &DefaultWorldRequests::GetDefaultWorld); for (AZ::u32 i = 0; i < numSteps; i++) { defaultWorld->Update(timeStep); } } float GetPositionElement(AZ::Entity* entity, int element) { AZ::Transform transform = AZ::Transform::CreateIdentity(); AZ::TransformBus::EventResult(transform, entity->GetId(), &AZ::TransformInterface::GetWorldTM); return transform.GetPosition().GetElement(element); } } // namespace Physics #endif // AZ_TESTS_ENABLED