From cddd784e44c8ee4e7be535a4d105b8ebb65a304f Mon Sep 17 00:00:00 2001 From: Joshua Leung Date: Fri, 8 Jan 2010 01:39:41 +0000 Subject: [PATCH] Grease Pencil: Lock current frame option It is now possible to make Grease Pencil Layers to keep displaying and editing the current sketch-frame with this option. This allows to draw a frame which contains markings made for different times (i.e. a spacing/timing chart that you can keep adding to as you scrub to different points on the timeline). Use the clipboard/camera toggle (the one beside the visibility toggle) to enable. This should get an icon of its own at some point... --- source/blender/blenkernel/BKE_brush.h | 2 +- source/blender/blenkernel/intern/gpencil.c | 6 ++++-- source/blender/editors/gpencil/gpencil_buttons.c | 13 ++++++++----- source/blender/makesdna/DNA_gpencil_types.h | 2 ++ source/blender/makesrna/intern/rna_gpencil.c | 4 ++++ 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/source/blender/blenkernel/BKE_brush.h b/source/blender/blenkernel/BKE_brush.h index 40e1859ade2..cf8af56a5a9 100644 --- a/source/blender/blenkernel/BKE_brush.h +++ b/source/blender/blenkernel/BKE_brush.h @@ -55,7 +55,7 @@ int brush_clone_image_set_nr(struct Brush *brush, int nr); int brush_clone_image_delete(struct Brush *brush); /* brush curve */ -void brush_curve_preset(struct Brush *b, enum CurveMappingPreset preset); +void brush_curve_preset(struct Brush *b, /*enum CurveMappingPreset*/int preset); float brush_curve_strength_clamp(struct Brush *br, float p, const float len); float brush_curve_strength(struct Brush *br, float p, const float len); /* used for sculpt */ diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c index 5023d87cef8..8a933ba5289 100644 --- a/source/blender/blenkernel/intern/gpencil.c +++ b/source/blender/blenkernel/intern/gpencil.c @@ -349,8 +349,10 @@ bGPDframe *gpencil_layer_getframe (bGPDlayer *gpl, int cframe, short addnew) if (gpl->actframe) { gpf= gpl->actframe; - /* do not allow any changes to layer's active frame if layer is locked */ - if (gpl->flag & GP_LAYER_LOCKED) + /* do not allow any changes to layer's active frame if layer is locked from changes + * or if the layer has been set to stay on the current frame + */ + if (gpl->flag & (GP_LAYER_LOCKED|GP_LAYER_FRAMELOCK)) return gpf; /* do not allow any changes to actframe if frame has painting tag attached to it */ if (gpf->flag & GP_FRAME_PAINT) diff --git a/source/blender/editors/gpencil/gpencil_buttons.c b/source/blender/editors/gpencil/gpencil_buttons.c index a63573b5381..59ad4124a95 100644 --- a/source/blender/editors/gpencil/gpencil_buttons.c +++ b/source/blender/editors/gpencil/gpencil_buttons.c @@ -119,13 +119,13 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl) box= uiLayoutBox(layout); row= uiLayoutRow(box, 0); + uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_EXPAND); block= uiLayoutGetBlock(row); // err... uiBlockSetEmboss(block, UI_EMBOSSN); /* left-align ............................... */ - subrow= uiLayoutRow(row, 1); - uiLayoutSetAlignment(subrow, UI_LAYOUT_ALIGN_LEFT); + subrow= uiLayoutRow(row, 0); /* active */ icon= (gpl->flag & GP_LAYER_ACTIVE) ? ICON_RADIOBUT_ON : ICON_RADIOBUT_OFF; @@ -168,6 +168,11 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl) /* visibility button */ uiItemR(subrow, "", ICON_RESTRICT_VIEW_OFF, &ptr, "hide", 0); + /* frame locking */ + // TODO: this needs its own icons... + icon= (gpl->flag & GP_LAYER_FRAMELOCK) ? ICON_RENDER_STILL : ICON_RENDER_ANIMATION; + uiItemR(subrow, "", icon, &ptr, "frame_lock", 0); + uiBlockSetEmboss(block, UI_EMBOSS); /* name */ @@ -189,7 +194,6 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl) box= uiLayoutBox(layout); split= uiLayoutSplit(box, 0.5f, 0); - /* draw settings ---------------------------------- */ /* left column ..................... */ col= uiLayoutColumn(split, 0); @@ -259,14 +263,13 @@ static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, Poi uiItemL(col, "Drawing Settings:", 0); /* 'stick to view' option */ - //uiItemR(col, NULL, 0, &gpd_ptr, "draw_mode", 0); row= uiLayoutRow(col, 1); uiItemEnumR_string(row, NULL, 0, &gpd_ptr, "draw_mode", "VIEW"); uiItemEnumR_string(row, NULL, 0, &gpd_ptr, "draw_mode", "CURSOR"); row= uiLayoutRow(col, 1); uiItemEnumR_string(row, NULL, 0, &gpd_ptr, "draw_mode", "SURFACE"); uiItemEnumR_string(row, NULL, 0, &gpd_ptr, "draw_mode", "STROKE"); - + row= uiLayoutRow(col, 0); uiLayoutSetActive(row, (gpd->flag & (GP_DATA_DEPTH_STROKE|GP_DATA_DEPTH_VIEW)) ? 1:0); uiItemR(row, NULL, 0, &gpd_ptr, "use_stroke_endpoints", 0); diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h index 332442b9f42..00afd687f79 100644 --- a/source/blender/makesdna/DNA_gpencil_types.h +++ b/source/blender/makesdna/DNA_gpencil_types.h @@ -113,6 +113,8 @@ typedef struct bGPDlayer { #define GP_LAYER_ONIONSKIN (1<<4) /* for editing in Action Editor */ #define GP_LAYER_SELECT (1<<5) + /* current frame for layer can't be changed */ +#define GP_LAYER_FRAMELOCK (1<<6) /* Grease-Pencil Annotations - 'DataBlock' */ diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c index 87cf9502c69..30591efc481 100644 --- a/source/blender/makesrna/intern/rna_gpencil.c +++ b/source/blender/makesrna/intern/rna_gpencil.c @@ -199,6 +199,10 @@ static void rna_def_gpencil_layer(BlenderRNA *brna) RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_LOCKED); RNA_def_property_ui_text(prop, "Locked", "Layer is protected from further editing and/or frame changes."); + prop= RNA_def_property(srna, "frame_lock", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_FRAMELOCK); + RNA_def_property_ui_text(prop, "Frame Locked", "Current frame displayed by layer cannot be changed."); + 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");