diff --git a/Content/BP_BigIslandGenerator.uasset b/Content/BP_BigIslandGenerator.uasset new file mode 100644 index 0000000000000000000000000000000000000000..9069264f4f942544d37312834cea1ddf51597f25 GIT binary patch literal 30351 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, r_water, t_elevation, t_downslope_s); UE_LOG(LogMapGen, Log, TEXT("Created %d springs."), spring_t.Num()); diff --git a/Source/PolygonalMapGenerator/Private/IslandMoisture.cpp b/Source/PolygonalMapGenerator/Private/IslandMoisture.cpp index a83245f..015ccd4 100644 --- a/Source/PolygonalMapGenerator/Private/IslandMoisture.cpp +++ b/Source/PolygonalMapGenerator/Private/IslandMoisture.cpp @@ -18,23 +18,118 @@ #include "IslandMoisture.h" -TSet UIslandMoisture::FindMoistureSeeds_Implementation(UTriangleDualMesh* Mesh, const TArray& s_flow, const TArray& r_ocean, const TArray& r_water) const +TSet UIslandMoisture::FindRiverbanks(UTriangleDualMesh* Mesh, const TArray& s_flow) const { - unimplemented(); - return TSet(); + TSet banks; + for (FSideIndex s = 0; s < Mesh->NumSolidSides; s++) + { + if (s_flow[s] > 0) + { + banks.Add(Mesh->s_begin_r(s)); + banks.Add(Mesh->s_end_r(s)); + } + } + return banks; } -void UIslandMoisture::AssignRegionMoisture_Implementation(TArray& r_moisture, TArray& r_waterdistance, UTriangleDualMesh* Mesh, const TArray& r_water, const TSet& r_moisture_seeds) const +TSet UIslandMoisture::FindLakeshores(UTriangleDualMesh* Mesh, const TArray& r_ocean, const TArray& r_water) const { - unimplemented(); + TSet shores; + for (FSideIndex s = 0; s < Mesh->NumSolidSides; s++) + { + FPointIndex r = Mesh->s_begin_r(s); + if (r_water[r] && !r_ocean[r]) + { + shores.Add(r); + shores.Add(Mesh->s_end_r(s)); + } + } + return shores; +} + +TSet UIslandMoisture::FindMoistureSeeds_Implementation(UTriangleDualMesh* Mesh, const TArray& s_flow, const TArray& r_ocean, const TArray& r_water) const +{ + TSet seeds; + + seeds.Append(FindRiverbanks(Mesh, s_flow)); + seeds.Append(FindLakeshores(Mesh, r_ocean, r_water)); + + return seeds; +} + +void UIslandMoisture::AssignRegionMoisture_Implementation(TArray& r_moisture, TArray& r_waterdistance, UTriangleDualMesh* Mesh, const TArray& r_water, const TSet& seed_r) const +{ + r_moisture.Empty(Mesh->NumRegions); + r_moisture.SetNumZeroed(Mesh->NumRegions); + r_waterdistance.Empty(Mesh->NumRegions); + r_waterdistance.SetNumZeroed(Mesh->NumRegions); + for (FPointIndex r = 0; r < r_waterdistance.Num(); r++) + { + r_waterdistance[r] = -1; + } + + TArray queue_r = seed_r.Array(); + + // Set all freshwater regions to have distance 0 from water + for (FPointIndex r : queue_r) + { + r_waterdistance[r] = 0; + } + + int32 maxDistance = 1; + + while (queue_r.Num() > 0) + { + FPointIndex current_r = queue_r[0]; + queue_r.RemoveAt(0); + TArray out_r = Mesh->r_circulate_r(current_r); + for (FPointIndex neighbor_r : out_r) + { + if (!r_water[neighbor_r] && r_waterdistance[neighbor_r] == -1) + { + int32 newDistance = 1 + r_waterdistance[current_r]; + r_waterdistance[neighbor_r] = newDistance; + if (newDistance > maxDistance) { maxDistance = newDistance; } + queue_r.Add(neighbor_r); + } + } + } + + // Actually set the moisture + for (FPointIndex r = 0; r < r_waterdistance.Num(); r++) + { + r_moisture[r] = r_water[r] ? 1.0f : 1.0f - FMath::Pow((float)r_waterdistance[r] / maxDistance, 0.5f); + } } void UIslandMoisture::RedistributeRegionMoisture_Implementation(TArray& r_moisture, UTriangleDualMesh* Mesh, const TArray& r_water, float MinMoisture, float MaxMoisture) const { - unimplemented(); + TArray land_r; + for (FPointIndex r = 0; r < Mesh->NumSolidRegions; r++) + { + if (!r_water[r]) + { + land_r.Add(r); + } + } + + if (land_r.Num() <= 1) + { + return; + } + + land_r.Sort([r_moisture](const FPointIndex& A, const FPointIndex& B) + { + return r_moisture[A] < r_moisture[B]; + }); + + for (int i = 0; i < land_r.Num(); i++) + { + r_moisture[land_r[i]] = MinMoisture + (MaxMoisture - MinMoisture) * i / ((float)land_r.Num() - 1.0f); + } } -void UIslandMoisture::assign_r_moisture(TArray& r_moisture, TArray& r_waterdistance, UTriangleDualMesh* Mesh, const TArray& r_water, const TSet& r_moisture_seeds) const +void UIslandMoisture::assign_r_moisture(TArray& r_moisture, TArray& r_waterdistance, UTriangleDualMesh* Mesh, const TArray& r_water, const TSet& r_moisture_seeds) const { AssignRegionMoisture(r_moisture, r_waterdistance, Mesh, r_water, r_moisture_seeds); } @@ -44,7 +139,7 @@ void UIslandMoisture::redistribute_r_moisture(TArray& r_moisture, UTriang RedistributeRegionMoisture(r_moisture, Mesh, r_water, MinMoisture, MaxMoisture); } -TSet UIslandMoisture::find_moisture_seeds_r(UTriangleDualMesh* Mesh, const TArray& s_flow, const TArray& r_ocean, const TArray& r_water) const +TSet UIslandMoisture::find_moisture_seeds_r(UTriangleDualMesh* Mesh, const TArray& s_flow, const TArray& r_ocean, const TArray& r_water) const { return FindMoistureSeeds(Mesh, s_flow, r_ocean, r_water); } diff --git a/Source/PolygonalMapGenerator/Private/IslandRivers.cpp b/Source/PolygonalMapGenerator/Private/IslandRivers.cpp index 6dcb65b..ff9756d 100644 --- a/Source/PolygonalMapGenerator/Private/IslandRivers.cpp +++ b/Source/PolygonalMapGenerator/Private/IslandRivers.cpp @@ -75,8 +75,6 @@ void UIslandRivers::AssignSideFlow_Implementation(TArray& s_flow, UTriang { FSideIndex s = t_downslope_s[t]; - UE_LOG(LogMapGen, Log, TEXT("Current index: %d Next downslope: %d"), t, s); - if (!s.IsValid()) { break; diff --git a/Source/PolygonalMapGenerator/Public/IslandMoisture.h b/Source/PolygonalMapGenerator/Public/IslandMoisture.h index 0675cad..1a47598 100644 --- a/Source/PolygonalMapGenerator/Public/IslandMoisture.h +++ b/Source/PolygonalMapGenerator/Public/IslandMoisture.h @@ -32,19 +32,24 @@ class POLYGONALMAPGENERATOR_API UIslandMoisture : public UDataAsset GENERATED_BODY() protected: - TSet FindMoistureSeeds_Implementation(UTriangleDualMesh* Mesh, const TArray& s_flow, const TArray& r_ocean, const TArray& r_water) const; - void AssignRegionMoisture_Implementation(TArray& r_moisture, TArray& r_waterdistance, UTriangleDualMesh* Mesh, const TArray& r_water, const TSet& r_moisture_seeds) const; + UFUNCTION(BlueprintPure, BlueprintCallable, Category = "Procedural Generation|Island Generation|Moisture") + TSet FindRiverbanks(UTriangleDualMesh* Mesh, const TArray& s_flow) const; + UFUNCTION(BlueprintPure, BlueprintCallable, Category = "Procedural Generation|Island Generation|Moisture") + TSet FindLakeshores(UTriangleDualMesh* Mesh, const TArray& r_ocean, const TArray& r_water) const; + + TSet FindMoistureSeeds_Implementation(UTriangleDualMesh* Mesh, const TArray& s_flow, const TArray& r_ocean, const TArray& r_water) const; + void AssignRegionMoisture_Implementation(TArray& r_moisture, TArray& r_waterdistance, UTriangleDualMesh* Mesh, const TArray& r_water, const TSet& r_moisture_seeds) const; void RedistributeRegionMoisture_Implementation(TArray& r_moisture, UTriangleDualMesh* Mesh, const TArray& r_water, float MinMoisture, float MaxMoisture) const; public: UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "Procedural Generation|Island Generation|Moisture") - TSet FindMoistureSeeds(UTriangleDualMesh* Mesh, const TArray& SideFlow, const TArray& OceanRegions, const TArray& WaterRegions) const; + TSet FindMoistureSeeds(UTriangleDualMesh* Mesh, const TArray& SideFlow, const TArray& OceanRegions, const TArray& WaterRegions) const; UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "Procedural Generation|Island Generation|Moisture") - void AssignRegionMoisture(UPARAM(ref) TArray& RegionMoisture, UPARAM(ref) TArray& RegionWaterDistance, UTriangleDualMesh* Mesh, const TArray& WaterRegions, const TSet& MoistureSeedRegions) const; + void AssignRegionMoisture(UPARAM(ref) TArray& RegionMoisture, UPARAM(ref) TArray& RegionWaterDistance, UTriangleDualMesh* Mesh, const TArray& WaterRegions, const TSet& MoistureSeedRegions) const; UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "Procedural Generation|Island Generation|Moisture") void RedistributeRegionMoisture(UPARAM(ref) TArray& RegionMoisture, UTriangleDualMesh* Mesh, const TArray& WaterRegions, float MinMoisture, float MaxMoisture) const; - TSet find_moisture_seeds_r(UTriangleDualMesh* Mesh, const TArray& s_flow, const TArray& r_ocean, const TArray& r_water) const; - void assign_r_moisture(TArray& r_moisture, TArray& r_waterdistance, UTriangleDualMesh* Mesh, const TArray& r_water, const TSet& r_moisture_seeds) const; + TSet find_moisture_seeds_r(UTriangleDualMesh* Mesh, const TArray& s_flow, const TArray& r_ocean, const TArray& r_water) const; + void assign_r_moisture(TArray& r_moisture, TArray& r_waterdistance, UTriangleDualMesh* Mesh, const TArray& r_water, const TSet& r_moisture_seeds) const; void redistribute_r_moisture(TArray& r_moisture, UTriangleDualMesh* Mesh, const TArray& r_water, float MinMoisture, float MaxMoisture) const; };