diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-04-17 07:17:24 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-04-17 07:21:24 +0300 |
commit | e12c08e8d170b7ca40f204a5b0423c23a9fbc2c1 (patch) | |
tree | 8cf3453d12edb177a218ef8009357518ec6cab6a /source/blender/makesrna/intern/rna_gpencil.c | |
parent | b3dabc200a4b0399ec6b81f2ff2730d07b44fcaa (diff) |
ClangFormat: apply to source, most of intern
Apply clang format as proposed in T53211.
For details on usage and instructions for migrating branches
without conflicts, see:
https://wiki.blender.org/wiki/Tools/ClangFormat
Diffstat (limited to 'source/blender/makesrna/intern/rna_gpencil.c')
-rw-r--r-- | source/blender/makesrna/intern/rna_gpencil.c | 2919 |
1 files changed, 1509 insertions, 1410 deletions
diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c index d154f8de4ad..05cc12636ef 100644 --- a/source/blender/makesrna/intern/rna_gpencil.c +++ b/source/blender/makesrna/intern/rna_gpencil.c @@ -42,1711 +42,1810 @@ #include "WM_types.h" - /* parent type */ +/* parent type */ static const EnumPropertyItem parent_type_items[] = { - {PAROBJECT, "OBJECT", 0, "Object", "The layer is parented to an object"}, - {PARSKEL, "ARMATURE", 0, "Armature", ""}, - {PARBONE, "BONE", 0, "Bone", "The layer is parented to a bone"}, - {0, NULL, 0, NULL, NULL}, + {PAROBJECT, "OBJECT", 0, "Object", "The layer is parented to an object"}, + {PARSKEL, "ARMATURE", 0, "Armature", ""}, + {PARBONE, "BONE", 0, "Bone", "The layer is parented to a bone"}, + {0, NULL, 0, NULL, NULL}, }; #ifndef RNA_RUNTIME static EnumPropertyItem rna_enum_gpencil_stroke_depth_order_items[] = { - {GP_DRAWMODE_2D, "2D", 0, "2D Layers", "Display strokes using grease pencil layers to define order"}, - {GP_DRAWMODE_3D, "3D", 0, "3D Location", "Display strokes using real 3D position in 3D space"}, - {0, NULL, 0, NULL, NULL}, + {GP_DRAWMODE_2D, + "2D", + 0, + "2D Layers", + "Display strokes using grease pencil layers to define order"}, + {GP_DRAWMODE_3D, "3D", 0, "3D Location", "Display strokes using real 3D position in 3D space"}, + {0, NULL, 0, NULL, NULL}, }; static EnumPropertyItem rna_enum_gpencil_onion_modes_items[] = { - {GP_ONION_MODE_ABSOLUTE, "ABSOLUTE", 0, "Frames", "Frames in absolute range of the scene frame"}, - {GP_ONION_MODE_RELATIVE, "RELATIVE", 0, "Keyframes", "Frames in relative range of the Grease Pencil keyframes"}, - {GP_ONION_MODE_SELECTED, "SELECTED", 0, "Selected", "Only selected keyframes"}, - {0, NULL, 0, NULL, NULL}, + {GP_ONION_MODE_ABSOLUTE, + "ABSOLUTE", + 0, + "Frames", + "Frames in absolute range of the scene frame"}, + {GP_ONION_MODE_RELATIVE, + "RELATIVE", + 0, + "Keyframes", + "Frames in relative range of the Grease Pencil keyframes"}, + {GP_ONION_MODE_SELECTED, "SELECTED", 0, "Selected", "Only selected keyframes"}, + {0, NULL, 0, NULL, NULL}, }; static const EnumPropertyItem rna_enum_gplayer_move_type_items[] = { - {-1, "UP", 0, "Up", ""}, - {1, "DOWN", 0, "Down", ""}, - {0, NULL, 0, NULL, NULL}, + {-1, "UP", 0, "Up", ""}, + {1, "DOWN", 0, "Down", ""}, + {0, NULL, 0, NULL, NULL}, }; static const EnumPropertyItem rna_enum_layer_blend_modes_items[] = { - {eGplBlendMode_Normal, "NORMAL", 0, "Regular", "" }, - {eGplBlendMode_Overlay, "OVERLAY", 0, "Overlay", "" }, - {eGplBlendMode_Add, "ADD", 0, "Add", "" }, - {eGplBlendMode_Subtract, "SUBTRACT", 0, "Subtract", "" }, - {eGplBlendMode_Multiply, "MULTIPLY", 0, "Multiply", "" }, - {eGplBlendMode_Divide, "DIVIDE", 0, "Divide", "" }, - {0, NULL, 0, NULL, NULL } -}; + {eGplBlendMode_Normal, "NORMAL", 0, "Regular", ""}, + {eGplBlendMode_Overlay, "OVERLAY", 0, "Overlay", ""}, + {eGplBlendMode_Add, "ADD", 0, "Add", ""}, + {eGplBlendMode_Subtract, "SUBTRACT", 0, "Subtract", ""}, + {eGplBlendMode_Multiply, "MULTIPLY", 0, "Multiply", ""}, + {eGplBlendMode_Divide, "DIVIDE", 0, "Divide", ""}, + {0, NULL, 0, NULL, NULL}}; static EnumPropertyItem rna_enum_gpencil_caps_modes_items[] = { - {GP_STROKE_CAP_ROUND, "ROUND", 0, "Rounded", ""}, - {GP_STROKE_CAP_FLAT, "FLAT", 0, "Flat", ""}, - {0, NULL, 0, NULL, NULL}, + {GP_STROKE_CAP_ROUND, "ROUND", 0, "Rounded", ""}, + {GP_STROKE_CAP_FLAT, "FLAT", 0, "Flat", ""}, + {0, NULL, 0, NULL, NULL}, }; #endif #ifdef RNA_RUNTIME -#include "BLI_ghash.h" -#include "BLI_string_utils.h" - -#include "WM_api.h" +# include "BLI_ghash.h" +# include "BLI_string_utils.h" -#include "BKE_action.h" -#include "BKE_animsys.h" -#include "BKE_gpencil.h" -#include "BKE_icons.h" +# include "WM_api.h" -#include "DEG_depsgraph.h" +# include "BKE_action.h" +# include "BKE_animsys.h" +# include "BKE_gpencil.h" +# include "BKE_icons.h" +# include "DEG_depsgraph.h" static void rna_GPencil_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr) { - DEG_id_tag_update(ptr->id.data, ID_RECALC_GEOMETRY); - WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL); + DEG_id_tag_update(ptr->id.data, ID_RECALC_GEOMETRY); + WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL); } static void rna_GPencil_autolock(Main *bmain, Scene *scene, PointerRNA *ptr) { - bGPdata *gpd = (bGPdata *)ptr->id.data; - bGPDlayer *gpl = NULL; - - if (gpd->flag & GP_DATA_AUTOLOCK_LAYERS) { - bGPDlayer *layer = BKE_gpencil_layer_getactive(gpd); - - /* Lock all other layers */ - for (gpl = gpd->layers.first; gpl; gpl = gpl->next) { - /* unlock active layer */ - if (gpl == layer) { - gpl->flag &= ~GP_LAYER_LOCKED; - } - else { - gpl->flag |= GP_LAYER_LOCKED; - } - } - } - else { - /* If disable is better unlock all layers by default or it looks there is - * a problem in the UI because the user expects all layers will be unlocked - */ - for (gpl = gpd->layers.first; gpl; gpl = gpl->next) { - gpl->flag &= ~GP_LAYER_LOCKED; - } - } - - /* standard update */ - rna_GPencil_update(bmain, scene, ptr); + bGPdata *gpd = (bGPdata *)ptr->id.data; + bGPDlayer *gpl = NULL; + + if (gpd->flag & GP_DATA_AUTOLOCK_LAYERS) { + bGPDlayer *layer = BKE_gpencil_layer_getactive(gpd); + + /* Lock all other layers */ + for (gpl = gpd->layers.first; gpl; gpl = gpl->next) { + /* unlock active layer */ + if (gpl == layer) { + gpl->flag &= ~GP_LAYER_LOCKED; + } + else { + gpl->flag |= GP_LAYER_LOCKED; + } + } + } + else { + /* If disable is better unlock all layers by default or it looks there is + * a problem in the UI because the user expects all layers will be unlocked + */ + for (gpl = gpd->layers.first; gpl; gpl = gpl->next) { + gpl->flag &= ~GP_LAYER_LOCKED; + } + } + + /* standard update */ + rna_GPencil_update(bmain, scene, ptr); } static void rna_GPencil_editmode_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr) { - bGPdata *gpd = (bGPdata *)ptr->id.data; - DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); + bGPdata *gpd = (bGPdata *)ptr->id.data; + DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); - /* Notify all places where GPencil data lives that the editing state is different */ - WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL); - WM_main_add_notifier(NC_SCENE | ND_MODE | NC_MOVIECLIP, NULL); + /* Notify all places where GPencil data lives that the editing state is different */ + WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL); + WM_main_add_notifier(NC_SCENE | ND_MODE | NC_MOVIECLIP, NULL); } -static void UNUSED_FUNCTION(rna_GPencil_onion_skinning_update)(Main *bmain, Scene *scene, PointerRNA *ptr) +static void UNUSED_FUNCTION(rna_GPencil_onion_skinning_update)(Main *bmain, + Scene *scene, + PointerRNA *ptr) { - bGPdata *gpd = (bGPdata *)ptr->id.data; - bGPDlayer *gpl; - bool enabled = false; - - /* Ensure that the datablock's onionskinning toggle flag - * stays in sync with the status of the actual layers - */ - for (gpl = gpd->layers.first; gpl; gpl = gpl->next) { - if (gpl->onion_flag & GP_LAYER_ONIONSKIN) { - enabled = true; - } - } - - if (enabled) - gpd->flag |= GP_DATA_SHOW_ONIONSKINS; - else - gpd->flag &= ~GP_DATA_SHOW_ONIONSKINS; - - - /* Now do standard updates... */ - rna_GPencil_update(bmain, scene, ptr); + bGPdata *gpd = (bGPdata *)ptr->id.data; + bGPDlayer *gpl; + bool enabled = false; + + /* Ensure that the datablock's onionskinning toggle flag + * stays in sync with the status of the actual layers + */ + for (gpl = gpd->layers.first; gpl; gpl = gpl->next) { + if (gpl->onion_flag & GP_LAYER_ONIONSKIN) { + enabled = true; + } + } + + if (enabled) + gpd->flag |= GP_DATA_SHOW_ONIONSKINS; + else + gpd->flag &= ~GP_DATA_SHOW_ONIONSKINS; + + /* Now do standard updates... */ + rna_GPencil_update(bmain, scene, ptr); } - /* Poll Callback to filter GP Datablocks to only show those for Annotations */ bool rna_GPencil_datablocks_annotations_poll(PointerRNA *UNUSED(ptr), const PointerRNA value) { - bGPdata *gpd = value.data; - return (gpd->flag & GP_DATA_ANNOTATIONS) != 0; + bGPdata *gpd = value.data; + return (gpd->flag & GP_DATA_ANNOTATIONS) != 0; } /* Poll Callback to filter GP Datablocks to only show those for GP Objects */ bool rna_GPencil_datablocks_obdata_poll(PointerRNA *UNUSED(ptr), const PointerRNA value) { - bGPdata *gpd = value.data; - return (gpd->flag & GP_DATA_ANNOTATIONS) == 0; + bGPdata *gpd = value.data; + return (gpd->flag & GP_DATA_ANNOTATIONS) == 0; } - static char *rna_GPencilLayer_path(PointerRNA *ptr) { - bGPDlayer *gpl = (bGPDlayer *)ptr->data; - char name_esc[sizeof(gpl->info) * 2]; + bGPDlayer *gpl = (bGPDlayer *)ptr->data; + char name_esc[sizeof(gpl->info) * 2]; - BLI_strescape(name_esc, gpl->info, sizeof(name_esc)); + BLI_strescape(name_esc, gpl->info, sizeof(name_esc)); - return BLI_sprintfN("layers[\"%s\"]", name_esc); + return BLI_sprintfN("layers[\"%s\"]", name_esc); } static int rna_GPencilLayer_active_frame_editable(PointerRNA *ptr, const char **UNUSED(r_info)) { - bGPDlayer *gpl = (bGPDlayer *)ptr->data; + bGPDlayer *gpl = (bGPDlayer *)ptr->data; - /* surely there must be other criteria too... */ - if (gpl->flag & GP_LAYER_LOCKED) - return 0; - else - return PROP_EDITABLE; + /* surely there must be other criteria too... */ + if (gpl->flag & GP_LAYER_LOCKED) + return 0; + else + return PROP_EDITABLE; } /* set parent */ static void set_parent(bGPDlayer *gpl, Object *par, const int type, const char *substr) { - if (type == PAROBJECT) { - invert_m4_m4(gpl->inverse, par->obmat); - gpl->parent = par; - gpl->partype |= PAROBJECT; - gpl->parsubstr[0] = 0; - } - else if (type == PARSKEL) { - invert_m4_m4(gpl->inverse, par->obmat); - gpl->parent = par; - gpl->partype |= PARSKEL; - gpl->parsubstr[0] = 0; - } - else if (type == PARBONE) { - bPoseChannel *pchan = BKE_pose_channel_find_name(par->pose, substr); - if (pchan) { - float tmp_mat[4][4]; - mul_m4_m4m4(tmp_mat, par->obmat, pchan->pose_mat); - - invert_m4_m4(gpl->inverse, tmp_mat); - gpl->parent = par; - gpl->partype |= PARBONE; - BLI_strncpy(gpl->parsubstr, substr, sizeof(gpl->parsubstr)); - } - } + if (type == PAROBJECT) { + invert_m4_m4(gpl->inverse, par->obmat); + gpl->parent = par; + gpl->partype |= PAROBJECT; + gpl->parsubstr[0] = 0; + } + else if (type == PARSKEL) { + invert_m4_m4(gpl->inverse, par->obmat); + gpl->parent = par; + gpl->partype |= PARSKEL; + gpl->parsubstr[0] = 0; + } + else if (type == PARBONE) { + bPoseChannel *pchan = BKE_pose_channel_find_name(par->pose, substr); + if (pchan) { + float tmp_mat[4][4]; + mul_m4_m4m4(tmp_mat, par->obmat, pchan->pose_mat); + + invert_m4_m4(gpl->inverse, tmp_mat); + gpl->parent = par; + gpl->partype |= PARBONE; + BLI_strncpy(gpl->parsubstr, substr, sizeof(gpl->parsubstr)); + } + } } /* set parent object and inverse matrix */ static void rna_GPencilLayer_parent_set(PointerRNA *ptr, PointerRNA value) { - bGPDlayer *gpl = (bGPDlayer *)ptr->data; - Object *par = (Object *)value.data; - - if (par != NULL) { - set_parent(gpl, par, gpl->partype, gpl->parsubstr); - } - else { - /* clear parent */ - gpl->parent = NULL; - } + bGPDlayer *gpl = (bGPDlayer *)ptr->data; + Object *par = (Object *)value.data; + + if (par != NULL) { + set_parent(gpl, par, gpl->partype, gpl->parsubstr); + } + else { + /* clear parent */ + gpl->parent = NULL; + } } /* set parent type */ static void rna_GPencilLayer_parent_type_set(PointerRNA *ptr, int value) { - bGPDlayer *gpl = (bGPDlayer *)ptr->data; - Object *par = gpl->parent; - gpl->partype = value; + bGPDlayer *gpl = (bGPDlayer *)ptr->data; + Object *par = gpl->parent; + gpl->partype = value; - if (par != NULL) { - set_parent(gpl, par, value, gpl->parsubstr); - } + if (par != NULL) { + set_parent(gpl, par, value, gpl->parsubstr); + } } /* set parent bone */ static void rna_GPencilLayer_parent_bone_set(PointerRNA *ptr, const char *value) { - bGPDlayer *gpl = (bGPDlayer *)ptr->data; + bGPDlayer *gpl = (bGPDlayer *)ptr->data; - Object *par = gpl->parent; - gpl->partype = PARBONE; + Object *par = gpl->parent; + gpl->partype = PARBONE; - if (par != NULL) { - set_parent(gpl, par, gpl->partype, value); - } + if (par != NULL) { + set_parent(gpl, par, gpl->partype, value); + } } - /* parent types enum */ -static const EnumPropertyItem *rna_Object_parent_type_itemf( - bContext *UNUSED(C), PointerRNA *ptr, - PropertyRNA *UNUSED(prop), bool *r_free) +static const EnumPropertyItem *rna_Object_parent_type_itemf(bContext *UNUSED(C), + PointerRNA *ptr, + PropertyRNA *UNUSED(prop), + bool *r_free) { - bGPDlayer *gpl = (bGPDlayer *)ptr->data; - EnumPropertyItem *item = NULL; - int totitem = 0; + bGPDlayer *gpl = (bGPDlayer *)ptr->data; + EnumPropertyItem *item = NULL; + int totitem = 0; - RNA_enum_items_add_value(&item, &totitem, parent_type_items, PAROBJECT); + RNA_enum_items_add_value(&item, &totitem, parent_type_items, PAROBJECT); - if (gpl->parent) { - Object *par = gpl->parent; + if (gpl->parent) { + Object *par = gpl->parent; - if (par->type == OB_ARMATURE) { - /* special hack: prevents this being overridden */ - RNA_enum_items_add_value(&item, &totitem, &parent_type_items[1], PARSKEL); - RNA_enum_items_add_value(&item, &totitem, parent_type_items, PARBONE); - } - } + if (par->type == OB_ARMATURE) { + /* special hack: prevents this being overridden */ + RNA_enum_items_add_value(&item, &totitem, &parent_type_items[1], PARSKEL); + RNA_enum_items_add_value(&item, &totitem, parent_type_items, PARBONE); + } + } - RNA_enum_item_end(&item, &totitem); - *r_free = true; + RNA_enum_item_end(&item, &totitem); + *r_free = true; - return item; + return item; } static bool rna_GPencilLayer_is_parented_get(PointerRNA *ptr) { - bGPDlayer *gpl = (bGPDlayer *)ptr->data; - return (gpl->parent != NULL); + bGPDlayer *gpl = (bGPDlayer *)ptr->data; + return (gpl->parent != NULL); } static PointerRNA rna_GPencil_active_layer_get(PointerRNA *ptr) { - bGPdata *gpd = ptr->id.data; + bGPdata *gpd = ptr->id.data; - if (GS(gpd->id.name) == ID_GD) { /* why would this ever be not GD */ - bGPDlayer *gl; + if (GS(gpd->id.name) == ID_GD) { /* why would this ever be not GD */ + bGPDlayer *gl; - for (gl = gpd->layers.first; gl; gl = gl->next) { - if (gl->flag & GP_LAYER_ACTIVE) { - break; - } - } + for (gl = gpd->layers.first; gl; gl = gl->next) { + if (gl->flag & GP_LAYER_ACTIVE) { + break; + } + } - if (gl) { - return rna_pointer_inherit_refine(ptr, &RNA_GPencilLayer, gl); - } - } + if (gl) { + return rna_pointer_inherit_refine(ptr, &RNA_GPencilLayer, gl); + } + } - return rna_pointer_inherit_refine(ptr, NULL, NULL); + return rna_pointer_inherit_refine(ptr, NULL, NULL); } static void rna_GPencil_active_layer_set(PointerRNA *ptr, PointerRNA value) { - bGPdata *gpd = ptr->id.data; - - /* Don't allow setting active layer to NULL if layers exist - * as this breaks various tools. Tools should be used instead - * if it's necessary to remove layers - */ - if (value.data == NULL) { - printf("%s: Setting active layer to None is not allowed\n", __func__); - return; - } - - if (GS(gpd->id.name) == ID_GD) { /* why would this ever be not GD */ - bGPDlayer *gl; - - for (gl = gpd->layers.first; gl; gl = gl->next) { - if (gl == value.data) { - gl->flag |= GP_LAYER_ACTIVE; - } - else { - gl->flag &= ~GP_LAYER_ACTIVE; - } - } - - WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL); - } + bGPdata *gpd = ptr->id.data; + + /* Don't allow setting active layer to NULL if layers exist + * as this breaks various tools. Tools should be used instead + * if it's necessary to remove layers + */ + if (value.data == NULL) { + printf("%s: Setting active layer to None is not allowed\n", __func__); + return; + } + + if (GS(gpd->id.name) == ID_GD) { /* why would this ever be not GD */ + bGPDlayer *gl; + + for (gl = gpd->layers.first; gl; gl = gl->next) { + if (gl == value.data) { + gl->flag |= GP_LAYER_ACTIVE; + } + else { + gl->flag &= ~GP_LAYER_ACTIVE; + } + } + + WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL); + } } static int rna_GPencil_active_layer_index_get(PointerRNA *ptr) { - bGPdata *gpd = (bGPdata *)ptr->id.data; - bGPDlayer *gpl = BKE_gpencil_layer_getactive(gpd); + bGPdata *gpd = (bGPdata *)ptr->id.data; + bGPDlayer *gpl = BKE_gpencil_layer_getactive(gpd); - return BLI_findindex(&gpd->layers, gpl); + return BLI_findindex(&gpd->layers, gpl); } static void rna_GPencil_active_layer_index_set(PointerRNA *ptr, int value) { - bGPdata *gpd = (bGPdata *)ptr->id.data; - bGPDlayer *gpl = BLI_findlink(&gpd->layers, value); + bGPdata *gpd = (bGPdata *)ptr->id.data; + bGPDlayer *gpl = BLI_findlink(&gpd->layers, value); - BKE_gpencil_layer_setactive(gpd, gpl); + BKE_gpencil_layer_setactive(gpd, gpl); - /* Now do standard updates... */ - DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); - WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED | ND_SPACE_PROPERTIES, NULL); + /* Now do standard updates... */ + DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY); + WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED | ND_SPACE_PROPERTIES, NULL); } -static void rna_GPencil_active_layer_index_range(PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax) +static void rna_GPencil_active_layer_index_range( + PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax) { - bGPdata *gpd = (bGPdata *)ptr->id.data; + bGPdata *gpd = (bGPdata *)ptr->id.data; - *min = 0; - *max = max_ii(0, BLI_listbase_count(&gpd->layers) - 1); + *min = 0; + *max = max_ii(0, BLI_listbase_count(&gpd->layers) - 1); - *softmin = *min; - *softmax = *max; + *softmin = *min; + *softmax = *max; } -static const EnumPropertyItem *rna_GPencil_active_layer_itemf( - bContext *C, PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free) +static const EnumPropertyItem *rna_GPencil_active_layer_itemf(bContext *C, + PointerRNA *ptr, + PropertyRNA *UNUSED(prop), + bool *r_free) { - bGPdata *gpd = (bGPdata *)ptr->id.data; - bGPDlayer *gpl; - EnumPropertyItem *item = NULL, item_tmp = { 0 }; - int totitem = 0; - int i = 0; + bGPdata *gpd = (bGPdata *)ptr->id.data; + bGPDlayer *gpl; + EnumPropertyItem *item = NULL, item_tmp = {0}; + int totitem = 0; + int i = 0; - if (ELEM(NULL, C, gpd)) { - return DummyRNA_NULL_items; - } + if (ELEM(NULL, C, gpd)) { + return DummyRNA_NULL_items; + } - /* Existing layers */ - for (gpl = gpd->layers.first, i = 0; gpl; gpl = gpl->next, i++) { - item_tmp.identifier = gpl->info; - item_tmp.name = gpl->info; - item_tmp.value = i; + /* Existing layers */ + for (gpl = gpd->layers.first, i = 0; gpl; gpl = gpl->next, i++) { + item_tmp.identifier = gpl->info; + item_tmp.name = gpl->info; + item_tmp.value = i; - item_tmp.icon = BKE_icon_gplayer_color_ensure(gpl); + item_tmp.icon = BKE_icon_gplayer_color_ensure(gpl); - RNA_enum_item_add(&item, &totitem, &item_tmp); - } + RNA_enum_item_add(&item, &totitem, &item_tmp); + } - RNA_enum_item_end(&item, &totitem); - *r_free = true; + RNA_enum_item_end(&item, &totitem); + *r_free = true; - return item; + return item; } static void rna_GPencilLayer_info_set(PointerRNA *ptr, const char *value) { - bGPdata *gpd = ptr->id.data; - bGPDlayer *gpl = ptr->data; + bGPdata *gpd = ptr->id.data; + bGPDlayer *gpl = ptr->data; - char oldname[128] = ""; - BLI_strncpy(oldname, gpl->info, sizeof(oldname)); + char oldname[128] = ""; + BLI_strncpy(oldname, gpl->info, sizeof(oldname)); - /* copy the new name into the name slot */ - BLI_strncpy_utf8(gpl->info, value, sizeof(gpl->info)); + /* copy the new name into the name slot */ + BLI_strncpy_utf8(gpl->info, value, sizeof(gpl->info)); - BLI_uniquename(&gpd->layers, gpl, DATA_("GP_Layer"), '.', offsetof(bGPDlayer, info), sizeof(gpl->info)); + BLI_uniquename( + &gpd->layers, gpl, DATA_("GP_Layer"), '.', offsetof(bGPDlayer, info), sizeof(gpl->info)); - /* now fix animation paths */ - BKE_animdata_fix_paths_rename_all(&gpd->id, "layers", oldname, gpl->info); + /* now fix animation paths */ + BKE_animdata_fix_paths_rename_all(&gpd->id, "layers", oldname, gpl->info); } -static bGPDstroke *rna_GPencil_stroke_point_find_stroke(const bGPdata *gpd, const bGPDspoint *pt, bGPDlayer **r_gpl, bGPDframe **r_gpf) +static bGPDstroke *rna_GPencil_stroke_point_find_stroke(const bGPdata *gpd, + const bGPDspoint *pt, + bGPDlayer **r_gpl, + bGPDframe **r_gpf) { - bGPDlayer *gpl; - bGPDstroke *gps; - - /* sanity checks */ - if (ELEM(NULL, gpd, pt)) { - return NULL; - } - - if (r_gpl) *r_gpl = NULL; - if (r_gpf) *r_gpf = NULL; - - /* there's no faster alternative than just looping over everything... */ - for (gpl = gpd->layers.first; gpl; gpl = gpl->next) { - if (gpl->actframe) { - for (gps = gpl->actframe->strokes.first; gps; gps = gps->next) { - if ((pt >= gps->points) && (pt < &gps->points[gps->totpoints])) { - /* found it */ - if (r_gpl) *r_gpl = gpl; - if (r_gpf) *r_gpf = gpl->actframe; - - return gps; - } - } - } - } - - /* didn't find it */ - return NULL; + bGPDlayer *gpl; + bGPDstroke *gps; + + /* sanity checks */ + if (ELEM(NULL, gpd, pt)) { + return NULL; + } + + if (r_gpl) + *r_gpl = NULL; + if (r_gpf) + *r_gpf = NULL; + + /* there's no faster alternative than just looping over everything... */ + for (gpl = gpd->layers.first; gpl; gpl = gpl->next) { + if (gpl->actframe) { + for (gps = gpl->actframe->strokes.first; gps; gps = gps->next) { + if ((pt >= gps->points) && (pt < &gps->points[gps->totpoints])) { + /* found it */ + if (r_gpl) + *r_gpl = gpl; + if (r_gpf) + *r_gpf = gpl->actframe; + + return gps; + } + } + } + } + + /* didn't find it */ + return NULL; } static void rna_GPencil_stroke_point_select_set(PointerRNA *ptr, const bool value) { - bGPdata *gpd = ptr->id.data; - bGPDspoint *pt = ptr->data; - bGPDstroke *gps = NULL; - - /* Ensure that corresponding stroke is set - * - Since we don't have direct access, we're going to have to search - * - We don't apply selection value unless we can find the corresponding - * stroke, so that they don't get out of sync - */ - gps = rna_GPencil_stroke_point_find_stroke(gpd, pt, NULL, NULL); - if (gps) { - /* Set the new selection state for the point */ - if (value) - pt->flag |= GP_SPOINT_SELECT; - else - pt->flag &= ~GP_SPOINT_SELECT; - - /* Check if the stroke should be selected or not... */ - BKE_gpencil_stroke_sync_selection(gps); - } + bGPdata *gpd = ptr->id.data; + bGPDspoint *pt = ptr->data; + bGPDstroke *gps = NULL; + + /* Ensure that corresponding stroke is set + * - Since we don't have direct access, we're going to have to search + * - We don't apply selection value unless we can find the corresponding + * stroke, so that they don't get out of sync + */ + gps = rna_GPencil_stroke_point_find_stroke(gpd, pt, NULL, NULL); + if (gps) { + /* Set the new selection state for the point */ + if (value) + pt->flag |= GP_SPOINT_SELECT; + else + pt->flag &= ~GP_SPOINT_SELECT; + + /* Check if the stroke should be selected or not... */ + BKE_gpencil_stroke_sync_selection(gps); + } } -static void rna_GPencil_stroke_point_add(ID *id, bGPDstroke *stroke, int count, float pressure, float strength) +static void rna_GPencil_stroke_point_add( + ID *id, bGPDstroke *stroke, int count, float pressure, float strength) { - bGPdata *gpd = (bGPdata *)id; - - if (count > 0) { - /* create space at the end of the array for extra points */ - stroke->points = MEM_recallocN_id( - stroke->points, - sizeof(bGPDspoint) * (stroke->totpoints + count), - "gp_stroke_points"); - stroke->dvert = MEM_recallocN_id( - stroke->dvert, - sizeof(MDeformVert) * (stroke->totpoints + count), - "gp_stroke_weight"); - - /* init the pressure and strength values so that old scripts won't need to - * be modified to give these initial values... - */ - for (int i = 0; i < count; i++) { - bGPDspoint *pt = stroke->points + (stroke->totpoints + i); - MDeformVert *dvert = stroke->dvert + (stroke->totpoints + i); - pt->pressure = pressure; - pt->strength = strength; - - dvert->totweight = 0; - dvert->dw = NULL; - } - - stroke->totpoints += count; - - stroke->flag |= GP_STROKE_RECALC_GEOMETRY; - - gpd->flag |= GP_DATA_PYTHON_UPDATED; - DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); - - WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL); - } + bGPdata *gpd = (bGPdata *)id; + + if (count > 0) { + /* create space at the end of the array for extra points */ + stroke->points = MEM_recallocN_id( + stroke->points, sizeof(bGPDspoint) * (stroke->totpoints + count), "gp_stroke_points"); + stroke->dvert = MEM_recallocN_id( + stroke->dvert, sizeof(MDeformVert) * (stroke->totpoints + count), "gp_stroke_weight"); + + /* init the pressure and strength values so that old scripts won't need to + * be modified to give these initial values... + */ + for (int i = 0; i < count; i++) { + bGPDspoint *pt = stroke->points + (stroke->totpoints + i); + MDeformVert *dvert = stroke->dvert + (stroke->totpoints + i); + pt->pressure = pressure; + pt->strength = strength; + + dvert->totweight = 0; + dvert->dw = NULL; + } + + stroke->totpoints += count; + + stroke->flag |= GP_STROKE_RECALC_GEOMETRY; + + gpd->flag |= GP_DATA_PYTHON_UPDATED; + DEG_id_tag_update(&gpd->id, + ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); + + WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL); + } } -static void rna_GPencil_stroke_point_pop(ID *id, bGPDstroke *stroke, ReportList *reports, int index) +static void rna_GPencil_stroke_point_pop(ID *id, + bGPDstroke *stroke, + ReportList *reports, + int index) { - bGPdata *gpd = (bGPdata *)id; - bGPDspoint *pt_tmp = stroke->points; - MDeformVert *pt_dvert = stroke->dvert; - - /* python style negative indexing */ - if (index < 0) { - index += stroke->totpoints; - } - - if (stroke->totpoints <= index || index < 0) { - BKE_report(reports, RPT_ERROR, "GPencilStrokePoints.pop: index out of range"); - return; - } - - stroke->totpoints--; - - stroke->points = MEM_callocN(sizeof(bGPDspoint) * stroke->totpoints, "gp_stroke_points"); - if (pt_dvert != NULL) { - stroke->dvert = MEM_callocN(sizeof(MDeformVert) * stroke->totpoints, "gp_stroke_weights"); - } - - if (index > 0) { - memcpy(stroke->points, pt_tmp, sizeof(bGPDspoint) * index); - /* verify weight data is available */ - if (pt_dvert != NULL) { - memcpy(stroke->dvert, pt_dvert, sizeof(MDeformVert) * index); - } - } - - if (index < stroke->totpoints) { - memcpy(&stroke->points[index], &pt_tmp[index + 1], sizeof(bGPDspoint) * (stroke->totpoints - index)); - if (pt_dvert != NULL) { - memcpy(&stroke->dvert[index], &pt_dvert[index + 1], sizeof(MDeformVert) * (stroke->totpoints - index)); - } - } - - /* free temp buffer */ - MEM_freeN(pt_tmp); - if (pt_dvert != NULL) { - MEM_freeN(pt_dvert); - } - - stroke->flag |= GP_STROKE_RECALC_GEOMETRY; - - gpd->flag |= GP_DATA_PYTHON_UPDATED; - DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); - - WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL); + bGPdata *gpd = (bGPdata *)id; + bGPDspoint *pt_tmp = stroke->points; + MDeformVert *pt_dvert = stroke->dvert; + + /* python style negative indexing */ + if (index < 0) { + index += stroke->totpoints; + } + + if (stroke->totpoints <= index || index < 0) { + BKE_report(reports, RPT_ERROR, "GPencilStrokePoints.pop: index out of range"); + return; + } + + stroke->totpoints--; + + stroke->points = MEM_callocN(sizeof(bGPDspoint) * stroke->totpoints, "gp_stroke_points"); + if (pt_dvert != NULL) { + stroke->dvert = MEM_callocN(sizeof(MDeformVert) * stroke->totpoints, "gp_stroke_weights"); + } + + if (index > 0) { + memcpy(stroke->points, pt_tmp, sizeof(bGPDspoint) * index); + /* verify weight data is available */ + if (pt_dvert != NULL) { + memcpy(stroke->dvert, pt_dvert, sizeof(MDeformVert) * index); + } + } + + if (index < stroke->totpoints) { + memcpy(&stroke->points[index], + &pt_tmp[index + 1], + sizeof(bGPDspoint) * (stroke->totpoints - index)); + if (pt_dvert != NULL) { + memcpy(&stroke->dvert[index], + &pt_dvert[index + 1], + sizeof(MDeformVert) * (stroke->totpoints - index)); + } + } + + /* free temp buffer */ + MEM_freeN(pt_tmp); + if (pt_dvert != NULL) { + MEM_freeN(pt_dvert); + } + + stroke->flag |= GP_STROKE_RECALC_GEOMETRY; + + gpd->flag |= GP_DATA_PYTHON_UPDATED; + DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_COPY_ON_WRITE); + + WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL); } static bGPDstroke *rna_GPencil_stroke_new(bGPDframe *frame) { - bGPDstroke *stroke = MEM_callocN(sizeof(bGPDstroke), "gp_stroke"); - BLI_addtail(&frame->strokes, stroke); + bGPDstroke *stroke = MEM_callocN(sizeof(bGPDstroke), "gp_stroke"); + BLI_addtail(&frame->strokes, stroke); - return stroke; + return stroke; } -static void rna_GPencil_stroke_remove(bGPDframe *frame, ReportList *reports, PointerRNA *stroke_ptr) +static void rna_GPencil_stroke_remove(bGPDframe *frame, + ReportList *reports, + PointerRNA *stroke_ptr) { - bGPDstroke *stroke = stroke_ptr->data; - if (BLI_findindex(&frame->strokes, stroke) == -1) { - BKE_report(reports, RPT_ERROR, "Stroke not found in grease pencil frame"); - return; - } + bGPDstroke *stroke = stroke_ptr->data; + if (BLI_findindex(&frame->strokes, stroke) == -1) { + BKE_report(reports, RPT_ERROR, "Stroke not found in grease pencil frame"); + return; + } - BLI_freelinkN(&frame->strokes, stroke); - RNA_POINTER_INVALIDATE(stroke_ptr); + BLI_freelinkN(&frame->strokes, stroke); + RNA_POINTER_INVALIDATE(stroke_ptr); - WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL); + WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL); } static void rna_GPencil_stroke_select_set(PointerRNA *ptr, const bool value) { - bGPDstroke *gps = ptr->data; - bGPDspoint *pt; - int i; - - /* set new value */ - if (value) - gps->flag |= GP_STROKE_SELECT; - else - gps->flag &= ~GP_STROKE_SELECT; - - /* ensure that the stroke's points are selected in the same way */ - for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { - if (value) - pt->flag |= GP_SPOINT_SELECT; - else - pt->flag &= ~GP_SPOINT_SELECT; - } + bGPDstroke *gps = ptr->data; + bGPDspoint *pt; + int i; + + /* set new value */ + if (value) + gps->flag |= GP_STROKE_SELECT; + else + gps->flag &= ~GP_STROKE_SELECT; + + /* ensure that the stroke's points are selected in the same way */ + for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { + if (value) + pt->flag |= GP_SPOINT_SELECT; + else + pt->flag &= ~GP_SPOINT_SELECT; + } } static bGPDframe *rna_GPencil_frame_new(bGPDlayer *layer, ReportList *reports, int frame_number) { - bGPDframe *frame; + bGPDframe *frame; - if (BKE_gpencil_layer_find_frame(layer, frame_number)) { - BKE_reportf(reports, RPT_ERROR, "Frame already exists on this frame number %d", frame_number); - return NULL; - } + if (BKE_gpencil_layer_find_frame(layer, frame_number)) { + BKE_reportf(reports, RPT_ERROR, "Frame already exists on this frame number %d", frame_number); + return NULL; + } - frame = BKE_gpencil_frame_addnew(layer, frame_number); + frame = BKE_gpencil_frame_addnew(layer, frame_number); - WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL); + WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL); - return frame; + return frame; } static void rna_GPencil_frame_remove(bGPDlayer *layer, ReportList *reports, PointerRNA *frame_ptr) { - bGPDframe *frame = frame_ptr->data; - if (BLI_findindex(&layer->frames, frame) == -1) { - BKE_report(reports, RPT_ERROR, "Frame not found in grease pencil layer"); - return; - } + bGPDframe *frame = frame_ptr->data; + if (BLI_findindex(&layer->frames, frame) == -1) { + BKE_report(reports, RPT_ERROR, "Frame not found in grease pencil layer"); + return; + } - BKE_gpencil_layer_delframe(layer, frame); - RNA_POINTER_INVALIDATE(frame_ptr); + BKE_gpencil_layer_delframe(layer, frame); + RNA_POINTER_INVALIDATE(frame_ptr); - WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL); + WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL); } static bGPDframe *rna_GPencil_frame_copy(bGPDlayer *layer, bGPDframe *src) { - bGPDframe *frame = BKE_gpencil_frame_duplicate(src); + bGPDframe *frame = BKE_gpencil_frame_duplicate(src); - while (BKE_gpencil_layer_find_frame(layer, frame->framenum)) { - frame->framenum++; - } + while (BKE_gpencil_layer_find_frame(layer, frame->framenum)) { + frame->framenum++; + } - BLI_addtail(&layer->frames, frame); + BLI_addtail(&layer->frames, frame); - WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL); + WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL); - return frame; + return frame; } static bGPDlayer *rna_GPencil_layer_new(bGPdata *gpd, const char *name, bool setactive) { - bGPDlayer *gpl = BKE_gpencil_layer_addnew(gpd, name, setactive != 0); + bGPDlayer *gpl = BKE_gpencil_layer_addnew(gpd, name, setactive != 0); - WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL); + WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL); - return gpl; + return gpl; } static void rna_GPencil_layer_remove(bGPdata *gpd, ReportList *reports, PointerRNA *layer_ptr) { - bGPDlayer *layer = layer_ptr->data; - if (BLI_findindex(&gpd->layers, layer) == -1) { - BKE_report(reports, RPT_ERROR, "Layer not found in grease pencil data"); - return; - } + bGPDlayer *layer = layer_ptr->data; + if (BLI_findindex(&gpd->layers, layer) == -1) { + BKE_report(reports, RPT_ERROR, "Layer not found in grease pencil data"); + return; + } - BKE_gpencil_layer_delete(gpd, layer); - RNA_POINTER_INVALIDATE(layer_ptr); + BKE_gpencil_layer_delete(gpd, layer); + RNA_POINTER_INVALIDATE(layer_ptr); - WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL); + WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL); } -static void rna_GPencil_layer_move(bGPdata *gpd, ReportList *reports, PointerRNA *layer_ptr, int type) +static void rna_GPencil_layer_move(bGPdata *gpd, + ReportList *reports, + PointerRNA *layer_ptr, + int type) { - bGPDlayer *gpl = layer_ptr->data; - if (BLI_findindex(&gpd->layers, gpl) == -1) { - BKE_report(reports, RPT_ERROR, "Layer not found in grease pencil data"); - return; - } + bGPDlayer *gpl = layer_ptr->data; + if (BLI_findindex(&gpd->layers, gpl) == -1) { + BKE_report(reports, RPT_ERROR, "Layer not found in grease pencil data"); + return; + } - BLI_assert(ELEM(type, -1, 0, 1)); /* we use value below */ + BLI_assert(ELEM(type, -1, 0, 1)); /* we use value below */ - const int direction = type * -1; + const int direction = type * -1; - if (BLI_listbase_link_move(&gpd->layers, gpl, direction)) { - DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); - } + if (BLI_listbase_link_move(&gpd->layers, gpl, direction)) { + DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); + } - WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL); + WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL); } static void rna_GPencil_frame_clear(bGPDframe *frame) { - BKE_gpencil_free_strokes(frame); + BKE_gpencil_free_strokes(frame); - WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL); + WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL); } static void rna_GPencil_layer_clear(bGPDlayer *layer) { - BKE_gpencil_free_frames(layer); + BKE_gpencil_free_frames(layer); - WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL); + WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL); } static void rna_GPencil_clear(bGPdata *gpd) { - BKE_gpencil_free_layers(&gpd->layers); + BKE_gpencil_free_layers(&gpd->layers); - WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL); + WM_main_add_notifier(NC_GPENCIL | ND_DATA | NA_EDITED, NULL); } static void rna_GpencilVertex_groups_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) { - bGPDstroke *gps = ptr->data; + bGPDstroke *gps = ptr->data; - if (gps->dvert) { - MDeformVert *dvert = gps->dvert; + if (gps->dvert) { + MDeformVert *dvert = gps->dvert; - rna_iterator_array_begin(iter, (void *)dvert->dw, sizeof(MDeformWeight), dvert->totweight, 0, NULL); - } - else - rna_iterator_array_begin(iter, NULL, 0, 0, 0, NULL); + rna_iterator_array_begin( + iter, (void *)dvert->dw, sizeof(MDeformWeight), dvert->totweight, 0, NULL); + } + else + rna_iterator_array_begin(iter, NULL, 0, 0, 0, NULL); } static char *rna_GreasePencilGrid_path(PointerRNA *UNUSED(ptr)) { - return BLI_strdup("grid"); + return BLI_strdup("grid"); } #else static void rna_def_gpencil_stroke_point(BlenderRNA *brna) { - StructRNA *srna; - PropertyRNA *prop; - - srna = RNA_def_struct(brna, "GPencilStrokePoint", NULL); - RNA_def_struct_sdna(srna, "bGPDspoint"); - RNA_def_struct_ui_text(srna, "Grease Pencil Stroke Point", "Data point for freehand stroke curve"); - - prop = RNA_def_property(srna, "co", PROP_FLOAT, PROP_XYZ); - RNA_def_property_float_sdna(prop, NULL, "x"); - RNA_def_property_array(prop, 3); - RNA_def_property_ui_text(prop, "Coordinates", ""); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "pressure", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, NULL, "pressure"); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Pressure", "Pressure of tablet at point when drawing it"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "strength", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, NULL, "strength"); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Strength", "Color intensity (alpha factor)"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "uv_factor", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, NULL, "uv_fac"); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "UV Factor", "Internal UV factor"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "uv_rotation", PROP_FLOAT, PROP_ANGLE); - RNA_def_property_float_sdna(prop, NULL, "uv_rot"); - RNA_def_property_range(prop, 0.0f, M_PI * 2); - RNA_def_property_ui_text(prop, "UV Rotation", "Internal UV factor for dot mode"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_SPOINT_SELECT); - RNA_def_property_boolean_funcs(prop, NULL, "rna_GPencil_stroke_point_select_set"); - RNA_def_property_ui_text(prop, "Select", "Point is selected for viewport editing"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - + StructRNA *srna; + PropertyRNA *prop; + + srna = RNA_def_struct(brna, "GPencilStrokePoint", NULL); + RNA_def_struct_sdna(srna, "bGPDspoint"); + RNA_def_struct_ui_text( + srna, "Grease Pencil Stroke Point", "Data point for freehand stroke curve"); + + prop = RNA_def_property(srna, "co", PROP_FLOAT, PROP_XYZ); + RNA_def_property_float_sdna(prop, NULL, "x"); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Coordinates", ""); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "pressure", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, NULL, "pressure"); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_text(prop, "Pressure", "Pressure of tablet at point when drawing it"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "strength", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, NULL, "strength"); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_text(prop, "Strength", "Color intensity (alpha factor)"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "uv_factor", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, NULL, "uv_fac"); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_text(prop, "UV Factor", "Internal UV factor"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "uv_rotation", PROP_FLOAT, PROP_ANGLE); + RNA_def_property_float_sdna(prop, NULL, "uv_rot"); + RNA_def_property_range(prop, 0.0f, M_PI * 2); + RNA_def_property_ui_text(prop, "UV Rotation", "Internal UV factor for dot mode"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_SPOINT_SELECT); + RNA_def_property_boolean_funcs(prop, NULL, "rna_GPencil_stroke_point_select_set"); + RNA_def_property_ui_text(prop, "Select", "Point is selected for viewport editing"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); } static void rna_def_gpencil_stroke_points_api(BlenderRNA *brna, PropertyRNA *cprop) { - StructRNA *srna; - FunctionRNA *func; - PropertyRNA *parm; - - RNA_def_property_srna(cprop, "GPencilStrokePoints"); - srna = RNA_def_struct(brna, "GPencilStrokePoints", NULL); - RNA_def_struct_sdna(srna, "bGPDstroke"); - RNA_def_struct_ui_text(srna, "Grease Pencil Stroke Points", "Collection of grease pencil stroke points"); - - func = RNA_def_function(srna, "add", "rna_GPencil_stroke_point_add"); - RNA_def_function_ui_description(func, "Add a new grease pencil stroke point"); - RNA_def_function_flag(func, FUNC_USE_SELF_ID); - parm = RNA_def_int(func, "count", 1, 0, INT_MAX, "Number", "Number of points to add to the stroke", 0, INT_MAX); - RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); - RNA_def_float(func, "pressure", 1.0f, 0.0f, 1.0f, "Pressure", "Pressure for newly created points", 0.0f, 1.0f); - RNA_def_float(func, "strength", 1.0f, 0.0f, 1.0f, "Strength", "Color intensity (alpha factor) for newly created points", 0.0f, 1.0f); - - func = RNA_def_function(srna, "pop", "rna_GPencil_stroke_point_pop"); - RNA_def_function_ui_description(func, "Remove a grease pencil stroke point"); - RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID); - RNA_def_int(func, "index", -1, INT_MIN, INT_MAX, "Index", "point index", INT_MIN, INT_MAX); + StructRNA *srna; + FunctionRNA *func; + PropertyRNA *parm; + + RNA_def_property_srna(cprop, "GPencilStrokePoints"); + srna = RNA_def_struct(brna, "GPencilStrokePoints", NULL); + RNA_def_struct_sdna(srna, "bGPDstroke"); + RNA_def_struct_ui_text( + srna, "Grease Pencil Stroke Points", "Collection of grease pencil stroke points"); + + func = RNA_def_function(srna, "add", "rna_GPencil_stroke_point_add"); + RNA_def_function_ui_description(func, "Add a new grease pencil stroke point"); + RNA_def_function_flag(func, FUNC_USE_SELF_ID); + parm = RNA_def_int( + func, "count", 1, 0, INT_MAX, "Number", "Number of points to add to the stroke", 0, INT_MAX); + RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + RNA_def_float(func, + "pressure", + 1.0f, + 0.0f, + 1.0f, + "Pressure", + "Pressure for newly created points", + 0.0f, + 1.0f); + RNA_def_float(func, + "strength", + 1.0f, + 0.0f, + 1.0f, + "Strength", + "Color intensity (alpha factor) for newly created points", + 0.0f, + 1.0f); + + func = RNA_def_function(srna, "pop", "rna_GPencil_stroke_point_pop"); + RNA_def_function_ui_description(func, "Remove a grease pencil stroke point"); + RNA_def_function_flag(func, FUNC_USE_REPORTS | FUNC_USE_SELF_ID); + RNA_def_int(func, "index", -1, INT_MIN, INT_MAX, "Index", "point index", INT_MIN, INT_MAX); } /* This information is read only and it can be used by add-ons */ static void rna_def_gpencil_triangle(BlenderRNA *brna) { - StructRNA *srna; - PropertyRNA *prop; - - srna = RNA_def_struct(brna, "GPencilTriangle", NULL); - RNA_def_struct_sdna(srna, "bGPDtriangle"); - RNA_def_struct_ui_text(srna, "Triangle", "Triangulation data for Grease Pencil fills"); - - /* point v1 */ - prop = RNA_def_property(srna, "v1", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "verts[0]"); - RNA_def_property_ui_text(prop, "v1", "First triangle vertex index"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - - /* point v2 */ - prop = RNA_def_property(srna, "v2", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "verts[1]"); - RNA_def_property_ui_text(prop, "v2", "Second triangle vertex index"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - - /* point v3 */ - prop = RNA_def_property(srna, "v3", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "verts[2]"); - RNA_def_property_ui_text(prop, "v3", "Third triangle vertex index"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - - /* texture coord for point v1 */ - prop = RNA_def_property(srna, "uv1", PROP_FLOAT, PROP_COORDS); - RNA_def_property_float_sdna(prop, NULL, "uv[0]"); - RNA_def_property_array(prop, 2); - RNA_def_property_ui_text(prop, "uv1", "First triangle vertex texture coordinates"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - - /* texture coord for point v2 */ - prop = RNA_def_property(srna, "uv2", PROP_FLOAT, PROP_COORDS); - RNA_def_property_float_sdna(prop, NULL, "uv[1]"); - RNA_def_property_array(prop, 2); - RNA_def_property_ui_text(prop, "uv2", "Second triangle vertex texture coordinates"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - - /* texture coord for point v3 */ - prop = RNA_def_property(srna, "uv3", PROP_FLOAT, PROP_COORDS); - RNA_def_property_float_sdna(prop, NULL, "uv[2]"); - RNA_def_property_array(prop, 2); - RNA_def_property_ui_text(prop, "uv3", "Third triangle vertex texture coordinates"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); + StructRNA *srna; + PropertyRNA *prop; + + srna = RNA_def_struct(brna, "GPencilTriangle", NULL); + RNA_def_struct_sdna(srna, "bGPDtriangle"); + RNA_def_struct_ui_text(srna, "Triangle", "Triangulation data for Grease Pencil fills"); + + /* point v1 */ + prop = RNA_def_property(srna, "v1", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "verts[0]"); + RNA_def_property_ui_text(prop, "v1", "First triangle vertex index"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + + /* point v2 */ + prop = RNA_def_property(srna, "v2", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "verts[1]"); + RNA_def_property_ui_text(prop, "v2", "Second triangle vertex index"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + + /* point v3 */ + prop = RNA_def_property(srna, "v3", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "verts[2]"); + RNA_def_property_ui_text(prop, "v3", "Third triangle vertex index"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + + /* texture coord for point v1 */ + prop = RNA_def_property(srna, "uv1", PROP_FLOAT, PROP_COORDS); + RNA_def_property_float_sdna(prop, NULL, "uv[0]"); + RNA_def_property_array(prop, 2); + RNA_def_property_ui_text(prop, "uv1", "First triangle vertex texture coordinates"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + + /* texture coord for point v2 */ + prop = RNA_def_property(srna, "uv2", PROP_FLOAT, PROP_COORDS); + RNA_def_property_float_sdna(prop, NULL, "uv[1]"); + RNA_def_property_array(prop, 2); + RNA_def_property_ui_text(prop, "uv2", "Second triangle vertex texture coordinates"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + + /* texture coord for point v3 */ + prop = RNA_def_property(srna, "uv3", PROP_FLOAT, PROP_COORDS); + RNA_def_property_float_sdna(prop, NULL, "uv[2]"); + RNA_def_property_array(prop, 2); + RNA_def_property_ui_text(prop, "uv3", "Third triangle vertex texture coordinates"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); } static void rna_def_gpencil_mvert_group(BlenderRNA *brna) { - StructRNA *srna; - PropertyRNA *prop; - - srna = RNA_def_struct(brna, "GpencilVertexGroupElement", NULL); - RNA_def_struct_sdna(srna, "MDeformWeight"); - RNA_def_struct_ui_text(srna, "Vertex Group Element", "Weight value of a vertex in a vertex group"); - RNA_def_struct_ui_icon(srna, ICON_GROUP_VERTEX); - - /* we can't point to actual group, it is in the object and so - * there is no unique group to point to, hence the index */ - prop = RNA_def_property(srna, "group", PROP_INT, PROP_UNSIGNED); - RNA_def_property_int_sdna(prop, NULL, "def_nr"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_ui_text(prop, "Group Index", ""); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "weight", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Weight", "Vertex Weight"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + StructRNA *srna; + PropertyRNA *prop; + + srna = RNA_def_struct(brna, "GpencilVertexGroupElement", NULL); + RNA_def_struct_sdna(srna, "MDeformWeight"); + RNA_def_struct_ui_text( + srna, "Vertex Group Element", "Weight value of a vertex in a vertex group"); + RNA_def_struct_ui_icon(srna, ICON_GROUP_VERTEX); + + /* we can't point to actual group, it is in the object and so + * there is no unique group to point to, hence the index */ + prop = RNA_def_property(srna, "group", PROP_INT, PROP_UNSIGNED); + RNA_def_property_int_sdna(prop, NULL, "def_nr"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Group Index", ""); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "weight", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_text(prop, "Weight", "Vertex Weight"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); } static void rna_def_gpencil_stroke(BlenderRNA *brna) { - StructRNA *srna; - PropertyRNA *prop; - - static const EnumPropertyItem stroke_display_mode_items[] = { - {0, "SCREEN", 0, "Screen", "Stroke is in screen-space"}, - {GP_STROKE_3DSPACE, "3DSPACE", 0, "3D Space", "Stroke is in 3D-space"}, - {GP_STROKE_2DSPACE, "2DSPACE", 0, "2D Space", "Stroke is in 2D-space"}, - {GP_STROKE_2DIMAGE, "2DIMAGE", 0, "2D Image", "Stroke is in 2D-space (but with special 'image' scaling)"}, - {0, NULL, 0, NULL, NULL}, - }; - - srna = RNA_def_struct(brna, "GPencilStroke", NULL); - RNA_def_struct_sdna(srna, "bGPDstroke"); - RNA_def_struct_ui_text(srna, "Grease Pencil Stroke", "Freehand curve defining part of a sketch"); - - /* Points */ - prop = RNA_def_property(srna, "points", PROP_COLLECTION, PROP_NONE); - RNA_def_property_collection_sdna(prop, NULL, "points", "totpoints"); - RNA_def_property_struct_type(prop, "GPencilStrokePoint"); - RNA_def_property_ui_text(prop, "Stroke Points", "Stroke data points"); - rna_def_gpencil_stroke_points_api(brna, prop); - - /* vertex groups */ - prop = RNA_def_property(srna, "groups", PROP_COLLECTION, PROP_NONE); - RNA_def_property_collection_funcs( - prop, "rna_GpencilVertex_groups_begin", "rna_iterator_array_next", - "rna_iterator_array_end", "rna_iterator_array_get", NULL, NULL, NULL, NULL); - RNA_def_property_struct_type(prop, "GpencilVertexGroupElement"); - RNA_def_property_ui_text(prop, "Groups", "Weights for the vertex groups this vertex is member of"); - - /* Triangles */ - prop = RNA_def_property(srna, "triangles", PROP_COLLECTION, PROP_NONE); - RNA_def_property_collection_sdna(prop, NULL, "triangles", "tot_triangles"); - RNA_def_property_struct_type(prop, "GPencilTriangle"); - RNA_def_property_ui_text(prop, "Triangles", "Triangulation data for HQ fill"); - - /* Material Index */ - prop = RNA_def_property(srna, "material_index", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "mat_nr"); - RNA_def_property_ui_text(prop, "Material Index", "Index of material used in this stroke"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* Settings */ - prop = RNA_def_property(srna, "display_mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag"); - RNA_def_property_enum_items(prop, stroke_display_mode_items); - RNA_def_property_ui_text(prop, "Draw Mode", "Coordinate space that stroke is in"); - RNA_def_property_update(prop, 0, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STROKE_SELECT); - RNA_def_property_boolean_funcs(prop, NULL, "rna_GPencil_stroke_select_set"); - RNA_def_property_ui_text(prop, "Select", "Stroke is selected for viewport editing"); - RNA_def_property_update(prop, 0, "rna_GPencil_update"); - - /* Cyclic: Draw a line from end to start point */ - prop = RNA_def_property(srna, "draw_cyclic", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STROKE_CYCLIC); - RNA_def_property_ui_text(prop, "Cyclic", "Enable cyclic drawing, closing the stroke"); - RNA_def_property_update(prop, 0, "rna_GPencil_update"); - - /* Caps mode */ - prop = RNA_def_property(srna, "start_cap_mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "caps[0]"); - RNA_def_property_enum_items(prop, rna_enum_gpencil_caps_modes_items); - RNA_def_property_ui_text(prop, "Start Cap", "Stroke start extreme cap style"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "end_cap_mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "caps[1]"); - RNA_def_property_enum_items(prop, rna_enum_gpencil_caps_modes_items); - RNA_def_property_ui_text(prop, "End Cap", "Stroke end extreme cap style"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* No fill: The stroke never must fill area and must use fill color as stroke color (this is a special flag for fill brush) */ - prop = RNA_def_property(srna, "is_nofill_stroke", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STROKE_NOFILL); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_ui_text(prop, "No Fill", "Special stroke to use as boundary for filling areas"); - RNA_def_property_update(prop, 0, "rna_GPencil_update"); - - /* Line Thickness */ - prop = RNA_def_property(srna, "line_width", PROP_INT, PROP_PIXEL); - RNA_def_property_int_sdna(prop, NULL, "thickness"); - RNA_def_property_range(prop, 1, 1000); - RNA_def_property_ui_range(prop, 1, 10, 1, 0); - RNA_def_property_ui_text(prop, "Thickness", "Thickness of stroke (in pixels)"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* gradient control along y */ - prop = RNA_def_property(srna, "gradient_factor", PROP_FLOAT, PROP_FACTOR); - RNA_def_property_float_sdna(prop, NULL, "gradient_f"); - RNA_def_property_range(prop, 0.001f, 1.0f); - RNA_def_property_float_default(prop, 1.0f); - RNA_def_property_ui_text(prop, "Border Opacity Factor", - "Amount of gradient along section of stroke"); - RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* gradient shape ratio */ - prop = RNA_def_property(srna, "gradient_shape", PROP_FLOAT, PROP_XYZ); - RNA_def_property_float_sdna(prop, NULL, "gradient_s"); - RNA_def_property_array(prop, 2); - RNA_def_property_range(prop, 0.01f, 1.0f); - RNA_def_property_float_default(prop, 1.0f); - RNA_def_property_ui_text(prop, "Aspect Ratio", ""); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + StructRNA *srna; + PropertyRNA *prop; + + static const EnumPropertyItem stroke_display_mode_items[] = { + {0, "SCREEN", 0, "Screen", "Stroke is in screen-space"}, + {GP_STROKE_3DSPACE, "3DSPACE", 0, "3D Space", "Stroke is in 3D-space"}, + {GP_STROKE_2DSPACE, "2DSPACE", 0, "2D Space", "Stroke is in 2D-space"}, + {GP_STROKE_2DIMAGE, + "2DIMAGE", + 0, + "2D Image", + "Stroke is in 2D-space (but with special 'image' scaling)"}, + {0, NULL, 0, NULL, NULL}, + }; + + srna = RNA_def_struct(brna, "GPencilStroke", NULL); + RNA_def_struct_sdna(srna, "bGPDstroke"); + RNA_def_struct_ui_text(srna, "Grease Pencil Stroke", "Freehand curve defining part of a sketch"); + + /* Points */ + prop = RNA_def_property(srna, "points", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_sdna(prop, NULL, "points", "totpoints"); + RNA_def_property_struct_type(prop, "GPencilStrokePoint"); + RNA_def_property_ui_text(prop, "Stroke Points", "Stroke data points"); + rna_def_gpencil_stroke_points_api(brna, prop); + + /* vertex groups */ + prop = RNA_def_property(srna, "groups", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_funcs(prop, + "rna_GpencilVertex_groups_begin", + "rna_iterator_array_next", + "rna_iterator_array_end", + "rna_iterator_array_get", + NULL, + NULL, + NULL, + NULL); + RNA_def_property_struct_type(prop, "GpencilVertexGroupElement"); + RNA_def_property_ui_text( + prop, "Groups", "Weights for the vertex groups this vertex is member of"); + + /* Triangles */ + prop = RNA_def_property(srna, "triangles", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_sdna(prop, NULL, "triangles", "tot_triangles"); + RNA_def_property_struct_type(prop, "GPencilTriangle"); + RNA_def_property_ui_text(prop, "Triangles", "Triangulation data for HQ fill"); + + /* Material Index */ + prop = RNA_def_property(srna, "material_index", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "mat_nr"); + RNA_def_property_ui_text(prop, "Material Index", "Index of material used in this stroke"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* Settings */ + prop = RNA_def_property(srna, "display_mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag"); + RNA_def_property_enum_items(prop, stroke_display_mode_items); + RNA_def_property_ui_text(prop, "Draw Mode", "Coordinate space that stroke is in"); + RNA_def_property_update(prop, 0, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STROKE_SELECT); + RNA_def_property_boolean_funcs(prop, NULL, "rna_GPencil_stroke_select_set"); + RNA_def_property_ui_text(prop, "Select", "Stroke is selected for viewport editing"); + RNA_def_property_update(prop, 0, "rna_GPencil_update"); + + /* Cyclic: Draw a line from end to start point */ + prop = RNA_def_property(srna, "draw_cyclic", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STROKE_CYCLIC); + RNA_def_property_ui_text(prop, "Cyclic", "Enable cyclic drawing, closing the stroke"); + RNA_def_property_update(prop, 0, "rna_GPencil_update"); + + /* Caps mode */ + prop = RNA_def_property(srna, "start_cap_mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "caps[0]"); + RNA_def_property_enum_items(prop, rna_enum_gpencil_caps_modes_items); + RNA_def_property_ui_text(prop, "Start Cap", "Stroke start extreme cap style"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "end_cap_mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "caps[1]"); + RNA_def_property_enum_items(prop, rna_enum_gpencil_caps_modes_items); + RNA_def_property_ui_text(prop, "End Cap", "Stroke end extreme cap style"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* No fill: The stroke never must fill area and must use fill color as stroke color (this is a special flag for fill brush) */ + prop = RNA_def_property(srna, "is_nofill_stroke", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STROKE_NOFILL); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "No Fill", "Special stroke to use as boundary for filling areas"); + RNA_def_property_update(prop, 0, "rna_GPencil_update"); + + /* Line Thickness */ + prop = RNA_def_property(srna, "line_width", PROP_INT, PROP_PIXEL); + RNA_def_property_int_sdna(prop, NULL, "thickness"); + RNA_def_property_range(prop, 1, 1000); + RNA_def_property_ui_range(prop, 1, 10, 1, 0); + RNA_def_property_ui_text(prop, "Thickness", "Thickness of stroke (in pixels)"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* gradient control along y */ + prop = RNA_def_property(srna, "gradient_factor", PROP_FLOAT, PROP_FACTOR); + RNA_def_property_float_sdna(prop, NULL, "gradient_f"); + RNA_def_property_range(prop, 0.001f, 1.0f); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_ui_text( + prop, "Border Opacity Factor", "Amount of gradient along section of stroke"); + RNA_def_parameter_clear_flags(prop, PROP_ANIMATABLE, 0); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* gradient shape ratio */ + prop = RNA_def_property(srna, "gradient_shape", PROP_FLOAT, PROP_XYZ); + RNA_def_property_float_sdna(prop, NULL, "gradient_s"); + RNA_def_property_array(prop, 2); + RNA_def_property_range(prop, 0.01f, 1.0f); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_ui_text(prop, "Aspect Ratio", ""); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); } static void rna_def_gpencil_strokes_api(BlenderRNA *brna, PropertyRNA *cprop) { - StructRNA *srna; - - FunctionRNA *func; - PropertyRNA *parm; - - RNA_def_property_srna(cprop, "GPencilStrokes"); - srna = RNA_def_struct(brna, "GPencilStrokes", NULL); - RNA_def_struct_sdna(srna, "bGPDframe"); - RNA_def_struct_ui_text(srna, "Grease Pencil Frames", "Collection of grease pencil stroke"); - - func = RNA_def_function(srna, "new", "rna_GPencil_stroke_new"); - RNA_def_function_ui_description(func, "Add a new grease pencil stroke"); - parm = RNA_def_pointer(func, "stroke", "GPencilStroke", "", "The newly created stroke"); - RNA_def_function_return(func, parm); - - func = RNA_def_function(srna, "remove", "rna_GPencil_stroke_remove"); - RNA_def_function_ui_description(func, "Remove a grease pencil stroke"); - RNA_def_function_flag(func, FUNC_USE_REPORTS); - parm = RNA_def_pointer(func, "stroke", "GPencilStroke", "Stroke", "The stroke to remove"); - RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR); - RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0); + StructRNA *srna; + + FunctionRNA *func; + PropertyRNA *parm; + + RNA_def_property_srna(cprop, "GPencilStrokes"); + srna = RNA_def_struct(brna, "GPencilStrokes", NULL); + RNA_def_struct_sdna(srna, "bGPDframe"); + RNA_def_struct_ui_text(srna, "Grease Pencil Frames", "Collection of grease pencil stroke"); + + func = RNA_def_function(srna, "new", "rna_GPencil_stroke_new"); + RNA_def_function_ui_description(func, "Add a new grease pencil stroke"); + parm = RNA_def_pointer(func, "stroke", "GPencilStroke", "", "The newly created stroke"); + RNA_def_function_return(func, parm); + + func = RNA_def_function(srna, "remove", "rna_GPencil_stroke_remove"); + RNA_def_function_ui_description(func, "Remove a grease pencil stroke"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm = RNA_def_pointer(func, "stroke", "GPencilStroke", "Stroke", "The stroke to remove"); + RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR); + RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0); } static void rna_def_gpencil_frame(BlenderRNA *brna) { - StructRNA *srna; - PropertyRNA *prop; - - FunctionRNA *func; - - srna = RNA_def_struct(brna, "GPencilFrame", NULL); - RNA_def_struct_sdna(srna, "bGPDframe"); - RNA_def_struct_ui_text(srna, "Grease Pencil Frame", "Collection of related sketches on a particular frame"); - - /* Strokes */ - prop = RNA_def_property(srna, "strokes", PROP_COLLECTION, PROP_NONE); - RNA_def_property_collection_sdna(prop, NULL, "strokes", NULL); - RNA_def_property_struct_type(prop, "GPencilStroke"); - RNA_def_property_ui_text(prop, "Strokes", "Freehand curves defining the sketch on this frame"); - rna_def_gpencil_strokes_api(brna, prop); - - /* Frame Number */ - prop = RNA_def_property(srna, "frame_number", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "framenum"); - /* XXX note: this cannot occur on the same frame as another sketch */ - RNA_def_property_range(prop, -MAXFRAME, MAXFRAME); - RNA_def_property_ui_text(prop, "Frame Number", "The frame on which this sketch appears"); - - /* Flags */ - prop = RNA_def_property(srna, "is_edited", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_FRAME_PAINT); /* XXX should it be editable? */ - RNA_def_property_ui_text(prop, "Paint Lock", "Frame is being edited (painted on)"); - - prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_FRAME_SELECT); - RNA_def_property_ui_text(prop, "Select", "Frame is selected for editing in the Dope Sheet"); - - - /* API */ - func = RNA_def_function(srna, "clear", "rna_GPencil_frame_clear"); - RNA_def_function_ui_description(func, "Remove all the grease pencil frame data"); + StructRNA *srna; + PropertyRNA *prop; + + FunctionRNA *func; + + srna = RNA_def_struct(brna, "GPencilFrame", NULL); + RNA_def_struct_sdna(srna, "bGPDframe"); + RNA_def_struct_ui_text( + srna, "Grease Pencil Frame", "Collection of related sketches on a particular frame"); + + /* Strokes */ + prop = RNA_def_property(srna, "strokes", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_sdna(prop, NULL, "strokes", NULL); + RNA_def_property_struct_type(prop, "GPencilStroke"); + RNA_def_property_ui_text(prop, "Strokes", "Freehand curves defining the sketch on this frame"); + rna_def_gpencil_strokes_api(brna, prop); + + /* Frame Number */ + prop = RNA_def_property(srna, "frame_number", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "framenum"); + /* XXX note: this cannot occur on the same frame as another sketch */ + RNA_def_property_range(prop, -MAXFRAME, MAXFRAME); + RNA_def_property_ui_text(prop, "Frame Number", "The frame on which this sketch appears"); + + /* Flags */ + prop = RNA_def_property(srna, "is_edited", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna( + prop, NULL, "flag", GP_FRAME_PAINT); /* XXX should it be editable? */ + RNA_def_property_ui_text(prop, "Paint Lock", "Frame is being edited (painted on)"); + + prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_FRAME_SELECT); + RNA_def_property_ui_text(prop, "Select", "Frame is selected for editing in the Dope Sheet"); + + /* API */ + func = RNA_def_function(srna, "clear", "rna_GPencil_frame_clear"); + RNA_def_function_ui_description(func, "Remove all the grease pencil frame data"); } static void rna_def_gpencil_frames_api(BlenderRNA *brna, PropertyRNA *cprop) { - StructRNA *srna; - - FunctionRNA *func; - PropertyRNA *parm; - - RNA_def_property_srna(cprop, "GPencilFrames"); - srna = RNA_def_struct(brna, "GPencilFrames", NULL); - RNA_def_struct_sdna(srna, "bGPDlayer"); - RNA_def_struct_ui_text(srna, "Grease Pencil Frames", "Collection of grease pencil frames"); - - func = RNA_def_function(srna, "new", "rna_GPencil_frame_new"); - RNA_def_function_ui_description(func, "Add a new grease pencil frame"); - RNA_def_function_flag(func, FUNC_USE_REPORTS); - parm = RNA_def_int( - func, "frame_number", 1, MINAFRAME, MAXFRAME, "Frame Number", - "The frame on which this sketch appears", MINAFRAME, MAXFRAME); - RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); - parm = RNA_def_pointer(func, "frame", "GPencilFrame", "", "The newly created frame"); - RNA_def_function_return(func, parm); - - func = RNA_def_function(srna, "remove", "rna_GPencil_frame_remove"); - RNA_def_function_ui_description(func, "Remove a grease pencil frame"); - RNA_def_function_flag(func, FUNC_USE_REPORTS); - parm = RNA_def_pointer(func, "frame", "GPencilFrame", "Frame", "The frame to remove"); - RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR); - RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0); - - func = RNA_def_function(srna, "copy", "rna_GPencil_frame_copy"); - RNA_def_function_ui_description(func, "Copy a grease pencil frame"); - parm = RNA_def_pointer(func, "source", "GPencilFrame", "Source", "The source frame"); - RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED); - parm = RNA_def_pointer(func, "copy", "GPencilFrame", "", "The newly copied frame"); - RNA_def_function_return(func, parm); + StructRNA *srna; + + FunctionRNA *func; + PropertyRNA *parm; + + RNA_def_property_srna(cprop, "GPencilFrames"); + srna = RNA_def_struct(brna, "GPencilFrames", NULL); + RNA_def_struct_sdna(srna, "bGPDlayer"); + RNA_def_struct_ui_text(srna, "Grease Pencil Frames", "Collection of grease pencil frames"); + + func = RNA_def_function(srna, "new", "rna_GPencil_frame_new"); + RNA_def_function_ui_description(func, "Add a new grease pencil frame"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm = RNA_def_int(func, + "frame_number", + 1, + MINAFRAME, + MAXFRAME, + "Frame Number", + "The frame on which this sketch appears", + MINAFRAME, + MAXFRAME); + RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + parm = RNA_def_pointer(func, "frame", "GPencilFrame", "", "The newly created frame"); + RNA_def_function_return(func, parm); + + func = RNA_def_function(srna, "remove", "rna_GPencil_frame_remove"); + RNA_def_function_ui_description(func, "Remove a grease pencil frame"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm = RNA_def_pointer(func, "frame", "GPencilFrame", "Frame", "The frame to remove"); + RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR); + RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0); + + func = RNA_def_function(srna, "copy", "rna_GPencil_frame_copy"); + RNA_def_function_ui_description(func, "Copy a grease pencil frame"); + parm = RNA_def_pointer(func, "source", "GPencilFrame", "Source", "The source frame"); + RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED); + parm = RNA_def_pointer(func, "copy", "GPencilFrame", "", "The newly copied frame"); + RNA_def_function_return(func, parm); } static void rna_def_gpencil_layer(BlenderRNA *brna) { - StructRNA *srna; - PropertyRNA *prop; - - FunctionRNA *func; - static const float default_onion_color_b[] = { 0.302f, 0.851f, 0.302f }; - static const float default_onion_color_a[] = { 0.250f, 0.1f, 1.0f }; - - srna = RNA_def_struct(brna, "GPencilLayer", NULL); - RNA_def_struct_sdna(srna, "bGPDlayer"); - RNA_def_struct_ui_text(srna, "Grease Pencil Layer", "Collection of related sketches"); - RNA_def_struct_path_func(srna, "rna_GPencilLayer_path"); - - /* Name */ - prop = RNA_def_property(srna, "info", PROP_STRING, PROP_NONE); - RNA_def_property_ui_text(prop, "Info", "Layer name"); - RNA_def_property_string_funcs(prop, NULL, NULL, "rna_GPencilLayer_info_set"); - RNA_def_struct_name_property(srna, prop); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA | NA_RENAME, NULL); - - /* Frames */ - prop = RNA_def_property(srna, "frames", PROP_COLLECTION, PROP_NONE); - RNA_def_property_collection_sdna(prop, NULL, "frames", NULL); - RNA_def_property_struct_type(prop, "GPencilFrame"); - RNA_def_property_ui_text(prop, "Frames", "Sketches for this layer on different frames"); - rna_def_gpencil_frames_api(brna, prop); - - /* Active Frame */ - prop = RNA_def_property(srna, "active_frame", PROP_POINTER, PROP_NONE); - RNA_def_property_pointer_sdna(prop, NULL, "actframe"); - RNA_def_property_ui_text(prop, "Active Frame", "Frame currently being displayed for this layer"); - RNA_def_property_editable_func(prop, "rna_GPencilLayer_active_frame_editable"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL); - - - /* Layer Opacity */ - prop = RNA_def_property(srna, "opacity", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "opacity"); - RNA_def_property_range(prop, 0.0, 1.0f); - RNA_def_property_ui_text(prop, "Opacity", "Layer Opacity"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* layer channel color (grease pencil) */ - prop = RNA_def_property(srna, "channel_color", PROP_FLOAT, PROP_COLOR_GAMMA); - RNA_def_property_float_sdna(prop, NULL, "color"); - RNA_def_property_array(prop, 3); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_ui_text(prop, "Custom Channel Color", - "Custom color for animation channel in Dopesheet"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* Stroke Drawing Color (Annotations) */ - prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA); - RNA_def_property_array(prop, 3); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_ui_text(prop, "Color", "Color for all strokes in this layer"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* Line Thickness (Annotations) */ - prop = RNA_def_property(srna, "thickness", PROP_INT, PROP_PIXEL); - RNA_def_property_int_sdna(prop, NULL, "thickness"); - RNA_def_property_range(prop, 1, 10); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_ui_text(prop, "Thickness", "Thickness of annotation strokes"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* Tint Color */ - prop = RNA_def_property(srna, "tint_color", PROP_FLOAT, PROP_COLOR_GAMMA); - RNA_def_property_float_sdna(prop, NULL, "tintcolor"); - RNA_def_property_array(prop, 3); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_text(prop, "Tint Color", "Color for tinting stroke colors"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* Tint factor */ - prop = RNA_def_property(srna, "tint_factor", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "tintcolor[3]"); - RNA_def_property_range(prop, 0.0, 1.0f); - RNA_def_property_ui_text(prop, "Tint Factor", "Factor of tinting color"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* Line Thickness Change */ - prop = RNA_def_property(srna, "line_change", PROP_INT, PROP_PIXEL); - RNA_def_property_int_sdna(prop, NULL, "line_change"); - RNA_def_property_range(prop, -300, 300); - RNA_def_property_ui_range(prop, -100, 100, 1.0, 1); - RNA_def_property_ui_text(prop, "Thickness Change", "Thickness change to apply to current strokes (in pixels)"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - - /* Onion-Skinning */ - prop = RNA_def_property(srna, "use_onion_skinning", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "onion_flag", GP_LAYER_ONIONSKIN); - RNA_def_property_ui_text(prop, "Onion Skinning", "Display onion skins before and after the current frame"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "use_annotation_onion_skinning", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "onion_flag", GP_LAYER_ONIONSKIN); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_ui_text( - prop, "Onion Skinning", - "Display annotation onion skins before and after the current frame"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "annotation_onion_before_range", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "gstep"); - RNA_def_property_range(prop, -1, 120); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_ui_text( - prop, "Frames Before", - "Maximum number of frames to show before current frame"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "annotation_onion_after_range", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "gstep_next"); - RNA_def_property_range(prop, -1, 120); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_ui_text( - prop, "Frames After", - "Maximum number of frames to show after current frame"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "annotation_onion_before_color", PROP_FLOAT, PROP_COLOR_GAMMA); - RNA_def_property_float_sdna(prop, NULL, "gcolor_prev"); - RNA_def_property_array(prop, 3); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_float_array_default(prop, default_onion_color_b); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_ui_text(prop, "Before Color", "Base color for ghosts before the active frame"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "annotation_onion_after_color", PROP_FLOAT, PROP_COLOR_GAMMA); - RNA_def_property_float_sdna(prop, NULL, "gcolor_next"); - RNA_def_property_array(prop, 3); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_float_array_default(prop, default_onion_color_a); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_ui_text(prop, "After Color", "Base color for ghosts after the active frame"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* pass index for compositing and modifiers */ - prop = RNA_def_property(srna, "pass_index", PROP_INT, PROP_UNSIGNED); - RNA_def_property_int_sdna(prop, NULL, "pass_index"); - RNA_def_property_ui_text(prop, "Pass Index", "Index number for the \"Layer Index\" pass"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "viewlayer_render", PROP_STRING, PROP_NONE); - RNA_def_property_string_sdna(prop, NULL, "viewlayername"); - RNA_def_property_ui_text( - prop, "ViewLayer", - "Only include Layer in this View Layer render output (leave blank to include always)"); - - /* blend mode */ - prop = RNA_def_property(srna, "blend_mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "blend_mode"); - 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_GPencil_update"); - - /* Flags */ - prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_HIDE); - RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, -1); - RNA_def_property_ui_text(prop, "Hide", "Set layer Visibility"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "annotation_hide", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_HIDE); - RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, -1); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_ui_text(prop, "Hide", "Set annotation Visibility"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "lock", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_LOCKED); - RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1); - RNA_def_property_ui_text(prop, "Locked", "Protect layer from further editing and/or frame changes"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "lock_frame", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_FRAMELOCK); - 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_GPencil_update"); - - prop = RNA_def_property(srna, "lock_material", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GP_LAYER_UNLOCK_COLOR); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_ui_text(prop, "Lock Material", "Disable Material editing"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL); - - prop = RNA_def_property(srna, "clamp_layer", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_USE_MASK); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_ui_text( - prop, "Clamp Layer", - "Clamp any pixel outside underlying layers drawing"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL); - - /* solo mode: Only display frames with keyframe */ - prop = RNA_def_property(srna, "use_solo_mode", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_SOLO_MODE); - RNA_def_property_ui_text( - prop, "Solo Mode", - "In Paint mode display only layers with keyframe in current frame"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* exposed as layers.active */ -#if 0 - prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_ACTIVE); - RNA_def_property_boolean_funcs(prop, NULL, "rna_GPencilLayer_active_set"); - RNA_def_property_ui_text(prop, "Active", "Set active layer for editing"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA | NA_SELECTED, NULL); -#endif + StructRNA *srna; + PropertyRNA *prop; + + FunctionRNA *func; + static const float default_onion_color_b[] = {0.302f, 0.851f, 0.302f}; + static const float default_onion_color_a[] = {0.250f, 0.1f, 1.0f}; + + srna = RNA_def_struct(brna, "GPencilLayer", NULL); + RNA_def_struct_sdna(srna, "bGPDlayer"); + RNA_def_struct_ui_text(srna, "Grease Pencil Layer", "Collection of related sketches"); + RNA_def_struct_path_func(srna, "rna_GPencilLayer_path"); + + /* Name */ + prop = RNA_def_property(srna, "info", PROP_STRING, PROP_NONE); + RNA_def_property_ui_text(prop, "Info", "Layer name"); + RNA_def_property_string_funcs(prop, NULL, NULL, "rna_GPencilLayer_info_set"); + RNA_def_struct_name_property(srna, prop); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA | NA_RENAME, NULL); + + /* Frames */ + prop = RNA_def_property(srna, "frames", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_sdna(prop, NULL, "frames", NULL); + RNA_def_property_struct_type(prop, "GPencilFrame"); + RNA_def_property_ui_text(prop, "Frames", "Sketches for this layer on different frames"); + rna_def_gpencil_frames_api(brna, prop); + + /* Active Frame */ + prop = RNA_def_property(srna, "active_frame", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, NULL, "actframe"); + RNA_def_property_ui_text(prop, "Active Frame", "Frame currently being displayed for this layer"); + RNA_def_property_editable_func(prop, "rna_GPencilLayer_active_frame_editable"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL); + + /* Layer Opacity */ + prop = RNA_def_property(srna, "opacity", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "opacity"); + RNA_def_property_range(prop, 0.0, 1.0f); + RNA_def_property_ui_text(prop, "Opacity", "Layer Opacity"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* layer channel color (grease pencil) */ + prop = RNA_def_property(srna, "channel_color", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_float_sdna(prop, NULL, "color"); + RNA_def_property_array(prop, 3); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_text( + prop, "Custom Channel Color", "Custom color for animation channel in Dopesheet"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* Stroke Drawing Color (Annotations) */ + prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_array(prop, 3); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_text(prop, "Color", "Color for all strokes in this layer"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* Line Thickness (Annotations) */ + prop = RNA_def_property(srna, "thickness", PROP_INT, PROP_PIXEL); + RNA_def_property_int_sdna(prop, NULL, "thickness"); + RNA_def_property_range(prop, 1, 10); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_text(prop, "Thickness", "Thickness of annotation strokes"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* Tint Color */ + prop = RNA_def_property(srna, "tint_color", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_float_sdna(prop, NULL, "tintcolor"); + RNA_def_property_array(prop, 3); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_text(prop, "Tint Color", "Color for tinting stroke colors"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* Tint factor */ + prop = RNA_def_property(srna, "tint_factor", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "tintcolor[3]"); + RNA_def_property_range(prop, 0.0, 1.0f); + RNA_def_property_ui_text(prop, "Tint Factor", "Factor of tinting color"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* Line Thickness Change */ + prop = RNA_def_property(srna, "line_change", PROP_INT, PROP_PIXEL); + RNA_def_property_int_sdna(prop, NULL, "line_change"); + RNA_def_property_range(prop, -300, 300); + RNA_def_property_ui_range(prop, -100, 100, 1.0, 1); + RNA_def_property_ui_text( + prop, "Thickness Change", "Thickness change to apply to current strokes (in pixels)"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* Onion-Skinning */ + prop = RNA_def_property(srna, "use_onion_skinning", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "onion_flag", GP_LAYER_ONIONSKIN); + RNA_def_property_ui_text( + prop, "Onion Skinning", "Display onion skins before and after the current frame"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "use_annotation_onion_skinning", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "onion_flag", GP_LAYER_ONIONSKIN); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_text( + prop, "Onion Skinning", "Display annotation onion skins before and after the current frame"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "annotation_onion_before_range", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "gstep"); + RNA_def_property_range(prop, -1, 120); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_text( + prop, "Frames Before", "Maximum number of frames to show before current frame"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "annotation_onion_after_range", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "gstep_next"); + RNA_def_property_range(prop, -1, 120); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_text( + prop, "Frames After", "Maximum number of frames to show after current frame"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "annotation_onion_before_color", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_float_sdna(prop, NULL, "gcolor_prev"); + RNA_def_property_array(prop, 3); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_float_array_default(prop, default_onion_color_b); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_text(prop, "Before Color", "Base color for ghosts before the active frame"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "annotation_onion_after_color", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_float_sdna(prop, NULL, "gcolor_next"); + RNA_def_property_array(prop, 3); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_float_array_default(prop, default_onion_color_a); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_text(prop, "After Color", "Base color for ghosts after the active frame"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* pass index for compositing and modifiers */ + prop = RNA_def_property(srna, "pass_index", PROP_INT, PROP_UNSIGNED); + RNA_def_property_int_sdna(prop, NULL, "pass_index"); + RNA_def_property_ui_text(prop, "Pass Index", "Index number for the \"Layer Index\" pass"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "viewlayer_render", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "viewlayername"); + RNA_def_property_ui_text( + prop, + "ViewLayer", + "Only include Layer in this View Layer render output (leave blank to include always)"); + + /* blend mode */ + prop = RNA_def_property(srna, "blend_mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "blend_mode"); + 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_GPencil_update"); + + /* Flags */ + prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_HIDE); + RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, -1); + RNA_def_property_ui_text(prop, "Hide", "Set layer Visibility"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "annotation_hide", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_HIDE); + RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, -1); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_text(prop, "Hide", "Set annotation Visibility"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "lock", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_LOCKED); + RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1); + RNA_def_property_ui_text( + prop, "Locked", "Protect layer from further editing and/or frame changes"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "lock_frame", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_FRAMELOCK); + 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_GPencil_update"); + + prop = RNA_def_property(srna, "lock_material", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GP_LAYER_UNLOCK_COLOR); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_text(prop, "Lock Material", "Disable Material editing"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL); + + prop = RNA_def_property(srna, "clamp_layer", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_USE_MASK); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_text( + prop, "Clamp Layer", "Clamp any pixel outside underlying layers drawing"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, NULL); + + /* solo mode: Only display frames with keyframe */ + prop = RNA_def_property(srna, "use_solo_mode", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_SOLO_MODE); + RNA_def_property_ui_text( + prop, "Solo Mode", "In Paint mode display only layers with keyframe in current frame"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* exposed as layers.active */ +# if 0 + prop = RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_ACTIVE); + RNA_def_property_boolean_funcs(prop, NULL, "rna_GPencilLayer_active_set"); + RNA_def_property_ui_text(prop, "Active", "Set active layer for editing"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA | NA_SELECTED, NULL); +# endif + + prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_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 | NA_SELECTED, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "show_points", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_DRAWDEBUG); + RNA_def_property_ui_text( + prop, "Show Points", "Draw the points which make up the strokes (for debugging purposes)"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* In Front */ + prop = RNA_def_property(srna, "show_in_front", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GP_LAYER_NO_XRAY); + RNA_def_property_ui_text(prop, "In Front", "Make the layer draw in front of objects"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* Parent object */ + prop = RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_funcs(prop, NULL, "rna_GPencilLayer_parent_set", NULL, NULL); + RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK); + RNA_def_property_ui_text(prop, "Parent", "Parent Object"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_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 | NA_SELECTED, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "show_points", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_DRAWDEBUG); - RNA_def_property_ui_text(prop, "Show Points", "Draw the points which make up the strokes (for debugging purposes)"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* In Front */ - prop = RNA_def_property(srna, "show_in_front", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GP_LAYER_NO_XRAY); - RNA_def_property_ui_text(prop, "In Front", "Make the layer draw in front of objects"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* Parent object */ - prop = RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE); - RNA_def_property_pointer_funcs(prop, NULL, "rna_GPencilLayer_parent_set", NULL, NULL); - RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK); - RNA_def_property_ui_text(prop, "Parent", "Parent Object"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* parent type */ - prop = RNA_def_property(srna, "parent_type", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_bitflag_sdna(prop, NULL, "partype"); - RNA_def_property_enum_items(prop, parent_type_items); - RNA_def_property_enum_funcs(prop, NULL, "rna_GPencilLayer_parent_type_set", "rna_Object_parent_type_itemf"); - RNA_def_property_ui_text(prop, "Parent Type", "Type of parent relation"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* parent bone */ - prop = RNA_def_property(srna, "parent_bone", PROP_STRING, PROP_NONE); - RNA_def_property_string_sdna(prop, NULL, "parsubstr"); - RNA_def_property_string_funcs(prop, NULL, NULL, "rna_GPencilLayer_parent_bone_set"); - RNA_def_property_ui_text(prop, "Parent Bone", "Name of parent bone in case of a bone parenting relation"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* matrix */ - prop = RNA_def_property(srna, "matrix_inverse", PROP_FLOAT, PROP_MATRIX); - RNA_def_property_float_sdna(prop, NULL, "inverse"); - RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4); - RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); - RNA_def_property_ui_text(prop, "Inverse Matrix", "Parent inverse transformation matrix"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* read only parented flag */ - prop = RNA_def_property(srna, "is_parented", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_funcs(prop, "rna_GPencilLayer_is_parented_get", NULL); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_ui_text(prop, "Is Parented", "True when the layer parent object is set"); - - /* Layers API */ - func = RNA_def_function(srna, "clear", "rna_GPencil_layer_clear"); - RNA_def_function_ui_description(func, "Remove all the grease pencil layer data"); + /* parent type */ + prop = RNA_def_property(srna, "parent_type", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_bitflag_sdna(prop, NULL, "partype"); + RNA_def_property_enum_items(prop, parent_type_items); + RNA_def_property_enum_funcs( + prop, NULL, "rna_GPencilLayer_parent_type_set", "rna_Object_parent_type_itemf"); + RNA_def_property_ui_text(prop, "Parent Type", "Type of parent relation"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* parent bone */ + prop = RNA_def_property(srna, "parent_bone", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "parsubstr"); + RNA_def_property_string_funcs(prop, NULL, NULL, "rna_GPencilLayer_parent_bone_set"); + RNA_def_property_ui_text( + prop, "Parent Bone", "Name of parent bone in case of a bone parenting relation"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* matrix */ + prop = RNA_def_property(srna, "matrix_inverse", PROP_FLOAT, PROP_MATRIX); + RNA_def_property_float_sdna(prop, NULL, "inverse"); + RNA_def_property_multi_array(prop, 2, rna_matrix_dimsize_4x4); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_text(prop, "Inverse Matrix", "Parent inverse transformation matrix"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* read only parented flag */ + prop = RNA_def_property(srna, "is_parented", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_funcs(prop, "rna_GPencilLayer_is_parented_get", NULL); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Is Parented", "True when the layer parent object is set"); + + /* Layers API */ + func = RNA_def_function(srna, "clear", "rna_GPencil_layer_clear"); + RNA_def_function_ui_description(func, "Remove all the grease pencil layer data"); } static void rna_def_gpencil_layers_api(BlenderRNA *brna, PropertyRNA *cprop) { - StructRNA *srna; - PropertyRNA *prop; - - FunctionRNA *func; - PropertyRNA *parm; - - RNA_def_property_srna(cprop, "GreasePencilLayers"); - srna = RNA_def_struct(brna, "GreasePencilLayers", NULL); - RNA_def_struct_sdna(srna, "bGPdata"); - RNA_def_struct_ui_text(srna, "Grease Pencil Layers", "Collection of grease pencil layers"); - - func = RNA_def_function(srna, "new", "rna_GPencil_layer_new"); - RNA_def_function_ui_description(func, "Add a new grease pencil layer"); - parm = RNA_def_string(func, "name", "GPencilLayer", MAX_NAME, "Name", "Name of the layer"); - RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); - RNA_def_boolean(func, "set_active", true, "Set Active", "Set the newly created layer to the active layer"); - parm = RNA_def_pointer(func, "layer", "GPencilLayer", "", "The newly created layer"); - RNA_def_function_return(func, parm); - - func = RNA_def_function(srna, "remove", "rna_GPencil_layer_remove"); - RNA_def_function_ui_description(func, "Remove a grease pencil layer"); - RNA_def_function_flag(func, FUNC_USE_REPORTS); - parm = RNA_def_pointer(func, "layer", "GPencilLayer", "", "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, 0); - - func = RNA_def_function(srna, "move", "rna_GPencil_layer_move"); - RNA_def_function_ui_description(func, "Move a grease pencil layer in the layer stack"); - RNA_def_function_flag(func, FUNC_USE_REPORTS); - parm = RNA_def_pointer(func, "layer", "GPencilLayer", "", "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, 0); - parm = RNA_def_enum(func, "type", rna_enum_gplayer_move_type_items, 1, "", "Direction of movement"); - RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); - - prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE); - RNA_def_property_struct_type(prop, "GPencilLayer"); - RNA_def_property_pointer_funcs(prop, "rna_GPencil_active_layer_get", "rna_GPencil_active_layer_set", NULL, NULL); - RNA_def_property_flag(prop, PROP_EDITABLE); - RNA_def_property_ui_text(prop, "Active Layer", "Active grease pencil layer"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA | NA_SELECTED, NULL); - - prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED); - RNA_def_property_int_funcs( - prop, - "rna_GPencil_active_layer_index_get", - "rna_GPencil_active_layer_index_set", - "rna_GPencil_active_layer_index_range"); - RNA_def_property_ui_text(prop, "Active Layer Index", "Index of active grease pencil layer"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA | NA_SELECTED, NULL); - - /* Active Layer - As an enum (for selecting active layer for annotations) */ - prop = RNA_def_property(srna, "active_note", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_funcs( - prop, - "rna_GPencil_active_layer_index_get", - "rna_GPencil_active_layer_index_set", - "rna_GPencil_active_layer_itemf"); - RNA_def_property_enum_items(prop, DummyRNA_DEFAULT_items); /* purely dynamic, as it maps to user-data */ - RNA_def_property_ui_text(prop, "Active Note", "Note/Layer to add annotation strokes to"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + StructRNA *srna; + PropertyRNA *prop; + + FunctionRNA *func; + PropertyRNA *parm; + + RNA_def_property_srna(cprop, "GreasePencilLayers"); + srna = RNA_def_struct(brna, "GreasePencilLayers", NULL); + RNA_def_struct_sdna(srna, "bGPdata"); + RNA_def_struct_ui_text(srna, "Grease Pencil Layers", "Collection of grease pencil layers"); + + func = RNA_def_function(srna, "new", "rna_GPencil_layer_new"); + RNA_def_function_ui_description(func, "Add a new grease pencil layer"); + parm = RNA_def_string(func, "name", "GPencilLayer", MAX_NAME, "Name", "Name of the layer"); + RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + RNA_def_boolean( + func, "set_active", true, "Set Active", "Set the newly created layer to the active layer"); + parm = RNA_def_pointer(func, "layer", "GPencilLayer", "", "The newly created layer"); + RNA_def_function_return(func, parm); + + func = RNA_def_function(srna, "remove", "rna_GPencil_layer_remove"); + RNA_def_function_ui_description(func, "Remove a grease pencil layer"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm = RNA_def_pointer(func, "layer", "GPencilLayer", "", "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, 0); + + func = RNA_def_function(srna, "move", "rna_GPencil_layer_move"); + RNA_def_function_ui_description(func, "Move a grease pencil layer in the layer stack"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm = RNA_def_pointer(func, "layer", "GPencilLayer", "", "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, 0); + parm = RNA_def_enum( + func, "type", rna_enum_gplayer_move_type_items, 1, "", "Direction of movement"); + RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + + prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "GPencilLayer"); + RNA_def_property_pointer_funcs( + prop, "rna_GPencil_active_layer_get", "rna_GPencil_active_layer_set", NULL, NULL); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_ui_text(prop, "Active Layer", "Active grease pencil layer"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA | NA_SELECTED, NULL); + + prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED); + RNA_def_property_int_funcs(prop, + "rna_GPencil_active_layer_index_get", + "rna_GPencil_active_layer_index_set", + "rna_GPencil_active_layer_index_range"); + RNA_def_property_ui_text(prop, "Active Layer Index", "Index of active grease pencil layer"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA | NA_SELECTED, NULL); + + /* Active Layer - As an enum (for selecting active layer for annotations) */ + prop = RNA_def_property(srna, "active_note", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_funcs(prop, + "rna_GPencil_active_layer_index_get", + "rna_GPencil_active_layer_index_set", + "rna_GPencil_active_layer_itemf"); + RNA_def_property_enum_items( + prop, DummyRNA_DEFAULT_items); /* purely dynamic, as it maps to user-data */ + RNA_def_property_ui_text(prop, "Active Note", "Note/Layer to add annotation strokes to"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); } static void rna_def_gpencil_grid(BlenderRNA *brna) { - StructRNA *srna; - PropertyRNA *prop; - - static const float default_grid_color[] = { 0.5f, 0.5f, 0.5f }; - - srna = RNA_def_struct(brna, "GreasePencilGrid", NULL); - RNA_def_struct_sdna(srna, "bGPgrid"); - RNA_def_struct_nested(brna, srna, "GreasePencil"); - - RNA_def_struct_path_func(srna, "rna_GreasePencilGrid_path"); - RNA_def_struct_ui_text( - srna, "Grid and Canvas Settings", - "Settings for grid and canvas in 3D viewport"); - - prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ); - RNA_def_property_float_sdna(prop, NULL, "scale"); - RNA_def_property_range(prop, 0.01f, FLT_MAX); - RNA_def_property_float_default(prop, 1.0f); - RNA_def_property_ui_text(prop, "Grid Scale", "Grid scale"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA); - RNA_def_property_float_sdna(prop, NULL, "color"); - RNA_def_property_array(prop, 3); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_float_array_default(prop, default_grid_color); - RNA_def_property_ui_text(prop, "Grid Color", "Color for grid lines"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "lines", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "lines"); - RNA_def_property_range(prop, 0, INT_MAX); - RNA_def_property_int_default(prop, GP_DEFAULT_GRID_LINES); - RNA_def_property_ui_text(prop, "Grid Subdivisions", "Number of subdivisions in each side of symmetry line"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_TRANSLATION); - RNA_def_property_float_sdna(prop, NULL, "offset"); - RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); - RNA_def_property_array(prop, 2); - RNA_def_property_ui_text(prop, "Offset", "Offset of the canvas"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + StructRNA *srna; + PropertyRNA *prop; + + static const float default_grid_color[] = {0.5f, 0.5f, 0.5f}; + + srna = RNA_def_struct(brna, "GreasePencilGrid", NULL); + RNA_def_struct_sdna(srna, "bGPgrid"); + RNA_def_struct_nested(brna, srna, "GreasePencil"); + + RNA_def_struct_path_func(srna, "rna_GreasePencilGrid_path"); + RNA_def_struct_ui_text( + srna, "Grid and Canvas Settings", "Settings for grid and canvas in 3D viewport"); + + prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_XYZ); + RNA_def_property_float_sdna(prop, NULL, "scale"); + RNA_def_property_range(prop, 0.01f, FLT_MAX); + RNA_def_property_float_default(prop, 1.0f); + RNA_def_property_ui_text(prop, "Grid Scale", "Grid scale"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_float_sdna(prop, NULL, "color"); + RNA_def_property_array(prop, 3); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_float_array_default(prop, default_grid_color); + RNA_def_property_ui_text(prop, "Grid Color", "Color for grid lines"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "lines", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "lines"); + RNA_def_property_range(prop, 0, INT_MAX); + RNA_def_property_int_default(prop, GP_DEFAULT_GRID_LINES); + RNA_def_property_ui_text( + prop, "Grid Subdivisions", "Number of subdivisions in each side of symmetry line"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "offset", PROP_FLOAT, PROP_TRANSLATION); + RNA_def_property_float_sdna(prop, NULL, "offset"); + RNA_def_property_range(prop, -FLT_MAX, FLT_MAX); + RNA_def_property_array(prop, 2); + RNA_def_property_ui_text(prop, "Offset", "Offset of the canvas"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); } static void rna_def_gpencil_data(BlenderRNA *brna) { - StructRNA *srna; - PropertyRNA *prop; - FunctionRNA *func; - - static float default_1[4] = { 0.6f, 0.6f, 0.6f, 0.5f }; - static float onion_dft1[3] = { 0.145098f, 0.419608f, 0.137255f }; /* green */ - static float onion_dft2[3] = { 0.125490f, 0.082353f, 0.529412f }; /* blue */ - - static const EnumPropertyItem stroke_thickness_items[] = { - {0, "WORLDSPACE", 0, "World Space", "Set stroke thickness relative to the world space"}, - {GP_DATA_STROKE_KEEPTHICKNESS, "SCREENSPACE", 0, "Screen Space", "Set stroke thickness relative to the screen space"}, - {0, NULL, 0, NULL, NULL}, - }; - - srna = RNA_def_struct(brna, "GreasePencil", "ID"); - RNA_def_struct_sdna(srna, "bGPdata"); - RNA_def_struct_ui_text(srna, "Grease Pencil", "Freehand annotation sketchbook"); - RNA_def_struct_ui_icon(srna, ICON_GREASEPENCIL); - - /* Layers */ - prop = RNA_def_property(srna, "layers", PROP_COLLECTION, PROP_NONE); - RNA_def_property_collection_sdna(prop, NULL, "layers", NULL); - RNA_def_property_struct_type(prop, "GPencilLayer"); - RNA_def_property_ui_text(prop, "Layers", ""); - rna_def_gpencil_layers_api(brna, prop); - - /* Animation Data */ - rna_def_animdata_common(srna); - - /* materials */ - prop = RNA_def_property(srna, "materials", PROP_COLLECTION, PROP_NONE); - RNA_def_property_collection_sdna(prop, NULL, "mat", "totcol"); - RNA_def_property_struct_type(prop, "Material"); - RNA_def_property_ui_text(prop, "Materials", ""); - RNA_def_property_srna(prop, "IDMaterials"); /* see rna_ID.c */ - RNA_def_property_collection_funcs(prop, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "rna_IDMaterials_assign_int"); - - /* Depth */ - prop = RNA_def_property(srna, "stroke_depth_order", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "draw_mode"); - RNA_def_property_enum_items(prop, rna_enum_gpencil_stroke_depth_order_items); - RNA_def_property_ui_text( - prop, "Stroke Depth Order", - "Defines how the strokes are ordered in 3D space"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* Flags */ - prop = RNA_def_property(srna, "use_stroke_edit_mode", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_STROKE_EDITMODE); - RNA_def_property_ui_text(prop, "Stroke Edit Mode", "Edit Grease Pencil strokes instead of viewport data"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA | ND_GPENCIL_EDITMODE, "rna_GPencil_editmode_update"); - - prop = RNA_def_property(srna, "is_stroke_paint_mode", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_STROKE_PAINTMODE); - RNA_def_property_ui_text(prop, "Stroke Paint Mode", "Draw Grease Pencil strokes on click/drag"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA | ND_GPENCIL_EDITMODE, "rna_GPencil_editmode_update"); - - prop = RNA_def_property(srna, "is_stroke_sculpt_mode", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_STROKE_SCULPTMODE); - RNA_def_property_ui_text(prop, "Stroke Sculpt Mode", "Sculpt Grease Pencil strokes instead of viewport data"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA | ND_GPENCIL_EDITMODE, "rna_GPencil_editmode_update"); - - prop = RNA_def_property(srna, "is_stroke_weight_mode", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_STROKE_WEIGHTMODE); - RNA_def_property_ui_text(prop, "Stroke Weight Paint Mode", "Grease Pencil weight paint"); - RNA_def_property_clear_flag(prop, PROP_EDITABLE); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA | ND_GPENCIL_EDITMODE, "rna_GPencil_editmode_update"); - - prop = RNA_def_property(srna, "use_onion_skinning", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_SHOW_ONIONSKINS); - RNA_def_property_boolean_default(prop, true); - RNA_def_property_ui_text(prop, "Onion Skins", "Show ghosts of the keyframes before and after the current frame"); - RNA_def_property_update(prop, NC_SCREEN | NC_SCENE | ND_TOOLSETTINGS | ND_DATA | NC_GPENCIL, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "show_stroke_direction", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_SHOW_DIRECTION); - RNA_def_property_ui_text(prop, "Show Direction", "Show stroke drawing direction with a bigger green dot (start) " - "and smaller red dot (end) points"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "stroke_thickness_space", PROP_ENUM, PROP_NONE); /* as an enum */ - RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag"); - RNA_def_property_enum_items(prop, stroke_thickness_items); - RNA_def_property_ui_text(prop, "Stroke Thickness", "Set stroke thickness in screen space or world space"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "pixel_factor", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "pixfactor"); - RNA_def_property_range(prop, 0.1f, 30.0f); - RNA_def_property_ui_range(prop, 0.1f, 30.0f, 1, 2); - RNA_def_property_ui_text(prop, "Scale", "Scale conversion factor for pixel size (use larger values for thicker lines)"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "use_multiedit", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_STROKE_MULTIEDIT); - RNA_def_property_ui_text(prop, "MultiFrame", "Edit strokes from multiple grease pencil keyframes at the same time (keyframes must be selected to be included)"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "use_force_fill_recalc", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_STROKE_FORCE_RECALC); - RNA_def_property_ui_text(prop, "Force Fill Update", "Force recalc of fill data after use deformation modifiers (reduce FPS)"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "use_adaptive_uv", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_UV_ADAPTIVE); - RNA_def_property_ui_text(prop, "Adaptive UV", "Automatic UVs are calculated depending of the stroke size"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "use_autolock_layers", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_AUTOLOCK_LAYERS); - RNA_def_property_ui_text( - prop, "Autolock Layers", - "Lock automatically all layers except active one to avoid accidental changes"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_autolock"); - - prop = RNA_def_property(srna, "edit_line_color", PROP_FLOAT, PROP_COLOR_GAMMA); - RNA_def_property_float_sdna(prop, NULL, "line_color"); - RNA_def_property_array(prop, 4); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_float_array_default(prop, default_1); - RNA_def_property_ui_text(prop, "Edit Line Color", "Color for editing line"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* onion skinning */ - prop = RNA_def_property(srna, "ghost_before_range", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "gstep"); - RNA_def_property_range(prop, 0, 120); - RNA_def_property_int_default(prop, 1); - RNA_def_property_ui_text( - prop, "Frames Before", - "Maximum number of frames to show before current frame " - "(0 = don't show any frames before current)"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "ghost_after_range", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "gstep_next"); - RNA_def_property_range(prop, 0, 120); - RNA_def_property_int_default(prop, 1); - RNA_def_property_ui_text( - prop, "Frames After", - "Maximum number of frames to show after current frame " - "(0 = don't show any frames after current)"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "use_ghost_custom_colors", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "onion_flag", GP_ONION_GHOST_PREVCOL | GP_ONION_GHOST_NEXTCOL); - RNA_def_property_ui_text(prop, "Use Custom Ghost Colors", "Use custom colors for ghost frames"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "before_color", PROP_FLOAT, PROP_COLOR_GAMMA); - RNA_def_property_float_sdna(prop, NULL, "gcolor_prev"); - RNA_def_property_array(prop, 3); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_float_array_default(prop, onion_dft1); - RNA_def_property_ui_text(prop, "Before Color", "Base color for ghosts before the active frame"); - RNA_def_property_update(prop, NC_SCREEN | NC_SCENE | ND_TOOLSETTINGS | ND_DATA | NC_GPENCIL, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "after_color", PROP_FLOAT, PROP_COLOR_GAMMA); - RNA_def_property_float_sdna(prop, NULL, "gcolor_next"); - RNA_def_property_array(prop, 3); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_float_array_default(prop, onion_dft2); - RNA_def_property_ui_text(prop, "After Color", "Base color for ghosts after the active frame"); - RNA_def_property_update(prop, NC_SCREEN | NC_SCENE | ND_TOOLSETTINGS | ND_DATA | NC_GPENCIL, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "use_ghosts_always", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "onion_flag", GP_ONION_GHOST_ALWAYS); - RNA_def_property_ui_text( - prop, "Always Show Ghosts", - "Ghosts are shown in renders and animation playback. Useful for special effects (e.g. motion blur)"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "onion_mode", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, NULL, "onion_mode"); - RNA_def_property_enum_items(prop, rna_enum_gpencil_onion_modes_items); - RNA_def_property_ui_text(prop, "Mode", "Mode to display frames"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "use_onion_fade", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "onion_flag", GP_ONION_FADE); - RNA_def_property_ui_text( - prop, "Fade", - "Display onion keyframes with a fade in color transparency"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "use_onion_loop", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "onion_flag", GP_ONION_LOOP); - RNA_def_property_ui_text( - prop, "Loop", - "Display first onion keyframes using next frame color to show indication of loop start frame"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "onion_factor", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "onion_factor"); - RNA_def_property_float_default(prop, 0.5f); - RNA_def_property_range(prop, 0.0, 1.0f); - RNA_def_property_ui_text(prop, "Onion Opacity", "Change fade opacity of displayed onion frames"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - prop = RNA_def_property(srna, "zdepth_offset", PROP_FLOAT, PROP_NONE); - RNA_def_property_float_sdna(prop, NULL, "zdepth_offset"); - RNA_def_property_range(prop, 0.0f, 1.0f); - RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 5); - RNA_def_property_ui_text( - prop, "Surface Offset", - "Offset amount when drawing in surface mode"); - RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); - - /* Nested Structs */ - prop = RNA_def_property(srna, "grid", PROP_POINTER, PROP_NONE); - RNA_def_property_flag(prop, PROP_NEVER_NULL); - RNA_def_property_struct_type(prop, "GreasePencilGrid"); - RNA_def_property_ui_text(prop, "Grid Settings", "Settings for grid and canvas in the 3D viewport"); - - rna_def_gpencil_grid(brna); - - /* API Functions */ - func = RNA_def_function(srna, "clear", "rna_GPencil_clear"); - RNA_def_function_ui_description(func, "Remove all the Grease Pencil data"); + StructRNA *srna; + PropertyRNA *prop; + FunctionRNA *func; + + static float default_1[4] = {0.6f, 0.6f, 0.6f, 0.5f}; + static float onion_dft1[3] = {0.145098f, 0.419608f, 0.137255f}; /* green */ + static float onion_dft2[3] = {0.125490f, 0.082353f, 0.529412f}; /* blue */ + + static const EnumPropertyItem stroke_thickness_items[] = { + {0, "WORLDSPACE", 0, "World Space", "Set stroke thickness relative to the world space"}, + {GP_DATA_STROKE_KEEPTHICKNESS, + "SCREENSPACE", + 0, + "Screen Space", + "Set stroke thickness relative to the screen space"}, + {0, NULL, 0, NULL, NULL}, + }; + + srna = RNA_def_struct(brna, "GreasePencil", "ID"); + RNA_def_struct_sdna(srna, "bGPdata"); + RNA_def_struct_ui_text(srna, "Grease Pencil", "Freehand annotation sketchbook"); + RNA_def_struct_ui_icon(srna, ICON_GREASEPENCIL); + + /* Layers */ + prop = RNA_def_property(srna, "layers", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_sdna(prop, NULL, "layers", NULL); + RNA_def_property_struct_type(prop, "GPencilLayer"); + RNA_def_property_ui_text(prop, "Layers", ""); + rna_def_gpencil_layers_api(brna, prop); + + /* Animation Data */ + rna_def_animdata_common(srna); + + /* materials */ + prop = RNA_def_property(srna, "materials", PROP_COLLECTION, PROP_NONE); + RNA_def_property_collection_sdna(prop, NULL, "mat", "totcol"); + RNA_def_property_struct_type(prop, "Material"); + RNA_def_property_ui_text(prop, "Materials", ""); + RNA_def_property_srna(prop, "IDMaterials"); /* see rna_ID.c */ + RNA_def_property_collection_funcs( + prop, NULL, NULL, NULL, NULL, NULL, NULL, NULL, "rna_IDMaterials_assign_int"); + + /* Depth */ + prop = RNA_def_property(srna, "stroke_depth_order", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "draw_mode"); + RNA_def_property_enum_items(prop, rna_enum_gpencil_stroke_depth_order_items); + RNA_def_property_ui_text( + prop, "Stroke Depth Order", "Defines how the strokes are ordered in 3D space"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* Flags */ + prop = RNA_def_property(srna, "use_stroke_edit_mode", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_STROKE_EDITMODE); + RNA_def_property_ui_text( + prop, "Stroke Edit Mode", "Edit Grease Pencil strokes instead of viewport data"); + RNA_def_property_update( + prop, NC_GPENCIL | ND_DATA | ND_GPENCIL_EDITMODE, "rna_GPencil_editmode_update"); + + prop = RNA_def_property(srna, "is_stroke_paint_mode", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_STROKE_PAINTMODE); + RNA_def_property_ui_text(prop, "Stroke Paint Mode", "Draw Grease Pencil strokes on click/drag"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_update( + prop, NC_GPENCIL | ND_DATA | ND_GPENCIL_EDITMODE, "rna_GPencil_editmode_update"); + + prop = RNA_def_property(srna, "is_stroke_sculpt_mode", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_STROKE_SCULPTMODE); + RNA_def_property_ui_text( + prop, "Stroke Sculpt Mode", "Sculpt Grease Pencil strokes instead of viewport data"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_update( + prop, NC_GPENCIL | ND_DATA | ND_GPENCIL_EDITMODE, "rna_GPencil_editmode_update"); + + prop = RNA_def_property(srna, "is_stroke_weight_mode", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_STROKE_WEIGHTMODE); + RNA_def_property_ui_text(prop, "Stroke Weight Paint Mode", "Grease Pencil weight paint"); + RNA_def_property_clear_flag(prop, PROP_EDITABLE); + RNA_def_property_update( + prop, NC_GPENCIL | ND_DATA | ND_GPENCIL_EDITMODE, "rna_GPencil_editmode_update"); + + prop = RNA_def_property(srna, "use_onion_skinning", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_SHOW_ONIONSKINS); + RNA_def_property_boolean_default(prop, true); + RNA_def_property_ui_text( + prop, "Onion Skins", "Show ghosts of the keyframes before and after the current frame"); + RNA_def_property_update( + prop, NC_SCREEN | NC_SCENE | ND_TOOLSETTINGS | ND_DATA | NC_GPENCIL, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "show_stroke_direction", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_SHOW_DIRECTION); + RNA_def_property_ui_text(prop, + "Show Direction", + "Show stroke drawing direction with a bigger green dot (start) " + "and smaller red dot (end) points"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "stroke_thickness_space", PROP_ENUM, PROP_NONE); /* as an enum */ + RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag"); + RNA_def_property_enum_items(prop, stroke_thickness_items); + RNA_def_property_ui_text( + prop, "Stroke Thickness", "Set stroke thickness in screen space or world space"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "pixel_factor", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "pixfactor"); + RNA_def_property_range(prop, 0.1f, 30.0f); + RNA_def_property_ui_range(prop, 0.1f, 30.0f, 1, 2); + RNA_def_property_ui_text( + prop, + "Scale", + "Scale conversion factor for pixel size (use larger values for thicker lines)"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "use_multiedit", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_STROKE_MULTIEDIT); + RNA_def_property_ui_text(prop, + "MultiFrame", + "Edit strokes from multiple grease pencil keyframes at the same time " + "(keyframes must be selected to be included)"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "use_force_fill_recalc", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_STROKE_FORCE_RECALC); + RNA_def_property_ui_text( + prop, + "Force Fill Update", + "Force recalc of fill data after use deformation modifiers (reduce FPS)"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "use_adaptive_uv", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_UV_ADAPTIVE); + RNA_def_property_ui_text( + prop, "Adaptive UV", "Automatic UVs are calculated depending of the stroke size"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "use_autolock_layers", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_DATA_AUTOLOCK_LAYERS); + RNA_def_property_ui_text( + prop, + "Autolock Layers", + "Lock automatically all layers except active one to avoid accidental changes"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_autolock"); + + prop = RNA_def_property(srna, "edit_line_color", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_float_sdna(prop, NULL, "line_color"); + RNA_def_property_array(prop, 4); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_float_array_default(prop, default_1); + RNA_def_property_ui_text(prop, "Edit Line Color", "Color for editing line"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* onion skinning */ + prop = RNA_def_property(srna, "ghost_before_range", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "gstep"); + RNA_def_property_range(prop, 0, 120); + RNA_def_property_int_default(prop, 1); + RNA_def_property_ui_text(prop, + "Frames Before", + "Maximum number of frames to show before current frame " + "(0 = don't show any frames before current)"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "ghost_after_range", PROP_INT, PROP_NONE); + RNA_def_property_int_sdna(prop, NULL, "gstep_next"); + RNA_def_property_range(prop, 0, 120); + RNA_def_property_int_default(prop, 1); + RNA_def_property_ui_text(prop, + "Frames After", + "Maximum number of frames to show after current frame " + "(0 = don't show any frames after current)"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "use_ghost_custom_colors", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna( + prop, NULL, "onion_flag", GP_ONION_GHOST_PREVCOL | GP_ONION_GHOST_NEXTCOL); + RNA_def_property_ui_text(prop, "Use Custom Ghost Colors", "Use custom colors for ghost frames"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "before_color", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_float_sdna(prop, NULL, "gcolor_prev"); + RNA_def_property_array(prop, 3); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_float_array_default(prop, onion_dft1); + RNA_def_property_ui_text(prop, "Before Color", "Base color for ghosts before the active frame"); + RNA_def_property_update( + prop, NC_SCREEN | NC_SCENE | ND_TOOLSETTINGS | ND_DATA | NC_GPENCIL, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "after_color", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_float_sdna(prop, NULL, "gcolor_next"); + RNA_def_property_array(prop, 3); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_float_array_default(prop, onion_dft2); + RNA_def_property_ui_text(prop, "After Color", "Base color for ghosts after the active frame"); + RNA_def_property_update( + prop, NC_SCREEN | NC_SCENE | ND_TOOLSETTINGS | ND_DATA | NC_GPENCIL, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "use_ghosts_always", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "onion_flag", GP_ONION_GHOST_ALWAYS); + RNA_def_property_ui_text(prop, + "Always Show Ghosts", + "Ghosts are shown in renders and animation playback. Useful for " + "special effects (e.g. motion blur)"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "onion_mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "onion_mode"); + RNA_def_property_enum_items(prop, rna_enum_gpencil_onion_modes_items); + RNA_def_property_ui_text(prop, "Mode", "Mode to display frames"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "use_onion_fade", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "onion_flag", GP_ONION_FADE); + RNA_def_property_ui_text( + prop, "Fade", "Display onion keyframes with a fade in color transparency"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "use_onion_loop", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "onion_flag", GP_ONION_LOOP); + RNA_def_property_ui_text(prop, + "Loop", + "Display first onion keyframes using next frame color to show " + "indication of loop start frame"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "onion_factor", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "onion_factor"); + RNA_def_property_float_default(prop, 0.5f); + RNA_def_property_range(prop, 0.0, 1.0f); + RNA_def_property_ui_text(prop, "Onion Opacity", "Change fade opacity of displayed onion frames"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + prop = RNA_def_property(srna, "zdepth_offset", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "zdepth_offset"); + RNA_def_property_range(prop, 0.0f, 1.0f); + RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.001, 5); + RNA_def_property_ui_text(prop, "Surface Offset", "Offset amount when drawing in surface mode"); + RNA_def_property_update(prop, NC_GPENCIL | ND_DATA, "rna_GPencil_update"); + + /* Nested Structs */ + prop = RNA_def_property(srna, "grid", PROP_POINTER, PROP_NONE); + RNA_def_property_flag(prop, PROP_NEVER_NULL); + RNA_def_property_struct_type(prop, "GreasePencilGrid"); + RNA_def_property_ui_text( + prop, "Grid Settings", "Settings for grid and canvas in the 3D viewport"); + + rna_def_gpencil_grid(brna); + + /* API Functions */ + func = RNA_def_function(srna, "clear", "rna_GPencil_clear"); + RNA_def_function_ui_description(func, "Remove all the Grease Pencil data"); } /* --- */ void RNA_def_gpencil(BlenderRNA *brna) { - rna_def_gpencil_data(brna); + rna_def_gpencil_data(brna); - rna_def_gpencil_layer(brna); - rna_def_gpencil_frame(brna); + rna_def_gpencil_layer(brna); + rna_def_gpencil_frame(brna); - rna_def_gpencil_stroke(brna); - rna_def_gpencil_stroke_point(brna); - rna_def_gpencil_triangle(brna); + rna_def_gpencil_stroke(brna); + rna_def_gpencil_stroke_point(brna); + rna_def_gpencil_triangle(brna); - rna_def_gpencil_mvert_group(brna); + rna_def_gpencil_mvert_group(brna); } #endif |