bImportMaterials
bImportMaterials
#Overview
name: bImportMaterials
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 44
C++ source files.
#Summary
#Usage in the C++ source code
The purpose of bImportMaterials is to control whether materials should be imported along with the geometry when importing 3D assets like static meshes or skeletal meshes into Unreal Engine.
Key points about bImportMaterials:
-
It is primarily used in the FBX import subsystem and related import/reimport functionality.
-
When set to true, it allows the importer to create or update material assets based on the materials defined in the source FBX file.
-
When set to false, it skips material import, which can be useful when you want to keep existing materials or manually set up materials later.
-
It is often used in conjunction with bImportTextures, which controls texture import separately.
-
The value is typically set through import UI options or programmatically when performing imports through code.
-
It affects various Unreal Engine subsystems related to asset import, including static mesh, skeletal mesh, and scene imports.
-
The variable interacts with other import settings like bImportTextures, bImportMeshLODs, and material search options.
Best practices:
-
Consider setting bImportMaterials to false when reimporting geometry to preserve existing materials.
-
When importing new assets, set it to true to get a starting point for materials, then refine them in the Unreal Editor.
-
Be aware that setting it to false doesn’t prevent texture import if bImportTextures is true.
-
When working with large scenes or multiple assets, consider the performance impact of importing many materials at once.
-
Use in combination with material search and override options for more fine-grained control over material import behavior.
Developers should be aware that the behavior of this variable can change depending on the context (e.g., initial import vs. reimport) and the type of asset being imported. Always consider the specific use case and the desired end result when setting this option.
#Setting Variables
#References In INI files
Location: <Workspace>/Engine/Config/BaseEditorPerProjectUserSettings.ini:634, section: [/Script/UnrealEd.FbxImportUI]
- INI Section:
/Script/UnrealEd.FbxImportUI
- 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/ChaosClothAssetEditor/Source/ChaosClothAssetDataflowNodes/Private/ChaosClothAsset/USDImportNode.cpp:489
Scope (from outer to inner):
file
function bool FChaosClothAssetUSDImportNode::ImportFromFile
Source code excerpt:
ImportOptions->bImportSkeletalAnimations = false;
ImportOptions->bImportLevelSequences = false;
ImportOptions->bImportMaterials = true;
ImportOptions->bImportGroomAssets = false;
ImportOptions->bImportOnlyUsedMaterials = true;
// Prims to import
ImportOptions->PrimsToImport = TArray<FString>{ TEXT( "/" ) };
// USD options
ImportOptions->PurposesToImport = (int32)EUsdPurpose::Proxy;
#Loc: <Workspace>/Engine/Plugins/Importers/USDImporter/Source/USDStageImporter/Private/USDStageImportOptions.cpp:16
Scope (from outer to inner):
file
function UUsdStageImportOptions::UUsdStageImportOptions
Source code excerpt:
bImportSkeletalAnimations = true;
bImportLevelSequences = true;
bImportMaterials = true;
bImportGroomAssets = true;
bImportSparseVolumeTextures = true;
bImportOnlyUsedMaterials = false;
PurposesToImport = (int32)(EUsdPurpose::Default | EUsdPurpose::Proxy | EUsdPurpose::Render | EUsdPurpose::Guide);
NaniteTriangleThreshold = INT32_MAX;
#Loc: <Workspace>/Engine/Plugins/Importers/USDImporter/Source/USDStageImporter/Private/USDStageImportOptions.cpp:92
Scope (from outer to inner):
file
function void UsdUtils::AddAnalyticsAttributes
Source code excerpt:
InOutAttributes.Emplace(TEXT("ImportSkeletalAnimations"), LexToString(Options.bImportSkeletalAnimations));
InOutAttributes.Emplace(TEXT("ImportLevelSequences"), LexToString(Options.bImportLevelSequences));
InOutAttributes.Emplace(TEXT("ImportMaterials"), LexToString(Options.bImportMaterials));
InOutAttributes.Emplace(TEXT("ImportGroomAssets"), LexToString(Options.bImportGroomAssets));
InOutAttributes.Emplace(TEXT("ImportSparseVolumeTextures"), LexToString(Options.bImportSparseVolumeTextures));
InOutAttributes.Emplace(TEXT("ImportOnlyUsedMaterials"), LexToString(Options.bImportOnlyUsedMaterials));
if (Options.PrimsToImport != TArray<FString>{TEXT("/")})
{
InOutAttributes.Emplace(TEXT("NumPrimsToImport"), LexToString(Options.PrimsToImport.Num()));
#Loc: <Workspace>/Engine/Plugins/Importers/USDImporter/Source/USDStageImporter/Private/USDStageImporter.cpp:299
Scope (from outer to inner):
file
namespace UE::USDStageImporter::Private
function void ImportMaterials
Source code excerpt:
TRACE_CPUPROFILER_EVENT_SCOPE(ImportMaterials);
if (!ImportContext.ImportOptions->bImportMaterials)
{
return;
}
TArray<UE::FUsdPrim> MaterialPrims = UsdUtils::GetAllPrimsOfType(ImportContext.Stage.GetPseudoRoot(), TEXT("UsdShadeMaterial"));
#Loc: <Workspace>/Engine/Plugins/Importers/USDImporter/Source/USDStageImporter/Private/USDStageImporter.cpp:1826
Scope (from outer to inner):
file
namespace UE::USDStageImporter::Private
function void PruneUnwantedAssets
Source code excerpt:
(!bImportSkeletalAnimations && (Asset->IsA<UAnimSequence>())) ||
(!ImportContext.ImportOptions->bImportLevelSequences && (Asset->IsA<ULevelSequence>())) ||
(!ImportContext.ImportOptions->bImportMaterials && (Asset->IsA<UMaterialInterface>() || Asset->IsA<UTexture>())) ||
(!ImportContext.ImportOptions->bImportGroomAssets && (Asset->IsA<UGroomAsset>() || Asset->IsA<UGroomCache>() || Asset->IsA<UGroomBindingAsset>())) ||
(!ImportContext.ImportOptions->bImportSparseVolumeTextures && (Asset->IsA<USparseVolumeTexture>()))
)
{
ObjectsToRemap.Add(Asset, nullptr);
SoftObjectsToRemap.Add(Asset, nullptr);
#Loc: <Workspace>/Engine/Plugins/Importers/USDImporter/Source/USDStageImporter/Public/USDStageImportOptions.h:68
Scope (from outer to inner):
file
class class UUsdStageImportOptions : public UObject
Source code excerpt:
UPROPERTY(BlueprintReadWrite, config, EditAnywhere, Category = "DataToImport", meta = (DisplayName = "Materials & Textures"))
bool bImportMaterials;
/** Whether to import GroomAssets, GroomCaches and GroomBindings */
UPROPERTY(BlueprintReadWrite, config, EditAnywhere, Category = "DataToImport", meta = (DisplayName = "Groom Assets"))
bool bImportGroomAssets;
/** Whether to import OpenVDB volumes as Sparse Volume Textures */
#Loc: <Workspace>/Engine/Plugins/Interchange/Editor/Source/InterchangeEditor/Private/InterchangeFbxAssetImportDataConverter.cpp:623
Scope (from outer to inner):
file
namespace UE::Interchange::Private
function UAssetImportData* ConvertToInterchange
Source code excerpt:
//Material Options
GenericAssetPipeline->MaterialPipeline->bImportMaterials = FbxImportUI->bImportMaterials;
switch (FbxImportUI->TextureImportData->MaterialSearchLocation)
{
case EMaterialSearchLocation::Local:
GenericAssetPipeline->MaterialPipeline->SearchLocation = EInterchangeMaterialSearchLocation::Local;
break;
case EMaterialSearchLocation::UnderParent:
#Loc: <Workspace>/Engine/Plugins/Interchange/Runtime/Source/Pipelines/Private/InterchangeGenericAssetsPipeline.cpp:1087
Scope (from outer to inner):
file
function void UInterchangeGenericAssetsPipeline::ExecutePipeline
Source code excerpt:
if (CommonSkeletalMeshesAndAnimationsProperties->bImportOnlyAnimations)
{
MaterialPipeline->bImportMaterials = false;
MeshPipeline->bImportStaticMeshes = false;
MeshPipeline->bCreatePhysicsAsset = false;
MeshPipeline->PhysicsAsset = nullptr;
MaterialPipeline->TexturePipeline->bImportTextures = false;
}
#Loc: <Workspace>/Engine/Plugins/Interchange/Runtime/Source/Pipelines/Private/InterchangeGenericMaterialPipeline.cpp:618
Scope (from outer to inner):
file
function void UInterchangeGenericMaterialPipeline::AdjustSettingsForContext
Source code excerpt:
|| ImportType == EInterchangePipelineContext::AssetAlternateSkinningReimport)
{
bImportMaterials = false;
HideCategories.Add(TEXT("Materials"));
SearchLocation = EInterchangeMaterialSearchLocation::DoNotSearch;
}
if (UInterchangePipelineBase* OuterMostPipeline = GetMostPipelineOuter())
{
#Loc: <Workspace>/Engine/Plugins/Interchange/Runtime/Source/Pipelines/Private/InterchangeGenericMaterialPipeline.cpp:632
Scope (from outer to inner):
file
function void UInterchangeGenericMaterialPipeline::AdjustSettingsForContext
Source code excerpt:
{
//When we re-import we hide all setting but search location, so we can find existing materials.
HideProperty(OuterMostPipeline, this, GET_MEMBER_NAME_CHECKED(UInterchangeGenericMaterialPipeline, bImportMaterials));
HideProperty(OuterMostPipeline, this, GET_MEMBER_NAME_CHECKED(UInterchangeGenericMaterialPipeline, MaterialImport));
HideProperty(OuterMostPipeline, this, GET_MEMBER_NAME_CHECKED(UInterchangeGenericMaterialPipeline, bIdentifyDuplicateMaterials));
HideProperty(OuterMostPipeline, this, GET_MEMBER_NAME_CHECKED(UInterchangeGenericMaterialPipeline, bCreateMaterialInstanceForParent));
HideProperty(OuterMostPipeline, this, GET_MEMBER_NAME_CHECKED(UInterchangeGenericMaterialPipeline, ParentMaterial));
HideProperty(OuterMostPipeline, this, GET_MEMBER_NAME_CHECKED(UInterchangeGenericMaterialPipeline, AssetName));
}
#Loc: <Workspace>/Engine/Plugins/Interchange/Runtime/Source/Pipelines/Private/InterchangeGenericMaterialPipeline.cpp:750
Scope (from outer to inner):
file
function void UInterchangeGenericMaterialPipeline::ExecutePipeline
Source code excerpt:
// Check to see whether materials should be created even if unused
// By default we let the setting of the pipeline to decide if we create the materials, every node with mesh attribute can enable/disable them, depending on the pipeline stack chosen.
bool bImportUnusedMaterial = bImportMaterials;
if (const UInterchangeSourceNode* SourceNode = UInterchangeSourceNode::GetUniqueInstance(BaseNodeContainer))
{
SourceNode->GetCustomImportUnusedMaterial(bImportUnusedMaterial);
bImportUnusedMaterial |= bImportMaterials ;
}
// Can't import materials at runtime, fall back to instances
if (FApp::IsGame() && MaterialImport == EInterchangeMaterialImportOption::ImportAsMaterials)
{
MaterialImport = EInterchangeMaterialImportOption::ImportAsMaterialInstances;
#Loc: <Workspace>/Engine/Plugins/Interchange/Runtime/Source/Pipelines/Private/InterchangeGenericMaterialPipeline.cpp:807
Scope (from outer to inner):
file
function void UInterchangeGenericMaterialPipeline::ExecutePipeline
lambda-function
Source code excerpt:
BaseNodeContainer->IterateNodesOfType<UInterchangeBaseMaterialFactoryNode>([&ContentBasePath, bClosureImportMaterials = bImportMaterials || bImportUnusedMaterial, ClosureSearchLocation = SearchLocation](const FString& NodeUid, UInterchangeBaseMaterialFactoryNode* MaterialBaseFactoryNode)
{
if (MaterialBaseFactoryNode)
{
MaterialBaseFactoryNode->SetCustomIsMaterialImportEnabled(bClosureImportMaterials);
//Disable all materials if the toggle is off
if (!bClosureImportMaterials)
#Loc: <Workspace>/Engine/Plugins/Interchange/Runtime/Source/Pipelines/Public/InterchangeGenericMaterialPipeline.h:67
Scope (from outer to inner):
file
class class UInterchangeGenericMaterialPipeline : public UInterchangePipelineBase
Source code excerpt:
/** If enabled, imports the material assets found in the sources. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Materials")
bool bImportMaterials = true;
/** Specify where we should search for existing materials when importing.*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Materials")
EInterchangeMaterialSearchLocation SearchLocation = EInterchangeMaterialSearchLocation::Local;
/** If set, and there is only one asset and one source, the imported asset will be given this name. */
#Loc: <Workspace>/Engine/Source/Editor/DetailCustomizations/Private/FbxImportUIDetails.cpp:319
Scope (from outer to inner):
file
function void FFbxImportUIDetails::CustomizeDetails
Source code excerpt:
AddRefreshCustomDetailEvent(SK_ImportContent_DataProp);
TSharedRef<IPropertyHandle> ImportMaterialsProp = DetailBuilder.GetProperty(GET_MEMBER_NAME_CHECKED(UFbxImportUI, bImportMaterials));
ImportMaterialsProp->SetOnPropertyValueChanged(FSimpleDelegate::CreateSP(this, &FFbxImportUIDetails::ImportMaterialsChanged));
TSharedRef<IPropertyHandle> ImportAutoComputeLodDistancesProp = DetailBuilder.GetProperty(GET_MEMBER_NAME_CHECKED(UFbxImportUI, bAutoComputeLodDistances));
ImportAutoComputeLodDistancesProp->SetOnPropertyValueChanged(FSimpleDelegate::CreateSP(this, &FFbxImportUIDetails::ImportAutoComputeLodDistancesChanged));
TSharedPtr<IPropertyHandle> ImportMeshLODsProp = StaticMeshDataProp->GetChildHandle(GET_MEMBER_NAME_CHECKED(UFbxStaticMeshImportData, bImportMeshLODs));
#Loc: <Workspace>/Engine/Source/Editor/DetailCustomizations/Private/FbxImportUIDetails.cpp:610
Scope (from outer to inner):
file
function void FFbxImportUIDetails::CustomizeDetails
Source code excerpt:
else
{
TSharedRef<IPropertyHandle> ImportMaterialPropHandle = DetailBuilder.GetProperty(GET_MEMBER_NAME_CHECKED(UFbxImportUI, bImportMaterials));
TSharedRef<IPropertyHandle> TextureDataProp = DetailBuilder.GetProperty(GET_MEMBER_NAME_CHECKED(UFbxImportUI, TextureImportData));
DetailBuilder.HideProperty(TextureDataProp);
ExtraProperties.Empty();
CollectChildPropertiesRecursive(TextureDataProp, ExtraProperties);
#Loc: <Workspace>/Engine/Source/Editor/DetailCustomizations/Private/FbxImportUIDetails.cpp:650
Scope (from outer to inner):
file
function void FFbxImportUIDetails::CustomizeDetails
Source code excerpt:
if (Handle->GetProperty()->GetFName() == GET_MEMBER_NAME_CHECKED(UFbxTextureImportData, BaseMaterialName))
{
if (ImportUI->bImportMaterials && ImportUI->TextureImportData->bUseBaseMaterial)
{
ConstructBaseMaterialUI(Handle, MaterialCategory);
}
}
else if (Handle != MaterialLocationPropHandle)
{
#Loc: <Workspace>/Engine/Source/Editor/DetailCustomizations/Private/FbxImportUIDetails.cpp:757
Scope (from outer to inner):
file
function void FFbxImportUIDetails::ConstructMaterialImportMethod
Source code excerpt:
const UEnum* MaterialImportMethodEnum = StaticEnum< EMaterialImportMethod >();
SelectedMaterialImportMethod = ImportUI->bImportMaterials
? (ImportUI->TextureImportData->bUseBaseMaterial ? EMaterialImportMethod::CreateNewInstancedMaterials : EMaterialImportMethod::CreateNewMaterials)
: EMaterialImportMethod::DoNotCreateMaterialString;
MaterialCategory.AddCustomRow(LOCTEXT("MaterialImportMethod", "Material Import Method"))
.NameContent()
[
#Loc: <Workspace>/Engine/Source/Editor/DetailCustomizations/Private/FbxImportUIDetails.cpp:1289
Scope (from outer to inner):
file
function void FFbxImportUIDetails::OnMaterialImportMethodChanged
Source code excerpt:
{
case EMaterialImportMethod::CreateNewMaterials:
ImportUI->bImportMaterials = true;
//Reset the base material and the UseBaseMaterial flag to hide the base material name property
ImportUI->TextureImportData->bUseBaseMaterial = false;
ImportUI->TextureImportData->BaseMaterialName.Reset();
break;
case EMaterialImportMethod::CreateNewInstancedMaterials:
ImportUI->bImportMaterials = true;
ImportUI->TextureImportData->bUseBaseMaterial = true;
break;
case EMaterialImportMethod::DoNotCreateMaterialString:
ImportUI->bImportMaterials = false;
//Reset the base material and the UseBaseMaterial flag to hide the base material name property
ImportUI->TextureImportData->bUseBaseMaterial = false;
ImportUI->TextureImportData->BaseMaterialName.Reset();
break;
default:
break;
#Loc: <Workspace>/Engine/Source/Editor/DetailCustomizations/Private/FbxImportUIDetails.h:76
Scope (from outer to inner):
file
class class FFbxImportUIDetails : public IDetailCustomization, public FEditorUndoClient
Source code excerpt:
void ValidateLodSettingsChanged(int32 MemberID);
/** Called if the bImportMaterials changes */
void ImportMaterialsChanged();
/** Called if the mesh mode (static / skeletal) changes */
void MeshImportModeChanged();
/** Called if the import mesh option for skeletal meshes is changed */
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Classes/Factories/FbxImportUI.h:187
Scope (from outer to inner):
file
class class UFbxImportUI : public UObject, public IImportSettingsParser
Source code excerpt:
/** If no existing materials are found, whether to automatically create Unreal materials for materials found in the FBX scene */
UPROPERTY(EditAnywhere, BlueprintReadWrite, config, Category = Material, meta=(ImportType="GeoOnly"))
uint32 bImportMaterials:1;
/** Whether or not we should import textures. This option is disabled when we are importing materials because textures are always imported in that case. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, config, Category=Material, meta = (ImportType = "GeoOnly", EditCondition="!bImportMaterials"))
uint32 bImportTextures:1;
/** If true, the imported material sections will automatically be reset to the imported data in case of a reimport conflict. */
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Factories/EditorFactories.cpp:6739
Scope (from outer to inner):
file
function EReimportResult::Type UReimportFbxSkeletalMeshFactory::Reimport
Source code excerpt:
if (ImportOptions->bImportAsSkeletalSkinning)
{
ImportOptions->bImportMaterials = false;
ImportOptions->bImportTextures = false;
ImportOptions->bImportLOD = false;
ImportOptions->bImportSkeletalMeshLODs = false;
ImportOptions->bImportAnimations = false;
ImportOptions->bImportMorph = false;
ImportOptions->VertexColorImportOption = EVertexColorImportOption::Ignore;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxFactory.cpp:392
Scope (from outer to inner):
file
function UObject* UFbxFactory::FactoryCreateFile
Source code excerpt:
if (ImportOptions->bImportAsSkeletalSkinning)
{
ImportOptions->bImportMaterials = false;
ImportOptions->bImportTextures = false;
ImportOptions->bImportLOD = false;
ImportOptions->bImportSkeletalMeshLODs = false;
ImportOptions->bImportAnimations = false;
ImportOptions->bImportMorph = false;
}
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxFactory.cpp:815
Scope: file
Source code excerpt:
{
// Disable material importing when importing morph targets
uint32 bImportMaterials = ImportOptions->bImportMaterials;
ImportOptions->bImportMaterials = 0;
uint32 bImportTextures = ImportOptions->bImportTextures;
ImportOptions->bImportTextures = 0;
FbxImporter->ImportFbxMorphTarget(SkelMeshNodeArray, BaseSkeletalMesh, ImportedSuccessfulLodIndex, OutData, bMapMorphTargetToTimeZero);
bOperationCanceled |= FbxImporter->GetImportOperationCancelled();
ImportOptions->bImportMaterials = !!bImportMaterials;
ImportOptions->bImportTextures = !!bImportTextures;
}
bOperationCanceled |= SlowTask.ShouldCancel();
}
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxMainImport.cpp:385
Scope (from outer to inner):
file
namespace UnFbx
function void ApplyImportUIToImportOptions
Source code excerpt:
//Material options
{
InOutImportOptions.bImportMaterials = ImportUI->bImportMaterials;
InOutImportOptions.bInvertNormalMap = ImportUI->TextureImportData->bInvertNormalMaps;
InOutImportOptions.MaterialSearchLocation = ImportUI->TextureImportData->MaterialSearchLocation;
UMaterialInterface* BaseMaterialInterface = Cast<UMaterialInterface>(ImportUI->TextureImportData->BaseMaterialName.TryLoad());
if (BaseMaterialInterface) {
InOutImportOptions.BaseMaterial = BaseMaterialInterface;
InOutImportOptions.BaseColorName = ImportUI->TextureImportData->BaseColorName;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxMainImport.cpp:1647
Scope (from outer to inner):
file
namespace UnFbx
function bool FFbxImporter::ImportFromFile
Source code excerpt:
* @EventParam ImportUniformScale float Returns the uniform scale apply on the import data
* @EventParam MaterialBasePath string Returns the path pointing on the base material use to import material instance
* @EventParam MaterialSearchLocation string Returns the scope of the search for existing materials (if material not found it can create one depending on bImportMaterials value)
* @EventParam ReorderMaterialToFbxOrder boolean returns weather the importer should reorder the materials in the same order has the fbx file
* @EventParam AutoGenerateCollision boolean Returns whether the importer should create collision primitive
* @EventParam CombineToSingle boolean Returns whether the importer should combine all mesh part together or import many meshes
* @EventParam BakePivotInVertex boolean Returns whether the importer should bake the fbx mesh pivot into the vertex position
* @EventParam TransformVertexToAbsolute boolean Returns whether the importer should bake the global fbx node transform into the vertex position
* @EventParam ImportRigidMesh boolean Returns whether the importer should try to create a rigid mesh (static mesh import as skeletal mesh)
* @EventParam NormalImportMethod string Return if the tangents or normal should be imported or compute
* @EventParam NormalGenerationMethod string Return tangents generation method
* @EventParam CreatePhysicsAsset boolean Returns whether the importer should create the physic asset
* @EventParam ImportAnimations boolean Returns whether the importer should import also the animation
* @EventParam ImportAsSkeletalGeometry boolean Returns whether the importer should import only the geometry
* @EventParam ImportAsSkeletalSkinning boolean Returns whether the importer should import only the skinning
* @EventParam ImportMeshesInBoneHierarchy boolean Returns whether the importer should import also the mesh found in the bone hierarchy
* @EventParam ImportMorph boolean Returns whether the importer should import the morph targets
* @EventParam ImportSkeletalMeshLODs boolean Returns whether the importer should import the LODs
* @EventParam PreserveSmoothingGroups boolean Returns whether the importer should import the smoothing groups
* @EventParam UpdateSkeletonReferencePose boolean Returns whether the importer should update the skeleton reference pose
* @EventParam UseT0AsRefPose boolean Returns whether the importer should use the the animation 0 time has the reference pose
* @EventParam ThresholdPosition float Returns the threshold delta to weld vertices
* @EventParam ThresholdTangentNormal float Returns the threshold delta to weld tangents and normals
* @EventParam ThresholdUV float Returns the threshold delta to weld UVs
* @EventParam MorphThresholdPosition float Returns the morph target threshold delta to compute deltas
* @EventParam AutoComputeLodDistances boolean Returns whether the importer should set the auto compute LOD distance
* @EventParam LodNumber integer Returns the LOD number we should have after the import
* @EventParam BuildReversedIndexBuffer boolean Returns whether the importer should fill the reverse index buffer when building the static mesh
* @EventParam GenerateLightmapUVs boolean Returns whether the importer should generate light map UVs
* @EventParam ImportStaticMeshLODs boolean Returns whether the importer should import the LODs
* @EventParam RemoveDegenerates boolean Returns whether the importer should remove the degenerated triangles when building the static mesh
* @EventParam MinimumLodNumber integer Returns the minimum LOD use by the rendering
* @EventParam StaticMeshLODGroup string Returns the LOD Group settings we use to build this imported static mesh
* @EventParam VertexColorImportOption string Returns how the importer should import the vertex color
* @EventParam VertexOverrideColor string Returns the color use if we need to override the vertex color
* @EventParam AnimationLengthImportType string Returns how we choose the animation time span
* @EventParam DeleteExistingMorphTargetCurves boolean Returns whether the importer should delete the existing morph target curves
* @EventParam AnimationRange string Returns the range of animation the importer should sample if the time span is custom
* @EventParam DoNotImportCurveWithZero boolean Returns whether the importer should import curves containing only zero value
* @EventParam ImportBoneTracks boolean Returns whether the importer should import the bone tracks
* @EventParam ImportCustomAttribute boolean Returns whether the importer should import the custom attribute curves
* @EventParam PreserveLocalTransform boolean Returns whether the importer should preserve the local transform when importing the animation
* @EventParam RemoveRedundantKeys boolean Returns whether the importer should remove all redundant key in an animation
* @EventParam Resample boolean Returns whether the importer should re-sample the animation
* @EventParam SetMaterialDriveParameterOnCustomAttribute boolean Returns whether the importer should hook all custom attribute curve to unreal material attribute
* @EventParam SetMaterialDriveParameterOnCustomAttribute boolean Returns whether the importer should hook some custom attribute (having the suffix) curve to unreal material attribute
* @EventParam ResampleRate float Returns the rate the exporter is suppose to re-sample any imported animations
*
* @Owner Alexis.Matte
*/
FbxDocumentInfo* DocInfo = Scene->GetSceneInfo();
if (DocInfo)
{
if( FEngineAnalytics::IsAvailable() )
{
const static UEnum* FBXImportTypeEnum = StaticEnum<EFBXImportType>();
const static UEnum* FBXAnimationLengthImportTypeEnum = StaticEnum<EFBXAnimationLengthImportType>();
const static UEnum* MaterialSearchLocationEnum = StaticEnum<EMaterialSearchLocation>();
const static UEnum* FBXNormalGenerationMethodEnum = StaticEnum<EFBXNormalGenerationMethod::Type>();
const static UEnum* FBXNormalImportMethodEnum = StaticEnum<EFBXNormalImportMethod>();
const static UEnum* VertexColorImportOptionEnum = StaticEnum<EVertexColorImportOption::Type>();
TArray<FAnalyticsEventAttribute> Attribs;
FString LastSavedVendor(UTF8_TO_TCHAR(DocInfo->LastSaved_ApplicationVendor.Get().Buffer()));
FString LastSavedAppName(UTF8_TO_TCHAR(DocInfo->LastSaved_ApplicationName.Get().Buffer()));
FString LastSavedAppVersion(UTF8_TO_TCHAR(DocInfo->LastSaved_ApplicationVersion.Get().Buffer()));
Attribs.Add(FAnalyticsEventAttribute(TEXT("LastSaved Application Vendor"), LastSavedVendor));
Attribs.Add(FAnalyticsEventAttribute(TEXT("LastSaved Application Name"), LastSavedAppName));
Attribs.Add(FAnalyticsEventAttribute(TEXT("LastSaved Application Version"), LastSavedAppVersion));
Attribs.Add(FAnalyticsEventAttribute(TEXT("FBX Version"), FbxFileVersion));
//////////////////////////////////////////////////////////////////////////
//FBX import options
Attribs.Add(FAnalyticsEventAttribute(TEXT("GenOpt ImportType"), FBXImportTypeEnum->GetNameStringByValue(ImportOptions->ImportType)));
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxMainImport.cpp:1725
Scope (from outer to inner):
file
namespace UnFbx
function bool FFbxImporter::ImportFromFile
Source code excerpt:
Attribs.Add(FAnalyticsEventAttribute(TEXT("GenOpt ConvertSceneUnit"), ImportOptions->bConvertSceneUnit));
Attribs.Add(FAnalyticsEventAttribute(TEXT("GenOpt ForceFrontXAxis"), ImportOptions->bForceFrontXAxis));
Attribs.Add(FAnalyticsEventAttribute(TEXT("GenOpt ImportMaterials"), ImportOptions->bImportMaterials));
Attribs.Add(FAnalyticsEventAttribute(TEXT("GenOpt ImportTextures"), ImportOptions->bImportTextures));
Attribs.Add(FAnalyticsEventAttribute(TEXT("GenOpt InvertNormalMap"), ImportOptions->bInvertNormalMap));
Attribs.Add(FAnalyticsEventAttribute(TEXT("GenOpt RemoveNameSpace"), ImportOptions->bRemoveNameSpace));
Attribs.Add(FAnalyticsEventAttribute(TEXT("GenOpt UsedAsFullName"), ImportOptions->bUsedAsFullName));
Attribs.Add(FAnalyticsEventAttribute(TEXT("GenOpt ImportTranslation"), ImportOptions->ImportTranslation.ToString()));
Attribs.Add(FAnalyticsEventAttribute(TEXT("GenOpt ImportRotation"), ImportOptions->ImportRotation.ToString()));
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxMaterialImport.cpp:892
Scope (from outer to inner):
file
function void UnFbx::FFbxImporter::FindOrImportMaterialsFromNode
Source code excerpt:
MaterialImported = ExistingMaterial;
}
else if (ImportOptions->bImportMaterials)
{
//Only create a new material if we are importing them and we could not find an existing one.
MaterialImported = CreateUnrealMaterial(*FbxMaterial, UVSets, bForSkeletalMesh);
}
}
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxSceneImportData.cpp:39
Scope (from outer to inner):
file
function UnFbx::FBXImportOptions *JSONToFbxOption
Source code excerpt:
OptionObj->TryGetBoolField(TEXT("bImportScene"), Option->bImportScene);
OptionObj->TryGetBoolField(TEXT("bImportMaterials"), Option->bImportMaterials);
OptionObj->TryGetBoolField(TEXT("bInvertNormalMap"), Option->bInvertNormalMap);
OptionObj->TryGetBoolField(TEXT("bImportTextures"), Option->bImportTextures);
OptionObj->TryGetBoolField(TEXT("bImportLOD"), Option->bImportLOD);
OptionObj->TryGetBoolField(TEXT("bUsedAsFullName"), Option->bUsedAsFullName);
OptionObj->TryGetBoolField(TEXT("bConvertScene"), Option->bConvertScene);
OptionObj->TryGetBoolField(TEXT("bForceFrontXAxis"), Option->bForceFrontXAxis);
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxSceneImportData.cpp:161
Scope (from outer to inner):
file
function FString FbxOptionToJSON
Source code excerpt:
*OptionName,
Option->bImportScene ? 1 : 0,
Option->bImportMaterials ? 1 : 0,
Option->bInvertNormalMap ? 1 : 0,
Option->bImportTextures ? 1 : 0,
Option->bImportLOD ? 1 : 0,
Option->bUsedAsFullName ? 1 : 0,
Option->bConvertScene ? 1 : 0,
Option->bForceFrontXAxis ? 1 : 0,
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxSceneImportFactory.cpp:122
Scope (from outer to inner):
file
function bool GetFbxSceneImportOptions
Source code excerpt:
GlobalImportSettings->bImportTextures = true;
//Make sure Material get imported
GlobalImportSettings->bImportMaterials = true;
//Make sure skeletal mesh sections with the same material are combined (and not kept separate)
GlobalImportSettings->bKeepSectionsSeparate = false;
//TODO support T0AsRefPose
GlobalImportSettings->bUseT0AsRefPose = false;
GlobalImportSettings->ImportTranslation = FVector(0);
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxSkeletalMeshImport.cpp:1852
Scope (from outer to inner):
file
function USkeletalMesh* UnFbx::FFbxImporter::ImportSkeletalMesh
Source code excerpt:
//The backup of the skeletal mesh data empty the LOD array in the ImportedResource of the skeletal mesh
//If the import fail after this step the editor can crash when updating the bone later since the LODModel will not exist anymore
ExistSkelMeshDataPtr = SkeletalMeshImportUtils::SaveExistingSkelMeshData(ExistingSkelMesh, !ImportOptions->bImportMaterials, ImportSkeletalMeshArgs.LodIndex);
}
if (SkeletalMesh == nullptr)
{
//Backup the PostEditchangeStackCounter before overriding the skeletalmesh
int32 PostEditChangeStackCounter = ExistingSkelMesh != nullptr ? ExistingSkelMesh->GetPostEditChangeStackCounter() : 0;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxSkeletalMeshImport.cpp:2423
Scope (from outer to inner):
file
function USkeletalMesh* UnFbx::FFbxImporter::ReimportSkeletalMesh
Source code excerpt:
bool Old_ImportRigidMesh = ImportOptions->bImportRigidMesh;
bool Old_ImportMaterials = ImportOptions->bImportMaterials;
bool Old_ImportTextures = ImportOptions->bImportTextures;
bool Old_ImportAnimations = ImportOptions->bImportAnimations;
auto CleanUpImportOptionsData = [&]()
{
ImportOptions->bImportRigidMesh = Old_ImportRigidMesh;
ImportOptions->bImportMaterials = Old_ImportMaterials;
ImportOptions->bImportTextures = Old_ImportTextures;
ImportOptions->bImportAnimations = Old_ImportAnimations;
};
// support to update rigid animation mesh
ImportOptions->bImportRigidMesh = true;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxSkeletalMeshImport.cpp:2576
Scope (from outer to inner):
file
function USkeletalMesh* UnFbx::FFbxImporter::ReimportSkeletalMesh
Source code excerpt:
if (!ImportOptions->bImportScene)
{
ImportOptions->bImportMaterials = false;
ImportOptions->bImportTextures = false;
}
//In case of a scene reimport animations are reimport later so its ok to hardcode animation to false here
ImportOptions->bImportAnimations = false;
// check if there is LODGroup for this skeletal mesh
int32 MaxLODLevel = 1;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxSkeletalMeshImport.cpp:3204
Scope (from outer to inner):
file
function bool UnFbx::FFbxImporter::FillSkelMeshImporterFromFbx
Source code excerpt:
FindOrImportMaterialsFromNode(Node, Materials, UVSets, bForSkeletalMesh);
if (!ImportOptions->bImportMaterials && ImportOptions->bImportTextures)
{
//If we are not importing any new material, we might still want to import new textures.
ImportTexturesFromNode(Node);
}
// Maps local mesh material index to global material index
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxStaticMeshImport.cpp:421
Scope (from outer to inner):
file
function bool UnFbx::FFbxImporter::BuildStaticMeshFromGeometry
Source code excerpt:
FindOrImportMaterialsFromNode(Node, FbxMeshMaterials, FBXUVs.UVSets, bForSkeletalMesh);
if (!ImportOptions->bImportMaterials && ImportOptions->bImportTextures)
{
//If we are not importing any new material, we might still want to import new textures.
ImportTexturesFromNode(Node);
}
MaterialCount = Node->GetMaterialCount();
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/FbxStaticMeshImport.cpp:1527
Scope (from outer to inner):
file
function UStaticMesh* UnFbx::FFbxImporter::ReimportStaticMesh
Source code excerpt:
}
ImportOptions->bImportMaterials = false;
ImportOptions->bImportTextures = false;
// Before calling SaveExistingStaticMeshData() we must remove the existing fbx metadata as we don't want to restore those.
RemoveFBXMetaData(Mesh);
TSharedPtr<FExistingStaticMeshData> ExistMeshDataPtr = StaticMeshImportUtils::SaveExistingStaticMeshData(Mesh, ImportOptions, INDEX_NONE);
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/Fbx/ReimportFbxSceneFactory.cpp:236
Scope (from outer to inner):
file
function bool GetFbxSceneReImportOptions
Source code excerpt:
GlobalImportSettings->bImportTextures = true;
//Make sure Material get imported
GlobalImportSettings->bImportMaterials = true;
//TODO support T0AsRefPose
GlobalImportSettings->bUseT0AsRefPose = false;
//Make sure skeletal mesh sections with the same material are combined (and not kept separate)
GlobalImportSettings->bKeepSectionsSeparate = false;
//Make sure we do not mess with AutoComputeLodDistances when re-importing
GlobalImportSettings->bAutoComputeLodDistances = true;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/FbxMeshUtils.cpp:87
Scope (from outer to inner):
file
namespace FbxMeshUtils
namespace Private
function void SetupFbxImportOptions
Source code excerpt:
ImportOptions->StaticMeshLODGroup = BaseStaticMesh->LODGroup;
ImportOptions->bIsImportCancelable = false;
ImportOptions->bImportMaterials = false;
ImportOptions->bImportTextures = false;
ImportOptions->bAutoComputeLodDistances = true; //Setting auto compute distance to true will avoid changing the staticmesh flag
}
bool CopyHighResMeshDescription(UStaticMesh* SrcStaticMesh, UStaticMesh* BaseStaticMesh)
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/FbxMeshUtils.cpp:612
Scope (from outer to inner):
file
namespace FbxMeshUtils
function bool ImportSkeletalMeshLOD
Source code excerpt:
ApplyImportUIToImportOptions(ReimportUI, *ImportOptions);
}
ImportOptions->bImportMaterials = false;
ImportOptions->bImportTextures = false;
}
ImportOptions->bImportAnimations = false;
//Adjust the option in case we import only the skinning or the geometry
if (ImportOptions->bImportAsSkeletalSkinning)
{
ImportOptions->bImportMaterials = false;
ImportOptions->bImportTextures = false;
ImportOptions->bImportLOD = false;
ImportOptions->bImportSkeletalMeshLODs = false;
ImportOptions->bImportAnimations = false;
ImportOptions->bImportMorph = false;
}
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/ImportUtils/StaticMeshImportUtils.cpp:606
Scope (from outer to inner):
file
function TSharedPtr<FExistingStaticMeshData> StaticMeshImportUtils::SaveExistingStaticMeshData
Source code excerpt:
}
TSharedPtr<FExistingStaticMeshData> StaticMeshImportUtils::SaveExistingStaticMeshData(UStaticMesh* ExistingMesh, bool bImportMaterials, int32 LodIndex)
{
UnFbx::FBXImportOptions ImportOptions;
ImportOptions.bImportMaterials = bImportMaterials;
return SaveExistingStaticMeshData(ExistingMesh, &ImportOptions, LodIndex);
}
TSharedPtr<FExistingStaticMeshData> StaticMeshImportUtils::SaveExistingStaticMeshData(UStaticMesh* ExistingMesh, UnFbx::FBXImportOptions* ImportOptions, int32 LodIndex)
{
if (!ExistingMesh)
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/ImportUtils/StaticMeshImportUtils.cpp:620
Scope (from outer to inner):
file
function TSharedPtr<FExistingStaticMeshData> StaticMeshImportUtils::SaveExistingStaticMeshData
Source code excerpt:
}
bool bSaveMaterials = !ImportOptions->bImportMaterials;
TSharedPtr<FExistingStaticMeshData> ExistingMeshDataPtr = MakeShared<FExistingStaticMeshData>();
//Save the package UMetaData
TMap<FName, FString>* ExistingUMetaDataTagValues = UMetaData::GetMapForObject(ExistingMesh);
if(ExistingUMetaDataTagValues && ExistingUMetaDataTagValues->Num() > 0)
{
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Private/SkinWeightsUtilities.cpp:177
Scope (from outer to inner):
file
function bool FSkinWeightsUtilities::ImportAlternateSkinWeight
Source code excerpt:
FbxFactory->ImportUI->bAutomatedImportShouldDetectType = false;
FbxFactory->ImportUI->bCreatePhysicsAsset = false;
FbxFactory->ImportUI->bImportMaterials = false;
FbxFactory->ImportUI->bImportTextures = false;
FbxFactory->ImportUI->bImportMesh = true;
FbxFactory->ImportUI->bImportRigidMesh = false;
FbxFactory->ImportUI->bIsObjImport = false;
FbxFactory->ImportUI->bOverrideFullName = true;
FbxFactory->ImportUI->Skeleton = nullptr;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Public/FbxImporter.h:126
Scope (from outer to inner):
file
namespace UnFbx
Source code excerpt:
bool bImportAsSkeletalGeometry;
bool bImportAsSkeletalSkinning;
bool bImportMaterials;
bool bInvertNormalMap;
bool bImportTextures;
bool bImportLOD;
bool bUsedAsFullName;
bool bConvertScene;
bool bForceFrontXAxis;
#Loc: <Workspace>/Engine/Source/Editor/UnrealEd/Public/ImportUtils/StaticMeshImportUtils.h:136
Scope (from outer to inner):
file
namespace StaticMeshImportUtils
Source code excerpt:
UNREALED_API bool AddConvexGeomFromVertices(const TArray<FVector3f>& Verts, FKAggregateGeom* AggGeom, const TCHAR* ObjName);
UNREALED_API TSharedPtr<FExistingStaticMeshData> SaveExistingStaticMeshData(UStaticMesh* ExistingMesh, bool bImportMaterials, int32 LodIndex);
UNREALED_API TSharedPtr<FExistingStaticMeshData> SaveExistingStaticMeshData(UStaticMesh* ExistingMesh, UnFbx::FBXImportOptions* ImportOptions, int32 LodIndex);
/* This function is call before building the mesh when we do a re-import*/
UNREALED_API void RestoreExistingMeshSettings(const FExistingStaticMeshData* ExistingMesh, UStaticMesh* NewMesh, int32 LODIndex);