[Bf-blender-cvs] [c19b6642887] gpencil-new-data-proposal: Add functionality to iterate over frames in a specific layer

Falk David noreply at git.blender.org
Tue May 10 12:25:33 CEST 2022


Commit: c19b66428878a8adc89e2c8484b6b9743e32bbbc
Author: Falk David
Date:   Fri May 6 11:57:47 2022 +0200
Branches: gpencil-new-data-proposal
https://developer.blender.org/rBc19b66428878a8adc89e2c8484b6b9743e32bbbc

Add functionality to iterate over frames in a specific layer

===================================================================

M	source/blender/blenkernel/intern/gpencil_new_proposal.hh
M	source/blender/blenkernel/intern/gpencil_new_proposal_test.cc

===================================================================

diff --git a/source/blender/blenkernel/intern/gpencil_new_proposal.hh b/source/blender/blenkernel/intern/gpencil_new_proposal.hh
index 680975ea671..27f3a0ae191 100644
--- a/source/blender/blenkernel/intern/gpencil_new_proposal.hh
+++ b/source/blender/blenkernel/intern/gpencil_new_proposal.hh
@@ -87,7 +87,7 @@ typedef struct GPFrame {
 
 typedef struct GPData {
   /**
-   * The array of grease pencil frames. This is kept in cronological order (tiebreaks for two
+   * The array of grease pencil frames. This is kept in chronological order (tiebreaks for two
    * frames on different layers are resloved by the order of the layers).
    */
   GPFrame *frames_array;
diff --git a/source/blender/blenkernel/intern/gpencil_new_proposal_test.cc b/source/blender/blenkernel/intern/gpencil_new_proposal_test.cc
index ce4f26378f4..37001ec1141 100644
--- a/source/blender/blenkernel/intern/gpencil_new_proposal_test.cc
+++ b/source/blender/blenkernel/intern/gpencil_new_proposal_test.cc
@@ -7,6 +7,8 @@
 #include <algorithm>
 
 #include "BKE_curves.hh"
+
+#include "BLI_index_mask_ops.hh"
 #include "BLI_math_vec_types.hh"
 
 #include "gpencil_new_proposal.hh"
@@ -156,6 +158,22 @@ class GPData : public ::GPData {
     return {(GPFrame *)this->frames_array, this->frames_size};
   }
 
+  IndexMask frames_on_layer(int layer_index) const
+  {
+    Vector<int64_t> indices;
+    return index_mask_ops::find_indices_based_on_predicate(
+        IndexMask(this->frames_size), 1024, indices, [&](const int index) {
+          return this->frames()[index].layer_index == layer_index;
+        });
+  }
+
+  IndexMask frames_on_layer(GPLayer &gpl) const
+  {
+    int layer_index = this->layers().first_index_try(gpl);
+    BLI_assert(layer_index != -1);
+    return frames_on_layer(layer_index);
+  }
+
   Span<GPLayer> layers() const
   {
     return {(const GPLayer *)this->layers_array, this->layers_size};
@@ -405,4 +423,34 @@ TEST(gpencil_proposal, CheckFramesSorted2)
   }
 }
 
+TEST(gpencil_proposal, IterateOverFramesOnLayer)
+{
+  GPData my_data;
+  GPLayer my_layer1("TestLayer1");
+  GPLayer my_layer2("TestLayer2");
+
+  const int frame_numbers_layer1[5] = {10, 5, 6, 1, 3};
+  const int frame_numbers_layer2[5] = {8, 5, 7, 1, 4};
+
+  const int frame_numbers_sorted1[5] = {1, 3, 5, 6, 10};
+  const int frame_numbers_sorted2[5] = {1, 4, 5, 7, 8};
+
+  my_data.add_layer(my_layer1);
+  my_data.add_layer(my_layer2);
+  for (int i : IndexRange(5)) {
+    my_data.create_new_frame_on_layer(my_layer1, frame_numbers_layer1[i]);
+    my_data.create_new_frame_on_layer(my_layer2, frame_numbers_layer2[i]);
+  }
+
+  IndexMask indices_frames_layer1 = my_data.frames_on_layer(my_layer1);
+  for (const int i : indices_frames_layer1.index_range()) {
+    EXPECT_EQ(my_data.frames()[indices_frames_layer1[i]].start, frame_numbers_sorted1[i]);
+  }
+
+  IndexMask indices_frames_layer2 = my_data.frames_on_layer(my_layer2);
+  for (const int i : indices_frames_layer2.index_range()) {
+    EXPECT_EQ(my_data.frames()[indices_frames_layer2[i]].start, frame_numbers_sorted2[i]);
+  }
+}
+
 }  // namespace blender::bke::gpencil::tests
\ No newline at end of file



More information about the Bf-blender-cvs mailing list