UObject* UFbxFactory::ImportANode(void* VoidFbxImporter, void* VoidNode, UObject* InParent, FName InName, EObjectFlags Flags, int32& NodeIndex, int32 Total, UObject* InMesh, int LODIndex) { UnFbx::FFbxImporter* FFbxImporter = (UnFbx::FFbxImporter*)VoidFbxImporter; FbxNode* Node = (FbxNode*)VoidNode; UObject* NewObject = NULL; FName OutputName = FFbxImporter->MakeNameForMesh(InName.ToString(), Node); { // skip collision models FbxString NodeName(Node->GetName()); if ( NodeName.Find("UCX") != -1 || NodeName.Find("MCDCX") != -1 || NodeName.Find("UBX") != -1 || NodeName.Find("USP") != -1 ) { return NULL; } NewObject = FFbxImporter->ImportStaticMesh( InParent, Node, OutputName, Flags, ImportUI->StaticMeshImportData, Cast<UStaticMesh>(InMesh), LODIndex ); } if (NewObject) { NodeIndex++; FFormatNamedArguments Args; Args.Add( TEXT("NodeIndex"), NodeIndex ); Args.Add( TEXT("ArrayLength"), Total ); GWarn->StatusUpdate( NodeIndex, Total, FText::Format( NSLOCTEXT("UnrealEd", "Importingf", "Importing ({NodeIndex} of {ArrayLength})"), Args ) ); } return NewObject; }
EReimportResult::Type UReimportFbxSceneFactory::ImportStaticMesh(void* VoidFbxImporter, TSharedPtr<FFbxMeshInfo> MeshInfo, TSharedPtr<FFbxSceneInfo> SceneInfoPtr) { UnFbx::FFbxImporter* FbxImporter = (UnFbx::FFbxImporter*)VoidFbxImporter; //FEditorDelegates::OnAssetPreImport.Broadcast(this, UStaticMesh::StaticClass(), GWorld, FName(""), TEXT("fbx")); FbxNode *GeometryParentNode = nullptr; //Get the first parent geometry node for (int idx = 0; idx < FbxImporter->Scene->GetGeometryCount(); ++idx) { FbxGeometry *Geometry = FbxImporter->Scene->GetGeometry(idx); if (Geometry->GetUniqueID() == MeshInfo->UniqueId) { GeometryParentNode = Geometry->GetNode(); break; } } if (GeometryParentNode == nullptr) { FbxImporter->AddTokenizedErrorMessage(FTokenizedMessage::Create(EMessageSeverity::Error, FText::Format(FText::FromString("Reimport Mesh {0} fail, the mesh dont have any parent node inside the fbx."), FText::FromString(MeshInfo->GetImportPath()))), FName(TEXT("Reimport Fbx Scene"))); return EReimportResult::Failed; } FString PackageName = MeshInfo->GetImportPath(); FString StaticMeshName; UPackage* Pkg = CreatePackageForNode(PackageName, StaticMeshName); if (Pkg == nullptr) { return EReimportResult::Failed; } //Copy default options to StaticMeshImportData SFbxSceneOptionWindow::CopyFbxOptionsToStaticMeshOptions(GlobalImportSettingsReference, SceneImportOptionsStaticMesh); SceneImportOptionsStaticMesh->FillStaticMeshInmportData(StaticMeshImportData, SceneImportOptions); UnFbx::FBXImportOptions* OverrideImportSettings = GetOptionsFromName(MeshInfo->OptionName); if (OverrideImportSettings != nullptr) { SFbxSceneOptionWindow::CopyFbxOptionsToFbxOptions(OverrideImportSettings, GlobalImportSettings); SFbxSceneOptionWindow::CopyFbxOptionsToStaticMeshOptions(OverrideImportSettings, SceneImportOptionsStaticMesh); } else { SFbxSceneOptionWindow::CopyFbxOptionsToFbxOptions(GlobalImportSettingsReference, GlobalImportSettings); SFbxSceneOptionWindow::CopyFbxOptionsToStaticMeshOptions(GlobalImportSettingsReference, SceneImportOptionsStaticMesh); } SceneImportOptionsStaticMesh->FillStaticMeshInmportData(StaticMeshImportData, SceneImportOptions); FName StaticMeshFName = FName(*(MeshInfo->Name)); UStaticMesh *NewObject = FbxImporter->ImportStaticMesh(Pkg, GeometryParentNode, StaticMeshFName, EObjectFlags::RF_Standalone, StaticMeshImportData ); if (NewObject == nullptr) { return EReimportResult::Failed; } AllNewAssets.Add(MeshInfo, NewObject); AssetToSyncContentBrowser.Add(NewObject); return EReimportResult::Succeeded; }
void FDestructibleMeshEditorViewportClient::ImportFBXChunks() { // Get the FBX that we want to import TArray<FString> OpenFilenames; IDesktopPlatform* DesktopPlatform = FDesktopPlatformModule::Get(); bool bOpened = false; if (DesktopPlatform != NULL) { bOpened = DesktopPlatform->OpenFileDialog( NULL, NSLOCTEXT("UnrealEd", "ImportMatineeSequence", "Import UnrealMatinee Sequence").ToString(), *(FEditorDirectories::Get().GetLastDirectory(ELastDirectory::GENERIC_IMPORT)), TEXT(""), TEXT("FBX document|*.fbx"), EFileDialogFlags::None, OpenFilenames); } if (bOpened) { // Get the filename from dialog FString ImportFilename = OpenFilenames[0]; FString FileName = OpenFilenames[0]; FEditorDirectories::Get().SetLastDirectory(ELastDirectory::GENERIC_IMPORT, FPaths::GetPath(FileName)); // Save path as default for next time. const FString FileExtension = FPaths::GetExtension(FileName); const bool bIsFBX = FCString::Stricmp(*FileExtension, TEXT("FBX")) == 0; if (bIsFBX) { FlushRenderingCommands(); UnFbx::FFbxImporter* FFbxImporter = UnFbx::FFbxImporter::GetInstance(); if (FFbxImporter->ImportFromFile( *ImportFilename, FPaths::GetExtension( ImportFilename ) ) ) { TArray<FbxNode*> FbxMeshArray; FFbxImporter->FillFbxMeshArray(FFbxImporter->Scene->GetRootNode(), FbxMeshArray, FFbxImporter); UFbxStaticMeshImportData* ImportData = NewObject<UFbxStaticMeshImportData>(GetTransientPackage(), NAME_None, RF_NoFlags, NULL); TArray<UStaticMesh*> ChunkMeshes; for (int32 i=0; i < FbxMeshArray.Num(); ++i) { UStaticMesh* TempStaticMesh = NULL; TempStaticMesh = (UStaticMesh*)FFbxImporter->ImportStaticMesh(GetTransientPackage(), FbxMeshArray[i], NAME_None, RF_NoFlags, ImportData, 0); ChunkMeshes.Add(TempStaticMesh); } UDestructibleMesh* DestructibleMesh = DestructibleMeshEditorPtr.Pin()->GetDestructibleMesh(); if (DestructibleMesh) { DestructibleMesh->SetupChunksFromStaticMeshes(ChunkMeshes); } } FFbxImporter->ReleaseScene(); // Update the viewport DestructibleMeshEditorPtr.Pin()->RefreshTool(); DestructibleMeshEditorPtr.Pin()->SetCurrentPreviewDepth(0xFFFFFFFF); // This will get clamped to the max depth } else { // Invalid filename } } #if WITH_APEX #endif // WITH_APEX }