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