117 const int num_dst_layers = src_layer_indices_by_dst_layer.size();
124 dst_grease_pencil, src_grease_pencil.root_group(), dst_grease_pencil.root_group());
125 BLI_assert(src_groups.
size() == dst_grease_pencil.layer_groups().size());
128 Array<int> parent_group_index_by_dst_layer(num_dst_layers);
129 for (
const int dst_layer_i : src_layer_indices_by_dst_layer.index_range()) {
130 const Span<int> src_layer_indices = src_layer_indices_by_dst_layer[dst_layer_i];
133 parent_group_index_by_dst_layer[dst_layer_i] = src_groups.
first_index_try(&parent);
141 int num_dst_drawings = 0;
145 for (
const int dst_layer_i : src_layer_indices_by_dst_layer.index_range()) {
146 const Span<int> src_layer_indices = src_layer_indices_by_dst_layer[dst_layer_i];
147 const Layer &src_first = *src_layers[src_layer_indices.
first()];
148 const int parent_index = parent_group_index_by_dst_layer[dst_layer_i];
150 LayerGroup &dst_parent = (parent_index == -1) ? dst_grease_pencil.root_group() :
151 *dst_groups[parent_index];
152 Layer &dst_layer = dst_grease_pencil.add_layer(dst_parent, src_first.name(),
false);
156 dst_layer_to_old_index_map.
add(&dst_layer, dst_layer_i);
158 const int dst_drawing_start_index = src_drawing_indices_by_dst_drawing.
size();
161 if (src_layer_indices.
size() == 1) {
175 src_transforms_by_dst_drawing.
append(
180 index = index + dst_drawing_start_index;
189 struct InsertKeyframe {
194 for (
const int src_layer_i : src_layer_indices) {
195 const Layer &src_layer = *src_layers[src_layer_i];
196 for (
const auto &item : src_layer.
frames().
items()) {
197 if (item.value.is_end()) {
204 [&](InsertKeyframe *frame) { *frame = {item.value, duration}; },
205 [&](InsertKeyframe *frame) {
212 else if (frame->duration > 0) {
214 frame->duration = std::max(frame->duration, duration);
224 sorted_keys[
i++] = key;
226 std::sort(sorted_keys.
begin(), sorted_keys.
end());
231 for (
const int src_layer_i : src_layer_indices) {
232 const Layer &src_layer = *src_layers[src_layer_i];
233 for (
const int key_i : sorted_keys.
index_range()) {
236 if (drawing_index != -1) {
237 src_drawing_indices_by_frame[key_i].append(drawing_index);
238 src_transforms_by_frame[key_i].append(dst_layer_transform_inv *
246 for (
const int key_i : sorted_keys.
index_range()) {
248 const InsertKeyframe value = dst_frames.lookup(key);
249 const Vector<int> &src_drawing_indices = src_drawing_indices_by_frame[key_i];
254 frame->
flag = value.frame.flag;
255 frame->
type = value.frame.type;
258 int index = unique_src_indices_per_drawing.
index_of_try(src_drawing_indices);
260 unique_src_indices_per_drawing.
add_new(src_drawing_indices);
262 src_transforms_by_dst_drawing.
append(src_transforms);
266 index = index + dst_drawing_start_index;
271 dst_layer.tag_frames_map_changed();
276 Array<int> old_to_new_index_map(num_dst_layers);
277 for (
const int layer_i : dst_grease_pencil.layers().index_range()) {
278 const Layer *layer = &dst_grease_pencil.layer(layer_i);
279 old_to_new_index_map[dst_layer_to_old_index_map.lookup(layer)] = layer_i;
283 if (num_dst_drawings > 0) {
284 dst_grease_pencil.add_empty_drawings(num_dst_drawings);
289 for (const int dst_drawing_i : range) {
290 const Span<int> src_drawing_indices = src_drawing_indices_by_dst_drawing[dst_drawing_i];
291 const Span<float4x4> src_transforms_to_apply = src_transforms_by_dst_drawing[dst_drawing_i];
292 const GreasePencilDrawingBase *src_first_base = src_drawings[src_drawing_indices.first()];
293 BLI_assert(src_first_base->type == GP_DRAWING);
294 GreasePencilDrawingBase *dst_base = dst_drawings[dst_drawing_i];
295 BLI_assert(dst_base->type == GP_DRAWING);
297 dst_base->flag = src_first_base->flag;
299 Drawing &dst_drawing = reinterpret_cast<GreasePencilDrawing *>(dst_base)->wrap();
300 if (src_drawing_indices.size() == 1) {
301 const Drawing &src_drawing =
302 reinterpret_cast<const GreasePencilDrawing *>(src_first_base)->wrap();
303 dst_drawing.strokes_for_write() = src_drawing.strokes();
304 dst_drawing.tag_topology_changed();
309 Vector<const bke::CurvesGeometry *> all_src_curves;
310 for (const int src_darwing_i : src_drawing_indices) {
311 const GreasePencilDrawingBase *src_base = src_drawings[src_darwing_i];
312 BLI_assert(src_base->type == GP_DRAWING);
313 const Drawing &src_drawing =
314 reinterpret_cast<const GreasePencilDrawing *>(src_base)->wrap();
315 all_src_curves.append(&src_drawing.strokes());
318 dst_drawing.strokes_for_write() = join_curves(
319 src_grease_pencil, all_src_curves, src_transforms_to_apply);
320 dst_drawing.tag_topology_changed();
325 for (
const Layer *dst_layer : dst_grease_pencil.layers()) {
326 dst_grease_pencil.update_drawing_users_for_layer(*dst_layer);
330 const bke::AttributeAccessor src_attributes = src_grease_pencil.attributes();
331 bke::MutableAttributeAccessor dst_attributes = dst_grease_pencil.attributes_for_write();
333 if (iter.
data_type == bke::AttrType::String) {
336 bke::GAttributeReader src_attribute = iter.
get();
337 bke::GSpanAttributeWriter dst_attribute = dst_attributes.lookup_or_add_for_write_only_span(
339 if (!dst_attribute) {
343 const CPPType &type = dst_attribute.span.type();
344 bke::attribute_math::convert_to_static_type(type, [&](
auto type) {
345 using T =
decltype(type);
346 const VArraySpan<T> src_span = src_attribute.varray.typed<
T>();
349 bke::attribute_math::DefaultMixer<T> mixer(new_span);
350 for (
const int dst_layer_i :
IndexRange(num_dst_layers)) {
351 const Span<int> src_layer_indices = src_layer_indices_by_dst_layer[dst_layer_i];
352 const int new_index = old_to_new_index_map[dst_layer_i];
353 for (
const int src_layer_i : src_layer_indices) {
354 const T &src_value = src_span[src_layer_i];
355 mixer.mix_in(new_index, src_value);
361 dst_attribute.finish();