diff --git a/03-UnrealEngine/Rendering/RenderFeature/ShaderWorldPlugin/ShaderWorld.md b/03-UnrealEngine/Rendering/RenderFeature/ShaderWorldPlugin/ShaderWorld.md index e4ad2d8..e485c4c 100644 --- a/03-UnrealEngine/Rendering/RenderFeature/ShaderWorldPlugin/ShaderWorld.md +++ b/03-UnrealEngine/Rendering/RenderFeature/ShaderWorldPlugin/ShaderWorld.md @@ -310,6 +310,47 @@ bool AShaderWorldActor::SetupCollisions() } ``` +#### CollisionFinalizeWork() +```c++ +bool AShaderWorldActor::CollisionFinalizeWork() +{ + SCOPED_NAMED_EVENT_TEXT("AShaderWorldActor::CollisionFinalizeWork()", FColor::Magenta); + SW_FCT_CYCLE() + + if (!CollisionReadToProcess.IsEmpty()) + return true; + + const double GameThreadBudget_ms = SWGameThreadBudgetCollision_ms.GetValueOnGameThread(); + + double TimeStart = FPlatformTime::Seconds(); + + if(CollisionWorkQueue.Num()<=0) + return true; + + { + FScopeLock CollisionMeshArrayAccess(&CollisionMeshAccessLock); + for (int i = CollisionWorkQueue.Num() - 1; i >= 0; i--) + { + if ((FPlatformTime::Seconds() - TimeStart) * 1000.0 > GameThreadBudget_ms) + return false; + + FCollisionProcessingWork& Work = CollisionWorkQueue[i]; + + ensure(CollisionMesh.Find(Work.MeshID)); + + FCollisionMeshElement& Mesh = CollisionMesh[Work.MeshID]; + + Mesh.Mesh->UpdateSectionTriMesh(Work.DestB); + + CollisionWorkQueue.RemoveAt(i); + } + } + + CollisionWorkQueue.Empty(); + return true; + +} +``` ### SpawnablesManagement() ### TerrainAndSpawnablesManagement()