示例#1
0
static int brush_generic_tool_set(Main *bmain, Paint *paint, const int tool,
                                  const size_t tool_offset, const int ob_mode,
                                  const char *tool_name, int create_missing,
                                  int toggle)
{
	Brush *brush, *brush_orig = BKE_paint_brush(paint);

	if (toggle)
		brush = brush_tool_toggle(bmain, brush_orig, tool, tool_offset, ob_mode);
	else
		brush = brush_tool_cycle(bmain, brush_orig, tool, tool_offset, ob_mode);

	if (!brush && brush_tool(brush_orig, tool_offset) != tool && create_missing) {
		brush = BKE_brush_add(bmain, tool_name);
		brush_tool_set(brush, tool_offset, tool);
		brush->ob_mode = ob_mode;
		brush->toggle_brush = brush_orig;
	}

	if (brush) {
		BKE_paint_brush_set(paint, brush);
		BKE_paint_invalidate_overlay_all();
		WM_main_add_notifier(NC_BRUSH | NA_EDITED, brush);
		return OPERATOR_FINISHED;
	}
	else {
		return OPERATOR_CANCELLED;
	}
}
示例#2
0
void BKE_brush_make_local(Brush *brush)
{

	/* - only lib users: do nothing
	 * - only local users: set flag
	 * - mixed: make copy
	 */

	Main *bmain = G.main;
	Scene *scene;
	int is_local = FALSE, is_lib = FALSE;

	if (brush->id.lib == NULL) return;

	if (brush->clone.image) {
		/* special case: ima always local immediately. Clone image should only
		 * have one user anyway. */
		id_clear_lib_data(bmain, &brush->clone.image->id);
		extern_local_brush(brush);
	}

	for (scene = bmain->scene.first; scene && ELEM(0, is_lib, is_local); scene = scene->id.next) {
		if (BKE_paint_brush(&scene->toolsettings->imapaint.paint) == brush) {
			if (scene->id.lib) is_lib = TRUE;
			else is_local = TRUE;
		}
	}

	if (is_local && is_lib == FALSE) {
		id_clear_lib_data(bmain, &brush->id);
		extern_local_brush(brush);

		/* enable fake user by default */
		if (!(brush->id.flag & LIB_FAKEUSER)) {
			brush->id.flag |= LIB_FAKEUSER;
			brush->id.us++;
		}
	}
	else if (is_local && is_lib) {
		Brush *brush_new = BKE_brush_copy(brush);
		brush_new->id.us = 1; /* only keep fake user */
		brush_new->id.flag |= LIB_FAKEUSER;

		/* Remap paths of new ID using old library as base. */
		BKE_id_lib_local_paths(bmain, brush->id.lib, &brush_new->id);
		
		for (scene = bmain->scene.first; scene; scene = scene->id.next) {
			if (BKE_paint_brush(&scene->toolsettings->imapaint.paint) == brush) {
				if (scene->id.lib == NULL) {
					BKE_paint_brush_set(&scene->toolsettings->imapaint.paint, brush_new);
				}
			}
		}
	}
}
示例#3
0
void BKE_paint_init(Paint *p, const char col[3])
{
	Brush *brush;

	/* If there's no brush, create one */
	brush = BKE_paint_brush(p);
	if (brush == NULL)
		brush = BKE_brush_add(G.main, "Brush");
	BKE_paint_brush_set(p, brush);

	memcpy(p->paint_cursor_col, col, 3);
	p->paint_cursor_col[3] = 128;

	p->flags |= PAINT_SHOW_BRUSH;
}
示例#4
0
/* Brush operators */
static int brush_add_exec(bContext *C, wmOperator *UNUSED(op))
{
	/*int type = RNA_enum_get(op->ptr, "type");*/
	Paint *paint = BKE_paint_get_active_from_context(C);
	Brush *br = BKE_paint_brush(paint);
	Main *bmain = CTX_data_main(C);

	if (br)
		br = BKE_brush_copy(br);
	else
		br = BKE_brush_add(bmain, "Brush");

	BKE_paint_brush_set(paint, br);

	return OPERATOR_FINISHED;
}
示例#5
0
文件: brush.c 项目: wangyxuan/blender
/* add a new gp-brush */
Brush *BKE_brush_add_gpencil(Main *bmain, ToolSettings *ts, const char *name)
{
  Brush *brush;
  Paint *paint = &ts->gp_paint->paint;
  brush = BKE_brush_add(bmain, name, OB_MODE_PAINT_GPENCIL);

  BKE_paint_brush_set(paint, brush);
  id_us_min(&brush->id);

  brush->size = 3;

  /* grease pencil basic settings */
  BKE_brush_init_gpencil_settings(brush);

  /* return brush */
  return brush;
}
示例#6
0
/* Brush operators */
static int brush_add_exec(bContext *C, wmOperator *UNUSED(op))
{
	/*int type = RNA_enum_get(op->ptr, "type");*/
	Paint *paint = BKE_paint_get_active_from_context(C);
	Brush *br = BKE_paint_brush(paint);
	Main *bmain = CTX_data_main(C);
	ePaintMode mode = BKE_paintmode_get_active_from_context(C);

	if (br) {
		br = BKE_brush_copy(bmain, br);
	}
	else {
		br = BKE_brush_add(bmain, "Brush", BKE_paint_object_mode_from_paint_mode(mode));
		id_us_min(&br->id);  /* fake user only */
	}

	BKE_paint_brush_set(paint, br);

	return OPERATOR_FINISHED;
}
示例#7
0
文件: brush.c 项目: wangyxuan/blender
/* create a set of grease pencil presets */
void BKE_brush_gpencil_presets(bContext *C)
{
#define SMOOTH_STROKE_RADIUS 40
#define SMOOTH_STROKE_FACTOR 0.9f

  ToolSettings *ts = CTX_data_tool_settings(C);
  Paint *paint = &ts->gp_paint->paint;
  Main *bmain = CTX_data_main(C);

  Brush *brush, *deft;
  CurveMapping *custom_curve;

  /* Pencil brush */
  brush = BKE_brush_add_gpencil(bmain, ts, "Draw Pencil");
  brush->size = 25.0f;
  brush->gpencil_settings->flag |= (GP_BRUSH_USE_PRESSURE | GP_BRUSH_ENABLE_CURSOR);
  brush->gpencil_settings->draw_sensitivity = 1.0f;

  brush->gpencil_settings->draw_strength = 0.6f;
  brush->gpencil_settings->flag |= GP_BRUSH_USE_STENGTH_PRESSURE;

  brush->gpencil_settings->draw_random_press = 0.0f;

  brush->gpencil_settings->draw_jitter = 0.0f;
  brush->gpencil_settings->flag |= GP_BRUSH_USE_JITTER_PRESSURE;

  brush->gpencil_settings->draw_angle = 0.0f;
  brush->gpencil_settings->draw_angle_factor = 0.0f;

  brush->gpencil_settings->flag |= GP_BRUSH_GROUP_SETTINGS;
  brush->gpencil_settings->draw_smoothfac = 0.1f;
  brush->gpencil_settings->draw_smoothlvl = 1;
  brush->gpencil_settings->thick_smoothfac = 1.0f;
  brush->gpencil_settings->thick_smoothlvl = 3;
  brush->gpencil_settings->draw_subdivide = 1;
  brush->gpencil_settings->draw_random_sub = 0.0f;
  brush->gpencil_settings->icon_id = GP_BRUSH_ICON_PENCIL;
  brush->gpencil_tool = GPAINT_TOOL_DRAW;

  brush->smooth_stroke_radius = SMOOTH_STROKE_RADIUS;
  brush->smooth_stroke_factor = SMOOTH_STROKE_FACTOR;

  brush->gpencil_settings->gradient_f = 1.0f;
  brush->gpencil_settings->gradient_s[0] = 1.0f;
  brush->gpencil_settings->gradient_s[1] = 1.0f;

  /* Pen brush */
  brush = BKE_brush_add_gpencil(bmain, ts, "Draw Pen");
  deft = brush; /* save default brush */
  brush->size = 30.0f;
  brush->gpencil_settings->flag |= (GP_BRUSH_USE_PRESSURE | GP_BRUSH_ENABLE_CURSOR);
  brush->gpencil_settings->draw_sensitivity = 1.0f;

  brush->gpencil_settings->draw_strength = 1.0f;
  brush->gpencil_settings->flag |= GP_BRUSH_USE_STENGTH_PRESSURE;

  brush->gpencil_settings->draw_random_press = 0.0f;
  brush->gpencil_settings->draw_random_strength = 0.0f;

  brush->gpencil_settings->draw_jitter = 0.0f;
  brush->gpencil_settings->flag |= GP_BRUSH_USE_JITTER_PRESSURE;

  brush->gpencil_settings->draw_angle = 0.0f;
  brush->gpencil_settings->draw_angle_factor = 0.0f;

  brush->gpencil_settings->flag |= GP_BRUSH_GROUP_SETTINGS;
  brush->gpencil_settings->draw_smoothfac = 0.1f;
  brush->gpencil_settings->draw_smoothlvl = 1;
  brush->gpencil_settings->draw_subdivide = 1;
  brush->gpencil_settings->thick_smoothfac = 1.0f;
  brush->gpencil_settings->thick_smoothlvl = 3;
  brush->gpencil_settings->draw_random_sub = 0.0f;
  brush->gpencil_settings->icon_id = GP_BRUSH_ICON_PEN;
  brush->gpencil_tool = GPAINT_TOOL_DRAW;

  brush->smooth_stroke_radius = SMOOTH_STROKE_RADIUS;
  brush->smooth_stroke_factor = SMOOTH_STROKE_FACTOR;

  brush->gpencil_settings->gradient_f = 1.0f;
  brush->gpencil_settings->gradient_s[0] = 1.0f;
  brush->gpencil_settings->gradient_s[1] = 1.0f;

  /* Ink brush */
  brush = BKE_brush_add_gpencil(bmain, ts, "Draw Ink");
  brush->size = 60.0f;
  brush->gpencil_settings->flag |= (GP_BRUSH_USE_PRESSURE | GP_BRUSH_ENABLE_CURSOR);
  brush->gpencil_settings->draw_sensitivity = 1.6f;

  brush->gpencil_settings->draw_strength = 1.0f;

  brush->gpencil_settings->draw_random_press = 0.0f;

  brush->gpencil_settings->draw_jitter = 0.0f;
  brush->gpencil_settings->flag |= GP_BRUSH_USE_JITTER_PRESSURE;

  brush->gpencil_settings->draw_angle = 0.0f;
  brush->gpencil_settings->draw_angle_factor = 0.0f;

  brush->gpencil_settings->flag |= GP_BRUSH_GROUP_SETTINGS;
  brush->gpencil_settings->draw_smoothfac = 0.1f;
  brush->gpencil_settings->draw_smoothlvl = 1;
  brush->gpencil_settings->thick_smoothfac = 1.0f;
  brush->gpencil_settings->thick_smoothlvl = 3;
  brush->gpencil_settings->draw_subdivide = 1;
  brush->gpencil_settings->draw_random_sub = 0.0f;
  brush->gpencil_settings->icon_id = GP_BRUSH_ICON_INK;
  brush->gpencil_tool = GPAINT_TOOL_DRAW;

  brush->smooth_stroke_radius = SMOOTH_STROKE_RADIUS;
  brush->smooth_stroke_factor = SMOOTH_STROKE_FACTOR;

  brush->gpencil_settings->gradient_f = 1.0f;
  brush->gpencil_settings->gradient_s[0] = 1.0f;
  brush->gpencil_settings->gradient_s[1] = 1.0f;

  /* Curve */
  custom_curve = brush->gpencil_settings->curve_sensitivity;
  curvemapping_set_defaults(custom_curve, 0, 0.0f, 0.0f, 1.0f, 1.0f);
  curvemapping_initialize(custom_curve);
  brush_gpencil_curvemap_reset(custom_curve->cm, 3, GPCURVE_PRESET_INK);

  /* Ink Noise brush */
  brush = BKE_brush_add_gpencil(bmain, ts, "Draw Noise");
  brush->size = 60.0f;
  brush->gpencil_settings->flag |= (GP_BRUSH_USE_PRESSURE | GP_BRUSH_ENABLE_CURSOR);
  brush->gpencil_settings->draw_sensitivity = 1.0f;

  brush->gpencil_settings->draw_strength = 1.0f;

  brush->gpencil_settings->flag |= GP_BRUSH_GROUP_RANDOM;
  brush->gpencil_settings->draw_random_press = 0.7f;
  brush->gpencil_settings->draw_random_strength = 0.0f;

  brush->gpencil_settings->draw_jitter = 0.0f;
  brush->gpencil_settings->flag |= GP_BRUSH_USE_JITTER_PRESSURE;

  brush->gpencil_settings->draw_angle = 0.0f;
  brush->gpencil_settings->draw_angle_factor = 0.0f;

  brush->gpencil_settings->flag |= GP_BRUSH_GROUP_SETTINGS;
  brush->gpencil_settings->draw_smoothfac = 0.1f;
  brush->gpencil_settings->draw_smoothlvl = 2;
  brush->gpencil_settings->thick_smoothfac = 0.5f;
  brush->gpencil_settings->thick_smoothlvl = 2;
  brush->gpencil_settings->draw_subdivide = 1;
  brush->gpencil_settings->draw_random_sub = 0.0f;
  brush->gpencil_settings->icon_id = GP_BRUSH_ICON_INKNOISE;
  brush->gpencil_tool = GPAINT_TOOL_DRAW;

  brush->smooth_stroke_radius = SMOOTH_STROKE_RADIUS;
  brush->smooth_stroke_factor = SMOOTH_STROKE_FACTOR;

  /* Curve */
  custom_curve = brush->gpencil_settings->curve_sensitivity;
  curvemapping_set_defaults(custom_curve, 0, 0.0f, 0.0f, 1.0f, 1.0f);
  curvemapping_initialize(custom_curve);
  brush_gpencil_curvemap_reset(custom_curve->cm, 3, GPCURVE_PRESET_INKNOISE);

  brush->gpencil_settings->gradient_f = 1.0f;
  brush->gpencil_settings->gradient_s[0] = 1.0f;
  brush->gpencil_settings->gradient_s[1] = 1.0f;

  /* Block Basic brush */
  brush = BKE_brush_add_gpencil(bmain, ts, "Draw Block");
  brush->size = 150.0f;
  brush->gpencil_settings->flag |= (GP_BRUSH_USE_PRESSURE | GP_BRUSH_ENABLE_CURSOR);
  brush->gpencil_settings->draw_sensitivity = 1.0f;

  brush->gpencil_settings->draw_strength = 1.0f;

  brush->gpencil_settings->draw_random_press = 0.0f;

  brush->gpencil_settings->draw_jitter = 0.0f;
  brush->gpencil_settings->flag |= GP_BRUSH_USE_JITTER_PRESSURE;

  brush->gpencil_settings->draw_angle = 0.0f;
  brush->gpencil_settings->draw_angle_factor = 0.0f;

  brush->gpencil_settings->draw_smoothfac = 0.1f;
  brush->gpencil_settings->draw_smoothlvl = 1;
  brush->gpencil_settings->thick_smoothfac = 1.0f;
  brush->gpencil_settings->thick_smoothlvl = 3;
  brush->gpencil_settings->draw_subdivide = 0;
  brush->gpencil_settings->draw_random_sub = 0;
  brush->gpencil_settings->icon_id = GP_BRUSH_ICON_BLOCK;
  brush->gpencil_tool = GPAINT_TOOL_DRAW;

  brush->smooth_stroke_radius = SMOOTH_STROKE_RADIUS;
  brush->smooth_stroke_factor = SMOOTH_STROKE_FACTOR;

  brush->gpencil_settings->gradient_f = 1.0f;
  brush->gpencil_settings->gradient_s[0] = 1.0f;
  brush->gpencil_settings->gradient_s[1] = 1.0f;

  /* Marker brush */
  brush = BKE_brush_add_gpencil(bmain, ts, "Draw Marker");
  brush->size = 80.0f;
  brush->gpencil_settings->flag |= (GP_BRUSH_USE_PRESSURE | GP_BRUSH_ENABLE_CURSOR);
  brush->gpencil_settings->draw_sensitivity = 1.0f;

  brush->gpencil_settings->draw_strength = 1.0f;

  brush->gpencil_settings->flag |= GP_BRUSH_GROUP_RANDOM;
  brush->gpencil_settings->draw_random_press = 0.374f;
  brush->gpencil_settings->draw_random_strength = 0.0f;

  brush->gpencil_settings->draw_jitter = 0.0f;
  brush->gpencil_settings->flag |= GP_BRUSH_USE_JITTER_PRESSURE;

  brush->gpencil_settings->draw_angle = DEG2RAD(20.0f);
  brush->gpencil_settings->draw_angle_factor = 1.0f;

  brush->gpencil_settings->flag |= GP_BRUSH_GROUP_SETTINGS;
  brush->gpencil_settings->draw_smoothfac = 0.1f;
  brush->gpencil_settings->draw_smoothlvl = 1;
  brush->gpencil_settings->thick_smoothfac = 1.0f;
  brush->gpencil_settings->thick_smoothlvl = 3;
  brush->gpencil_settings->draw_subdivide = 1;
  brush->gpencil_settings->draw_random_sub = 0.0f;
  brush->gpencil_settings->icon_id = GP_BRUSH_ICON_MARKER;
  brush->gpencil_tool = GPAINT_TOOL_DRAW;

  brush->smooth_stroke_radius = SMOOTH_STROKE_RADIUS;
  brush->smooth_stroke_factor = SMOOTH_STROKE_FACTOR;
  /* Curve */
  custom_curve = brush->gpencil_settings->curve_sensitivity;
  curvemapping_set_defaults(custom_curve, 0, 0.0f, 0.0f, 1.0f, 1.0f);
  curvemapping_initialize(custom_curve);
  brush_gpencil_curvemap_reset(custom_curve->cm, 4, GPCURVE_PRESET_MARKER);

  brush->gpencil_settings->gradient_f = 1.0f;
  brush->gpencil_settings->gradient_s[0] = 1.0f;
  brush->gpencil_settings->gradient_s[1] = 1.0f;

  /* Fill brush */
  brush = BKE_brush_add_gpencil(bmain, ts, "Fill Area");
  brush->size = 1.0f;
  brush->gpencil_settings->flag |= GP_BRUSH_ENABLE_CURSOR;
  brush->gpencil_settings->draw_sensitivity = 1.0f;
  brush->gpencil_settings->fill_leak = 3;
  brush->gpencil_settings->fill_threshold = 0.1f;
  brush->gpencil_settings->fill_simplylvl = 1;
  brush->gpencil_settings->fill_factor = 1;
  brush->gpencil_settings->icon_id = GP_BRUSH_ICON_FILL;
  brush->gpencil_tool = GPAINT_TOOL_FILL;

  brush->gpencil_settings->draw_smoothfac = 0.1f;
  brush->gpencil_settings->draw_smoothlvl = 1;
  brush->gpencil_settings->thick_smoothfac = 1.0f;
  brush->gpencil_settings->thick_smoothlvl = 3;
  brush->gpencil_settings->draw_subdivide = 1;

  brush->smooth_stroke_radius = SMOOTH_STROKE_RADIUS;
  brush->smooth_stroke_factor = SMOOTH_STROKE_FACTOR;

  brush->gpencil_settings->draw_strength = 1.0f;

  brush->gpencil_settings->gradient_f = 1.0f;
  brush->gpencil_settings->gradient_s[0] = 1.0f;
  brush->gpencil_settings->gradient_s[1] = 1.0f;

  /* Soft Eraser brush */
  brush = BKE_brush_add_gpencil(bmain, ts, "Eraser Soft");
  brush->size = 30.0f;
  brush->gpencil_settings->draw_strength = 0.5f;
  brush->gpencil_settings->flag |= (GP_BRUSH_ENABLE_CURSOR | GP_BRUSH_DEFAULT_ERASER);
  brush->gpencil_settings->flag |= GP_BRUSH_USE_PRESSURE;
  brush->gpencil_settings->flag |= GP_BRUSH_USE_STENGTH_PRESSURE;
  brush->gpencil_settings->icon_id = GP_BRUSH_ICON_ERASE_SOFT;
  brush->gpencil_tool = GPAINT_TOOL_ERASE;
  brush->gpencil_settings->eraser_mode = GP_BRUSH_ERASER_SOFT;
  brush->gpencil_settings->era_strength_f = 100.0f;
  brush->gpencil_settings->era_thickness_f = 10.0f;

  /* Hard Eraser brush */
  brush = BKE_brush_add_gpencil(bmain, ts, "Eraser Hard");
  brush->size = 30.0f;
  brush->gpencil_settings->draw_strength = 1.0f;
  brush->gpencil_settings->flag |= (GP_BRUSH_ENABLE_CURSOR | GP_BRUSH_DEFAULT_ERASER);
  brush->gpencil_settings->icon_id = GP_BRUSH_ICON_ERASE_HARD;
  brush->gpencil_tool = GPAINT_TOOL_ERASE;
  brush->gpencil_settings->eraser_mode = GP_BRUSH_ERASER_SOFT;
  brush->gpencil_settings->era_strength_f = 100.0f;
  brush->gpencil_settings->era_thickness_f = 50.0f;

  /* Point Eraser brush */
  brush = BKE_brush_add_gpencil(bmain, ts, "Eraser Point");
  brush->size = 30.0f;
  brush->gpencil_settings->flag |= GP_BRUSH_ENABLE_CURSOR;
  brush->gpencil_settings->icon_id = GP_BRUSH_ICON_ERASE_HARD;
  brush->gpencil_tool = GPAINT_TOOL_ERASE;
  brush->gpencil_settings->eraser_mode = GP_BRUSH_ERASER_HARD;

  /* Stroke Eraser brush */
  brush = BKE_brush_add_gpencil(bmain, ts, "Eraser Stroke");
  brush->size = 30.0f;
  brush->gpencil_settings->flag |= GP_BRUSH_ENABLE_CURSOR;
  brush->gpencil_settings->icon_id = GP_BRUSH_ICON_ERASE_STROKE;
  brush->gpencil_tool = GPAINT_TOOL_ERASE;
  brush->gpencil_settings->eraser_mode = GP_BRUSH_ERASER_STROKE;

  /* set default brush */
  BKE_paint_brush_set(paint, deft);
}