From bc0e5cf8bdce2301d06f30aa9c916be6964fa37a Mon Sep 17 00:00:00 2001 From: Falk David Date: Wed, 18 Oct 2023 11:26:21 +0200 Subject: [PATCH] Cleanup: GPv3: Use helper to duplicate drawings --- .../blender/blenkernel/BKE_grease_pencil.hh | 19 ++++-- .../blenkernel/intern/grease_pencil.cc | 60 ++++++++++++------- 2 files changed, 51 insertions(+), 28 deletions(-) diff --git a/source/blender/blenkernel/BKE_grease_pencil.hh b/source/blender/blenkernel/BKE_grease_pencil.hh index ca9855bd0cb..96285ed0212 100644 --- a/source/blender/blenkernel/BKE_grease_pencil.hh +++ b/source/blender/blenkernel/BKE_grease_pencil.hh @@ -117,6 +117,17 @@ class DrawingReference : public ::GreasePencilDrawingReference { ~DrawingReference(); }; +const Drawing *get_eval_grease_pencil_layer_drawing(const GreasePencil &grease_pencil, + int layer_index); +Drawing *get_eval_grease_pencil_layer_drawing_for_write(GreasePencil &grease_pencil, + int layer_index); +/** + * Copies the drawings from one array to another. Assumes that \a dst_drawings is allocated but not + * initialized, e.g. it will allocate new drawings and store the pointers. + */ +void copy_drawing_array(Span src_drawings, + MutableSpan dst_drawings); + class LayerGroup; class Layer; @@ -653,11 +664,6 @@ void legacy_gpencil_frame_to_grease_pencil_drawing(const bGPDframe &gpf, void legacy_gpencil_to_grease_pencil(Main &main, GreasePencil &grease_pencil, bGPdata &gpd); } // namespace convert - -const Drawing *get_eval_grease_pencil_layer_drawing(const GreasePencil &grease_pencil, - int layer_index); -Drawing *get_eval_grease_pencil_layer_drawing_for_write(GreasePencil &grease_pencil, - int layer_index); } // namespace greasepencil class GreasePencilRuntime { @@ -798,6 +804,9 @@ GreasePencil *BKE_grease_pencil_copy_for_eval(const GreasePencil *grease_pencil_ BoundBox *BKE_grease_pencil_boundbox_get(Object *ob); void BKE_grease_pencil_data_update(Depsgraph *depsgraph, Scene *scene, Object *object); +void BKE_grease_pencil_duplicate_drawing_array(const GreasePencil *grease_pencil_src, + GreasePencil *grease_pencil_dst); + int BKE_grease_pencil_object_material_index_get(Object *ob, Material *ma); int BKE_grease_pencil_object_material_index_get_by_name(Object *ob, const char *name); Material *BKE_grease_pencil_object_material_new(Main *bmain, diff --git a/source/blender/blenkernel/intern/grease_pencil.cc b/source/blender/blenkernel/intern/grease_pencil.cc index 3c4b37465f5..3004bc9004c 100644 --- a/source/blender/blenkernel/intern/grease_pencil.cc +++ b/source/blender/blenkernel/intern/grease_pencil.cc @@ -95,29 +95,7 @@ static void grease_pencil_copy_data(Main * /*bmain*/, grease_pencil_dst->material_array = static_cast( MEM_dupallocN(grease_pencil_src->material_array)); - /* Duplicate drawing array. */ - grease_pencil_dst->drawing_array_num = grease_pencil_src->drawing_array_num; - grease_pencil_dst->drawing_array = MEM_cnew_array( - grease_pencil_src->drawing_array_num, __func__); - for (int i = 0; i < grease_pencil_src->drawing_array_num; i++) { - const GreasePencilDrawingBase *src_drawing_base = grease_pencil_src->drawing_array[i]; - switch (src_drawing_base->type) { - case GP_DRAWING: { - const GreasePencilDrawing *src_drawing = reinterpret_cast( - src_drawing_base); - grease_pencil_dst->drawing_array[i] = reinterpret_cast( - MEM_new(__func__, src_drawing->wrap())); - break; - } - case GP_DRAWING_REFERENCE: { - const GreasePencilDrawingReference *src_drawing_reference = - reinterpret_cast(src_drawing_base); - grease_pencil_dst->drawing_array[i] = reinterpret_cast( - MEM_new(__func__, src_drawing_reference->wrap())); - break; - } - } - } + BKE_grease_pencil_duplicate_drawing_array(grease_pencil_src, grease_pencil_dst); /* Duplicate layer tree. */ grease_pencil_dst->root_group_ptr = MEM_new( @@ -473,6 +451,31 @@ Drawing *get_eval_grease_pencil_layer_drawing_for_write(GreasePencil &grease_pen return const_cast(get_eval_grease_pencil_layer_drawing(grease_pencil, layer)); } +void copy_drawing_array(Span src_drawings, + MutableSpan dst_drawings) +{ + BLI_assert(src_drawings.size() == dst_drawings.size()); + for (const int i : src_drawings.index_range()) { + const GreasePencilDrawingBase *src_drawing_base = src_drawings[i]; + switch (src_drawing_base->type) { + case GP_DRAWING: { + const GreasePencilDrawing *src_drawing = reinterpret_cast( + src_drawing_base); + dst_drawings[i] = reinterpret_cast( + MEM_new(__func__, src_drawing->wrap())); + break; + } + case GP_DRAWING_REFERENCE: { + const GreasePencilDrawingReference *src_drawing_reference = + reinterpret_cast(src_drawing_base); + dst_drawings[i] = reinterpret_cast( + MEM_new(__func__, src_drawing_reference->wrap())); + break; + } + } + } +} + TreeNode::TreeNode() { this->next = this->prev = nullptr; @@ -1231,6 +1234,17 @@ void BKE_grease_pencil_data_update(Depsgraph *depsgraph, Scene *scene, Object *o object->runtime.geometry_set_eval = new GeometrySet(std::move(geometry_set)); } +void BKE_grease_pencil_duplicate_drawing_array(const GreasePencil *grease_pencil_src, + GreasePencil *grease_pencil_dst) +{ + using namespace blender; + grease_pencil_dst->drawing_array_num = grease_pencil_src->drawing_array_num; + grease_pencil_dst->drawing_array = MEM_cnew_array( + grease_pencil_src->drawing_array_num, __func__); + bke::greasepencil::copy_drawing_array(grease_pencil_src->drawings(), + grease_pencil_dst->drawings()); +} + /** \} */ /* ------------------------------------------------------------------- */