本文整理汇总了C++中UObject::MarkPackageDirty方法的典型用法代码示例。如果您正苦于以下问题:C++ UObject::MarkPackageDirty方法的具体用法?C++ UObject::MarkPackageDirty怎么用?C++ UObject::MarkPackageDirty使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类UObject
的用法示例。
在下文中一共展示了UObject::MarkPackageDirty方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: DuplicateAsset
/**
* Duplicates the asset
*/
void DuplicateAsset()
{
if (AssetPackage && CreatedAsset)
{
const FString NewObjectName = FString::Printf(TEXT("%s_Copy"), *AssetName);
const FString NewPackageName = FString::Printf(TEXT("%s/%s"), *GetGamePath(), *NewObjectName);
// Make sure the referenced object is deselected before duplicating it.
GEditor->GetSelectedObjects()->Deselect(CreatedAsset);
// Duplicate the asset
DuplicatedPackage = CreatePackage(NULL, *NewPackageName);
DuplicatedAsset = StaticDuplicateObject(CreatedAsset, DuplicatedPackage, *NewObjectName);
if (DuplicatedAsset)
{
DuplicatedAsset->MarkPackageDirty();
// Notify the asset registry
FAssetRegistryModule::AssetCreated(DuplicatedAsset);
TestStats->NumDuplicated++;
UE_LOG(LogEditorAssetAutomationTests, Display, TEXT("Duplicated asset %s to %s (%s)"), *AssetName, *NewObjectName, *Class->GetName());
}
else
{
UE_LOG(LogEditorAssetAutomationTests, Error, TEXT("Failed to duplicate asset %s (%s)"), *AssetName, *Class->GetName());
}
}
}
示例2: ExecuteCreateStatic
void FAssetTypeActions_TextureRenderTarget::ExecuteCreateStatic(TArray<TWeakObjectPtr<UTextureRenderTarget>> Objects)
{
for (auto ObjIt = Objects.CreateConstIterator(); ObjIt; ++ObjIt)
{
auto Object = (*ObjIt).Get();
if ( Object )
{
FString Name;
FString PackageName;
CreateUniqueAssetName(Object->GetOutermost()->GetName(), TEXT("_Tex"), PackageName, Name);
UObject* NewObj = NULL;
UTextureRenderTarget2D* TexRT = Cast<UTextureRenderTarget2D>(Object);
UTextureRenderTargetCube* TexRTCube = Cast<UTextureRenderTargetCube>(Object);
if( TexRTCube )
{
// create a static cube texture as well as its 6 faces
NewObj = TexRTCube->ConstructTextureCube( CreatePackage(NULL,*PackageName), Name, Object->GetMaskedFlags() );
}
else if( TexRT )
{
// create a static 2d texture
NewObj = TexRT->ConstructTexture2D( CreatePackage(NULL,*PackageName), Name, Object->GetMaskedFlags(), CTF_Default, NULL );
}
if( NewObj )
{
// package needs saving
NewObj->MarkPackageDirty();
// Notify the asset registry
FAssetRegistryModule::AssetCreated(NewObj);
}
}
}
}
开发者ID:JustDo1989,项目名称:UnrealEngine4.11-HairWorks,代码行数:36,代码来源:AssetTypeActions_TextureRenderTarget.cpp
示例3: NullReferencesToObject
/**
* Nulls out references to a given object
*
* @param InObject - Object to null references to
*/
void NullReferencesToObject(UObject* InObject)
{
TArray<UObject*> ReplaceableObjects;
TMap<UObject*, UObject*> ReplacementMap;
ReplacementMap.Add(InObject, NULL);
ReplacementMap.GenerateKeyArray(ReplaceableObjects);
// Find all the properties (and their corresponding objects) that refer to any of the objects to be replaced
TMap< UObject*, TArray<UProperty*> > ReferencingPropertiesMap;
for (FObjectIterator ObjIter; ObjIter; ++ObjIter)
{
UObject* CurObject = *ObjIter;
// Find the referencers of the objects to be replaced
FFindReferencersArchive FindRefsArchive(CurObject, ReplaceableObjects);
// Inform the object referencing any of the objects to be replaced about the properties that are being forcefully
// changed, and store both the object doing the referencing as well as the properties that were changed in a map (so that
// we can correctly call PostEditChange later)
TMap<UObject*, int32> CurNumReferencesMap;
TMultiMap<UObject*, UProperty*> CurReferencingPropertiesMMap;
if (FindRefsArchive.GetReferenceCounts(CurNumReferencesMap, CurReferencingPropertiesMMap) > 0)
{
TArray<UProperty*> CurReferencedProperties;
CurReferencingPropertiesMMap.GenerateValueArray(CurReferencedProperties);
ReferencingPropertiesMap.Add(CurObject, CurReferencedProperties);
for (TArray<UProperty*>::TConstIterator RefPropIter(CurReferencedProperties); RefPropIter; ++RefPropIter)
{
CurObject->PreEditChange(*RefPropIter);
}
}
}
// Iterate over the map of referencing objects/changed properties, forcefully replacing the references and then
// alerting the referencing objects the change has completed via PostEditChange
int32 NumObjsReplaced = 0;
for (TMap< UObject*, TArray<UProperty*> >::TConstIterator MapIter(ReferencingPropertiesMap); MapIter; ++MapIter)
{
++NumObjsReplaced;
UObject* CurReplaceObj = MapIter.Key();
const TArray<UProperty*>& RefPropArray = MapIter.Value();
FArchiveReplaceObjectRef<UObject> ReplaceAr(CurReplaceObj, ReplacementMap, false, true, false);
for (TArray<UProperty*>::TConstIterator RefPropIter(RefPropArray); RefPropIter; ++RefPropIter)
{
FPropertyChangedEvent PropertyEvent(*RefPropIter);
CurReplaceObj->PostEditChangeProperty(PropertyEvent);
}
if (!CurReplaceObj->HasAnyFlags(RF_Transient) && CurReplaceObj->GetOutermost() != GetTransientPackage())
{
if (!CurReplaceObj->RootPackageHasAnyFlags(PKG_CompiledIn))
{
CurReplaceObj->MarkPackageDirty();
}
}
}
}
示例4: PasteNodesHere
void FNiagaraEditor::PasteNodesHere(const FVector2D& Location)
{
TSharedPtr<SGraphEditor> CurrentGraphEditor = NodeGraphEditorPtr.Pin();
if (!CurrentGraphEditor.IsValid())
{
return;
}
// Undo/Redo support
const FScopedTransaction Transaction(FGenericCommands::Get().Paste->GetDescription());
UEdGraph* EdGraph = Cast<UEdGraph>(CurrentGraphEditor->GetCurrentGraph());
EdGraph->Modify();
const FGraphPanelSelectionSet SelectedNodes = CurrentGraphEditor->GetSelectedNodes();
// Clear the selection set (newly pasted stuff will be selected)
CurrentGraphEditor->ClearSelectionSet();
// Grab the text to paste from the clipboard.
FString TextToImport;
FPlatformMisc::ClipboardPaste(TextToImport);
// Import the nodes
TSet<UEdGraphNode*> PastedNodes;
FEdGraphUtilities::ImportNodesFromText(EdGraph, TextToImport, /*out*/ PastedNodes);
//Average position of nodes so we can move them while still maintaining relative distances to each other
FVector2D AvgNodePosition(0.0f, 0.0f);
for (TSet<UEdGraphNode*>::TIterator It(PastedNodes); It; ++It)
{
UEdGraphNode* Node = (*It);
if (Node)
{
AvgNodePosition.X += Node->NodePosX;
AvgNodePosition.Y += Node->NodePosY;
}
}
if (PastedNodes.Num() > 0)
{
float InvNumNodes = 1.0f / float(PastedNodes.Num());
AvgNodePosition.X *= InvNumNodes;
AvgNodePosition.Y *= InvNumNodes;
}
for (TSet<UEdGraphNode*>::TIterator It(PastedNodes); It; ++It)
{
UEdGraphNode* PasteNode = (*It);
if (PasteNode)
{
// Select the newly pasted stuff
CurrentGraphEditor->SetNodeSelection(PasteNode, true);
PasteNode->NodePosX = (PasteNode->NodePosX - AvgNodePosition.X) + Location.X;
PasteNode->NodePosY = (PasteNode->NodePosY - AvgNodePosition.Y) + Location.Y;
PasteNode->SnapToGrid(16);
// Give new node a different Guid from the old one
PasteNode->CreateNewGuid();
}
}
// Update UI
CurrentGraphEditor->NotifyGraphChanged();
UObject* GraphOwner = EdGraph->GetOuter();
if (GraphOwner)
{
GraphOwner->PostEditChange();
GraphOwner->MarkPackageDirty();
}
}
示例5: Logger
//.........这里部分代码省略.........
if (RootNodeToImport && InterestingNodeCount > 0)
{
int32 NodeIndex = 0;
int32 ImportedMeshCount = 0;
UStaticMesh* NewStaticMesh = NULL;
if ( ImportUI->MeshTypeToImport == FBXIT_StaticMesh ) // static mesh
{
if (bCombineMeshes)
{
TArray<FbxNode*> FbxMeshArray;
FbxImporter->FillFbxMeshArray(RootNodeToImport, FbxMeshArray, FbxImporter);
if (FbxMeshArray.Num() > 0)
{
NewStaticMesh = FbxImporter->ImportStaticMeshAsSingle(InParent, FbxMeshArray, Name, Flags, ImportUI->StaticMeshImportData, NULL, 0);
}
ImportedMeshCount = NewStaticMesh ? 1 : 0;
}
else
{
TArray<UObject*> AllNewAssets;
UObject* Object = RecursiveImportNode(FbxImporter,RootNodeToImport,InParent,Name,Flags,NodeIndex,InterestingNodeCount, AllNewAssets);
NewStaticMesh = Cast<UStaticMesh>( Object );
// Make sure to notify the asset registry of all assets created other than the one returned, which will notify the asset registry automatically.
for ( auto AssetIt = AllNewAssets.CreateConstIterator(); AssetIt; ++AssetIt )
{
UObject* Asset = *AssetIt;
if ( Asset != NewStaticMesh )
{
FAssetRegistryModule::AssetCreated(Asset);
Asset->MarkPackageDirty();
}
}
ImportedMeshCount = AllNewAssets.Num();
}
// Importing static mesh sockets only works if one mesh is being imported
if( ImportedMeshCount == 1 && NewStaticMesh )
{
FbxImporter->ImportStaticMeshSockets( NewStaticMesh );
}
NewObject = NewStaticMesh;
}
else if ( ImportUI->MeshTypeToImport == FBXIT_SkeletalMesh )// skeletal mesh
{
int32 TotalNumNodes = 0;
for (int32 i = 0; i < SkelMeshArray.Num(); i++)
{
TArray<FbxNode*> NodeArray = *SkelMeshArray[i];
TotalNumNodes += NodeArray.Num();
// check if there is LODGroup for this skeletal mesh
int32 MaxLODLevel = 1;
for (int32 j = 0; j < NodeArray.Num(); j++)
{
FbxNode* Node = NodeArray[j];
if (Node->GetNodeAttribute() && Node->GetNodeAttribute()->GetAttributeType() == FbxNodeAttribute::eLODGroup)
{
// get max LODgroup level
示例6: ProcessModifications
void FContentDirectoryMonitor::ProcessModifications(const DirectoryWatcher::FTimeLimit& TimeLimit, TArray<UPackage*>& OutPackagesToSave, FReimportFeedbackContext& Context)
{
auto* ReimportManager = FReimportManager::Instance();
for (int32 Index = 0; Index < ModifiedFiles.Num(); ++Index)
{
Context.MainTask->EnterProgressFrame();
auto& Change = ModifiedFiles[Index];
const FString FullFilename = Cache.GetDirectory() + Change.Filename.Get();
// Move the asset before reimporting it. We always reimport moved assets to ensure that their import path is up to date
if (Change.Action == DirectoryWatcher::EFileAction::Moved)
{
const FString OldFilename = Cache.GetDirectory() + Change.MovedFromFilename.Get();
const auto Assets = Utils::FindAssetsPertainingToFile(*Registry, OldFilename);
if (Assets.Num() == 1)
{
UObject* Asset = Assets[0].GetAsset();
if (Asset && Utils::ExtractSourceFilePaths(Asset).Num() == 1)
{
UPackage* ExistingPackage = Asset->GetOutermost();
const bool bAssetWasDirty = IsAssetDirty(Asset);
const FString NewAssetName = ObjectTools::SanitizeObjectName(FPaths::GetBaseFilename(Change.Filename.Get()));
const FString PackagePath = PackageTools::SanitizePackageName(MountedContentPath / FPaths::GetPath(Change.Filename.Get()));
const FString FullDestPath = PackagePath / NewAssetName;
if (ExistingPackage && ExistingPackage->FileName.ToString() == FullDestPath)
{
// No need to process this asset - it's already been moved to the right location
Cache.CompleteTransaction(MoveTemp(Change));
continue;
}
const FText SrcPathText = FText::FromString(Assets[0].PackageName.ToString()),
DstPathText = FText::FromString(FullDestPath);
if (FPackageName::DoesPackageExist(*FullDestPath))
{
Context.AddMessage(EMessageSeverity::Warning, FText::Format(LOCTEXT("MoveWarning_ExistingAsset", "Can't move {0} to {1} - one already exists."), SrcPathText, DstPathText));
}
else
{
TArray<FAssetRenameData> RenameData;
RenameData.Emplace(Asset, PackagePath, NewAssetName);
Context.AddMessage(EMessageSeverity::Info, FText::Format(LOCTEXT("Success_MovedAsset", "Moving asset {0} to {1}."), SrcPathText, DstPathText));
FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools").Get().RenameAssets(RenameData);
TArray<FString> Filenames;
Filenames.Add(FullFilename);
// Update the reimport file names
FReimportManager::Instance()->UpdateReimportPaths(Asset, Filenames);
Asset->MarkPackageDirty();
if (!bAssetWasDirty)
{
OutPackagesToSave.Add(Asset->GetOutermost());
}
}
}
}
}
else
{
// Modifications or additions are treated the same by this point
for (const auto& AssetData : Utils::FindAssetsPertainingToFile(*Registry, FullFilename))
{
if (UObject* Asset = AssetData.GetAsset())
{
ReimportAsset(Asset, FullFilename, OutPackagesToSave, Context);
}
}
}
// Let the cache know that we've dealt with this change
Cache.CompleteTransaction(MoveTemp(Change));
if (TimeLimit.Exceeded())
{
ModifiedFiles.RemoveAt(0, Index + 1);
return;
}
}
ModifiedFiles.Empty();
}
示例7: if
//.........这里部分代码省略.........
}
}
Factories.Sort([](const UFactory& A, const UFactory& B) -> bool
{
// First sort so that higher priorities are earlier in the list
if( A.ImportPriority > B.ImportPriority )
{
return true;
}
else if( A.ImportPriority < B.ImportPriority )
{
return false;
}
// Then sort so that factories that only create new assets are tried after those that actually import the file data (when they have an equivalent priority)
const bool bFactoryAImportsFiles = !A.CanCreateNew();
const bool bFactoryBImportsFiles = !B.CanCreateNew();
if( bFactoryAImportsFiles && !bFactoryBImportsFiles )
{
return true;
}
return false;
});
}
bool bLoadedFile = false;
// Try each factory in turn.
for( int32 i=0; i<Factories.Num(); i++ )
{
UFactory* Factory = Factories[i];
UObject* Result = NULL;
if( Factory->CanCreateNew() )
{
UE_LOG(LogFactory, Log, TEXT("FactoryCreateNew: %s with %s (%i %i %s)"), *Class->GetName(), *Factories[i]->GetClass()->GetName(), Factory->bCreateNew, Factory->bText, Filename );
Factory->ParseParms( Parms );
Result = Factory->FactoryCreateNew( Class, InOuter, Name, Flags, NULL, Warn );
}
else if( FCString::Stricmp(Filename,TEXT(""))!=0 )
{
if( Factory->bText )
{
//UE_LOG(LogFactory, Log, TEXT("FactoryCreateText: %s with %s (%i %i %s)"), *Class->GetName(), *Factories(i)->GetClass()->GetName(), Factory->bCreateNew, Factory->bText, Filename );
FString Data;
if( FFileHelper::LoadFileToString( Data, Filename ) )
{
bLoadedFile = true;
const TCHAR* Ptr = *Data;
Factory->ParseParms( Parms );
Result = Factory->FactoryCreateText( Class, InOuter, Name, Flags, NULL, *FPaths::GetExtension(Filename), Ptr, Ptr+Data.Len(), Warn );
}
}
else
{
UE_LOG(LogFactory, Log, TEXT("FactoryCreateBinary: %s with %s (%i %i %s)"), *Class->GetName(), *Factories[i]->GetClass()->GetName(), Factory->bCreateNew, Factory->bText, Filename );
// Sanity check the file size of the impending import and prompt the user if they wish to continue if the file size is very large
const int32 FileSize = IFileManager::Get().FileSize( Filename );
bool bValidFileSize = true;
if ( FileSize == INDEX_NONE )
{
UE_LOG(LogFactory, Error,TEXT("File '%s' does not exist"), Filename );
bValidFileSize = false;
}
TArray<uint8> Data;
if( bValidFileSize && FFileHelper::LoadFileToArray( Data, Filename ) )
{
bLoadedFile = true;
Data.Add( 0 );
const uint8* Ptr = &Data[ 0 ];
Factory->ParseParms( Parms );
Result = Factory->FactoryCreateBinary( Class, InOuter, Name, Flags, NULL, *FPaths::GetExtension(Filename), Ptr, Ptr+Data.Num()-1, Warn, bOutOperationCanceled );
}
}
}
if( Result )
{
// prevent UTextureCube created from UTextureFactory check(Result->IsA(Class));
Result->MarkPackageDirty();
ULevel::LevelDirtiedEvent.Broadcast();
Result->PostEditChange();
CurrentFilename = TEXT("");
return Result;
}
}
if ( !bLoadedFile && !bOutOperationCanceled )
{
Warn->Logf( *FText::Format( NSLOCTEXT( "UnrealEd", "NoFindImport", "Can't find file '{0}' for import" ), FText::FromString( FString(Filename) ) ).ToString() );
}
CurrentFilename = TEXT("");
return NULL;
}