From 3c0d7694994a613b780bf340ac7681c5a6fc5b9b Mon Sep 17 00:00:00 2001 From: Magnus Norddahl Date: Thu, 9 Feb 2017 22:58:28 +0100 Subject: [PATCH] Fix portals draw segment indexing bug --- src/swrenderer/scene/r_translucent_pass.cpp | 4 ++-- src/swrenderer/segments/r_drawsegment.cpp | 4 ++-- src/swrenderer/segments/r_drawsegment.h | 6 ++---- src/swrenderer/things/r_particle.cpp | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/swrenderer/scene/r_translucent_pass.cpp b/src/swrenderer/scene/r_translucent_pass.cpp index 460fb6228..419bcf8ee 100644 --- a/src/swrenderer/scene/r_translucent_pass.cpp +++ b/src/swrenderer/scene/r_translucent_pass.cpp @@ -71,7 +71,7 @@ namespace swrenderer // b) skip most of the collected drawsegs which have no portal attached. portaldrawsegs.Clear(); DrawSegmentList *drawseglist = Thread->DrawSegments.get(); - for (auto index = drawseglist->BeginIndex(); index != drawseglist->EndIndex(); index++) + for (auto index = 0; index != drawseglist->SegmentsCount(); index++) { DrawSegment *seg = drawseglist->Segment(index); @@ -144,7 +144,7 @@ namespace swrenderer } DrawSegmentList *drawseglist = Thread->DrawSegments.get(); - for (auto index = drawseglist->BeginIndex(); index != drawseglist->EndIndex(); index++) + for (auto index = 0; index != drawseglist->SegmentsCount(); index++) { DrawSegment *ds = drawseglist->Segment(index); diff --git a/src/swrenderer/segments/r_drawsegment.cpp b/src/swrenderer/segments/r_drawsegment.cpp index c3b0e791c..e4bc3d26b 100644 --- a/src/swrenderer/segments/r_drawsegment.cpp +++ b/src/swrenderer/segments/r_drawsegment.cpp @@ -90,13 +90,13 @@ namespace swrenderer SegmentGroups.Clear(); unsigned int groupSize = 100; - for (unsigned int index = BeginIndex(); index < EndIndex(); index += groupSize) + for (unsigned int index = 0; index < SegmentsCount(); index += groupSize) { auto ds = Segment(index); DrawSegmentGroup group; group.BeginIndex = index; - group.EndIndex = MIN(index + groupSize, EndIndex()); + group.EndIndex = MIN(index + groupSize, SegmentsCount()); group.x1 = ds->x1; group.x2 = ds->x2; group.neardepth = MIN(ds->sz1, ds->sz2); diff --git a/src/swrenderer/segments/r_drawsegment.h b/src/swrenderer/segments/r_drawsegment.h index a82b2333b..9bfd5dc65 100644 --- a/src/swrenderer/segments/r_drawsegment.h +++ b/src/swrenderer/segments/r_drawsegment.h @@ -64,12 +64,10 @@ namespace swrenderer TArray SegmentGroups; - unsigned int BeginIndex() const { return StartIndices.Last(); } - unsigned int EndIndex() const { return Segments.Size(); } + unsigned int SegmentsCount() const { return Segments.Size() - StartIndices.Last(); } DrawSegment *Segment(unsigned int index) const { return Segments[Segments.Size() - 1 - index]; } - unsigned int BeginInterestingIndex() const { return StartInterestingIndices.Last(); } - unsigned int EndInterestingIndex() const { return InterestingSegments.Size(); } + unsigned int InterestingSegmentsCount() const { return InterestingSegments.Size() - StartInterestingIndices.Last(); } DrawSegment *InterestingSegment(unsigned int index) const { return InterestingSegments[InterestingSegments.Size() - 1 - index]; } void Clear(); diff --git a/src/swrenderer/things/r_particle.cpp b/src/swrenderer/things/r_particle.cpp index 9b9fbb484..9212004e6 100644 --- a/src/swrenderer/things/r_particle.cpp +++ b/src/swrenderer/things/r_particle.cpp @@ -267,7 +267,7 @@ namespace swrenderer // Draw any masked textures behind this particle so that when the // particle is drawn, it will be in front of them. DrawSegmentList *segmentlist = thread->DrawSegments.get(); - for (unsigned int index = segmentlist->BeginInterestingIndex(); index != segmentlist->EndInterestingIndex(); index++) + for (unsigned int index = 0; index != segmentlist->InterestingSegmentsCount(); index++) { DrawSegment *ds = segmentlist->InterestingSegment(index);