[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