diff --git a/Content/BP_BigIslandGenerator.uasset b/Content/BP_BigIslandGenerator.uasset index 4657c0d6b0b7d647d6876ea12fb891b9b03d61f5..bd55faa0767d39411542179036c35c5fe001c59a 100644 GIT binary patch delta 7676 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 PltFzbWMdCDYs~`ycuxPS delta 6283 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 diff --git a/Source/PolygonalMapGenerator/Private/IslandMap.cpp b/Source/PolygonalMapGenerator/Private/IslandMap.cpp index 83a26b7..eaa9c11 100644 --- a/Source/PolygonalMapGenerator/Private/IslandMap.cpp +++ b/Source/PolygonalMapGenerator/Private/IslandMap.cpp @@ -151,13 +151,13 @@ void AIslandMap::GenerateIsland_Implementation() { river_t[i] = spring_t[i]; } - Rivers->assign_s_flow(s_flow, CreatedRivers, Mesh, t_downslope_s, river_t); + Rivers->assign_s_flow(s_flow, CreatedRivers, Mesh, t_downslope_s, river_t, RiverRng); #if !UE_BUILD_SHIPPING finishedTime = FDateTime::UtcNow(); difference = finishedTime - startTime; startTime = finishedTime; - UE_LOG(LogMapGen, Log, TEXT("Generated %d map rivers in %f seconds."), river_t.Num(), difference.GetTotalSeconds()); + UE_LOG(LogMapGen, Log, TEXT("Generated %d map rivers in %f seconds."), CreatedRivers.Num(), difference.GetTotalSeconds()); #endif // Moisture diff --git a/Source/PolygonalMapGenerator/Private/IslandMapUtils.cpp b/Source/PolygonalMapGenerator/Private/IslandMapUtils.cpp index 9d3e3b1..d7fe094 100644 --- a/Source/PolygonalMapGenerator/Private/IslandMapUtils.cpp +++ b/Source/PolygonalMapGenerator/Private/IslandMapUtils.cpp @@ -271,7 +271,7 @@ void UIslandMapUtils::DrawVoronoiFromMap(class AIslandMap* Map) DrawVoronoiMesh(Map, Map->Mesh, Map->GetVoronoiPolygons(), Map->s_flow, Map->CreatedRivers, Map->t_elevation); } -void UIslandMapUtils::DrawDelaunayMesh(AActor* Context, UTriangleDualMesh* Mesh, const TArray& RegionElevations, const TArray& SideFlow, const TArray& Rivers, const TArray &TriangleElevations, const TArray& RegionBiomes) +void UIslandMapUtils::DrawDelaunayMesh(AActor* Context, UTriangleDualMesh* Mesh, const TArray& RegionElevations, const TArray& SideFlow, const TArray& Rivers, const TArray &TriangleElevations, const TArray& RegionBiomes) { if (Context == NULL || Mesh == NULL) { @@ -318,7 +318,7 @@ void UIslandMapUtils::DrawDelaunayMesh(AActor* Context, UTriangleDualMesh* Mesh, DrawRivers(Context, Mesh, Rivers, SideFlow, TriangleElevations); } -void UIslandMapUtils::DrawVoronoiMesh(AActor* Context, UTriangleDualMesh* Mesh, const TArray& Polygons, const TArray& SideFlow, const TArray& Rivers, const TArray& TriangleElevations) +void UIslandMapUtils::DrawVoronoiMesh(AActor* Context, UTriangleDualMesh* Mesh, const TArray& Polygons, const TArray& SideFlow, const TArray& Rivers, const TArray& TriangleElevations) { if (Context == NULL) { @@ -361,7 +361,7 @@ void UIslandMapUtils::DrawVoronoiMesh(AActor* Context, UTriangleDualMesh* Mesh, DrawRivers(Context, Mesh, Rivers, SideFlow, TriangleElevations); } -void UIslandMapUtils::DrawRivers(AActor* Context, UTriangleDualMesh* Mesh, const TArray& Rivers, const TArray& SideFlow, const TArray &TriangleElevations) +void UIslandMapUtils::DrawRivers(AActor* Context, UTriangleDualMesh* Mesh, const TArray& Rivers, const TArray& SideFlow, const TArray &TriangleElevations) { if (Context == NULL || Mesh == NULL) { @@ -373,18 +373,23 @@ void UIslandMapUtils::DrawRivers(AActor* Context, UTriangleDualMesh* Mesh, const #endif UWorld* world = Context->GetWorld(); - for (FRiver river : Rivers) + for (URiver* river : Rivers) { - for (int i = 0; i < river.RiverTriangles.Num() - 1; i++) + if (river->RiverTriangles.Num() <= 1) { - FTriangleIndex t1 = river.RiverTriangles[i]; - int32 flow = SideFlow[river.Downslopes[i]]; + UE_LOG(LogMapGen, Warning, TEXT("Created a very short river!")); + continue; + } + for (int i = 0; i < river->RiverTriangles.Num() - 1; i++) + { + FTriangleIndex t1 = river->RiverTriangles[i]; + int32 flow = SideFlow[river->Downslopes[i]]; FVector2D first2D = Mesh->t_pos(t1); float z1 = TriangleElevations.IsValidIndex(t1) ? TriangleElevations[t1] : -1000.0f; FVector first3D = FVector(first2D.X, first2D.Y, z1 * 10000); - FTriangleIndex t2 = river.RiverTriangles[i + 1]; + FTriangleIndex t2 = river->RiverTriangles[i + 1]; FVector2D second2D = Mesh->t_pos(t2); float z2 = TriangleElevations.IsValidIndex(t2) ? TriangleElevations[t2] : -1000.0f; FVector second3D = FVector(second2D.X, second2D.Y, z2 * 10000); diff --git a/Source/PolygonalMapGenerator/Private/Rivers/IslandRivers.cpp b/Source/PolygonalMapGenerator/Private/Rivers/IslandRivers.cpp index 381216f..0bdb18b 100644 --- a/Source/PolygonalMapGenerator/Private/Rivers/IslandRivers.cpp +++ b/Source/PolygonalMapGenerator/Private/Rivers/IslandRivers.cpp @@ -60,10 +60,11 @@ TArray UIslandRivers::FindSpringTriangles_Implementation(UTriang return spring_t.Array(); } -FRiver UIslandRivers::CreateRiver(FTriangleIndex RiverTriangle, TArray &s_flow, UTriangleDualMesh* Mesh, const TArray& t_downslope_s) const +TArray UIslandRivers::CreateRiver(FTriangleIndex RiverTriangle, TArray &s_flow, TMap RiverMap, UTriangleDualMesh* Mesh, const TArray& t_downslope_s, FRandomStream& RiverRng) const { TSet processedSlopes; - FRiver river; + TArray createdRivers; + URiver* currentRiver = NULL; FSideIndex lastS = FSideIndex(); while(true) { @@ -81,38 +82,75 @@ FRiver UIslandRivers::CreateRiver(FTriangleIndex RiverTriangle, TArray &s if (s.IsValid()) { s_flow[s]++; - river.Add(RiverTriangle, s); + + if (!RiverMap.Contains(RiverTriangle)) + { + if (currentRiver == NULL) + { + // Make a new river, just for 1 triangle + currentRiver = NewObject(); + createdRivers.Add(currentRiver); + } + currentRiver->Add(RiverTriangle, s); + RiverMap.Add(RiverTriangle, currentRiver); + } + else if (currentRiver != NULL && RiverMap[RiverTriangle] != NULL) + { + currentRiver->FeedsInto = RiverMap[RiverTriangle]; + currentRiver = NULL; + } } break; } - s_flow[s]++; + if (!RiverMap.Contains(RiverTriangle)) + { + // This triangle doesn't have a river in it yet + if (currentRiver == NULL) + { + // Make a new river + currentRiver = NewObject(); + createdRivers.Add(currentRiver); + } - river.Add(RiverTriangle, s); + // Now that we know we have a river, mark it as being traversed + currentRiver->Add(RiverTriangle, s); + RiverMap.Add(RiverTriangle, currentRiver); + } + else if (currentRiver != NULL && RiverMap[RiverTriangle] != NULL) + { + // The current river joins as a tributary of the river at this location + currentRiver->FeedsInto = RiverMap[RiverTriangle]; + currentRiver = NULL; + } + + // Each river contributes 1 more flow down to the coastline + s_flow[s]++; processedSlopes.Add(RiverTriangle); FTriangleIndex next_t = Mesh->s_outer_t(s); if (next_t == RiverTriangle) { + // Loop onto ourselves break; } RiverTriangle = next_t; lastS = s; } - return river; + return createdRivers; } -void UIslandRivers::AssignSideFlow_Implementation(TArray& s_flow, TArray& Rivers, UTriangleDualMesh* Mesh, const TArray& t_downslope_s, const TArray& river_t) const +void UIslandRivers::AssignSideFlow_Implementation(TArray& s_flow, TArray& Rivers, UTriangleDualMesh* Mesh, const TArray& t_downslope_s, const TArray& river_t, FRandomStream& RiverRng) const { if (Mesh) { - // Each river in river_t contributes 1 flow down to the coastline s_flow.Empty(Mesh->NumSides); s_flow.SetNumZeroed(Mesh->NumSides); + TMap riverTriangles; for (int i = 0; i < river_t.Num(); i++) { - Rivers.Add(CreateRiver(river_t[i], s_flow, Mesh, t_downslope_s)); + Rivers.Append(CreateRiver(river_t[i], s_flow, riverTriangles, Mesh, t_downslope_s, RiverRng)); } } else @@ -126,7 +164,7 @@ TArray UIslandRivers::find_spring_t(UTriangleDualMesh* Mesh, con return FindSpringTriangles(Mesh, r_water, t_elevation, t_downslope_s); } -void UIslandRivers::assign_s_flow(TArray& s_flow, TArray& Rivers, UTriangleDualMesh* Mesh, const TArray& t_downslope_s, const TArray& river_t) const +void UIslandRivers::assign_s_flow(TArray& s_flow, TArray& Rivers, UTriangleDualMesh* Mesh, const TArray& t_downslope_s, const TArray& river_t, FRandomStream& RiverRng) const { - AssignSideFlow(s_flow, Rivers, Mesh, t_downslope_s, river_t); + AssignSideFlow(s_flow, Rivers, Mesh, t_downslope_s, river_t, RiverRng); } \ No newline at end of file diff --git a/Source/PolygonalMapGenerator/Public/IslandMap.h b/Source/PolygonalMapGenerator/Public/IslandMap.h index 90ad6b1..9a35e11 100644 --- a/Source/PolygonalMapGenerator/Public/IslandMap.h +++ b/Source/PolygonalMapGenerator/Public/IslandMap.h @@ -127,7 +127,7 @@ public: const UIslandWater* Water; UPROPERTY(VisibleInstanceOnly, BlueprintReadWrite, Category = "Map") - TArray CreatedRivers; + TArray CreatedRivers; UPROPERTY(BlueprintAssignable) FOnIslandGenerationComplete OnIslandGenerationComplete; diff --git a/Source/PolygonalMapGenerator/Public/IslandMapUtils.h b/Source/PolygonalMapGenerator/Public/IslandMapUtils.h index 2da2f2a..8c75a81 100644 --- a/Source/PolygonalMapGenerator/Public/IslandMapUtils.h +++ b/Source/PolygonalMapGenerator/Public/IslandMapUtils.h @@ -52,14 +52,19 @@ struct POLYGONALMAPGENERATOR_API FIslandShape } }; -USTRUCT(BlueprintType) -struct POLYGONALMAPGENERATOR_API FRiver +UCLASS(BlueprintType) +class POLYGONALMAPGENERATOR_API URiver : public UObject { GENERATED_BODY() public: + UPROPERTY(VisibleAnywhere, BlueprintReadWrite) TArray RiverTriangles; + UPROPERTY(VisibleAnywhere, BlueprintReadWrite) TArray Downslopes; + UPROPERTY(VisibleAnywhere, BlueprintReadWrite) + URiver* FeedsInto; + public: void Add(FTriangleIndex Triangle, FSideIndex Downslope) { @@ -177,12 +182,12 @@ public: UFUNCTION() static void DrawVoronoiFromMap(class AIslandMap* Map); UFUNCTION(BlueprintCallable, Category = "Procedural Generation|Island Generation|Debug") - static void DrawDelaunayMesh(AActor* Context, UTriangleDualMesh* Mesh, const TArray& RegionElevations, const TArray& SideFlow, const TArray& Rivers, const TArray &TriangleElevations, const TArray& RegionBiomes); + static void DrawDelaunayMesh(AActor* Context, UTriangleDualMesh* Mesh, const TArray& RegionElevations, const TArray& SideFlow, const TArray& Rivers, const TArray &TriangleElevations, const TArray& RegionBiomes); //UFUNCTION(BlueprintCallable, Category = "Procedural Generation|Island Generation|Debug") UFUNCTION() - static void DrawVoronoiMesh(AActor* Context, UTriangleDualMesh* Mesh, const TArray& Polygons, const TArray& SideFlow, const TArray& Rivers, const TArray& TriangleElevations); + static void DrawVoronoiMesh(AActor* Context, UTriangleDualMesh* Mesh, const TArray& Polygons, const TArray& SideFlow, const TArray& Rivers, const TArray& TriangleElevations); UFUNCTION(BlueprintCallable, Category = "Procedural Generation|Island Generation|Debug") - static void DrawRivers(AActor* Context, UTriangleDualMesh* Mesh, const TArray& Rivers, const TArray& SideFlow, const TArray &TriangleElevations); + static void DrawRivers(AActor* Context, UTriangleDualMesh* Mesh, const TArray& Rivers, const TArray& SideFlow, const TArray &TriangleElevations); UFUNCTION(BlueprintCallable, Category = "Procedural Generation|Island Generation") static void GenerateMesh(class AIslandMap* Map, UProceduralMeshComponent* MapMesh, float ZScale); diff --git a/Source/PolygonalMapGenerator/Public/Rivers/IslandRivers.h b/Source/PolygonalMapGenerator/Public/Rivers/IslandRivers.h index 9665245..deedfc3 100644 --- a/Source/PolygonalMapGenerator/Public/Rivers/IslandRivers.h +++ b/Source/PolygonalMapGenerator/Public/Rivers/IslandRivers.h @@ -53,10 +53,10 @@ protected: UFUNCTION(BlueprintPure, BlueprintCallable, Category = "Procedural Generation|Island Generation|Rivers") virtual bool IsTriangleWater(FTriangleIndex t, UTriangleDualMesh* Mesh, const TArray& WaterRegions) const; UFUNCTION(BlueprintCallable, Category = "Procedural Generation|Island Generation|Rivers") - virtual FRiver CreateRiver(FTriangleIndex RiverTriangle, TArray &s_flow, UTriangleDualMesh* Mesh, const TArray& t_downslope_s) const; + virtual TArray CreateRiver(FTriangleIndex RiverTriangle, TArray &s_flow, TMap RiverMap, UTriangleDualMesh* Mesh, const TArray& t_downslope_s, FRandomStream& RiverRng) const; virtual TArray FindSpringTriangles_Implementation(UTriangleDualMesh* Mesh, const TArray& r_water, const TArray& t_elevation, const TArray& t_downslope_s) const; - virtual void AssignSideFlow_Implementation(TArray& s_flow, TArray& Rivers, UTriangleDualMesh* Mesh, const TArray& t_downslope_s, const TArray& river_t) const; + virtual void AssignSideFlow_Implementation(TArray& s_flow, TArray& Rivers, UTriangleDualMesh* Mesh, const TArray& t_downslope_s, const TArray& river_t, FRandomStream& RiverRNG) const; public: /** @@ -67,8 +67,8 @@ public: UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "Procedural Generation|Island Generation|Rivers") TArray FindSpringTriangles(UTriangleDualMesh* Mesh, const TArray& WaterRegions, const TArray& TriangleElevations, const TArray& TriangleSideDownslopes) const; UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "Procedural Generation|Island Generation|Rivers") - void AssignSideFlow(UPARAM(ref) TArray& SideFlow, UPARAM(ref) TArray& Rivers, UTriangleDualMesh* Mesh, const TArray& TriangleSideDownslopes, const TArray& RiverTriangles) const; + void AssignSideFlow(UPARAM(ref) TArray& SideFlow, UPARAM(ref) TArray& Rivers, UTriangleDualMesh* Mesh, const TArray& TriangleSideDownslopes, const TArray& RiverTriangles, UPARAM(ref) FRandomStream& RiverRNG) const; TArray find_spring_t(UTriangleDualMesh* Mesh, const TArray& r_water, const TArray& t_elevation, const TArray& t_downslope_s) const; - void assign_s_flow(TArray& s_flow, TArray& Rivers, UTriangleDualMesh* Mesh, const TArray& t_downslope_s, const TArray& river_t) const; + void assign_s_flow(TArray& s_flow, TArray& Rivers, UTriangleDualMesh* Mesh, const TArray& t_downslope_s, const TArray& river_t, FRandomStream& RiverRNG) const; };