GPv3: Python API additions to layer, layers, layer_groups

This PR contains several additions to the GPv3 Python API for
`layer_groups`, `layers` and `layer[key]`.

**Layer groups**
`grease_pencil.layer_groups`
- `.new(name, parent_group=None)`
- `.remove(layer_group, keep_children=False)`
- `.move(layer_group, 'UP'/'DOWN')`
- `.move_top(layer_group)`
- `.move_bottom(layer_group)`
- `.move_to_layer_group(layer_group, parent_group)`

**Layers**
`grease_pencil.layers`
- `.new(name, set_active=True, layer_group=None)`
- `.remove(layer)`
- `.move(layer, 'UP'/'DOWN')`
- `.move_top(layer)`
- `.move_bottom(layer)`
- `.move_to_layer_group(layer, layer_group)`

**Layer**
`grease_pencil.layer[key]`
- `.select`
- `.lock`
- `.matrix_local`
- `.matrix_parent_inverse`
- `.parent_group`

Pull Request: https://projects.blender.org/blender/blender/pulls/121797
This commit is contained in:
Sietse Brouwer
2024-05-23 13:51:13 +02:00
committed by Falk David
parent 0f32291d15
commit 180474aaee
2 changed files with 434 additions and 10 deletions

View File

@@ -509,6 +509,13 @@ class Layer : public ::GreasePencilLayer {
*/
void update_from_dna_read();
float4x4 parent_inverse() const;
/**
* The local transform of the layer (in layer space, not object space).
*/
float4x4 local_transform() const;
/**
* Returns the transformation from layer space to object space.
*/
@@ -559,13 +566,6 @@ class Layer : public ::GreasePencilLayer {
SortedKeysIterator remove_leading_end_frames_in_range(SortedKeysIterator begin,
SortedKeysIterator end);
float4x4 parent_inverse() const;
/**
* The local transform of the layer (in layer space, not object space).
*/
float4x4 local_transform() const;
/**
* Get the parent to world matrix for this layer.
*/

View File

@@ -18,6 +18,12 @@
#include "WM_api.hh"
const EnumPropertyItem rna_enum_tree_node_move_type_items[] = {
{-1, "DOWN", 0, "Down", ""},
{1, "UP", 0, "Up", ""},
{0, nullptr, 0, nullptr, nullptr},
};
#ifdef RNA_RUNTIME
# include <fmt/format.h>
@@ -25,6 +31,7 @@
# include "BKE_attribute.hh"
# include "BKE_grease_pencil.hh"
# include "BLI_math_matrix.hh"
# include "BLI_span.hh"
# include "DEG_depsgraph.hh"
@@ -218,6 +225,232 @@ static void rna_GreasePencilLayer_pass_index_set(PointerRNA *ptr, int value)
layer_passes.finish();
}
static void rna_GreasePencilLayer_matrix_local_get(PointerRNA *ptr, float *values)
{
const blender::bke::greasepencil::Layer &layer =
static_cast<const GreasePencilLayer *>(ptr->data)->wrap();
std::copy_n(layer.local_transform().base_ptr(), 16, values);
}
static void rna_GreasePencilLayer_matrix_parent_inverse_get(PointerRNA *ptr, float *values)
{
const blender::bke::greasepencil::Layer &layer =
static_cast<const GreasePencilLayer *>(ptr->data)->wrap();
std::copy_n(layer.parent_inverse().base_ptr(), 16, values);
}
static PointerRNA rna_GreasePencilLayer_parent_layer_group_get(PointerRNA *ptr)
{
blender::bke::greasepencil::Layer &layer = static_cast<GreasePencilLayer *>(ptr->data)->wrap();
blender::bke::greasepencil::LayerGroup *layer_group = &layer.parent_group();
/* Return None when layer is in the root group. */
if (!layer_group->as_node().parent_group()) {
return PointerRNA_NULL;
}
return rna_pointer_inherit_refine(
ptr, &RNA_GreasePencilLayerGroup, static_cast<void *>(layer_group));
}
static PointerRNA rna_GreasePencil_layer_group_new(GreasePencil *grease_pencil,
const char *name,
PointerRNA *parent_group_ptr)
{
using namespace blender::bke::greasepencil;
LayerGroup *parent_group;
if (parent_group_ptr && parent_group_ptr->data) {
parent_group = static_cast<LayerGroup *>(parent_group_ptr->data);
}
else {
parent_group = &grease_pencil->root_group();
}
LayerGroup *new_layer_group = &grease_pencil->add_layer_group(*parent_group, name);
WM_main_add_notifier(NC_GPENCIL | NA_EDITED, grease_pencil);
PointerRNA ptr = RNA_pointer_create(
&grease_pencil->id, &RNA_GreasePencilLayerGroup, new_layer_group);
return ptr;
}
static void rna_GreasePencil_layer_group_remove(GreasePencil *grease_pencil,
PointerRNA *layer_group_ptr,
bool keep_children)
{
using namespace blender::bke::greasepencil;
LayerGroup &layer_group = *static_cast<LayerGroup *>(layer_group_ptr->data);
grease_pencil->remove_group(layer_group, keep_children);
RNA_POINTER_INVALIDATE(layer_group_ptr);
DEG_id_tag_update(&grease_pencil->id, ID_RECALC_GEOMETRY);
WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_SELECTED, grease_pencil);
}
static void rna_GreasePencil_layer_group_move(GreasePencil *grease_pencil,
PointerRNA *layer_group_ptr,
int direction)
{
if (direction == 0) {
return;
}
blender::bke::greasepencil::TreeNode &layer_group_node =
static_cast<blender::bke::greasepencil::LayerGroup *>(layer_group_ptr->data)->as_node();
switch (direction) {
case -1:
grease_pencil->move_node_down(layer_group_node, 1);
break;
case 1:
grease_pencil->move_node_up(layer_group_node, 1);
break;
}
DEG_id_tag_update(&grease_pencil->id, ID_RECALC_GEOMETRY);
WM_main_add_notifier(NC_GPENCIL | NA_EDITED, grease_pencil);
}
static void rna_GreasePencil_layer_group_move_top(GreasePencil *grease_pencil,
PointerRNA *layer_group_ptr)
{
blender::bke::greasepencil::TreeNode &layer_group_node =
static_cast<blender::bke::greasepencil::LayerGroup *>(layer_group_ptr->data)->as_node();
grease_pencil->move_node_top(layer_group_node);
DEG_id_tag_update(&grease_pencil->id, ID_RECALC_GEOMETRY);
WM_main_add_notifier(NC_GPENCIL | NA_EDITED, grease_pencil);
}
static void rna_GreasePencil_layer_group_move_bottom(GreasePencil *grease_pencil,
PointerRNA *layer_group_ptr)
{
blender::bke::greasepencil::TreeNode &layer_group_node =
static_cast<blender::bke::greasepencil::LayerGroup *>(layer_group_ptr->data)->as_node();
grease_pencil->move_node_bottom(layer_group_node);
DEG_id_tag_update(&grease_pencil->id, ID_RECALC_GEOMETRY);
WM_main_add_notifier(NC_GPENCIL | NA_EDITED, grease_pencil);
}
static void rna_GreasePencil_layer_group_move_to_layer_group(GreasePencil *grease_pencil,
PointerRNA *layer_group_ptr,
PointerRNA *parent_group_ptr)
{
using namespace blender::bke::greasepencil;
TreeNode &layer_group_node = static_cast<LayerGroup *>(layer_group_ptr->data)->as_node();
LayerGroup *parent_group;
if (parent_group_ptr && parent_group_ptr->data) {
parent_group = static_cast<LayerGroup *>(parent_group_ptr->data);
}
else {
parent_group = &grease_pencil->root_group();
}
grease_pencil->move_node_into(layer_group_node, *parent_group);
DEG_id_tag_update(&grease_pencil->id, ID_RECALC_GEOMETRY);
WM_main_add_notifier(NC_GPENCIL | NA_EDITED, grease_pencil);
}
static GreasePencilLayer *rna_GreasePencil_layer_new(GreasePencil *grease_pencil,
const char *name,
const bool set_active,
PointerRNA *layer_group_ptr)
{
using namespace blender::bke::greasepencil;
LayerGroup *layer_group = nullptr;
if (layer_group_ptr && layer_group_ptr->data) {
layer_group = static_cast<LayerGroup *>(layer_group_ptr->data);
}
Layer *layer;
if (layer_group) {
layer = &grease_pencil->add_layer(*layer_group, name);
}
else {
layer = &grease_pencil->add_layer(name);
}
if (set_active) {
grease_pencil->set_active_layer(layer);
}
WM_main_add_notifier(NC_GPENCIL | NA_EDITED, grease_pencil);
return layer;
}
static void rna_GreasePencil_layer_remove(GreasePencil *grease_pencil, PointerRNA *layer_ptr)
{
blender::bke::greasepencil::Layer &layer = *static_cast<blender::bke::greasepencil::Layer *>(
layer_ptr->data);
grease_pencil->remove_layer(layer);
RNA_POINTER_INVALIDATE(layer_ptr);
DEG_id_tag_update(&grease_pencil->id, ID_RECALC_GEOMETRY);
WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_SELECTED, grease_pencil);
}
static void rna_GreasePencil_layer_move(GreasePencil *grease_pencil,
PointerRNA *layer_ptr,
const int direction)
{
if (direction == 0) {
return;
}
blender::bke::greasepencil::TreeNode &layer_node =
static_cast<blender::bke::greasepencil::Layer *>(layer_ptr->data)->as_node();
switch (direction) {
case -1:
grease_pencil->move_node_down(layer_node, 1);
break;
case 1:
grease_pencil->move_node_up(layer_node, 1);
break;
}
DEG_id_tag_update(&grease_pencil->id, ID_RECALC_GEOMETRY);
WM_main_add_notifier(NC_GPENCIL | NA_EDITED, grease_pencil);
}
static void rna_GreasePencil_layer_move_top(GreasePencil *grease_pencil, PointerRNA *layer_ptr)
{
blender::bke::greasepencil::TreeNode &layer_node =
static_cast<blender::bke::greasepencil::Layer *>(layer_ptr->data)->as_node();
grease_pencil->move_node_top(layer_node);
DEG_id_tag_update(&grease_pencil->id, ID_RECALC_GEOMETRY);
WM_main_add_notifier(NC_GPENCIL | NA_EDITED, grease_pencil);
}
static void rna_GreasePencil_layer_move_bottom(GreasePencil *grease_pencil, PointerRNA *layer_ptr)
{
blender::bke::greasepencil::TreeNode &layer_node =
static_cast<blender::bke::greasepencil::Layer *>(layer_ptr->data)->as_node();
grease_pencil->move_node_bottom(layer_node);
DEG_id_tag_update(&grease_pencil->id, ID_RECALC_GEOMETRY);
WM_main_add_notifier(NC_GPENCIL | NA_EDITED, grease_pencil);
}
static void rna_GreasePencil_layer_move_to_layer_group(GreasePencil *grease_pencil,
PointerRNA *layer_ptr,
PointerRNA *layer_group_ptr)
{
using namespace blender::bke::greasepencil;
TreeNode &layer_node = static_cast<Layer *>(layer_ptr->data)->as_node();
LayerGroup *layer_group;
if (layer_group_ptr && layer_group_ptr->data) {
layer_group = static_cast<LayerGroup *>(layer_group_ptr->data);
}
else {
layer_group = &grease_pencil->root_group();
}
if (layer_group == nullptr) {
return;
}
grease_pencil->move_node_into(layer_node, *layer_group);
DEG_id_tag_update(&grease_pencil->id, ID_RECALC_GEOMETRY);
WM_main_add_notifier(NC_GPENCIL | NA_EDITED, grease_pencil);
}
static PointerRNA rna_GreasePencil_active_layer_get(PointerRNA *ptr)
{
GreasePencil *grease_pencil = rna_grease_pencil(ptr);
@@ -234,7 +467,18 @@ static void rna_GreasePencil_active_layer_set(PointerRNA *ptr,
{
GreasePencil *grease_pencil = rna_grease_pencil(ptr);
grease_pencil->set_active_layer(static_cast<blender::bke::greasepencil::Layer *>(value.data));
WM_main_add_notifier(NC_GPENCIL | NA_EDITED, nullptr);
WM_main_add_notifier(NC_GPENCIL | NA_EDITED | NA_SELECTED, grease_pencil);
}
static void rna_GreasePencil_active_layer_index_range(
PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
{
GreasePencil *grease_pencil = rna_grease_pencil(ptr);
*min = 0;
*max = std::max(0, int(grease_pencil->layers().size() - 1));
*softmin = *min;
*softmax = *max;
}
static PointerRNA rna_GreasePencil_active_group_get(PointerRNA *ptr)
@@ -256,7 +500,7 @@ static void rna_GreasePencil_active_group_set(PointerRNA *ptr,
TreeNode *node = static_cast<TreeNode *>(value.data);
if (node->is_group()) {
grease_pencil->set_active_node(node);
WM_main_add_notifier(NC_GPENCIL | NA_EDITED, nullptr);
WM_main_add_notifier(NC_GPENCIL | NA_EDITED | NA_SELECTED, grease_pencil);
}
}
@@ -415,6 +659,22 @@ static void rna_def_grease_pencil_layer(BlenderRNA *brna)
prop, "Locked", "Protect layer from further editing and/or frame changes");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_update");
/* Select. */
prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(
prop, "GreasePencilLayerTreeNode", "flag", GP_LAYER_TREE_NODE_SELECT);
RNA_def_property_ui_text(prop, "Select", "Layer is selected for editing in the Dope Sheet");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_update");
/* Lock Frame. */
prop = RNA_def_property(srna, "lock_frame", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(
prop, "GreasePencilLayerTreeNode", "flag", GP_LAYER_TREE_NODE_MUTE);
RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_ui_text(prop, "Frame Locked", "Lock current frame displayed by layer");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_update");
/* Opacity */
prop = RNA_def_property(srna, "opacity", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, "GreasePencilLayer", "opacity");
@@ -511,6 +771,31 @@ static void rna_def_grease_pencil_layer(BlenderRNA *brna)
RNA_def_property_enum_items(prop, rna_enum_layer_blend_modes_items);
RNA_def_property_ui_text(prop, "Blend Mode", "Blend mode");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_update");
/* Local transformation matrix. */
prop = RNA_def_property(srna, "matrix_local", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Local Matrix", "Local transformation matrix of the layer");
RNA_def_property_float_funcs(prop, "rna_GreasePencilLayer_matrix_local_get", nullptr, nullptr);
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_grease_pencil_update");
/* Inverse transform of layer's parent. */
prop = RNA_def_property(srna, "matrix_parent_inverse", PROP_FLOAT, PROP_MATRIX);
RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(
prop, "Inverse Parent Matrix", "Inverse of layer's parent transformation matrix");
RNA_def_property_float_funcs(
prop, "rna_GreasePencilLayer_matrix_parent_inverse_get", nullptr, nullptr);
/* Parent layer group. */
prop = RNA_def_property(srna, "parent_group", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "GreasePencilLayerGroup");
RNA_def_property_pointer_funcs(
prop, "rna_GreasePencilLayer_parent_layer_group_get", nullptr, nullptr, nullptr);
RNA_def_property_ui_text(
prop, "Parent Layer Group", "The parent layer group this layer is part of");
}
static void rna_def_grease_pencil_layers_api(BlenderRNA *brna, PropertyRNA *cprop)
@@ -518,11 +803,75 @@ static void rna_def_grease_pencil_layers_api(BlenderRNA *brna, PropertyRNA *cpro
StructRNA *srna;
PropertyRNA *prop;
FunctionRNA *func;
PropertyRNA *parm;
RNA_def_property_srna(cprop, "GreasePencilv3Layers");
srna = RNA_def_struct(brna, "GreasePencilv3Layers", nullptr);
RNA_def_struct_sdna(srna, "GreasePencil");
RNA_def_struct_ui_text(srna, "Grease Pencil Layers", "Collection of Grease Pencil layers");
func = RNA_def_function(srna, "new", "rna_GreasePencil_layer_new");
RNA_def_function_ui_description(func, "Add a new Grease Pencil layer");
parm = RNA_def_string(func, "name", "GreasePencilLayer", MAX_NAME, "Name", "Name of the layer");
RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_REQUIRED);
RNA_def_boolean(
func, "set_active", true, "Set Active", "Set the newly created layer as the active layer");
parm = RNA_def_pointer(
func,
"layer_group",
"GreasePencilLayerGroup",
"",
"The layer group the new layer will be created in (use None for the main stack)");
RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_RNAPTR);
parm = RNA_def_pointer(func, "layer", "GreasePencilLayer", "", "The newly created layer");
RNA_def_function_return(func, parm);
func = RNA_def_function(srna, "remove", "rna_GreasePencil_layer_remove");
RNA_def_function_ui_description(func, "Remove a Grease Pencil layer");
parm = RNA_def_pointer(func, "layer", "GreasePencilLayer", "", "The layer to remove");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, ParameterFlag(0));
func = RNA_def_function(srna, "move", "rna_GreasePencil_layer_move");
RNA_def_function_ui_description(func,
"Move a Grease Pencil layer in the layer group or main stack");
parm = RNA_def_pointer(func, "layer", "GreasePencilLayer", "", "The layer to move");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, ParameterFlag(0));
parm = RNA_def_enum(
func, "type", rna_enum_tree_node_move_type_items, 1, "", "Direction of movement");
RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_REQUIRED);
func = RNA_def_function(srna, "move_top", "rna_GreasePencil_layer_move_top");
RNA_def_function_ui_description(
func, "Move a Grease Pencil layer to the top of the layer group or main stack");
parm = RNA_def_pointer(func, "layer", "GreasePencilLayer", "", "The layer to move");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, ParameterFlag(0));
func = RNA_def_function(srna, "move_bottom", "rna_GreasePencil_layer_move_bottom");
RNA_def_function_ui_description(
func, "Move a Grease Pencil layer to the bottom of the layer group or main stack");
parm = RNA_def_pointer(func, "layer", "GreasePencilLayer", "", "The layer to move");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, ParameterFlag(0));
func = RNA_def_function(
srna, "move_to_layer_group", "rna_GreasePencil_layer_move_to_layer_group");
RNA_def_function_ui_description(func, "Move a Grease Pencil layer into a layer group");
parm = RNA_def_pointer(func, "layer", "GreasePencilLayer", "", "The layer to move");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, ParameterFlag(0));
parm = RNA_def_pointer(
func,
"layer_group",
"GreasePencilLayerGroup",
"",
"The layer group the layer will be moved into (use None for the main stack)");
RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_REQUIRED | PARM_RNAPTR);
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, ParameterFlag(0));
prop = RNA_def_property(srna, "active_layer", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "GreasePencilLayer");
RNA_def_property_pointer_funcs(prop,
@@ -596,11 +945,86 @@ static void rna_def_grease_pencil_layer_group_api(BlenderRNA *brna, PropertyRNA
StructRNA *srna;
PropertyRNA *prop;
FunctionRNA *func;
PropertyRNA *parm;
RNA_def_property_srna(cprop, "GreasePencilv3LayerGroup");
srna = RNA_def_struct(brna, "GreasePencilv3LayerGroup", nullptr);
RNA_def_struct_sdna(srna, "GreasePencil");
RNA_def_struct_ui_text(srna, "Grease Pencil Group", "Collection of Grease Pencil layers");
func = RNA_def_function(srna, "new", "rna_GreasePencil_layer_group_new");
RNA_def_function_ui_description(func, "Add a new Grease Pencil layer group");
parm = RNA_def_string(
func, "name", "GreasePencilLayerGroup", MAX_NAME, "Name", "Name of the layer group");
RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_REQUIRED);
parm = RNA_def_pointer(
func,
"parent_group",
"GreasePencilLayerGroup",
"",
"The parent layer group the new group will be created in (use None for the main stack)");
RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_RNAPTR);
parm = RNA_def_pointer(
func, "layer_group", "GreasePencilLayerGroup", "", "The newly created layer group");
RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_RNAPTR);
RNA_def_function_return(func, parm);
func = RNA_def_function(srna, "remove", "rna_GreasePencil_layer_group_remove");
RNA_def_function_ui_description(func, "Remove a new Grease Pencil layer group");
parm = RNA_def_pointer(
func, "layer_group", "GreasePencilLayerGroup", "", "The layer group to remove");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, ParameterFlag(0));
parm = RNA_def_boolean(func,
"keep_children",
false,
"",
"Keep the children nodes of the group and only delete the group itself");
func = RNA_def_function(srna, "move", "rna_GreasePencil_layer_group_move");
RNA_def_function_ui_description(func,
"Move a layer group in the parent layer group or main stack");
parm = RNA_def_pointer(
func, "layer_group", "GreasePencilLayerGroup", "", "The layer group to move");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, ParameterFlag(0));
parm = RNA_def_enum(
func, "type", rna_enum_tree_node_move_type_items, 1, "", "Direction of movement");
RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_REQUIRED);
func = RNA_def_function(srna, "move_top", "rna_GreasePencil_layer_group_move_top");
RNA_def_function_ui_description(
func, "Move a layer group to the top of the parent layer group or main stack");
parm = RNA_def_pointer(
func, "layer_group", "GreasePencilLayerGroup", "", "The layer group to move");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, ParameterFlag(0));
func = RNA_def_function(srna, "move_bottom", "rna_GreasePencil_layer_group_move_bottom");
RNA_def_function_ui_description(
func, "Move a layer group to the bottom of the parent layer group or main stack");
parm = RNA_def_pointer(
func, "layer_group", "GreasePencilLayerGroup", "", "The layer group to move");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, ParameterFlag(0));
func = RNA_def_function(
srna, "move_to_layer_group", "rna_GreasePencil_layer_group_move_to_layer_group");
RNA_def_function_ui_description(func, "Move a layer group into a parent layer group");
parm = RNA_def_pointer(
func, "layer_group", "GreasePencilLayerGroup", "", "The layer group to move");
RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, ParameterFlag(0));
parm = RNA_def_pointer(
func,
"parent_group",
"GreasePencilLayerGroup",
"",
"The parent layer group the layer group will be moved into (use None for the main stack)");
RNA_def_parameter_flags(parm, PropertyFlag(0), PARM_REQUIRED | PARM_RNAPTR);
RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, ParameterFlag(0));
prop = RNA_def_property(srna, "active_group", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "GreasePencilLayerGroup");
RNA_def_property_pointer_funcs(prop,
@@ -609,7 +1033,7 @@ static void rna_def_grease_pencil_layer_group_api(BlenderRNA *brna, PropertyRNA
nullptr,
nullptr);
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Active Layer Group", "Active Grease Pencil layer");
RNA_def_property_ui_text(prop, "Active Layer Group", "Active Grease Pencil layer group");
RNA_def_property_update(prop, NC_GPENCIL | ND_DATA | NA_SELECTED, nullptr);
}