GPencil: Add option to draw new strokes on back of layer
authorAntonioya <blendergit@gmail.com>
Fri, 5 Aug 2016 21:03:51 +0000 (23:03 +0200)
committerAntonioya <blendergit@gmail.com>
Sun, 7 Aug 2016 14:45:02 +0000 (16:45 +0200)
For artist point of view is very useful to have an option to draw by
default the new strokes on back of all strokes in the layer.

release/scripts/startup/bl_ui/properties_grease_pencil_common.py
source/blender/editors/gpencil/gpencil_paint.c
source/blender/makesdna/DNA_scene_types.h
source/blender/makesrna/intern/rna_scene.c

index c80c5ca7ddd60451461dadcc927cf056868eeb8e..cabcd49891aa16a8d5707b16b7828f6febf69f33 100644 (file)
@@ -80,6 +80,7 @@ class GreasePencilDrawingToolsPanel:
         sub = col.column(align=True)
         sub.prop(context.tool_settings, "use_gpencil_additive_drawing", text="Additive Drawing")
         sub.prop(context.tool_settings, "use_gpencil_continuous_drawing", text="Continuous Drawing")
+        sub.prop(context.tool_settings, "use_gpencil_draw_onback", text="Draw on Back")
 
         col.separator()
         col.separator()
index d637affe79d13a6cc3fabf1ebeaed9fc948770cf..cebcbfe9317fdb17bc840296470bc6e119d79d23 100644 (file)
@@ -692,6 +692,7 @@ static void gp_stroke_newfrombuffer(tGPsdata *p)
        bGPDspoint *pt;
        tGPspoint *ptc;
        bGPDbrush *brush = p->brush;
+       ToolSettings *ts = p->scene->toolsettings;
        
        int i, totelem;
        /* since strokes are so fine, when using their depth we need a margin otherwise they might get missed */
@@ -925,8 +926,16 @@ static void gp_stroke_newfrombuffer(tGPsdata *p)
        gps->palcolor = palcolor;
        strcpy(gps->colorname, palcolor->info);
 
-       /* add stroke to frame */
-       BLI_addtail(&p->gpf->strokes, gps);
+       /* add stroke to frame, usually on tail of the listbase, but if on back is enabled the stroke is added on listbase head 
+       * because the drawing order is inverse and the head stroke is the first to draw. This is very useful for artist
+       * when drawing the background
+       */
+       if (ts->gpencil_flags & GP_TOOL_FLAG_PAINT_ONBACK) {
+               BLI_addhead(&p->gpf->strokes, gps);
+       }
+       else {
+               BLI_addtail(&p->gpf->strokes, gps);
+       }
        gp_stroke_added_enable(p);
 }
 
index 90e8d8b8270a08562595100ba0e25a22221f6490..a4934cc1f248aab612101b03d1be18505d720ed1 100644 (file)
@@ -2088,6 +2088,8 @@ typedef enum eGPencil_Flags {
        GP_TOOL_FLAG_PAINTSESSIONS_ON       = (1 << 0),
        /* When creating new frames, the last frame gets used as the basis for the new one */
        GP_TOOL_FLAG_RETAIN_LAST            = (1 << 1),
+       /* Add the strokes below all strokes in the layer */
+       GP_TOOL_FLAG_PAINT_ONBACK = (1 << 2)
 } eGPencil_Flags;
 
 /* toolsettings->gpencil_src */
index abac6b981997652fd903b6faf693abe7b2afe59b..156c327f97ce171cc23b8ec033574d566110ebcd 100644 (file)
@@ -2612,6 +2612,12 @@ static void rna_def_tool_settings(BlenderRNA  *brna)
                                 "are included as the basis for the new one");
        RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
        
+       prop = RNA_def_property(srna, "use_gpencil_draw_onback", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "gpencil_flags", GP_TOOL_FLAG_PAINT_ONBACK);
+       RNA_def_property_ui_text(prop, "Draw Strokes on Back",
+               "When draw new strokes, the new stroke is drawn below of all strokes in the layer");
+       RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL);
+
        prop = RNA_def_property(srna, "grease_pencil_source", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_bitflag_sdna(prop, NULL, "gpencil_src");
        RNA_def_property_enum_items(prop, gpencil_source_3d_items);