RNA
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Wed, 26 Nov 2008 22:52:01 +0000 (22:52 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Wed, 26 Nov 2008 22:52:01 +0000 (22:52 +0000)
* Added support for auto generating enum properties that are defined as
  bitflags mixed with other flags (use for shadow type in la->mode now).

source/blender/makesrna/RNA_define.h
source/blender/makesrna/intern/makesrna.c
source/blender/makesrna/intern/rna_define.c
source/blender/makesrna/intern/rna_internal.h
source/blender/makesrna/intern/rna_lamp.c
source/blender/makesrna/intern/rna_scene.c

index f9f3b877a6e64887927cf249816ed3e8ca79a2bc..03ae491542d0a0998cf58d81b01b6d49a5e44503 100644 (file)
@@ -54,7 +54,7 @@ void RNA_def_property_boolean_sdna(PropertyRNA *prop, const char *structname, co
 void RNA_def_property_int_sdna(PropertyRNA *prop, const char *structname, const char *propname);
 void RNA_def_property_float_sdna(PropertyRNA *prop, const char *structname, const char *propname);
 void RNA_def_property_string_sdna(PropertyRNA *prop, const char *structname, const char *propname);
-void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const char *propname);
+void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const char *propname, int bitflags);
 void RNA_def_property_pointer_sdna(PropertyRNA *prop, const char *structname, const char *propname);
 void RNA_def_property_collection_sdna(PropertyRNA *prop, const char *structname, const char *propname, const char *lengthpropname);
 
index d9db1121ba23ede0eb7cbc654366741d5ec3f0f9..f3afaf1bb784ab26db9450e59b83082d2ecb0f6c 100644 (file)
@@ -44,6 +44,8 @@
 #endif
 #endif
 
+/* Sorting */
+
 int cmp_struct(const void *a, const void *b)
 {
        const StructRNA *structa= *(const StructRNA**)a;
@@ -146,6 +148,17 @@ static const char *rna_type_type(PropertyRNA *prop)
        }
 }
 
+static int rna_enum_bitmask(PropertyRNA *prop)
+{
+       EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
+       int a, mask= 0;
+
+       for(a=0; a<eprop->totitem; a++)
+               mask |= eprop->item[a].value;
+       
+       return mask;
+}
+
 static char *rna_def_property_get_func(FILE *f, StructRNA *srna, PropertyRNA *prop, PropertyDefRNA *dp)
 {
        char *func;
@@ -202,6 +215,8 @@ static char *rna_def_property_get_func(FILE *f, StructRNA *srna, PropertyRNA *pr
                                fprintf(f, "    %s *data= (%s*)ptr->data;\n", dp->dnastructname, dp->dnastructname);
                                if(prop->type == PROP_BOOLEAN && dp->booleanbit)
                                        fprintf(f, "    return (((data->%s) & %d) != 0);\n", dp->dnaname, dp->booleanbit);
+                               else if(prop->type == PROP_ENUM && dp->enumbitflags)
+                                       fprintf(f, "    return ((data->%s) & %d);\n", dp->dnaname, rna_enum_bitmask(prop));
                                else
                                        fprintf(f, "    return (%s)(data->%s);\n", rna_type_type(prop), dp->dnaname);
                                fprintf(f, "}\n\n");
@@ -306,6 +321,10 @@ static char *rna_def_property_set_func(FILE *f, StructRNA *srna, PropertyRNA *pr
                                        fprintf(f, "    if(value) data->%s |= %d;\n", dp->dnaname, dp->booleanbit);
                                        fprintf(f, "    else data->%s &= ~%d;\n", dp->dnaname, dp->booleanbit);
                                }
+                               else if(prop->type == PROP_ENUM && dp->enumbitflags) {
+                                       fprintf(f, "    data->%s &= ~%d;\n", dp->dnaname, rna_enum_bitmask(prop));
+                                       fprintf(f, "    data->%s |= value;\n", dp->dnaname, rna_enum_bitmask(prop));
+                               }
                                else {
                                        rna_clamp_value(f, prop);
                                        fprintf(f, "    data->%s= value;\n", dp->dnaname);
index 63df7252e9e69622af565d2230944bb5898f4a9a..709c42f8dcae7c6d96ec7e71e40019ea1ac3706f 100644 (file)
@@ -519,7 +519,7 @@ PropertyRNA *RNA_def_property(StructRNA *srna, const char *identifier, int type,
                        }
                        case PROP_ENUM:
                                DefRNA.silent= 1;
-                               RNA_def_property_enum_sdna(prop, NULL, identifier);
+                               RNA_def_property_enum_sdna(prop, NULL, identifier, 0);
                                DefRNA.silent= 0;
                                break;
                        case PROP_POINTER:
@@ -953,7 +953,7 @@ void RNA_def_property_float_sdna(PropertyRNA *prop, const char *structname, cons
        rna_def_property_sdna(prop, structname, propname);
 }
 
-void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const char *propname)
+void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const char *propname, int bitflags)
 {
        PropertyDefRNA *dp;
        StructRNA *srna= DefRNA.laststruct;
@@ -970,6 +970,8 @@ void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const
        }
 
        if((dp=rna_def_property_sdna(prop, structname, propname))) {
+               dp->enumbitflags= bitflags;
+
                if(prop->arraylength) {
                        prop->arraylength= 0;
                        if(!DefRNA.silent) {
index 03ef6016c07229ee015a3af6d2b6e6ecb39f235c..e3ce6b9f3136f9bf4c5aea4e401ac48a6e02b379 100644 (file)
@@ -49,6 +49,7 @@ typedef struct PropertyDefRNA {
        int dnapointerlevel;
 
        int booleanbit;
+       int enumbitflags;
 } PropertyDefRNA;
 
 typedef struct StructDefRNA {
index 6e086f5787d4102cb3658e0def6c1d162c4d5724..46167cc7a5de649990ad226e6e9bb207503b0658 100644 (file)
@@ -46,6 +46,11 @@ void RNA_def_lamp(BlenderRNA *brna)
                {LA_HEMI, "HEMI", "Hemi", ""},
                {LA_AREA, "AREA", "Area", ""},
                {0, NULL, NULL, NULL}};
+       static EnumPropertyItem prop_shadow_items[] = {
+               {0, "NOSHADOW", "No Shadow", ""},
+               {LA_SHAD_BUF, "BUFSHADOW", "Buffer Shadow", "Lets spotlight produce shadows using shadow buffer."},
+               {LA_SHAD_RAY, "RAYSHADOW", "Ray Shadow", "Use ray tracing for shadow."},
+               {0, NULL, NULL, NULL}};
 
        srna= RNA_def_struct(brna, "Lamp", "ID", "Lamp");
 
@@ -66,6 +71,11 @@ void RNA_def_lamp(BlenderRNA *brna)
        RNA_def_property_array(prop, 3);
        RNA_def_property_ui_text(prop, "Color", "Lamp color.");
        RNA_def_property_ui_range(prop, 0.0f , 1.0f, 10.0f, 3.0f);
+
+       prop= RNA_def_property(srna, "shadow", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_sdna(prop, NULL, "mode", 1); /* use bitflags */
+       RNA_def_property_enum_items(prop, prop_shadow_items);
+       RNA_def_property_ui_text(prop, "Shadow", "Method to compute lamp shadow.");
 }
 
 #endif
index f2a090a17745495898fc6cd8e9a0678187c88e95..236a78d837ac7fc4773d1d0a9027d82f41228429 100644 (file)
@@ -111,7 +111,7 @@ void RNA_def_scene(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Stamp Note", "User define note for the render stamping.");
 
        prop= RNA_def_property(srna, "unwrapper", PROP_ENUM, PROP_NONE);
-       RNA_def_property_enum_sdna(prop, NULL, "toolsettings->unwrapper");
+       RNA_def_property_enum_sdna(prop, NULL, "toolsettings->unwrapper", 0);
        RNA_def_property_enum_items(prop, unwrapper_items);
        RNA_def_property_ui_text(prop, "Unwrapper", "Unwrap algorithm used by the Unwrap tool.");
 }