/* * 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 * */ #include #include #include #include #include #include #include #include #include #include #include namespace UnitTest { ActorHelper::ActorHelper(const char* name) : EMotionFX::Actor(name) { } size_t ActorHelper::AddJoint( const AZStd::string& name, const AZ::Transform& localTransform, const AZStd::string& parentName) { EMotionFX::Node* parentNode = GetSkeleton()->FindNodeByNameNoCase(parentName.c_str()); auto node = AddNode( GetNumNodes(), name.c_str(), (parentNode) ? parentNode->GetNodeIndex() : InvalidIndex); GetBindPose()->SetLocalSpaceTransform(node->GetNodeIndex(), localTransform); return node->GetNodeIndex(); } void ActorHelper::AddClothCollider(const Physics::CharacterColliderNodeConfiguration& colliderNode) { GetPhysicsSetup()->GetConfig().m_clothConfig.m_nodes.push_back(colliderNode); } void ActorHelper::FinishSetup() { SetID(0); GetSkeleton()->UpdateNodeIndexValues(0); ResizeTransformData(); PostCreateInit(); } AZ::Data::Asset CreateAssetFromActor( AZStd::unique_ptr actor) { AZ::Data::AssetId assetId(AZ::Uuid::CreateRandom()); AZ::Data::Asset actorAsset = AZ::Data::AssetManager::Instance().CreateAsset(assetId); actorAsset.GetAs()->SetData(AZStd::move(actor)); return actorAsset; } Physics::CharacterColliderNodeConfiguration CreateSphereCollider( const AZStd::string& jointName, float radius, const AZ::Transform& offset) { auto colliderConf = AZStd::make_shared(); colliderConf->m_position = offset.GetTranslation(); colliderConf->m_rotation = offset.GetRotation(); auto shapeConf = AZStd::make_shared(radius); Physics::CharacterColliderNodeConfiguration collider; collider.m_name = jointName; collider.m_shapes.emplace_back(colliderConf, shapeConf); return collider; } Physics::CharacterColliderNodeConfiguration CreateCapsuleCollider( const AZStd::string& jointName, float height, float radius, const AZ::Transform& offset) { auto colliderConf = AZStd::make_shared(); colliderConf->m_position = offset.GetTranslation(); colliderConf->m_rotation = offset.GetRotation(); auto shapeConf = AZStd::make_shared(height, radius); Physics::CharacterColliderNodeConfiguration collider; collider.m_name = jointName; collider.m_shapes.emplace_back(colliderConf, shapeConf); return collider; } Physics::CharacterColliderNodeConfiguration CreateBoxCollider( const AZStd::string& jointName, const AZ::Vector3& dimensions, const AZ::Transform& offset) { auto colliderConf = AZStd::make_shared(); colliderConf->m_position = offset.GetTranslation(); colliderConf->m_rotation = offset.GetRotation(); auto shapeConf = AZStd::make_shared(dimensions); Physics::CharacterColliderNodeConfiguration collider; collider.m_name = jointName; collider.m_shapes.emplace_back(colliderConf, shapeConf); return collider; } EMotionFX::Mesh* CreateEMotionFXMesh( const AZStd::vector& vertices, const AZStd::vector& indices, const AZStd::vector& skinningInfo, const AZStd::vector& uvs) { // Generate the normals for this mesh AZStd::vector particles(vertices.size()); AZStd::transform(vertices.begin(), vertices.end(), particles.begin(), [](const AZ::Vector3& vertex) { return AZ::Vector4::CreateFromVector3(vertex); } ); AZStd::vector normals; AZ::Interface::Get()->CalculateNormals( particles, indices, normals); return EMotionFX::MeshFactory::Create( indices, vertices, normals, uvs, skinningInfo ); } } // namespace UnitTest