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:
@@ -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,
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user