From b1ba81bfcf43da859c9d08e1cf3096b0b8dff295 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Lu=C3=ADs=20Vaz=20Silva?= Date: Wed, 18 Jun 2025 23:08:54 -0300 Subject: [PATCH] fix cpu levlemesh --- .../hwrenderer/data/hw_collision.cpp | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/src/common/rendering/hwrenderer/data/hw_collision.cpp b/src/common/rendering/hwrenderer/data/hw_collision.cpp index 341490ddb..ad3084a02 100644 --- a/src/common/rendering/hwrenderer/data/hw_collision.cpp +++ b/src/common/rendering/hwrenderer/data/hw_collision.cpp @@ -96,26 +96,50 @@ void CPUAccelStruct::Update() DynamicBLASTime.ResetAndClock(); InstanceCount = (Mesh->Mesh.IndexCount + IndexesPerBLAS - 1) / IndexesPerBLAS; - std::vector needsUpdate(InstanceCount); - for (const MeshBufferRange& range : Mesh->UploadRanges.Index.GetRanges()) + bool reCreated = false; + + if(InstanceCount > DynamicBLAS.size()) { - int start = range.Start / IndexesPerBLAS; - int end = range.End / IndexesPerBLAS; - for (int i = start; i < end; i++) - { - needsUpdate[i] = true; - } + IndexesPerBLAS = ((Mesh->Mesh.Indexes.size() + 2) / 3 / DynamicBLAS.size() + 1) * 3; + InstanceCount = (Mesh->Mesh.IndexCount + IndexesPerBLAS - 1) / IndexesPerBLAS; + reCreated = true; } - for (int instance = 0; instance < InstanceCount; instance++) + + if(reCreated) { - if (needsUpdate[instance]) + for (int instance = 0; instance < InstanceCount; instance++) { int indexStart = instance * IndexesPerBLAS; int indexEnd = std::min(indexStart + IndexesPerBLAS, Mesh->Mesh.IndexCount); DynamicBLAS[instance] = CreateBLAS(indexStart, indexEnd - indexStart); } } + else + { + std::vector needsUpdate(InstanceCount); + + for (const MeshBufferRange& range : Mesh->UploadRanges.Index.GetRanges()) + { + int start = range.Start / IndexesPerBLAS; + int end = range.End / IndexesPerBLAS; + for (int i = start; i < end; i++) + { + needsUpdate[i] = true; + } + } + + for (int instance = 0; instance < InstanceCount; instance++) + { + if (needsUpdate[instance]) + { + int indexStart = instance * IndexesPerBLAS; + int indexEnd = std::min(indexStart + IndexesPerBLAS, Mesh->Mesh.IndexCount); + DynamicBLAS[instance] = CreateBLAS(indexStart, indexEnd - indexStart); + } + } + } + DynamicBLASTime.Unclock(); CreateTLAS();