[Bf-blender-cvs] [c2c12a16e23] gpencil-new-data-proposal: old to new conversion + testing

Amelie Fondevilla noreply at git.blender.org
Tue Nov 29 10:27:44 CET 2022


Commit: c2c12a16e23a56ab4d610d52a274bd796c63c265
Author: Amelie Fondevilla
Date:   Tue Nov 29 09:30:47 2022 +0100
Branches: gpencil-new-data-proposal
https://developer.blender.org/rBc2c12a16e23a56ab4d610d52a274bd796c63c265

old to new conversion + testing

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

M	source/blender/blenkernel/intern/gpencil_new_proposal.hh
M	source/blender/blenkernel/intern/gpencil_new_proposal_conversion.cc
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 64f6360e9aa..5b2818d5106 100644
--- a/source/blender/blenkernel/intern/gpencil_new_proposal.hh
+++ b/source/blender/blenkernel/intern/gpencil_new_proposal.hh
@@ -349,7 +349,7 @@ class GPData : public ::GPData {
   void update_frames_array();
 };
 
-GreasePencil convert_old_to_new_gpencil_data(const bGPdata *old_gpd);
+GPData convert_old_to_new_gpencil_data(bGPdata *old_gpd);
 bGPdata *convert_new_to_old_gpencil_data(const GreasePencil &new_gpd);
 
 }  // namespace blender::bke
diff --git a/source/blender/blenkernel/intern/gpencil_new_proposal_conversion.cc b/source/blender/blenkernel/intern/gpencil_new_proposal_conversion.cc
index ae9fa96a19a..c9e3e3b552a 100644
--- a/source/blender/blenkernel/intern/gpencil_new_proposal_conversion.cc
+++ b/source/blender/blenkernel/intern/gpencil_new_proposal_conversion.cc
@@ -4,14 +4,32 @@
  * \ingroup bke
  */
 
+#include "BKE_gpencil.h"
 #include "DNA_gpencil_types.h"
 #include "gpencil_new_proposal.hh"
 
 namespace blender::bke {
 
-GreasePencil convert_old_to_new_gpencil_data(const bGPdata *old_gpd)
+GPData convert_old_to_new_gpencil_data(bGPdata *old_gpd)
 {
-  GreasePencil new_gpd;
+  GPData new_gpd;
+
+  /* Add all layers */
+  Vector<std::string> layer_names;
+  LISTBASE_FOREACH (bGPDlayer *, lay, &old_gpd->layers) {
+    layer_names.append(std::string(lay->info));
+  }
+  new_gpd.add_layers(layer_names.as_span());
+
+  /* Add all frames */
+  int layer_index{-1};
+  LISTBASE_FOREACH (bGPDlayer *, lay, &old_gpd->layers) {
+    Vector<int> frame_indices;
+    LISTBASE_FOREACH (bGPDframe *, frm, &lay->frames) {
+      frame_indices.append(frm->framenum);
+    }
+    new_gpd.add_frames_on_layer(++layer_index, frame_indices.as_span());
+  }
 
   return new_gpd;
 }
diff --git a/source/blender/blenkernel/intern/gpencil_new_proposal_test.cc b/source/blender/blenkernel/intern/gpencil_new_proposal_test.cc
index f15eb03e8b8..f9ddd7727f1 100644
--- a/source/blender/blenkernel/intern/gpencil_new_proposal_test.cc
+++ b/source/blender/blenkernel/intern/gpencil_new_proposal_test.cc
@@ -121,6 +121,44 @@ static void free_old_gpencil_data(bGPdata *gpd)
   MEM_SAFE_FREE(gpd);
 }
 
+static void compare_data_structures(const GPData &ngpd, const bGPdata *ogpd)
+{
+  /* Compare Layers */
+  EXPECT_EQ(ngpd.layers_size, ogpd->totlayer);
+
+  int offset{-1};
+  LISTBASE_FOREACH (bGPDlayer *, lay, &ogpd->layers) {
+    const ::GPLayer *nlay = &(ngpd.layers_array[++offset]);
+
+    // Same name
+    EXPECT_EQ(std::strcmp(nlay->name, lay->info), 0);
+  }
+
+  /* Compare Frames */
+  EXPECT_EQ(ngpd.frames_size, ogpd->totframe);
+
+  // get plain list of frames
+  std::vector<std::pair<int, int>> ogpd_frames;
+  offset = 0;
+  LISTBASE_FOREACH (bGPDlayer *, lay, &ogpd->layers) {
+    LISTBASE_FOREACH (bGPDframe *, frm, &lay->frames) {
+      ogpd_frames.push_back({offset, frm->framenum});
+    }
+    ++offset;
+  }
+
+  // FIXME: this fails because in new data structure
+  // frames are sorted by frame_nb and then layer_index
+  for (int i = 0; i < ngpd.frames_size; i++) {
+    const ::GPFrame *nfrm = ngpd.frames_array + i;
+    int ofrm_layer_index{ogpd_frames[i].first};
+    int ofrm_frame_number{ogpd_frames[i].second};
+
+    EXPECT_EQ(nfrm->layer_index, ofrm_layer_index);
+    EXPECT_EQ(nfrm->start_time, ofrm_frame_number);
+  }
+}
+
 TEST(gpencil_proposal, EmptyGPData)
 {
   GPData data;
@@ -426,11 +464,13 @@ TEST(gpencil_proposal, TimeMultiFrameTransformStrokes)
 
 TEST(gpencil_proposal, Old2NewConversion)
 {
-  int layers_num = 10, frames_num = 20, strokes_num = 10, points_num = 100;
+  int layers_num = 2, frames_num = 2, strokes_num = 2, points_num = 2;
 
   bGPdata *old_data = build_old_gpencil_data(layers_num, frames_num, strokes_num, points_num);
 
-  GreasePencil data = convert_old_to_new_gpencil_data(old_data);
+  GPData data = convert_old_to_new_gpencil_data(old_data);
+
+  compare_data_structures(data, old_data);
 
   free_old_gpencil_data(old_data);
 }



More information about the Bf-blender-cvs mailing list