UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
DynamicMeshSceneProxy.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
8#include "Async/ParallelFor.h"
10#include "MaterialDomain.h"
11#include "MaterialShared.h"
12#include "SceneInterface.h"
13
23{
26private:
27 FMaterialRelevance MaterialRelevance;
28
29 // note: FBaseDynamicMeshSceneProxy owns and will destroy these
30 TArray<FMeshRenderBufferSet*> RenderBufferSets;
31
32 // if true, we store entire mesh in single RenderBuffers and we can do some optimizations
33 bool bIsSingleBuffer = false;
34
35public:
38
39
42 , MaterialRelevance(Component->GetMaterialRelevance(GetScene().GetShaderPlatform()))
43 {
45 }
46
47
49 {
50 Buffers = RenderBufferSets;
51 }
52
53
54
56 {
57 // allocate buffer sets based on materials
58 ensure(RenderBufferSets.Num() == 0);
59 int32 NumMaterials = GetNumMaterials();
60 if (NumMaterials == 0)
61 {
62 RenderBufferSets.SetNum(1);
63 RenderBufferSets[0] = AllocateNewRenderBufferSet();
64 RenderBufferSets[0]->Material = UMaterial::GetDefaultMaterial(MD_Surface);
65 }
66 else
67 {
68 RenderBufferSets.SetNum(NumMaterials);
69 for (int32 k = 0; k < NumMaterials; ++k)
70 {
71 RenderBufferSets[k] = AllocateNewRenderBufferSet();
72 RenderBufferSets[k]->Material = GetMaterial(k);
73 }
74 }
75
76
77 FDynamicMesh3* Mesh = ParentComponent->GetRenderMesh();
78 if (Mesh->HasAttributes() && Mesh->Attributes()->HasMaterialID() && NumMaterials > 1)
79 {
80 bIsSingleBuffer = false;
81 InitializeByMaterial(RenderBufferSets);
82 }
83 else
84 {
85 bIsSingleBuffer = true;
86 InitializeSingleBufferSet(RenderBufferSets[0]);
87 }
88
89 // set (or clear) simple Lumen cards via the bounding box
90 // TODO: Implement a better method to set up the lumen cards
92 }
93
94
95
97 {
99 if (TangentsType == EDynamicMeshComponentTangentsMode::ExternallyProvided)
100 {
102 // If the RenderMesh has tangents, use them. Otherwise we fall back to the orthogonal basis, below.
103 if (RenderMesh && RenderMesh->HasAttributes() && RenderMesh->Attributes()->HasTangentSpace())
104 {
106 return [Tangents](int VertexID, int TriangleID, int TriVtxIdx, const FVector3f& Normal, FVector3f& TangentX, FVector3f& TangentY) -> void
107 {
108 Tangents.GetTangentVectors(TriangleID, TriVtxIdx, Normal, TangentX, TangentY);
109 };
110 }
111 }
113 {
114 const UE::Geometry::FMeshTangentsf* Tangents = ParentComponent->GetAutoCalculatedTangents();
115 if (Tangents != nullptr )
116 {
117 return [Tangents](int VertexID, int TriangleID, int TriVtxIdx, const FVector3f& Normal, FVector3f& TangentX, FVector3f& TangentY) -> void
118 {
119 Tangents->GetTriangleVertexTangentVectors(TriangleID, TriVtxIdx, TangentX, TangentY);
120 };
121 }
122 }
123
124 // fallback to orthogonal basis
125 return [](int VertexID, int TriangleID, int TriVtxIdx, const FVector3f& Normal, FVector3f& TangentX, FVector3f& TangentY) -> void
126 {
128 };
129 }
130
131
136 {
137 ensure(RenderBufferSets.Num() == 0);
138 int32 NumSets = Decomposition->Num();
139 RenderBufferSets.SetNum(NumSets);
140 for (int32 k = 0; k < NumSets; ++k)
141 {
142 RenderBufferSets[k] = AllocateNewRenderBufferSet();
143 RenderBufferSets[k]->Material = Decomposition->GetGroup(k).Material;
144 if (RenderBufferSets[k]->Material == nullptr)
145 {
146 RenderBufferSets[k]->Material = UMaterial::GetDefaultMaterial(MD_Surface);
147 }
148 }
149
150 bIsSingleBuffer = false;
151
152 const FDynamicMesh3* Mesh = ParentComponent->GetRenderMesh();
153 const FDynamicMeshAttributeSet* Attributes = Mesh->Attributes();
154
155 // find suitable overlays
157 UVOverlays.SetNum(Attributes->NumUVLayers());
158 for (int32 k = 0; k < UVOverlays.Num(); ++k)
159 {
160 UVOverlays[k] = Attributes->GetUVLayer(k);
161 }
162 const FDynamicMeshNormalOverlay* NormalOverlay = Attributes->PrimaryNormals();
163 const FDynamicMeshColorOverlay* ColorOverlay = Attributes->PrimaryColors();
165
166 // init renderbuffers for each set
167 ParallelFor(NumSets, [&](int32 SetIndex)
168 {
169 const FMeshRenderDecomposition::FGroup& Group = Decomposition->GetGroup(SetIndex);
170 const TArray<int32>& Triangles = Group.Triangles;
171 if (Triangles.Num() > 0)
172 {
173 FMeshRenderBufferSet* RenderBuffers = RenderBufferSets[SetIndex];
174 RenderBuffers->Triangles = Triangles;
175 InitializeBuffersFromOverlays(RenderBuffers, Mesh,
176 Triangles.Num(), Triangles,
177 UVOverlays, NormalOverlay, ColorOverlay, TangentsFunc);
178
179 ENQUEUE_RENDER_COMMAND(FDynamicMeshSceneProxyInitializeFromDecomposition)(
180 [RenderBuffers](FRHICommandListImmediate& RHICmdList)
181 {
182 RenderBuffers->Upload();
183 });
184 }
185 });
186 }
187
188
189
190
191
192
193
194
199 {
200 const FDynamicMesh3* Mesh = ParentComponent->GetRenderMesh();
201
202 // find suitable overlays
204 const FDynamicMeshNormalOverlay* NormalOverlay = nullptr;
205 const FDynamicMeshColorOverlay* ColorOverlay = nullptr;
206 if (Mesh->HasAttributes())
207 {
208 const FDynamicMeshAttributeSet* Attributes = Mesh->Attributes();
209 NormalOverlay = Attributes->PrimaryNormals();
210 UVOverlays.SetNum(Attributes->NumUVLayers());
211 for (int32 k = 0; k < UVOverlays.Num(); ++k)
212 {
213 UVOverlays[k] = Attributes->GetUVLayer(k);
214 }
215 ColorOverlay = Attributes->PrimaryColors();
216 }
217 TUniqueFunction<void(int, int, int, const FVector3f&, FVector3f&, FVector3f&)> TangentsFunc = MakeTangentsFunc();
218
219 const bool bTrackTriangles = false;
220 const bool bParallel = true;
221 InitializeBuffersFromOverlays(RenderBuffers, Mesh,
222 Mesh->TriangleCount(), Mesh->TriangleIndicesItr(),
223 UVOverlays, NormalOverlay, ColorOverlay, TangentsFunc,
224 bTrackTriangles, bParallel);
225
228 {
229 RenderBuffers->Upload();
230 });
231 }
232
233
234
239 {
240 const FDynamicMesh3* Mesh = ParentComponent->GetRenderMesh();
241 if (ensure(Mesh->HasAttributes() && Mesh->Attributes()->HasMaterialID()) == false)
242 {
243 return;
244 }
245
246 const FDynamicMeshAttributeSet* Attributes = Mesh->Attributes();
247
248 // find suitable overlays
249 const FDynamicMeshMaterialAttribute* MaterialID = Attributes->GetMaterialID();
250 const FDynamicMeshNormalOverlay* NormalOverlay = Mesh->Attributes()->PrimaryNormals();
251 const FDynamicMeshColorOverlay* ColorOverlay = Mesh->Attributes()->PrimaryColors();
252
254 UVOverlays.SetNum(Attributes->NumUVLayers());
255 for (int32 k = 0; k < UVOverlays.Num(); ++k)
256 {
257 UVOverlays[k] = Attributes->GetUVLayer(k);
258 }
259
260 TUniqueFunction<void(int, int, int, const FVector3f&, FVector3f&, FVector3f&)> TangentsFunc = MakeTangentsFunc();
261
262 // count number of triangles for each material (could do in parallel?)
263 int NumMaterials = BufferSets.Num();
265 Counts.SetNum(NumMaterials);
266 for (int k = 0; k < NumMaterials; ++k)
267 {
268 Counts[k].Reset();
269 }
270 ParallelFor(Mesh->MaxTriangleID(), [&](int tid)
271 {
272 if (!Mesh->IsTriangle(tid))
273 {
274 return;
275 }
276 int MatIdx;
277 MaterialID->GetValue(tid, &MatIdx);
278 if (MatIdx >= 0 && MatIdx < NumMaterials)
279 {
280 Counts[MatIdx].Increment();
281 }
282 });
283
284 // find max count
285 int32 MaxCount = 0;
286 for (FThreadSafeCounter& Count : Counts)
287 {
288 MaxCount = FMath::Max(Count.GetValue(), MaxCount);
289 }
290
291 // init renderbuffers for each material
292 // could do this in parallel but then we need to allocate separate triangle arrays...is it worth it?
293 TArray<int> Triangles;
294 Triangles.Reserve(MaxCount);
295 for (int k = 0; k < NumMaterials; ++k)
296 {
297 if (Counts[k].GetValue() > 0)
298 {
300
301 Triangles.Reset();
302 for (int tid : Mesh->TriangleIndicesItr())
303 {
304 int MatIdx;
305 MaterialID->GetValue(tid, &MatIdx);
306 if (MatIdx == k)
307 {
308 Triangles.Add(tid);
309 }
310 }
311
312 const bool bTrackTriangles = false;
313 const bool bParallel = true;
314 InitializeBuffersFromOverlays(RenderBuffers, Mesh,
315 Triangles.Num(), Triangles,
316 UVOverlays, NormalOverlay, ColorOverlay, TangentsFunc,
317 bTrackTriangles, bParallel);
318
319 RenderBuffers->Triangles = Triangles;
320
323 {
324 RenderBuffers->Upload();
325 });
326 }
327 }
328 }
329
330
332 {
333 const FDynamicMesh3* Mesh = ParentComponent->GetRenderMesh();
334
335 auto CheckBufferSet = [](const FDynamicMesh3* Mesh, const FMeshRenderBufferSet* BufferSet, int NumTriangles) -> bool
336 {
337 if (BufferSet->Triangles)
338 {
339 for (int TriangleID : BufferSet->Triangles.GetValue())
340 {
341 if (!Mesh->IsTriangle(TriangleID))
342 {
343 return false;
344 }
345 }
346 }
347
348 int NumVertices = NumTriangles * 3;
349 if (BufferSet->PositionVertexBuffer.GetNumVertices() != NumVertices ||
350 BufferSet->StaticMeshVertexBuffer.GetNumVertices() != NumVertices ||
351 BufferSet->ColorVertexBuffer.GetNumVertices() != NumVertices)
352 {
353 return false;
354 }
355
356 return true;
357 };
358
359 if (bIsSingleBuffer)
360 {
361 if (ensure(RenderBufferSets.Num() == 1))
362 {
363 FMeshRenderBufferSet* BufferSet = RenderBufferSets[0];
364 FScopeLock BuffersLock(&BufferSet->BuffersLock);
365 if (BufferSet->TriangleCount != Mesh->TriangleCount())
366 {
367 return false;
368 }
369
370 int NumTriangles = Mesh->TriangleCount();
371
372 if (!CheckBufferSet(Mesh, BufferSet, NumTriangles))
373 {
374 return false;
375 }
376 }
377 }
378 else
379 {
380 for (FMeshRenderBufferSet* BufferSet : RenderBufferSets)
381 {
382 FScopeLock BuffersLock(&BufferSet->BuffersLock);
383 if (ensure(BufferSet->Triangles))
384 {
385 int NumTriangles = BufferSet->Triangles->Num();
386
387 if (!CheckBufferSet(Mesh, BufferSet, NumTriangles))
388 {
389 return false;
390 }
391 }
392 }
393 }
394
395 return true;
396 }
397
398
399
403 void FastUpdateVertices(bool bPositions, bool bNormals, bool bColors, bool bUVs)
404 {
405 // This needs to be rewritten for split-by-material buffers.
406 // Could store triangle set with each buffer, and then rebuild vtx buffer(s) as needed?
407
408 FDynamicMesh3* Mesh = ParentComponent->GetRenderMesh();
409
410 // find suitable overlays and attributes
411 FDynamicMeshNormalOverlay* NormalOverlay = nullptr;
412 if (bNormals && ensure(Mesh->HasAttributes()) )
413 {
414 NormalOverlay = Mesh->Attributes()->PrimaryNormals();
415 }
417 if (bUVs && ensure(Mesh->HasAttributes()) )
418 {
419 const FDynamicMeshAttributeSet* Attributes = Mesh->Attributes();
420 UVOverlays.SetNum(Attributes->NumUVLayers());
421 for (int32 i = 0; i < UVOverlays.Num(); ++i)
422 {
423 UVOverlays[i] = Attributes->GetUVLayer(i);
424 }
425 }
426 FDynamicMeshColorOverlay* ColorOverlay = nullptr;
427 if (bColors && ensure(Mesh->HasAttributes()) )
428 {
429 ColorOverlay = Mesh->Attributes()->PrimaryColors();
430 }
431
432 // Currently deferring tangents auto-computation if doing fast vertex update (maybe needs to be exposed?)
433 TUniqueFunction<void(int, int, int, const FVector3f&, FVector3f&, FVector3f&)> TangentsFunc = MakeTangentsFunc(true);
434
435 if (bIsSingleBuffer)
436 {
437 if (ensure(RenderBufferSets.Num() == 1))
438 {
439 FMeshRenderBufferSet* Buffers = RenderBufferSets[0];
440 FScopeLock BuffersLock(&Buffers->BuffersLock);
441 if (bPositions || bNormals || bColors)
442 {
443 UpdateVertexBuffersFromOverlays(Buffers, Mesh,
444 Mesh->TriangleCount(), Mesh->TriangleIndicesItr(),
445 NormalOverlay, ColorOverlay, TangentsFunc,
447 }
448 if (bUVs)
449 {
450 UpdateVertexUVBufferFromOverlays(Buffers, Mesh,
451 Mesh->TriangleCount(), Mesh->TriangleIndicesItr(), UVOverlays);
452 }
453
454
457 {
458 Buffers->UploadVertexUpdate(bPositions, bNormals || bUVs, bColors);
459 });
460 }
461 }
462 else
463 {
464 ParallelFor(RenderBufferSets.Num(), [&](int i)
465 {
466 FMeshRenderBufferSet* Buffers = RenderBufferSets[i];
467 FScopeLock BuffersLock(&Buffers->BuffersLock);
468 if (Buffers->TriangleCount == 0)
469 {
470 return;
471 }
472 if (ensure(Buffers->Triangles.IsSet()))
473 {
474 if (bPositions || bNormals || bColors)
475 {
476 UpdateVertexBuffersFromOverlays(Buffers, Mesh,
477 Buffers->Triangles->Num(), Buffers->Triangles.GetValue(),
478 NormalOverlay, ColorOverlay, TangentsFunc,
479 bPositions, bNormals, bColors);
480 }
481 if (bUVs)
482 {
483 UpdateVertexUVBufferFromOverlays(Buffers, Mesh,
484 Buffers->Triangles->Num(), Buffers->Triangles.GetValue(), UVOverlays);
485 }
486
489 {
490 Buffers->UploadVertexUpdate(bPositions, bNormals || bUVs, bColors);
491 });
492 }
493 });
494 }
495 }
496
497
498
503 {
505
506 // skip if we have no updates
507 if (bPositions == false && bNormals == false && bColors == false && bUVs == false)
508 {
509 return;
510 }
511
512 // This needs to be rewritten for split-by-material buffers.
513 // Could store triangle set with each buffer, and then rebuild vtx buffer(s) as needed?
514
515 const FDynamicMesh3* Mesh = ParentComponent->GetRenderMesh();
516
517 // find suitable overlays
518 const FDynamicMeshNormalOverlay* NormalOverlay = nullptr;
519 if (bNormals && ensure(Mesh->HasAttributes()))
520 {
521 NormalOverlay = Mesh->Attributes()->PrimaryNormals();
522 }
524 if (bUVs && ensure(Mesh->HasAttributes()))
525 {
526 const FDynamicMeshAttributeSet* Attributes = Mesh->Attributes();
527 UVOverlays.SetNum(Attributes->NumUVLayers());
528 for (int32 i = 0; i < UVOverlays.Num(); ++i)
529 {
530 UVOverlays[i] = Attributes->GetUVLayer(i);
531 }
532 }
533 const FDynamicMeshColorOverlay* ColorOverlay = nullptr;
534 if (bColors && ensure(Mesh->HasAttributes()))
535 {
536 ColorOverlay = Mesh->Attributes()->PrimaryColors();
537 }
538
539 // Currently deferring tangents auto-computation if doing fast vertex update (maybe needs to be exposed?)
540 TUniqueFunction<void(int, int, int, const FVector3f&, FVector3f&, FVector3f&)> TangentsFunc = MakeTangentsFunc(true);
541
542 ParallelFor(WhichBuffers.Num(), [&](int idx)
543 {
544 int32 BufferIndex = WhichBuffers[idx];
545 if ( RenderBufferSets.IsValidIndex(BufferIndex) == false)
546 {
547 return;
548 }
549 FMeshRenderBufferSet* Buffers = RenderBufferSets[BufferIndex];
550 FScopeLock BuffersLock(&Buffers->BuffersLock);
551 if (Buffers->TriangleCount == 0)
552 {
553 return;
554 }
555 if (ensure(Buffers->Triangles.IsSet()))
556 {
557 if (bPositions || bNormals || bColors)
558 {
559 UpdateVertexBuffersFromOverlays(Buffers, Mesh,
560 Buffers->Triangles->Num(), Buffers->Triangles.GetValue(),
561 NormalOverlay, ColorOverlay, TangentsFunc,
563 }
564 if (bUVs)
565 {
566 UpdateVertexUVBufferFromOverlays(Buffers, Mesh,
567 Buffers->Triangles->Num(), Buffers->Triangles.GetValue(), UVOverlays);
568 }
569
572 {
573 Buffers->TransferVertexUpdateToGPU(RHICmdList, bPositions, bNormals, bUVs, bColors);
574 });
575 }
576 });
577 }
578
579
580
581
586 {
587 FDynamicMesh3* Mesh = ParentComponent->GetRenderMesh();
588
589 // have to wait for all outstanding rendering to finish because the index buffers we are about to edit might be in-use
591
592 ParallelFor(RenderBufferSets.Num(), [this, &Mesh](int i)
593 {
594 FMeshRenderBufferSet* Buffers = RenderBufferSets[i];
595
596 FScopeLock BuffersLock(&Buffers->BuffersLock);
597
598 if (Buffers->TriangleCount > 0)
599 {
600 RecomputeRenderBufferTriangleIndexSets(Buffers, Mesh);
601 }
602
604 [Buffers](FRHICommandListImmediate& RHICmdList)
605 {
606 Buffers->UploadIndexBufferUpdate();
607 });
608
609 });
610 }
611
612
613
618 {
619 FDynamicMesh3* Mesh = ParentComponent->GetRenderMesh();
620
621 // have to wait for all outstanding rendering to finish because the index buffers we are about to edit might be in-use
623
624 ParallelFor(WhichBuffers.Num(), [this, &WhichBuffers, &Mesh](int i)
625 {
626 int32 BufferIndex = WhichBuffers[i];
627 if (RenderBufferSets.IsValidIndex(BufferIndex) == false)
628 {
629 return;
630 }
631
632 FMeshRenderBufferSet* Buffers = RenderBufferSets[BufferIndex];
633 FScopeLock BuffersLock(&Buffers->BuffersLock);
634 if (Buffers->TriangleCount > 0)
635 {
636 RecomputeRenderBufferTriangleIndexSets(Buffers, Mesh);
637 }
638
640 [Buffers](FRHICommandListImmediate& RHICmdList)
641 {
642 Buffers->UploadIndexBufferUpdate();
643 });
644 });
645 }
646
647
648
649public:
650
651
652
653 virtual FPrimitiveViewRelevance GetViewRelevance(const FSceneView* View) const override
654 {
656
657 Result.bDrawRelevance = IsShown(View);
658 Result.bShadowRelevance = IsShadowCast(View);
659
660 bool bUseStaticDrawPath = bPreferStaticDrawPath && AllowStaticDrawPath(View);
661 Result.bDynamicRelevance = !bUseStaticDrawPath;
662 Result.bStaticRelevance = bUseStaticDrawPath;
663#if WITH_EDITOR
664 //only check these in the editor
665 Result.bEditorVisualizeLevelInstanceRelevance = IsEditingLevelInstanceChild();
666 Result.bEditorStaticSelectionRelevance = (IsSelected() || IsHovered());
667#endif
668
669
670 Result.bRenderInMainPass = ShouldRenderInMainPass();
671 Result.bUsesLightingChannels = GetLightingChannelMask() != GetDefaultLightingChannelMask();
672 Result.bTranslucentSelfShadow = bCastVolumetricTranslucentShadow;
673 Result.bRenderCustomDepth = ShouldRenderCustomDepth();
674 // Note that this is actually a getter. One may argue that it is poorly named.
675 MaterialRelevance.SetPrimitiveViewRelevance(Result);
676 Result.bVelocityRelevance = DrawsVelocity() && Result.bOpaque && Result.bRenderInMainPass;
677
678 return Result;
679 }
680
681 virtual void UpdatedReferencedMaterials() override
682 {
684
685 // The material relevance may need updating.
686 MaterialRelevance = ParentComponent->GetMaterialRelevance(GetScene().GetShaderPlatform());
687 }
688
689
690 virtual void GetLightRelevance(const FLightSceneProxy* LightSceneProxy, bool& bDynamic, bool& bRelevant, bool& bLightMapped, bool& bShadowMapped) const override
691 {
692 FPrimitiveSceneProxy::GetLightRelevance(LightSceneProxy, bDynamic, bRelevant, bLightMapped, bShadowMapped);
693 }
694
695 virtual bool CanBeOccluded() const override
696 {
697 return !MaterialRelevance.bDisableDepthTest;
698 }
699
700 virtual uint32 GetMemoryFootprint(void) const override { return(sizeof(*this) + GetAllocatedSize()); }
701
703
704 SIZE_T GetTypeHash() const override
705 {
706 static size_t UniquePointer;
707 return reinterpret_cast<size_t>(&UniquePointer);
708 }
709
710};
711
712
713
714
715
716
717
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
@ Normal
Definition AndroidInputInterface.h:116
#define ensure( InExpression)
Definition AssertionMacros.h:464
EDynamicMeshComponentTangentsMode
Definition BaseDynamicMeshComponent.h:48
void ParallelFor(int32 Num, TFunctionRef< void(int32)> Body, bool bForceSingleThread, bool bPumpRenderingThread=false)
Definition ParallelFor.h:481
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
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 TRACE_CPUPROFILER_EVENT_SCOPE(Name)
Definition CpuProfilerTrace.h:528
uint8 GetDefaultLightingChannelMask()
Definition EngineTypes.h:592
void FlushRenderingCommands()
Definition RenderingThread.cpp:1272
#define ENQUEUE_RENDER_COMMAND(Type)
Definition RenderingThread.h:1167
if(Failed) console_printf("Failed.\n")
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition BaseDynamicMeshSceneProxy.h:39
virtual GEOMETRYFRAMEWORK_API void UpdatedReferencedMaterials()
Definition BaseDynamicMeshSceneProxy.cpp:126
virtual GEOMETRYFRAMEWORK_API FMeshRenderBufferSet * AllocateNewRenderBufferSet()
Definition BaseDynamicMeshSceneProxy.cpp:88
virtual GEOMETRYFRAMEWORK_API int32 GetNumMaterials() const
Definition BaseDynamicMeshSceneProxy.cpp:115
virtual GEOMETRYFRAMEWORK_API UMaterialInterface * GetMaterial(int32 k) const
Definition BaseDynamicMeshSceneProxy.cpp:120
void UpdateLumenCardsFromBounds()
Definition BaseDynamicMeshSceneProxy.cpp:831
Definition DynamicMeshSceneProxy.h:23
FDynamicMeshSceneProxy(UDynamicMeshComponent *Component)
Definition DynamicMeshSceneProxy.h:40
TUniqueFunction< void(int, int, int, const FVector3f &, FVector3f &, FVector3f &)> MakeTangentsFunc(bool bSkipAutoCompute=false)
Definition DynamicMeshSceneProxy.h:96
void InitializeFromDecomposition(TUniquePtr< FMeshRenderDecomposition > &Decomposition)
Definition DynamicMeshSceneProxy.h:135
bool RenderMeshLayoutMatchesRenderBuffers() const
Definition DynamicMeshSceneProxy.h:331
void FastUpdateVertices(bool bPositions, bool bNormals, bool bColors, bool bUVs)
Definition DynamicMeshSceneProxy.h:403
virtual void UpdatedReferencedMaterials() override
Definition DynamicMeshSceneProxy.h:681
virtual void GetLightRelevance(const FLightSceneProxy *LightSceneProxy, bool &bDynamic, bool &bRelevant, bool &bLightMapped, bool &bShadowMapped) const override
Definition DynamicMeshSceneProxy.h:690
void InitializeByMaterial(TArray< FMeshRenderBufferSet * > &BufferSets)
Definition DynamicMeshSceneProxy.h:238
virtual bool CanBeOccluded() const override
Definition DynamicMeshSceneProxy.h:695
void InitializeSingleBufferSet(FMeshRenderBufferSet *RenderBuffers)
Definition DynamicMeshSceneProxy.h:198
virtual void GetActiveRenderBufferSets(TArray< FMeshRenderBufferSet * > &Buffers) const override
Definition DynamicMeshSceneProxy.h:48
void FastUpdateVertices(const TArray< int32 > &WhichBuffers, bool bPositions, bool bNormals, bool bColors, bool bUVs)
Definition DynamicMeshSceneProxy.h:502
SIZE_T GetTypeHash() const override
Definition DynamicMeshSceneProxy.h:704
uint32 GetAllocatedSize(void) const
Definition DynamicMeshSceneProxy.h:702
void Initialize()
Definition DynamicMeshSceneProxy.h:55
virtual FPrimitiveViewRelevance GetViewRelevance(const FSceneView *View) const override
Definition DynamicMeshSceneProxy.h:653
void FastUpdateAllIndexBuffers()
Definition DynamicMeshSceneProxy.h:585
UDynamicMeshComponent * ParentComponent
Definition DynamicMeshSceneProxy.h:37
virtual uint32 GetMemoryFootprint(void) const override
Definition DynamicMeshSceneProxy.h:700
void FastUpdateIndexBuffers(const TArray< int32 > &WhichBuffers)
Definition DynamicMeshSceneProxy.h:617
Definition LightSceneProxy.h:43
Definition MeshRenderBufferSet.h:39
SIZE_T GetAllocatedSize(void) const
Definition PrimitiveSceneProxy.h:684
FSceneInterface & GetScene() const
Definition PrimitiveSceneProxy.h:733
virtual void GetLightRelevance(const FLightSceneProxy *LightSceneProxy, bool &bDynamic, bool &bRelevant, bool &bLightMapped, bool &bShadowMapped) const
Definition PrimitiveSceneProxy.h:550
Definition RHICommandList.h:4626
Definition SceneView.h:1425
Definition ScopeLock.h:141
Definition ThreadSafeCounter.h:14
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void Reset(SizeType NewSize=0)
Definition Array.h:2246
void SetNum(SizeType NewNum, EAllowShrinking AllowShrinking=UE::Core::Private::AllowShrinkingByDefault< AllocatorType >())
Definition Array.h:2308
UE_NODEBUG UE_FORCEINLINE_HINT SizeType Add(ElementType &&Item)
Definition Array.h:2696
UE_FORCEINLINE_HINT void Reserve(SizeType Number)
Definition Array.h:3016
Definition FunctionFwd.h:19
Definition UniquePtr.h:107
Definition DynamicMesh3.h:108
Definition DynamicMeshAttributeSet.h:84
FDynamicMeshNormalOverlay * PrimaryNormals()
Definition DynamicMeshAttributeSet.h:250
FDynamicMeshUVOverlay * GetUVLayer(int Index)
Definition DynamicMeshAttributeSet.h:178
virtual int NumUVLayers() const
Definition DynamicMeshAttributeSet.h:169
FDynamicMeshMaterialAttribute * GetMaterialID()
Definition DynamicMeshAttributeSet.h:364
FDynamicMeshColorOverlay * PrimaryColors()
Definition DynamicMeshAttributeSet.h:291
Definition MeshTangents.h:25
Definition MeshTangents.h:76
void GetTriangleVertexTangentVectors(int32 TriangleID, int32 TriVertexIndex, OtherVectorType &TangentOut, OtherVectorType &BitangentOut) const
Definition MeshTangents.h:226
static ENGINE_API UMaterial * GetDefaultMaterial(EMaterialDomain Domain)
Definition Material.cpp:1071
T::FDataType GetValue(const UBlackboardComponent &Blackboard, const FName &Name, FBlackboard::FKey &InOutCachedKey, const typename T::FDataType &DefaultValue)
Definition ValueOrBBKey.h:51
void MakePerpVectors(const TVector< RealType > &Normal, TVector< RealType > &OutPerp1, TVector< RealType > &OutPerp2)
Definition VectorUtil.h:211
Definition MaterialRelevance.h:13
Definition MeshRenderDecomposition.h:32
Definition PrimitiveViewRelevance.h:14
Definition IndexTypes.h:27
Definition IndexTypes.h:158