GPv3: simplify adding multiple layers with empty drawings

This is often required when generating grease pencil procedurally, e.g. in #124279.
This commit is contained in:
Jacques Lucke
2024-07-08 18:09:19 +02:00
parent 346110a415
commit eeb1e14531
2 changed files with 23 additions and 0 deletions

View File

@@ -2403,6 +2403,23 @@ bool GreasePencil::remove_frames(blender::bke::greasepencil::Layer &layer,
return false;
}
void GreasePencil::add_layers_with_empty_drawings_for_eval(const int num)
{
using namespace blender;
using namespace blender::bke::greasepencil;
const int old_drawings_num = this->drawing_array_num;
this->add_empty_drawings(num);
for (const int i : IndexRange(num)) {
const int drawing_i = old_drawings_num + i;
Drawing &drawing = reinterpret_cast<GreasePencilDrawing *>(this->drawing(drawing_i))->wrap();
Layer &layer = this->add_layer(std::to_string(i));
GreasePencilFrame *frame = layer.add_frame(this->runtime->eval_frame);
BLI_assert(frame);
frame->drawing_index = drawing_i;
drawing.add_user();
}
}
void GreasePencil::remove_drawings_with_no_users()
{
using namespace blender;

View File

@@ -606,6 +606,12 @@ typedef struct GreasePencil {
*/
bool remove_frames(blender::bke::greasepencil::Layer &layer, blender::Span<int> frame_numbers);
/**
* Adds multiple layers each with its own empty drawing. This can be more efficient than adding
* every layer and drawing one by one.
*/
void add_layers_with_empty_drawings_for_eval(int num);
/**
* Low-level resizing of drawings array. Only allocates new entries in the array, no drawings are
* created in case of size increase. In case of size decrease, the removed drawings are deleted.