diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json index f8b4888..e257ff9 100644 --- a/.vs/ProjectSettings.json +++ b/.vs/ProjectSettings.json @@ -1,3 +1,3 @@ { - "CurrentProjectSetting": null + "CurrentProjectSetting": "无配置" } \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite index 61d5331..4068f77 100644 Binary files a/.vs/slnx.sqlite and b/.vs/slnx.sqlite differ diff --git a/02-Note/WY/项目相关.md b/02-Note/WY/项目相关.md new file mode 100644 index 0000000..4579bf7 --- /dev/null +++ b/02-Note/WY/项目相关.md @@ -0,0 +1 @@ +# 前言 diff --git a/03-UnrealEngine/Rendering/RenderFeature/ShaderWorldPlugin/ShaderWorld.md b/03-UnrealEngine/Rendering/RenderFeature/ShaderWorldPlugin/ShaderWorld.md index 999a64d..e4ad2d8 100644 --- a/03-UnrealEngine/Rendering/RenderFeature/ShaderWorldPlugin/ShaderWorld.md +++ b/03-UnrealEngine/Rendering/RenderFeature/ShaderWorldPlugin/ShaderWorld.md @@ -156,6 +156,22 @@ void AShaderWorldActor::ReadbacksManagement() ``` ### CollisionManagement() +- ThreadSafe + - bool + - bProcessingGroundCollision + - bPreprocessingCollisionUpdate + - EditRebuild:传递Bool值给 rebuild。 + - FSWCollisionManagementShareableData + - CollisionShareable + - FRenderCommandFence + - 1 +- bool + - RedbuildCollisionContext +- Array + - CollisionWorkQueue:类型为FCollisionProcessingWork。 + - CollisionReadToProcess + + ```c++ void AShaderWorldActor::CollisionManagement(float& DeltaT) { @@ -212,7 +228,87 @@ void AShaderWorldActor::CollisionManagement(float& DeltaT) CollisionCPU(); } ``` + #### SetupCollisions() +```c++ +bool AShaderWorldActor::SetupCollisions() +{ + SW_FCT_CYCLE() + + if (!bHadGeneratorAtRebuildTime) + return false; + + if (!Shareable_ID.IsValid() || Meshes.Num() <= 0) + return false; + + //初始化线程安全变量 + if (!bProcessingGroundCollision.IsValid()) + bProcessingGroundCollision = MakeShared(); + if (!bPreprocessingCollisionUpdate.IsValid()) + bPreprocessingCollisionUpdate = MakeShared(); + + if (EditRebuild) + { + EditRebuild.AtomicSet(false); + rebuild = true; + } + + if (rebuild) + RedbuildCollisionContext = true; + //重建相关变量初始化 + if (RedbuildCollisionContext) + { + if (!(*bProcessingGroundCollision.Get()) && !(*bPreprocessingCollisionUpdate.Get()) + && CollisionProcess.IsFenceComplete() + && (CollisionMesh.Num() <= 0) + && (UsedCollisionMesh.Num() <= 0)) + { + + CollisionShareable = nullptr; + + CollisionWorkQueue.Empty(); + CollisionReadToProcess.Empty(); + + RedbuildCollisionContext = false; + + } + } + + if (RedbuildCollisionContext) + return false; + + if (!GenerateCollision) + return false; + + if (!CollisionShareable.IsValid()) + CollisionShareable = MakeShared(CollisionResolution, CollisionVerticesPerPatch); + + if ((*bProcessingGroundCollision.Get()) || (*bPreprocessingCollisionUpdate.Get()) || !CameraSet || (Meshes.Num() == 0)) + return false; + + //Let the data layer be computed before generating collisions and trying to extract material IDs + if (bExportPhysicalMaterialID && (WorldCycle < 2)) + return false; + + + if (CollisionVisibleChanged) + { + if (GetWorld()) + { + for (auto& ColM : CollisionMesh) + { + if (auto& Mesh = ColM.Value.Mesh) + { + Mesh->SetMeshSectionVisible(0, CollisionVisible); + } + } + } + CollisionVisibleChanged.AtomicSet(false); + } + + return true; +} +``` ### SpawnablesManagement()