From d40e263edfc4099cfb073224544c2f36a9a9017f Mon Sep 17 00:00:00 2001 From: Jay Stevens Date: Fri, 28 Dec 2018 03:54:10 -0800 Subject: [PATCH] Moved mesh generation code into the utility section. --- .../Private/IslandMapMesh.cpp | 39 +---------------- .../Private/IslandMapUtils.cpp | 42 +++++++++++++++++++ .../Public/IslandMapUtils.h | 4 ++ 3 files changed, 47 insertions(+), 38 deletions(-) diff --git a/Source/PolygonalMapGenerator/Private/IslandMapMesh.cpp b/Source/PolygonalMapGenerator/Private/IslandMapMesh.cpp index 0495285..4ff0adf 100644 --- a/Source/PolygonalMapGenerator/Private/IslandMapMesh.cpp +++ b/Source/PolygonalMapGenerator/Private/IslandMapMesh.cpp @@ -18,44 +18,7 @@ void AIslandMapMesh::OnIslandGenComplete_Implementation() void AIslandMapMesh::CreateIslandMesh() { - const TArray& points = Mesh->GetPoints(); - const FDualMesh& rawMesh = Mesh->GetRawMesh(); - TArray vertices; - TArray vertexColors; - TArray triangles; - TArray normals; - TArray uv0; - TArray tangents; - - vertices.SetNumZeroed(points.Num()); - vertexColors.SetNum(vertices.Num()); - triangles.SetNumZeroed(rawMesh.DelaunayTriangles.Num()); - normals.SetNumZeroed(triangles.Num()); - uv0.SetNumZeroed(triangles.Num()); - tangents.SetNumZeroed(triangles.Num()); - - for (FPointIndex r = 0; r < vertices.Num(); r++) - { - float z = Mesh->r_ghost(r) ? -10 * ZScale : r_elevation[r] * ZScale; - vertices[r] = FVector(points[r].X, points[r].Y, z); - vertexColors[r] = FLinearColor(0.75, 0.75, 0.75, 1.0); - } - for (FTriangleIndex t = 0; t < triangles.Num(); t++) - { - triangles[t] = (int32)rawMesh.DelaunayTriangles[t]; - FDelaunayTriangle triangle = UDelaunayHelper::ConvertTriangleIDToTriangle(rawMesh, t); - FVector a = FVector(triangle.A.X, triangle.A.Y, r_elevation[triangle.AIndex]); - FVector b = FVector(triangle.B.X, triangle.B.Y, r_elevation[triangle.BIndex]); - FVector c = FVector(triangle.C.X, triangle.C.Y, r_elevation[triangle.CIndex]); - normals[t] = FVector::CrossProduct(c - a, b - a).GetSafeNormal(); - uv0[t] = FVector2D::ZeroVector; - tangents[t] = FProcMeshTangent((a - b).GetSafeNormal(), true); - } - - MapMesh->CreateMeshSection_LinearColor(0, vertices, triangles, normals, uv0, vertexColors, tangents, true); - - // Enable collision data - MapMesh->ContainsPhysicsTriMeshData(true); + UIslandMapUtils::GenerateMapMesh(Mesh, MapMesh, ZScale, r_elevation); if (GroundMaterial) { diff --git a/Source/PolygonalMapGenerator/Private/IslandMapUtils.cpp b/Source/PolygonalMapGenerator/Private/IslandMapUtils.cpp index 916902c..6fee837 100644 --- a/Source/PolygonalMapGenerator/Private/IslandMapUtils.cpp +++ b/Source/PolygonalMapGenerator/Private/IslandMapUtils.cpp @@ -250,3 +250,45 @@ FBiomeData UIslandMapUtils::GetBiome(const UDataTable* BiomeData, bool bIsOcean, return possibleBiomes[0]; } + +void UIslandMapUtils::GenerateMapMesh(UTriangleDualMesh* Mesh, UProceduralMeshComponent* MapMesh, float ZScale, const TArray& RegionElevation) +{ + const TArray& points = Mesh->GetPoints(); + const FDualMesh& rawMesh = Mesh->GetRawMesh(); + TArray vertices; + TArray vertexColors; + TArray triangles; + TArray normals; + TArray uv0; + TArray tangents; + + vertices.SetNumZeroed(points.Num()); + vertexColors.SetNum(vertices.Num()); + triangles.SetNumZeroed(rawMesh.DelaunayTriangles.Num()); + normals.SetNumZeroed(triangles.Num()); + uv0.SetNumZeroed(triangles.Num()); + tangents.SetNumZeroed(triangles.Num()); + + for (FPointIndex r = 0; r < vertices.Num(); r++) + { + float z = Mesh->r_ghost(r) ? -10 * ZScale : RegionElevation[r] * ZScale; + vertices[r] = FVector(points[r].X, points[r].Y, z); + vertexColors[r] = FLinearColor(0.75, 0.75, 0.75, 1.0); + } + for (FTriangleIndex t = 0; t < triangles.Num(); t++) + { + triangles[t] = (int32)rawMesh.DelaunayTriangles[t]; + FDelaunayTriangle triangle = UDelaunayHelper::ConvertTriangleIDToTriangle(rawMesh, t); + FVector a = FVector(triangle.A.X, triangle.A.Y, RegionElevation[triangle.AIndex]); + FVector b = FVector(triangle.B.X, triangle.B.Y, RegionElevation[triangle.BIndex]); + FVector c = FVector(triangle.C.X, triangle.C.Y, RegionElevation[triangle.CIndex]); + normals[t] = FVector::CrossProduct(c - a, b - a).GetSafeNormal(); + uv0[t] = FVector2D::ZeroVector; + tangents[t] = FProcMeshTangent((a - b).GetSafeNormal(), true); + } + + MapMesh->CreateMeshSection_LinearColor(0, vertices, triangles, normals, uv0, vertexColors, tangents, true); + + // Enable collision data + MapMesh->ContainsPhysicsTriMeshData(true); +} \ No newline at end of file diff --git a/Source/PolygonalMapGenerator/Public/IslandMapUtils.h b/Source/PolygonalMapGenerator/Public/IslandMapUtils.h index a5243a1..33a7286 100644 --- a/Source/PolygonalMapGenerator/Public/IslandMapUtils.h +++ b/Source/PolygonalMapGenerator/Public/IslandMapUtils.h @@ -25,6 +25,8 @@ #include "PolygonalMapGenerator.h" #include "DelaunayHelper.h" +#include "TriangleDualMesh.h" +#include "ProceduralMeshComponent.h" #include "IslandMapUtils.generated.h" @@ -135,4 +137,6 @@ public: // the FName into a GameplayTag. UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Procedural Generation|Island Generation|Biomes") static FBiomeData GetBiome(const UDataTable* BiomeData, bool bIsOcean, bool bIsWater, bool bIsCoast, float Temperature, float Moisture); + UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Procedural Generation|Island Generation") + static void GenerateMapMesh(UTriangleDualMesh* Mesh, UProceduralMeshComponent* MapMesh, float ZScale, const TArray& RegionElevation); }; \ No newline at end of file -- 2.51.2