[Bf-blender-cvs] [987b60100ae] greasepencil-object: Merge branch 'blender2.8' into greasepencil-object
Antonio Vazquez
noreply at git.blender.org
Fri Apr 6 10:37:37 CEST 2018
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. @@
More information about the Bf-blender-cvs
mailing list