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/EMotionFX/Code/Tests/SimulatedObjectPipelineTest...

96 lines
3.8 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
*
*/
#include <AzCore/std/smart_ptr/unique_ptr.h>
#include <AzCore/Memory/MemoryComponent.h>
#include <Tests/InitSceneAPIFixture.h>
#include <AzToolsFramework/UI/PropertyEditor/PropertyManagerComponent.h>
#include <SceneAPI/SceneCore/Mocks/Containers/MockScene.h>
#include <SceneAPI/SceneData/GraphData/BoneData.h>
#include <SceneAPI/SceneData/GraphData/MeshData.h>
#include <SceneAPI/SceneCore/Events/ProcessingResult.h>
#include <SceneAPI/SceneCore/Events/ExportEventContext.h>
#include <SceneAPI/SceneCore/Events/ExportProductList.h>
#include <MCore/Source/MemoryObject.h>
#include <EMotionFX/Pipeline/RCExt/Actor/ActorBuilder.h>
#include <EMotionFX/Pipeline/RCExt/Actor/ActorGroupExporter.h>
#include <EMotionFX/Pipeline/RCExt/ExportContexts.h>
#include <EMotionFX/Pipeline/SceneAPIExt/Groups/ActorGroup.h>
#include <EMotionFX/Pipeline/SceneAPIExt/Rules/SimulatedObjectSetupRule.h>
#include <EMotionFX/Source/Actor.h>
namespace EMotionFX
{
using ActorCanSaveSimulatedObjectSetupFixtureBase = InitSceneAPIFixture<
AZ::MemoryComponent,
AZ::AssetManagerComponent,
AZ::JobManagerComponent,
AZ::StreamerComponent,
AzToolsFramework::Components::PropertyManagerComponent,
EMotionFX::Integration::SystemComponent,
EMotionFX::Pipeline::ActorBuilder
>;
class ActorCanSaveSimulatedObjectSetupFixture
: public ActorCanSaveSimulatedObjectSetupFixtureBase
{
public:
void SetUp() override
{
ActorCanSaveSimulatedObjectSetupFixtureBase::SetUp();
// Set up the scene graph
m_scene = AZStd::make_unique<AZ::SceneAPI::Containers::MockScene>("MockScene");
m_scene->SetOriginalSceneOrientation(AZ::SceneAPI::Containers::Scene::SceneOrientation::ZUp);
AZ::SceneAPI::Containers::SceneGraph& graph = m_scene->GetGraph();
graph.AddChild(graph.GetRoot(), "testRootBone", AZStd::make_shared<AZ::SceneData::GraphData::BoneData>());
}
AZStd::unique_ptr<AZ::SceneAPI::Containers::Scene> m_scene{};
};
TEST_F(ActorCanSaveSimulatedObjectSetupFixture, Test)
{
EMotionFX::Pipeline::Group::ActorGroup actorGroup;
actorGroup.SetName("TestSimulatedObjectSaving");
actorGroup.SetSelectedRootBone("testRootBone");
auto simulatedObjectSetupRule = AZStd::make_shared<EMotionFX::Pipeline::Rule::SimulatedObjectSetupRule>();
auto simulatedObjectSetup = AZStd::make_shared<EMotionFX::SimulatedObjectSetup>();
simulatedObjectSetup->AddSimulatedObject("testSimulatedObject");
simulatedObjectSetupRule->SetData(simulatedObjectSetup);
actorGroup.GetRuleContainer().AddRule(simulatedObjectSetupRule);
AZ::SceneAPI::Events::ExportProductList products;
// Only run the Filling phase, to avoid any file writes
EMotionFX::Pipeline::ActorGroupExportContext actorGroupExportContext(
products,
*m_scene,
/*outputDirectory =*/"tmp",
actorGroup,
AZ::RC::Phase::Filling
);
EMotionFX::Pipeline::ActorGroupExporter exporter;
AZ::SceneAPI::Events::ProcessingResult result = exporter.ProcessContext(actorGroupExportContext);
ASSERT_EQ(result, AZ::SceneAPI::Events::ProcessingResult::Success) << "Failed to build actor";
Actor* actor = exporter.GetActor();
ASSERT_TRUE(actor);
ASSERT_TRUE(actor->GetSimulatedObjectSetup());
ASSERT_EQ(actor->GetSimulatedObjectSetup()->GetNumSimulatedObjects(), 1);
EXPECT_STREQ(actor->GetSimulatedObjectSetup()->GetSimulatedObject(0)->GetName().c_str(), "testSimulatedObject");
}
} // namespace EMotionFX