Advertisement
Guest User

Untitled

a guest
Oct 1st, 2019
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. template<typename T>
  2. T * GetBlueprintCDO(UBlueprint * Blueprint)
  3. {
  4.     if (Blueprint == nullptr) return nullptr;
  5.     const UClass * BlueprintClass = Blueprint->Generated${1}< ${3} >
  6.     return Cast<T>(BlueprintClass->ClassDefaultObject);
  7. }
  8.  
  9. UENUM(BlueprintType)        //"BlueprintType" is essential to include
  10. enum class ESpineFilePairType : uint8
  11. {
  12.     FP_Atlas                UMETA(DisplayName = "Atlas"),
  13.     FP_Skeleton         UMETA(DisplayName = "Skeleton")
  14. };
  15.  
  16. USTRUCT(BlueprintType)
  17. struct FSpineFilePair
  18. {
  19.     GENERATED_USTRUCT_BODY()
  20.  
  21.         UPROPERTY()
  22.         USpineAtlasAsset * Atlas = nullptr;
  23.  
  24.     UPROPERTY()
  25.         USpineSkeletonDataAsset * Skeleton = nullptr;
  26.  
  27.     UPROPERTY()
  28.         FString AssetName;
  29.  
  30.     UPROPERTY()
  31.         FString AssetPath;
  32.  
  33.     UPROPERTY()
  34.         FString PackagePath;
  35.  
  36. };
  37.  
  38. void UPAndBEditorUtilityWidget::CreateSpineBlueprint()
  39. {
  40.     // Assign stuff that was selected
  41.     IContentBrowserSingleton& ContentBrowser = FModuleManager::LoadModuleChecked<FContentBrowserModule>("ContentBrowser").Get();
  42.     static TArray <FAssetData> SelectedAssets;
  43.     ContentBrowser.GetSelectedAssets(SelectedAssets);
  44.     if (SelectedAssets.Num < 2) return;
  45.  
  46.     FString AssetName = FString("NameNotFound");
  47.     FString AssetPath = FString("../../../Poppy and Buddy/Content/");
  48.     FString PackagePath = FString("/Game/Poppy and Buddy/SpineActors");
  49.  
  50.     USpineSkeletonDataAsset * SpineSkeleton = nullptr;
  51.     USpineAtlasAsset * SpineAtlas = nullptr;
  52.  
  53.     TMap <FString, FSpineFilePair> FilePair;
  54.     TArray <FString> Pairs;
  55.  
  56.     for (FAssetData Data : SelectedAssets) {
  57.         ESpineFilePairType Type;
  58.         if (Data.GetClass() == USpineSkeletonDataAsset::StaticClass()) {
  59.             SpineSkeleton = (USpineSkeletonDataAsset *)Data.GetAsset();
  60.             Type = ESpineFilePairType::FP_Skeleton;
  61.         }
  62.         else if (Data.GetClass() == USpineAtlasAsset::StaticClass()) {
  63.             SpineAtlas = (USpineAtlasAsset *)Data.GetAsset();
  64.             Type = ESpineFilePairType::FP_Atlas;
  65.         }
  66.         else continue;
  67.  
  68.         FString Left, Right;
  69.  
  70.         Data.AssetName.ToString().Split(TEXT("-"), &Left, &Right, ESearchCase::IgnoreCase, ESearchDir::FromEnd);
  71.         //AssetName = Left + FString(".") + Left + FString("-spine");
  72.         AssetName = Left + FString("-spine");
  73.  
  74.  
  75.         Data.PackageName.ToString().Split(TEXT("/"), &Left, &Right, ESearchCase::IgnoreCase, ESearchDir::FromEnd);
  76.         AssetPath = Left + FString("/");
  77.  
  78.         PackagePath = Data.PackageName.ToString() + FString(TEXT("-spine"));
  79.  
  80.         if (!FilePair.Find(AssetName)) {
  81.             FilePair.Add(AssetName, FSpineFilePair());
  82.             Pairs.Add(AssetName);
  83.         }
  84.         if (Type == ESpineFilePairType::FP_Atlas)
  85.             FilePair.Find(AssetName)->Atlas = SpineAtlas;
  86.         if (Type == ESpineFilePairType::FP_Skeleton)
  87.             FilePair.Find(AssetName)->Skeleton = SpineSkeleton;
  88.  
  89.         FilePair.Find(AssetName)->AssetName = AssetName;
  90.         FilePair.Find(AssetName)->AssetPath = AssetPath;
  91.         FilePair.Find(AssetName)->PackagePath = PackagePath;
  92.  
  93.         //UE_LOG(LogTemp, Warning, TEXT("[Package] "));
  94.         //UE_LOG(LogTemp, Warning, TEXT("[Package] AssetName: %s"), *Data.AssetName.ToString());
  95.         //UE_LOG(LogTemp, Warning, TEXT("[Package] GetExportTextName: %s"), *Data.GetExportTextName());
  96.         //UE_LOG(LogTemp, Warning, TEXT("[Package] GetFullName: %s"), *Data.GetFullName());
  97.         //UE_LOG(LogTemp, Warning, TEXT("[Package] PackageName: %s"), *Data.PackageName.ToString());
  98.         //UE_LOG(LogTemp, Warning, TEXT("[Package] ObjectPath: %s"), *Data.ObjectPath.ToString());
  99.         //UE_LOG(LogTemp, Warning, TEXT("[Package] PackagePath: %s"), *Data.PackagePath.ToString());
  100.         //UE_LOG(LogTemp, Warning, TEXT("[Package] "));
  101.     }
  102.  
  103.     //UE_LOG(LogTemp, Warning, TEXT("[Package] AssetName: %s"), *AssetName);
  104.     //UE_LOG(LogTemp, Warning, TEXT("[Package] AssetPath: %s"), *AssetPath);
  105.     //UE_LOG(LogTemp, Warning, TEXT("[Package] PackagePath: %s"), *PackagePath);
  106.  
  107.     for (FString AssetName : Pairs) {
  108.         FString AssetPath = FilePair.Find(AssetName)->AssetPath;
  109.         FString PackagePath = FilePair.Find(AssetName)->PackagePath;
  110.  
  111.         UPackage * Package = CreatePackage(nullptr, *PackagePath);
  112.  
  113.         UBlueprint * Blueprint = FKismetEditorUtilities::CreateBlueprint(ASpineActor::StaticClass(), Package, *AssetName, BPTYPE_Normal, UBlueprint::StaticClass(), UBlueprintGeneratedClass::StaticClass(), TEXT("AssetTypeActions"));
  114.  
  115.         ASpineActor * CDO = GetBlueprintCDO<ASpineActor>(Blueprint);
  116.         if (IsValid(CDO)) {
  117.             CDO->SpineSkeletonAnimation->SkeletonData = FilePair.Find(AssetName)->Skeleton;
  118.             CDO->SpineSkeletonAnimation->Atlas = FilePair.Find(AssetName)->Atlas;
  119.             FBlueprintEditorUtils::MarkBlueprintAsStructurallyModified(Blueprint);
  120.         }
  121.  
  122.         FAssetRegistryModule::AssetCreated(Blueprint);
  123.         Blueprint->MarkPackageDirty();
  124.         FString FilePath = FString::Printf(TEXT("%s%s%s"), *AssetPath, *AssetName, *FPackageName::GetAssetPackageExtension());
  125.         // bool bSuccess = UPackage::SavePackage(Package, Blueprint, EObjectFlags::RF_Public | EObjectFlags::RF_Standalone, *FilePath);
  126.  
  127.         UE_LOG(LogTemp, Warning, TEXT("[Package] Created SpineActor asset: %s"), *AssetName);
  128.     }
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement