diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2017-09-03 12:09:57 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2017-09-04 21:20:25 +0000 |
commit | 5e13bb3f093627af02f86602ab02f98bbf3648a2 (patch) | |
tree | 994b0f9fc18344ec5adfbab78f2584948fddc173 /src/render/backend/renderview.cpp | |
parent | e2a214855303f9579fc5c5e941a7e1a7e4080566 (diff) |
Add support for FrontToBack sorting
A typical renderer with opaque-transparent passes will often want
to use FrontToBack in the opaque pass (even though this is usually
not strictly required).
Change-Id: I071b62424a5446c86d76c6045c126a599534bf80
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/backend/renderview.cpp')
-rw-r--r-- | src/render/backend/renderview.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp index dca660ad0..962480f2f 100644 --- a/src/render/backend/renderview.cpp +++ b/src/render/backend/renderview.cpp @@ -307,6 +307,15 @@ struct AdjacentSubRangeFinder<QSortPolicy::Material> } }; +template<> +struct AdjacentSubRangeFinder<QSortPolicy::FrontToBack> +{ + static bool adjacentSubRange(RenderCommand *a, RenderCommand *b) + { + return a->m_depth == b->m_depth; + } +}; + template<typename Predicate> int advanceUntilNonAdjacent(const QVector<RenderCommand *> &commands, const int beg, const int end, Predicate pred) @@ -366,6 +375,16 @@ struct SubRangeSorter<QSortPolicy::Material> } }; +template<> +struct SubRangeSorter<QSortPolicy::FrontToBack> +{ + static void sortSubRange(CommandIt begin, const CommandIt end) + { + std::stable_sort(begin, end, [] (RenderCommand *a, RenderCommand *b) { + return a->m_depth < b->m_depth; + }); + } +}; int findSubRange(const QVector<RenderCommand *> &commands, const int begin, const int end, @@ -378,6 +397,8 @@ int findSubRange(const QVector<RenderCommand *> &commands, return advanceUntilNonAdjacent(commands, begin, end, AdjacentSubRangeFinder<QSortPolicy::BackToFront>::adjacentSubRange); case QSortPolicy::Material: return advanceUntilNonAdjacent(commands, begin, end, AdjacentSubRangeFinder<QSortPolicy::Material>::adjacentSubRange); + case QSortPolicy::FrontToBack: + return advanceUntilNonAdjacent(commands, begin, end, AdjacentSubRangeFinder<QSortPolicy::FrontToBack>::adjacentSubRange); default: Q_UNREACHABLE(); return end; @@ -418,6 +439,9 @@ void sortCommandRange(QVector<RenderCommand *> &commands, int begin, const int e // Group all same material together (same parameters most likely) sortByMaterial(commands, begin, end); break; + case QSortPolicy::FrontToBack: + SubRangeSorter<QSortPolicy::FrontToBack>::sortSubRange(commands.begin() + begin, commands.begin() + end); + break; default: Q_UNREACHABLE(); } |