From c5dff902a6a6ffcb851763ba740ff3d138d8f2bb Mon Sep 17 00:00:00 2001 From: Falk David Date: Fri, 19 Jan 2024 14:58:00 +0100 Subject: [PATCH] GPV3: Modifiers: Add `get_drawing_infos_for_write` This API returns a vector with a pointer to each drawing as well as the starting frame for the keyframe that the drawing came from. --- .../intern/MOD_grease_pencil_util.cc | 30 +++++++++++++++++-- .../intern/MOD_grease_pencil_util.hh | 10 +++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_util.cc b/source/blender/modifiers/intern/MOD_grease_pencil_util.cc index a348a172180..6d32cec0c99 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_util.cc +++ b/source/blender/modifiers/intern/MOD_grease_pencil_util.cc @@ -37,6 +37,7 @@ namespace blender::modifier::greasepencil { using bke::greasepencil::Drawing; +using bke::greasepencil::FramesMapKey; using bke::greasepencil::Layer; void init_influence_data(GreasePencilModifierInfluenceData *influence_data, @@ -310,12 +311,12 @@ IndexMask get_filtered_stroke_mask(const Object *ob, Vector get_drawings_for_write(GreasePencil &grease_pencil, const IndexMask &layer_mask, - int frame) + const int frame) { /* Set of unique drawing indices. */ Set drawing_indices; for (const int64_t i : layer_mask.index_range()) { - Layer *layer = grease_pencil.layers_for_write()[layer_mask[i]]; + const Layer *layer = grease_pencil.layers()[layer_mask[i]]; const int drawing_index = layer->drawing_index_at(frame); if (drawing_index >= 0) { drawing_indices.add(drawing_index); @@ -334,4 +335,29 @@ Vector get_drawings_for_write(GreasePencil &grease return drawings; } +Vector get_drawing_infos_for_write(GreasePencil &grease_pencil, + const IndexMask &layer_mask, + const int frame) +{ + Set drawing_indices; + Vector drawing_infos; + for (const int64_t i : layer_mask.index_range()) { + const Layer *layer = grease_pencil.layers()[layer_mask[i]]; + const std::optional start_frame = layer->frame_key_at(frame); + if (!start_frame) { + continue; + } + const GreasePencilFrame &frame = layer->frames().lookup(*start_frame); + if (!drawing_indices.contains(frame.drawing_index)) { + drawing_indices.add(frame.drawing_index); + GreasePencilDrawingBase *drawing_base = grease_pencil.drawing(frame.drawing_index); + if (drawing_base->type == GP_DRAWING) { + GreasePencilDrawing *drawing = reinterpret_cast(drawing_base); + drawing_infos.append({&drawing->wrap(), *start_frame}); + } + } + } + return drawing_infos; +} + } // namespace blender::modifier::greasepencil diff --git a/source/blender/modifiers/intern/MOD_grease_pencil_util.hh b/source/blender/modifiers/intern/MOD_grease_pencil_util.hh index 9652ff47e0d..d0a70ab316c 100644 --- a/source/blender/modifiers/intern/MOD_grease_pencil_util.hh +++ b/source/blender/modifiers/intern/MOD_grease_pencil_util.hh @@ -63,4 +63,14 @@ Vector get_drawings_for_write(GreasePencil &grease const IndexMask &layer_mask, int frame); +struct DrawingInfo { + bke::greasepencil::Drawing *drawing; + /* Frame on which this drawing starts. */ + int start_frame_number; +}; + +Vector get_drawing_infos_for_write(GreasePencil &grease_pencil, + const IndexMask &layer_mask, + int frame); + } // namespace blender::modifier::greasepencil