haxis/Plugins/PolishBuildings/Source/Private/BuildingsProxyTool/BuildingsProxyTool.cpp

129 lines
3.8 KiB
C++

// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
#include "PolishBuildingsPrivatePCH.h"
#include "BuildingsProxyTool.h"
#include "SBuildingsProxyDialog.h"
#include "MeshUtilities.h"
#include "ContentBrowserModule.h"
#include "AssetRegistryModule.h"
#include "Engine/StaticMeshActor.h"
#include "Engine/StaticMesh.h"
#include "Engine/Selection.h"
#define LOCTEXT_NAMESPACE "BuildingsProxyTool"
TSharedRef<SWidget> FBuildingsProxyTool::GetWidget()
{
return SNew(SBuildingsProxyDialog, this);
}
FText FBuildingsProxyTool::GetTooltipText() const
{
return LOCTEXT("BuildingsProxyToolTooltip", "Harvest geometry from selected actors and merge them into single mesh.");
}
FString FBuildingsProxyTool::GetDefaultPackageName() const
{
FString PackageName;
USelection* SelectedActors = GEditor->GetSelectedActors();
// Iterate through selected actors and find first static mesh asset
// Use this static mesh path as destination package name for a merged mesh
for (FSelectionIterator Iter(*SelectedActors); Iter; ++Iter)
{
AActor* Actor = Cast<AActor>(*Iter);
if (Actor)
{
TInlineComponentArray<UStaticMeshComponent*> SMComponets;
Actor->GetComponents<UStaticMeshComponent>(SMComponets);
for (UStaticMeshComponent* Component : SMComponets)
{
if (Component->StaticMesh)
{
PackageName = FPackageName::GetLongPackagePath(Component->StaticMesh->GetOutermost()->GetName());
PackageName += FString(TEXT("/PROXY_")) + Component->StaticMesh->GetName();
break;
}
}
}
if (!PackageName.IsEmpty())
{
break;
}
}
if (PackageName.IsEmpty())
{
PackageName = FPackageName::FilenameToLongPackageName(FPaths::GameContentDir() + TEXT("PROXY"));
PackageName = MakeUniqueObjectName(NULL, UPackage::StaticClass(), *PackageName).ToString();
}
return PackageName;
}
bool FBuildingsProxyTool::RunMerge(const FString& PackageName)
{
TArray<AActor*> Actors;
TArray<UObject*> AssetsToSync;
//Get the module for the proxy mesh utilities
IMeshUtilities& MeshUtilities = FModuleManager::Get().LoadModuleChecked<IMeshUtilities>("MeshUtilities");
USelection* SelectedActors = GEditor->GetSelectedActors();
for (FSelectionIterator Iter(*SelectedActors); Iter; ++Iter)
{
AActor* Actor = Cast<AActor>(*Iter);
if (Actor)
{
Actors.Add(Actor);
}
}
if (Actors.Num())
{
GWarn->BeginSlowTask(LOCTEXT("BuildingsProxy_CreatingProxy", "Creating Mesh Proxy"), true);
GEditor->BeginTransaction(LOCTEXT("BuildingsProxy_Create", "Creating Mesh Proxy"));
FVector ProxyLocation = FVector::ZeroVector;
FCreateProxyDelegate ProxyDelegate;
ProxyDelegate.BindLambda(
[]( const FGuid Guid, TArray<UObject*>& InAssetsToSync )
{
//Update the asset registry that a new static mash and material has been created
if ( InAssetsToSync.Num() )
{
FAssetRegistryModule& AssetRegistry = FModuleManager::Get().LoadModuleChecked<FAssetRegistryModule>( "AssetRegistry" );
int32 AssetCount = InAssetsToSync.Num();
for ( int32 AssetIndex = 0; AssetIndex < AssetCount; AssetIndex++ )
{
AssetRegistry.AssetCreated( InAssetsToSync[AssetIndex] );
GEditor->BroadcastObjectReimported( InAssetsToSync[AssetIndex] );
}
//Also notify the content browser that the new assets exists
FContentBrowserModule& ContentBrowserModule = FModuleManager::Get().LoadModuleChecked<FContentBrowserModule>( "ContentBrowser" );
ContentBrowserModule.Get().SyncBrowserToAssets( InAssetsToSync, true );
}
} );
FGuid JobGuid = FGuid::NewGuid();
MeshUtilities.CreateProxyMesh( Actors, ProxySettings, NULL, PackageName, JobGuid, ProxyDelegate );
GEditor->EndTransaction();
GWarn->EndSlowTask();
}
return true;
}
#undef LOCTEXT_NAMESPACE