Blender  V2.93
paint_curve.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16 
21 #include <limits.h>
22 #include <string.h>
23 
24 #include "MEM_guardedalloc.h"
25 
26 #include "DNA_brush_types.h"
27 #include "DNA_object_types.h"
28 #include "DNA_screen_types.h"
29 #include "DNA_space_types.h"
30 #include "DNA_view3d_types.h"
31 
32 #include "BLI_math_vector.h"
33 
34 #include "BKE_context.h"
35 #include "BKE_main.h"
36 #include "BKE_paint.h"
37 
38 #include "ED_paint.h"
39 #include "ED_view3d.h"
40 
41 #include "WM_api.h"
42 #include "WM_types.h"
43 
44 #include "RNA_access.h"
45 #include "RNA_define.h"
46 
47 #include "UI_view2d.h"
48 
49 #include "paint_intern.h"
50 
51 #define PAINT_CURVE_SELECT_THRESHOLD 40.0f
52 #define PAINT_CURVE_POINT_SELECT(pcp, i) (*(&pcp->bez.f1 + i) = SELECT)
53 
55 {
57  Paint *p;
59  SpaceImage *sima;
60 
61  if (rv3d && !(ob && ((ob->mode & OB_MODE_ALL_PAINT) != 0))) {
62  return false;
63  }
64 
65  sima = CTX_wm_space_image(C);
66 
67  if (sima && sima->mode != SI_MODE_PAINT) {
68  return false;
69  }
70 
72 
73  if (p && p->brush && (p->brush->flag & BRUSH_CURVE)) {
74  return true;
75  }
76 
77  return false;
78 }
79 
80 #define SEL_F1 (1 << 0)
81 #define SEL_F2 (1 << 1)
82 #define SEL_F3 (1 << 2)
83 
84 /* returns 0, 1, or 2 in point according to handle 1, pivot or handle 2 */
86  PaintCurve *pc, const float pos[2], bool ignore_pivot, const float threshold, char *point)
87 {
88  PaintCurvePoint *pcp, *closest = NULL;
89  int i;
90  float closest_dist = threshold;
91 
92  for (i = 0, pcp = pc->points; i < pc->tot_points; i++, pcp++) {
93  float dist[3];
94  char point_sel = 0;
95 
96  dist[0] = len_manhattan_v2v2(pos, pcp->bez.vec[0]);
97  dist[1] = len_manhattan_v2v2(pos, pcp->bez.vec[1]);
98  dist[2] = len_manhattan_v2v2(pos, pcp->bez.vec[2]);
99 
100  if (dist[1] < closest_dist) {
101  closest_dist = dist[1];
102  point_sel = SEL_F2;
103  }
104  if (dist[0] < closest_dist) {
105  closest_dist = dist[0];
106  point_sel = SEL_F1;
107  }
108  if (dist[2] < closest_dist) {
109  closest_dist = dist[2];
110  point_sel = SEL_F3;
111  }
112  if (point_sel) {
113  closest = pcp;
114  if (point) {
115  if (ignore_pivot && point_sel == SEL_F2) {
116  point_sel = (dist[0] < dist[2]) ? SEL_F1 : SEL_F3;
117  }
118  *point = point_sel;
119  }
120  }
121  }
122 
123  return closest;
124 }
125 
126 static int paintcurve_point_co_index(char sel)
127 {
128  char i = 0;
129  while (sel != 1) {
130  sel >>= 1;
131  i++;
132  }
133  return i;
134 }
135 
136 static char paintcurve_point_side_index(const BezTriple *bezt,
137  const bool is_first,
138  const char fallback)
139 {
140  /* when matching, guess based on endpoint side */
141  if (BEZT_ISSEL_ANY(bezt)) {
142  if ((bezt->f1 & SELECT) == (bezt->f3 & SELECT)) {
143  return is_first ? SEL_F1 : SEL_F3;
144  }
145  if (bezt->f1 & SELECT) {
146  return SEL_F1;
147  }
148  if (bezt->f3 & SELECT) {
149  return SEL_F3;
150  }
151  return fallback;
152  }
153  return 0;
154 }
155 
156 /******************* Operators *********************************/
157 
159 {
161  Main *bmain = CTX_data_main(C);
162 
163  if (p && p->brush) {
164  p->brush->paint_curve = BKE_paint_curve_add(bmain, "PaintCurve");
165  }
166 
168 
169  return OPERATOR_FINISHED;
170 }
171 
173 {
174  /* identifiers */
175  ot->name = "Add New Paint Curve";
176  ot->description = "Add new paint curve";
177  ot->idname = "PAINTCURVE_OT_new";
178 
179  /* api callbacks */
182 
183  /* flags */
185 }
186 
187 static void paintcurve_point_add(bContext *C, wmOperator *op, const int loc[2])
188 {
190  Brush *br = p->brush;
191  Main *bmain = CTX_data_main(C);
192  wmWindow *window = CTX_wm_window(C);
193  ARegion *region = CTX_wm_region(C);
194  const float vec[3] = {loc[0], loc[1], 0.0};
195 
196  PaintCurve *pc = br->paint_curve;
197  if (!pc) {
198  br->paint_curve = pc = BKE_paint_curve_add(bmain, "PaintCurve");
199  }
200 
202 
203  PaintCurvePoint *pcp = MEM_mallocN((pc->tot_points + 1) * sizeof(PaintCurvePoint),
204  "PaintCurvePoint");
205  int add_index = pc->add_index;
206 
207  if (pc->points) {
208  if (add_index > 0) {
209  memcpy(pcp, pc->points, add_index * sizeof(PaintCurvePoint));
210  }
211  if (add_index < pc->tot_points) {
212  memcpy(pcp + add_index + 1,
213  pc->points + add_index,
214  (pc->tot_points - add_index) * sizeof(PaintCurvePoint));
215  }
216 
217  MEM_freeN(pc->points);
218  }
219  pc->points = pcp;
220  pc->tot_points++;
221 
222  /* initialize new point */
223  memset(&pcp[add_index], 0, sizeof(PaintCurvePoint));
224  copy_v3_v3(pcp[add_index].bez.vec[0], vec);
225  copy_v3_v3(pcp[add_index].bez.vec[1], vec);
226  copy_v3_v3(pcp[add_index].bez.vec[2], vec);
227 
228  /* last step, clear selection from all bezier handles expect the next */
229  for (int i = 0; i < pc->tot_points; i++) {
230  pcp[i].bez.f1 = pcp[i].bez.f2 = pcp[i].bez.f3 = 0;
231  }
232 
234 
235  if (pc->add_index != 0) {
236  pcp[add_index].bez.f3 = SELECT;
237  pcp[add_index].bez.h2 = HD_ALIGN;
238  }
239  else {
240  pcp[add_index].bez.f1 = SELECT;
241  pcp[add_index].bez.h1 = HD_ALIGN;
242  }
243 
245 
246  WM_paint_cursor_tag_redraw(window, region);
247 }
248 
249 static int paintcurve_add_point_invoke(bContext *C, wmOperator *op, const wmEvent *event)
250 {
251  const int loc[2] = {event->mval[0], event->mval[1]};
252  paintcurve_point_add(C, op, loc);
253  RNA_int_set_array(op->ptr, "location", loc);
254  return OPERATOR_FINISHED;
255 }
256 
258 {
259  int loc[2];
260 
261  if (RNA_struct_property_is_set(op->ptr, "location")) {
262  RNA_int_get_array(op->ptr, "location", loc);
263  paintcurve_point_add(C, op, loc);
264  return OPERATOR_FINISHED;
265  }
266 
267  return OPERATOR_CANCELLED;
268 }
269 
271 {
272  /* identifiers */
273  ot->name = "Add New Paint Curve Point";
274  ot->description = ot->name;
275  ot->idname = "PAINTCURVE_OT_add_point";
276 
277  /* api callbacks */
281 
282  /* flags */
284 
285  /* properties */
287  "location",
288  2,
289  NULL,
290  0,
291  SHRT_MAX,
292  "Location",
293  "Location of vertex in area space",
294  0,
295  SHRT_MAX);
296 }
297 
299 {
301  Brush *br = p->brush;
302  PaintCurve *pc;
303  PaintCurvePoint *pcp;
304  wmWindow *window = CTX_wm_window(C);
305  ARegion *region = CTX_wm_region(C);
306  int i;
307  int tot_del = 0;
308  pc = br->paint_curve;
309 
310  if (!pc || pc->tot_points == 0) {
311  return OPERATOR_CANCELLED;
312  }
313 
315 
316 #define DELETE_TAG 2
317 
318  for (i = 0, pcp = pc->points; i < pc->tot_points; i++, pcp++) {
319  if (BEZT_ISSEL_ANY(&pcp->bez)) {
320  pcp->bez.f2 |= DELETE_TAG;
321  tot_del++;
322  }
323  }
324 
325  if (tot_del > 0) {
326  int j = 0;
327  int new_tot = pc->tot_points - tot_del;
328  PaintCurvePoint *points_new = NULL;
329  if (new_tot > 0) {
330  points_new = MEM_mallocN(new_tot * sizeof(PaintCurvePoint), "PaintCurvePoint");
331  }
332 
333  for (i = 0, pcp = pc->points; i < pc->tot_points; i++, pcp++) {
334  if (!(pcp->bez.f2 & DELETE_TAG)) {
335  points_new[j] = pc->points[i];
336 
337  if ((i + 1) == pc->add_index) {
339  }
340  j++;
341  }
342  else if ((i + 1) == pc->add_index) {
343  /* prefer previous point */
344  pc->add_index = j;
345  }
346  }
347  MEM_freeN(pc->points);
348 
349  pc->points = points_new;
350  pc->tot_points = new_tot;
351  }
352 
353 #undef DELETE_TAG
354 
356 
357  WM_paint_cursor_tag_redraw(window, region);
358 
359  return OPERATOR_FINISHED;
360 }
361 
363 {
364  /* identifiers */
365  ot->name = "Remove Paint Curve Point";
366  ot->description = ot->name;
367  ot->idname = "PAINTCURVE_OT_delete_point";
368 
369  /* api callbacks */
372 
373  /* flags */
374  ot->flag = OPTYPE_UNDO;
375 }
376 
378  bContext *C, wmOperator *op, const int loc[2], bool toggle, bool extend)
379 {
380  wmWindow *window = CTX_wm_window(C);
381  ARegion *region = CTX_wm_region(C);
383  Brush *br = p->brush;
384  PaintCurve *pc;
385  int i;
386  const float loc_fl[2] = {UNPACK2(loc)};
387 
388  pc = br->paint_curve;
389 
390  if (!pc) {
391  return false;
392  }
393 
395 
396  if (toggle) {
397  PaintCurvePoint *pcp;
398  char select = 0;
399  bool selected = false;
400 
401  pcp = pc->points;
402 
403  for (i = 0; i < pc->tot_points; i++) {
404  if (pcp[i].bez.f1 || pcp[i].bez.f2 || pcp[i].bez.f3) {
405  selected = true;
406  break;
407  }
408  }
409 
410  if (!selected) {
411  select = SELECT;
412  }
413 
414  for (i = 0; i < pc->tot_points; i++) {
415  pc->points[i].bez.f1 = pc->points[i].bez.f2 = pc->points[i].bez.f3 = select;
416  }
417  }
418  else {
419  PaintCurvePoint *pcp;
420  char selflag;
421 
422  pcp = paintcurve_point_get_closest(pc, loc_fl, false, PAINT_CURVE_SELECT_THRESHOLD, &selflag);
423 
424  if (pcp) {
426 
427  if (selflag == SEL_F2) {
428  if (extend) {
429  pcp->bez.f2 ^= SELECT;
430  }
431  else {
432  pcp->bez.f2 |= SELECT;
433  }
434  }
435  else if (selflag == SEL_F1) {
436  if (extend) {
437  pcp->bez.f1 ^= SELECT;
438  }
439  else {
440  pcp->bez.f1 |= SELECT;
441  }
442  }
443  else if (selflag == SEL_F3) {
444  if (extend) {
445  pcp->bez.f3 ^= SELECT;
446  }
447  else {
448  pcp->bez.f3 |= SELECT;
449  }
450  }
451  }
452 
453  /* clear selection for unselected points if not extending and if a point has been selected */
454  if (!extend && pcp) {
455  for (i = 0; i < pc->tot_points; i++) {
456  pc->points[i].bez.f1 = pc->points[i].bez.f2 = pc->points[i].bez.f3 = 0;
457 
458  if ((pc->points + i) == pcp) {
459  char index = paintcurve_point_co_index(selflag);
460  PAINT_CURVE_POINT_SELECT(pcp, index);
461  }
462  }
463  }
464 
465  if (!pcp) {
467  return false;
468  }
469  }
470 
472 
473  WM_paint_cursor_tag_redraw(window, region);
474 
475  return true;
476 }
477 
479 {
480  const int loc[2] = {UNPACK2(event->mval)};
481  bool toggle = RNA_boolean_get(op->ptr, "toggle");
482  bool extend = RNA_boolean_get(op->ptr, "extend");
483  if (paintcurve_point_select(C, op, loc, toggle, extend)) {
484  RNA_int_set_array(op->ptr, "location", loc);
485  return OPERATOR_FINISHED;
486  }
487  return OPERATOR_CANCELLED;
488 }
489 
491 {
492  int loc[2];
493 
494  if (RNA_struct_property_is_set(op->ptr, "location")) {
495  bool toggle = RNA_boolean_get(op->ptr, "toggle");
496  bool extend = RNA_boolean_get(op->ptr, "extend");
497  RNA_int_get_array(op->ptr, "location", loc);
498  if (paintcurve_point_select(C, op, loc, toggle, extend)) {
499  return OPERATOR_FINISHED;
500  }
501  }
502 
503  return OPERATOR_CANCELLED;
504 }
505 
507 {
508  PropertyRNA *prop;
509 
510  /* identifiers */
511  ot->name = "Select Paint Curve Point";
512  ot->description = "Select a paint curve point";
513  ot->idname = "PAINTCURVE_OT_select";
514 
515  /* api callbacks */
519 
520  /* flags */
522 
523  /* properties */
525  "location",
526  2,
527  NULL,
528  0,
529  SHRT_MAX,
530  "Location",
531  "Location of vertex in area space",
532  0,
533  SHRT_MAX);
534  prop = RNA_def_boolean(ot->srna, "toggle", false, "Toggle", "(De)select all");
536  prop = RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend selection");
538 }
539 
540 typedef struct PointSlideData {
542  char select;
543  int initial_loc[2];
544  float point_initial_loc[3][2];
545  int event;
546  bool align;
548 
549 static int paintcurve_slide_invoke(bContext *C, wmOperator *op, const wmEvent *event)
550 {
552  const float loc_fl[2] = {UNPACK2(event->mval)};
553  char select;
554  int i;
555  bool do_select = RNA_boolean_get(op->ptr, "select");
556  bool align = RNA_boolean_get(op->ptr, "align");
557  Brush *br = p->brush;
558  PaintCurve *pc = br->paint_curve;
559  PaintCurvePoint *pcp;
560 
561  if (!pc) {
562  return OPERATOR_PASS_THROUGH;
563  }
564 
565  if (do_select) {
567  }
568  else {
569  pcp = NULL;
570  /* just find first selected point */
571  for (i = 0; i < pc->tot_points; i++) {
572  if ((select = paintcurve_point_side_index(&pc->points[i].bez, i == 0, SEL_F3))) {
573  pcp = &pc->points[i];
574  break;
575  }
576  }
577  }
578 
579  if (pcp) {
580  ARegion *region = CTX_wm_region(C);
581  wmWindow *window = CTX_wm_window(C);
582  PointSlideData *psd = MEM_mallocN(sizeof(PointSlideData), "PointSlideData");
583  copy_v2_v2_int(psd->initial_loc, event->mval);
584  psd->event = event->type;
585  psd->pcp = pcp;
587  for (i = 0; i < 3; i++) {
588  copy_v2_v2(psd->point_initial_loc[i], pcp->bez.vec[i]);
589  }
590  psd->align = align;
591  op->customdata = psd;
592 
593  /* first, clear all selection from points */
594  for (i = 0; i < pc->tot_points; i++) {
595  pc->points[i].bez.f1 = pc->points[i].bez.f3 = pc->points[i].bez.f2 = 0;
596  }
597 
598  /* only select the active point */
599  PAINT_CURVE_POINT_SELECT(pcp, psd->select);
601 
603  WM_paint_cursor_tag_redraw(window, region);
604  return OPERATOR_RUNNING_MODAL;
605  }
606 
607  return OPERATOR_PASS_THROUGH;
608 }
609 
610 static int paintcurve_slide_modal(bContext *C, wmOperator *op, const wmEvent *event)
611 {
612  PointSlideData *psd = op->customdata;
613 
614  if (event->type == psd->event && event->val == KM_RELEASE) {
615  MEM_freeN(psd);
618  return OPERATOR_FINISHED;
619  }
620 
621  switch (event->type) {
622  case MOUSEMOVE: {
623  ARegion *region = CTX_wm_region(C);
624  wmWindow *window = CTX_wm_window(C);
625  float diff[2] = {event->mval[0] - psd->initial_loc[0], event->mval[1] - psd->initial_loc[1]};
626  if (psd->select == 1) {
627  int i;
628  for (i = 0; i < 3; i++) {
629  add_v2_v2v2(psd->pcp->bez.vec[i], diff, psd->point_initial_loc[i]);
630  }
631  }
632  else {
633  add_v2_v2(diff, psd->point_initial_loc[psd->select]);
634  copy_v2_v2(psd->pcp->bez.vec[psd->select], diff);
635 
636  if (psd->align) {
637  char opposite = (psd->select == 0) ? 2 : 0;
638  sub_v2_v2v2(diff, psd->pcp->bez.vec[1], psd->pcp->bez.vec[psd->select]);
639  add_v2_v2v2(psd->pcp->bez.vec[opposite], psd->pcp->bez.vec[1], diff);
640  }
641  }
642  WM_paint_cursor_tag_redraw(window, region);
643  break;
644  }
645  default:
646  break;
647  }
648 
649  return OPERATOR_RUNNING_MODAL;
650 }
651 
653 {
654  /* identifiers */
655  ot->name = "Slide Paint Curve Point";
656  ot->description = "Select and slide paint curve point";
657  ot->idname = "PAINTCURVE_OT_slide";
658 
659  /* api callbacks */
663 
664  /* flags */
665  ot->flag = OPTYPE_UNDO;
666 
667  /* properties */
669  ot->srna, "align", false, "Align Handles", "Aligns opposite point handle during transform");
671  ot->srna, "select", true, "Select", "Attempt to select a point handle before transform");
672 }
673 
675 {
677  const char *name;
678 
679  switch (mode) {
682  name = "PAINT_OT_image_paint";
683  break;
684  case PAINT_MODE_WEIGHT:
685  name = "PAINT_OT_weight_paint";
686  break;
687  case PAINT_MODE_VERTEX:
688  name = "PAINT_OT_vertex_paint";
689  break;
690  case PAINT_MODE_SCULPT:
691  name = "SCULPT_OT_brush_stroke";
692  break;
693  default:
694  return OPERATOR_PASS_THROUGH;
695  }
696 
698 }
699 
701 {
702  /* identifiers */
703  ot->name = "Draw Curve";
704  ot->description = "Draw curve";
705  ot->idname = "PAINTCURVE_OT_draw";
706 
707  /* api callbacks */
710 
711  /* flags */
712  ot->flag = OPTYPE_UNDO;
713 }
714 
715 static int paintcurve_cursor_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
716 {
718 
719  switch (mode) {
720  case PAINT_MODE_TEXTURE_2D: {
721  ARegion *region = CTX_wm_region(C);
723  float location[2];
724 
725  if (!sima) {
726  return OPERATOR_CANCELLED;
727  }
728 
730  &region->v2d, event->mval[0], event->mval[1], &location[0], &location[1]);
731  copy_v2_v2(sima->cursor, location);
733  break;
734  }
735  default:
737  break;
738  }
739 
740  return OPERATOR_FINISHED;
741 }
742 
744 {
745  /* identifiers */
746  ot->name = "Place Cursor";
747  ot->description = "Place cursor";
748  ot->idname = "PAINTCURVE_OT_cursor";
749 
750  /* api callbacks */
753 
754  /* flags */
755  ot->flag = 0;
756 }
struct Object * CTX_data_active_object(const bContext *C)
Definition: context.c:1279
struct ARegion * CTX_wm_region(const bContext *C)
Definition: context.c:725
struct SpaceImage * CTX_wm_space_image(const bContext *C)
Definition: context.c:800
struct Main * CTX_data_main(const bContext *C)
Definition: context.c:1018
struct RegionView3D * CTX_wm_region_view3d(const bContext *C)
Definition: context.c:769
struct wmWindow * CTX_wm_window(const bContext *C)
Definition: context.c:699
ePaintMode BKE_paintmode_get_active_from_context(const struct bContext *C)
struct Paint * BKE_paint_get_active_from_context(const struct bContext *C)
void BKE_paint_curve_clamp_endpoint_add_index(struct PaintCurve *pc, const int add_index)
Definition: paint.c:723
struct PaintCurve * BKE_paint_curve_add(struct Main *bmain, const char *name)
Definition: paint.c:691
ePaintMode
Definition: BKE_paint.h:78
@ PAINT_MODE_TEXTURE_3D
Definition: BKE_paint.h:84
@ PAINT_MODE_SCULPT
Definition: BKE_paint.h:79
@ PAINT_MODE_WEIGHT
Definition: BKE_paint.h:82
@ PAINT_MODE_TEXTURE_2D
Definition: BKE_paint.h:86
@ PAINT_MODE_VERTEX
Definition: BKE_paint.h:81
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void copy_v2_v2_int(int r[2], const int a[2])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void add_v2_v2(float r[2], const float a[2])
MINLINE float len_manhattan_v2v2(const float a[2], const float b[2]) ATTR_WARN_UNUSED_RESULT
MINLINE void add_v2_v2v2(float r[2], const float a[2], const float b[2])
MINLINE void sub_v2_v2v2(float r[2], const float a[2], const float b[2])
#define UNPACK2(a)
#define UNUSED(x)
@ BRUSH_CURVE
#define BEZT_ISSEL_ANY(bezt)
@ HD_ALIGN
#define OB_MODE_ALL_PAINT
Object is a sort of wrapper for general info.
@ SI_MODE_PAINT
@ OPERATOR_CANCELLED
@ OPERATOR_FINISHED
@ OPERATOR_RUNNING_MODAL
@ OPERATOR_PASS_THROUGH
void ED_paintcurve_undo_push_end(struct bContext *C)
void ED_paintcurve_undo_push_begin(const char *name)
@ V3D_CURSOR_ORIENT_VIEW
Definition: ED_view3d.h:100
void ED_view3d_cursor3d_update(struct bContext *C, const int mval[2], const bool use_depth, enum eV3DCursorOrient orientation)
Definition: view3d_edit.c:5151
Read Guarded memory(de)allocation.
@ PROP_SKIP_SAVE
Definition: RNA_types.h:204
#define C
Definition: RandGen.cpp:39
void UI_view2d_region_to_view(const struct View2D *v2d, float x, float y, float *r_view_x, float *r_view_y) ATTR_NONNULL()
@ OPTYPE_UNDO
Definition: WM_types.h:155
@ OPTYPE_REGISTER
Definition: WM_types.h:153
@ WM_OP_INVOKE_DEFAULT
Definition: WM_types.h:197
#define NC_PAINTCURVE
Definition: WM_types.h:297
#define NA_ADDED
Definition: WM_types.h:464
#define ND_SPACE_IMAGE
Definition: WM_types.h:417
#define NC_SPACE
Definition: WM_types.h:293
#define KM_RELEASE
Definition: WM_types.h:243
bool closest(btVector3 &v)
#define SELECT
uint pos
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:41
void *(* MEM_mallocN)(size_t len, const char *str)
Definition: mallocn.c:47
IMETHOD Vector diff(const Vector &a, const Vector &b, double dt=1)
static int paintcurve_slide_invoke(bContext *C, wmOperator *op, const wmEvent *event)
Definition: paint_curve.c:549
struct PointSlideData PointSlideData
static int paintcurve_new_exec(bContext *C, wmOperator *UNUSED(op))
Definition: paint_curve.c:158
bool paint_curve_poll(bContext *C)
Definition: paint_curve.c:54
static int paintcurve_slide_modal(bContext *C, wmOperator *op, const wmEvent *event)
Definition: paint_curve.c:610
static PaintCurvePoint * paintcurve_point_get_closest(PaintCurve *pc, const float pos[2], bool ignore_pivot, const float threshold, char *point)
Definition: paint_curve.c:85
void PAINTCURVE_OT_new(wmOperatorType *ot)
Definition: paint_curve.c:172
static int paintcurve_point_co_index(char sel)
Definition: paint_curve.c:126
static void paintcurve_point_add(bContext *C, wmOperator *op, const int loc[2])
Definition: paint_curve.c:187
#define PAINT_CURVE_POINT_SELECT(pcp, i)
Definition: paint_curve.c:52
static int paintcurve_add_point_invoke(bContext *C, wmOperator *op, const wmEvent *event)
Definition: paint_curve.c:249
static int paintcurve_cursor_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
Definition: paint_curve.c:715
void PAINTCURVE_OT_add_point(wmOperatorType *ot)
Definition: paint_curve.c:270
void PAINTCURVE_OT_delete_point(wmOperatorType *ot)
Definition: paint_curve.c:362
static int paintcurve_delete_point_exec(bContext *C, wmOperator *op)
Definition: paint_curve.c:298
static int paintcurve_select_point_exec(bContext *C, wmOperator *op)
Definition: paint_curve.c:490
void PAINTCURVE_OT_draw(wmOperatorType *ot)
Definition: paint_curve.c:700
#define PAINT_CURVE_SELECT_THRESHOLD
Definition: paint_curve.c:51
#define SEL_F1
Definition: paint_curve.c:80
#define SEL_F2
Definition: paint_curve.c:81
static int paintcurve_draw_exec(bContext *C, wmOperator *UNUSED(op))
Definition: paint_curve.c:674
static char paintcurve_point_side_index(const BezTriple *bezt, const bool is_first, const char fallback)
Definition: paint_curve.c:136
static int paintcurve_select_point_invoke(bContext *C, wmOperator *op, const wmEvent *event)
Definition: paint_curve.c:478
static bool paintcurve_point_select(bContext *C, wmOperator *op, const int loc[2], bool toggle, bool extend)
Definition: paint_curve.c:377
#define SEL_F3
Definition: paint_curve.c:82
void PAINTCURVE_OT_cursor(wmOperatorType *ot)
Definition: paint_curve.c:743
void PAINTCURVE_OT_slide(wmOperatorType *ot)
Definition: paint_curve.c:652
#define DELETE_TAG
static int paintcurve_add_point_exec(bContext *C, wmOperator *op)
Definition: paint_curve.c:257
void PAINTCURVE_OT_select(wmOperatorType *ot)
Definition: paint_curve.c:506
void RNA_int_set_array(PointerRNA *ptr, const char *name, const int *values)
Definition: rna_access.c:6343
void RNA_int_get_array(PointerRNA *ptr, const char *name, int *values)
Definition: rna_access.c:6331
bool RNA_struct_property_is_set(PointerRNA *ptr, const char *identifier)
Definition: rna_access.c:6685
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:6261
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, bool default_value, const char *ui_name, const char *ui_description)
Definition: rna_define.c:3481
PropertyRNA * RNA_def_int_vector(StructOrFunctionRNA *cont_, const char *identifier, int len, const int *default_value, int hardmin, int hardmax, const char *ui_name, const char *ui_description, int softmin, int softmax)
Definition: rna_define.c:3611
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
Definition: rna_define.c:1512
float vec[3][3]
struct PaintCurve * paint_curve
Definition: BKE_main.h:116
PaintCurvePoint * points
struct Brush * brush
float point_initial_loc[3][2]
Definition: paint_curve.c:544
PaintCurvePoint * pcp
Definition: paint_curve.c:541
int initial_loc[2]
Definition: paint_curve.c:543
float cursor[2]
short val
Definition: WM_types.h:579
int mval[2]
Definition: WM_types.h:583
short type
Definition: WM_types.h:577
int(* invoke)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:752
const char * name
Definition: WM_types.h:721
int(* modal)(struct bContext *, struct wmOperator *, const struct wmEvent *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:768
const char * idname
Definition: WM_types.h:723
bool(* poll)(struct bContext *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:776
struct StructRNA * srna
Definition: WM_types.h:802
const char * description
Definition: WM_types.h:726
int(* exec)(struct bContext *, struct wmOperator *) ATTR_WARN_UNUSED_RESULT
Definition: WM_types.h:736
struct wmOperatorType * type
struct PointerRNA * ptr
__forceinline const avxb select(const avxb &m, const avxb &t, const avxb &f)
Definition: util_avxb.h:167
void WM_paint_cursor_tag_redraw(wmWindow *win, ARegion *UNUSED(region))
Definition: wm_draw.c:1025
wmEventHandler_Op * WM_event_add_modal_handler(bContext *C, wmOperator *op)
int WM_operator_name_call(bContext *C, const char *opstring, short context, PointerRNA *properties)
void WM_event_add_notifier(const bContext *C, uint type, void *reference)
@ MOUSEMOVE
wmOperatorType * ot
Definition: wm_files.c:3156