Commit: 987b60100ae9d4b6dc4bd0afe61b453849a20535
Author: Antonio Vazquez
Date:   Fri Apr 6 10:14:12 2018 +0200
Branches: greasepencil-object
https://developer.blender.org/rB987b60100ae9d4b6dc4bd0afe61b453849a20535

Merge branch 'blender2.8' into greasepencil-object

 Conflicts:
        source/blender/editors/object/object_edit.c
        source/blender/editors/object/object_modes.c
        source/blender/makesrna/intern/rna_brush.c

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



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

diff --cc source/blender/blenkernel/intern/paint.c
index 174b51e45d9,20375fe6953..7928e48a61c
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@@ -651,59 -454,9 +609,59 @@@ bool BKE_palette_is_empty(const struct 
        return BLI_listbase_is_empty(&palette->colors);
  }
  
 +/* get the palettecolor looking by name */
 +PaletteColor *BKE_palette_color_getbyname(Palette *palette, char *name)
 +{
 +      /* error checking */
 +      if (ELEM(NULL, palette, name)) {
 +              return NULL;
 +      }
 +
 +      return BLI_findstring(&palette->colors, name, offsetof(PaletteColor, 
info));
 +}
 +
 +/* get the palettecolor looking by rgb */
 +PaletteColor *BKE_gpencil_palettecolor_getbyrgb(Palette *palette, float 
rgb[3])
 +{
 +      PaletteColor *palcolor;
 +
 +      /* error checking */
 +      if (ELEM(NULL, palette, palette->colors.first)) {
 +              return NULL;
 +      }
 +      /* loop over colors until found */
 +      for (palcolor = palette->colors.first; palcolor; palcolor = 
palcolor->next) {
 +              if (equals_v3v3(palcolor->rgb, rgb)) {
 +                      return palcolor;
 +              }
 +      }
 +
 +      /* no active color found */
 +      return NULL;
 +}
 +
 +/* get the palettecolor looking by rgba */
 +PaletteColor *BKE_gpencil_palettecolor_getbyrgba(Palette *palette, float 
rgba[4])
 +{
 +      PaletteColor *palcolor;
 +
 +      /* error checking */
 +      if (ELEM(NULL, palette, palette->colors.first)) {
 +              return NULL;
 +      }
 +      /* loop over colors until found */
 +      for (palcolor = palette->colors.first; palcolor; palcolor = 
palcolor->next) {
 +              if (equals_v4v4(palcolor->rgb, rgba)) {
 +                      return palcolor;
 +              }
 +      }
 +
 +      /* no active color found */
 +      return NULL;
 +}
  
  /* are we in vertex paint or weight pain face select mode? */
- bool BKE_paint_select_face_test(Object *ob, eObjectMode object_mode)
+ bool BKE_paint_select_face_test(Object *ob)
  {
        return ( (ob != NULL) &&
                 (ob->type == OB_MESH) &&
diff --cc source/blender/draw/DRW_engine.h
index e37c225a194,cf76bfdeef5..f0bfcefe58d
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@@ -120,11 -120,8 +120,11 @@@ void DRW_draw_select_loop
          DRW_SelectPassFn select_pass_fn, void *select_pass_user_data);
  void DRW_draw_depth_loop(
          struct Depsgraph *depsgraph,
-         struct ARegion *ar, struct View3D *v3d, const eObjectMode 
object_mode);
+         struct ARegion *ar, struct View3D *v3d);
  
 +/* grease pencil render */
 +void DRW_render_gpencil(struct RenderEngine *engine, struct Depsgraph 
*depsgraph);
 +
  /* This is here because GPUViewport needs it */
  void DRW_pass_free(struct DRWPass *pass);
  struct DRWInstanceDataList *DRW_instance_data_list_create(void);
diff --cc source/blender/editors/object/object_edit.c
index c4f7c5e0da9,9306213581e..fb697755036
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@@ -1507,89 -1500,36 +1494,91 @@@ static int object_mode_set_poll(bContex
  
  static int object_mode_set_exec(bContext *C, wmOperator *op)
  {
-       WorkSpace *workspace = CTX_wm_workspace(C);
        Object *ob = CTX_data_active_object(C);
 -      bGPdata *gpd = CTX_data_gpencil_data(C);
        eObjectMode mode = RNA_enum_get(op->ptr, "mode");
-       eObjectMode restore_mode = workspace->object_mode;
+       eObjectMode restore_mode = (ob) ? ob->mode : OB_MODE_OBJECT;
        const bool toggle = RNA_boolean_get(op->ptr, "toggle");
        
 -      if (gpd) {
 -              /* GP Mode is not bound to a specific object. Therefore,
 -               * we don't want it to be actually saved on any objects,
 -               * as weirdness can happen if you select other objects,
 -               * or load old files.
 -               *
 -               * Instead, we use the following 2 rules to ensure that
 -               * the mode selector works as expected:
 -               *  1) If there's no object, we want to enter editmode.
 -               *     (i.e. with no object, we're in object mode)
 -               *  2) Otherwise, exit stroke editmode, so that we can
 -               *     enter another mode...
 -               */
 -              if (!ob || (gpd->flag & GP_DATA_STROKE_EDITMODE)) {
 -                      WM_operator_name_call(C, "GPENCIL_OT_editmode_toggle", 
WM_OP_EXEC_REGION_WIN, NULL);
 +      if (!ob || !ED_object_mode_compat_test(ob, mode))
 +              return OPERATOR_PASS_THROUGH;
 +
 +      /* if type is OB_GPENCIL, select mode for grease pencil strokes */
 +      if ((ob) && (ob->type == OB_GPENCIL)) {
 +              if (ob->data) {
 +                      bGPdata *gpd = (bGPdata *)ob->data;
 +                      /* restore status */
 +                      if ((workspace->object_mode == OB_MODE_OBJECT) &&
 +                              ((workspace->object_mode != mode) || (mode == 
OB_MODE_OBJECT)) &&
 +                              (mode != OB_MODE_EDIT))
 +                      {
 +                              if (gpd->flag & GP_DATA_STROKE_EDITMODE) {
 +                                      workspace->object_mode = 
OB_MODE_GPENCIL_EDIT;
 +                                      ED_gpencil_setup_modes(C, gpd, 
workspace->object_mode);
 +                                      return OPERATOR_FINISHED;
 +                              }
 +                              else if (gpd->flag & GP_DATA_STROKE_PAINTMODE) {
 +                                      workspace->object_mode = 
OB_MODE_GPENCIL_PAINT;
 +                                      ED_gpencil_setup_modes(C, gpd, 
workspace->object_mode);
 +                                      return OPERATOR_FINISHED;
 +                              }
 +                              else if (gpd->flag & GP_DATA_STROKE_SCULPTMODE) 
{
 +                                      workspace->object_mode = 
OB_MODE_GPENCIL_SCULPT;
 +                                      ED_gpencil_setup_modes(C, gpd, 
workspace->object_mode);
 +                                      return OPERATOR_FINISHED;
 +                              }
 +                              else if (gpd->flag & GP_DATA_STROKE_WEIGHTMODE) 
{
 +                                      workspace->object_mode = 
OB_MODE_GPENCIL_WEIGHT;
 +                                      ED_gpencil_setup_modes(C, gpd, 
workspace->object_mode);
 +                                      return OPERATOR_FINISHED;
 +                              }
 +                      }
 +
 +                      /* set status */
 +                      if (ELEM(mode, OB_MODE_OBJECT, OB_MODE_EDIT, 
OB_MODE_POSE)) {
 +                              workspace->object_mode_restore = OB_MODE_OBJECT;
 +                              if (ELEM(workspace->object_mode, OB_MODE_EDIT, 
OB_MODE_GPENCIL_EDIT) || (mode == OB_MODE_EDIT)) {
 +                                      WM_operator_name_call(C, 
"GPENCIL_OT_editmode_toggle", WM_OP_EXEC_REGION_WIN, NULL);
 +                              }
 +                              if (workspace->object_mode == 
OB_MODE_GPENCIL_PAINT) {
 +                                      WM_operator_name_call(C, 
"GPENCIL_OT_paintmode_toggle", WM_OP_EXEC_REGION_WIN, NULL);
 +                              }
 +                              if (workspace->object_mode == 
OB_MODE_GPENCIL_SCULPT) {
 +                                      WM_operator_name_call(C, 
"GPENCIL_OT_sculptmode_toggle", WM_OP_EXEC_REGION_WIN, NULL);
 +                              }
 +                              if (workspace->object_mode == 
OB_MODE_GPENCIL_WEIGHT) {
 +                                      WM_operator_name_call(C, 
"GPENCIL_OT_weightmode_toggle", WM_OP_EXEC_REGION_WIN, NULL);
 +                              }
 +                              return OPERATOR_FINISHED;
 +                      }
 +                      else if (mode == OB_MODE_GPENCIL_EDIT) {
 +                              workspace->object_mode_restore = 
workspace->object_mode;
 +                              WM_operator_name_call(C, 
"GPENCIL_OT_editmode_toggle", WM_OP_EXEC_REGION_WIN, NULL);
 +                              return OPERATOR_FINISHED;
 +                      }
 +                      else if (mode == OB_MODE_GPENCIL_PAINT) {
 +                              workspace->object_mode_restore = 
workspace->object_mode;
 +                              WM_operator_name_call(C, 
"GPENCIL_OT_paintmode_toggle", WM_OP_EXEC_REGION_WIN, NULL);
 +                              return OPERATOR_FINISHED;
 +                      }
 +                      else if (mode == OB_MODE_GPENCIL_SCULPT) {
 +                              workspace->object_mode_restore = 
workspace->object_mode;
 +                              WM_operator_name_call(C, 
"GPENCIL_OT_sculptmode_toggle", WM_OP_EXEC_REGION_WIN, NULL);
 +                              return OPERATOR_FINISHED;
 +                      }
 +                      else if (mode == OB_MODE_GPENCIL_WEIGHT) {
 +                              workspace->object_mode_restore = 
workspace->object_mode;
 +                              WM_operator_name_call(C, 
"GPENCIL_OT_weightmode_toggle", WM_OP_EXEC_REGION_WIN, NULL);
 +                              return OPERATOR_FINISHED;
 +                      }
                }
        }
+       
+       if (!ob || !ED_object_mode_compat_test(ob, mode))
+               return OPERATOR_PASS_THROUGH;
  
-       if (workspace->object_mode != mode) {
+       if (ob->mode != mode) {
                /* we should be able to remove this call, each operator calls  
*/
-               ED_object_mode_compat_set(C, workspace, mode, op->reports);
+               ED_object_mode_compat_set(C, ob, mode, op->reports);
        }
  
        /* Exit current mode if it's not the mode we're setting */
diff --cc source/blender/editors/sculpt_paint/paint_ops.c
index 15aa6848dce,004d2757a71..b0023fec640
--- a/source/blender/editors/sculpt_paint/paint_ops.c
+++ b/source/blender/editors/sculpt_paint/paint_ops.c
@@@ -40,12 -38,8 +40,10 @@@
  #include "BKE_brush.h"
  #include "BKE_context.h"
  #include "BKE_paint.h"
 +#include "BKE_gpencil.h"
  #include "BKE_main.h"
 +#include "BKE_report.h"
  
- #include "DEG_depsgraph.h"
- 
  #include "ED_paint.h"
  #include "ED_screen.h"
  #include "ED_image.h"
@@@ -435,469 -259,8 +433,467 @@@ static void PALETTE_OT_color_delete(wmO
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
  }
  
 +/* ********************** Isolate palette color **************************** 
*/
 +
 +static int palettecolor_isolate_exec(bContext *C, wmOperator *op)
 +{
 +      Main *bmain = CTX_data_main(C);
 +      bGPdata *gpd = ED_gpencil_data_get_active(C);
 +      Palette *palette = BKE_palette_get_active_from_context(C);
 +
 +      PaletteColor *active_color = BKE_palette_color_get_active(palette);
 +      PaletteColor *palcolor;
 +
 +      int flags = PC_COLOR_LOCKED;
 +      bool isolate = false;
 +
 +      if (RNA_boolean_get(op->ptr, "affect_visibility"))
 +              flags |= PC_COLOR_HIDE;
 +
 +      if (ELEM(NULL, gpd, active_color)) {
 +              BKE_report(op->reports, RPT_ERROR, "No active color to 
isolate");
 +              return OPERATOR_CANCELLED;
 +      }
 +
 +      /* Test whether to isolate or clear all flags */
 +      for (palcolor = palette->colors.first; palcolor; palcolor = 
palcolor->next) {
 +              /* Skip if this is the active one */
 +              if (palcolor == active_color)
 +                      continue;
 +
 +              /* If the flags aren't set, that means that the color is
 +              * not alone, so we have some colors to isolate still
 +              */
 +              if ((palcolor->flag & flags) == 0) {
 +                      isolate = true;
 +                      break;
 +              }
 +      }
 +
 +      /* Set/Clear flags as appropriate */
 +      if (isolate) {
 +              /* Set flags on all "other" colors */
 +              for (palcolor = palette->colors.first; palcolor; palcolor = 
palcolor->next) {
 +                      if (palcolor == active_color)
 +                              continue;
 +                      else
 +                              palcolor->flag |= flags;
 +              }
 +      }
 +      else {
 +              /* Clear flags - Restore everything else */
 +              for (palcolor = palette->colors.first; palcolor; palcolor = 
palcolor->next) {
 +                      palcolor->flag &= ~flags;
 +              }
 +      }
 +
 +      /* notifiers */
 +      DEG_id_tag_update(&palette->id, OB_RECALC_DATA);
 +      WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
 +
 +      return OPERATOR_FINISHED;
 +}
 +
 +static void PALETTE_OT_palettecolor_isolate(wmOperatorType *ot)
 +{
 +      /* identifiers */
 +      ot->name = "Isolate Palette Color";
 +      ot->idname = "PALETTE_OT_palettec

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to