Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/sculpt_paint/paint_ops.c
| Show First 20 Lines • Show All 76 Lines • ▼ Show 20 Lines | static void BRUSH_OT_add(wmOperatorType *ot) | ||||
| /* api callbacks */ | /* api callbacks */ | ||||
| ot->exec = brush_add_exec; | ot->exec = brush_add_exec; | ||||
| /* flags */ | /* flags */ | ||||
| ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; | ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; | ||||
| } | } | ||||
| static eGPBrush_Presets gpencil_get_brush_preset_from_tool(bToolRef *tool, | |||||
| enum eContextObjectMode mode) | |||||
| { | |||||
| switch (mode) { | |||||
| case CTX_MODE_PAINT_GPENCIL: { | |||||
| if (STREQ(tool->runtime->data_block, "DRAW")) { | |||||
| return GP_BRUSH_PRESET_PENCIL; | |||||
| } | |||||
| else if (STREQ(tool->runtime->data_block, "FILL")) { | |||||
| return GP_BRUSH_PRESET_FILL_AREA; | |||||
| } | |||||
| else if (STREQ(tool->runtime->data_block, "ERASE")) { | |||||
| return GP_BRUSH_PRESET_ERASER_SOFT; | |||||
| } | |||||
| else if (STREQ(tool->runtime->data_block, "TINT")) { | |||||
| return GP_BRUSH_PRESET_TINT; | |||||
| } | |||||
| break; | |||||
| } | |||||
| case CTX_MODE_SCULPT_GPENCIL: { | |||||
| if (STREQ(tool->runtime->data_block, "SMOOTH")) { | |||||
| return GP_BRUSH_PRESET_SMOOTH_STROKE; | |||||
| } | |||||
| else if (STREQ(tool->runtime->data_block, "STRENGTH")) { | |||||
| return GP_BRUSH_PRESET_STRENGTH_STROKE; | |||||
| } | |||||
| else if (STREQ(tool->runtime->data_block, "THICKNESS")) { | |||||
| return GP_BRUSH_PRESET_THICKNESS_STROKE; | |||||
| } | |||||
| else if (STREQ(tool->runtime->data_block, "GRAB")) { | |||||
| return GP_BRUSH_PRESET_GRAB_STROKE; | |||||
| } | |||||
| else if (STREQ(tool->runtime->data_block, "PUSH")) { | |||||
| return GP_BRUSH_PRESET_PUSH_STROKE; | |||||
| } | |||||
| else if (STREQ(tool->runtime->data_block, "TWIST")) { | |||||
| return GP_BRUSH_PRESET_TWIST_STROKE; | |||||
| } | |||||
| else if (STREQ(tool->runtime->data_block, "PINCH")) { | |||||
| return GP_BRUSH_PRESET_PINCH_STROKE; | |||||
| } | |||||
| else if (STREQ(tool->runtime->data_block, "RANDOMIZE")) { | |||||
| return GP_BRUSH_PRESET_RANDOMIZE_STROKE; | |||||
| } | |||||
| else if (STREQ(tool->runtime->data_block, "CLONE")) { | |||||
| return GP_BRUSH_PRESET_CLONE_STROKE; | |||||
| } | |||||
| break; | |||||
| } | |||||
| case CTX_MODE_WEIGHT_GPENCIL: { | |||||
| return GP_BRUSH_PRESET_DRAW_WEIGHT; | |||||
| } | |||||
| case CTX_MODE_VERTEX_GPENCIL: { | |||||
| if (STREQ(tool->runtime->data_block, "DRAW")) { | |||||
| return GP_BRUSH_PRESET_VERTEX_DRAW; | |||||
| } | |||||
| else if (STREQ(tool->runtime->data_block, "BLUR")) { | |||||
| return GP_BRUSH_PRESET_VERTEX_BLUR; | |||||
| } | |||||
| else if (STREQ(tool->runtime->data_block, "AVERAGE")) { | |||||
| return GP_BRUSH_PRESET_VERTEX_AVERAGE; | |||||
| } | |||||
| else if (STREQ(tool->runtime->data_block, "SMEAR")) { | |||||
| return GP_BRUSH_PRESET_VERTEX_SMEAR; | |||||
| } | |||||
| else if (STREQ(tool->runtime->data_block, "REPLACE")) { | |||||
| return GP_BRUSH_PRESET_VERTEX_REPLACE; | |||||
| } | |||||
| break; | |||||
| } | |||||
| default: | |||||
| return GP_BRUSH_PRESET_UNKNOWN; | |||||
| break; | |||||
| } | |||||
| return GP_BRUSH_PRESET_UNKNOWN; | |||||
| } | |||||
| static int brush_add_gpencil_exec(bContext *C, wmOperator *UNUSED(op)) | static int brush_add_gpencil_exec(bContext *C, wmOperator *UNUSED(op)) | ||||
| { | { | ||||
| // int type = RNA_enum_get(op->ptr, "type"); | Paint *paint = BKE_paint_get_active_from_context(C); | ||||
| ToolSettings *ts = CTX_data_tool_settings(C); | |||||
| Paint *paint = &ts->gp_paint->paint; | |||||
| Brush *br = BKE_paint_brush(paint); | Brush *br = BKE_paint_brush(paint); | ||||
| Main *bmain = CTX_data_main(C); | Main *bmain = CTX_data_main(C); | ||||
| if (br) { | if (br) { | ||||
| br = (Brush *)BKE_id_copy(bmain, &br->id); | br = (Brush *)BKE_id_copy(bmain, &br->id); | ||||
| } | } | ||||
| else { | else { | ||||
| br = BKE_brush_add(bmain, "Brush", OB_MODE_PAINT_GPENCIL); | /* Get the active tool to determine what type of brush is active. */ | ||||
| bScreen *screen = CTX_wm_screen(C); | |||||
| if (screen == NULL) { | |||||
| return OPERATOR_CANCELLED; | |||||
| } | |||||
| /* Init grease pencil specific data. */ | bToolRef *tool = NULL; | ||||
| LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { | |||||
| if (area->spacetype == SPACE_VIEW3D) { | |||||
| /* Check the current tool is a brush. */ | |||||
| bToolRef *tref = area->runtime.tool; | |||||
| if (tref && tref->runtime && tref->runtime->data_block[0]) { | |||||
| tool = tref; | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| if (tool == NULL) { | |||||
| return OPERATOR_CANCELLED; | |||||
| } | |||||
| /* Get Brush mode base on context mode. */ | |||||
| const enum eContextObjectMode mode = CTX_data_mode_enum(C); | |||||
| eObjectMode obmode = OB_MODE_PAINT_GPENCIL; | |||||
| switch (mode) { | |||||
| case CTX_MODE_PAINT_GPENCIL: | |||||
| obmode = OB_MODE_PAINT_GPENCIL; | |||||
| break; | |||||
| case CTX_MODE_SCULPT_GPENCIL: | |||||
| obmode = OB_MODE_SCULPT_GPENCIL; | |||||
| break; | |||||
| case CTX_MODE_WEIGHT_GPENCIL: | |||||
| obmode = OB_MODE_WEIGHT_GPENCIL; | |||||
| break; | |||||
| case CTX_MODE_VERTEX_GPENCIL: | |||||
| obmode = OB_MODE_VERTEX_GPENCIL; | |||||
| break; | |||||
| default: | |||||
| return OPERATOR_CANCELLED; | |||||
| break; | |||||
| } | |||||
| /* Get brush preset using the actual tool. */ | |||||
| eGPBrush_Presets preset = gpencil_get_brush_preset_from_tool(tool, mode); | |||||
| /* Capitalize Brush name first letter using the tool name. */ | |||||
| char name[64]; | |||||
| BLI_strncpy(name, tool->runtime->data_block, sizeof(name)); | |||||
| BLI_str_tolower_ascii(name, sizeof(name)); | |||||
| name[0] = BLI_toupper_ascii(name[0]); | |||||
| /* Create the brush and assign default values. */ | |||||
| br = BKE_brush_add(bmain, name, obmode); | |||||
| if (br) { | |||||
| BKE_brush_init_gpencil_settings(br); | BKE_brush_init_gpencil_settings(br); | ||||
| BKE_gpencil_brush_preset_set(bmain, br, preset); | |||||
| } | |||||
| } | } | ||||
| if (br) { | |||||
| id_us_min(&br->id); /* fake user only */ | id_us_min(&br->id); /* fake user only */ | ||||
| BKE_paint_brush_set(paint, br); | BKE_paint_brush_set(paint, br); | ||||
| } | |||||
| return OPERATOR_FINISHED; | return OPERATOR_FINISHED; | ||||
| } | } | ||||
| static void BRUSH_OT_add_gpencil(wmOperatorType *ot) | static void BRUSH_OT_add_gpencil(wmOperatorType *ot) | ||||
| { | { | ||||
| /* identifiers */ | /* identifiers */ | ||||
| ot->name = "Add Drawing Brush"; | ot->name = "Add Drawing Brush"; | ||||
| ▲ Show 20 Lines • Show All 1,286 Lines • Show Last 20 Lines | |||||