GPv3: Add function to insert a keyframe into multiple layers

This function adds a key into multiple layers. This is more efficient than
inserting a single key multiple times in a loop, because the drawing
array has to be resized one-by-one.
In this function, the resizing happens at once.

Pull Request: https://projects.blender.org/blender/blender/pulls/127930
This commit is contained in:
Falk David
2024-09-23 12:12:59 +02:00
committed by Falk David
parent 3d74be9c5b
commit 332f7517da
2 changed files with 41 additions and 0 deletions

View File

@@ -2466,6 +2466,38 @@ blender::bke::greasepencil::Drawing *GreasePencil::insert_frame(
return &drawing->wrap();
}
void GreasePencil::insert_frames(Span<blender::bke::greasepencil::Layer *> layers,
const int frame_number,
const int duration,
const eBezTriple_KeyframeType keytype)
{
using namespace blender;
if (layers.is_empty()) {
return;
}
Vector<GreasePencilFrame *> frames;
frames.reserve(layers.size());
for (bke::greasepencil::Layer *layer : layers) {
BLI_assert(layer != nullptr);
GreasePencilFrame *frame = layer->add_frame(frame_number, duration);
if (frame != nullptr) {
frames.append(frame);
}
}
if (frames.is_empty()) {
return;
}
this->add_empty_drawings(frames.size());
const IndexRange new_drawings = this->drawings().index_range().take_back(frames.size());
for (const int frame_i : frames.index_range()) {
GreasePencilFrame *frame = frames[frame_i];
frame->drawing_index = new_drawings[frame_i];
frame->type = int8_t(keytype);
}
}
bool GreasePencil::insert_duplicate_frame(blender::bke::greasepencil::Layer &layer,
const int src_frame_number,
const int dst_frame_number,

View File

@@ -598,6 +598,15 @@ typedef struct GreasePencil {
int frame_number,
int duration = 0,
eBezTriple_KeyframeType keytype = BEZT_KEYTYPE_KEYFRAME);
/**
* Same as #insert_frame but insert a new keyframe in each layer in \a layers. This will also
* create a new drawing for each of the created keyframes.
*/
void insert_frames(blender::Span<blender::bke::greasepencil::Layer *> layers,
int frame_number,
int duration = 0,
eBezTriple_KeyframeType keytype = BEZT_KEYTYPE_KEYFRAME);
/**
* Removes all the frames with \a frame_numbers in the \a layer.
* \returns true if any frame was removed.