Commit: 071ec918f4cd55b1615ba5acbdffc8e14c738cfe
Author: julianeisel
Date:   Sat Dec 20 16:18:18 2014 +0100
Branches: master
https://developer.blender.org/rB071ec918f4cd55b1615ba5acbdffc8e14c738cfe

Fix T42961: GPencil - Refactor object/scene data behaviour

D937 with minor edits (whitespace only)

@aligorith, I double checked everything runs smoothly, blame me if I missed 
something ;). Sorry for just taking the initiative and committing without 
talking to you, but I wasn't able to catch you the last days. This should be 
fixed before the release IMHO, but I don't think it's important enough to be 
committed during BCon5, so sorry again, but hopefully everything is okay :)

===================================================================

M       source/blender/editors/gpencil/drawgpencil.c
M       source/blender/editors/gpencil/gpencil_edit.c
M       source/blender/editors/include/ED_gpencil.h
M       source/blender/editors/render/render_opengl.c

===================================================================

diff --git a/source/blender/editors/gpencil/drawgpencil.c 
b/source/blender/editors/gpencil/drawgpencil.c
index 66a47a5..ac0ad20 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -946,45 +946,31 @@ static void gp_draw_onionskins(bGPDlayer *gpl, bGPDframe 
*gpf, int offsx, int of
        glColor4fv(gpl->color);
 }
 
-/* draw grease-pencil datablock */
-static void gp_draw_data(bGPdata *gpd, int offsx, int offsy, int winx, int 
winy, int cfra, int dflag)
+/* loop over gpencil data layers, drawing them */
+static void gp_draw_data_layers(bGPdata *gpd, int offsx, int offsy, int winx, 
int winy, int cfra, int dflag)
 {
        bGPDlayer *gpl;
-       
-       /* reset line drawing style (in case previous user didn't reset) */
-       setlinestyle(0);
-       
-       /* turn on smooth lines (i.e. anti-aliasing) */
-       glEnable(GL_LINE_SMOOTH);
-       
-       glEnable(GL_POLYGON_SMOOTH);
-       glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
-       
-       /* turn on alpha-blending */
-       glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, 
GL_ONE_MINUS_SRC_ALPHA);
-       glEnable(GL_BLEND);
-               
-       /* loop over layers, drawing them */
+
        for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {
                bGPDframe *gpf;
-               
+
                bool debug = (gpl->flag & GP_LAYER_DRAWDEBUG) ? true : false;
                short lthick = gpl->thickness;
-               
+
                /* don't draw layer if hidden */
-               if (gpl->flag & GP_LAYER_HIDE) 
+               if (gpl->flag & GP_LAYER_HIDE)
                        continue;
-               
+
                /* get frame to draw */
                gpf = gpencil_layer_getframe(gpl, cfra, 0);
-               if (gpf == NULL) 
+               if (gpf == NULL)
                        continue;
-               
+
                /* set color, stroke thickness, and point size */
                glLineWidth(lthick);
                glPointSize((float)(gpl->thickness + 2));
-               
-               /* Add layer drawing settings to the set of "draw flags" 
+
+               /* Add layer drawing settings to the set of "draw flags"
                 * NOTE: If the setting doesn't apply, it *must* be cleared,
                 *       as dflag's carry over from the previous layer
                 */
@@ -992,18 +978,18 @@ static void gp_draw_data(bGPdata *gpd, int offsx, int 
offsy, int winx, int winy,
                        if (condition) dflag |= (draw_flag_value);      \
                        else           dflag &= ~(draw_flag_value);     \
                } (void)0
-               
+
                /* xray... */
                GP_DRAWFLAG_APPLY((gpl->flag & GP_LAYER_NO_XRAY), 
GP_DRAWDATA_NO_XRAY);
-               
+
                /* volumetric strokes... */
                GP_DRAWFLAG_APPLY((gpl->flag & GP_LAYER_VOLUMETRIC), 
GP_DRAWDATA_VOLUMETRIC);
-               
+
                /* fill strokes... */
                // XXX: this is not a very good limit
                GP_DRAWFLAG_APPLY((gpl->fill[3] > 0.001f), GP_DRAWDATA_FILL);
 #undef GP_DRAWFLAG_APPLY
-               
+
                /* draw 'onionskins' (frame left + right) */
                if ((gpl->flag & GP_LAYER_ONIONSKIN) && !(dflag & 
GP_DRAWDATA_NO_ONIONS)) {
                        /* Drawing method - only immediately surrounding (gstep 
= 0),
@@ -1011,11 +997,11 @@ static void gp_draw_data(bGPdata *gpd, int offsx, int 
offsy, int winx, int winy,
                         */
                        gp_draw_onionskins(gpl, gpf, offsx, offsy, winx, winy, 
cfra, dflag, debug, lthick);
                }
-               
+
                /* draw the strokes already in active frame */
                gp_draw_strokes(gpf, offsx, offsy, winx, winy, dflag, debug, 
lthick, gpl->color, gpl->fill);
-               
-               /* Draw verts of selected strokes 
+
+               /* Draw verts of selected strokes
                 *  - when doing OpenGL renders, we don't want to be showing 
these, as that ends up flickering
                 *      - locked layers can't be edited, so there's no point 
showing these verts
                 *    as they will have no bearings on what gets edited
@@ -1024,13 +1010,13 @@ static void gp_draw_data(bGPdata *gpd, int offsx, int 
offsy, int winx, int winy,
                 */
                /* XXX: perhaps we don't want to show these when users are 
drawing... */
                if ((G.f & G_RENDER_OGL) == 0 &&
-                   (gpl->flag & GP_LAYER_LOCKED) == 0 && 
+                   (gpl->flag & GP_LAYER_LOCKED) == 0 &&
                    (gpd->flag & GP_DATA_STROKE_EDITMODE))
                {
-                       gp_draw_strokes_edit(gpf, offsx, offsy, winx, winy, 
dflag, 
+                       gp_draw_strokes_edit(gpf, offsx, offsy, winx, winy, 
dflag,
                                             (gpl->color[3] < 0.95f) ? 
gpl->color : NULL);
                }
-               
+
                /* Check if may need to draw the active stroke cache, only if 
this layer is the active layer
                 * that is being edited. (Stroke buffer is currently stored in 
gp-data)
                 */
@@ -1039,7 +1025,7 @@ static void gp_draw_data(bGPdata *gpd, int offsx, int 
offsy, int winx, int winy,
                {
                        /* Set color for drawing buffer stroke - since this may 
not be set yet */
                        glColor4fv(gpl->color);
-                       
+
                        /* Buffer stroke needs to be drawn with a different 
linestyle
                         * to help differentiate them from normal strokes.
                         * 
@@ -1054,12 +1040,51 @@ static void gp_draw_data(bGPdata *gpd, int offsx, int 
offsy, int winx, int winy,
                        }
                }
        }
-       
+}
+
+/* draw grease-pencil datablock */
+static void gp_draw_data(Scene *scene, bGPdata *gpd, int offsx, int offsy, int 
winx, int winy,
+                         int cfra, int dflag, const char spacetype)
+{
+       /* reset line drawing style (in case previous user didn't reset) */
+       setlinestyle(0);
+
+       /* turn on smooth lines (i.e. anti-aliasing) */
+       glEnable(GL_LINE_SMOOTH);
+
+       glEnable(GL_POLYGON_SMOOTH);
+       glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
+
+       /* turn on alpha-blending */
+       glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, 
GL_ONE_MINUS_SRC_ALPHA);
+       glEnable(GL_BLEND);
+
+       /* draw! */
+       gp_draw_data_layers(gpd, offsx, offsy, winx, winy, cfra, dflag);
+       /* if stroke's source is an object (3d view) or a track (movieclip),
+        * we also want to draw the strokes coming from the scene/clip */
+       if (scene) {
+               bGPdata *gpd_source = NULL;
+
+               if (spacetype == SPACE_VIEW3D) {
+                       gpd_source = (scene->gpd ? scene->gpd : NULL);
+               }
+               else if (spacetype == SPACE_CLIP && scene->clip) {
+                       /* currently drawing only gpencil data from either clip 
or track not both - XXX fix logic behind */
+                       gpd_source = (scene->clip->gpd ? scene->clip->gpd : 
NULL);
+               }
+
+               /* if gpd_source == gpd, we've already drawn it above and 
nothing needs to be done here */
+               if (gpd_source && gpd_source != gpd) {
+                       gp_draw_data_layers(gpd_source, offsx, offsy, winx, 
winy, cfra, dflag);
+               }
+       }
+
        /* turn off alpha blending, then smooth lines */
        glDisable(GL_BLEND); // alpha blending
        glDisable(GL_LINE_SMOOTH); // smooth lines
        glDisable(GL_POLYGON_SMOOTH); // smooth poly lines
-               
+
        /* restore initial gl conditions */
        glLineWidth(1.0);
        glPointSize(1.0);
@@ -1131,7 +1156,7 @@ void ED_gpencil_draw_2dimage(const bContext *C)
        
        
        /* draw it! */
-       gp_draw_data(gpd, offsx, offsy, sizex, sizey, CFRA, dflag);
+       gp_draw_data(scene, gpd, offsx, offsy, sizex, sizey, CFRA, dflag, 
sa->spacetype);
 }
 
 /* draw grease-pencil sketches to specified 2d-view assuming that matrices are 
already set correctly 
@@ -1157,7 +1182,7 @@ void ED_gpencil_draw_view2d(const bContext *C, bool 
onlyv2d)
        
        /* draw it! */
        if (onlyv2d) dflag |= (GP_DRAWDATA_ONLYV2D | GP_DRAWDATA_NOSTATUS);
-       gp_draw_data(gpd, 0, 0, ar->winx, ar->winy, CFRA, dflag);
+       gp_draw_data(scene, gpd, 0, 0, ar->winx, ar->winy, CFRA, dflag, 
sa->spacetype);
 }
 
 /* draw grease-pencil sketches to specified 3d-view assuming that matrices are 
already set correctly 
@@ -1195,14 +1220,14 @@ void ED_gpencil_draw_view3d(Scene *scene, View3D *v3d, 
ARegion *ar, bool only3d)
        /* draw it! */
        if (only3d) dflag |= (GP_DRAWDATA_ONLY3D | GP_DRAWDATA_NOSTATUS);
 
-       gp_draw_data(gpd, offsx, offsy, winx, winy, CFRA, dflag);
+       gp_draw_data(scene, gpd, offsx, offsy, winx, winy, CFRA, dflag, 
v3d->spacetype);
 }
 
-void ED_gpencil_draw_ex(bGPdata *gpd, int winx, int winy, const int cfra)
+void ED_gpencil_draw_ex(Scene *scene, bGPdata *gpd, int winx, int winy, const 
int cfra, const char spacetype)
 {
        int dflag = GP_DRAWDATA_NOSTATUS | GP_DRAWDATA_ONLYV2D;
 
-       gp_draw_data(gpd, 0, 0, winx, winy, cfra, dflag);
+       gp_draw_data(scene, gpd, 0, 0, winx, winy, cfra, dflag, spacetype);
 }
 
 /* ************************************************** */
diff --git a/source/blender/editors/gpencil/gpencil_edit.c 
b/source/blender/editors/gpencil/gpencil_edit.c
index 2cffea0..63f3491 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -101,9 +101,10 @@ bGPdata **ED_gpencil_data_get_pointers_direct(ID 
*screen_id, Scene *scene, ScrAr
                        case SPACE_VIEW3D: /* 3D-View */
                        case SPACE_TIME: /* Timeline - XXX: this is a hack to 
get it to show GP keyframes for 3D view */
                        {
-                               const char gpencil_src = (scene) ? 
scene->toolsettings->gpencil_src : GP_TOOL_SOURCE_SCENE;
-                               
-                               if (gpencil_src == GP_TOOL_SOURCE_OBJECT) {
+                               BLI_assert(scene && 
ELEM(scene->toolsettings->gpencil_src,
+                                                        GP_TOOL_SOURCE_SCENE, 
GP_TOOL_SOURCE_OBJECT));
+
+                               if (scene->toolsettings->gpencil_src == 
GP_TOOL_SOURCE_OBJECT) {
                                        /* legacy behaviour for usage with old 
addons requiring object-linked to objects */
                                        
                                        /* just in case no active/selected 
object... */
@@ -113,32 +114,10 @@ bGPdata **ED_gpencil_data_get_pointers_direct(ID 
*screen_id, Scene *scene, ScrAr
                                                return &ob->gpd;
                                        }
                                        /* else: defaults to scene... */
-                               }                               
+                               }
                                else {
-                                       /* prefer to use scene's data, unless 
it doesn't exist (and object's does instead) */
-                                       bool scene_ok = (scene != NULL);
-                                       bool ob_ok    = ((ob) && (ob->flag & 
SELECT) && (ob->gpd));
-                                       
-                                       if (ob_ok || !scene_ok) {
-                                               /* Object Case (not good for 
users):
-                                                * - For existing files with 
object-level already, 
-                                                *   or where user has 
explicitly assigned to object,
-                                                *   we can use the object as 
the host...
-                                                *
-                                                * - If there is no scene data 
provided (rare/impossible)
-                                                *   we will also be forced to 
use the object
-                                                */
-                                               if (ptr) 
RNA_id_pointer_create((ID *)ob, ptr);
-                                               return &ob->gpd;
-                                       }
-                                       else {
-                                               /* Scene Case (default):
-                                                * This is the new (as of 
2014-Oct-13, for 2.73) default setting
-                                                * which should work better for 
most users.
-                                                */
-                                               if (ptr) 
RNA_id_pointer_create((ID *)scene, ptr);
-                                               return &scene->gpd;
-                                       }
+                                       if (ptr) 
RNA_id_pointer_create(&scene->id, ptr);
+                                       return &scene->gpd;
                                }
                                break;
                        }
diff --git a/source/blender/editors/include/ED_gpencil.h 
b/source/blender/editors/

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to