237 lines
5.3 KiB
C++
237 lines
5.3 KiB
C++
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
||
|
|
|
||
|
|
#include "CoreMinimal.h"
|
||
|
|
#include "FbxImporter.h"
|
||
|
|
|
||
|
|
using namespace UnFbx;
|
||
|
|
|
||
|
|
FbxAMatrix FFbxDataConverter::JointPostConversionMatrix;
|
||
|
|
FbxAMatrix FFbxDataConverter::AxisConversionMatrix;
|
||
|
|
FbxAMatrix FFbxDataConverter::AxisConversionMatrixInv;
|
||
|
|
|
||
|
|
FVector FFbxDataConverter::ConvertPos(FbxVector4 Vector)
|
||
|
|
{
|
||
|
|
FVector Out;
|
||
|
|
Out[0] = Vector[0];
|
||
|
|
// flip Y, then the right-handed axis system is converted to LHS
|
||
|
|
Out[1] = -Vector[1];
|
||
|
|
Out[2] = Vector[2];
|
||
|
|
return Out;
|
||
|
|
}
|
||
|
|
|
||
|
|
FVector FFbxDataConverter::ConvertDir(FbxVector4 Vector)
|
||
|
|
{
|
||
|
|
FVector Out;
|
||
|
|
Out[0] = Vector[0];
|
||
|
|
Out[1] = -Vector[1];
|
||
|
|
Out[2] = Vector[2];
|
||
|
|
return Out;
|
||
|
|
}
|
||
|
|
|
||
|
|
FRotator FFbxDataConverter::ConvertEuler(FbxDouble3 Euler)
|
||
|
|
{
|
||
|
|
return FRotator::MakeFromEuler(FVector(Euler[0], -Euler[1], Euler[2]));
|
||
|
|
}
|
||
|
|
|
||
|
|
FVector FFbxDataConverter::ConvertScale(FbxDouble3 Vector)
|
||
|
|
{
|
||
|
|
FVector Out;
|
||
|
|
Out[0] = Vector[0];
|
||
|
|
Out[1] = Vector[1];
|
||
|
|
Out[2] = Vector[2];
|
||
|
|
return Out;
|
||
|
|
}
|
||
|
|
|
||
|
|
FVector FFbxDataConverter::ConvertScale(FbxVector4 Vector)
|
||
|
|
{
|
||
|
|
FVector Out;
|
||
|
|
Out[0] = Vector[0];
|
||
|
|
Out[1] = Vector[1];
|
||
|
|
Out[2] = Vector[2];
|
||
|
|
return Out;
|
||
|
|
}
|
||
|
|
|
||
|
|
FRotator FFbxDataConverter::ConvertRotation(FbxQuaternion Quaternion)
|
||
|
|
{
|
||
|
|
FRotator Out(ConvertRotToQuat(Quaternion));
|
||
|
|
return Out;
|
||
|
|
}
|
||
|
|
|
||
|
|
//-------------------------------------------------------------------------
|
||
|
|
//
|
||
|
|
//-------------------------------------------------------------------------
|
||
|
|
FVector FFbxDataConverter::ConvertRotationToFVect(FbxQuaternion Quaternion, bool bInvertOrient)
|
||
|
|
{
|
||
|
|
FQuat UnrealQuaternion = ConvertRotToQuat(Quaternion);
|
||
|
|
FVector Euler;
|
||
|
|
Euler = UnrealQuaternion.Euler();
|
||
|
|
if (bInvertOrient)
|
||
|
|
{
|
||
|
|
Euler.Y = -Euler.Y;
|
||
|
|
Euler.Z = 180.f + Euler.Z;
|
||
|
|
}
|
||
|
|
return Euler;
|
||
|
|
}
|
||
|
|
|
||
|
|
//-------------------------------------------------------------------------
|
||
|
|
//
|
||
|
|
//-------------------------------------------------------------------------
|
||
|
|
FQuat FFbxDataConverter::ConvertRotToQuat(FbxQuaternion Quaternion)
|
||
|
|
{
|
||
|
|
FQuat UnrealQuat;
|
||
|
|
UnrealQuat.X = Quaternion[0];
|
||
|
|
UnrealQuat.Y = -Quaternion[1];
|
||
|
|
UnrealQuat.Z = Quaternion[2];
|
||
|
|
UnrealQuat.W = -Quaternion[3];
|
||
|
|
|
||
|
|
return UnrealQuat;
|
||
|
|
}
|
||
|
|
|
||
|
|
//-------------------------------------------------------------------------
|
||
|
|
//
|
||
|
|
//-------------------------------------------------------------------------
|
||
|
|
float FFbxDataConverter::ConvertDist(FbxDouble Distance)
|
||
|
|
{
|
||
|
|
float Out;
|
||
|
|
Out = (float)Distance;
|
||
|
|
return Out;
|
||
|
|
}
|
||
|
|
|
||
|
|
FTransform FFbxDataConverter::ConvertTransform(FbxAMatrix Matrix)
|
||
|
|
{
|
||
|
|
FTransform Out;
|
||
|
|
|
||
|
|
FQuat Rotation = ConvertRotToQuat(Matrix.GetQ());
|
||
|
|
FVector Origin = ConvertPos(Matrix.GetT());
|
||
|
|
FVector Scale = ConvertScale(Matrix.GetS());
|
||
|
|
|
||
|
|
Out.SetTranslation(Origin);
|
||
|
|
Out.SetScale3D(Scale);
|
||
|
|
Out.SetRotation(Rotation);
|
||
|
|
|
||
|
|
return Out;
|
||
|
|
}
|
||
|
|
|
||
|
|
FMatrix FFbxDataConverter::ConvertMatrix(const FbxAMatrix& Matrix)
|
||
|
|
{
|
||
|
|
FMatrix 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];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return UEMatrix;
|
||
|
|
}
|
||
|
|
|
||
|
|
FbxAMatrix FFbxDataConverter::ConvertMatrix(const FMatrix& 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;
|
||
|
|
}
|
||
|
|
|
||
|
|
FColor FFbxDataConverter::ConvertColor(FbxDouble3 Color)
|
||
|
|
{
|
||
|
|
// Fbx is in linear color space
|
||
|
|
FColor SRGBColor = FLinearColor(Color[0], Color[1], Color[2]).ToFColor(true);
|
||
|
|
return SRGBColor;
|
||
|
|
}
|
||
|
|
|
||
|
|
FbxVector4 FFbxDataConverter::ConvertToFbxPos(FVector Vector)
|
||
|
|
{
|
||
|
|
FbxVector4 Out;
|
||
|
|
Out[0] = Vector[0];
|
||
|
|
Out[1] = -Vector[1];
|
||
|
|
Out[2] = Vector[2];
|
||
|
|
|
||
|
|
return Out;
|
||
|
|
}
|
||
|
|
|
||
|
|
FbxVector4 FFbxDataConverter::ConvertToFbxRot(FVector Vector)
|
||
|
|
{
|
||
|
|
FbxVector4 Out;
|
||
|
|
Out[0] = Vector[0];
|
||
|
|
Out[1] = -Vector[1];
|
||
|
|
Out[2] = -Vector[2];
|
||
|
|
|
||
|
|
return Out;
|
||
|
|
}
|
||
|
|
|
||
|
|
FbxVector4 FFbxDataConverter::ConvertToFbxScale(FVector Vector)
|
||
|
|
{
|
||
|
|
FbxVector4 Out;
|
||
|
|
Out[0] = Vector[0];
|
||
|
|
Out[1] = Vector[1];
|
||
|
|
Out[2] = Vector[2];
|
||
|
|
|
||
|
|
return Out;
|
||
|
|
}
|
||
|
|
|
||
|
|
FbxDouble3 FFbxDataConverter::ConvertToFbxColor(FColor Color)
|
||
|
|
{
|
||
|
|
// Fbx is in linear color space
|
||
|
|
FLinearColor FbxLinearColor(Color);
|
||
|
|
FbxDouble3 Out;
|
||
|
|
Out[0] = FbxLinearColor.R;
|
||
|
|
Out[1] = FbxLinearColor.G;
|
||
|
|
Out[2] = FbxLinearColor.B;
|
||
|
|
|
||
|
|
return Out;
|
||
|
|
}
|
||
|
|
|
||
|
|
FbxString FFbxDataConverter::ConvertToFbxString(FName Name)
|
||
|
|
{
|
||
|
|
FbxString OutString;
|
||
|
|
|
||
|
|
FString UnrealString;
|
||
|
|
Name.ToString(UnrealString);
|
||
|
|
|
||
|
|
OutString = TCHAR_TO_UTF8(*UnrealString);
|
||
|
|
|
||
|
|
return OutString;
|
||
|
|
}
|
||
|
|
|
||
|
|
FbxString FFbxDataConverter::ConvertToFbxString(const FString& String)
|
||
|
|
{
|
||
|
|
FbxString OutString;
|
||
|
|
|
||
|
|
OutString = TCHAR_TO_UTF8(*String);
|
||
|
|
|
||
|
|
return OutString;
|
||
|
|
}
|