Collisions fixed

This commit is contained in:
aollero 2022-06-15 15:30:40 +02:00 committed by bernat
parent 71bb22f874
commit 3c6605ff79
3 changed files with 92 additions and 1 deletions

View File

@ -95,6 +95,85 @@ void UMapGeneratorWidget::CookVegetationToCurrentTile(const TArray<UProceduralFo
*CUR_CLASS_FUNC_LINE);
}
bool UMapGeneratorWidget::RecalculateCollision(FString MapPath)
{
UWorld* World = GEditor->GetEditorWorldContext().World();
// UWorld* World = GEngine->GetWorld();
if(World == nullptr)
return false;
ALandscape* Landscape = (ALandscape*) UGameplayStatics::GetActorOfClass(
World,
ALandscape::StaticClass());
// LandscapePostEditEvent(Landscape);
FProperty* PropertyToUpdate = Landscape->GetClass()->FindPropertyByName(TEXT("CollisionMipLevel"));
int32* PropertyValue = PropertyToUpdate->ContainerPtrToValuePtr<int32>(Landscape);
if(!PropertyToUpdate){
UE_LOG(LogCarlaToolsMapGenerator, Warning, TEXT("%s: Could not found the specified property"),
*CUR_CLASS_FUNC_LINE);
return false;
}
*PropertyValue += 1; // Increment
FPropertyChangedEvent LandscapeCustomPropertyChangedEvent(PropertyToUpdate);
Landscape->PostEditChangeProperty(LandscapeCustomPropertyChangedEvent);
Landscape->PostEditChange();
Landscape->RecreateCollisionComponents();
if (MapPath == "")
{
MapPath = World->GetPathName();
}
Landscape->ReregisterAllComponents();
/* bool bSaveMapSuccess = FEditorFileUtils::SaveMap(World,
World->GetPathName());*/
UEditorAssetLibrary::SaveAsset(World->GetPathName(), true);
bool bSuccess = FEditorFileUtils::SaveDirtyPackages(true, true, true, true, true, true);
return true;
}
void UMapGeneratorWidget::CookTilesCollisions(const FMapGeneratorMetaInfo& MetaInfo)
{
for (int i = 0; i < MetaInfo.SizeX; i++)
{
for (int j = 0; j < MetaInfo.SizeY; j++)
{
const FString MapName =
MetaInfo.MapName + "_Tile_" + FString::FromInt(i) + "_" + FString::FromInt(j);
const FString MapNameToLoad = MetaInfo.DestinationPath + "/" + MapName + "." + MapName;
bool bLoadedSuccess = FEditorFileUtils::LoadMap(*MapNameToLoad, false, true);
if (!bLoadedSuccess)
UE_LOG(LogCarlaToolsMapGenerator, Log, TEXT("%s: Error loading to %s tiles"),
*CUR_CLASS_FUNC_LINE, *MetaInfo.MapName);
UWorld* EditorWorld = GEditor->GetEditorWorldContext().World();
UE_LOG(LogCarlaToolsMapGenerator, Log, TEXT("%s: HERE! %s -- %s to %s tiles"),
*CUR_CLASS_FUNC_LINE, *MapNameToLoad, *GEditor->GetEditorWorldContext().World()->GetName(), *MetaInfo.MapName);
bool bRecalculateResult = RecalculateCollision(MapNameToLoad);
if (!bRecalculateResult)
UE_LOG(LogCarlaToolsMapGenerator, Error, TEXT("%s: Error recalculating to %s tiles"),
*CUR_CLASS_FUNC_LINE, *MetaInfo.MapName);
//bool bSaveMapSuccess = FEditorFileUtils::SaveMap(GEditor->GetEditorWorldContext().World(),
//MapNameToLoad);
//if(!bSaveMapSuccess)
//UE_LOG(LogCarlaToolsMapGenerator, Error, TEXT("%s: Error Saving to %s tiles"),
//*CUR_CLASS_FUNC_LINE, *MetaInfo.MapName);
}
}
}
FString UMapGeneratorWidget::SanitizeDirectory(FString InDirectory)
{
UE_LOG(LogCarlaToolsMapGenerator, Log, TEXT("%s: Sanitazing directory: %s"),
@ -729,7 +808,7 @@ bool UMapGeneratorWidget::CreateTilesMaps(const FMapGeneratorMetaInfo& MetaInfo)
HeightmapDataPerLayers, TEXT("NONE"), MaterialLayerDataPerLayer, ELandscapeImportAlphamapType::Layered);
// Landscape->Import(Landscape->GetLandscapeGuid(), 0, 0, 2016, 2016, Landscape->NumSubsections, Landscape->SubsectionSizeQuads,
// HeightmapDataPerLayers, TEXT("NONE"), MaterialLayerDataPerLayer, ELandscapeImportAlphamapType::Layered);
// FVector LandscapeOrigin;
// FVector LandscapeBounds;
@ -744,6 +823,8 @@ bool UMapGeneratorWidget::CreateTilesMaps(const FMapGeneratorMetaInfo& MetaInfo)
// Apply material
AssignLandscapeMaterial(Landscape);
Landscape->RecreateCollisionComponents();
const FString PackageFileName = FPackageName::LongPackageNameToFilename(
PackageName,
FPackageName::GetMapPackageExtension());
@ -762,6 +843,8 @@ bool UMapGeneratorWidget::CreateTilesMaps(const FMapGeneratorMetaInfo& MetaInfo)
}
}
CookTilesCollisions(MetaInfo);
return true;
}

View File

@ -100,6 +100,12 @@ public:
UFUNCTION(Category="Map Generator", BlueprintCallable)
void CookVegetationToCurrentTile(const TArray<UProceduralFoliageSpawner*> FoliageSpawners);
UFUNCTION(Category="Map Generator", BlueprintCallable)
bool RecalculateCollision(FString MapPath = "");
UFUNCTION(Category = "MapGenerator", BlueprintCallable)
void CookTilesCollisions(const FMapGeneratorMetaInfo& MetaInfo);
/// Utils funtion to format @a InDirectory so it gets sanitized in a
/// format that unreal can access the directory, deleting unnecesary
/// characters such as final '/' or '\'
@ -168,6 +174,8 @@ private:
UFUNCTION()
bool CreateTilesMaps(const FMapGeneratorMetaInfo& MetaInfo);
/// Searches for the specified map in the specified path in @a MetaInfo
/// and starts the vegetation cooking process for each of the tile.
/// IMPORTANT: Only maps with '_Tile_' tag in it name are processed as