// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "FbxInclude.h" /** Forward declarations */ namespace UE::Interchange::Private { class FPayloadContextBase; struct FFbxJointMeshBindPoseGenerator; } class UInterchangeBaseNodeContainer; class UInterchangeSceneNode; class UInterchangeSkeletalAnimationTrackNode; namespace UE { namespace Interchange { namespace Private { class FFbxParser; struct FMorphTargetAnimationBuildingData; class FFbxScene { public: explicit FFbxScene(FFbxParser& InParser) : Parser(InParser) {} void AddHierarchy(FbxScene* SDKScene, UInterchangeBaseNodeContainer& NodeContainer, TMap>& PayloadContexts); void AddAnimation(FbxScene* SDKScene, UInterchangeBaseNodeContainer& NodeContainer, TMap>& PayloadContexts); void AddMorphTargetAnimations(FbxScene* SDKScene, UInterchangeBaseNodeContainer& NodeContainer, TMap>& PayloadContexts, const TArray& MorphTargetAnimationsBuildingData); UInterchangeSceneNode* CreateTransformNode(UInterchangeBaseNodeContainer& NodeContainer, const FString& NodeName, const FString& NodeUID, const FString& ParentNodeUID); struct FRootJointInfo { bool bValidBindPose = false; }; protected: void CreateMeshNodeReference(UInterchangeSceneNode* UnrealSceneNode, FbxNodeAttribute* NodeAttribute, UInterchangeBaseNodeContainer& NodeContainer, const FTransform& GeometricTransform, const FTransform& PivotNodeTransform); void CreateCameraNodeReference(UInterchangeSceneNode* UnrealSceneNode, FbxNodeAttribute* NodeAttribute, UInterchangeBaseNodeContainer& NodeContainer); void CreateLightNodeReference(UInterchangeSceneNode* UnrealSceneNode, FbxNodeAttribute* NodeAttribute, UInterchangeBaseNodeContainer& NodeContainer); void AddHierarchyRecursively(UInterchangeSceneNode* UnrealParentNode , FbxNode* Node , FbxScene* SDKScene , UInterchangeBaseNodeContainer& NodeContainer , TMap>& PayloadContexts , TArray& ForceJointNodes , bool& bBadBindPoseMessageDisplay , FFbxJointMeshBindPoseGenerator& FbxJointMeshBindPoseGenerator); void AddAnimationRecursively(FbxNode* Node , FbxScene* SDKScene , UInterchangeBaseNodeContainer& NodeContainer , TMap>& PayloadContexts , UInterchangeSkeletalAnimationTrackNode* SkeletalAnimationTrackNode, bool SkeletalAnimationAddedToContainer , const FString& RootSceneNodeUid, const TSet& SkeletonRootNodeUids , const int32& AnimationIndex , TArray& ForceJointNodes); private: void AddRigidAnimation(FbxNode* Node , UInterchangeSceneNode* UnrealNode , UInterchangeBaseNodeContainer& NodeContainer , TMap>& PayloadContexts); FbxNode* Internal_GetRootSkeleton(FbxScene* SDKScene, FbxNode* Link); void FindCommonJointRootNode(FbxScene* SDKScene, const TArray& ForceJointNodes); void FindForceJointNode(FbxScene* SDKScene, TArray& ForceJointNodes); bool IsValidBindPose(FbxScene* SDKScene, FbxNode* RootJoint) const; TMap CommonJointRootNodes; FFbxParser& Parser; }; }//ns Private }//ns Interchange }//ns UE