Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2022-08-30 18:03:59 +0300
committerClément Foucault <foucault.clem@gmail.com>2022-08-30 18:03:59 +0300
commit42532f35e2059b3788cb1edd267b5c84a5581316 (patch)
treee1e5b49c2b61d52a23fab7c3ba320d32d64b1693
parentf940884f7bd1cc5c2c9288e52ffb11c61f6c20d8 (diff)
Fix submission of sortable pass
-rw-r--r--source/blender/draw/intern/draw_manager.cc7
-rw-r--r--source/blender/draw/intern/draw_manager.hh2
-rw-r--r--source/blender/draw/intern/draw_pass.hh22
3 files changed, 18 insertions, 13 deletions
diff --git a/source/blender/draw/intern/draw_manager.cc b/source/blender/draw/intern/draw_manager.cc
index 6feae81b62f..20a9a9e8c36 100644
--- a/source/blender/draw/intern/draw_manager.cc
+++ b/source/blender/draw/intern/draw_manager.cc
@@ -135,6 +135,13 @@ void Manager::submit(PassMain &pass, View &view)
state.cleanup();
}
+void Manager::submit(PassSortable &pass, View &view)
+{
+ pass.sort();
+
+ this->submit(static_cast<PassMain &>(pass), view);
+}
+
Manager::SubmitDebugOutput Manager::submit_debug(PassSimple &pass, View &view)
{
submit(pass, view);
diff --git a/source/blender/draw/intern/draw_manager.hh b/source/blender/draw/intern/draw_manager.hh
index 6b68fbfdb28..5063de740e3 100644
--- a/source/blender/draw/intern/draw_manager.hh
+++ b/source/blender/draw/intern/draw_manager.hh
@@ -30,6 +30,7 @@ class DrawMultiBuf;
using PassSimple = detail::Pass<command::DrawCommandBuf>;
using PassMain = detail::Pass<command::DrawMultiBuf>;
+class PassSortable;
class Manager {
using ObjectMatricesBuf = StorageArrayBuffer<ObjectMatrices, 128>;
@@ -107,6 +108,7 @@ class Manager {
*/
void submit(PassSimple &pass, View &view);
void submit(PassMain &pass, View &view);
+ void submit(PassSortable &pass, View &view);
/**
* Submit a pass for drawing but read back all data buffers for inspection.
diff --git a/source/blender/draw/intern/draw_pass.hh b/source/blender/draw/intern/draw_pass.hh
index 56e99059c7b..d8ddb449976 100644
--- a/source/blender/draw/intern/draw_pass.hh
+++ b/source/blender/draw/intern/draw_pass.hh
@@ -369,6 +369,8 @@ template<typename DrawCommandBufType> class Pass : public detail::PassBase<DrawC
* The base level can only be composed of sub passes that will be ordered by a special value.
*/
class PassSortable : public PassMain {
+ friend Manager;
+
private:
/** Sorting value associated with each sub pass. */
Vector<float> sorting_values_;
@@ -405,21 +407,15 @@ class PassSortable : public PassMain {
protected:
void sort()
{
- std::sort(headers_.begin(), headers_.end(), [&](Header &a, Header &b) {
- BLI_assert(a.type == Type::SubPass && b.type == Type::SubPass);
- float a_val = sorting_values_[a.index];
- float b_val = sorting_values_[b.index];
- return a_val < b_val || (a_val == b_val && a.index < b.index);
- });
- sorted_ = true;
- }
-
- void submit(command::RecordingState &state) const
- {
if (sorted_ == false) {
- const_cast<PassSortable *>(this)->sort();
+ std::sort(headers_.begin(), headers_.end(), [&](Header &a, Header &b) {
+ BLI_assert(a.type == Type::SubPass && b.type == Type::SubPass);
+ float a_val = sorting_values_[a.index];
+ float b_val = sorting_values_[b.index];
+ return a_val < b_val || (a_val == b_val && a.index < b.index);
+ });
+ sorted_ = true;
}
- PassMain::submit(state);
}
};