diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2022-08-30 18:03:59 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2022-08-30 18:03:59 +0300 |
commit | 42532f35e2059b3788cb1edd267b5c84a5581316 (patch) | |
tree | e1e5b49c2b61d52a23fab7c3ba320d32d64b1693 | |
parent | f940884f7bd1cc5c2c9288e52ffb11c61f6c20d8 (diff) |
Fix submission of sortable pass
-rw-r--r-- | source/blender/draw/intern/draw_manager.cc | 7 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.hh | 2 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_pass.hh | 22 |
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); } }; |