// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "FbxInclude.h" namespace UE { namespace Interchange { namespace Private { struct FFbxConvert { public: ////////////////////////////////////////////////////////////////////////// /** Transform Conversion API Begin */ /* Return a FTransform float or double*/ template static TransformType ConvertTransform(const FbxAMatrix& Matrix) { TransformType Out; Out.SetTranslation(ConvertPos(Matrix.GetT())); Out.SetScale3D(ConvertScale(Matrix.GetS())); Out.SetRotation(ConvertRotToQuat(Matrix.GetQ())); return Out; } /* Return a FMatrix float or double*/ template static MatrixType ConvertMatrix(const FbxAMatrix& Matrix) { MatrixType UEMatrix; for (int i = 0; i < 4; ++i) { const FbxVector4 Row = Matrix.GetRow(i); if (i == 1) { UEMatrix.M[i][0] = -Row[0]; UEMatrix.M[i][1] = Row[1]; UEMatrix.M[i][2] = -Row[2]; UEMatrix.M[i][3] = -Row[3]; } else { UEMatrix.M[i][0] = Row[0]; UEMatrix.M[i][1] = -Row[1]; UEMatrix.M[i][2] = Row[2]; UEMatrix.M[i][3] = Row[3]; } } VerifyFiniteMatrix(UEMatrix); return UEMatrix; } /* Take a FMatrix float or double and return a fbx affine matrix*/ template static FbxAMatrix ConvertMatrix(const MatrixType& UEMatrix) { FbxAMatrix FbxMatrix; for (int i = 0; i < 4; ++i) { FbxVector4 Row; if (i == 1) { Row[0] = -UEMatrix.M[i][0]; Row[1] = UEMatrix.M[i][1]; Row[2] = -UEMatrix.M[i][2]; Row[3] = -UEMatrix.M[i][3]; } else { Row[0] = UEMatrix.M[i][0]; Row[1] = -UEMatrix.M[i][1]; Row[2] = UEMatrix.M[i][2]; Row[3] = UEMatrix.M[i][3]; } FbxMatrix.SetRow(i, Row); } return FbxMatrix; } /* Return a FQuat float or double */ template static QuatType ConvertRotToQuat(FbxQuaternion Quaternion) { QuatType UnrealQuat; UnrealQuat.X = Quaternion[0]; UnrealQuat.Y = -Quaternion[1]; UnrealQuat.Z = Quaternion[2]; UnrealQuat.W = -Quaternion[3]; VerifyFiniteQuat(UnrealQuat); return UnrealQuat; } /* Return a FRotator float or double*/ template static RotatorType ConvertEuler(FbxDouble3 Euler) { return RotatorType::MakeFromEuler(VectorType(Euler[0], -Euler[1], Euler[2])); } /* Return a FVector float or double */ template static VectorType ConvertScale(FbxVector4 Vector) { VectorType Out; Out[0] = Vector[0]; Out[1] = Vector[1]; Out[2] = Vector[2]; VerifyFiniteVector(Out); return Out; } /* Return a FRotator float or double */ template static RotatorType ConvertRotation(FbxQuaternion Quaternion) { RotatorType Out(ConvertRotToQuat(Quaternion)); return Out; } /* Return a FVector float or double */ template static VectorType ConvertPos(const FbxVector4& Vector) { VectorType Pos(Vector[0], -Vector[1], Vector[2]); VerifyFiniteVector(Pos); return Pos; } /* Return a FVector float or double */ template static VectorType ConvertDir(const FbxVector4& Vector) { VectorType Dir(Vector[0], -Vector[1], Vector[2]); VerifyFiniteVector(Dir); return Dir; } static FLinearColor ConvertColor(const FbxDouble3& Color); static FTransform AdjustCameraTransform(const FTransform& Transform); static FTransform AdjustLightTransform(const FTransform& Transform); /** Transform Conversion API End */ ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// /** Scene Conversion API Begin */ /** * Convert a fbx scene */ static void ConvertScene(FbxScene* SDKScene, const bool bConvertScene, const bool bForceFrontXAxis, const bool bConvertSceneUnit, FString& FileSystemDirection, FString& FileUnitSystem, FbxAMatrix& AxisConversionInverseMatrix); /** Scene Conversion API End */ ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// /** String Conversion API Begin */ /** * Convert UTF8 char to a FString using ANSI_TO_TCHAR macro */ static FString MakeString(const ANSICHAR* Name); /** String Conversion API End */ ////////////////////////////////////////////////////////////////////////// private: template static void VerifyFiniteScalar(ScalarType& Value) { if (!FMath::IsFinite(Value)) { Value = 0.0f; } } template static void VerifyFiniteVector(VectorType& Value) { if (Value.ContainsNaN()) { Value.Set(0.0, 0.0, 0.0); } } template static void VerifyFiniteQuat(QuatType& Value) { if (Value.ContainsNaN()) { Value = QuatType::Identity; } } template static void VerifyFiniteMatrix(MatrixType& Value) { if (Value.ContainsNaN()) { Value.SetIdentity(); } } }; }//ns Private }//ns Interchange }//ns UE