static void paintcurve_point_add(bContext *C, wmOperator *op, const int loc[2]) { Paint *p = BKE_paint_get_active_from_context(C); Brush *br = p->brush; Main *bmain = CTX_data_main(C); PaintCurve *pc; PaintCurvePoint *pcp; wmWindow *window = CTX_wm_window(C); ARegion *ar = CTX_wm_region(C); float vec[3] = {loc[0], loc[1], 0.0}; int add_index; int i; pc = br->paint_curve; if (!pc) { br->paint_curve = pc = BKE_paint_curve_add(bmain, "PaintCurve"); } ED_paintcurve_undo_push_begin(op->type->name); pcp = MEM_mallocN((pc->tot_points + 1) * sizeof(PaintCurvePoint), "PaintCurvePoint"); add_index = pc->add_index; if (pc->points) { if (add_index > 0) memcpy(pcp, pc->points, add_index * sizeof(PaintCurvePoint)); if (add_index < pc->tot_points) memcpy(pcp + add_index + 1, pc->points + add_index, (pc->tot_points - add_index) * sizeof(PaintCurvePoint)); MEM_freeN(pc->points); } pc->points = pcp; pc->tot_points++; /* initialize new point */ memset(&pcp[add_index], 0, sizeof(PaintCurvePoint)); copy_v3_v3(pcp[add_index].bez.vec[0], vec); copy_v3_v3(pcp[add_index].bez.vec[1], vec); copy_v3_v3(pcp[add_index].bez.vec[2], vec); /* last step, clear selection from all bezier handles expect the next */ for (i = 0; i < pc->tot_points; i++) { pcp[i].bez.f1 = pcp[i].bez.f2 = pcp[i].bez.f3 = 0; } BKE_paint_curve_clamp_endpoint_add_index(pc, add_index); if (pc->add_index != 0) { pcp[add_index].bez.f3 = SELECT; pcp[add_index].bez.h2 = HD_ALIGN; } else { pcp[add_index].bez.f1 = SELECT; pcp[add_index].bez.h1 = HD_ALIGN; } ED_paintcurve_undo_push_end(); WM_paint_cursor_tag_redraw(window, ar); }
static int paintcurve_new_exec(bContext *C, wmOperator *UNUSED(op)) { Paint *p = BKE_paint_get_active_from_context(C); Main *bmain = CTX_data_main(C); if (p && p->brush) { p->brush->paint_curve = BKE_paint_curve_add(bmain, "PaintCurve"); } return OPERATOR_FINISHED; }
static int paintcurve_new_exec(bContext *C, wmOperator *UNUSED(op)) { Paint *p = BKE_paint_get_active_from_context(C); Main *bmain = CTX_data_main(C); if (p && p->brush) { p->brush->paint_curve = BKE_paint_curve_add(bmain, "PaintCurve"); } WM_event_add_notifier(C, NC_PAINTCURVE | NA_ADDED, NULL); return OPERATOR_FINISHED; }