From 5ad75e5c8cc83aeb15fe71f3693e35b65755d9bd Mon Sep 17 00:00:00 2001 From: codereader Date: Sun, 27 Mar 2022 13:17:15 +0200 Subject: [PATCH] #219: Fix a sync range problem in WindingRenderer. Removing a winding from the buffer has to invalidate all data to the right. --- .../rendersystem/backend/WindingRenderer.h | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/radiantcore/rendersystem/backend/WindingRenderer.h b/radiantcore/rendersystem/backend/WindingRenderer.h index 08fb1b2e3a..e07b2de428 100644 --- a/radiantcore/rendersystem/backend/WindingRenderer.h +++ b/radiantcore/rendersystem/backend/WindingRenderer.h @@ -448,7 +448,7 @@ class WindingRenderer final : auto& bucket = _buckets.at(bucketIndex); bucket.pendingDeletions.push_back(slotMapping.slotNumber); - updateModifiedRange(bucket, slotMapping.slotNumber); + updateModifiedRange(bucket, slotMapping.slotNumber, true); // true => deletion // Invalidate the slot mapping slotMapping.bucketIndex = InvalidBucketIndex; @@ -565,11 +565,21 @@ class WindingRenderer final : syncWithGeometryStore(bucket); } - void updateModifiedRange(Bucket& bucket, typename VertexBuffer::Slot modifiedSlot) + void updateModifiedRange(Bucket& bucket, typename VertexBuffer::Slot modifiedSlot, bool dueToDeletion = false) { // Update the modified range bucket.modifiedSlotRange.first = std::min(bucket.modifiedSlotRange.first, modifiedSlot); - bucket.modifiedSlotRange.second = std::max(bucket.modifiedSlotRange.second, modifiedSlot); + + if (!dueToDeletion) + { + bucket.modifiedSlotRange.second = std::max(bucket.modifiedSlotRange.second, modifiedSlot); + } + else + { + // Deletions invalidates all data to the right + bucket.modifiedSlotRange.second = static_cast(bucket.buffer.getNumberOfStoredWindings()); + } + _geometryUpdatePending = true; }