mask object hide/reveal - access from H/Alt+H/Shift+H and eye icon in listview.
authorCampbell Barton <ideasman42@gmail.com>
Wed, 30 May 2012 06:07:26 +0000 (06:07 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Wed, 30 May 2012 06:07:26 +0000 (06:07 +0000)
added alpha setting though its not used for rendering yet.

13 files changed:
source/blender/blenkernel/intern/mask.c
source/blender/editors/interface/interface_templates.c
source/blender/editors/mask/mask_draw.c
source/blender/editors/mask/mask_editor.c
source/blender/editors/mask/mask_intern.h
source/blender/editors/mask/mask_ops.c
source/blender/editors/mask/mask_relationships.c
source/blender/editors/mask/mask_select.c
source/blender/editors/mask/mask_shapekey.c
source/blender/editors/space_clip/space_clip.c
source/blender/makesdna/DNA_mask_types.h
source/blender/makesrna/RNA_access.h
source/blender/makesrna/intern/rna_mask.c

index be7fa2fbd743d40f35c815748e9bfb797550e0ed..1e2d65c4dd747319fd3d33e946f89fe7cb770702 100644 (file)
@@ -94,9 +94,12 @@ MaskObject *BKE_mask_object_new(Mask *mask, const char *name)
 
        mask->tot_maskobj++;
 
+       maskobj->alpha = 1.0f;
+
        return maskobj;
 }
 
+/* note: may still be hidden, caller needs to check */
 MaskObject *BKE_mask_object_active(Mask *mask)
 {
        return BLI_findlink(&mask->maskobjs, mask->act_maskobj);
@@ -104,12 +107,7 @@ MaskObject *BKE_mask_object_active(Mask *mask)
 
 void BKE_mask_object_active_set(Mask *mask, MaskObject *maskobj)
 {
-       int index = BLI_findindex(&mask->maskobjs, maskobj);
-
-       if (index >= 0)
-               mask->act_maskobj = index;
-       else
-               mask->act_maskobj = 0;
+       mask->act_maskobj = BLI_findindex(&mask->maskobjs, maskobj);
 }
 
 void BKE_mask_object_remove(Mask *mask, MaskObject *maskobj)
@@ -1171,7 +1169,7 @@ void BKE_mask_spline_ensure_deform(MaskSpline *spline)
                spline->points_deform = MEM_mallocN(sizeof(*spline->points_deform) * spline->tot_point, __func__);
        }
        else {
-               printf("alloc spline done\n");
+               // printf("alloc spline done\n");
        }
 }
 
index 7883519257470d459173c31b062d50b8914354be..54b87fd45095af837e04593c740b41a2f6166d24 100644 (file)
@@ -2241,6 +2241,18 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
                        uiItemL(split, name, ICON_OBJECT_DATA);
                }
        }
+       else if (itemptr->type == &RNA_MaskObject) {
+               split = uiLayoutSplit(sub, 0.5f, 0);
+
+               uiItemL(split, name, icon);
+
+               uiBlockSetEmboss(block, UI_EMBOSSN);
+               row = uiLayoutRow(split, 1);
+               uiItemR(row, itemptr, "alpha", 0, "", ICON_NONE);
+               uiItemR(row, itemptr, "hide", 0, "", 0);
+
+               uiBlockSetEmboss(block, UI_EMBOSS);
+       }
 
        /* There is a last chance to display custom controls (in addition to the name/label):
         * If the given item property group features a string property named as prop_list,
index fe11ded64f4f01e60de4dde1c4fcabf416be5772..ae64294fd3ef7f610dd16a86c928a40dd8026899 100644 (file)
@@ -267,9 +267,11 @@ static void draw_maskobjs(Mask *mask)
        for (maskobj = mask->maskobjs.first; maskobj; maskobj = maskobj->next) {
                MaskSpline *spline;
 
-               for (spline = maskobj->splines.first; spline; spline = spline->next) {
+               if (maskobj->restrictflag & MASK_RESTRICT_VIEW) {
+                       continue;
+               }
 
-//                     BKE_mask_spline_ensure_deform(spline);
+               for (spline = maskobj->splines.first; spline; spline = spline->next) {
 
                        /* draw curve itself first... */
                        draw_spline_curve(maskobj, spline);
index 990f668af8d71385407f5033aa85a1275ede4ffa..5968c80b2709bcc8904c98a9d423a622febb8ffe 100644 (file)
@@ -203,6 +203,10 @@ void ED_operatortypes_mask(void)
        WM_operatortype_append(MASK_OT_select_border);
        WM_operatortype_append(MASK_OT_select_lasso);
 
+       /* hide/reveal */
+       WM_operatortype_append(MASK_OT_hide_view_clear);
+       WM_operatortype_append(MASK_OT_hide_view_set);
+
        /* shape */
        WM_operatortype_append(MASK_OT_slide_point);
        WM_operatortype_append(MASK_OT_cyclic_toggle);
@@ -255,6 +259,14 @@ void ED_keymap_mask(wmKeyConfig *keyconf)
        kmi = WM_keymap_add_item(keymap, "MASK_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL | KM_SHIFT | KM_ALT, 0);
        RNA_boolean_set(kmi->ptr, "deselect", TRUE);
 
+       /* hide/reveal */
+       WM_keymap_add_item(keymap, "MASK_OT_hide_view_clear", HKEY, KM_PRESS, KM_ALT, 0);
+       kmi = WM_keymap_add_item(keymap, "MASK_OT_hide_view_set", HKEY, KM_PRESS, 0, 0);
+       RNA_boolean_set(kmi->ptr, "unselected", FALSE);
+
+       kmi = WM_keymap_add_item(keymap, "MASK_OT_hide_view_set", HKEY, KM_PRESS, KM_SHIFT, 0);
+       RNA_boolean_set(kmi->ptr, "unselected", TRUE);
+
        /* select clip while in maker view,
         * this matches View3D functionality where you can select an
         * object while in editmode to allow vertex parenting */
index 28560e4e2922bcf3bcbc19fb4f93f683568fe85b..b17d7e7173a7fb066660c90698e17b2b2ebaa9d7 100644 (file)
@@ -51,6 +51,9 @@ void MASK_OT_slide_point(struct wmOperatorType *ot);
 
 void MASK_OT_delete(struct wmOperatorType *ot);
 
+void MASK_OT_hide_view_clear(struct wmOperatorType *ot);
+void MASK_OT_hide_view_set(struct wmOperatorType *ot);
+
 void MASK_OT_handle_type_set(struct wmOperatorType *ot);
 
 int ED_mask_feather_find_nearest(
@@ -76,8 +79,10 @@ void MASK_OT_select_lasso(struct wmOperatorType *ot);
 void MASK_OT_select_circle(struct wmOperatorType *ot);
 
 int ED_mask_spline_select_check(struct MaskSplinePoint *points, int tot_point);
+int ED_mask_object_select_check(struct MaskObject *maskobj);
 int ED_mask_select_check(struct Mask *mask);
 
+void ED_mask_object_select_set(struct MaskObject *maskobj, int select);
 void ED_mask_select_toggle_all(struct Mask *mask, int action);
 void ED_mask_select_flush_all(struct Mask *mask);
 
index 44932cab4dfdebf2bf6d23e7b10752ab65d5eb5f..5e547d9dec4c6a24ba968a2f325931de4a60838b 100644 (file)
@@ -143,6 +143,10 @@ MaskSplinePoint *ED_mask_point_find_nearest(bContext *C, Mask *mask, float norma
        for (maskobj = mask->maskobjs.first; maskobj; maskobj = maskobj->next) {
                MaskSpline *spline;
 
+               if (maskobj->restrictflag & MASK_RESTRICT_VIEW) {
+                       continue;
+               }
+
                for (spline = maskobj->splines.first; spline; spline = spline->next) {
                        MaskSplinePoint *points_array = BKE_mask_spline_point_array(spline);
 
@@ -241,6 +245,10 @@ int ED_mask_feather_find_nearest(bContext *C, Mask *mask, float normal_co[2], in
                        int i, tot_feather_point;
                        float *feather_points, *fp;
 
+                       if (maskobj->restrictflag & MASK_RESTRICT_VIEW) {
+                               continue;
+                       }
+
                        feather_points = fp = BKE_mask_spline_feather_points(spline, &tot_feather_point);
 
                        for (i = 0; i < spline->tot_point; i++) {
@@ -328,6 +336,10 @@ static int find_nearest_diff_point(bContext *C, Mask *mask, const float normal_c
        for (maskobj = mask->maskobjs.first; maskobj; maskobj = maskobj->next) {
                MaskSpline *spline;
 
+               if (maskobj->restrictflag & MASK_RESTRICT_VIEW) {
+                       continue;
+               }
+
                for (spline = maskobj->splines.first; spline; spline = spline->next) {
                        int i;
 
@@ -1204,6 +1216,10 @@ static int add_vertex_exec(bContext *C, wmOperator *op)
 
        maskobj = BKE_mask_object_active(mask);
 
+       if (maskobj && maskobj->restrictflag & MASK_RESTRICT_VIEW) {
+               maskobj = NULL;
+       }
+
        RNA_float_get_array(op->ptr, "location", co);
 
        if (maskobj && maskobj->act_point && MASKPOINT_ISSEL(maskobj->act_point)) {
@@ -1360,6 +1376,10 @@ static int cyclic_toggle_exec(bContext *C, wmOperator *UNUSED(op))
        for (maskobj = mask->maskobjs.first; maskobj; maskobj = maskobj->next) {
                MaskSpline *spline;
 
+               if (maskobj->restrictflag & MASK_RESTRICT_VIEW) {
+                       continue;
+               }
+
                for (spline = maskobj->splines.first; spline; spline = spline->next) {
                        if (ED_mask_spline_select_check(spline->points, spline->tot_point)) {
                                spline->flag ^= MASK_SPLINE_CYCLIC;
@@ -1432,7 +1452,13 @@ static int delete_exec(bContext *C, wmOperator *UNUSED(op))
        int mask_object_shape_ofs = 0;
 
        for (maskobj = mask->maskobjs.first; maskobj; maskobj = maskobj->next) {
-               MaskSpline *spline = maskobj->splines.first;
+               MaskSpline *spline;
+
+               if (maskobj->restrictflag & MASK_RESTRICT_VIEW) {
+                       continue;
+               }
+
+               spline = maskobj->splines.first;
 
                while (spline) {
                        const int tot_point_orig = spline->tot_point;
@@ -1537,6 +1563,10 @@ static int set_handle_type_exec(bContext *C, wmOperator *op)
                MaskSpline *spline;
                int i;
 
+               if (maskobj->restrictflag & MASK_RESTRICT_VIEW) {
+                       continue;
+               }
+
                for (spline = maskobj->splines.first; spline; spline = spline->next) {
                        for (i = 0; i < spline->tot_point; i++) {
                                MaskSplinePoint *point = &spline->points[i];
@@ -1581,3 +1611,106 @@ void MASK_OT_handle_type_set(wmOperatorType *ot)
        /* properties */
        ot->prop = RNA_def_enum(ot->srna, "type", editcurve_handle_type_items, 1, "Type", "Spline type");
 }
+
+
+/* ********* clear/set restrict view *********/
+static int mask_hide_view_clear_exec(bContext *C, wmOperator *UNUSED(op))
+{
+       Mask *mask = CTX_data_edit_mask(C);
+       MaskObject *maskobj;
+       int changed = FALSE;
+
+       for (maskobj = mask->maskobjs.first; maskobj; maskobj = maskobj->next) {
+
+               if (maskobj->restrictflag & OB_RESTRICT_VIEW) {
+                       ED_mask_object_select_set(maskobj, TRUE);
+                       maskobj->restrictflag &= ~OB_RESTRICT_VIEW;
+                       changed = 1;
+               }
+       }
+
+       if (changed) {
+               WM_event_add_notifier(C, NC_MASK | ND_DRAW, mask);
+               DAG_id_tag_update(&mask->id, 0);
+
+               return OPERATOR_FINISHED;
+       }
+       else {
+               return OPERATOR_CANCELLED;
+       }
+}
+
+void MASK_OT_hide_view_clear(wmOperatorType *ot)
+{
+
+       /* identifiers */
+       ot->name = "Clear Restrict View";
+       ot->description = "Reveal the object by setting the hide flag";
+       ot->idname = "MASK_OT_hide_view_clear";
+
+       /* api callbacks */
+       ot->exec = mask_hide_view_clear_exec;
+       ot->poll = ED_maskediting_mask_poll;
+
+       /* flags */
+       ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+}
+
+static int mask_hide_view_set_exec(bContext *C, wmOperator *op)
+{
+       Mask *mask = CTX_data_edit_mask(C);
+       MaskObject *maskobj;
+       const int unselected = RNA_boolean_get(op->ptr, "unselected");
+       int changed = FALSE;
+
+       for (maskobj = mask->maskobjs.first; maskobj; maskobj = maskobj->next) {
+               if (!unselected) {
+                       if (ED_mask_object_select_check(maskobj)) {
+                               ED_mask_object_select_set(maskobj, FALSE);
+
+                               maskobj->restrictflag |= OB_RESTRICT_VIEW;
+                               changed = 1;
+                               if (maskobj == BKE_mask_object_active(mask)) {
+                                       BKE_mask_object_active_set(mask, NULL);
+                               }
+                       }
+               }
+               else {
+                       if (!ED_mask_object_select_check(maskobj)) {
+                               maskobj->restrictflag |= OB_RESTRICT_VIEW;
+                               changed = 1;
+                               if (maskobj == BKE_mask_object_active(mask)) {
+                                       BKE_mask_object_active_set(mask, NULL);
+                               }
+                       }
+               }
+       }
+
+       if (changed) {
+               WM_event_add_notifier(C, NC_MASK | ND_DRAW, mask);
+               DAG_id_tag_update(&mask->id, 0);
+
+               return OPERATOR_FINISHED;
+       }
+       else {
+               return OPERATOR_CANCELLED;
+       }
+}
+
+void MASK_OT_hide_view_set(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name = "Set Restrict View";
+       ot->description = "Hide the object by setting the hide flag";
+       ot->idname = "MASK_OT_hide_view_set";
+
+       /* api callbacks */
+       ot->exec = mask_hide_view_set_exec;
+       ot->poll = ED_maskediting_mask_poll;
+
+       /* flags */
+       ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+       RNA_def_boolean(ot->srna, "unselected", 0, "Unselected", "Hide unselected rather than selected objects");
+
+}
index 4d08e2fa439ae49cb8b36cf3241ee59f8ae642b1..2d2c527d961ed74df0338b41e9149cfe4b8402e9 100644 (file)
@@ -66,6 +66,10 @@ static int mask_parent_clear_exec(bContext *C, wmOperator *UNUSED(op))
                MaskSpline *spline;
                int i;
 
+               if (maskobj->restrictflag & MASK_RESTRICT_VIEW) {
+                       continue;
+               }
+
                for (spline = maskobj->splines.first; spline; spline = spline->next) {
                        for (i = 0; i < spline->tot_point; i++) {
                                MaskSplinePoint *point = &spline->points[i];
@@ -132,6 +136,10 @@ static int mask_parent_set_exec(bContext *C, wmOperator *UNUSED(op))
                MaskSpline *spline;
                int i;
 
+               if (maskobj->restrictflag & MASK_RESTRICT_VIEW) {
+                       continue;
+               }
+
                for (spline = maskobj->splines.first; spline; spline = spline->next) {
                        for (i = 0; i < spline->tot_point; i++) {
                                MaskSplinePoint *point = &spline->points[i];
index 1286565df731d74694afe9ad2c15104a96e9de8c..482abbe5818c7029c6cdd77ea990b9bb850ffeb7 100644 (file)
@@ -71,23 +71,52 @@ int ED_mask_spline_select_check(MaskSplinePoint *points, int tot_point)
        return FALSE;
 }
 
+int ED_mask_object_select_check(MaskObject *maskobj)
+{
+       MaskSpline *spline;
+
+       for (spline = maskobj->splines.first; spline; spline = spline->next) {
+               if (ED_mask_spline_select_check(spline->points, spline->tot_point)) {
+                       return TRUE;
+               }
+       }
+
+       return FALSE;
+}
+
 int ED_mask_select_check(Mask *mask)
 {
        MaskObject *maskobj;
 
        for (maskobj = mask->maskobjs.first; maskobj; maskobj = maskobj->next) {
-               MaskSpline *spline;
-
-               for (spline = maskobj->splines.first; spline; spline = spline->next) {
-                       if (ED_mask_spline_select_check(spline->points, spline->tot_point)) {
-                               return TRUE;
-                       }
+               if (ED_mask_object_select_check(maskobj)) {
+                       return TRUE;
                }
        }
 
        return FALSE;
 }
 
+void ED_mask_object_select_set(MaskObject *maskobj, int select)
+{
+       MaskSpline *spline;
+
+       for (spline = maskobj->splines.first; spline; spline = spline->next) {
+               int i;
+
+               if (select)
+                       spline->flag |= SELECT;
+               else
+                       spline->flag &= ~SELECT;
+
+               for (i = 0; i < spline->tot_point; i++) {
+                       MaskSplinePoint *point = &spline->points[i];
+
+                       BKE_mask_point_select_set(point, select);
+               }
+       }
+}
+
 void ED_mask_select_toggle_all(Mask *mask, int action)
 {
        MaskObject *maskobj;
@@ -100,17 +129,12 @@ void ED_mask_select_toggle_all(Mask *mask, int action)
        }
 
        for (maskobj = mask->maskobjs.first; maskobj; maskobj = maskobj->next) {
-               MaskSpline *spline;
 
-               for (spline = maskobj->splines.first; spline; spline = spline->next) {
-                       int i;
-
-                       for (i = 0; i < spline->tot_point; i++) {
-                               MaskSplinePoint *point = &spline->points[i];
-
-                               BKE_mask_point_select_set(point, (action == SEL_SELECT) ? TRUE : FALSE);
-                       }
+               if (maskobj->restrictflag & MASK_RESTRICT_VIEW) {
+                       continue;
                }
+
+               ED_mask_object_select_set(maskobj, (action == SEL_SELECT) ? TRUE : FALSE);
        }
 }
 
@@ -121,6 +145,10 @@ void ED_mask_select_flush_all(Mask *mask)
        for (maskobj = mask->maskobjs.first; maskobj; maskobj = maskobj->next) {
                MaskSpline *spline;
 
+               if (maskobj->restrictflag & MASK_RESTRICT_VIEW) {
+                       continue;
+               }
+
                for (spline = maskobj->splines.first; spline; spline = spline->next) {
                        int i;
 
index 7a91fbeed13760a51a0b3d6eb73ddf610d0937ed..71b10ae0da3d56f9e9803ed22332aa5432105419 100755 (executable)
@@ -67,6 +67,10 @@ static int mask_shape_key_insert_exec(bContext *C, wmOperator *UNUSED(op))
        for (maskobj = mask->maskobjs.first; maskobj; maskobj = maskobj->next) {
                MaskObjectShape *maskobj_shape;
 
+               if (maskobj->restrictflag & MASK_RESTRICT_VIEW) {
+                       continue;
+               }
+
                maskobj_shape = BKE_mask_object_shape_varify_frame(maskobj, frame);
                BKE_mask_object_shape_from_mask(maskobj, maskobj_shape);
                change = TRUE;
@@ -109,6 +113,10 @@ static int mask_shape_key_clear_exec(bContext *C, wmOperator *UNUSED(op))
        for (maskobj = mask->maskobjs.first; maskobj; maskobj = maskobj->next) {
                MaskObjectShape *maskobj_shape;
 
+               if (maskobj->restrictflag & MASK_RESTRICT_VIEW) {
+                       continue;
+               }
+
                maskobj_shape = BKE_mask_object_shape_find_frame(maskobj, frame);
 
                if (maskobj_shape) {
index c6d35b0346866eec55db376a3abbeb5ff3dc017a..f952d6bbe473fb53673b8b5b5ccf325b79d23662 100644 (file)
@@ -369,6 +369,7 @@ static void clip_listener(ScrArea *sa, wmNotifier *wmn)
                        switch(wmn->data) {
                                case ND_SELECT:
                                case ND_DATA:
+                               case ND_DRAW:
                                        ED_area_tag_redraw(sa);
                                        break;
                        }
index cf3f5e775444b0bb363bfa1ad1aac3423ae6d532..65707725a53c2c5b275e7e44fdaf65d3120d016b 100644 (file)
@@ -44,7 +44,7 @@ typedef struct Mask {
        ID id;
        struct AnimData *adt;
        ListBase maskobjs;   /* mask objects */
-       int act_maskobj;     /* index of active mask object */
+       int act_maskobj;     /* index of active mask object (-1 == None) */
        int tot_maskobj;     /* total number of mask objects */
 } Mask;
 
@@ -107,12 +107,18 @@ typedef struct MaskObject {
 
        struct MaskSpline *act_spline;     /* active spline */
        struct MaskSplinePoint *act_point; /* active point */
+
+       float  alpha;
+       //char   flag;             /* not used yet */
+       char   restrictflag;     /* matching 'Object' flag of the same name - eventually use in the outliner  */
+       char   pad[3];
 } MaskObject;
 
 /* MaskParent->flag */
 #define MASK_PARENT_ACTIVE  (1 << 0)
 
 /* MaskSpline->flag */
+/* reserve (1 << 0) for SELECT */
 #define MASK_SPLINE_CYCLIC  (1 << 1)
 
 /* MaskSpline->weight_interp */
@@ -121,4 +127,9 @@ typedef struct MaskObject {
 
 #define MASK_OBJECT_SHAPE_ELEM_SIZE 8 /* 3x 2D points + weight + radius == 8 */
 
+/* ob->restrictflag */
+#define MASK_RESTRICT_VIEW      1
+#define MASK_RESTRICT_SELECT    2
+#define MASK_RESTRICT_RENDER    4
+
 #endif // __DNA_MASK_TYPES_H__
index 532f971ad0a4691aa83641250eef1b3399d34de2..9c465619b95c023053c2a0d4d7d305824baaa831 100644 (file)
@@ -306,6 +306,7 @@ extern StructRNA RNA_MaterialSubsurfaceScattering;
 extern StructRNA RNA_MaterialTextureSlot;
 extern StructRNA RNA_MaterialVolume;
 extern StructRNA RNA_Mask;
+extern StructRNA RNA_MaskObject;
 extern StructRNA RNA_Menu;
 extern StructRNA RNA_Mesh;
 extern StructRNA RNA_MeshColor;
index 1345011cd7e9e9da5730fb8aeed421f3f6efcdca..393ca5f32446cb67cb111f1496ca79b5dd45f8cf 100644 (file)
@@ -533,6 +533,32 @@ static void rna_def_mask_object(BlenderRNA *brna)
        RNA_def_property_struct_type(prop, "MaskSpline");
        RNA_def_property_ui_text(prop, "Splines", "Collection of splines which defines this object");
        RNA_def_property_srna(prop, "MaskSplines");
+
+       /* restrict */
+       prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", MASK_RESTRICT_VIEW);
+       RNA_def_property_ui_text(prop, "Restrict View", "Restrict visibility in the viewport");
+       RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 1);
+       RNA_def_property_update(prop, NC_MASK | ND_DRAW, NULL);
+
+       prop = RNA_def_property(srna, "hide_select", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", MASK_RESTRICT_SELECT);
+       RNA_def_property_ui_text(prop, "Restrict Select", "Restrict selection in the viewport");
+       RNA_def_property_ui_icon(prop, ICON_RESTRICT_SELECT_OFF, 1);
+       RNA_def_property_update(prop, NC_MASK | ND_DRAW, NULL);
+
+       prop = RNA_def_property(srna, "hide_render", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "restrictflag", MASK_RESTRICT_RENDER);
+       RNA_def_property_ui_text(prop, "Restrict Render", "Restrict renderability");
+       RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_OFF, 1);
+       RNA_def_property_update(prop, NC_MASK | ND_DRAW, NULL);
+
+       /* render settings */
+       prop = RNA_def_property(srna, "alpha", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "alpha");
+       RNA_def_property_range(prop, 0.0, 1.0f);
+       RNA_def_property_ui_text(prop, "Opacity", "Render Opacity");
+       RNA_def_property_update(prop, NC_MASK | ND_DRAW, NULL);
 }
 
 static void rna_def_maskobjects(BlenderRNA *brna, PropertyRNA *cprop)