Fix T68370, T74973: Cycles cryptomatte not working when other passes are enabled
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Fri, 20 Mar 2020 14:56:24 +0000 (15:56 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Fri, 20 Mar 2020 14:59:24 +0000 (15:59 +0100)
Solution found by Blazej Floch.

intern/cycles/render/film.cpp
intern/cycles/util/util_algorithm.h

index d1e2ef66c2cf6b38656e7df1410a6adafb358303..baf0290112317bdb50babd33482c22339b45935d 100644 (file)
@@ -203,9 +203,10 @@ void Pass::add(PassType type, vector<Pass> &passes, const char *name)
 
   passes.push_back(pass);
 
-  /* order from by components, to ensure alignment so passes with size 4
-   * come first and then passes with size 1 */
-  sort(&passes[0], &passes[0] + passes.size(), compare_pass_order);
+  /* Order from by components, to ensure alignment so passes with size 4
+   * come first and then passes with size 1. Note this must use stable sort
+   * so cryptomatte passes remain in the right order. */
+  stable_sort(&passes[0], &passes[0] + passes.size(), compare_pass_order);
 
   if (pass.divide_type != PASS_NONE)
     Pass::add(pass.divide_type, passes);
index 62093039625654b3485596d9649112cd31423c2c..63abd4e92a3617601919a1f97c2d34e995d0a219 100644 (file)
@@ -25,6 +25,7 @@ using std::max;
 using std::min;
 using std::remove;
 using std::sort;
+using std::stable_sort;
 using std::swap;
 
 CCL_NAMESPACE_END