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();