[Bf-blender-cvs] [a4690a99581] gpencil-new-data-proposal: Add functions to write to stroke point positions.

Falk David noreply at git.blender.org
Wed May 11 15:01:35 CEST 2022


Commit: a4690a9958101253df01f4c937cc1dee1bf27409
Author: Falk David
Date:   Wed May 11 15:01:26 2022 +0200
Branches: gpencil-new-data-proposal
https://developer.blender.org/rBa4690a9958101253df01f4c937cc1dee1bf27409

Add functions to write to stroke point positions.

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

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 31d26829349..dd4c86bf0d6 100644
--- a/source/blender/blenkernel/intern/gpencil_new_proposal_test.cc
+++ b/source/blender/blenkernel/intern/gpencil_new_proposal_test.cc
@@ -69,27 +69,42 @@ class GPDataRuntime {
 /**
  * A wrapper class around a single curve in GPFrame.strokes (CurvesGeometry). It holds the offset
  * 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 {
+class GPStroke : NonCopyable, NonMovable {
  public:
-  GPStroke(int num_points, int offset_index)
-      : num_points_(num_points), offset_index_(offset_index){};
+  GPStroke(CurvesGeometry *geometry, int num_points, int offset)
+      : geometry_(geometry), points_num_(num_points), offset_(offset){};
 
   ~GPStroke() = default;
 
   int points_num() const
   {
-    return num_points_;
+    return points_num_;
   }
 
-  int point_offset() const
+  /**
+   * Start index of this stroke in the points array of geometry_.
+   */
+  int points_offset() const
   {
-    return offset_index_;
+    return offset_;
+  }
+
+  Span<float3> points_positions() const
+  {
+    return {geometry_->positions().begin() + offset_, points_num_};
+  }
+
+  MutableSpan<float3> points_positions_for_write() const
+  {
+    return {geometry_->positions_for_write().begin() + offset_, points_num_};
   }
 
  private:
-  int num_points_;
-  int offset_index_;
+  CurvesGeometry *geometry_ = nullptr;
+  int points_num_ = 0;
+  int offset_;
 };
 
 class GPFrame : public ::GPFrame {
@@ -188,14 +203,22 @@ class GPFrame : public ::GPFrame {
     return this->strokes->curve_size;
   }
 
-  GPStroke add_new_stroke(int num_points)
+  GPStroke add_new_stroke(int new_points_num)
   {
     if (this->strokes == nullptr) {
       this->strokes = MEM_new<CurvesGeometry>(__func__);
     }
     CurvesGeometry &strokes = this->strokes_as_curves();
-    strokes.resize(strokes.points_num() + num_points, strokes.curves_num() + 1);
-    return {num_points, strokes.offsets().last()};
+    int orig_last_offset = strokes.offsets().last();
+
+    strokes.resize(strokes.points_num() + new_points_num, strokes.curves_num() + 1);
+    strokes.offsets_for_write().last() = strokes.points_num();
+
+    /* Use ploy type by default. */
+    strokes.curve_types_for_write().last() = CURVE_TYPE_POLY;
+
+    strokes.tag_topology_changed();
+    return {reinterpret_cast<CurvesGeometry *>(this->strokes), new_points_num, orig_last_offset};
   }
 };
 
@@ -543,6 +566,7 @@ TEST(gpencil_proposal, AddFrameToLayer)
   data.add_layer(layer2);
 
   GPFrame *frame = data.add_frame_on_layer(layer2, 0);
+  EXPECT_NE(frame, nullptr);
 
   EXPECT_EQ(data.frames_size, 1);
   EXPECT_EQ(data.frames().last().layer_index, 1);
@@ -563,6 +587,7 @@ TEST(gpencil_proposal, CheckFramesSorted1)
   const int layer1_idx = data.add_layer(layer1);
   for (int i : IndexRange(5)) {
     GPFrame *frame = data.add_frame_on_layer(layer1_idx, frame_numbers1[i]);
+    EXPECT_NE(frame, nullptr);
     EXPECT_EQ(frame->start, frame_numbers1[i]);
   }
 
@@ -634,6 +659,7 @@ TEST(gpencil_proposal, AddSingleStroke)
   const int layer1_idx = data.add_layer(layer1);
 
   GPFrame *frame = data.add_frame_on_layer(layer1_idx, 0);
+  EXPECT_NE(frame, nullptr);
   GPStroke stroke = frame->add_new_stroke(100);
 
   EXPECT_EQ(data.strokes_num(), 1);
@@ -641,4 +667,30 @@ TEST(gpencil_proposal, AddSingleStroke)
   EXPECT_EQ(stroke.points_num(), 100);
 }
 
+TEST(gpencil_proposal, ChangeStrokePoints)
+{
+  GPData data;
+  GPLayer layer1("TestLayer1");
+
+  const int layer1_idx = data.add_layer(layer1);
+
+  static const Array<float3> test_positions{{
+      {1.0f, 2.0f, 3.0f},
+      {4.0f, 5.0f, 6.0f},
+      {7.0f, 8.0f, 9.0f},
+  }};
+
+  GPFrame *frame = data.add_frame_on_layer(layer1_idx, 0);
+  EXPECT_NE(frame, nullptr);
+  GPStroke stroke = frame->add_new_stroke(test_positions.size());
+
+  for (const int i : stroke.points_positions_for_write().index_range()) {
+    stroke.points_positions_for_write()[i] = test_positions[i];
+  }
+
+  for (const int i : stroke.points_positions().index_range()) {
+    EXPECT_V3_NEAR(stroke.points_positions()[i], test_positions[i], 1e-5f);
+  }
+}
+
 }  // namespace blender::bke::gpencil::tests
\ No newline at end of file



More information about the Bf-blender-cvs mailing list