Debug::Filter* gWindowRenderSurfaceLogFilter = Debug::Filter::New(Debug::Verbose, false, "LOG_WINDOW_RENDER_SURFACE");
#endif
+void MergeRects(Rect<int>& mergingRect, const std::vector<Rect<int>>& rects)
+{
+ uint32_t i = 0;
+ if(mergingRect.IsEmpty())
+ {
+ for(; i < rects.size(); i++)
+ {
+ if(!rects[i].IsEmpty())
+ {
+ mergingRect = rects[i];
+ break;
+ }
+ }
+ }
+
+ for(; i < rects.size(); i++)
+ {
+ mergingRect.Merge(rects[i]);
+ }
+}
+
void InsertRects(WindowRenderSurface::DamagedRectsContainer& damagedRectsList, const Rect<int>& damagedRects)
{
damagedRectsList.insert(damagedRectsList.begin(), damagedRects);
RecalculateRectFunction RecalculateRect[4] = {RecalculateRect0, RecalculateRect90, RecalculateRect180, RecalculateRect270};
-void MergeIntersectingRectsAndRotate(Rect<int>& mergingRect, std::vector<Rect<int>>& damagedRects, int orientation, const Rect<int32_t>& surfaceRect)
+void MergeIntersectingRects(std::vector<Rect<int>>& damagedRects, int orientation, const Rect<int32_t>& surfaceRect)
{
const int n = damagedRects.size();
for(int i = 0; i < n - 1; i++)
{
if(!damagedRects[i].IsEmpty())
{
- // Merge rects before rotate
- if(mergingRect.IsEmpty())
- {
- mergingRect = damagedRects[i];
- }
- else
- {
- mergingRect.Merge(damagedRects[i]);
- }
-
damagedRects[j++] = RecalculateRect[orientation](damagedRects[i], surfaceRect);
}
}
{
InsertRects(mBufferDamagedRects, surfaceRect);
clippingRect = surfaceRect;
- mDamagedRects.assign(1, RecalculateRect[orientation](surfaceRect, surfaceRect));
return;
}
{
// Empty damaged rect. We don't need rendering
clippingRect = Rect<int>();
- mDamagedRects.clear();
return;
}
{
InsertRects(mBufferDamagedRects, surfaceRect);
clippingRect = surfaceRect;
- mDamagedRects.assign(1, RecalculateRect[orientation](surfaceRect, surfaceRect));
return;
}
// Merge intersecting rects, form an array of non intersecting rects to help driver a bit
// Could be optional and can be removed, needs to be checked with and without on platform
- // And then, Make one clipping rect, and rotate rects by orientation.
- MergeIntersectingRectsAndRotate(clippingRect, mDamagedRects, orientation, surfaceRect);
+ MergeIntersectingRects(mDamagedRects, orientation, surfaceRect);
+
+ // Make one clipping rect
+ MergeRects(clippingRect, mDamagedRects);
// We push current frame damaged rects here, zero index for current frame
InsertRects(mBufferDamagedRects, clippingRect);
std::vector<Rect<int>> damagedRegion;
if(scene)
{
- damagedRegion.push_back(RecalculateRect[orientation](clippingRect, surfaceRect));
+ damagedRegion.push_back(RecalculateRect[std::min(scene.GetCurrentSurfaceOrientation() / 90, 3)](clippingRect, scene.GetCurrentSurfaceRect()));
}
else
{