Merge branch 'blender-v2.93-release'
authorFalk David <falkdavid@gmx.de>
Wed, 26 May 2021 14:34:03 +0000 (16:34 +0200)
committerFalk David <falkdavid@gmx.de>
Wed, 26 May 2021 14:34:03 +0000 (16:34 +0200)
1  2 
source/blender/blenkernel/intern/gpencil.c

index 421cb0ac4f1d99a1f6e6141cc74f8fc4bb037d32,182d06f8f72a2b86667d31289e11da22d9325a6c..ea3782c274a8c699159e1646ff1f4a413f125e70
@@@ -653,13 -653,9 +653,13 @@@ bGPDframe *BKE_gpencil_frame_addcopy(bG
   * \param gpd: Grease pencil data-block
   * \param name: Name of the layer
   * \param setactive: Set as active
 + * \param add_to_header: Used to force the layer added at header
   * \return Pointer to new layer
   */
 -bGPDlayer *BKE_gpencil_layer_addnew(bGPdata *gpd, const char *name, bool setactive)
 +bGPDlayer *BKE_gpencil_layer_addnew(bGPdata *gpd,
 +                                    const char *name,
 +                                    const bool setactive,
 +                                    const bool add_to_header)
  {
    bGPDlayer *gpl = NULL;
    bGPDlayer *gpl_active = NULL;
    gpl_active = BKE_gpencil_layer_active_get(gpd);
  
    /* Add to data-block. */
 -  if (gpl_active == NULL) {
 -    BLI_addtail(&gpd->layers, gpl);
 +  if (add_to_header) {
 +    BLI_addhead(&gpd->layers, gpl);
    }
    else {
 -    /* if active layer, add after that layer */
 -    BLI_insertlinkafter(&gpd->layers, gpl_active, gpl);
 +    if (gpl_active == NULL) {
 +      BLI_addtail(&gpd->layers, gpl);
 +    }
 +    else {
 +      /* if active layer, add after that layer */
 +      BLI_insertlinkafter(&gpd->layers, gpl_active, gpl);
 +    }
    }
 -
    /* annotation vs GP Object behavior is slightly different */
    if (gpd->flag & GP_DATA_ANNOTATIONS) {
      /* set default color of new strokes for this layer */
@@@ -2667,6 -2659,7 +2667,7 @@@ void BKE_gpencil_visible_stroke_iter(Vi
      bGPDframe *act_gpf = gpl->actframe;
      bGPDframe *sta_gpf = act_gpf;
      bGPDframe *end_gpf = act_gpf ? act_gpf->next : NULL;
+     float prev_opacity = gpl->opacity;
  
      if (gpl->flag & GP_LAYER_HIDE) {
        continue;
       * This is used only in final render and never in Viewport. */
      if ((view_layer != NULL) && (gpl->viewlayername[0] != '\0') &&
          (!STREQ(view_layer->name, gpl->viewlayername))) {
-       /* If the layer is used as mask, cannot be filtered or the masking system
-        * will crash because needs the mask layer in the draw pipeline. */
-       if (!gpencil_is_layer_mask(view_layer, gpd, gpl)) {
+       /* Do not skip masks when rendering the viewlayer so that it can still be used to clip
+        * other layers. Instead set their opacity to zero. */
+       if (gpencil_is_layer_mask(view_layer, gpd, gpl)) {
+         gpl->opacity = 0.0f;
+       }
+       else {
          continue;
        }
      }
        if (layer_cb) {
          layer_cb(gpl, act_gpf, NULL, thunk);
        }
+       gpl->opacity = prev_opacity;
        continue;
      }
  
        /* If layer solo mode and Paint mode, only keyframes with data are displayed. */
        if (GPENCIL_PAINT_MODE(gpd) && (gpl->flag & GP_LAYER_SOLO_MODE) &&
            (act_gpf->framenum != cfra)) {
+         gpl->opacity = prev_opacity;
          continue;
        }
  
          stroke_cb(gpl, act_gpf, gps, thunk);
        }
      }
+     /* Restore the opacity in case it was overwritten (used to hide masks in render). */
+     gpl->opacity = prev_opacity;
    }
  }