Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/sculpt_paint/paint_ops.c')
-rw-r--r--source/blender/editors/sculpt_paint/paint_ops.c251
1 files changed, 209 insertions, 42 deletions
diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c
index 979b6508b16..3b4b828d0f6 100644
--- a/source/blender/editors/sculpt_paint/paint_ops.c
+++ b/source/blender/editors/sculpt_paint/paint_ops.c
@@ -19,14 +19,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/sculpt_paint/paint_ops.c
+ * \ingroup edsculpt
+ */
+
+
#include "BLI_utildefines.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_brush_types.h"
#include "BKE_brush.h"
#include "BKE_context.h"
#include "BKE_paint.h"
+#include "BKE_main.h"
#include "ED_sculpt.h"
#include "ED_screen.h"
@@ -37,12 +44,14 @@
#include "RNA_access.h"
#include "RNA_define.h"
+#include "RNA_enum_types.h"
#include "paint_intern.h"
#include "sculpt_intern.h"
#include <string.h>
//#include <stdio.h>
+#include <stddef.h>
/* Brush operators */
static int brush_add_exec(bContext *C, wmOperator *UNUSED(op))
@@ -106,7 +115,7 @@ static int brush_scale_size_exec(bContext *C, wmOperator *op)
{
float unprojected_radius= scalar*brush_unprojected_radius(brush);
- if (unprojected_radius < 0.001) // XXX magic number
+ if (unprojected_radius < 0.001f) // XXX magic number
unprojected_radius= 0.001f;
brush_set_unprojected_radius(brush, unprojected_radius);
@@ -186,6 +195,148 @@ static void BRUSH_OT_reset(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+/* generic functions for setting the active brush based on the tool */
+static Brush *brush_tool_cycle(Main *bmain, Brush *brush_orig, const int tool, const size_t tool_offset, const int ob_mode)
+{
+ struct Brush *brush;
+
+ if(!brush_orig && !(brush_orig= bmain->brush.first)) {
+ return NULL;
+ }
+
+ /* get the next brush with the active tool */
+ for( brush= brush_orig->id.next ? brush_orig->id.next : bmain->brush.first;
+ brush != brush_orig;
+ brush= brush->id.next ? brush->id.next : bmain->brush.first)
+ {
+ if( (brush->ob_mode & ob_mode) &&
+ (*(((char *)brush) + tool_offset) == tool)
+ ) {
+ return brush;
+ }
+ }
+
+ return NULL;
+
+}
+
+static int brush_generic_tool_set(Main *bmain, Paint *paint, const int tool, const size_t tool_offset, const int ob_mode)
+{
+ struct Brush *brush, *brush_orig= paint_brush(paint);
+
+ brush= brush_tool_cycle(bmain, brush_orig, tool, tool_offset, ob_mode);
+
+ if(brush) {
+ paint_brush_set(paint, brush);
+ WM_main_add_notifier(NC_BRUSH|NA_EDITED, brush);
+ return OPERATOR_FINISHED;
+ }
+ else {
+ return OPERATOR_CANCELLED;
+ }
+}
+
+static int brush_sculpt_tool_set_exec(bContext *C, wmOperator *op)
+{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
+
+ return brush_generic_tool_set(bmain, &scene->toolsettings->sculpt->paint, RNA_enum_get(op->ptr, "tool"), offsetof(Brush, sculpt_tool), OB_MODE_SCULPT);
+}
+
+static void BRUSH_OT_sculpt_tool_set(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Sculpt Tool Set";
+ ot->description= "Set the sculpt tool";
+ ot->idname= "BRUSH_OT_sculpt_tool_set";
+
+ /* api callbacks */
+ ot->exec= brush_sculpt_tool_set_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* props */
+ ot->prop= RNA_def_enum(ot->srna, "tool", brush_sculpt_tool_items, 0, "Tool", "");
+}
+
+static int brush_vertex_tool_set_exec(bContext *C, wmOperator *op)
+{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
+
+ return brush_generic_tool_set(bmain, &scene->toolsettings->vpaint->paint, RNA_enum_get(op->ptr, "tool"), offsetof(Brush, vertexpaint_tool), OB_MODE_VERTEX_PAINT);
+}
+
+static void BRUSH_OT_vertex_tool_set(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Vertex Paint Tool Set";
+ ot->description= "Set the vertex paint tool";
+ ot->idname= "BRUSH_OT_vertex_tool_set";
+
+ /* api callbacks */
+ ot->exec= brush_vertex_tool_set_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* props */
+ ot->prop= RNA_def_enum(ot->srna, "tool", brush_vertex_tool_items, 0, "Tool", "");
+}
+
+static int brush_weight_tool_set_exec(bContext *C, wmOperator *op)
+{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
+ /* vertexpaint_tool is used for weight paint mode */
+ return brush_generic_tool_set(bmain, &scene->toolsettings->wpaint->paint, RNA_enum_get(op->ptr, "tool"), offsetof(Brush, vertexpaint_tool), OB_MODE_WEIGHT_PAINT);
+}
+
+static void BRUSH_OT_weight_tool_set(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Weight Paint Tool Set";
+ ot->description= "Set the weight paint tool";
+ ot->idname= "BRUSH_OT_weight_tool_set";
+
+ /* api callbacks */
+ ot->exec= brush_weight_tool_set_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* props */
+ ot->prop= RNA_def_enum(ot->srna, "tool", brush_vertex_tool_items, 0, "Tool", "");
+}
+
+static int brush_image_tool_set_exec(bContext *C, wmOperator *op)
+{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
+
+ return brush_generic_tool_set(bmain, &scene->toolsettings->imapaint.paint, RNA_enum_get(op->ptr, "tool"), offsetof(Brush, imagepaint_tool), OB_MODE_TEXTURE_PAINT);
+}
+
+static void BRUSH_OT_image_tool_set(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Image Paint Tool Set";
+ ot->description= "Set the image tool";
+ ot->idname= "BRUSH_OT_image_tool_set";
+
+ /* api callbacks */
+ ot->exec= brush_image_tool_set_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* props */
+ ot->prop= RNA_def_enum(ot->srna, "tool", brush_image_tool_items, 0, "Tool", "");
+}
+
+
/**************************** registration **********************************/
void ED_operatortypes_paint(void)
@@ -196,6 +347,12 @@ void ED_operatortypes_paint(void)
WM_operatortype_append(BRUSH_OT_curve_preset);
WM_operatortype_append(BRUSH_OT_reset);
+ /* note, particle uses a different system, can be added with existing operators in wm.py */
+ WM_operatortype_append(BRUSH_OT_sculpt_tool_set);
+ WM_operatortype_append(BRUSH_OT_vertex_tool_set);
+ WM_operatortype_append(BRUSH_OT_weight_tool_set);
+ WM_operatortype_append(BRUSH_OT_image_tool_set);
+
/* image */
WM_operatortype_append(PAINT_OT_texture_paint_toggle);
WM_operatortype_append(PAINT_OT_texture_paint_radial_control);
@@ -234,66 +391,66 @@ static void ed_keymap_paint_brush_switch(wmKeyMap *keymap, const char *mode)
{
wmKeyMapItem *kmi;
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", ONEKEY, KM_PRESS, 0, 0);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", ONEKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 0);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", TWOKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "index", 0);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", TWOKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 1);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", THREEKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "index", 1);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", THREEKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 2);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", FOURKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "index", 2);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", FOURKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 3);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", FIVEKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "index", 3);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", FIVEKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 4);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", SIXKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "index", 4);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", SIXKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 5);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", SEVENKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "index", 5);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", SEVENKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 6);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", EIGHTKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "index", 6);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", EIGHTKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 7);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", NINEKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "index", 7);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", NINEKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 8);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", ZEROKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "index", 8);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", ZEROKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 9);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", ONEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 9);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", ONEKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 10);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", TWOKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 10);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", TWOKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 11);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", THREEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 11);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", THREEKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 12);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", FOURKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 12);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", FOURKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 13);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", FIVEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 13);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", FIVEKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 14);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", SIXKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 14);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", SIXKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 15);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", SEVENKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 15);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", SEVENKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 16);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", EIGHTKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 16);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", EIGHTKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 17);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", NINEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 17);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", NINEKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 18);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", ZEROKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 18);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", ZEROKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 19);
+ RNA_int_set(kmi->ptr, "index", 19);
}
static void ed_keymap_paint_brush_size(wmKeyMap *keymap, const char *UNUSED(path))
@@ -340,6 +497,16 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
ed_keymap_paint_brush_switch(keymap, "sculpt");
ed_keymap_paint_brush_size(keymap, "tool_settings.sculpt.brush.size");
+ RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_sculpt_tool_set", DKEY, KM_PRESS, 0, 0)->ptr, "tool", SCULPT_TOOL_DRAW);
+ RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_sculpt_tool_set", SKEY, KM_PRESS, 0, 0)->ptr, "tool", SCULPT_TOOL_SMOOTH);
+ RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_sculpt_tool_set", PKEY, KM_PRESS, 0, 0)->ptr, "tool", SCULPT_TOOL_PINCH);
+ RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_sculpt_tool_set", IKEY, KM_PRESS, 0, 0)->ptr, "tool", SCULPT_TOOL_INFLATE);
+ RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_sculpt_tool_set", GKEY, KM_PRESS, 0, 0)->ptr, "tool", SCULPT_TOOL_GRAB);
+ RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_sculpt_tool_set", LKEY, KM_PRESS, 0, 0)->ptr, "tool", SCULPT_TOOL_LAYER);
+ RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_sculpt_tool_set", TKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "tool", SCULPT_TOOL_FLATTEN); /* was just TKEY in 2.4x */
+ RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_sculpt_tool_set", CKEY, KM_PRESS, 0, 0)->ptr, "tool", SCULPT_TOOL_CLAY);
+ RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_sculpt_tool_set", CKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "tool", SCULPT_TOOL_CREASE);
+
/* */
kmi = WM_keymap_add_item(keymap, "WM_OT_context_menu_enum", AKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush.stroke_method");
@@ -410,7 +577,7 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
ed_keymap_paint_brush_size(keymap, "tool_settings.image_paint.brush.size");
kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0); /* mask toggle */
- RNA_string_set(kmi->ptr, "data_path", "texture_paint_object.data.use_paint_mask");
+ RNA_string_set(kmi->ptr, "data_path", "image_paint_object.data.use_paint_mask");
/* face-mask mode */
keymap= WM_keymap_find(keyconf, "Face Mask", 0, 0);