[Bf-blender-cvs] [2b840c25bd0] gpencil-new-data-proposal: Add multi-frame transform strokes test

Falk David noreply at git.blender.org
Tue May 24 14:29:26 CEST 2022


Commit: 2b840c25bd0a5a12122eef1137e11eec4eb6617d
Author: Falk David
Date:   Tue May 24 14:25:33 2022 +0200
Branches: gpencil-new-data-proposal
https://developer.blender.org/rB2b840c25bd0a5a12122eef1137e11eec4eb6617d

Add multi-frame transform strokes test

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

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

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

diff --git a/source/blender/blenkernel/intern/gpencil_new_proposal_test.cc b/source/blender/blenkernel/intern/gpencil_new_proposal_test.cc
index bf2886322e5..42ecff85557 100644
--- a/source/blender/blenkernel/intern/gpencil_new_proposal_test.cc
+++ b/source/blender/blenkernel/intern/gpencil_new_proposal_test.cc
@@ -73,7 +73,7 @@ class GPDataRuntime {
  * of where to find the stroke in the frame and it's size.
  * This class is only meant to facilitate the handling of individual strokes.
  */
-class GPStroke : NonCopyable, NonMovable {
+class GPStroke {
  public:
   GPStroke(CurvesGeometry *geometry, int num_points, int offset)
       : geometry_(geometry), points_num_(num_points), offset_(offset){};
@@ -103,6 +103,16 @@ class GPStroke : NonCopyable, NonMovable {
     return {geometry_->positions_for_write().begin() + offset_, points_num_};
   }
 
+  void transform(float4x4 matrix)
+  {
+    threading::parallel_for(
+        points_positions_for_write().index_range(), 512, [&](const IndexRange range) {
+          for (float3 &position : points_positions_for_write().slice(range)) {
+            position = matrix * position;
+          }
+        });
+  }
+
  private:
   CurvesGeometry *geometry_ = nullptr;
   int points_num_ = 0;
@@ -223,6 +233,17 @@ class GPFrame : public ::GPFrame {
     return this->strokes->point_num;
   }
 
+  Vector<GPStroke> strokes_for_write()
+  {
+    Vector<GPStroke> strokes;
+    for (const int i : this->strokes_as_curves().offsets().drop_back(1).index_range()) {
+      int offset = this->strokes_as_curves().offsets()[i];
+      int length = this->strokes_as_curves().offsets()[i + 1] - offset;
+      strokes.append({reinterpret_cast<CurvesGeometry *>(this->strokes), length, offset});
+    }
+    return strokes;
+  }
+
   GPStroke add_new_stroke(int new_points_num)
   {
     if (this->strokes == nullptr) {
@@ -1013,14 +1034,14 @@ TEST(gpencil_proposal, TimeBigGPDataCopy)
   free_old_gpencil_data(old_data_copy);
 }
 
-TEST(gpencil_proposal, TimeBigGPDataInsertFrame)
+TEST(gpencil_proposal, TimeInsertFrame)
 {
   int layers_num = 100, frames_num = 1000, strokes_num = 10, points_num = 10;
   GPData data = build_gpencil_data(layers_num, frames_num, strokes_num, points_num);
   data.set_active_layer(7);
 
   {
-    SCOPED_TIMER("TimeBigGPDataInsertFrame");
+    SCOPED_TIMER("TimeInsertFrame");
     data.add_frame_on_active_layer(347);
   }
 
@@ -1045,7 +1066,7 @@ TEST(gpencil_proposal, TimeBigGPDataInsertFrame)
   }
 
   {
-    SCOPED_TIMER("TimeBigGPDataOldInsertFrame");
+    SCOPED_TIMER("TimeOldInsertFrame");
     insert_new_frame_old_gpencil_data(old_data, 347);
   }
 
@@ -1054,4 +1075,48 @@ TEST(gpencil_proposal, TimeBigGPDataInsertFrame)
   free_old_gpencil_data(old_data);
 }
 
+TEST(gpencil_proposal, TimeMultiFrameTransformStrokes)
+{
+  int layers_num = 1, frames_num = 1000, strokes_num = 100, points_num = 100;
+  GPData data = build_gpencil_data(layers_num, frames_num, strokes_num, points_num);
+  data.set_active_layer(0);
+
+  float4x4 translate_mat = float4x4::from_location({1.0f, 2.0f, 3.0f});
+  {
+    SCOPED_TIMER("TimeMultiFrameTransformStrokes");
+    IndexMask indices_frames = data.frames_on_active_layer();
+    for (const int i : indices_frames) {
+      GPFrame &gpf = data.frames_for_write(i);
+      Vector<GPStroke> gpf_strokes = gpf.strokes_for_write();
+      MutableSpan<GPStroke> strokes_span = gpf_strokes.as_mutable_span();
+      threading::parallel_for(strokes_span.index_range(), 256, [&](const IndexRange range) {
+        for (GPStroke &stroke : strokes_span.slice(range)) {
+          stroke.transform(translate_mat);
+        }
+      });
+    }
+  }
+
+  bGPdata *old_data = build_old_gpencil_data(layers_num, frames_num, strokes_num, points_num);
+  BKE_gpencil_layer_active_set(old_data, reinterpret_cast<bGPDlayer *>(old_data->layers.first));
+
+  float matrix[4][4], loc[3] = {1.0f, 2.0f, 3.0f};
+  unit_m4(matrix);
+  copy_v3_v3(matrix[3], loc);
+  {
+    SCOPED_TIMER("TimeOldMultiFrameTransformStrokes");
+    bGPDlayer *gpl_active = BKE_gpencil_layer_active_get(old_data);
+    LISTBASE_FOREACH (bGPDframe *, gpf, &gpl_active->frames) {
+      LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
+        for (int i = 0; i < gps->totpoints; i++) {
+          bGPDspoint *pt = &gps->points[i];
+          mul_m4_v3(matrix, &pt->x);
+        }
+      }
+    }
+  }
+
+  free_old_gpencil_data(old_data);
+}
+
 }  // namespace blender::bke::gpencil::tests



More information about the Bf-blender-cvs mailing list