Cleanup: move paint curve undo into own file
authorCampbell Barton <ideasman42@gmail.com>
Tue, 27 Mar 2018 05:05:07 +0000 (07:05 +0200)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 27 Mar 2018 05:06:14 +0000 (07:06 +0200)
source/blender/editors/sculpt_paint/CMakeLists.txt
source/blender/editors/sculpt_paint/paint_curve.c
source/blender/editors/sculpt_paint/paint_curve_undo.c [new file with mode: 0644]
source/blender/editors/sculpt_paint/paint_intern.h

index 2b09e7aa20a1fe87e3ef40f6531fd6b063267eff..adead9a8b9e2aac03d026b805a4d8251f0fd2ff7 100644 (file)
@@ -42,6 +42,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
index 337f7a1ef2b2898601c6ef39dd9294028ca0b296..8d9812f41d94f869894459475a6b9ec05b5fae97 100644 (file)
 #include "DNA_view3d_types.h"
 
 #include "BLI_math_vector.h"
-#include "BLI_string.h"
 
 #include "BKE_context.h"
 #include "BKE_main.h"
 #include "BKE_paint.h"
 
-#include "ED_paint.h"
 #include "ED_view3d.h"
 
 #include "WM_api.h"
@@ -56,7 +54,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)
 {
        Object *ob = CTX_data_active_object(C);
@@ -81,91 +78,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)
@@ -291,7 +203,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;
@@ -390,7 +302,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
 
@@ -467,7 +379,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;
@@ -651,7 +563,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 (file)
index 0000000..70f9299
--- /dev/null
@@ -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);
+}
index 8a0d10134991784f1cfeab77719364e7da0bee1a..52be4be4c0db957c5caecf198da606228fa286d9 100644 (file)
@@ -43,6 +43,7 @@ struct MTex;
 struct Object;
 struct PaintStroke;
 struct Paint;
+struct PaintCurve;
 struct PointerRNA;
 struct rcti;
 struct Scene;
@@ -343,6 +344,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 */