Grease Pencil: Lock current frame option
authorJoshua Leung <aligorith@gmail.com>
Fri, 8 Jan 2010 01:39:41 +0000 (01:39 +0000)
committerJoshua Leung <aligorith@gmail.com>
Fri, 8 Jan 2010 01:39:41 +0000 (01:39 +0000)
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
source/blender/blenkernel/intern/gpencil.c
source/blender/editors/gpencil/gpencil_buttons.c
source/blender/makesdna/DNA_gpencil_types.h
source/blender/makesrna/intern/rna_gpencil.c

index 40e1859ade2457ff2a4d35a283ae76eddf63cba9..cf8af56a5a926a4439967bb6325e1147bb9a2990 100644 (file)
@@ -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 */
 
index 5023d87cef801a426c4c7df816452e74a1478fc4..8a933ba5289b3d11cbf94559ce394a986d92b812 100644 (file)
@@ -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) 
index a63573b53814ec573473efee0a056e40424d2866..59ad4124a95d4a51ae9990c995c24056d9e432ad 100644 (file)
@@ -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);
index 332442b9f42c13f8ba33d1aa9f05d3c6076fe444..00afd687f79b457f46198e8e410f0b9114320302 100644 (file)
@@ -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' */
index 87cf9502c6946b59c69d5d8a5c6d2142aad97ac7..30591efc481496b0728ad18cbd9ceeb12ebae7ce 100644 (file)
@@ -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");