[Bf-blender-cvs] [57b50982f1c] temp-gpencil-bezier-stroke-type: Merge branch 'master' into temp-gpencil-bezier-stroke-type

Falk David noreply at git.blender.org
Wed May 26 16:43:05 CEST 2021


Commit: 57b50982f1c8155351e003e426639845b688df09
Author: Falk David
Date:   Wed May 26 16:42:54 2021 +0200
Branches: temp-gpencil-bezier-stroke-type
https://developer.blender.org/rB57b50982f1c8155351e003e426639845b688df09

Merge branch 'master' into temp-gpencil-bezier-stroke-type

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



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

diff --cc release/scripts/startup/bl_ui/space_view3d.py
index bbbde2b24b2,ae18fc4fb76..3f5292b30c4
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@@ -7689,12 -7627,7 +7627,8 @@@ classes = 
      VIEW3D_MT_weight_gpencil,
      VIEW3D_MT_gpencil_animation,
      VIEW3D_MT_gpencil_simplify,
-     VIEW3D_MT_gpencil_append_active_layer,
-     VIEW3D_MT_gpencil_append_all_layers,
-     VIEW3D_MT_gpencil_append_active_material,
-     VIEW3D_MT_gpencil_append_all_materials,
      VIEW3D_MT_gpencil_autoweights,
 +    VIEW3D_PT_gpencil_curve_fit,
      VIEW3D_MT_gpencil_edit_context_menu,
      VIEW3D_MT_edit_curve,
      VIEW3D_MT_edit_curve_ctrlpoints,
diff --cc source/blender/editors/gpencil/CMakeLists.txt
index 6441a14b807,bff7310e9f7..83ba519c4c7
--- a/source/blender/editors/gpencil/CMakeLists.txt
+++ b/source/blender/editors/gpencil/CMakeLists.txt
@@@ -41,8 -41,8 +41,9 @@@ set(SR
    gpencil_add_monkey.c
    gpencil_add_stroke.c
    gpencil_armature.c
+   gpencil_bake_animation.c
    gpencil_convert.c
 +  gpencil_curve_draw.c
    gpencil_data.c
    gpencil_edit.c
    gpencil_edit_curve.c
diff --cc source/blender/editors/gpencil/gpencil_edit.c
index c90d255c413,e65afa1abff..170bbc687d1
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@@ -4693,12 -4538,15 +4693,15 @@@ static int gpencil_stroke_separate_exec
    bGPdata *gpd_dst = NULL;
    bGPDlayer *gpl_dst = NULL;
    bGPDframe *gpf_dst = NULL;
 -  bGPDspoint *pt;
    Material *ma = NULL;
 -  int i, idx;
 +  int idx;
  
    eGP_SeparateModes mode = RNA_enum_get(op->ptr, "mode");
 +  const bool keep_ends = RNA_boolean_get(op->ptr, "keep_ends");
  
+   const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd_src);
+   const bool is_curve_edit = (bool)GPENCIL_CURVE_EDIT_SESSIONS_ON(gpd_src);
+ 
    /* sanity checks */
    if (ELEM(NULL, gpd_src)) {
      return OPERATOR_CANCELLED;
@@@ -4757,199 -4613,67 +4775,206 @@@
              if (ED_gpencil_stroke_material_editable(ob, gpl, gps) == false) {
                continue;
              }
 +
+             /* Separate selected strokes. */
 -            if (gps->flag & GP_STROKE_SELECT) {
 -              /* add layer if not created before */
 -              if (gpl_dst == NULL) {
 -                gpl_dst = BKE_gpencil_layer_addnew(gpd_dst, gpl->info, false, false);
 -              }
+ 
 -              /* add frame if not created before */
 -              if (gpf_dst == NULL) {
 -                gpf_dst = BKE_gpencil_layer_frame_get(gpl_dst, gpf->framenum, GP_GETFRAME_ADD_NEW);
 -              }
++            /* add layer if not created before */
++            if (gpl_dst == NULL) {
++              gpl_dst = BKE_gpencil_layer_addnew(gpd_dst, gpl->info, false, false);
++            }
++
 +            /* add layer if not created before */
 +            if (gpl_dst == NULL) {
 +              gpl_dst = BKE_gpencil_layer_addnew(gpd_dst, gpl->info, false);
 +            }
 +
 +            /* add frame if not created before */
 +            if (gpf_dst == NULL) {
 +              gpf_dst = BKE_gpencil_layer_frame_get(gpl_dst, gpf->framenum, GP_GETFRAME_ADD_NEW);
 +            }
 +
 +            /* add duplicate materials */
 +
 +            /* XXX same material can be in multiple slots. */
 +            ma = BKE_gpencil_material(ob, gps->mat_nr + 1);
 +
 +            idx = BKE_gpencil_object_material_ensure(bmain, ob_dst, ma);
 +
 +            /* selected points mode */
 +            if (mode == GP_SEPARATE_POINT) {
 +              /* make copy of source stroke */
 +              bGPDstroke *gps_dst = BKE_gpencil_stroke_duplicate(gps, true, true);
  
 -              /* add duplicate materials */
 +              /* Reassign material. */
 +              gps_dst->mat_nr = idx;
  
 -              /* XXX same material can be in multiple slots. */
 -              ma = BKE_gpencil_material(ob, gps->mat_nr + 1);
 +              /* link to destination frame */
 +              BLI_addtail(&gpf_dst->strokes, gps_dst);
  
 -              idx = BKE_gpencil_object_material_ensure(bmain, ob_dst, ma);
 +              if (GPENCIL_STROKE_TYPE_BEZIER(gps)) {
 +                bGPDcurve *gpc_src = gps->editcurve;
 +                bGPDcurve *gpc_dst = gps_dst->editcurve;
  
 -              /* selected points mode */
 -              if (mode == GP_SEPARATE_POINT) {
 -                if (is_curve_edit) {
 -                  BKE_report(op->reports, RPT_ERROR, "Not implemented!");
 +                /* Flip the selection */
 +                for (int i = 0; i < gpc_dst->tot_curve_points; i++) {
 +                  bGPDcurve_point *cpt = &gpc_dst->curve_points[i];
 +                  BezTriple *bezt = &cpt->bezt;
 +                  if (cpt->flag & GP_CURVE_POINT_SELECT) {
 +                    cpt->flag &= ~GP_CURVE_POINT_SELECT;
 +                    BEZT_DESEL_ALL(bezt);
 +                  }
 +                  else {
 +                    cpt->flag |= GP_CURVE_POINT_SELECT;
 +                    BEZT_SEL_ALL(bezt);
 +                  }
 +                }
 +
 +                if (keep_ends) {
 +                  /* Shrink the selection in the original stroke to keep the connecting points. */
 +                  int tot_selected = 0, num_deselected = 0;
 +
 +                  bool prev_sel = false;
 +                  int i;
 +                  for (i = 0; i < gpc_src->tot_curve_points; i++) {
 +                    bGPDcurve_point *gpc_pt = &gpc_src->curve_points[i];
 +                    BezTriple *bezt = &gpc_pt->bezt;
 +                    if (gpc_pt->flag & GP_CURVE_POINT_SELECT) {
 +                      /* shrink if previous wasn't selected */
 +                      if (prev_sel == false) {
 +                        gpc_pt->flag &= ~GP_CURVE_POINT_SELECT;
 +                        BEZT_DESEL_ALL(bezt);
 +                        num_deselected++;
 +                      }
 +                      prev_sel = true;
 +                      tot_selected++;
 +                    }
 +                    else {
 +                      /* mark previous as being unselected - and hence, is trigger for shrinking */
 +                      prev_sel = false;
 +                    }
 +                  }
 +
 +                  /* Second Pass: Go in reverse order, doing the same as before (except in opposite
 +                   * order)
 +                   * - This pass covers the "before" edges of selection islands
 +                   */
 +                  prev_sel = false;
 +                  for (i = gpc_src->tot_curve_points - 1; i > 0; i--) {
 +                    bGPDcurve_point *gpc_pt = &gpc_src->curve_points[i];
 +                    BezTriple *bezt = &gpc_pt->bezt;
 +                    if (gpc_pt->flag & GP_CURVE_POINT_SELECT) {
 +                      /* shrink if previous wasn't selected */
 +                      if (prev_sel == false) {
 +                        gpc_pt->flag &= ~GP_CURVE_POINT_SELECT;
 +                        BEZT_DESEL_ALL(bezt);
 +                        num_deselected++;
 +                      }
 +                      prev_sel = true;
 +                    }
 +                    else {
 +                      /* mark previous as being unselected - and hence, is trigger for shrinking */
 +                      prev_sel = false;
 +                    }
 +                  }
 +
 +                  /* Deselect curve if all points are deselected. */
 +                  if (tot_selected - num_deselected == 0) {
 +                    gpc_src->flag &= ~GP_CURVE_SELECT;
 +                  }
                  }
 -                else {
 -                  /* make copy of source stroke */
 -                  bGPDstroke *gps_dst = BKE_gpencil_stroke_duplicate(gps, true, true);
  
 -                  /* Reassign material. */
 -                  gps_dst->mat_nr = idx;
 +                BKE_gpencil_curve_delete_tagged_points(
 +                    gpd_dst, gpf_dst, gps_dst, NULL, gpc_dst, GP_CURVE_POINT_SELECT);
 +
 +                BKE_gpencil_curve_delete_tagged_points(
 +                    gpd_src, gpf, gps, gps->next, gpc_src, GP_CURVE_POINT_SELECT);
 +              }
 +              else {
  
 -                  /* link to destination frame */
 -                  BLI_addtail(&gpf_dst->strokes, gps_dst);
 +                /* Invert selection status of all points in destination stroke */
 +                for (int i = 0; i < gps_dst->totpoints; i++) {
 +                  bGPDspoint *pt = &gps_dst->points[i];
 +                  pt->flag ^= GP_SPOINT_SELECT;
 +                }
  
 -                  /* Invert selection status of all points in destination stroke */
 -                  for (i = 0, pt = gps_dst->points; i < gps_dst->totpoints; i++, pt++) {
 -                    pt->flag ^= GP_SPOINT_SELECT;
 +                if (keep_ends) {
 +                  bGPDspoint *pt;
 +                  int i, tot_selected = 0, num_deselected = 0;
 +                  bool prev_sel;
 +
 +                  /* First Pass: Go in forward order, shrinking selection
 +                   * if previous was not selected (pre changes).
 +                   * - This pass covers the "after" edges of selection islands
 +                   */
 +                  prev_sel = false;
 +                  for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) {
 +                    if (pt->flag & GP_SPOINT_SELECT) {
 +                      /* shrink if previous wasn't selected */
 +                      if (prev_sel == false) {
 +                        pt->flag &= ~GP_SPOINT_SELECT;
 +                        num_deselected++;
 +                      }
 +                      prev_sel = true;
 +                      tot_selected++;
 +                    }
 +                    else {
 +                      /* mark previous as being unselected - and hence, is trigger for shrinking */
 +                      prev_sel = false;
 +                    }
                    }
  
 -                  /* delete selected points from destination stroke */
 -                  BKE_gpencil_stroke_delete_tagged_points(
 -                      gpd_dst, gpf_dst, gps_dst, NULL, GP

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list