diff options
Diffstat (limited to 'source/blender')
4 files changed, 138 insertions, 92 deletions
diff --git a/source/blender/editors/sculpt_paint/CMakeLists.txt b/source/blender/editors/sculpt_paint/CMakeLists.txt index 1a709382581..040bcc10ca2 100644 --- a/source/blender/editors/sculpt_paint/CMakeLists.txt +++ b/source/blender/editors/sculpt_paint/CMakeLists.txt @@ -43,6 +43,7 @@ set(INC_SYS set(SRC paint_cursor.c paint_curve.c + paint_curve_undo.c paint_hide.c paint_image.c paint_image_2d.c diff --git a/source/blender/editors/sculpt_paint/paint_curve.c b/source/blender/editors/sculpt_paint/paint_curve.c index c9ad4a46a13..fb8dea2af0e 100644 --- a/source/blender/editors/sculpt_paint/paint_curve.c +++ b/source/blender/editors/sculpt_paint/paint_curve.c @@ -35,7 +35,6 @@ #include "DNA_workspace_types.h" #include "BLI_math_vector.h" -#include "BLI_string.h" #include "BKE_context.h" #include "BKE_main.h" @@ -43,7 +42,6 @@ #include "DEG_depsgraph.h" -#include "ED_paint.h" #include "ED_view3d.h" #include "WM_api.h" @@ -59,7 +57,6 @@ #define PAINT_CURVE_SELECT_THRESHOLD 40.0f #define PAINT_CURVE_POINT_SELECT(pcp, i) (*(&pcp->bez.f1 + i) = SELECT) - int paint_curve_poll(bContext *C) { const WorkSpace *workspace = CTX_wm_workspace(C); @@ -85,91 +82,6 @@ int paint_curve_poll(bContext *C) return false; } -/* Paint Curve Undo*/ - -typedef struct UndoCurve { - struct UndoImageTile *next, *prev; - - PaintCurvePoint *points; /* points of curve */ - int tot_points; - int active_point; - - char idname[MAX_ID_NAME]; /* name instead of pointer*/ -} UndoCurve; - -static void paintcurve_undo_restore(bContext *C, ListBase *lb) -{ - Paint *p = BKE_paint_get_active_from_context(C); - UndoCurve *uc; - PaintCurve *pc = NULL; - - if (p->brush) { - pc = p->brush->paint_curve; - } - - if (!pc) - return; - - uc = (UndoCurve *)lb->first; - - if (STREQLEN(uc->idname, pc->id.name, BLI_strnlen(uc->idname, sizeof(uc->idname)))) { - SWAP(PaintCurvePoint *, pc->points, uc->points); - SWAP(int, pc->tot_points, uc->tot_points); - SWAP(int, pc->add_index, uc->active_point); - } -} - -static void paintcurve_undo_delete(ListBase *lb) -{ - UndoCurve *uc; - uc = (UndoCurve *)lb->first; - - if (uc->points) - MEM_freeN(uc->points); - uc->points = NULL; -} - - -static void paintcurve_undo_begin(bContext *C, wmOperator *op, PaintCurve *pc) -{ - ePaintMode mode = BKE_paintmode_get_active_from_context(C); - ListBase *lb = NULL; - int undo_stack_id; - UndoCurve *uc; - - switch (mode) { - case ePaintTexture2D: - case ePaintTextureProjective: - undo_stack_id = UNDO_PAINT_IMAGE; - break; - - case ePaintSculpt: - undo_stack_id = UNDO_PAINT_MESH; - break; - - default: - /* do nothing, undo is handled by global */ - return; - } - - - ED_undo_paint_push_begin(undo_stack_id, op->type->name, - paintcurve_undo_restore, paintcurve_undo_delete, NULL); - lb = undo_paint_push_get_list(undo_stack_id); - - uc = MEM_callocN(sizeof(*uc), "Undo_curve"); - - lb->first = uc; - - BLI_strncpy(uc->idname, pc->id.name, sizeof(uc->idname)); - uc->tot_points = pc->tot_points; - uc->active_point = pc->add_index; - uc->points = MEM_dupallocN(pc->points); - - undo_paint_push_count_alloc(undo_stack_id, sizeof(*uc) + sizeof(*pc->points) * pc->tot_points); - - ED_undo_paint_push_end(undo_stack_id); -} #define SEL_F1 (1 << 0) #define SEL_F2 (1 << 1) #define SEL_F3 (1 << 2) @@ -295,7 +207,7 @@ static void paintcurve_point_add(bContext *C, wmOperator *op, const int loc[2]) br->paint_curve = pc = BKE_paint_curve_add(bmain, "PaintCurve"); } - paintcurve_undo_begin(C, op, pc); + ED_paintcurve_undo_push(C, op, pc); pcp = MEM_mallocN((pc->tot_points + 1) * sizeof(PaintCurvePoint), "PaintCurvePoint"); add_index = pc->add_index; @@ -394,7 +306,7 @@ static int paintcurve_delete_point_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - paintcurve_undo_begin(C, op, pc); + ED_paintcurve_undo_push(C, op, pc); #define DELETE_TAG 2 @@ -471,7 +383,7 @@ static bool paintcurve_point_select(bContext *C, wmOperator *op, const int loc[2 if (!pc) return false; - paintcurve_undo_begin(C, op, pc); + ED_paintcurve_undo_push(C, op, pc); if (toggle) { PaintCurvePoint *pcp; @@ -655,7 +567,7 @@ static int paintcurve_slide_invoke(bContext *C, wmOperator *op, const wmEvent *e op->customdata = psd; if (do_select) - paintcurve_undo_begin(C, op, pc); + ED_paintcurve_undo_push(C, op, pc); /* first, clear all selection from points */ for (i = 0; i < pc->tot_points; i++) diff --git a/source/blender/editors/sculpt_paint/paint_curve_undo.c b/source/blender/editors/sculpt_paint/paint_curve_undo.c new file mode 100644 index 00000000000..70f92999864 --- /dev/null +++ b/source/blender/editors/sculpt_paint/paint_curve_undo.c @@ -0,0 +1,129 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/editors/sculpt_paint/paint_curve_undo.c + * \ingroup edsculpt + */ + +#include <string.h> + +#include "MEM_guardedalloc.h" + +#include "DNA_brush_types.h" +#include "DNA_space_types.h" + +#include "BLI_string.h" + +#include "BKE_context.h" +#include "BKE_paint.h" + +#include "ED_paint.h" + +#include "WM_api.h" +#include "WM_types.h" + +#include "paint_intern.h" + +typedef struct UndoCurve { + struct UndoImageTile *next, *prev; + + PaintCurvePoint *points; /* points of curve */ + int tot_points; + int active_point; + + char idname[MAX_ID_NAME]; /* name instead of pointer*/ +} UndoCurve; + +static void paintcurve_undo_restore(bContext *C, ListBase *lb) +{ + Paint *p = BKE_paint_get_active_from_context(C); + UndoCurve *uc; + PaintCurve *pc = NULL; + + if (p->brush) { + pc = p->brush->paint_curve; + } + + if (!pc) { + return; + } + + uc = (UndoCurve *)lb->first; + + if (STREQLEN(uc->idname, pc->id.name, BLI_strnlen(uc->idname, sizeof(uc->idname)))) { + SWAP(PaintCurvePoint *, pc->points, uc->points); + SWAP(int, pc->tot_points, uc->tot_points); + SWAP(int, pc->add_index, uc->active_point); + } +} + +static void paintcurve_undo_delete(ListBase *lb) +{ + UndoCurve *uc; + uc = (UndoCurve *)lb->first; + + if (uc->points) + MEM_freeN(uc->points); + uc->points = NULL; +} + +/** + * \note This is called before executing steps (not after). + */ +void ED_paintcurve_undo_push(bContext *C, wmOperator *op, PaintCurve *pc) +{ + ePaintMode mode = BKE_paintmode_get_active_from_context(C); + ListBase *lb = NULL; + int undo_stack_id; + UndoCurve *uc; + + switch (mode) { + case ePaintTexture2D: + case ePaintTextureProjective: + undo_stack_id = UNDO_PAINT_IMAGE; + break; + + case ePaintSculpt: + undo_stack_id = UNDO_PAINT_MESH; + break; + + default: + /* do nothing, undo is handled by global */ + return; + } + + + ED_undo_paint_push_begin(undo_stack_id, op->type->name, + paintcurve_undo_restore, paintcurve_undo_delete, NULL); + lb = undo_paint_push_get_list(undo_stack_id); + + uc = MEM_callocN(sizeof(*uc), "Undo_curve"); + + lb->first = uc; + + BLI_strncpy(uc->idname, pc->id.name, sizeof(uc->idname)); + uc->tot_points = pc->tot_points; + uc->active_point = pc->add_index; + uc->points = MEM_dupallocN(pc->points); + + undo_paint_push_count_alloc(undo_stack_id, sizeof(*uc) + sizeof(*pc->points) * pc->tot_points); + + ED_undo_paint_push_end(undo_stack_id); +} diff --git a/source/blender/editors/sculpt_paint/paint_intern.h b/source/blender/editors/sculpt_paint/paint_intern.h index 089a12dbd45..ccca0d248a5 100644 --- a/source/blender/editors/sculpt_paint/paint_intern.h +++ b/source/blender/editors/sculpt_paint/paint_intern.h @@ -43,6 +43,7 @@ struct MTex; struct Object; struct PaintStroke; struct Paint; +struct PaintCurve; struct PointerRNA; struct rcti; struct Scene; @@ -342,6 +343,9 @@ void PAINTCURVE_OT_slide(struct wmOperatorType *ot); void PAINTCURVE_OT_draw(struct wmOperatorType *ot); void PAINTCURVE_OT_cursor(struct wmOperatorType *ot); +/* paint_curve_undo.c */ +void ED_paintcurve_undo_push(struct bContext *C, struct wmOperator *op, struct PaintCurve *pc); + /* image painting blur kernel */ typedef struct { float *wdata; /* actual kernel */ |