UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
StaticMeshOperations.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Containers/Array.h"
6#include "Containers/Map.h"
7#include "CoreMinimal.h"
9#include "Logging/LogMacros.h"
10#include "Math/Transform.h"
11#include "Math/UnrealMathSSE.h"
12#include "Math/Vector.h"
13#include "Math/Vector2D.h"
14#include "MeshTypes.h"
15#include "Misc/EnumClassFlags.h"
16#include "Misc/Optional.h"
17#include "Misc/SecureHash.h"
18
19class FName;
20struct FMeshDescription;
22struct FPolygonGroupID;
23struct FRawMesh;
24struct FUVMapParameters;
25
26enum class ELightmapUVVersion : int32;
27
29
31
32DECLARE_DELEGATE_ThreeParams(FAppendPolygonGroupsDelegate, const FMeshDescription& /*SourceMesh*/, FMeshDescription& /*TargetMesh*/, PolygonGroupMap& /*RemapPolygonGroup*/)
33
34enum class EComputeNTBsFlags : uint32
35{
36 None = 0x00000000, // No flags
37 Normals = 0x00000001, //Force-recompute the normals and implicitly force the recomputing of tangents.
38 Tangents = 0x00000002, //Force-recompute the tangents.
39 UseMikkTSpace = 0x00000004, //Used when force-recomputing the tangents, use MikkTSpace.
40 WeightedNTBs = 0x00000008, //Use weight surface area and angle when computing NTBs to proportionally distribute the vertex instance contribution to the normal/tangent/binormal in a smooth group. i.e. Weight solve the cylinder problem
41 BlendOverlappingNormals = 0x00000010,
42 IgnoreDegenerateTriangles = 0x00000020,
43};
45
47{
48public:
50 {
51 enum
52 {
54 };
55
57 bool bMergeVertexColor = true;
59 bool bMergeObjectName = false;
61 TOptional<FTransform> MeshTransform; // Apply a transformation on source mesh (see MeshTransform)
62 };
63
65 static STATICMESHDESCRIPTION_API void ComputeTriangleTangentsAndNormals(FMeshDescription& MeshDescription, float ComparisonThreshold = 0.0f, const TCHAR* DebugName = nullptr);
66
72
73 /*
74 * Make sure all normals and tangents are valid. If not, recompute them.
75 */
77
80
83
86
89
92
100
101 UE_DEPRECATED(5.5, "Use HasInvalidVertexInstanceNormalsOrTangents")
106
107
110
113
129 int32 SrcLightmapIndex,
130 int32 DstLightmapIndex,
131 int32 MinLightmapResolution,
134
136 UE_DEPRECATED(5.4, "Please use GenerateUV() instead.")
138
140 {
141 Default,
142 Legacy,
143 UVAtlas,
144 XAtlas,
146 };
147
149 {
150 // Expected texture resolution
152
153 // Wether to fold triangles sharing the same UVs & vertex colors in the generated UV mapping.
155
156 // Method to use when generating UVs
158 };
159
162
164 static STATICMESHDESCRIPTION_API bool AddUVChannel(FMeshDescription& MeshDescription);
165
167 static STATICMESHDESCRIPTION_API bool InsertUVChannel(FMeshDescription& MeshDescription, int32 UVChannelIndex);
168
170 static STATICMESHDESCRIPTION_API bool RemoveUVChannel(FMeshDescription& MeshDescription, int32 UVChannelIndex);
171
174
177
180
181 //static void RemapPolygonGroups(FMeshDescription& MeshDescription, TMap<FPolygonGroupID, FPolygonGroupID>& Remap);
182
183 /*
184 * Move some polygon to a new PolygonGroup(section)
185 * SectionIndex: The target section we want to assign the polygon. See bRemoveEmptyPolygonGroup to know how its used
186 * TriangleIndexStart: The triangle index is compute as follow: foreach polygon {TriangleIndex += Polygon->NumberTriangles}
187 * TriangleIndexEnd: The triangle index is compute as follow: foreach polygon {TriangleIndex += Polygon->NumberTriangles}
188 * bRemoveEmptyPolygonGroup: If true, any polygonGroup that is empty after moving a polygon will be delete.
189 * This parameter impact how SectionIndex is use
190 * If param is true : PolygonGroupTargetID.GetValue() do not necessary equal SectionIndex in case there is less sections then SectionIndex
191 * If param is false : PolygonGroupTargetID.GetValue() equal SectionIndex, we will add all necessary missing PolygonGroupID (this can generate empty PolygonGroupID)
192 */
194
196
198
199 static STATICMESHDESCRIPTION_API bool HasVertexColor(const FMeshDescription& MeshDescription);
200
201 static STATICMESHDESCRIPTION_API void BuildWeldedVertexIDRemap(const FMeshDescription& MeshDescription, const float WeldingThreshold, TMap<FVertexID, FVertexID>& OutVertexIDRemap);
202
207
209 static STATICMESHDESCRIPTION_API void FlipPolygons(FMeshDescription& MeshDescription);
210
217
224
235
237 static STATICMESHDESCRIPTION_API bool ValidateAndFixData(FMeshDescription& MeshDescription, const FString& DebugName);
238
241};
#define UE_DEPRECATED(Version, Message)
Definition CoreMiscDefines.h:302
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define DECLARE_DELEGATE_ThreeParams(DelegateName, Param1Type, Param2Type, Param3Type)
Definition DelegateCombinations.h:66
#define DECLARE_LOG_CATEGORY_EXTERN(CategoryName, DefaultVerbosity, CompileTimeVerbosity)
Definition LogMacros.h:361
ELightmapUVVersion
Definition MeshUtilitiesCommon.h:8
TMap< FPolygonGroupID, FPolygonGroupID > PolygonGroupMap
Definition StaticMeshOperations.h:28
DECLARE_DELEGATE_ThreeParams(FAppendPolygonGroupsDelegate, const FMeshDescription &, FMeshDescription &, PolygonGroupMap &) enum class EComputeNTBsFlags ENUM_CLASS_FLAGS(EComputeNTBsFlags)
Definition StaticMeshOperations.h:44
#define UE_KINDA_SMALL_NUMBER
Definition UnrealMathUtility.h:131
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition NameTypes.h:617
Definition SecureHash.h:226
Definition StaticMeshOperations.h:47
static STATICMESHDESCRIPTION_API float ComputeMeshArea(const FMeshDescription &InMeshDescription)
Definition StaticMeshOperations.cpp:3078
static STATICMESHDESCRIPTION_API void DetermineEdgeHardnessesFromVertexInstanceNormals(FMeshDescription &MeshDescription, float Tolerance=UE_KINDA_SMALL_NUMBER)
Definition StaticMeshOperations.cpp:238
static STATICMESHDESCRIPTION_API void ConvertFromRawMesh(const FRawMesh &SourceRawMesh, FMeshDescription &DestinationMeshDescription, const TMap< int32, FName > &MaterialMap, bool bSkipNormalsAndTangents=false, const TCHAR *DebugName=nullptr)
Definition StaticMeshOperations.cpp:716
static STATICMESHDESCRIPTION_API void FlipPolygons(FMeshDescription &MeshDescription)
Definition StaticMeshOperations.cpp:2649
static STATICMESHDESCRIPTION_API bool ValidateAndFixData(FMeshDescription &MeshDescription, const FString &DebugName)
Definition StaticMeshOperations.cpp:2998
static STATICMESHDESCRIPTION_API void BuildWeldedVertexIDRemap(const FMeshDescription &MeshDescription, const float WeldingThreshold, TMap< FVertexID, FVertexID > &OutVertexIDRemap)
Definition StaticMeshOperations.cpp:2556
static STATICMESHDESCRIPTION_API bool CreateLightMapUVLayout(FMeshDescription &MeshDescription, int32 SrcLightmapIndex, int32 DstLightmapIndex, int32 MinLightmapResolution, ELightmapUVVersion LightmapUVVersion, const FOverlappingCorners &OverlappingCorners)
Definition StaticMeshOperations.cpp:1915
static STATICMESHDESCRIPTION_API bool RemoveUVChannel(FMeshDescription &MeshDescription, int32 UVChannelIndex)
Definition StaticMeshOperations.cpp:2288
static STATICMESHDESCRIPTION_API void ConvertSmoothGroupToHardEdges(const TArray< uint32 > &FaceSmoothingMasks, FMeshDescription &DestinationMeshDescription)
Definition StaticMeshOperations.cpp:482
static STATICMESHDESCRIPTION_API bool AddUVChannel(FMeshDescription &MeshDescription)
Definition StaticMeshOperations.cpp:2256
static STATICMESHDESCRIPTION_API void SwapPolygonPolygonGroup(FMeshDescription &MeshDescription, int32 SectionIndex, int32 TriangleIndexStart, int32 TriangleIndexEnd, bool bRemoveEmptyPolygonGroup)
Definition StaticMeshOperations.cpp:2495
static STATICMESHDESCRIPTION_API void GeneratePlanarUV(const FMeshDescription &MeshDescription, const FUVMapParameters &Params, TMap< FVertexInstanceID, FVector2D > &OutTexCoords)
Definition StaticMeshOperations.cpp:2307
static STATICMESHDESCRIPTION_API bool HasVertexColor(const FMeshDescription &MeshDescription)
Definition StaticMeshOperations.cpp:2540
static STATICMESHDESCRIPTION_API void ComputeTriangleTangentsAndNormals(FMeshDescription &MeshDescription, float ComparisonThreshold=0.0f, const TCHAR *DebugName=nullptr)
Definition StaticMeshOperations.cpp:137
static STATICMESHDESCRIPTION_API void AppendMeshDescriptions(const TArray< const FMeshDescription * > &SourceMeshes, FMeshDescription &TargetMesh, const FAppendSettings &AppendSettings)
Definition StaticMeshOperations.cpp:880
static STATICMESHDESCRIPTION_API void ComputeMikktTangents(FMeshDescription &MeshDescription, bool bIgnoreDegenerateTriangles)
Definition StaticMeshOperations.cpp:1706
static STATICMESHDESCRIPTION_API void RecomputeNormalsAndTangentsIfNeeded(FMeshDescription &MeshDescription, EComputeNTBsFlags ComputeNTBsOptions)
Definition StaticMeshOperations.cpp:1241
static STATICMESHDESCRIPTION_API int32 GetUVChartCount(FMeshDescription &MeshDescription, int32 SrcLightmapIndex, ELightmapUVVersion LightmapUVVersion, const FOverlappingCorners &OverlappingCorners)
Definition StaticMeshOperations.cpp:1906
static STATICMESHDESCRIPTION_API int32 GetUniqueVertexCount(const FMeshDescription &MeshDescription)
Definition StaticMeshOperations.cpp:2779
static STATICMESHDESCRIPTION_API void AppendMeshDescription(const FMeshDescription &SourceMesh, FMeshDescription &TargetMesh, const FAppendSettings &AppendSettings)
Definition StaticMeshOperations.cpp:1174
static STATICMESHDESCRIPTION_API void ReorderMeshDescriptionPolygonGroups(const FMeshDescription &SourceMeshDescription, FMeshDescription &DestinationMeshDescription, TOptional< const FString > UnmatchMaterialNameWarning, TOptional< const FString > DestinationPolygonGroupCountDifferFromSource_Msg)
Definition StaticMeshOperations.cpp:2895
static STATICMESHDESCRIPTION_API void ComputeTangentsAndNormals(FMeshDescription &MeshDescription, EComputeNTBsFlags ComputeNTBsOptions)
Definition StaticMeshOperations.cpp:1260
static STATICMESHDESCRIPTION_API void GenerateCylindricalUV(FMeshDescription &MeshDescription, const FUVMapParameters &Params, TMap< FVertexInstanceID, FVector2D > &OutTexCoords)
Definition StaticMeshOperations.cpp:2336
static STATICMESHDESCRIPTION_API void ApplyTransform(FMeshDescription &MeshDescription, const FTransform &Transform, bool bApplyCorrectNormalTransform=false)
Definition StaticMeshOperations.cpp:2674
EGenerateUVMethod
Definition StaticMeshOperations.h:140
static STATICMESHDESCRIPTION_API void FindOverlappingCorners(FOverlappingCorners &OverlappingCorners, const FMeshDescription &MeshDescription, float ComparisonThreshold)
Definition StaticMeshOperations.cpp:1757
static void AreNormalsAndTangentsValid(const FMeshDescription &MeshDescription, bool &bHasInvalidNormals, bool &bHasInvalidTangents)
Definition StaticMeshOperations.h:102
static STATICMESHDESCRIPTION_API bool GenerateUV(const FMeshDescription &MeshDescription, const FGenerateUVOptions &Options, TArray< FVector2D > &OutTexCoords)
Definition StaticMeshOperations.cpp:2136
static STATICMESHDESCRIPTION_API bool GenerateUniqueUVsForStaticMesh(const FMeshDescription &MeshDescription, int32 TextureResolution, bool bMergeIdenticalMaterials, TArray< FVector2D > &OutTexCoords)
Definition StaticMeshOperations.cpp:2126
static STATICMESHDESCRIPTION_API void GenerateBoxUV(const FMeshDescription &MeshDescription, const FUVMapParameters &Params, TMap< FVertexInstanceID, FVector2D > &OutTexCoords)
Definition StaticMeshOperations.cpp:2415
static STATICMESHDESCRIPTION_API bool InsertUVChannel(FMeshDescription &MeshDescription, int32 UVChannelIndex)
Definition StaticMeshOperations.cpp:2269
static STATICMESHDESCRIPTION_API void HasInvalidVertexInstanceNormalsOrTangents(const FMeshDescription &MeshDescription, bool &bHasInvalidNormals, bool &bHasInvalidTangents)
Definition StaticMeshOperations.cpp:1181
static STATICMESHDESCRIPTION_API void ConvertHardEdgesToSmoothGroup(const FMeshDescription &SourceMeshDescription, TArray< uint32 > &FaceSmoothingMasks)
Definition StaticMeshOperations.cpp:348
static STATICMESHDESCRIPTION_API void ConvertToRawMesh(const FMeshDescription &SourceMeshDescription, FRawMesh &DestinationRawMesh, const TMap< FName, int32 > &MaterialMap)
Definition StaticMeshOperations.cpp:537
static STATICMESHDESCRIPTION_API FSHAHash ComputeSHAHash(const FMeshDescription &MeshDescription, bool bSkipTransientAttributes=false)
Definition StaticMeshOperations.cpp:2601
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition MeshDescription.h:94
Definition OverlappingCorners.h:16
Definition MeshTypes.h:236
Definition RawMesh.h:39
Definition StaticMeshOperations.h:50
bool bMergeUVChannels[MAX_NUM_UV_CHANNELS]
Definition StaticMeshOperations.h:58
FAppendPolygonGroupsDelegate PolygonGroupsDelegate
Definition StaticMeshOperations.h:56
FVector MergedAssetPivot
Definition StaticMeshOperations.h:60
bool bMergeVertexColor
Definition StaticMeshOperations.h:57
TOptional< FTransform > MeshTransform
Definition StaticMeshOperations.h:61
@ MAX_NUM_UV_CHANNELS
Definition StaticMeshOperations.h:53
bool bMergeObjectName
Definition StaticMeshOperations.h:59
Definition StaticMeshOperations.h:149
bool bMergeTrianglesWithIdenticalAttributes
Definition StaticMeshOperations.h:154
int32 TextureResolution
Definition StaticMeshOperations.h:151
EGenerateUVMethod UVMethod
Definition StaticMeshOperations.h:157
Definition UVMapSettings.h:49
Definition Optional.h:131
static CORE_API const TVector< double > ZeroVector
Definition Vector.h:79