Cleanup: remove tabs after line start
[blender.git] / source / blender / makesrna / intern / rna_mask.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Blender Foundation,
19  *                 Sergey Sharybin
20  *
21  * ***** END GPL LICENSE BLOCK *****
22  */
23
24 /** \file blender/makesrna/intern/rna_mask.c
25  *  \ingroup RNA
26  */
27
28
29 #include <stdlib.h>
30 #include <limits.h>
31
32 #include "MEM_guardedalloc.h"
33
34 #include "DNA_mask_types.h"
35 #include "DNA_object_types.h"  /* SELECT */
36 #include "DNA_scene_types.h"
37
38 #include "BLT_translation.h"
39
40 #include "BKE_movieclip.h"
41 #include "BKE_tracking.h"
42
43 #include "RNA_define.h"
44 #include "RNA_enum_types.h"
45
46 #include "rna_internal.h"
47
48 #include "WM_types.h"
49
50 #include "IMB_imbuf_types.h"
51 #include "IMB_imbuf.h"
52
53 #ifdef RNA_RUNTIME
54
55 #include "BLI_math.h"
56
57 #include "DNA_movieclip_types.h"
58
59 #include "BKE_mask.h"
60
61 #include "DEG_depsgraph.h"
62
63 #include "RNA_access.h"
64
65 #include "WM_api.h"
66
67 static void rna_Mask_update_data(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
68 {
69         Mask *mask = ptr->id.data;
70
71         WM_main_add_notifier(NC_MASK | ND_DATA, mask);
72         DEG_id_tag_update( &mask->id, 0);
73 }
74
75 static void rna_Mask_update_parent(Main *bmain, Scene *scene, PointerRNA *ptr)
76 {
77         MaskParent *parent = ptr->data;
78
79         if (parent->id) {
80                 if (GS(parent->id->name) == ID_MC) {
81                         MovieClip *clip = (MovieClip *) parent->id;
82                         MovieTracking *tracking = &clip->tracking;
83                         MovieTrackingObject *object = BKE_tracking_object_get_named(tracking, parent->parent);
84
85                         if (object) {
86                                 int clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, scene->r.cfra);
87
88                                 if (parent->type == MASK_PARENT_POINT_TRACK) {
89                                         MovieTrackingTrack *track = BKE_tracking_track_get_named(tracking, object, parent->sub_parent);
90
91                                         if (track) {
92                                                 MovieTrackingMarker *marker = BKE_tracking_marker_get(track, clip_framenr);
93                                                 float marker_pos_ofs[2], parmask_pos[2];
94                                                 MovieClipUser user = {0};
95
96                                                 BKE_movieclip_user_set_frame(&user, scene->r.cfra);
97
98                                                 add_v2_v2v2(marker_pos_ofs, marker->pos, track->offset);
99
100                                                 BKE_mask_coord_from_movieclip(clip, &user, parmask_pos, marker_pos_ofs);
101
102                                                 copy_v2_v2(parent->parent_orig, parmask_pos);
103                                         }
104                                 }
105                                 else /* if (parent->type == MASK_PARENT_PLANE_TRACK) */ {
106                                         MovieTrackingPlaneTrack *plane_track = BKE_tracking_plane_track_get_named(tracking, object, parent->sub_parent);
107                                         if (plane_track) {
108                                                 MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get(plane_track, clip_framenr);
109
110                                                 memcpy(parent->parent_corners_orig, plane_marker->corners, sizeof(parent->parent_corners_orig));
111                                                 zero_v2(parent->parent_orig);
112                                         }
113                                 }
114                         }
115                 }
116         }
117
118         rna_Mask_update_data(bmain, scene, ptr);
119 }
120
121 /* note: this function exists only to avoid id refcounting */
122 static void rna_MaskParent_id_set(PointerRNA *ptr, PointerRNA value)
123 {
124         MaskParent *mpar = (MaskParent *) ptr->data;
125
126         mpar->id = value.data;
127 }
128
129 static StructRNA *rna_MaskParent_id_typef(PointerRNA *ptr)
130 {
131         MaskParent *mpar = (MaskParent *) ptr->data;
132
133         return ID_code_to_RNA_type(mpar->id_type);
134 }
135
136 static void rna_MaskParent_id_type_set(PointerRNA *ptr, int value)
137 {
138         MaskParent *mpar = (MaskParent *) ptr->data;
139
140         /* change ID-type to the new type */
141         mpar->id_type = value;
142
143         /* clear the id-block if the type is invalid */
144         if ((mpar->id) && (GS(mpar->id->name) != mpar->id_type))
145                 mpar->id = NULL;
146 }
147
148 static void rna_Mask_layers_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
149 {
150         Mask *mask = (Mask *)ptr->id.data;
151
152         rna_iterator_listbase_begin(iter, &mask->masklayers, NULL);
153 }
154
155 static int rna_Mask_layer_active_index_get(PointerRNA *ptr)
156 {
157         Mask *mask = (Mask *)ptr->id.data;
158
159         return mask->masklay_act;
160 }
161
162 static void rna_Mask_layer_active_index_set(PointerRNA *ptr, int value)
163 {
164         Mask *mask = (Mask *)ptr->id.data;
165
166         mask->masklay_act = value;
167 }
168
169 static void rna_Mask_layer_active_index_range(PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
170 {
171         Mask *mask = (Mask *)ptr->id.data;
172
173         *min = 0;
174         *max = max_ii(0, mask->masklay_tot - 1);
175
176         *softmin = *min;
177         *softmax = *max;
178 }
179
180 static char *rna_MaskLayer_path(PointerRNA *ptr)
181 {
182         MaskLayer *masklay = (MaskLayer *)ptr->data;
183         char name_esc[sizeof(masklay->name) * 2];
184         BLI_strescape(name_esc, masklay->name, sizeof(name_esc));
185         return BLI_sprintfN("layers[\"%s\"]", name_esc);
186 }
187
188 static PointerRNA rna_Mask_layer_active_get(PointerRNA *ptr)
189 {
190         Mask *mask = (Mask *)ptr->id.data;
191         MaskLayer *masklay = BKE_mask_layer_active(mask);
192
193         return rna_pointer_inherit_refine(ptr, &RNA_MaskLayer, masklay);
194 }
195
196 static void rna_Mask_layer_active_set(PointerRNA *ptr, PointerRNA value)
197 {
198         Mask *mask = (Mask *)ptr->id.data;
199         MaskLayer *masklay = (MaskLayer *)value.data;
200
201         BKE_mask_layer_active_set(mask, masklay);
202 }
203
204 static void rna_MaskLayer_splines_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
205 {
206         MaskLayer *masklay = (MaskLayer *)ptr->data;
207
208         rna_iterator_listbase_begin(iter, &masklay->splines, NULL);
209 }
210
211 static void rna_MaskLayer_name_set(PointerRNA *ptr, const char *value)
212 {
213         Mask *mask = (Mask *)ptr->id.data;
214         MaskLayer *masklay = (MaskLayer *)ptr->data;
215         char oldname[sizeof(masklay->name)], newname[sizeof(masklay->name)];
216
217         /* need to be on the stack */
218         BLI_strncpy(oldname, masklay->name, sizeof(masklay->name));
219         BLI_strncpy_utf8(newname, value, sizeof(masklay->name));
220
221         BKE_mask_layer_rename(mask, masklay, oldname, newname);
222 }
223
224 static PointerRNA rna_MaskLayer_active_spline_get(PointerRNA *ptr)
225 {
226         MaskLayer *masklay = (MaskLayer *)ptr->data;
227
228         return rna_pointer_inherit_refine(ptr, &RNA_MaskSpline, masklay->act_spline);
229 }
230
231 static void rna_MaskLayer_active_spline_set(PointerRNA *ptr, PointerRNA value)
232 {
233         MaskLayer *masklay = (MaskLayer *)ptr->data;
234         MaskSpline *spline = (MaskSpline *)value.data;
235         int index = BLI_findindex(&masklay->splines, spline);
236
237         if (index != -1)
238                 masklay->act_spline = spline;
239         else
240                 masklay->act_spline = NULL;
241 }
242
243 static PointerRNA rna_MaskLayer_active_spline_point_get(PointerRNA *ptr)
244 {
245         MaskLayer *masklay = (MaskLayer *)ptr->data;
246
247         return rna_pointer_inherit_refine(ptr, &RNA_MaskSplinePoint, masklay->act_point);
248 }
249
250 static void rna_MaskLayer_active_spline_point_set(PointerRNA *ptr, PointerRNA value)
251 {
252         MaskLayer *masklay = (MaskLayer *)ptr->data;
253         MaskSpline *spline;
254         MaskSplinePoint *point = (MaskSplinePoint *)value.data;
255
256         masklay->act_point = NULL;
257
258         for (spline = masklay->splines.first; spline; spline = spline->next) {
259                 if (point >= spline->points && point < spline->points + spline->tot_point) {
260                         masklay->act_point = point;
261
262                         break;
263                 }
264         }
265 }
266
267 static void rna_MaskSplinePoint_handle1_get(PointerRNA *ptr, float *values)
268 {
269         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
270         BezTriple *bezt = &point->bezt;
271         copy_v2_v2(values, bezt->vec[0]);
272 }
273
274 static void rna_MaskSplinePoint_handle1_set(PointerRNA *ptr, const float *values)
275 {
276         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
277         BezTriple *bezt = &point->bezt;
278         copy_v2_v2(bezt->vec[0], values);
279 }
280
281 static void rna_MaskSplinePoint_handle2_get(PointerRNA *ptr, float *values)
282 {
283         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
284         BezTriple *bezt = &point->bezt;
285         copy_v2_v2(values, bezt->vec[2]);
286 }
287
288 static void rna_MaskSplinePoint_handle2_set(PointerRNA *ptr, const float *values)
289 {
290         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
291         BezTriple *bezt = &point->bezt;
292         copy_v2_v2(bezt->vec[2], values);
293 }
294
295 static void rna_MaskSplinePoint_ctrlpoint_get(PointerRNA *ptr, float *values)
296 {
297         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
298         BezTriple *bezt = &point->bezt;
299         copy_v2_v2(values, bezt->vec[1]);
300 }
301
302 static void rna_MaskSplinePoint_ctrlpoint_set(PointerRNA *ptr, const float *values)
303 {
304         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
305         BezTriple *bezt = &point->bezt;
306         copy_v2_v2(bezt->vec[1], values);
307 }
308
309 static int rna_MaskSplinePoint_handle_type_get(PointerRNA *ptr)
310 {
311         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
312         BezTriple *bezt = &point->bezt;
313
314         return bezt->h1;
315 }
316
317 static MaskSpline *mask_spline_from_point(Mask *mask, MaskSplinePoint *point)
318 {
319         MaskLayer *mask_layer;
320         for (mask_layer = mask->masklayers.first;
321              mask_layer;
322              mask_layer = mask_layer->next)
323         {
324                 MaskSpline *spline;
325                 for (spline = mask_layer->splines.first;
326                      spline;
327                      spline = spline->next)
328                 {
329                         if (point >= spline->points && point < spline->points + spline->tot_point) {
330                                 return spline;
331                         }
332                 }
333         }
334         return NULL;
335 }
336
337 static void mask_point_check_stick(MaskSplinePoint *point)
338 {
339         BezTriple *bezt = &point->bezt;
340         if (bezt->h1 == HD_ALIGN && bezt->h2 == HD_ALIGN) {
341                 float vec[3];
342                 sub_v3_v3v3(vec, bezt->vec[0], bezt->vec[1]);
343                 add_v3_v3v3(bezt->vec[2], bezt->vec[1], vec);
344         }
345 }
346
347 static void rna_MaskSplinePoint_handle_type_set(PointerRNA *ptr, int value)
348 {
349         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
350         BezTriple *bezt = &point->bezt;
351         MaskSpline *spline = mask_spline_from_point((Mask *) ptr->id.data, point);
352
353         bezt->h1 = bezt->h2 = value;
354         mask_point_check_stick(point);
355         BKE_mask_calc_handle_point(spline, point);
356 }
357
358 static int rna_MaskSplinePoint_handle_left_type_get(PointerRNA *ptr)
359 {
360         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
361         BezTriple *bezt = &point->bezt;
362
363         return bezt->h1;
364 }
365
366 static void rna_MaskSplinePoint_handle_left_type_set(PointerRNA *ptr, int value)
367 {
368         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
369         BezTriple *bezt = &point->bezt;
370         MaskSpline *spline = mask_spline_from_point((Mask *) ptr->id.data, point);
371
372         bezt->h1 = value;
373         mask_point_check_stick(point);
374         BKE_mask_calc_handle_point(spline, point);
375 }
376
377 static int rna_MaskSplinePoint_handle_right_type_get(PointerRNA *ptr)
378 {
379         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
380         BezTriple *bezt = &point->bezt;
381
382         return bezt->h2;
383 }
384
385 static void rna_MaskSplinePoint_handle_right_type_set(PointerRNA *ptr, int value)
386 {
387         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
388         BezTriple *bezt = &point->bezt;
389         MaskSpline *spline = mask_spline_from_point((Mask *) ptr->id.data, point);
390
391         bezt->h2 = value;
392         mask_point_check_stick(point);
393         BKE_mask_calc_handle_point(spline, point);
394 }
395
396 /* ** API **  */
397
398 static MaskLayer *rna_Mask_layers_new(Mask *mask, const char *name)
399 {
400         MaskLayer *masklay = BKE_mask_layer_new(mask, name);
401
402         WM_main_add_notifier(NC_MASK | NA_EDITED, mask);
403
404         return masklay;
405 }
406
407 static void rna_Mask_layers_remove(Mask *mask, ReportList *reports, PointerRNA *masklay_ptr)
408 {
409         MaskLayer *masklay = masklay_ptr->data;
410         if (BLI_findindex(&mask->masklayers, masklay) == -1) {
411                 BKE_reportf(reports, RPT_ERROR, "Mask layer '%s' not found in mask '%s'", masklay->name, mask->id.name + 2);
412                 return;
413         }
414
415         BKE_mask_layer_remove(mask, masklay);
416         RNA_POINTER_INVALIDATE(masklay_ptr);
417
418         WM_main_add_notifier(NC_MASK | NA_EDITED, mask);
419 }
420
421 static void rna_Mask_layers_clear(Mask *mask)
422 {
423         BKE_mask_layer_free_list(&mask->masklayers);
424
425         WM_main_add_notifier(NC_MASK | NA_EDITED, mask);
426 }
427
428 static MaskSpline *rna_MaskLayer_spline_new(ID *id, MaskLayer *mask_layer)
429 {
430         Mask *mask = (Mask *) id;
431         MaskSpline *new_spline;
432
433         new_spline = BKE_mask_spline_add(mask_layer);
434
435         WM_main_add_notifier(NC_MASK | NA_EDITED, mask);
436
437         return new_spline;
438 }
439
440 static void rna_MaskLayer_spline_remove(ID *id, MaskLayer *mask_layer, ReportList *reports, PointerRNA *spline_ptr)
441 {
442         Mask *mask = (Mask *) id;
443         MaskSpline *spline = spline_ptr->data;
444
445         if (BKE_mask_spline_remove(mask_layer, spline) == false) {
446                 BKE_reportf(reports, RPT_ERROR, "Mask layer '%s' does not contain spline given", mask_layer->name);
447                 return;
448         }
449
450         RNA_POINTER_INVALIDATE(spline_ptr);
451
452         DEG_id_tag_update(&mask->id, ID_RECALC_GEOMETRY);
453 }
454
455 static void rna_Mask_start_frame_set(PointerRNA *ptr, int value)
456 {
457         Mask *data = (Mask *)ptr->data;
458         /* MINFRAME not MINAFRAME, since some output formats can't taken negative frames */
459         CLAMP(value, MINFRAME, MAXFRAME);
460         data->sfra = value;
461
462         if (data->sfra >= data->efra) {
463                 data->efra = MIN2(data->sfra, MAXFRAME);
464         }
465 }
466
467 static void rna_Mask_end_frame_set(PointerRNA *ptr, int value)
468 {
469         Mask *data = (Mask *)ptr->data;
470         CLAMP(value, MINFRAME, MAXFRAME);
471         data->efra = value;
472
473         if (data->sfra >= data->efra) {
474                 data->sfra = MAX2(data->efra, MINFRAME);
475         }
476 }
477
478 static void rna_MaskSpline_points_add(ID *id, MaskSpline *spline, int count)
479 {
480         Mask *mask = (Mask *) id;
481         MaskLayer *layer;
482         int active_point_index = -1;
483         int i, spline_shape_index;
484
485         if (count <= 0) {
486                 return;
487         }
488
489         for (layer = mask->masklayers.first; layer; layer = layer->next) {
490                 if (BLI_findindex(&layer->splines, spline) != -1) {
491                         break;
492                 }
493         }
494
495         if (!layer) {
496                 /* Shall not happen actually */
497                 BLI_assert(!"No layer found for the spline");
498                 return;
499         }
500
501         if (layer->act_spline == spline) {
502                 active_point_index = layer->act_point - spline->points;
503         }
504
505         spline->points = MEM_recallocN(spline->points, sizeof(MaskSplinePoint) * (spline->tot_point + count));
506         spline->tot_point += count;
507
508         if (active_point_index >= 0) {
509                 layer->act_point = spline->points + active_point_index;
510         }
511
512         spline_shape_index = BKE_mask_layer_shape_spline_to_index(layer, spline);
513
514         for (i = 0; i < count; i++) {
515                 int point_index = spline->tot_point - count + i;
516                 MaskSplinePoint *new_point = spline->points + point_index;
517                 new_point->bezt.h1 = new_point->bezt.h2 = HD_ALIGN;
518                 BKE_mask_calc_handle_point_auto(spline, new_point, true);
519                 BKE_mask_parent_init(&new_point->parent);
520
521                 /* Not efficient, but there's no other way for now */
522                 BKE_mask_layer_shape_changed_add(layer, spline_shape_index + point_index, true, true);
523         }
524
525         WM_main_add_notifier(NC_MASK | ND_DATA, mask);
526         DEG_id_tag_update(&mask->id, 0);
527 }
528
529 static void rna_MaskSpline_point_remove(ID *id, MaskSpline *spline, ReportList *reports, PointerRNA *point_ptr)
530 {
531         Mask *mask = (Mask *) id;
532         MaskSplinePoint *point = point_ptr->data;
533         MaskSplinePoint *new_point_array;
534         MaskLayer *layer;
535         int active_point_index = -1;
536         int point_index;
537
538         for (layer = mask->masklayers.first; layer; layer = layer->next) {
539                 if (BLI_findindex(&layer->splines, spline) != -1) {
540                         break;
541                 }
542         }
543
544         if (!layer) {
545                 /* Shall not happen actually */
546                 BKE_report(reports, RPT_ERROR, "Mask layer not found for given spline");
547                 return;
548         }
549
550         if (point < spline->points || point >= spline->points + spline->tot_point) {
551                 BKE_report(reports, RPT_ERROR, "Point is not found in given spline");
552                 return;
553         }
554
555         if (layer->act_spline == spline) {
556                 active_point_index = layer->act_point - spline->points;
557         }
558
559         point_index = point - spline->points;
560
561         new_point_array = MEM_mallocN(sizeof(MaskSplinePoint) * (spline->tot_point - 1), "remove mask point");
562
563         memcpy(new_point_array, spline->points, sizeof(MaskSplinePoint) * point_index);
564         memcpy(new_point_array + point_index, spline->points + point_index + 1,
565                sizeof(MaskSplinePoint) * (spline->tot_point - point_index - 1));
566
567         MEM_freeN(spline->points);
568         spline->points = new_point_array;
569         spline->tot_point--;
570
571         if (active_point_index >= 0) {
572                 if (active_point_index == point_index) {
573                         layer->act_point = NULL;
574                 }
575                 else if (active_point_index < point_index) {
576                         layer->act_point = spline->points + active_point_index;
577                 }
578                 else {
579                         layer->act_point = spline->points + active_point_index - 1;
580                 }
581         }
582
583         BKE_mask_layer_shape_changed_remove(layer, BKE_mask_layer_shape_spline_to_index(layer, spline) + point_index, 1);
584
585         WM_main_add_notifier(NC_MASK | ND_DATA, mask);
586         DEG_id_tag_update(&mask->id, 0);
587
588         RNA_POINTER_INVALIDATE(point_ptr);
589 }
590
591 #else
592 static void rna_def_maskParent(BlenderRNA *brna)
593 {
594         StructRNA *srna;
595         PropertyRNA *prop;
596
597         static const EnumPropertyItem mask_id_type_items[] = {
598                 {ID_MC, "MOVIECLIP", ICON_SEQUENCE, "Movie Clip", ""},
599                 {0, NULL, 0, NULL, NULL}};
600
601         static const EnumPropertyItem parent_type_items[] = {
602                 {MASK_PARENT_POINT_TRACK, "POINT_TRACK", 0, "Point Track", ""},
603                 {MASK_PARENT_PLANE_TRACK, "PLANE_TRACK", 0, "Plane Track", ""},
604                 {0, NULL, 0, NULL, NULL}};
605
606         srna = RNA_def_struct(brna, "MaskParent", NULL);
607         RNA_def_struct_ui_text(srna, "Mask Parent", "Parenting settings for masking element");
608
609         /* Target Properties - ID-block to Drive */
610         prop = RNA_def_property(srna, "id", PROP_POINTER, PROP_NONE);
611         RNA_def_property_struct_type(prop, "ID");
612         RNA_def_property_flag(prop, PROP_EDITABLE);
613         // RNA_def_property_editable_func(prop, "rna_maskSpline_id_editable");
614         /* note: custom set function is ONLY to avoid rna setting a user for this. */
615         RNA_def_property_pointer_funcs(prop, NULL, "rna_MaskParent_id_set", "rna_MaskParent_id_typef", NULL);
616         RNA_def_property_ui_text(prop, "ID", "ID-block to which masking element would be parented to or to it's property");
617         RNA_def_property_update(prop, 0, "rna_Mask_update_parent");
618
619         prop = RNA_def_property(srna, "id_type", PROP_ENUM, PROP_NONE);
620         RNA_def_property_enum_sdna(prop, NULL, "id_type");
621         RNA_def_property_enum_items(prop, mask_id_type_items);
622         RNA_def_property_enum_default(prop, ID_MC);
623         RNA_def_property_enum_funcs(prop, NULL, "rna_MaskParent_id_type_set", NULL);
624         //RNA_def_property_editable_func(prop, "rna_MaskParent_id_type_editable");
625         RNA_def_property_ui_text(prop, "ID Type", "Type of ID-block that can be used");
626         RNA_def_property_update(prop, 0, "rna_Mask_update_parent");
627
628         /* type */
629         prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
630         RNA_def_property_enum_items(prop, parent_type_items);
631         RNA_def_property_ui_text(prop, "Parent Type", "Parent Type");
632         RNA_def_property_update(prop, 0, "rna_Mask_update_parent");
633
634         /* parent */
635         prop = RNA_def_property(srna, "parent", PROP_STRING, PROP_NONE);
636         RNA_def_property_ui_text(prop, "Parent", "Name of parent object in specified data-block to which parenting happens");
637         RNA_def_property_string_maxlength(prop, MAX_ID_NAME - 2);
638         RNA_def_property_update(prop, 0, "rna_Mask_update_parent");
639
640         /* sub_parent */
641         prop = RNA_def_property(srna, "sub_parent", PROP_STRING, PROP_NONE);
642         RNA_def_property_ui_text(prop, "Sub Parent", "Name of parent sub-object in specified data-block to which parenting happens");
643         RNA_def_property_string_maxlength(prop, MAX_ID_NAME - 2);
644         RNA_def_property_update(prop, 0, "rna_Mask_update_parent");
645 }
646
647 static void rna_def_maskSplinePointUW(BlenderRNA *brna)
648 {
649         StructRNA *srna;
650         PropertyRNA *prop;
651
652         srna = RNA_def_struct(brna, "MaskSplinePointUW", NULL);
653         RNA_def_struct_ui_text(srna, "Mask Spline UW Point", "Single point in spline segment defining feather");
654
655         /* u */
656         prop = RNA_def_property(srna, "u", PROP_FLOAT, PROP_NONE);
657         RNA_def_property_float_sdna(prop, NULL, "u");
658         RNA_def_property_range(prop, 0.0, 1.0);
659         RNA_def_property_ui_text(prop, "U", "U coordinate of point along spline segment");
660         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
661
662         /* weight */
663         prop = RNA_def_property(srna, "weight", PROP_FLOAT, PROP_NONE);
664         RNA_def_property_float_sdna(prop, NULL, "w");
665         RNA_def_property_range(prop, 0.0, 1.0);
666         RNA_def_property_ui_text(prop, "Weight", "Weight of feather point");
667         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
668
669         /* select */
670         prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
671         RNA_def_property_boolean_sdna(prop, NULL, "flag", SELECT);
672         RNA_def_property_ui_text(prop, "Select", "Selection status");
673         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
674 }
675
676 static void rna_def_maskSplinePoint(BlenderRNA *brna)
677 {
678         StructRNA *srna;
679         PropertyRNA *prop;
680
681         static const EnumPropertyItem handle_type_items[] = {
682                 {HD_AUTO, "AUTO", 0, "Auto", ""},
683                 {HD_VECT, "VECTOR", 0, "Vector", ""},
684                 {HD_ALIGN, "ALIGNED", 0, "Aligned Single", ""},
685                 {HD_ALIGN_DOUBLESIDE, "ALIGNED_DOUBLESIDE", 0, "Aligned", ""},
686                 {HD_FREE, "FREE", 0, "Free", ""},
687                 {0, NULL, 0, NULL, NULL}};
688
689         rna_def_maskSplinePointUW(brna);
690
691         srna = RNA_def_struct(brna, "MaskSplinePoint", NULL);
692         RNA_def_struct_ui_text(srna, "Mask Spline Point", "Single point in spline used for defining mask");
693
694         /* Vector values */
695         prop = RNA_def_property(srna, "handle_left", PROP_FLOAT, PROP_TRANSLATION);
696         RNA_def_property_array(prop, 2);
697         RNA_def_property_float_funcs(prop, "rna_MaskSplinePoint_handle1_get", "rna_MaskSplinePoint_handle1_set", NULL);
698         RNA_def_property_ui_text(prop, "Handle 1", "Coordinates of the first handle");
699         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
700
701         prop = RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
702         RNA_def_property_array(prop, 2);
703         RNA_def_property_float_funcs(prop, "rna_MaskSplinePoint_ctrlpoint_get", "rna_MaskSplinePoint_ctrlpoint_set", NULL);
704         RNA_def_property_ui_text(prop, "Control Point", "Coordinates of the control point");
705         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
706
707         prop = RNA_def_property(srna, "handle_right", PROP_FLOAT, PROP_TRANSLATION);
708         RNA_def_property_array(prop, 2);
709         RNA_def_property_float_funcs(prop, "rna_MaskSplinePoint_handle2_get", "rna_MaskSplinePoint_handle2_set", NULL);
710         RNA_def_property_ui_text(prop, "Handle 2", "Coordinates of the second handle");
711         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
712
713         /* handle_type */
714         prop = RNA_def_property(srna, "handle_type", PROP_ENUM, PROP_NONE);
715         RNA_def_property_enum_funcs(prop, "rna_MaskSplinePoint_handle_type_get", "rna_MaskSplinePoint_handle_type_set", NULL);
716         RNA_def_property_enum_items(prop, handle_type_items);
717         RNA_def_property_ui_text(prop, "Handle Type", "Handle type");
718         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
719
720         /* handle_type */
721         prop = RNA_def_property(srna, "handle_left_type", PROP_ENUM, PROP_NONE);
722         RNA_def_property_enum_funcs(prop, "rna_MaskSplinePoint_handle_left_type_get", "rna_MaskSplinePoint_handle_left_type_set", NULL);
723         RNA_def_property_enum_items(prop, handle_type_items);
724         RNA_def_property_ui_text(prop, "Handle 1 Type", "Handle type");
725         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
726
727         /* handle_right */
728         prop = RNA_def_property(srna, "handle_right_type", PROP_ENUM, PROP_NONE);
729         RNA_def_property_enum_funcs(prop, "rna_MaskSplinePoint_handle_right_type_get", "rna_MaskSplinePoint_handle_right_type_set", NULL);
730         RNA_def_property_enum_items(prop, handle_type_items);
731         RNA_def_property_ui_text(prop, "Handle 2 Type", "Handle type");
732         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
733
734         /* weight */
735         prop = RNA_def_property(srna, "weight", PROP_FLOAT, PROP_NONE);
736         RNA_def_property_float_sdna(prop, NULL, "bezt.weight");
737         RNA_def_property_range(prop, 0.0, 1.0);
738         RNA_def_property_ui_text(prop, "Weight", "Weight of the point");
739         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
740
741         /* select */
742         prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
743         RNA_def_property_boolean_sdna(prop, NULL, "bezt.f1", SELECT);
744         RNA_def_property_ui_text(prop, "Select", "Selection status");
745         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
746
747         /* parent */
748         prop = RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
749         RNA_def_property_struct_type(prop, "MaskParent");
750
751         /* feather points */
752         prop = RNA_def_property(srna, "feather_points", PROP_COLLECTION, PROP_NONE);
753         RNA_def_property_struct_type(prop, "MaskSplinePointUW");
754         RNA_def_property_collection_sdna(prop, NULL, "uw", "tot_uw");
755         RNA_def_property_ui_text(prop, "Feather Points", "Points defining feather");
756 }
757
758 static void rna_def_mask_splines(BlenderRNA *brna)
759 {
760         StructRNA *srna;
761         FunctionRNA *func;
762         PropertyRNA *prop;
763         PropertyRNA *parm;
764
765         srna = RNA_def_struct(brna, "MaskSplines", NULL);
766         RNA_def_struct_sdna(srna, "MaskLayer");
767         RNA_def_struct_ui_text(srna, "Mask Splines", "Collection of masking splines");
768
769         /* Create new spline */
770         func = RNA_def_function(srna, "new", "rna_MaskLayer_spline_new");
771         RNA_def_function_flag(func, FUNC_USE_SELF_ID);
772         RNA_def_function_ui_description(func, "Add a new spline to the layer");
773         parm = RNA_def_pointer(func, "spline", "MaskSpline", "", "The newly created spline");
774         RNA_def_function_return(func, parm);
775
776         /* Remove the spline */
777         func = RNA_def_function(srna, "remove", "rna_MaskLayer_spline_remove");
778         RNA_def_function_flag(func, FUNC_USE_SELF_ID);
779         RNA_def_function_ui_description(func, "Remove a spline from a layer");
780         RNA_def_function_flag(func, FUNC_USE_REPORTS);
781         parm = RNA_def_pointer(func, "spline", "MaskSpline", "", "The spline to remove");
782         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
783         RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
784
785         /* active spline */
786         prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
787         RNA_def_property_struct_type(prop, "MaskSpline");
788         RNA_def_property_pointer_funcs(prop, "rna_MaskLayer_active_spline_get", "rna_MaskLayer_active_spline_set", NULL, NULL);
789         RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_UNLINK);
790         RNA_def_property_ui_text(prop, "Active Spline", "Active spline of masking layer");
791
792         /* active point */
793         prop = RNA_def_property(srna, "active_point", PROP_POINTER, PROP_NONE);
794         RNA_def_property_struct_type(prop, "MaskSplinePoint");
795         RNA_def_property_pointer_funcs(prop, "rna_MaskLayer_active_spline_point_get", "rna_MaskLayer_active_spline_point_set", NULL, NULL);
796         RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_UNLINK);
797         RNA_def_property_ui_text(prop, "Active Spline", "Active spline of masking layer");
798 }
799
800 static void rna_def_maskSplinePoints(BlenderRNA *brna)
801 {
802         StructRNA *srna;
803         FunctionRNA *func;
804         PropertyRNA *parm;
805
806         srna = RNA_def_struct(brna, "MaskSplinePoints", NULL);
807         RNA_def_struct_sdna(srna, "MaskSpline");
808         RNA_def_struct_ui_text(srna, "Mask Spline Points", "Collection of masking spline points");
809
810         /* Create new point */
811         func = RNA_def_function(srna, "add", "rna_MaskSpline_points_add");
812         RNA_def_function_flag(func, FUNC_USE_SELF_ID);
813         RNA_def_function_ui_description(func, "Add a number of point to this spline");
814         parm = RNA_def_int(func, "count", 1, 0, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
815         RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
816
817         /* Remove the point */
818         func = RNA_def_function(srna, "remove", "rna_MaskSpline_point_remove");
819         RNA_def_function_flag(func, FUNC_USE_SELF_ID);
820         RNA_def_function_ui_description(func, "Remove a point from a spline");
821         RNA_def_function_flag(func, FUNC_USE_REPORTS);
822         parm = RNA_def_pointer(func, "point", "MaskSplinePoint", "", "The point to remove");
823         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
824         RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
825 }
826
827 static void rna_def_maskSpline(BlenderRNA *brna)
828 {
829         static const EnumPropertyItem spline_interpolation_items[] = {
830                 {MASK_SPLINE_INTERP_LINEAR, "LINEAR", 0, "Linear", ""},
831                 {MASK_SPLINE_INTERP_EASE, "EASE", 0, "Ease", ""},
832                 {0, NULL, 0, NULL, NULL}
833         };
834
835         static const EnumPropertyItem spline_offset_mode_items[] = {
836                 {MASK_SPLINE_OFFSET_EVEN, "EVEN", 0, "Even", "Calculate even feather offset"},
837                 {MASK_SPLINE_OFFSET_SMOOTH, "SMOOTH", 0, "Smooth", "Calculate feather offset as a second curve"},
838                 {0, NULL, 0, NULL, NULL}
839         };
840
841         StructRNA *srna;
842         PropertyRNA *prop;
843
844         rna_def_maskSplinePoint(brna);
845
846         srna = RNA_def_struct(brna, "MaskSpline", NULL);
847         RNA_def_struct_ui_text(srna, "Mask spline", "Single spline used for defining mask shape");
848
849         /* offset mode */
850         prop = RNA_def_property(srna, "offset_mode", PROP_ENUM, PROP_NONE);
851         RNA_def_property_enum_sdna(prop, NULL, "offset_mode");
852         RNA_def_property_enum_items(prop, spline_offset_mode_items);
853         RNA_def_property_ui_text(prop, "Feather Offset", "The method used for calculating the feather offset");
854         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
855
856         /* weight interpolation */
857         prop = RNA_def_property(srna, "weight_interpolation", PROP_ENUM, PROP_NONE);
858         RNA_def_property_enum_sdna(prop, NULL, "weight_interp");
859         RNA_def_property_enum_items(prop, spline_interpolation_items);
860         RNA_def_property_ui_text(prop, "Weight Interpolation", "The type of weight interpolation for spline");
861         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
862
863         /* cyclic */
864         prop = RNA_def_property(srna, "use_cyclic", PROP_BOOLEAN, PROP_NONE);
865         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
866         RNA_def_property_boolean_sdna(prop, NULL, "flag", MASK_SPLINE_CYCLIC);
867         RNA_def_property_ui_text(prop, "Cyclic", "Make this spline a closed loop");
868         RNA_def_property_update(prop, NC_MASK | NA_EDITED, "rna_Mask_update_data");
869
870         /* fill */
871         prop = RNA_def_property(srna, "use_fill", PROP_BOOLEAN, PROP_NONE);
872         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
873         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", MASK_SPLINE_NOFILL);
874         RNA_def_property_ui_text(prop, "Fill", "Make this spline filled");
875         RNA_def_property_update(prop, NC_MASK | NA_EDITED, "rna_Mask_update_data");
876
877         /* self-intersection check */
878         prop = RNA_def_property(srna, "use_self_intersection_check", PROP_BOOLEAN, PROP_NONE);
879         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
880         RNA_def_property_boolean_sdna(prop, NULL, "flag", MASK_SPLINE_NOINTERSECT);
881         RNA_def_property_ui_text(prop, "Self Intersection Check", "Prevent feather from self-intersections");
882         RNA_def_property_update(prop, NC_MASK | NA_EDITED, "rna_Mask_update_data");
883
884         prop = RNA_def_property(srna, "points", PROP_COLLECTION, PROP_NONE);
885         RNA_def_property_struct_type(prop, "MaskSplinePoint");
886         RNA_def_property_collection_sdna(prop, NULL, "points", "tot_point");
887         RNA_def_property_ui_text(prop, "Points", "Collection of points");
888         RNA_def_property_srna(prop, "MaskSplinePoints");
889 }
890
891 static void rna_def_mask_layer(BlenderRNA *brna)
892 {
893         static const EnumPropertyItem masklay_blend_mode_items[] = {
894                 {MASK_BLEND_MERGE_ADD, "MERGE_ADD", 0, "Merge Add", ""},
895                 {MASK_BLEND_MERGE_SUBTRACT, "MERGE_SUBTRACT", 0, "Merge Subtract", ""},
896                 {MASK_BLEND_ADD, "ADD", 0, "Add", ""},
897                 {MASK_BLEND_SUBTRACT, "SUBTRACT", 0, "Subtract", ""},
898                 {MASK_BLEND_LIGHTEN, "LIGHTEN", 0, "Lighten", ""},
899                 {MASK_BLEND_DARKEN, "DARKEN", 0, "Darken", ""},
900                 {MASK_BLEND_MUL, "MUL", 0, "Multiply", ""},
901                 {MASK_BLEND_REPLACE, "REPLACE", 0, "Replace", ""},
902                 {MASK_BLEND_DIFFERENCE, "DIFFERENCE", 0, "Difference", ""},
903                 {0, NULL, 0, NULL, NULL}
904         };
905
906         StructRNA *srna;
907         PropertyRNA *prop;
908
909         rna_def_maskSpline(brna);
910         rna_def_mask_splines(brna);
911         rna_def_maskSplinePoints(brna);
912
913         srna = RNA_def_struct(brna, "MaskLayer", NULL);
914         RNA_def_struct_ui_text(srna, "Mask Layer", "Single layer used for masking pixels");
915         RNA_def_struct_path_func(srna, "rna_MaskLayer_path");
916
917         /* name */
918         prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
919         RNA_def_property_ui_text(prop, "Name", "Unique name of layer");
920         RNA_def_property_string_funcs(prop, NULL, NULL, "rna_MaskLayer_name_set");
921         RNA_def_property_string_maxlength(prop, MAX_ID_NAME - 2);
922         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
923         RNA_def_struct_name_property(srna, prop);
924
925         /* splines */
926         prop = RNA_def_property(srna, "splines", PROP_COLLECTION, PROP_NONE);
927         RNA_def_property_collection_funcs(prop, "rna_MaskLayer_splines_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", NULL, NULL, NULL, NULL);
928         RNA_def_property_struct_type(prop, "MaskSpline");
929         RNA_def_property_ui_text(prop, "Splines", "Collection of splines which defines this layer");
930         RNA_def_property_srna(prop, "MaskSplines");
931
932         /* restrict */
933         prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
934         RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", MASK_RESTRICT_VIEW);
935         RNA_def_property_ui_text(prop, "Restrict View", "Restrict visibility in the viewport");
936         RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, -1);
937         RNA_def_property_update(prop, NC_MASK | ND_DRAW, NULL);
938
939         prop = RNA_def_property(srna, "hide_select", PROP_BOOLEAN, PROP_NONE);
940         RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", MASK_RESTRICT_SELECT);
941         RNA_def_property_ui_text(prop, "Restrict Select", "Restrict selection in the viewport");
942         RNA_def_property_ui_icon(prop, ICON_RESTRICT_SELECT_OFF, -1);
943         RNA_def_property_update(prop, NC_MASK | ND_DRAW, NULL);
944
945         prop = RNA_def_property(srna, "hide_render", PROP_BOOLEAN, PROP_NONE);
946         RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", MASK_RESTRICT_RENDER);
947         RNA_def_property_ui_text(prop, "Restrict Render", "Restrict renderability");
948         RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, -1);
949         RNA_def_property_update(prop, NC_MASK | NA_EDITED, NULL);
950
951         /* select (for dopesheet)*/
952         prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
953         RNA_def_property_boolean_sdna(prop, NULL, "flag", MASK_LAYERFLAG_SELECT);
954         RNA_def_property_ui_text(prop, "Select", "Layer is selected for editing in the Dope Sheet");
955 //      RNA_def_property_update(prop, NC_SCREEN | ND_MASK, NULL);
956
957         /* render settings */
958         prop = RNA_def_property(srna, "alpha", PROP_FLOAT, PROP_NONE);
959         RNA_def_property_float_sdna(prop, NULL, "alpha");
960         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1, 3);
961         RNA_def_property_ui_text(prop, "Opacity", "Render Opacity");
962         RNA_def_property_update(prop, NC_MASK | NA_EDITED, NULL);
963
964         /* weight interpolation */
965         prop = RNA_def_property(srna, "blend", PROP_ENUM, PROP_NONE);
966         RNA_def_property_enum_sdna(prop, NULL, "blend");
967         RNA_def_property_enum_items(prop, masklay_blend_mode_items);
968         RNA_def_property_ui_text(prop, "Blend", "Method of blending mask layers");
969         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
970         RNA_def_property_update(prop, NC_MASK | NA_EDITED, NULL);
971
972         prop = RNA_def_property(srna, "invert", PROP_BOOLEAN, PROP_NONE);
973         RNA_def_property_boolean_sdna(prop, NULL, "blend_flag", MASK_BLENDFLAG_INVERT);
974         RNA_def_property_ui_text(prop, "Restrict View", "Invert the mask black/white");
975         RNA_def_property_update(prop, NC_MASK | NA_EDITED, NULL);
976
977         prop = RNA_def_property(srna, "falloff", PROP_ENUM, PROP_NONE);
978         RNA_def_property_enum_sdna(prop, NULL, "falloff");
979         RNA_def_property_enum_items(prop, rna_enum_proportional_falloff_curve_only_items);
980         RNA_def_property_ui_text(prop, "Falloff", "Falloff type the feather");
981         RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_CURVE); /* Abusing id_curve :/ */
982         RNA_def_property_update(prop, NC_MASK | NA_EDITED, NULL);
983
984         /* filling options */
985         prop = RNA_def_property(srna, "use_fill_holes", PROP_BOOLEAN, PROP_NONE);
986         RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", MASK_LAYERFLAG_FILL_DISCRETE);
987         RNA_def_property_ui_text(prop, "Calculate Holes", "Calculate holes when filling overlapping curves");
988         RNA_def_property_update(prop, NC_MASK | NA_EDITED, NULL);
989
990         prop = RNA_def_property(srna, "use_fill_overlap", PROP_BOOLEAN, PROP_NONE);
991         RNA_def_property_boolean_sdna(prop, NULL, "flag", MASK_LAYERFLAG_FILL_OVERLAP);
992         RNA_def_property_ui_text(prop, "Calculate Overlap", "Calculate self intersections and overlap before filling");
993         RNA_def_property_update(prop, NC_MASK | NA_EDITED, NULL);
994 }
995
996 static void rna_def_masklayers(BlenderRNA *brna, PropertyRNA *cprop)
997 {
998         StructRNA *srna;
999         PropertyRNA *prop;
1000
1001         FunctionRNA *func;
1002         PropertyRNA *parm;
1003
1004         RNA_def_property_srna(cprop, "MaskLayers");
1005         srna = RNA_def_struct(brna, "MaskLayers", NULL);
1006         RNA_def_struct_sdna(srna, "Mask");
1007         RNA_def_struct_ui_text(srna, "Mask Layers", "Collection of layers used by mask");
1008
1009         func = RNA_def_function(srna, "new", "rna_Mask_layers_new");
1010         RNA_def_function_ui_description(func, "Add layer to this mask");
1011         RNA_def_string(func, "name", NULL, 0, "Name", "Name of new layer");
1012         parm = RNA_def_pointer(func, "layer", "MaskLayer", "", "New mask layer");
1013         RNA_def_function_return(func, parm);
1014
1015         func = RNA_def_function(srna, "remove", "rna_Mask_layers_remove");
1016         RNA_def_function_flag(func, FUNC_USE_REPORTS);
1017         RNA_def_function_ui_description(func, "Remove layer from this mask");
1018         parm = RNA_def_pointer(func, "layer", "MaskLayer", "", "Shape to be removed");
1019         RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED | PARM_RNAPTR);
1020         RNA_def_parameter_clear_flags(parm, PROP_THICK_WRAP, 0);
1021
1022         /* clear all layers */
1023         func = RNA_def_function(srna, "clear", "rna_Mask_layers_clear");
1024         RNA_def_function_ui_description(func, "Remove all mask layers");
1025
1026         /* active layer */
1027         prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
1028         RNA_def_property_struct_type(prop, "MaskLayer");
1029         RNA_def_property_pointer_funcs(prop, "rna_Mask_layer_active_get", "rna_Mask_layer_active_set", NULL, NULL);
1030         RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_UNLINK);
1031         RNA_def_property_ui_text(prop, "Active Shape", "Active layer in this mask");
1032 }
1033
1034 static void rna_def_mask(BlenderRNA *brna)
1035 {
1036         StructRNA *srna;
1037         PropertyRNA *prop;
1038
1039         rna_def_mask_layer(brna);
1040
1041         srna = RNA_def_struct(brna, "Mask", "ID");
1042         RNA_def_struct_ui_text(srna, "Mask", "Mask data-block defining mask for compositing");
1043         RNA_def_struct_ui_icon(srna, ICON_MOD_MASK);
1044
1045         /* mask layers */
1046         prop = RNA_def_property(srna, "layers", PROP_COLLECTION, PROP_NONE);
1047         RNA_def_property_collection_funcs(prop, "rna_Mask_layers_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", NULL, NULL, NULL, NULL);
1048         RNA_def_property_struct_type(prop, "MaskLayer");
1049         RNA_def_property_ui_text(prop, "Layers", "Collection of layers which defines this mask");
1050         rna_def_masklayers(brna, prop);
1051
1052         /* active masklay index */
1053         prop = RNA_def_property(srna, "active_layer_index", PROP_INT, PROP_NONE);
1054         RNA_def_property_int_sdna(prop, NULL, "masklay_act");
1055         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1056         RNA_def_property_int_funcs(prop, "rna_Mask_layer_active_index_get", "rna_Mask_layer_active_index_set", "rna_Mask_layer_active_index_range");
1057         RNA_def_property_ui_text(prop, "Active Shape Index", "Index of active layer in list of all mask's layers");
1058         RNA_def_property_update(prop, NC_MASK | ND_DRAW, NULL);
1059
1060         /* frame range */
1061         prop = RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME);
1062         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1063         RNA_def_property_int_sdna(prop, NULL, "sfra");
1064         RNA_def_property_int_funcs(prop, NULL, "rna_Mask_start_frame_set", NULL);
1065         RNA_def_property_range(prop, MINFRAME, MAXFRAME);
1066         RNA_def_property_ui_text(prop, "Start Frame", "First frame of the mask (used for sequencer)");
1067         RNA_def_property_update(prop, NC_MASK | ND_DRAW, NULL);
1068
1069         prop = RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME);
1070         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
1071         RNA_def_property_int_sdna(prop, NULL, "efra");
1072         RNA_def_property_int_funcs(prop, NULL, "rna_Mask_end_frame_set", NULL);
1073         RNA_def_property_range(prop, MINFRAME, MAXFRAME);
1074         RNA_def_property_ui_text(prop, "End Frame", "Final frame of the mask (used for sequencer)");
1075         RNA_def_property_update(prop, NC_MASK | ND_DRAW, NULL);
1076
1077         /* pointers */
1078         rna_def_animdata_common(srna);
1079 }
1080
1081 void RNA_def_mask(BlenderRNA *brna)
1082 {
1083         rna_def_maskParent(brna);
1084         rna_def_mask(brna);
1085 }
1086
1087 #endif