10#include "AssetRegistry/AssetRegistryModule.h"
11#include "Materials/MaterialInstance.h"
12#include "StaticMeshAttributes.h"
13#include "RenderingThread.h"
29 const TArray<FProcMeshTangent>& ParamTangents,
30 UMaterialInstance* MaterialInstance )
34 int32 VertexCount = Data.
Vertices.Num();
35 int32 VertexInstanceCount = Data.
Triangles.Num();
36 int32 PolygonCount = Data.
Vertices.Num()/3;
38 FMeshDescription MeshDescription;
39 FStaticMeshAttributes AttributeGetter(MeshDescription);
40 AttributeGetter.Register();
43TPolygonGroupAttributesRef<FName> PolygonGroupNames = AttributeGetter.GetPolygonGroupMaterialSlotNames();
45TVertexAttributesRef<FVector> VertexPositions = AttributeGetter.GetVertexPositions();
47TVertexInstanceAttributesRef<FVector> Tangents = AttributeGetter.GetVertexInstanceTangents();
49TVertexInstanceAttributesRef<float> BinormalSigns = AttributeGetter.GetVertexInstanceBinormalSigns();
51TVertexInstanceAttributesRef<FVector> Normals = AttributeGetter.GetVertexInstanceNormals();
53TVertexInstanceAttributesRef<FVector4> Colors = AttributeGetter.GetVertexInstanceColors();
55TVertexInstanceAttributesRef<FVector2D> UVs = AttributeGetter.GetVertexInstanceUVs();
58FPolygonGroupID PolygonGroupForSection;
59MeshDescription.ReserveNewVertices(VertexCount);
60MeshDescription.ReserveNewVertexInstances(VertexInstanceCount);
61MeshDescription.ReserveNewPolygons(PolygonCount);
62MeshDescription.ReserveNewEdges(PolygonCount * 2);
66TMap<UMaterialInterface*, FPolygonGroupID> UniqueMaterials;
67const int32 NumSections = 1;
68UniqueMaterials.Reserve(1);
69FPolygonGroupID NewPolygonGroup = MeshDescription.CreatePolygonGroup();
72if( MaterialInstance !=
nullptr ){
73 UMaterialInterface *Material = MaterialInstance;
74 UniqueMaterials.Add(Material, NewPolygonGroup);
75 PolygonGroupNames[NewPolygonGroup] = Material->GetFName();
77 UE_LOG(LogCarla, Error, TEXT(
"MaterialInstance is nullptr"));
79PolygonGroupForSection = NewPolygonGroup;
82int32 NumVertex = Data.
Vertices.Num();
83TMap<int32, FVertexID> VertexIndexToVertexID;
84VertexIndexToVertexID.Reserve(NumVertex);
85for (int32 VertexIndex = 0; VertexIndex < NumVertex; ++VertexIndex)
87 const FVector &Vert = Data.
Vertices[VertexIndex];
88 const FVertexID VertexID = MeshDescription.CreateVertex();
89 VertexPositions[VertexID] = Vert;
90 VertexIndexToVertexID.Add(VertexIndex, VertexID);
95int32 NumVertexInstances = Data.VertexInstances.Num();
96TMap<FVertexID, FVertexInstanceID> VertexToInstanceID;
97VertexToInstanceID.Reserve(NumVertexInstances);
98for (int32 VertexInstanceIndex = 0; VertexInstanceIndex < NumVertexInstances; ++VertexInstanceIndex)
104 int32 NumTri = NumIndices / 3;
105 TMap<int32, FVertexInstanceID> IndiceIndexToVertexInstanceID;
106 IndiceIndexToVertexInstanceID.Reserve(NumVertex);
107 for (int32 IndiceIndex = 0; IndiceIndex < NumIndices; IndiceIndex++)
109 const int32 VertexIndex = Data.
Triangles[IndiceIndex];
110 const FVertexID VertexID = VertexIndexToVertexID[VertexIndex];
111 const FVertexInstanceID VertexInstanceID =
112 MeshDescription.CreateVertexInstance(VertexID);
113 IndiceIndexToVertexInstanceID.Add(IndiceIndex, VertexInstanceID);
114 Normals[VertexInstanceID] = Data.
Normals[VertexIndex];
117 if(ParamTangents.Num() == Data.
Vertices.Num())
119 Tangents[VertexInstanceID] = ParamTangents[VertexIndex].TangentX;
120 BinormalSigns[VertexInstanceID] =
121 ParamTangents[VertexIndex].bFlipTangentY ? -1.f : 1.f;
126 Colors[VertexInstanceID] = FLinearColor(0,0,0);
131 UVs.Set(VertexInstanceID, 0, Data.
UV0[VertexIndex]);
133 UVs.Set(VertexInstanceID, 0, FVector2D(0,0));
136 UVs.Set(VertexInstanceID, 1, FVector2D(0,0));
137 UVs.Set(VertexInstanceID, 2, FVector2D(0,0));
138 UVs.Set(VertexInstanceID, 3, FVector2D(0,0));
142 for (int32 TriIdx = 0; TriIdx < NumTri; TriIdx++)
144 FVertexID VertexIndexes[3];
145 TArray<FVertexInstanceID> VertexInstanceIDs;
146 VertexInstanceIDs.SetNum(3);
149 for (int32 CornerIndex = 0; CornerIndex < 3; ++CornerIndex)
151 const int32 IndiceIndex = (TriIdx * 3) + CornerIndex;
152 const int32 VertexIndex = Data.
Triangles[IndiceIndex];
153 VertexIndexes[CornerIndex] = VertexIndexToVertexID[VertexIndex];
154 VertexInstanceIDs[CornerIndex] =
155 IndiceIndexToVertexInstanceID[IndiceIndex];
159 MeshDescription.CreatePolygon(NewPolygonGroup, VertexInstanceIDs);
163 return MeshDescription;
169 const TArray<FProcMeshTangent>& ParamTangents,
170 UMaterialInstance* MaterialInstance,
175 IPlatformFile& PlatformFile = FPlatformFileManager::Get().GetPlatformFile();
177 UStaticMesh::FBuildMeshDescriptionsParams Params;
178 Params.bBuildSimpleCollision =
true;
181 FString PackageName =
"/Game/CustomMaps/" + MapName +
"/Static/" + FolderName +
"/" + MeshName.ToString();
184 if (!PlatformFile.DirectoryExists(*PackageName))
194 if (Description.Polygons().Num() > 0)
197 UPackage* Package = CreatePackage(*PackageName);
201 UStaticMesh* Mesh = NewObject<UStaticMesh>( Package, MeshName, RF_Public | RF_Standalone);
204 Mesh->InitResources();
206 Mesh->LightingGuid = FGuid::NewGuid();
208 Mesh->StaticMaterials.Add(FStaticMaterial(MaterialInstance));
210 Mesh->BuildFromMeshDescriptions({ &Description }, Params);
212 Mesh->CreateBodySetup();
214 Mesh->BodySetup->CollisionTraceFlag = ECollisionTraceFlag::CTF_UseComplexAsSimple;
216 Mesh->BodySetup->CreatePhysicsMeshes();
218 Mesh->NeverStream =
false;
219 TArray<UObject*> CreatedAssets;
220 CreatedAssets.Add(Mesh);
223 FAssetRegistryModule::AssetCreated(Mesh);
225 Package->MarkPackageDirty();
234 const float R = 6373000.0f;
236 float latt = FMath::DegreesToRadians(lat);
237 float lonn = FMath::DegreesToRadians(lon - lon0);
238 float latt0 = FMath::DegreesToRadians(lat0);
240 float eps = atan(tan(latt)/cos(lonn));
241 float nab = asinh(sin(lonn)/sqrt(tan(latt)*tan(latt)+cos(lonn)*cos(lonn)));
246 float eps0 = atan(tan(latt0)/cos(0));
247 float nab0 = asinh(sin(0)/sqrt(tan(latt0)*tan(latt0)+cos(0)*cos(0)));
264 FlushRenderingCommands(
true);
266 FlushPendingDeleteRHIResources_GameThread();
272 GEngine->PerformGarbageCollectionAndCleanupActors();
276 FText TransResetText(FText::FromString(
"Clean up after Move actors to sublevels"));
278 if ( GEditor->Trans )
281 GEditor->Trans->Reset(TransResetText);
283 GEditor->Cleanse(
true,
true, TransResetText);
UE_LOG(LogCarla, Log, TEXT("UActorDispatcher::Destroying actor: '%s' %x"), *Id, Actor)
static const float OSMToCentimetersScaleFactor
DEFINE_LOG_CATEGORY(LogCarlaMapGenFunctionLibrary)
static void CleanupGEngine()
static void FlushRenderingCommandsInBlueprint()
static UStaticMesh * CreateMesh(const FProceduralCustomMesh &Data, const TArray< FProcMeshTangent > &ParamTangents, UMaterialInstance *MaterialInstance, FString MapName, FString FolderName, FName MeshName)
static void SetThreadToSleep(float seconds)
static FMeshDescription BuildMeshDescriptionFromData(const FProceduralCustomMesh &Data, const TArray< FProcMeshTangent > &ParamTangents, UMaterialInstance *MaterialInstance)
static FVector2D GetTransversemercProjection(float lat, float lon, float lat0, float lon0)
TArray< int32 > Triangles
TArray< FVector > Vertices
TArray< FVector > Normals