AssoAndrea

ProceduralUE4World

May 13th, 2022
992
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.00 KB | None | 0 0
  1. UWorld* CreateWorld()
  2. {
  3.     uint32 RandomInt = FMath::RandRange(0, 9000);
  4.     FString WorldName = FString::Printf(TEXT("ProceduralWorld_%d"), RandomInt);
  5.     UPackage* Package = CreatePackage(*(FString::Printf(TEXT("/Game/World/%s"),*WorldName)));
  6.     UWorldFactory* WorldFactory = NewObject<UWorldFactory>();
  7.  
  8.     UObject* ObjectWorld = WorldFactory->FactoryCreateNew(WorldFactory->SupportedClass, Package, *WorldName, EObjectFlags::RF_Standalone | EObjectFlags::RF_Public, nullptr, GWarn);
  9.     UWorld* World = Cast<UWorld>(ObjectWorld);
  10.     FAssetRegistryModule::AssetCreated(ObjectWorld);
  11.     World->MarkPackageDirty();
  12.     return World;
  13. }
  14. void FProceduralWorldModule::ParseMap()
  15. {
  16.     GenWorld = CreateWorld();
  17.     FString FileName = FString(TEXT("C:\\Users\\andre\\Desktop\\Texture_UE\\Mappa.png"));
  18.     TArray<uint8> Buffer;
  19.     FFileHelper::LoadFileToArray(Buffer, *FileName);
  20.     UTexture2D* Texture = FImageUtils::ImportBufferAsTexture2D(Buffer);
  21.     ADirectionalLight* Directional = GenWorld->SpawnActor<ADirectionalLight>();
  22.     Directional->SetMobility(EComponentMobility::Movable);
  23.     AStaticMeshActor* AFloor = GenWorld->SpawnActor<AStaticMeshActor>(Floor->GeneratedClass);
  24.     FVector FloorSize = AFloor->GetStaticMeshComponent()->GetStaticMesh()->GetBounds().GetBox().GetSize();
  25.     FVector FloorLocation = FVector(0, 0, 0);
  26.     FloorLocation.X = ((Texture->GetSizeX() / 2) * 100) - 50;
  27.     FloorLocation.Y = ((Texture->GetSizeY() / 2) * 100) - 50;
  28.     FloorLocation.Z = -50;
  29.     AFloor->SetActorLocation(FloorLocation);
  30.  
  31.     const FColor* FormatedImageData = static_cast<const FColor*>(Texture->PlatformData->Mips[0].BulkData.LockReadOnly());
  32.     for (int32 X = 0; X < Texture->GetSizeX(); X++)
  33.     {
  34.         for (int32 Y = 0; Y < Texture->GetSizeY(); Y++)
  35.         {
  36.             FColor PixelColor = FormatedImageData[Y * Texture->GetSizeX() + X];
  37.             ParseColor(PixelColor, X, Y);
  38.         }
  39.     }
  40.     Texture->PlatformData->Mips[0].BulkData.Unlock();
  41.  
  42. }
  43.  
  44. bool FProceduralWorldModule::Exec(UWorld* InWorld, const TCHAR* Cmd, FOutputDevice& Ar)
  45. {
  46.     if (FParse::Command(&Cmd, TEXT("Create")))
  47.     {
  48.         UPluginSettings* PluginSettings = GetMutableDefault<UPluginSettings>();
  49.         DefaultWall = LoadObject<UBlueprint>(nullptr, *(PluginSettings->DefaultWall.GetAssetPathString()));
  50.         DestroyableWall = LoadObject<UBlueprint>(nullptr, *(PluginSettings->DestroyableWall.GetAssetPathString()));
  51.         Floor = LoadObject<UBlueprint>(nullptr, *(PluginSettings->Floor.GetAssetPathString()));
  52.         ParseMap();
  53.         return true;
  54.     }
  55.     return false;
  56. }
  57.  
  58. void FProceduralWorldModule::ParseColor(FColor Color,int32 X, int32 Y)
  59. {
  60.     FVector Offset = FVector(100,100, 0);
  61.    
  62.     if (Color.B == 255)
  63.     {
  64.         AStaticMeshActor* Spawned = GenWorld->SpawnActor<AStaticMeshActor>(DefaultWall->GeneratedClass);
  65.         Spawned->SetActorLocation(FVector(X, Y, 0) * Offset);
  66.     }
  67.     else if (Color.R == 255)
  68.     {
  69.         AStaticMeshActor* Spawned = GenWorld->SpawnActor<AStaticMeshActor>(DestroyableWall->GeneratedClass);
  70.         Spawned->SetActorLocation(FVector(X, Y, 0) * Offset);
  71.     }
  72. }
  73.  
  74. #undef LOCTEXT_NAMESPACE
  75.    
  76. IMPLEMENT_MODULE(FProceduralWorldModule, ProceduralWorld)
Advertisement
Add Comment
Please, Sign In to add comment