4144872a6371721ebf8cc7772fbbc2aa73923011
[blender-staging.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 "BLF_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 "DNA_mask_types.h"
56 #include "DNA_movieclip_types.h"
57
58 #include "BKE_depsgraph.h"
59 #include "BKE_mask.h"
60 #include "BKE_tracking.h"
61
62 #include "BLI_math.h"
63
64 #include "RNA_access.h"
65
66 #include "WM_api.h"
67
68 static void rna_Mask_update_data(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
69 {
70         Mask *mask = ptr->id.data;
71
72         WM_main_add_notifier(NC_MASK | ND_DATA, mask);
73         DAG_id_tag_update( &mask->id, 0);
74 }
75
76 static void rna_Mask_update_parent(Main *bmain, Scene *scene, PointerRNA *ptr)
77 {
78         MaskParent *parent = ptr->data;
79
80         if (parent->id) {
81                 if (GS(parent->id->name) == ID_MC) {
82                         MovieClip *clip = (MovieClip *) parent->id;
83                         MovieTracking *tracking = &clip->tracking;
84                         MovieTrackingObject *object = BKE_tracking_object_get_named(tracking, parent->parent);
85
86                         if (object) {
87                                 int clip_framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, scene->r.cfra);
88
89                                 if (parent->type == MASK_PARENT_POINT_TRACK) {
90                                         MovieTrackingTrack *track = BKE_tracking_track_get_named(tracking, object, parent->sub_parent);
91
92                                         if (track) {
93                                                 MovieTrackingMarker *marker = BKE_tracking_marker_get(track, clip_framenr);
94                                                 float marker_pos_ofs[2], parmask_pos[2];
95                                                 MovieClipUser user = {0};
96
97                                                 BKE_movieclip_user_set_frame(&user, scene->r.cfra);
98
99                                                 add_v2_v2v2(marker_pos_ofs, marker->pos, track->offset);
100
101                                                 BKE_mask_coord_from_movieclip(clip, &user, parmask_pos, marker_pos_ofs);
102
103                                                 copy_v2_v2(parent->parent_orig, parmask_pos);
104                                         }
105                                 }
106                                 else /* if (parent->type == MASK_PARENT_PLANE_TRACK) */ {
107                                         MovieTrackingPlaneTrack *plane_track = BKE_tracking_plane_track_get_named(tracking, object, parent->sub_parent);
108                                         if (plane_track) {
109                                                 MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get(plane_track, clip_framenr);
110
111                                                 memcpy(parent->parent_corners_orig, plane_marker->corners, sizeof(parent->parent_corners_orig));
112                                                 zero_v2(parent->parent_orig);
113                                         }
114                                 }
115                         }
116                 }
117         }
118
119         rna_Mask_update_data(bmain, scene, ptr);
120 }
121
122 /* note: this function exists only to avoid id refcounting */
123 static void rna_MaskParent_id_set(PointerRNA *ptr, PointerRNA value)
124 {
125         MaskParent *mpar = (MaskParent *) ptr->data;
126
127         mpar->id = value.data;
128 }
129
130 static StructRNA *rna_MaskParent_id_typef(PointerRNA *ptr)
131 {
132         MaskParent *mpar = (MaskParent *) ptr->data;
133
134         return ID_code_to_RNA_type(mpar->id_type);
135 }
136
137 static void rna_MaskParent_id_type_set(PointerRNA *ptr, int value)
138 {
139         MaskParent *mpar = (MaskParent *) ptr->data;
140
141         /* change ID-type to the new type */
142         mpar->id_type = value;
143
144         /* clear the id-block if the type is invalid */
145         if ((mpar->id) && (GS(mpar->id->name) != mpar->id_type))
146                 mpar->id = NULL;
147 }
148
149 static void rna_Mask_layers_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
150 {
151         Mask *mask = (Mask *)ptr->id.data;
152
153         rna_iterator_listbase_begin(iter, &mask->masklayers, NULL);
154 }
155
156 static int rna_Mask_layer_active_index_get(PointerRNA *ptr)
157 {
158         Mask *mask = (Mask *)ptr->id.data;
159
160         return mask->masklay_act;
161 }
162
163 static void rna_Mask_layer_active_index_set(PointerRNA *ptr, int value)
164 {
165         Mask *mask = (Mask *)ptr->id.data;
166
167         mask->masklay_act = value;
168 }
169
170 static void rna_Mask_layer_active_index_range(PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
171 {
172         Mask *mask = (Mask *)ptr->id.data;
173
174         *min = 0;
175         *max = max_ii(0, mask->masklay_tot - 1);
176
177         *softmin = *min;
178         *softmax = *max;
179 }
180
181 static char *rna_MaskLayer_path(PointerRNA *ptr)
182 {
183         MaskLayer *masklay = (MaskLayer *)ptr->data;
184         char name_esc[sizeof(masklay->name) * 2];
185         BLI_strescape(name_esc, masklay->name, sizeof(name_esc));
186         return BLI_sprintfN("layers[\"%s\"]", name_esc);
187 }
188
189 static PointerRNA rna_Mask_layer_active_get(PointerRNA *ptr)
190 {
191         Mask *mask = (Mask *)ptr->id.data;
192         MaskLayer *masklay = BKE_mask_layer_active(mask);
193
194         return rna_pointer_inherit_refine(ptr, &RNA_MaskLayer, masklay);
195 }
196
197 static void rna_Mask_layer_active_set(PointerRNA *ptr, PointerRNA value)
198 {
199         Mask *mask = (Mask *)ptr->id.data;
200         MaskLayer *masklay = (MaskLayer *)value.data;
201
202         BKE_mask_layer_active_set(mask, masklay);
203 }
204
205 static void rna_MaskLayer_splines_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
206 {
207         MaskLayer *masklay = (MaskLayer *)ptr->data;
208
209         rna_iterator_listbase_begin(iter, &masklay->splines, NULL);
210 }
211
212 static void rna_MaskLayer_name_set(PointerRNA *ptr, const char *value)
213 {
214         Mask *mask = (Mask *)ptr->id.data;
215         MaskLayer *masklay = (MaskLayer *)ptr->data;
216         char oldname[sizeof(masklay->name)], newname[sizeof(masklay->name)];
217
218         /* need to be on the stack */
219         BLI_strncpy(oldname, masklay->name, sizeof(masklay->name));
220         BLI_strncpy_utf8(newname, value, sizeof(masklay->name));
221
222         BKE_mask_layer_rename(mask, masklay, oldname, newname);
223 }
224
225 static PointerRNA rna_MaskLayer_active_spline_get(PointerRNA *ptr)
226 {
227         MaskLayer *masklay = (MaskLayer *)ptr->data;
228
229         return rna_pointer_inherit_refine(ptr, &RNA_MaskSpline, masklay->act_spline);
230 }
231
232 static void rna_MaskLayer_active_spline_set(PointerRNA *ptr, PointerRNA value)
233 {
234         MaskLayer *masklay = (MaskLayer *)ptr->data;
235         MaskSpline *spline = (MaskSpline *)value.data;
236         int index = BLI_findindex(&masklay->splines, spline);
237
238         if (index != -1)
239                 masklay->act_spline = spline;
240         else
241                 masklay->act_spline = NULL;
242 }
243
244 static PointerRNA rna_MaskLayer_active_spline_point_get(PointerRNA *ptr)
245 {
246         MaskLayer *masklay = (MaskLayer *)ptr->data;
247
248         return rna_pointer_inherit_refine(ptr, &RNA_MaskSplinePoint, masklay->act_point);
249 }
250
251 static void rna_MaskLayer_active_spline_point_set(PointerRNA *ptr, PointerRNA value)
252 {
253         MaskLayer *masklay = (MaskLayer *)ptr->data;
254         MaskSpline *spline;
255         MaskSplinePoint *point = (MaskSplinePoint *)value.data;
256
257         masklay->act_point = NULL;
258
259         for (spline = masklay->splines.first; spline; spline = spline->next) {
260                 if (point >= spline->points && point < spline->points + spline->tot_point) {
261                         masklay->act_point = point;
262
263                         break;
264                 }
265         }
266 }
267
268 static void rna_MaskSplinePoint_handle1_get(PointerRNA *ptr, float *values)
269 {
270         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
271         BezTriple *bezt = &point->bezt;
272         copy_v2_v2(values, bezt->vec[0]);
273 }
274
275 static void rna_MaskSplinePoint_handle1_set(PointerRNA *ptr, const float *values)
276 {
277         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
278         BezTriple *bezt = &point->bezt;
279         copy_v2_v2(bezt->vec[0], values);
280 }
281
282 static void rna_MaskSplinePoint_handle2_get(PointerRNA *ptr, float *values)
283 {
284         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
285         BezTriple *bezt = &point->bezt;
286         copy_v2_v2(values, bezt->vec[2]);
287 }
288
289 static void rna_MaskSplinePoint_handle2_set(PointerRNA *ptr, const float *values)
290 {
291         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
292         BezTriple *bezt = &point->bezt;
293         copy_v2_v2(bezt->vec[2], values);
294 }
295
296 static void rna_MaskSplinePoint_ctrlpoint_get(PointerRNA *ptr, float *values)
297 {
298         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
299         BezTriple *bezt = &point->bezt;
300         copy_v2_v2(values, bezt->vec[1]);
301 }
302
303 static void rna_MaskSplinePoint_ctrlpoint_set(PointerRNA *ptr, const float *values)
304 {
305         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
306         BezTriple *bezt = &point->bezt;
307         copy_v2_v2(bezt->vec[1], values);
308 }
309
310 static int rna_MaskSplinePoint_handle_type_get(PointerRNA *ptr)
311 {
312         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
313         BezTriple *bezt = &point->bezt;
314
315         return bezt->h1;
316 }
317
318 static MaskSpline *mask_spline_from_point(Mask *mask, MaskSplinePoint *point)
319 {
320         MaskLayer *mask_layer;
321         for (mask_layer = mask->masklayers.first;
322              mask_layer;
323              mask_layer = mask_layer->next)
324         {
325                 MaskSpline *spline;
326                 for (spline = mask_layer->splines.first;
327                      spline;
328                      spline = spline->next)
329                 {
330                         if (point >= spline->points && point < spline->points + spline->tot_point) {
331                                 return spline;
332                         }
333                 }
334         }
335         return NULL;
336 }
337
338 static void mask_point_check_stick(MaskSplinePoint *point)
339 {
340         BezTriple *bezt = &point->bezt;
341         if (bezt->h1 == HD_ALIGN && bezt->h2 == HD_ALIGN) {
342                 float vec[3];
343                 sub_v3_v3v3(vec, bezt->vec[0], bezt->vec[1]);
344                 add_v3_v3v3(bezt->vec[2], bezt->vec[1], vec);
345         }
346 }
347
348 static void rna_MaskSplinePoint_handle_type_set(PointerRNA *ptr, int value)
349 {
350         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
351         BezTriple *bezt = &point->bezt;
352         MaskSpline *spline = mask_spline_from_point((Mask *) ptr->id.data, point);
353
354         bezt->h1 = bezt->h2 = value;
355         mask_point_check_stick(point);
356         BKE_mask_calc_handle_point(spline, point);
357 }
358
359 static int rna_MaskSplinePoint_handle_left_type_get(PointerRNA *ptr)
360 {
361         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
362         BezTriple *bezt = &point->bezt;
363
364         return bezt->h1;
365 }
366
367 static void rna_MaskSplinePoint_handle_left_type_set(PointerRNA *ptr, int value)
368 {
369         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
370         BezTriple *bezt = &point->bezt;
371         MaskSpline *spline = mask_spline_from_point((Mask *) ptr->id.data, point);
372
373         bezt->h1 = value;
374         mask_point_check_stick(point);
375         BKE_mask_calc_handle_point(spline, point);
376 }
377
378 static int rna_MaskSplinePoint_handle_right_type_get(PointerRNA *ptr)
379 {
380         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
381         BezTriple *bezt = &point->bezt;
382
383         return bezt->h2;
384 }
385
386 static void rna_MaskSplinePoint_handle_right_type_set(PointerRNA *ptr, int value)
387 {
388         MaskSplinePoint *point = (MaskSplinePoint *) ptr->data;
389         BezTriple *bezt = &point->bezt;
390         MaskSpline *spline = mask_spline_from_point((Mask *) ptr->id.data, point);
391
392         bezt->h2 = value;
393         mask_point_check_stick(point);
394         BKE_mask_calc_handle_point(spline, point);
395 }
396
397 /* ** API **  */
398
399 static MaskLayer *rna_Mask_layers_new(Mask *mask, const char *name)
400 {
401         MaskLayer *masklay = BKE_mask_layer_new(mask, name);
402
403         WM_main_add_notifier(NC_MASK | NA_EDITED, mask);
404
405         return masklay;
406 }
407
408 static void rna_Mask_layers_remove(Mask *mask, ReportList *reports, PointerRNA *masklay_ptr)
409 {
410         MaskLayer *masklay = masklay_ptr->data;
411         if (BLI_findindex(&mask->masklayers, masklay) == -1) {
412                 BKE_reportf(reports, RPT_ERROR, "Mask layer '%s' not found in mask '%s'", masklay->name, mask->id.name + 2);
413                 return;
414         }
415
416         BKE_mask_layer_remove(mask, masklay);
417         RNA_POINTER_INVALIDATE(masklay_ptr);
418
419         WM_main_add_notifier(NC_MASK | NA_EDITED, mask);
420 }
421
422 static void rna_Mask_layers_clear(Mask *mask)
423 {
424         BKE_mask_layer_free_list(&mask->masklayers);
425
426         WM_main_add_notifier(NC_MASK | NA_EDITED, mask);
427 }
428
429 static MaskSpline *rna_MaskLayer_spline_new(ID *id, MaskLayer *mask_layer)
430 {
431         Mask *mask = (Mask *) id;
432         MaskSpline *new_spline;
433
434         new_spline = BKE_mask_spline_add(mask_layer);
435
436         WM_main_add_notifier(NC_MASK | NA_EDITED, mask);
437
438         return new_spline;
439 }
440
441 static void rna_MaskLayer_spline_remove(ID *id, MaskLayer *mask_layer, ReportList *reports, PointerRNA *spline_ptr)
442 {
443         Mask *mask = (Mask *) id;
444         MaskSpline *spline = spline_ptr->data;
445
446         if (BKE_mask_spline_remove(mask_layer, spline) == false) {
447                 BKE_reportf(reports, RPT_ERROR, "Mask layer '%s' does not contain spline given", mask_layer->name);
448                 return;
449         }
450
451         RNA_POINTER_INVALIDATE(spline_ptr);
452
453         DAG_id_tag_update(&mask->id, OB_RECALC_DATA);
454 }
455
456 static void rna_Mask_start_frame_set(PointerRNA *ptr, int value)
457 {
458         Mask *data = (Mask *)ptr->data;
459         /* MINFRAME not MINAFRAME, since some output formats can't taken negative frames */
460         CLAMP(value, MINFRAME, MAXFRAME);
461         data->sfra = value;
462
463         if (data->sfra >= data->efra) {
464                 data->efra = MIN2(data->sfra, MAXFRAME);
465         }
466 }
467
468 static void rna_Mask_end_frame_set(PointerRNA *ptr, int value)
469 {
470         Mask *data = (Mask *)ptr->data;
471         CLAMP(value, MINFRAME, MAXFRAME);
472         data->efra = value;
473
474         if (data->sfra >= data->efra) {
475                 data->sfra = MAX2(data->efra, MINFRAME);
476         }
477 }
478
479 static void rna_MaskSpline_points_add(ID *id, MaskSpline *spline, int count)
480 {
481         Mask *mask = (Mask *) id;
482         MaskLayer *layer;
483         int active_point_index = -1;
484         int i, spline_shape_index;
485
486         if (count <= 0) {
487                 return;
488         }
489
490         for (layer = mask->masklayers.first; layer; layer = layer->next) {
491                 if (BLI_findindex(&layer->splines, spline) != -1) {
492                         break;
493                 }
494         }
495
496         if (!layer) {
497                 /* Shall not happen actually */
498                 BLI_assert(!"No layer found for the spline");
499                 return;
500         }
501
502         if (layer->act_spline == spline) {
503                 active_point_index = layer->act_point - spline->points;
504         }
505
506         spline->points = MEM_recallocN(spline->points, sizeof(MaskSplinePoint) * (spline->tot_point + count));
507         spline->tot_point += count;
508
509         if (active_point_index >= 0) {
510                 layer->act_point = spline->points + active_point_index;
511         }
512
513         spline_shape_index = BKE_mask_layer_shape_spline_to_index(layer, spline);
514
515         for (i = 0; i < count; i++) {
516                 int point_index = spline->tot_point - count + i;
517                 MaskSplinePoint *new_point = spline->points + point_index;
518                 new_point->bezt.h1 = new_point->bezt.h2 = HD_ALIGN;
519                 BKE_mask_calc_handle_point_auto(spline, new_point, true);
520                 BKE_mask_parent_init(&new_point->parent);
521
522                 /* Not efficient, but there's no other way for now */
523                 BKE_mask_layer_shape_changed_add(layer, spline_shape_index + point_index, true, true);
524         }
525
526         WM_main_add_notifier(NC_MASK | ND_DATA, mask);
527         DAG_id_tag_update(&mask->id, 0);
528 }
529
530 static void rna_MaskSpline_point_remove(ID *id, MaskSpline *spline, ReportList *reports, PointerRNA *point_ptr)
531 {
532         Mask *mask = (Mask *) id;
533         MaskSplinePoint *point = point_ptr->data;
534         MaskSplinePoint *new_point_array;
535         MaskLayer *layer;
536         int active_point_index = -1;
537         int point_index;
538
539         for (layer = mask->masklayers.first; layer; layer = layer->next) {
540                 if (BLI_findindex(&layer->splines, spline) != -1) {
541                         break;
542                 }
543         }
544
545         if (!layer) {
546                 /* Shall not happen actually */
547                 BKE_report(reports, RPT_ERROR, "Mask layer not found for given spline");
548                 return;
549         }
550
551         if (point < spline->points || point >= spline->points + spline->tot_point) {
552                 BKE_report(reports, RPT_ERROR, "Point is not found in given spline");
553                 return;
554         }
555
556         if (layer->act_spline == spline) {
557                 active_point_index = layer->act_point - spline->points;
558         }
559
560         point_index = point - spline->points;
561
562         new_point_array = MEM_mallocN(sizeof(MaskSplinePoint) * (spline->tot_point - 1), "remove mask point");
563
564         memcpy(new_point_array, spline->points, sizeof(MaskSplinePoint) * point_index);
565         memcpy(new_point_array + point_index, spline->points + point_index + 1,
566                sizeof(MaskSplinePoint) * (spline->tot_point - point_index - 1));
567
568         MEM_freeN(spline->points);
569         spline->points = new_point_array;
570         spline->tot_point--;
571
572         if (active_point_index >= 0) {
573                 if (active_point_index == point_index) {
574                         layer->act_point = NULL;
575                 }
576                 else if (active_point_index < point_index) {
577                         layer->act_point = spline->points + active_point_index;
578                 }
579                 else {
580                         layer->act_point = spline->points + active_point_index - 1;
581                 }
582         }
583
584         BKE_mask_layer_shape_changed_remove(layer, BKE_mask_layer_shape_spline_to_index(layer, spline) + point_index, 1);
585
586         WM_main_add_notifier(NC_MASK | ND_DATA, mask);
587         DAG_id_tag_update(&mask->id, 0);
588
589         RNA_POINTER_INVALIDATE(point_ptr);
590 }
591
592 #else
593 static void rna_def_maskParent(BlenderRNA *brna)
594 {
595         StructRNA *srna;
596         PropertyRNA *prop;
597
598         static EnumPropertyItem mask_id_type_items[] = {
599                 {ID_MC, "MOVIECLIP", ICON_SEQUENCE, "Movie Clip", ""},
600                 {0, NULL, 0, NULL, NULL}};
601
602         static EnumPropertyItem parent_type_items[] = {
603                 {MASK_PARENT_POINT_TRACK, "POINT_TRACK", 0, "Point Track", ""},
604                 {MASK_PARENT_PLANE_TRACK, "PLANE_TRACK", 0, "Plane Track", ""},
605                 {0, NULL, 0, NULL, NULL}};
606
607         srna = RNA_def_struct(brna, "MaskParent", NULL);
608         RNA_def_struct_ui_text(srna, "Mask Parent", "Parenting settings for masking element");
609
610         /* Target Properties - ID-block to Drive */
611         prop = RNA_def_property(srna, "id", PROP_POINTER, PROP_NONE);
612         RNA_def_property_struct_type(prop, "ID");
613         RNA_def_property_flag(prop, PROP_EDITABLE);
614         // RNA_def_property_editable_func(prop, "rna_maskSpline_id_editable");
615         /* note: custom set function is ONLY to avoid rna setting a user for this. */
616         RNA_def_property_pointer_funcs(prop, NULL, "rna_MaskParent_id_set", "rna_MaskParent_id_typef", NULL);
617         RNA_def_property_ui_text(prop, "ID", "ID-block to which masking element would be parented to or to it's property");
618         RNA_def_property_update(prop, 0, "rna_Mask_update_parent");
619
620         prop = RNA_def_property(srna, "id_type", PROP_ENUM, PROP_NONE);
621         RNA_def_property_enum_sdna(prop, NULL, "id_type");
622         RNA_def_property_enum_items(prop, mask_id_type_items);
623         RNA_def_property_enum_default(prop, ID_MC);
624         RNA_def_property_enum_funcs(prop, NULL, "rna_MaskParent_id_type_set", NULL);
625         //RNA_def_property_editable_func(prop, "rna_MaskParent_id_type_editable");
626         RNA_def_property_ui_text(prop, "ID Type", "Type of ID-block that can be used");
627         RNA_def_property_update(prop, 0, "rna_Mask_update_parent");
628
629         /* type */
630         prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
631         RNA_def_property_enum_items(prop, parent_type_items);
632         RNA_def_property_ui_text(prop, "Parent Type", "Parent Type");
633         RNA_def_property_update(prop, 0, "rna_Mask_update_parent");
634
635         /* parent */
636         prop = RNA_def_property(srna, "parent", PROP_STRING, PROP_NONE);
637         RNA_def_property_ui_text(prop, "Parent", "Name of parent object in specified data block to which parenting happens");
638         RNA_def_property_string_maxlength(prop, MAX_ID_NAME - 2);
639         RNA_def_property_update(prop, 0, "rna_Mask_update_parent");
640
641         /* sub_parent */
642         prop = RNA_def_property(srna, "sub_parent", PROP_STRING, PROP_NONE);
643         RNA_def_property_ui_text(prop, "Sub Parent", "Name of parent sub-object in specified data block to which parenting happens");
644         RNA_def_property_string_maxlength(prop, MAX_ID_NAME - 2);
645         RNA_def_property_update(prop, 0, "rna_Mask_update_parent");
646 }
647
648 static void rna_def_maskSplinePointUW(BlenderRNA *brna)
649 {
650         StructRNA *srna;
651         PropertyRNA *prop;
652
653         srna = RNA_def_struct(brna, "MaskSplinePointUW", NULL);
654         RNA_def_struct_ui_text(srna, "Mask Spline UW Point", "Single point in spline segment defining feather");
655
656         /* u */
657         prop = RNA_def_property(srna, "u", PROP_FLOAT, PROP_NONE);
658         RNA_def_property_float_sdna(prop, NULL, "u");
659         RNA_def_property_range(prop, 0.0, 1.0);
660         RNA_def_property_ui_text(prop, "U", "U coordinate of point along spline segment");
661         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
662
663         /* weight */
664         prop = RNA_def_property(srna, "weight", PROP_FLOAT, PROP_NONE);
665         RNA_def_property_float_sdna(prop, NULL, "w");
666         RNA_def_property_range(prop, 0.0, 1.0);
667         RNA_def_property_ui_text(prop, "Weight", "Weight of feather point");
668         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
669
670         /* select */
671         prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
672         RNA_def_property_boolean_sdna(prop, NULL, "flag", SELECT);
673         RNA_def_property_ui_text(prop, "Select", "Selection status");
674         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
675 }
676
677 static void rna_def_maskSplinePoint(BlenderRNA *brna)
678 {
679         StructRNA *srna;
680         PropertyRNA *prop;
681
682         static EnumPropertyItem handle_type_items[] = {
683                 {HD_AUTO, "AUTO", 0, "Auto", ""},
684                 {HD_VECT, "VECTOR", 0, "Vector", ""},
685                 {HD_ALIGN, "ALIGNED", 0, "Aligned Single", ""},
686                 {HD_ALIGN_DOUBLESIDE, "ALIGNED_DOUBLESIDE", 0, "Aligned", ""},
687                 {HD_FREE, "FREE", 0, "Free", ""},
688                 {0, NULL, 0, NULL, NULL}};
689
690         rna_def_maskSplinePointUW(brna);
691
692         srna = RNA_def_struct(brna, "MaskSplinePoint", NULL);
693         RNA_def_struct_ui_text(srna, "Mask Spline Point", "Single point in spline used for defining mask");
694
695         /* Vector values */
696         prop = RNA_def_property(srna, "handle_left", PROP_FLOAT, PROP_TRANSLATION);
697         RNA_def_property_array(prop, 2);
698         RNA_def_property_float_funcs(prop, "rna_MaskSplinePoint_handle1_get", "rna_MaskSplinePoint_handle1_set", NULL);
699         RNA_def_property_ui_text(prop, "Handle 1", "Coordinates of the first handle");
700         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
701
702         prop = RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
703         RNA_def_property_array(prop, 2);
704         RNA_def_property_float_funcs(prop, "rna_MaskSplinePoint_ctrlpoint_get", "rna_MaskSplinePoint_ctrlpoint_set", NULL);
705         RNA_def_property_ui_text(prop, "Control Point", "Coordinates of the control point");
706         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
707
708         prop = RNA_def_property(srna, "handle_right", PROP_FLOAT, PROP_TRANSLATION);
709         RNA_def_property_array(prop, 2);
710         RNA_def_property_float_funcs(prop, "rna_MaskSplinePoint_handle2_get", "rna_MaskSplinePoint_handle2_set", NULL);
711         RNA_def_property_ui_text(prop, "Handle 2", "Coordinates of the second handle");
712         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
713
714         /* handle_type */
715         prop = RNA_def_property(srna, "handle_type", PROP_ENUM, PROP_NONE);
716         RNA_def_property_enum_funcs(prop, "rna_MaskSplinePoint_handle_type_get", "rna_MaskSplinePoint_handle_type_set", NULL);
717         RNA_def_property_enum_items(prop, handle_type_items);
718         RNA_def_property_ui_text(prop, "Handle Type", "Handle type");
719         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
720
721         /* handle_type */
722         prop = RNA_def_property(srna, "handle_left_type", PROP_ENUM, PROP_NONE);
723         RNA_def_property_enum_funcs(prop, "rna_MaskSplinePoint_handle_left_type_get", "rna_MaskSplinePoint_handle_left_type_set", NULL);
724         RNA_def_property_enum_items(prop, handle_type_items);
725         RNA_def_property_ui_text(prop, "Handle 1 Type", "Handle type");
726         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
727
728         /* handle_right */
729         prop = RNA_def_property(srna, "handle_right_type", PROP_ENUM, PROP_NONE);
730         RNA_def_property_enum_funcs(prop, "rna_MaskSplinePoint_handle_right_type_get", "rna_MaskSplinePoint_handle_right_type_set", NULL);
731         RNA_def_property_enum_items(prop, handle_type_items);
732         RNA_def_property_ui_text(prop, "Handle 2 Type", "Handle type");
733         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
734
735         /* weight */
736         prop = RNA_def_property(srna, "weight", PROP_FLOAT, PROP_NONE);
737         RNA_def_property_float_sdna(prop, NULL, "bezt.weight");
738         RNA_def_property_range(prop, 0.0, 1.0);
739         RNA_def_property_ui_text(prop, "Weight", "Weight of the point");
740         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
741
742         /* select */
743         prop = RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
744         RNA_def_property_boolean_sdna(prop, NULL, "bezt.f1", SELECT);
745         RNA_def_property_ui_text(prop, "Select", "Selection status");
746         RNA_def_property_update(prop, 0, "rna_Mask_update_data");
747
748         /* parent */
749         prop = RNA_def_property(srna, "parent", PROP_POINTER, PROP_NONE);
750         RNA_def_property_struct_type(prop, "MaskParent");
751
752         /* feather points */
753         prop = RNA_def_property(srna, "feather_points", PROP_COLLECTION, PROP_NONE);
754         RNA_def_property_struct_type(prop, "MaskSplinePointUW");
755         RNA_def_property_collection_sdna(prop, NULL, "uw", "tot_uw");
756         RNA_def_property_ui_text(prop, "Feather Points", "Points defining feather");
757 }
758
759 static void rna_def_mask_splines(BlenderRNA *brna)
760 {
761         StructRNA *srna;
762         FunctionRNA *func;
763         PropertyRNA *prop;
764         PropertyRNA *parm;
765
766         srna = RNA_def_struct(brna, "MaskSplines", NULL);
767         RNA_def_struct_sdna(srna, "MaskLayer");
768         RNA_def_struct_ui_text(srna, "Mask Splines", "Collection of masking splines");
769
770         /* Create new spline */
771         func = RNA_def_function(srna, "new", "rna_MaskLayer_spline_new");
772         RNA_def_function_flag(func, FUNC_USE_SELF_ID);
773         RNA_def_function_ui_description(func, "Add a new spline to the layer");
774         parm = RNA_def_pointer(func, "spline", "MaskSpline", "", "The newly created spline");
775         RNA_def_function_return(func, parm);
776
777         /* Remove the spline */
778         func = RNA_def_function(srna, "remove", "rna_MaskLayer_spline_remove");
779         RNA_def_function_flag(func, FUNC_USE_SELF_ID);
780         RNA_def_function_ui_description(func, "Remove a spline from a layer");
781         RNA_def_function_flag(func, FUNC_USE_REPORTS);
782         parm = RNA_def_pointer(func, "spline", "MaskSpline", "", "The spline to remove");
783         RNA_def_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
784         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
785
786         /* active spline */
787         prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
788         RNA_def_property_struct_type(prop, "MaskSpline");
789         RNA_def_property_pointer_funcs(prop, "rna_MaskLayer_active_spline_get", "rna_MaskLayer_active_spline_set", NULL, NULL);
790         RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_UNLINK);
791         RNA_def_property_ui_text(prop, "Active Spline", "Active spline of masking layer");
792
793         /* active point */
794         prop = RNA_def_property(srna, "active_point", PROP_POINTER, PROP_NONE);
795         RNA_def_property_struct_type(prop, "MaskSplinePoint");
796         RNA_def_property_pointer_funcs(prop, "rna_MaskLayer_active_spline_point_get", "rna_MaskLayer_active_spline_point_set", NULL, NULL);
797         RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_UNLINK);
798         RNA_def_property_ui_text(prop, "Active Spline", "Active spline of masking layer");
799 }
800
801 static void rna_def_maskSplinePoints(BlenderRNA *brna)
802 {
803         StructRNA *srna;
804         FunctionRNA *func;
805         PropertyRNA *parm;
806
807         srna = RNA_def_struct(brna, "MaskSplinePoints", NULL);
808         RNA_def_struct_sdna(srna, "MaskSpline");
809         RNA_def_struct_ui_text(srna, "Mask Spline Points", "Collection of masking spline points");
810
811         /* Create new point */
812         func = RNA_def_function(srna, "add", "rna_MaskSpline_points_add");
813         RNA_def_function_flag(func, FUNC_USE_SELF_ID);
814         RNA_def_function_ui_description(func, "Add a number of point to this spline");
815         RNA_def_int(func, "count", 1, 0, INT_MAX, "Number", "Number of points to add to the spline", 0, INT_MAX);
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_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
824         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
825 }
826
827 static void rna_def_maskSpline(BlenderRNA *brna)
828 {
829         static 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 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 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, proportional_falloff_curve_only_items);
980         RNA_def_property_ui_text(prop, "Falloff", "Falloff type the feather");
981         RNA_def_property_translation_context(prop, BLF_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_property_flag(parm, PROP_REQUIRED | PROP_NEVER_NULL | PROP_RNAPTR);
1020         RNA_def_property_clear_flag(parm, PROP_THICK_WRAP);
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 datablock 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