UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
StaticMeshVertexBuffer.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "RenderResource.h"
6#include "RenderUtils.h"
8#include "PackedNormal.h"
9#include "Components.h"
10#include "Math/Vector2DHalf.h"
11#include "RenderMath.h"
12
13class FVertexFactory;
15class FVertexFactory;
17
18template<typename TangentTypeT>
20{
21 TangentTypeT TangentX;
22 TangentTypeT TangentZ;
23
24 inline FVector3f GetTangentX() const
25 {
26 return FVector3f(TangentX.ToFVector());
27 }
28
29 inline FVector4f GetTangentZ() const
30 {
31 return TangentZ.ToFVector4f();
32 }
33
34 inline FVector3f GetTangentY() const
35 {
37 }
38
44
53 {
54 Ar << Vertex.TangentX;
55 Ar << Vertex.TangentZ;
56 return Ar;
57 }
58};
59
60template<typename UVTypeT>
62{
64
65 inline FVector2f GetUV() const
66 {
67 return UVs;
68 }
69
70 inline void SetUV(FVector2f UV)
71 {
72 UVs = UV;
73 }
74
83 {
84 Ar << Vertex.UVs;
85 return Ar;
86 }
87};
88
94
96{
97 Default,
99};
100
101template<EStaticMeshVertexTangentBasisType TangentBasisType>
105
106template<>
112
113template<>
119
120template<EStaticMeshVertexUVType UVType>
124
125template<>
130
131template<>
136
137/*
138* FStaticMeshVertexBufferFlags : options for FStaticMeshVertexBuffer::Init
139* bNeedsCPUAccess - Whether the vertex data needs to be accessed by the CPU after creation
140* bUseBackwardsCompatibleF16TruncUVs - Whether backwards compatible legacy truncation mode should be used for F16 UVs
141*/
147
150{
152
153public:
154
157
160
162 ENGINE_API void CleanUp();
163
164 ENGINE_API void Init(uint32 InNumVertices, uint32 InNumTexCoords, bool bNeedsCPUAccess = true);
165
174
181 void Init(const FConstMeshBuildVertexView& InVertices, bool bNeedsCPUAccess = true)
182 {
184 Flags.bNeedsCPUAccess = bNeedsCPUAccess;
186 }
187
195
201 void Init(const FStaticMeshVertexBuffer& InVertexBuffer, bool bNeedsCPUAccess = true);
202
210 ENGINE_API void AppendVertices( const FStaticMeshBuildVertex* Vertices, const uint32 NumVerticesToAppend, bool bUseBackwardsCompatibleF16TruncUVs = false);
211
218 ENGINE_API void Serialize(FArchive& Ar, bool bNeedsCPUAccess);
219
220 void SerializeMetaData(FArchive& Ar);
221
222 ENGINE_API void SetMetaData(uint32 NumTexCoords, uint32 NumVertices, bool bUseFullPrecisionUVs, bool bUseHighPrecisionTangentBasis);
223
224 void ClearMetaData();
225
230
231 template<EStaticMeshVertexTangentBasisType TangentBasisTypeT>
232 inline FVector4f VertexTangentX_Typed(uint32 VertexIndex)const
233 {
235 TangentType* ElementData = reinterpret_cast<TangentType*>(TangentsDataPtr);
236 check((void*)((&ElementData[VertexIndex]) + 1) <= (void*)(TangentsDataPtr + TangentsData->GetResourceSize()));
237 check((void*)((&ElementData[VertexIndex]) + 0) >= (void*)(TangentsDataPtr));
238 return FVector4f(ElementData[VertexIndex].GetTangentX());
239 }
240
241 inline FVector4f VertexTangentX(uint32 VertexIndex) const
242 {
243 checkSlow(VertexIndex < GetNumVertices());
244
246 {
248 }
249 else
250 {
252 }
253 }
254
255 template<EStaticMeshVertexTangentBasisType TangentBasisTypeT>
256 inline FVector4f VertexTangentZ_Typed(uint32 VertexIndex)const
257 {
259 TangentType* ElementData = reinterpret_cast<TangentType*>(TangentsDataPtr);
260 check((void*)((&ElementData[VertexIndex]) + 1) <= (void*)(TangentsDataPtr + TangentsData->GetResourceSize()));
261 check((void*)((&ElementData[VertexIndex]) + 0) >= (void*)(TangentsDataPtr));
262 return FVector4f(ElementData[VertexIndex].GetTangentZ());
263 }
264
265 inline FVector4f VertexTangentZ(uint32 VertexIndex) const
266 {
267 checkSlow(VertexIndex < GetNumVertices());
268
270 {
272 }
273 else
274 {
276 }
277 }
278
279 template<EStaticMeshVertexTangentBasisType TangentBasisTypeT>
280 inline FVector4f VertexTangentY_Typed(uint32 VertexIndex)const
281 {
283 TangentType* ElementData = reinterpret_cast<TangentType*>(TangentsDataPtr);
284 check((void*)((&ElementData[VertexIndex]) + 1) <= (void*)(TangentsDataPtr + TangentsData->GetResourceSize()));
285 check((void*)((&ElementData[VertexIndex]) + 0) >= (void*)(TangentsDataPtr));
286 return FVector4f(ElementData[VertexIndex].GetTangentY());
287 }
288
295 inline FVector3f VertexTangentY(uint32 VertexIndex) const
296 {
297 checkSlow(VertexIndex < GetNumVertices());
298
300 {
302 }
303 else
304 {
306 }
307 }
308
310 {
311 checkSlow(VertexIndex < GetNumVertices());
312
314 {
316 TangentType* ElementData = reinterpret_cast<TangentType*>(TangentsDataPtr);
317 check((void*)((&ElementData[VertexIndex]) + 1) <= (void*)(TangentsDataPtr + TangentsData->GetResourceSize()));
318 check((void*)((&ElementData[VertexIndex]) + 0) >= (void*)(TangentsDataPtr));
319 ElementData[VertexIndex].SetTangents(X, Y, Z);
320 }
321 else
322 {
324 TangentType* ElementData = reinterpret_cast<TangentType*>(TangentsDataPtr);
325 check((void*)((&ElementData[VertexIndex]) + 1) <= (void*)(TangentsDataPtr + TangentsData->GetResourceSize()));
326 check((void*)((&ElementData[VertexIndex]) + 0) >= (void*)(TangentsDataPtr));
327 ElementData[VertexIndex].SetTangents(X, Y, Z);
328 }
329 }
330
339 inline void SetVertexUV(uint32 VertexIndex, uint32 UVIndex, const FVector2f& Vec2D, bool bUseBackwardsCompatibleF16TruncUVs = false)
340 {
341 checkSlow(VertexIndex < GetNumVertices());
342 checkSlow(UVIndex < GetNumTexCoords());
343
345 {
346 size_t UvStride = sizeof(FVector2f) * GetNumTexCoords();
347
348 FVector2f* ElementData = reinterpret_cast<FVector2f*>(TexcoordDataPtr + (VertexIndex * UvStride));
349 check((void*)((&ElementData[UVIndex]) + 1) <= (void*)(TexcoordDataPtr + TexcoordData->GetResourceSize()));
350 check((void*)((&ElementData[UVIndex]) + 0) >= (void*)(TexcoordDataPtr));
351 ElementData[UVIndex] = Vec2D;
352 }
353 else
354 {
355 size_t UvStride = sizeof(FVector2DHalf) * GetNumTexCoords();
356
357 FVector2DHalf* ElementData = reinterpret_cast<FVector2DHalf*>(TexcoordDataPtr + (VertexIndex * UvStride));
358 check((void*)((&ElementData[UVIndex]) + 1) <= (void*)(TexcoordDataPtr + TexcoordData->GetResourceSize()));
359 check((void*)((&ElementData[UVIndex]) + 0) >= (void*)(TexcoordDataPtr));
360
361 if ( bUseBackwardsCompatibleF16TruncUVs )
362 {
363 ElementData[UVIndex].SetTruncate( Vec2D );
364 }
365 else
366 {
367 ElementData[UVIndex] = Vec2D;
368 }
369 }
370 }
371
372 template<EStaticMeshVertexUVType UVTypeT>
373 inline FVector2f GetVertexUV_Typed(uint32 VertexIndex, uint32 UVIndex)const
374 {
376 size_t UvStride = sizeof(UVType) * GetNumTexCoords();
377
378 UVType* ElementData = reinterpret_cast<UVType*>(TexcoordDataPtr + (VertexIndex * UvStride));
379 check((void*)((&ElementData[UVIndex]) + 1) <= (void*)(TexcoordDataPtr + TexcoordData->GetResourceSize()));
380 check((void*)((&ElementData[UVIndex]) + 0) >= (void*)(TexcoordDataPtr));
381 return ElementData[UVIndex].GetUV();
382 }
383
391 inline FVector2f GetVertexUV(uint32 VertexIndex, uint32 UVIndex) const
392 {
393 checkSlow(VertexIndex < GetNumVertices());
394 checkSlow(UVIndex < GetNumTexCoords());
395
397 {
399 }
400 else
401 {
402 return GetVertexUV_Typed<EStaticMeshVertexUVType::Default>(VertexIndex, UVIndex);
403 }
404 }
405
406 inline uint32 GetNumVertices() const
407 {
408 return NumVertices;
409 }
410
411 inline uint32 GetNumTexCoords() const
412 {
413 return NumTexCoords;
414 }
415
416 inline bool GetUseFullPrecisionUVs() const
417 {
418 return bUseFullPrecisionUVs;
419 }
420
422 {
423 bUseFullPrecisionUVs = UseFull;
424 }
425
427 {
428 return bUseHighPrecisionTangentBasis;
429 }
430
432 {
433 bUseHighPrecisionTangentBasis = bUseHighPrecision;
434 }
435
436 inline uint32 GetResourceSize() const
437 {
438 return (TangentsStride + (TexcoordStride * GetNumTexCoords())) * NumVertices;
439 }
440
444
448
449 // FRenderResource interface.
450 ENGINE_API virtual void InitRHI(FRHICommandListBase& RHICmdList) override;
451 ENGINE_API virtual void ReleaseRHI() override;
452 ENGINE_API virtual void InitResource(FRHICommandListBase& RHICmdList) override;
453 ENGINE_API virtual void ReleaseResource() override;
454 virtual FString GetFriendlyName() const override { return TEXT("Static-mesh vertices"); }
455
456 ENGINE_API void BindTangentVertexBuffer(const FVertexFactory* VertexFactory, struct FStaticMeshDataType& Data) const;
457 ENGINE_API void BindTexCoordVertexBuffer(const FVertexFactory* VertexFactory, struct FStaticMeshDataType& Data, int ClampedNumTexCoords = -1) const;
458 ENGINE_API void BindPackedTexCoordVertexBuffer(const FVertexFactory* VertexFactory, struct FStaticMeshDataType& Data, int32 MaxNumTexCoords = -1) const;
459 ENGINE_API void BindLightMapVertexBuffer(const FVertexFactory* VertexFactory, struct FStaticMeshDataType& Data, int LightMapCoordinateIndex) const;
460
461 inline void* GetTangentData() { return TangentsDataPtr; }
462 inline const void* GetTangentData() const { return TangentsDataPtr; }
463
464 inline void* GetTexCoordData() { return TexcoordDataPtr; }
465 inline const void* GetTexCoordData() const { return TexcoordDataPtr; }
466
467 ENGINE_API int GetTangentSize() const;
468
469 ENGINE_API int GetTexCoordSize() const;
470
471 inline bool GetAllowCPUAccess() const
472 {
473 if (!TangentsData || !TexcoordData)
474 return false;
475
476 return TangentsData->GetAllowCPUAccess() && TexcoordData->GetAllowCPUAccess();
477 }
478
480 {
481 virtual FString GetFriendlyName() const override { return TEXT("FTangentsVertexBuffer"); }
483
485 {
486 virtual FString GetFriendlyName() const override { return TEXT("FTexcoordVertexBuffer"); }
488
493
494 FRHIShaderResourceView* GetTangentsSRV() const { return TangentsSRV; }
495 FRHIShaderResourceView* GetTexCoordsSRV() const { return TextureCoordinatesSRV; }
496
497 // Allows for creating SRV on demand
498 // Note: consider cache the SRV locally if multiple compute tasks all need access to one in a single frame
501
502private:
503
505 FStaticMeshVertexDataInterface* TangentsData;
506 FShaderResourceViewRHIRef TangentsSRV;
507
508 FStaticMeshVertexDataInterface* TexcoordData;
509 FShaderResourceViewRHIRef TextureCoordinatesSRV;
510
512 uint8* TangentsDataPtr;
513 uint8* TexcoordDataPtr;
514
516 mutable uint32 TangentsStride; // Mutable to allow updating through const getter
517
519 mutable uint32 TexcoordStride; // Mutable to allow updating through const getter
520
522 uint32 NumTexCoords;
523
525 uint32 NumVertices;
526
528 bool bUseFullPrecisionUVs;
529
531 bool bUseHighPrecisionTangentBasis;
532
533 bool NeedsCPUAccess = true;
534
536 void AllocateData(bool bNeedsCPUAccess = true);
537
541 void ConvertHalfTexcoordsToFloat(const uint8* InData);
542
543 void InitTangentAndTexCoordStrides();
544};
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define check(expr)
Definition AssertionMacros.h:314
FConstMeshBuildVertexView MakeConstMeshBuildVertexView(const TConstArrayView< FStaticMeshBuildVertex > &InVertices)
Definition Components.h:205
#define TEXT(x)
Definition Platform.h:1272
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 X(Name, Desc)
Definition FormatStringSan.h:47
bool IsValidRef(const FVertexBufferAndSRV &Buffer)
Definition GPUSkinVertexFactory.h:92
void Init()
Definition LockFreeList.h:4
UE::Math::TVector2< float > FVector2f
Definition MathFwd.h:74
UE::Math::TVector< float > FVector3f
Definition MathFwd.h:73
UE::Math::TVector< double > FVector3d
Definition MathFwd.h:60
UE::Math::TVector4< float > FVector4f
Definition MathFwd.h:75
@ Vertex
Definition MetalRHIPrivate.h:223
EVertexElementType
Definition RHIDefinitions.h:496
@ VET_PackedNormal
Definition RHIDefinitions.h:502
@ VET_Short4N
Definition RHIDefinitions.h:511
FVector GenerateYAxis(const VectorType &XAxis, const VectorType &ZAxis)
Definition RenderMath.h:49
float GetBasisDeterminantSign(const FVector &XAxis, const FVector &YAxis, const FVector &ZAxis)
Definition RenderMath.h:16
EStaticMeshVertexTangentBasisType
Definition StaticMeshVertexBuffer.h:90
EStaticMeshVertexUVType
Definition StaticMeshVertexBuffer.h:96
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
Definition RHIResources.h:1581
Definition RHICommandList.h:455
Definition RHIResourceReplace.h:55
Definition RHIResources.h:3304
Definition RenderResource.h:37
Definition StaticMeshVertexBuffer.h:480
Definition StaticMeshVertexBuffer.h:485
Definition StaticMeshVertexBuffer.h:150
ENGINE_API FStaticMeshVertexBuffer()
void ReleaseRHIForStreaming(FRHIResourceReplaceBatcher &Batcher)
Definition StaticMeshVertexBuffer.cpp:306
ENGINE_API ~FStaticMeshVertexBuffer()
Definition StaticMeshVertexBuffer.cpp:25
void SetUseHighPrecisionTangentBasis(bool bUseHighPrecision)
Definition StaticMeshVertexBuffer.h:431
ENGINE_API void operator=(const FStaticMeshVertexBuffer &Other)
Definition StaticMeshVertexBuffer.cpp:272
FVector2f GetVertexUV(uint32 VertexIndex, uint32 UVIndex) const
Definition StaticMeshVertexBuffer.h:391
FRHIShaderResourceView * GetTangentsSRV() const
Definition StaticMeshVertexBuffer.h:494
bool GetAllowCPUAccess() const
Definition StaticMeshVertexBuffer.h:471
const void * GetTexCoordData() const
Definition StaticMeshVertexBuffer.h:465
virtual FString GetFriendlyName() const override
Definition StaticMeshVertexBuffer.h:454
const void * GetTangentData() const
Definition StaticMeshVertexBuffer.h:462
uint32 GetNumVertices() const
Definition StaticMeshVertexBuffer.h:406
FVector4f VertexTangentX_Typed(uint32 VertexIndex) const
Definition StaticMeshVertexBuffer.h:232
FVector2f GetVertexUV_Typed(uint32 VertexIndex, uint32 UVIndex) const
Definition StaticMeshVertexBuffer.h:373
void * GetTangentData()
Definition StaticMeshVertexBuffer.h:461
FStaticMeshVertexBuffer::FTangentsVertexBuffer TangentsVertexBuffer
void SerializeMetaData(FArchive &Ar)
Definition StaticMeshVertexBuffer.cpp:241
uint32 GetResourceSize() const
Definition StaticMeshVertexBuffer.h:436
ENGINE_API void AppendVertices(const FStaticMeshBuildVertex *Vertices, const uint32 NumVerticesToAppend, bool bUseBackwardsCompatibleF16TruncUVs=false)
Definition StaticMeshVertexBuffer.cpp:153
ENGINE_API FShaderResourceViewRHIRef GetOrCreateTexCoordsSRV(FRHICommandListBase &RHICmdList) const
Definition StaticMeshVertexBuffer.cpp:453
virtual ENGINE_API void ReleaseRHI() override
Definition StaticMeshVertexBuffer.cpp:341
void SetVertexTangents(uint32 VertexIndex, FVector3f X, FVector3f Y, FVector3f Z)
Definition StaticMeshVertexBuffer.h:309
virtual ENGINE_API void InitResource(FRHICommandListBase &RHICmdList) override
Definition StaticMeshVertexBuffer.cpp:349
void Init(const FConstMeshBuildVertexView &InVertices, bool bNeedsCPUAccess=true)
Definition StaticMeshVertexBuffer.h:181
FVector4f VertexTangentZ_Typed(uint32 VertexIndex) const
Definition StaticMeshVertexBuffer.h:256
ENGINE_API int GetTangentSize() const
Definition StaticMeshVertexBuffer.cpp:396
ENGINE_API void BindLightMapVertexBuffer(const FVertexFactory *VertexFactory, struct FStaticMeshDataType &Data, int LightMapCoordinateIndex) const
Definition StaticMeshVertexBuffer.cpp:648
ENGINE_API void BindPackedTexCoordVertexBuffer(const FVertexFactory *VertexFactory, struct FStaticMeshDataType &Data, int32 MaxNumTexCoords=-1) const
Definition StaticMeshVertexBuffer.cpp:536
bool GetUseHighPrecisionTangentBasis() const
Definition StaticMeshVertexBuffer.h:426
void Init(const TArray< FStaticMeshBuildVertex > &InVertices, uint32 InNumTexCoords, bool bNeedsCPUAccess=true)
Definition StaticMeshVertexBuffer.h:188
void ClearMetaData()
Definition StaticMeshVertexBuffer.cpp:260
uint32 GetNumTexCoords() const
Definition StaticMeshVertexBuffer.h:411
FVector4f VertexTangentZ(uint32 VertexIndex) const
Definition StaticMeshVertexBuffer.h:265
FVector3f VertexTangentY(uint32 VertexIndex) const
Definition StaticMeshVertexBuffer.h:295
FStaticMeshVertexBuffer::FTexcoordVertexBuffer TexCoordVertexBuffer
virtual ENGINE_API void ReleaseResource() override
Definition StaticMeshVertexBuffer.cpp:356
FVector4f VertexTangentX(uint32 VertexIndex) const
Definition StaticMeshVertexBuffer.h:241
bool IsValid()
Definition StaticMeshVertexBuffer.h:489
FBufferRHIRef CreateTexCoordRHIBuffer(FRHICommandListBase &RHICmdList)
Definition StaticMeshVertexBuffer.cpp:285
FRHIShaderResourceView * GetTexCoordsSRV() const
Definition StaticMeshVertexBuffer.h:495
ENGINE_API void BindTangentVertexBuffer(const FVertexFactory *VertexFactory, struct FStaticMeshDataType &Data) const
Definition StaticMeshVertexBuffer.cpp:488
void InitRHIForStreaming(FRHIBuffer *IntermediateTangentsBuffer, FRHIBuffer *IntermediateTexCoordBuffer, FRHIResourceReplaceBatcher &Batcher)
Definition StaticMeshVertexBuffer.cpp:290
ENGINE_API void CleanUp()
Definition StaticMeshVertexBuffer.cpp:31
void SetVertexUV(uint32 VertexIndex, uint32 UVIndex, const FVector2f &Vec2D, bool bUseBackwardsCompatibleF16TruncUVs=false)
Definition StaticMeshVertexBuffer.h:339
ENGINE_API int GetTexCoordSize() const
Definition StaticMeshVertexBuffer.cpp:412
FVector4f VertexTangentY_Typed(uint32 VertexIndex) const
Definition StaticMeshVertexBuffer.h:280
FBufferRHIRef CreateTangentsRHIBuffer(FRHICommandListBase &RHICmdList)
Definition StaticMeshVertexBuffer.cpp:280
void SetUseFullPrecisionUVs(bool UseFull)
Definition StaticMeshVertexBuffer.h:421
ENGINE_API void SetMetaData(uint32 NumTexCoords, uint32 NumVertices, bool bUseFullPrecisionUVs, bool bUseHighPrecisionTangentBasis)
Definition StaticMeshVertexBuffer.cpp:250
ENGINE_API void BindTexCoordVertexBuffer(const FVertexFactory *VertexFactory, struct FStaticMeshDataType &Data, int ClampedNumTexCoords=-1) const
Definition StaticMeshVertexBuffer.cpp:598
ENGINE_API FShaderResourceViewRHIRef GetOrCreateTangentsSRV(FRHICommandListBase &RHICmdList) const
Definition StaticMeshVertexBuffer.cpp:428
virtual ENGINE_API void InitRHI(FRHICommandListBase &RHICmdList) override
Definition StaticMeshVertexBuffer.cpp:313
void * GetTexCoordData()
Definition StaticMeshVertexBuffer.h:464
bool GetUseFullPrecisionUVs() const
Definition StaticMeshVertexBuffer.h:416
Definition StaticMeshVertexDataInterface.h:22
virtual SIZE_T GetResourceSize() const =0
virtual bool GetAllowCPUAccess() const =0
Definition RenderResource.h:474
FBufferRHIRef VertexBufferRHI
Definition RenderResource.h:489
Definition VertexFactory.h:661
Definition Array.h:670
Definition Components.h:72
Definition PackedNormal.h:13
Definition PackedNormal.h:309
Definition Components.h:26
Definition Components.h:38
Definition StaticMeshVertexBuffer.h:143
bool bNeedsCPUAccess
Definition StaticMeshVertexBuffer.h:144
bool bUseBackwardsCompatibleF16TruncUVs
Definition StaticMeshVertexBuffer.h:145
Definition Vector2DHalf.h:14
void SetTruncate(float InX, float InY)
Definition Vector2DHalf.h:152
Definition StaticMeshVertexBuffer.h:20
void SetTangents(FVector3f X, FVector3f Y, FVector3f Z)
Definition StaticMeshVertexBuffer.h:39
FVector3f GetTangentX() const
Definition StaticMeshVertexBuffer.h:24
TangentTypeT TangentX
Definition StaticMeshVertexBuffer.h:21
FVector4f GetTangentZ() const
Definition StaticMeshVertexBuffer.h:29
FVector3f GetTangentY() const
Definition StaticMeshVertexBuffer.h:34
TangentTypeT TangentZ
Definition StaticMeshVertexBuffer.h:22
friend FArchive & operator<<(FArchive &Ar, TStaticMeshVertexTangentDatum &Vertex)
Definition StaticMeshVertexBuffer.h:52
FPackedNormal TangentTypeT
Definition StaticMeshVertexBuffer.h:109
Definition StaticMeshVertexBuffer.h:103
Definition StaticMeshVertexBuffer.h:62
void SetUV(FVector2f UV)
Definition StaticMeshVertexBuffer.h:70
friend FArchive & operator<<(FArchive &Ar, TStaticMeshVertexUVsDatum &Vertex)
Definition StaticMeshVertexBuffer.h:82
UVTypeT UVs
Definition StaticMeshVertexBuffer.h:63
FVector2f GetUV() const
Definition StaticMeshVertexBuffer.h:65
FVector2DHalf UVsTypeT
Definition StaticMeshVertexBuffer.h:128
FVector2f UVsTypeT
Definition StaticMeshVertexBuffer.h:134
Definition StaticMeshVertexBuffer.h:122