bRemoveRedundantKeys
bRemoveRedundantKeys
#Overview
name: bRemoveRedundantKeys
The value of this variable can be defined or overridden in .ini config files. 1
.ini config file referencing this setting variable.
It is referenced in 10
C++ source files.
#Summary
#Usage in the C++ source code
The purpose of bRemoveRedundantKeys is to control the removal of redundant keys from animation curves during the import process of FBX files into Unreal Engine 5.
This setting variable is primarily used in the animation system, specifically for importing and processing animation data from FBX files. It is part of the Interchange Editor plugin and the UnrealEd module, which are responsible for handling asset imports and editor functionality.
The value of this variable is typically set in the UFbxAnimSequenceImportData class, which is part of the FBX import system. It is initialized to true by default in the constructor of UFbxAnimSequenceImportData.
bRemoveRedundantKeys interacts with other animation import settings, such as bImportCustomAttribute and bDoNotImportCurveWithZero. It is used in conjunction with these settings to control the level of detail and optimization in imported animation curves.
Developers must be aware that enabling this option can potentially modify the imported animation data by removing keys that are considered redundant. This can result in smaller file sizes and potentially improved performance, but it may also lead to slight changes in the animation’s appearance if not used carefully.
Best practices when using this variable include:
- Consider the nature of the animation being imported. For subtle or precise animations, it may be better to keep redundant keys for accuracy.
- Test the imported animations with and without this option enabled to ensure the desired visual quality is maintained.
- Use in combination with other import settings to achieve the best balance between file size, performance, and animation fidelity.
- Be consistent in its use across a project to maintain uniformity in imported animations.
#Setting Variables
#References In INI files
Location: <Workspace>/Engine/Config/BaseEditorPerProjectUserSettings.ini:691, section: [/Script/UnrealEd.FbxAnimSequenceImportData]
- INI Section:
/Script/UnrealEd.FbxAnimSequenceImportData
- Raw value:
True
- Is Array:
False
#References in C++ code
#Callsites
This variable is referenced in the following C++ source code:
#Loc: <Workspace>/Engine/Plugins/Interchange/Editor/Source/InterchangeEditor/Private/InterchangeFbxAssetImportDataConverter.cpp:274
Scope (from outer to inner):
file
namespace UE::Interchange::Private
function void FillInterchangeGenericAssetsPipelineFromFbxAnimSequenceImportData
Source code excerpt:
GenericAssetPipeline->AnimationPipeline->bImportCustomAttribute = AnimSequenceImportData->bImportCustomAttribute;
GenericAssetPipeline->CommonSkeletalMeshesAndAnimationsProperties->bImportMeshesInBoneHierarchy = AnimSequenceImportData->bImportMeshesInBoneHierarchy;
GenericAssetPipeline->AnimationPipeline->bRemoveCurveRedundantKeys = AnimSequenceImportData->bRemoveRedundantKeys;
GenericAssetPipeline->AnimationPipeline->bSetMaterialDriveParameterOnCustomAttribute = AnimSequenceImportData->bSetMaterialDriveParameterOnCustomAttribute;
GenericAssetPipeline->AnimationPipeline->bSnapToClosestFrameBoundary = AnimSequenceImportData->bSnapToClosestFrameBoundary;
GenericAssetPipeline->AnimationPipeline->bUse30HzToBakeBoneAnimation = AnimSequenceImportData->bUseDefaultSampleRate;
GenericAssetPipeline->AnimationPipeline->CustomBoneAnimationSampleRate = AnimSequenceImportData->CustomSampleRate;
GenericAssetPipeline->AnimationPipeline->FrameImportRange = AnimSequenceImportData->FrameImportRange;
GenericAssetPipeline->AnimationPipeline->MaterialCurveSuffixes = AnimSequenceImportData->MaterialCurveSuffixes;
#Loc: <Workspace>/Engine/Plugins/Interchange/Editor/Source/InterchangeEditor/Private/InterchangeFbxAssetImportDataConverter.cpp:495
Scope (from outer to inner):
file
namespace UE::Interchange::Private
function UAssetImportData* ConvertToLegacyFbx
Source code excerpt:
DestinationAnimSequenceImportData->bImportMeshesInBoneHierarchy = GenericAssetPipeline->CommonSkeletalMeshesAndAnimationsProperties->bImportMeshesInBoneHierarchy;
DestinationAnimSequenceImportData->bPreserveLocalTransform = false;
DestinationAnimSequenceImportData->bRemoveRedundantKeys = GenericAssetPipeline->AnimationPipeline->bRemoveCurveRedundantKeys;
DestinationAnimSequenceImportData->bSetMaterialDriveParameterOnCustomAttribute = GenericAssetPipeline->AnimationPipeline->bSetMaterialDriveParameterOnCustomAttribute;
DestinationAnimSequenceImportData->bSnapToClosestFrameBoundary = GenericAssetPipeline->AnimationPipeline->bSnapToClosestFrameBoundary;
DestinationAnimSequenceImportData->bUseDefaultSampleRate = GenericAssetPipeline->AnimationPipeline->bUse30HzToBakeBoneAnimation;
DestinationAnimSequenceImportData->CustomSampleRate = GenericAssetPipeline->AnimationPipeline->CustomBoneAnimationSampleRate;
DestinationAnimSequenceImportData->FrameImportRange = GenericAssetPipeline->AnimationPipeline->FrameImportRange;
DestinationAnimSequenceImportData->MaterialCurveSuffixes = GenericAssetPipeline->AnimationPipeline->MaterialCurveSuffixes;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Classes/Factories/FbxAnimSequenceImportData.h:103
Scope (from outer to inner):
file
class class UFbxAnimSequenceImportData : public UFbxAssetImportData
Source code excerpt:
/** When importing custom attribute as curve, remove redundant keys */
UPROPERTY(EditAnywhere, AdvancedDisplay, config, Category = ImportSettings, meta = (EditCondition = "bImportCustomAttribute", DisplayName = "Remove Redundant Keys"))
bool bRemoveRedundantKeys;
/** If enabled, this will delete this type of asset from the FBX */
UPROPERTY(EditAnywhere, AdvancedDisplay, config, Category = ImportSettings)
bool bDeleteExistingMorphTargetCurves;
/** When importing custom attribute or morphtarget as curve, do not import if it doesn't have any value other than zero. This is to avoid adding extra curves to evaluate */
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxAnimSequenceImportData.cpp:9
Scope (from outer to inner):
file
function UFbxAnimSequenceImportData::UFbxAnimSequenceImportData
Source code excerpt:
, bImportBoneTracks(true)
, bAddCurveMetadataToSkeleton(true)
, bRemoveRedundantKeys(true)
, bDoNotImportCurveWithZero(true)
{
FrameImportRange.Min = 0;
FrameImportRange.Max = 0;
MaterialCurveSuffixes.Add(TEXT("_mat"));
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxAnimSequenceImportData.cpp:92
Scope (from outer to inner):
file
function void UFbxAnimSequenceImportData::CopyAnimationValues
Source code excerpt:
bImportMeshesInBoneHierarchy = Other->bImportMeshesInBoneHierarchy;
bPreserveLocalTransform = Other->bPreserveLocalTransform;
bRemoveRedundantKeys = Other->bRemoveRedundantKeys;
bSetMaterialDriveParameterOnCustomAttribute = Other->bSetMaterialDriveParameterOnCustomAttribute;
bAddCurveMetadataToSkeleton = Other->bAddCurveMetadataToSkeleton;
bUseDefaultSampleRate = Other->bUseDefaultSampleRate;
CustomSampleRate = Other->CustomSampleRate;
FrameImportRange = Other->FrameImportRange;
MaterialCurveSuffixes = Other->MaterialCurveSuffixes;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxMainImport.cpp:508
Scope (from outer to inner):
file
namespace UnFbx
function void ApplyImportUIToImportOptions
Source code excerpt:
InOutImportOptions.bPreserveLocalTransform = ImportUI->AnimSequenceImportData->bPreserveLocalTransform;
InOutImportOptions.bDeleteExistingMorphTargetCurves = ImportUI->AnimSequenceImportData->bDeleteExistingMorphTargetCurves;
InOutImportOptions.bRemoveRedundantKeys = ImportUI->AnimSequenceImportData->bRemoveRedundantKeys;
InOutImportOptions.bDoNotImportCurveWithZero = ImportUI->AnimSequenceImportData->bDoNotImportCurveWithZero;
InOutImportOptions.bImportCustomAttribute = ImportUI->AnimSequenceImportData->bImportCustomAttribute;
InOutImportOptions.bDeleteExistingCustomAttributeCurves = ImportUI->AnimSequenceImportData->bDeleteExistingCustomAttributeCurves;
InOutImportOptions.bDeleteExistingNonCurveCustomAttributes = ImportUI->AnimSequenceImportData->bDeleteExistingNonCurveCustomAttributes;
InOutImportOptions.bImportBoneTracks = ImportUI->AnimSequenceImportData->bImportBoneTracks;
InOutImportOptions.bSetMaterialDriveParameterOnCustomAttribute = ImportUI->AnimSequenceImportData->bSetMaterialDriveParameterOnCustomAttribute;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxMainImport.cpp:1795
Scope (from outer to inner):
file
lambda-function
Source code excerpt:
Attribs.Add(FAnalyticsEventAttribute(TEXT("AnimOpt DeleteExistingNonCurveCustomAttributes"), CaptureImportOptions->bDeleteExistingNonCurveCustomAttributes));
Attribs.Add(FAnalyticsEventAttribute(TEXT("AnimOpt PreserveLocalTransform"), CaptureImportOptions->bPreserveLocalTransform));
Attribs.Add(FAnalyticsEventAttribute(TEXT("AnimOpt RemoveRedundantKeys"), CaptureImportOptions->bRemoveRedundantKeys));
Attribs.Add(FAnalyticsEventAttribute(TEXT("AnimOpt Resample"), CaptureImportOptions->bResample));
Attribs.Add(FAnalyticsEventAttribute(TEXT("AnimOpt SetMaterialDriveParameterOnCustomAttribute"), CaptureImportOptions->bSetMaterialDriveParameterOnCustomAttribute));
Attribs.Add(FAnalyticsEventAttribute(TEXT("AnimOpt MaterialCurveSuffixes"), CaptureImportOptions->MaterialCurveSuffixes));
Attribs.Add(FAnalyticsEventAttribute(TEXT("AnimOpt ResampleRate"), CaptureImportOptions->ResampleRate));
Attribs.Add(FAnalyticsEventAttribute(TEXT("AnimOpt SnapToClosestFrameBoundary"), CaptureImportOptions->bSnapToClosestFrameBoundary));
};
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/SkeletalMeshEdit.cpp:1395
Scope (from outer to inner):
file
function bool UnFbx::FFbxImporter::ImportCurveToAnimSequence
Source code excerpt:
if (ImportCurve(FbxCurve, RichCurve, AnimTimeSpan, bNegative, ValueScale))
{
if (ImportOptions->bRemoveRedundantKeys)
{
RichCurve.RemoveRedundantAutoTangentKeys(SMALL_NUMBER);
}
// Set actual keys on curve within the model
Controller.SetCurveKeys(FloatCurveId, RichCurve.GetConstRefOfKeys(), bShouldTransact);
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/SkeletalMeshEdit.cpp:2009
Scope: file
Source code excerpt:
for (FRichCurve& Result : Results)
{
if (ImportOptions->bRemoveRedundantKeys)
{
Result.RemoveRedundantAutoTangentKeys(SMALL_NUMBER);
}
}
if (ImportRichCurvesToAnimSequence(AnimImportSettings.DestSeq, CurveNames, Results, 0, bReimport))
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Public/FbxImporter.h:203
Scope (from outer to inner):
file
namespace UnFbx
Source code excerpt:
bool bSetMaterialDriveParameterOnCustomAttribute;
bool bAddCurveMetadataToSkeleton;
bool bRemoveRedundantKeys;
bool bDoNotImportCurveWithZero;
bool bResetToFbxOnMaterialConflict;
TArray<FString> MaterialCurveSuffixes;
/** This allow to add a prefix to the material name when unreal material get created.
* This prefix can just modify the name of the asset for materials (i.e. TEXT("Mat"))