Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/makesrna/intern')
-rw-r--r--source/blender/makesrna/intern/makesrna.c9
-rw-r--r--source/blender/makesrna/intern/rna_ID.c164
-rw-r--r--source/blender/makesrna/intern/rna_access.c300
-rw-r--r--source/blender/makesrna/intern/rna_define.c2
-rw-r--r--source/blender/makesrna/intern/rna_internal.h28
-rw-r--r--source/blender/makesrna/intern/rna_internal_types.h225
-rw-r--r--source/blender/makesrna/intern/rna_main.c2
-rw-r--r--source/blender/makesrna/intern/rna_rna.c157
-rw-r--r--source/blender/makesrna/intern/rna_scene.c4
9 files changed, 795 insertions, 96 deletions
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index 00bbcb3664a..df3d9c113e9 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -545,7 +545,7 @@ static void rna_generate_struct(BlenderRNA *brna, StructRNA *srna, FILE *f)
fprintf(f, "\n");
for(prop=srna->properties.first; prop; prop=prop->next)
- fprintf(f, "static %s rna_%s_%s;\n", rna_property_structname(prop->type), srna->identifier, prop->identifier);
+ fprintf(f, "%s%s rna_%s_%s;\n", (prop->flag & PROP_EXPORT)? "": "static ", rna_property_structname(prop->type), srna->identifier, prop->identifier);
fprintf(f, "\n");
for(prop=srna->properties.first; prop; prop=prop->next) {
@@ -628,13 +628,14 @@ static void rna_generate_struct(BlenderRNA *brna, StructRNA *srna, FILE *f)
break;
}
- fprintf(f, "static %s rna_%s_%s = {\n", rna_property_structname(prop->type), srna->identifier, prop->identifier);
+ fprintf(f, "%s%s rna_%s_%s = {\n", (prop->flag & PROP_EXPORT)? "": "static ", rna_property_structname(prop->type), srna->identifier, prop->identifier);
if(prop->next) fprintf(f, "\t{(PropertyRNA*)&rna_%s_%s, ", srna->identifier, prop->next->identifier);
else fprintf(f, "\t{NULL, ");
if(prop->prev) fprintf(f, "(PropertyRNA*)&rna_%s_%s,\n", srna->identifier, prop->prev->identifier);
else fprintf(f, "NULL,\n");
- fprintf(f, "\t"); rna_print_c_string(f, prop->identifier);
+ fprintf(f, "\t%d, ", prop->magic);
+ rna_print_c_string(f, prop->identifier);
fprintf(f, ", %d, ", prop->flag);
rna_print_c_string(f, prop->name); fprintf(f, ",\n\t");
rna_print_c_string(f, prop->description); fprintf(f, ",\n");
@@ -738,7 +739,7 @@ typedef struct RNAProcessItem {
} RNAProcessItem;
RNAProcessItem PROCESS_ITEMS[]= {
- {"rna_ID.c", NULL},
+ {"rna_ID.c", RNA_def_ID_types},
{"rna_main.c", RNA_def_main},
{"rna_mesh.c", RNA_def_mesh},
{"rna_object.c", RNA_def_object},
diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c
index 7688042525a..77d273816ae 100644
--- a/source/blender/makesrna/intern/rna_ID.c
+++ b/source/blender/makesrna/intern/rna_ID.c
@@ -23,6 +23,7 @@
*/
#include <stdlib.h>
+#include <stdio.h>
#include "RNA_define.h"
#include "RNA_types.h"
@@ -31,6 +32,8 @@
#ifdef RNA_RUNTIME
+#include "BKE_idprop.h"
+
/* name functions that ignore the first two ID characters */
static void rna_ID_name_get(PointerRNA *ptr, char *value)
{
@@ -50,8 +53,164 @@ static void rna_ID_name_set(PointerRNA *ptr, const char *value)
BLI_strncpy(id->name+2, value, sizeof(id->name)-2);
}
+/* ID properties */
+
+static void rna_IDProperty_string_get(PointerRNA *ptr, char *value)
+{
+ IDProperty *prop= (IDProperty*)ptr->data;
+ strcpy(value, IDP_String(prop));
+}
+
+static int rna_IDProperty_string_length(PointerRNA *ptr)
+{
+ IDProperty *prop= (IDProperty*)ptr->data;
+ return strlen(IDP_String(prop));
+}
+
+static void rna_IDProperty_string_set(PointerRNA *ptr, const char *value)
+{
+ IDProperty *prop= (IDProperty*)ptr->data;
+ IDP_AssignString(prop, (char*)value);
+}
+
+static int rna_IDProperty_int_get(PointerRNA *ptr)
+{
+ IDProperty *prop= (IDProperty*)ptr->data;
+ return IDP_Int(prop);
+}
+
+static void rna_IDProperty_int_set(PointerRNA *ptr, int value)
+{
+ IDProperty *prop= (IDProperty*)ptr->data;
+ IDP_Int(prop)= value;
+}
+
+static int rna_IDProperty_intarray_get(PointerRNA *ptr, int index)
+{
+ IDProperty *prop= (IDProperty*)ptr->data;
+ return ((int*)IDP_Array(prop))[index];
+}
+
+static void rna_IDProperty_intarray_set(PointerRNA *ptr, int index, int value)
+{
+ IDProperty *prop= (IDProperty*)ptr->data;
+ ((int*)IDP_Array(prop))[index]= value;
+}
+
+static float rna_IDProperty_float_get(PointerRNA *ptr)
+{
+ IDProperty *prop= (IDProperty*)ptr->data;
+ return IDP_Float(prop);
+}
+
+static void rna_IDProperty_float_set(PointerRNA *ptr, float value)
+{
+ IDProperty *prop= (IDProperty*)ptr->data;
+ IDP_Float(prop)= value;
+}
+
+static float rna_IDProperty_floatarray_get(PointerRNA *ptr, int index)
+{
+ IDProperty *prop= (IDProperty*)ptr->data;
+ return ((float*)IDP_Array(prop))[index];
+}
+
+static void rna_IDProperty_floatarray_set(PointerRNA *ptr, int index, float value)
+{
+ IDProperty *prop= (IDProperty*)ptr->data;
+ ((float*)IDP_Array(prop))[index]= value;
+}
+
+static float rna_IDProperty_double_get(PointerRNA *ptr)
+{
+ IDProperty *prop= (IDProperty*)ptr->data;
+ return (float)IDP_Double(prop);
+}
+
+static void rna_IDProperty_double_set(PointerRNA *ptr, float value)
+{
+ IDProperty *prop= (IDProperty*)ptr->data;
+ IDP_Double(prop)= value;
+}
+
+static float rna_IDProperty_doublearray_get(PointerRNA *ptr, int index)
+{
+ IDProperty *prop= (IDProperty*)ptr->data;
+ return (float)(((double*)IDP_Array(prop))[index]);
+}
+
+static void rna_IDProperty_doublearray_set(PointerRNA *ptr, int index, float value)
+{
+ IDProperty *prop= (IDProperty*)ptr->data;
+ ((double*)IDP_Array(prop))[index]= value;
+}
+
+static void* rna_IDProperty_group_get(PointerRNA *ptr)
+{
+ IDProperty *prop= (IDProperty*)ptr->data;
+ return prop;
+}
+
#else
+static void RNA_def_ID_property(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ /* this is struct is used for holding the virtual
+ * PropertyRNA's for ID properties */
+ srna= RNA_def_struct(brna, "IDProperty", "ID Property");
+
+ /* IDP_STRING */
+ prop= RNA_def_property(srna, "string", PROP_STRING, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_EXPORT);
+ RNA_def_property_string_funcs(prop, "rna_IDProperty_string_get", "rna_IDProperty_string_length", "rna_IDProperty_string_set");
+
+ /* IDP_INT */
+ prop= RNA_def_property(srna, "int", PROP_INT, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_EXPORT);
+ RNA_def_property_int_funcs(prop, "rna_IDProperty_int_get", "rna_IDProperty_int_set");
+
+ prop= RNA_def_property(srna, "intarray", PROP_INT, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_EXPORT);
+ RNA_def_property_array(prop, 1);
+ RNA_def_property_int_funcs(prop, "rna_IDProperty_intarray_get", "rna_IDProperty_intarray_set");
+
+ /* IDP_FLOAT */
+ prop= RNA_def_property(srna, "float", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_EXPORT);
+ RNA_def_property_float_funcs(prop, "rna_IDProperty_float_get", "rna_IDProperty_float_set");
+
+ prop= RNA_def_property(srna, "floatarray", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_EXPORT);
+ RNA_def_property_array(prop, 1);
+ RNA_def_property_float_funcs(prop, "rna_IDProperty_floatarray_get", "rna_IDProperty_floatarray_set");
+
+ /* IDP_DOUBLE */
+ prop= RNA_def_property(srna, "double", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_EXPORT);
+ RNA_def_property_float_funcs(prop, "rna_IDProperty_double_get", "rna_IDProperty_double_set");
+
+ prop= RNA_def_property(srna, "doublearray", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_EXPORT);
+ RNA_def_property_array(prop, 1);
+ RNA_def_property_float_funcs(prop, "rna_IDProperty_doublearray_get", "rna_IDProperty_doublearray_set");
+
+ /* IDP_GROUP */
+ prop= RNA_def_property(srna, "group", PROP_POINTER, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_EXPORT|PROP_NOT_EDITABLE);
+ RNA_def_property_struct_type(prop, "IDPropertyGroup");
+ RNA_def_property_pointer_funcs(prop, "rna_IDProperty_group_get", 0, 0);
+
+ /* IDP_ID -- not implemented yet in id properties */
+
+ /* ID property groups > level 0, since level 0 group is merged
+ * with native RNA properties. the builtin_properties will take
+ * care of the properties here */
+ srna= RNA_def_struct(brna, "IDPropertyGroup", "ID Property Group");
+}
+
void RNA_def_ID(StructRNA *srna)
{
PropertyRNA *prop;
@@ -65,5 +224,10 @@ void RNA_def_ID(StructRNA *srna)
RNA_def_struct_name_property(srna, prop);
}
+void RNA_def_ID_types(BlenderRNA *brna)
+{
+ RNA_def_ID_property(brna);
+}
+
#endif
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index cdf2f4a8838..56a1e0166bd 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -30,6 +30,8 @@
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
+#include "DNA_ID.h"
+
#include "RNA_access.h"
#include "RNA_types.h"
@@ -57,6 +59,51 @@ static void rna_pointer_inherit_id(PointerRNA *parent, PointerRNA *ptr)
}
}
+/* ID Properties */
+
+IDProperty *rna_idproperty_check(PropertyRNA **prop, PointerRNA *ptr)
+{
+ /* This is quite a hack, but avoids some complexity in the API. we
+ * pass IDProperty structs as PropertyRNA pointers to the outside.
+ * We store some bytes in PropertyRNA structs that allows us to
+ * distinguish it from IDProperty structs. If it is an ID property,
+ * we look up an IDP PropertyRNA based on the type, and set the data
+ * pointer to the IDProperty. */
+
+ /* these bytes have */
+ if((*prop)->magic == RNA_MAGIC) {
+ return 0;
+ }
+ else {
+ static PropertyRNA *typemap[IDP_NUMTYPES] =
+ {(PropertyRNA*)&rna_IDProperty_string,
+ (PropertyRNA*)&rna_IDProperty_int,
+ (PropertyRNA*)&rna_IDProperty_float,
+ NULL, NULL, NULL,
+ (PropertyRNA*)&rna_IDProperty_group, NULL,
+ (PropertyRNA*)&rna_IDProperty_double};
+
+ static PropertyRNA *arraytypemap[IDP_NUMTYPES] =
+ {NULL, (PropertyRNA*)&rna_IDProperty_intarray,
+ (PropertyRNA*)&rna_IDProperty_floatarray,
+ NULL, NULL, NULL, NULL, NULL,
+ (PropertyRNA*)&rna_IDProperty_doublearray};
+
+ IDProperty *idprop;
+
+ idprop= (IDProperty*)*prop;
+ if(idprop->type == IDP_ARRAY)
+ *prop= arraytypemap[(int)(idprop->subtype)];
+ else
+ *prop= typemap[(int)(idprop->type)];
+
+ if(ptr)
+ ptr->data= idprop;
+
+ return idprop;
+ }
+}
+
/* Structs */
const char *RNA_struct_identifier(PointerRNA *ptr)
@@ -83,27 +130,44 @@ PropertyRNA *RNA_struct_iterator_property(PointerRNA *ptr)
const char *RNA_property_identifier(PropertyRNA *prop, PointerRNA *ptr)
{
- return prop->identifier;
+ IDProperty *idprop;
+
+ if((idprop=rna_idproperty_check(&prop, NULL)))
+ return idprop->name;
+ else
+ return prop->identifier;
}
PropertyType RNA_property_type(PropertyRNA *prop, PointerRNA *ptr)
{
+ rna_idproperty_check(&prop, NULL);
+
return prop->type;
}
PropertySubType RNA_property_subtype(PropertyRNA *prop, PointerRNA *ptr)
{
+ rna_idproperty_check(&prop, NULL);
+
return prop->subtype;
}
int RNA_property_array_length(PropertyRNA *prop, PointerRNA *ptr)
{
- return prop->arraylength;
+ IDProperty *idprop;
+
+ if((idprop=rna_idproperty_check(&prop, NULL)) && idprop->type==IDP_ARRAY)
+ return idprop->len;
+ else
+ return prop->arraylength;
}
void RNA_property_int_range(PropertyRNA *prop, PointerRNA *ptr, int *hardmin, int *hardmax)
{
- IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
+ IntPropertyRNA *iprop;
+
+ rna_idproperty_check(&prop, NULL);
+ iprop= (IntPropertyRNA*)prop;
*hardmin= iprop->hardmin;
*hardmax= iprop->hardmax;
@@ -111,7 +175,10 @@ void RNA_property_int_range(PropertyRNA *prop, PointerRNA *ptr, int *hardmin, in
void RNA_property_int_ui_range(PropertyRNA *prop, PointerRNA *ptr, int *softmin, int *softmax, int *step)
{
- IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
+ IntPropertyRNA *iprop;
+
+ rna_idproperty_check(&prop, NULL);
+ iprop= (IntPropertyRNA*)prop;
*softmin= iprop->softmin;
*softmax= iprop->softmax;
@@ -120,7 +187,10 @@ void RNA_property_int_ui_range(PropertyRNA *prop, PointerRNA *ptr, int *softmin,
void RNA_property_float_range(PropertyRNA *prop, PointerRNA *ptr, float *hardmin, float *hardmax)
{
- FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
+ FloatPropertyRNA *fprop;
+
+ rna_idproperty_check(&prop, NULL);
+ fprop= (FloatPropertyRNA*)prop;
*hardmin= fprop->hardmin;
*hardmax= fprop->hardmax;
@@ -128,7 +198,10 @@ void RNA_property_float_range(PropertyRNA *prop, PointerRNA *ptr, float *hardmin
void RNA_property_float_ui_range(PropertyRNA *prop, PointerRNA *ptr, float *softmin, float *softmax, float *step, float *precision)
{
- FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
+ FloatPropertyRNA *fprop;
+
+ rna_idproperty_check(&prop, NULL);
+ fprop= (FloatPropertyRNA*)prop;
*softmin= fprop->softmin;
*softmax= fprop->softmax;
@@ -138,14 +211,20 @@ void RNA_property_float_ui_range(PropertyRNA *prop, PointerRNA *ptr, float *soft
int RNA_property_string_maxlength(PropertyRNA *prop, PointerRNA *ptr)
{
- StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
+ StringPropertyRNA *sprop;
+ rna_idproperty_check(&prop, NULL);
+ sprop= (StringPropertyRNA*)prop;
+
return sprop->maxlength;
}
void RNA_property_enum_items(PropertyRNA *prop, PointerRNA *ptr, const EnumPropertyItem **item, int *totitem)
{
- EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
+ EnumPropertyRNA *eprop;
+
+ rna_idproperty_check(&prop, NULL);
+ eprop= (EnumPropertyRNA*)prop;
*item= eprop->item;
*totitem= eprop->totitem;
@@ -153,42 +232,62 @@ void RNA_property_enum_items(PropertyRNA *prop, PointerRNA *ptr, const EnumPrope
const char *RNA_property_ui_name(PropertyRNA *prop, PointerRNA *ptr)
{
- return prop->name;
+ IDProperty *idprop;
+
+ if((idprop=rna_idproperty_check(&prop, NULL)))
+ return idprop->name;
+ else
+ return prop->name;
}
const char *RNA_property_ui_description(PropertyRNA *prop, PointerRNA *ptr)
{
- return prop->description;
+ if(rna_idproperty_check(&prop, NULL))
+ return "";
+ else
+ return prop->description;
}
-/* Property Data */
-
int RNA_property_editable(PropertyRNA *prop, PointerRNA *ptr)
{
+ rna_idproperty_check(&prop, NULL);
+
return !(prop->flag & PROP_NOT_EDITABLE);
}
int RNA_property_evaluated(PropertyRNA *prop, PointerRNA *ptr)
{
+ rna_idproperty_check(&prop, NULL);
+
return (prop->flag & PROP_EVALUATED);
}
void RNA_property_notify(PropertyRNA *prop, struct bContext *C, PointerRNA *ptr)
{
+ rna_idproperty_check(&prop, NULL);
+
if(prop->notify)
prop->notify(C, ptr);
}
+/* Property Data */
+
int RNA_property_boolean_get(PropertyRNA *prop, PointerRNA *ptr)
{
- BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BooleanPropertyRNA *bprop;
+
+ rna_idproperty_check(&prop, ptr);
+ bprop= (BooleanPropertyRNA*)prop;
return bprop->get(ptr);
}
void RNA_property_boolean_set(PropertyRNA *prop, PointerRNA *ptr, int value)
{
- BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BooleanPropertyRNA *bprop;
+
+ rna_idproperty_check(&prop, ptr);
+ bprop= (BooleanPropertyRNA*)prop;
if(bprop->set)
bprop->set(ptr, value);
@@ -196,14 +295,20 @@ void RNA_property_boolean_set(PropertyRNA *prop, PointerRNA *ptr, int value)
int RNA_property_boolean_get_array(PropertyRNA *prop, PointerRNA *ptr, int index)
{
- BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BooleanPropertyRNA *bprop;
+
+ rna_idproperty_check(&prop, ptr);
+ bprop= (BooleanPropertyRNA*)prop;
return bprop->getarray(ptr, index);
}
void RNA_property_boolean_set_array(PropertyRNA *prop, PointerRNA *ptr, int index, int value)
{
- BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BooleanPropertyRNA *bprop;
+
+ rna_idproperty_check(&prop, ptr);
+ bprop= (BooleanPropertyRNA*)prop;
if(bprop->setarray)
bprop->setarray(ptr, index, value);
@@ -211,14 +316,20 @@ void RNA_property_boolean_set_array(PropertyRNA *prop, PointerRNA *ptr, int inde
int RNA_property_int_get(PropertyRNA *prop, PointerRNA *ptr)
{
- IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
+ IntPropertyRNA *iprop;
+
+ rna_idproperty_check(&prop, ptr);
+ iprop= (IntPropertyRNA*)prop;
return iprop->get(ptr);
}
void RNA_property_int_set(PropertyRNA *prop, PointerRNA *ptr, int value)
{
- IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
+ IntPropertyRNA *iprop;
+
+ rna_idproperty_check(&prop, ptr);
+ iprop= (IntPropertyRNA*)prop;
if(iprop->set)
iprop->set(ptr, value);
@@ -226,14 +337,20 @@ void RNA_property_int_set(PropertyRNA *prop, PointerRNA *ptr, int value)
int RNA_property_int_get_array(PropertyRNA *prop, PointerRNA *ptr, int index)
{
- IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
+ IntPropertyRNA *iprop;
+
+ rna_idproperty_check(&prop, ptr);
+ iprop= (IntPropertyRNA*)prop;
return iprop->getarray(ptr, index);
}
void RNA_property_int_set_array(PropertyRNA *prop, PointerRNA *ptr, int index, int value)
{
- IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
+ IntPropertyRNA *iprop;
+
+ rna_idproperty_check(&prop, ptr);
+ iprop= (IntPropertyRNA*)prop;
if(iprop->setarray)
iprop->setarray(ptr, index, value);
@@ -241,14 +358,20 @@ void RNA_property_int_set_array(PropertyRNA *prop, PointerRNA *ptr, int index, i
float RNA_property_float_get(PropertyRNA *prop, PointerRNA *ptr)
{
- FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
+ FloatPropertyRNA *fprop;
+
+ rna_idproperty_check(&prop, ptr);
+ fprop= (FloatPropertyRNA*)prop;
return fprop->get(ptr);
}
void RNA_property_float_set(PropertyRNA *prop, PointerRNA *ptr, float value)
{
- FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
+ FloatPropertyRNA *fprop;
+
+ rna_idproperty_check(&prop, ptr);
+ fprop= (FloatPropertyRNA*)prop;
if(fprop->set)
fprop->set(ptr, value);
@@ -256,14 +379,20 @@ void RNA_property_float_set(PropertyRNA *prop, PointerRNA *ptr, float value)
float RNA_property_float_get_array(PropertyRNA *prop, PointerRNA *ptr, int index)
{
- FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
+ FloatPropertyRNA *fprop;
+
+ rna_idproperty_check(&prop, ptr);
+ fprop= (FloatPropertyRNA*)prop;
return fprop->getarray(ptr, index);
}
void RNA_property_float_set_array(PropertyRNA *prop, PointerRNA *ptr, int index, float value)
{
- FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
+ FloatPropertyRNA *fprop;
+
+ rna_idproperty_check(&prop, ptr);
+ fprop= (FloatPropertyRNA*)prop;
if(fprop->setarray)
fprop->setarray(ptr, index, value);
@@ -271,7 +400,10 @@ void RNA_property_float_set_array(PropertyRNA *prop, PointerRNA *ptr, int index,
void RNA_property_string_get(PropertyRNA *prop, PointerRNA *ptr, char *value)
{
- StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
+ StringPropertyRNA *sprop;
+
+ rna_idproperty_check(&prop, ptr);
+ sprop= (StringPropertyRNA*)prop;
sprop->get(ptr, value);
}
@@ -281,6 +413,8 @@ char *RNA_property_string_get_alloc(PropertyRNA *prop, PointerRNA *ptr, char *fi
char *buf;
int length;
+ rna_idproperty_check(&prop, ptr);
+
length= RNA_property_string_length(prop, ptr);
if(length+1 < fixedlen)
@@ -295,14 +429,20 @@ char *RNA_property_string_get_alloc(PropertyRNA *prop, PointerRNA *ptr, char *fi
int RNA_property_string_length(PropertyRNA *prop, PointerRNA *ptr)
{
- StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
+ StringPropertyRNA *sprop;
+
+ rna_idproperty_check(&prop, ptr);
+ sprop= (StringPropertyRNA*)prop;
return sprop->length(ptr);
}
void RNA_property_string_set(PropertyRNA *prop, PointerRNA *ptr, const char *value)
{
- StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
+ StringPropertyRNA *sprop;
+
+ rna_idproperty_check(&prop, ptr);
+ sprop= (StringPropertyRNA*)prop;
if(sprop->set)
sprop->set(ptr, value);
@@ -310,14 +450,20 @@ void RNA_property_string_set(PropertyRNA *prop, PointerRNA *ptr, const char *val
int RNA_property_enum_get(PropertyRNA *prop, PointerRNA *ptr)
{
- EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
+ EnumPropertyRNA *eprop;
+
+ rna_idproperty_check(&prop, ptr);
+ eprop= (EnumPropertyRNA*)prop;
return eprop->get(ptr);
}
void RNA_property_enum_set(PropertyRNA *prop, PointerRNA *ptr, int value)
{
- EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
+ EnumPropertyRNA *eprop;
+
+ rna_idproperty_check(&prop, ptr);
+ eprop= (EnumPropertyRNA*)prop;
if(eprop->set)
eprop->set(ptr, value);
@@ -325,7 +471,10 @@ void RNA_property_enum_set(PropertyRNA *prop, PointerRNA *ptr, int value)
void RNA_property_pointer_get(PropertyRNA *prop, PointerRNA *ptr, PointerRNA *r_ptr)
{
- PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
+ PointerPropertyRNA *pprop;
+
+ rna_idproperty_check(&prop, ptr);
+ pprop= (PointerPropertyRNA*)prop;
r_ptr->data= pprop->get(ptr);
@@ -339,7 +488,10 @@ void RNA_property_pointer_get(PropertyRNA *prop, PointerRNA *ptr, PointerRNA *r_
void RNA_property_pointer_set(PropertyRNA *prop, PointerRNA *ptr, PointerRNA *ptr_value)
{
- PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
+ PointerPropertyRNA *pprop;
+
+ rna_idproperty_check(&prop, ptr);
+ pprop= (PointerPropertyRNA*)prop;
if(pprop->set)
pprop->set(ptr, ptr_value->data);
@@ -347,7 +499,10 @@ void RNA_property_pointer_set(PropertyRNA *prop, PointerRNA *ptr, PointerRNA *pt
StructRNA *RNA_property_pointer_type(PropertyRNA *prop, PointerRNA *ptr)
{
- PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
+ PointerPropertyRNA *pprop;
+
+ rna_idproperty_check(&prop, ptr);
+ pprop= (PointerPropertyRNA*)prop;
if(pprop->type)
return pprop->type(ptr);
@@ -357,7 +512,10 @@ StructRNA *RNA_property_pointer_type(PropertyRNA *prop, PointerRNA *ptr)
static StructRNA *rna_property_collection_type(PropertyRNA *prop, CollectionPropertyIterator *iter)
{
- CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
+ CollectionPropertyRNA *cprop;
+
+ rna_idproperty_check(&prop, NULL);
+ cprop= (CollectionPropertyRNA*)prop;
if(cprop->type)
return cprop->type(iter);
@@ -367,7 +525,10 @@ static StructRNA *rna_property_collection_type(PropertyRNA *prop, CollectionProp
static void rna_property_collection_get(PropertyRNA *prop, CollectionPropertyIterator *iter, PointerRNA *r_ptr)
{
- CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
+ CollectionPropertyRNA *cprop;
+
+ rna_idproperty_check(&prop, NULL);
+ cprop= (CollectionPropertyRNA*)prop;
r_ptr->data= cprop->get(iter);
@@ -381,7 +542,10 @@ static void rna_property_collection_get(PropertyRNA *prop, CollectionPropertyIte
void RNA_property_collection_begin(PropertyRNA *prop, CollectionPropertyIterator *iter, PointerRNA *ptr)
{
- CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
+ CollectionPropertyRNA *cprop;
+
+ rna_idproperty_check(&prop, ptr);
+ cprop= (CollectionPropertyRNA*)prop;
iter->parent= *ptr;
cprop->begin(iter, ptr);
@@ -394,7 +558,10 @@ void RNA_property_collection_begin(PropertyRNA *prop, CollectionPropertyIterator
void RNA_property_collection_next(PropertyRNA *prop, CollectionPropertyIterator *iter)
{
- CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
+ CollectionPropertyRNA *cprop;
+
+ rna_idproperty_check(&prop, NULL);
+ cprop= (CollectionPropertyRNA*)prop;
cprop->next(iter);
@@ -406,7 +573,10 @@ void RNA_property_collection_next(PropertyRNA *prop, CollectionPropertyIterator
void RNA_property_collection_end(PropertyRNA *prop, CollectionPropertyIterator *iter)
{
- CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
+ CollectionPropertyRNA *cprop;
+
+ rna_idproperty_check(&prop, NULL);
+ cprop= (CollectionPropertyRNA*)prop;
if(cprop->end)
cprop->end(iter);
@@ -414,7 +584,10 @@ void RNA_property_collection_end(PropertyRNA *prop, CollectionPropertyIterator *
int RNA_property_collection_length(PropertyRNA *prop, PointerRNA *ptr)
{
- CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
+ CollectionPropertyRNA *cprop;
+
+ rna_idproperty_check(&prop, ptr);
+ cprop= (CollectionPropertyRNA*)prop;
if(cprop->length) {
return cprop->length(ptr);
@@ -423,11 +596,10 @@ int RNA_property_collection_length(PropertyRNA *prop, PointerRNA *ptr)
CollectionPropertyIterator iter;
int length= 0;
- for(cprop->begin(&iter, ptr); iter.valid; cprop->next(&iter))
+ RNA_property_collection_begin(prop, &iter, ptr);
+ for(; iter.valid; RNA_property_collection_next(prop, &iter))
length++;
-
- if(cprop->end)
- cprop->end(&iter);
+ RNA_property_collection_end(prop, &iter);
return length;
}
@@ -435,7 +607,10 @@ int RNA_property_collection_length(PropertyRNA *prop, PointerRNA *ptr)
int RNA_property_collection_lookup_int(PropertyRNA *prop, PointerRNA *ptr, int key, PointerRNA *r_ptr)
{
- CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
+ CollectionPropertyRNA *cprop;
+
+ rna_idproperty_check(&prop, ptr);
+ cprop= (CollectionPropertyRNA*)prop;
if(cprop->lookupint) {
/* we have a callback defined, use it */
@@ -476,7 +651,10 @@ int RNA_property_collection_lookup_int(PropertyRNA *prop, PointerRNA *ptr, int k
int RNA_property_collection_lookup_string(PropertyRNA *prop, PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
{
- CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
+ CollectionPropertyRNA *cprop;
+
+ rna_idproperty_check(&prop, ptr);
+ cprop= (CollectionPropertyRNA*)prop;
if(cprop->lookupstring) {
/* we have a callback defined, use it */
@@ -544,19 +722,33 @@ int RNA_property_collection_lookup_string(PropertyRNA *prop, PointerRNA *ptr, co
void rna_iterator_listbase_begin(CollectionPropertyIterator *iter, ListBase *lb)
{
- iter->internal= lb->first;
- iter->valid= (iter->internal != NULL);
+ ListBaseIterator *internal;
+
+ internal= MEM_callocN(sizeof(ListBaseIterator), "ListBaseIterator");
+ internal->link= lb->first;
+
+ iter->internal= internal;
+ iter->valid= (internal->link != NULL);
}
void rna_iterator_listbase_next(CollectionPropertyIterator *iter)
{
- iter->internal= ((Link*)iter->internal)->next;
- iter->valid= (iter->internal != NULL);
+ ListBaseIterator *internal= iter->internal;
+
+ internal->link= internal->link->next;
+ iter->valid= (internal->link != NULL);
}
void *rna_iterator_listbase_get(CollectionPropertyIterator *iter)
{
- return iter->internal;
+ ListBaseIterator *internal= iter->internal;
+
+ return internal->link;
+}
+
+void rna_iterator_listbase_end(CollectionPropertyIterator *iter)
+{
+ MEM_freeN(iter->internal);
}
void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int itemsize, int length)
@@ -694,7 +886,7 @@ int RNA_path_resolve(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, Prope
/* now look up the value of this property if it is a pointer or
* collection, otherwise return the property rna so that the
* caller can read the value of the property itself */
- if(prop->type == PROP_POINTER) {
+ if(RNA_property_type(prop, &curptr) == PROP_POINTER) {
RNA_property_pointer_get(prop, &curptr, &nextptr);
if(nextptr.data)
@@ -702,7 +894,7 @@ int RNA_path_resolve(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, Prope
else
return 0;
}
- else if(prop->type == PROP_COLLECTION && *path) {
+ else if(RNA_property_type(prop, &curptr) == PROP_COLLECTION && *path) {
/* resolve the lookup with [] brackets */
token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 1);
@@ -739,7 +931,7 @@ int RNA_path_resolve(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, Prope
return 1;
}
-char *RNA_path_append(const char *path, PropertyRNA *prop, int intkey, const char *strkey)
+char *RNA_path_append(const char *path, PointerRNA *ptr, PropertyRNA *prop, int intkey, const char *strkey)
{
DynStr *dynstr;
const char *s;
@@ -754,9 +946,9 @@ char *RNA_path_append(const char *path, PropertyRNA *prop, int intkey, const cha
BLI_dynstr_append(dynstr, ".");
}
- BLI_dynstr_append(dynstr, (char*)prop->identifier);
+ BLI_dynstr_append(dynstr, (char*)RNA_property_identifier(prop, ptr));
- if(prop->type == PROP_COLLECTION) {
+ if(RNA_property_type(prop, ptr) == PROP_COLLECTION) {
/* add ["strkey"] or [intkey] */
BLI_dynstr_append(dynstr, "[");
diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c
index 9da72701523..d3ce97d2abe 100644
--- a/source/blender/makesrna/intern/rna_define.c
+++ b/source/blender/makesrna/intern/rna_define.c
@@ -316,6 +316,7 @@ PropertyRNA *RNA_def_property(StructRNA *srna, const char *identifier, int type,
dp->srna= srna;
dp->prop= prop;
+ prop->magic= RNA_MAGIC;
prop->identifier= identifier;
prop->type= type;
prop->subtype= subtype;
@@ -802,6 +803,7 @@ void RNA_def_property_collection_sdna(PropertyRNA *prop, const char *structname,
if(strcmp(dp->dnatype, "ListBase") == 0) {
cprop->next= (PropCollectionNextFunc)"rna_iterator_listbase_next";
cprop->get= (PropCollectionGetFunc)"rna_iterator_listbase_get";
+ cprop->end= (PropCollectionEndFunc)"rna_iterator_listbase_end";
}
}
diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h
index 90d2fdd88f9..3ed9ac841a7 100644
--- a/source/blender/makesrna/intern/rna_internal.h
+++ b/source/blender/makesrna/intern/rna_internal.h
@@ -25,10 +25,12 @@
#ifndef RNA_INTERNAL_H
#define RNA_INTERNAL_H
-struct StructRNA;
-struct PropertyRNA;
+#include "rna_internal_types.h"
+
+#define RNA_MAGIC ((int)~0)
+
+struct IDProperty;
struct SDNA;
-struct ListBase;
/* Data structures used during define */
@@ -73,6 +75,15 @@ extern BlenderDefRNA DefRNA;
/* Define functions for all types */
+extern StringPropertyRNA rna_IDProperty_string;
+extern IntPropertyRNA rna_IDProperty_int;
+extern IntPropertyRNA rna_IDProperty_intarray;
+extern FloatPropertyRNA rna_IDProperty_float;
+extern FloatPropertyRNA rna_IDProperty_floatarray;
+extern PointerPropertyRNA rna_IDProperty_group;
+extern FloatPropertyRNA rna_IDProperty_double;
+extern FloatPropertyRNA rna_IDProperty_doublearray;
+
extern StructRNA RNA_Main;
extern StructRNA RNA_Mesh;
extern StructRNA RNA_Object;
@@ -80,6 +91,7 @@ extern StructRNA RNA_Scene;
extern StructRNA RNA_Struct;
void RNA_def_ID(struct StructRNA *srna);
+void RNA_def_ID_types(struct BlenderRNA *brna);
void RNA_def_main(struct BlenderRNA *brna);
void RNA_def_mesh(struct BlenderRNA *brna);
@@ -87,13 +99,21 @@ void RNA_def_object(struct BlenderRNA *brna);
void RNA_def_rna(struct BlenderRNA *brna);
void RNA_def_scene(struct BlenderRNA *brna);
+/* Internal Functions */
+
void rna_def_builtin_properties(struct StructRNA *srna);
-/* Standard iterator functions */
+struct IDProperty *rna_idproperty_check(struct PropertyRNA **prop, struct PointerRNA *ptr);
+
+typedef struct ListBaseIterator {
+ Link *link;
+ int flag;
+} ListBaseIterator;
void rna_iterator_listbase_begin(struct CollectionPropertyIterator *iter, struct ListBase *lb);
void rna_iterator_listbase_next(struct CollectionPropertyIterator *iter);
void *rna_iterator_listbase_get(struct CollectionPropertyIterator *iter);
+void rna_iterator_listbase_end(struct CollectionPropertyIterator *iter);
typedef struct ArrayIterator {
char *ptr;
diff --git a/source/blender/makesrna/intern/rna_internal_types.h b/source/blender/makesrna/intern/rna_internal_types.h
new file mode 100644
index 00000000000..6deaba547e6
--- /dev/null
+++ b/source/blender/makesrna/intern/rna_internal_types.h
@@ -0,0 +1,225 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributor(s): Blender Foundation (2008).
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef RNA_INTERNAL_TYPES
+#define RNA_INTERNAL_TYPES
+
+#include "DNA_listBase.h"
+
+struct BlenderRNA;
+struct StructRNA;
+struct PropertyRNA;
+struct PointerRNA;
+struct CollectionPropertyIterator;
+struct bContext;
+
+/* Function Callbacks */
+
+typedef void (*PropNotifyFunc)(struct bContext *C, struct PointerRNA *ptr);
+typedef int (*PropBooleanGetFunc)(struct PointerRNA *ptr);
+typedef void (*PropBooleanSetFunc)(struct PointerRNA *ptr, int value);
+typedef int (*PropBooleanArrayGetFunc)(struct PointerRNA *ptr, int index);
+typedef void (*PropBooleanArraySetFunc)(struct PointerRNA *ptr, int index, int value);
+typedef int (*PropIntGetFunc)(struct PointerRNA *ptr);
+typedef void (*PropIntSetFunc)(struct PointerRNA *ptr, int value);
+typedef int (*PropIntArrayGetFunc)(struct PointerRNA *ptr, int index);
+typedef void (*PropIntArraySetFunc)(struct PointerRNA *ptr, int index, int value);
+typedef float (*PropFloatGetFunc)(struct PointerRNA *ptr);
+typedef void (*PropFloatSetFunc)(struct PointerRNA *ptr, float value);
+typedef float (*PropFloatArrayGetFunc)(struct PointerRNA *ptr, int index);
+typedef void (*PropFloatArraySetFunc)(struct PointerRNA *ptr, int index, float value);
+typedef void (*PropStringGetFunc)(struct PointerRNA *ptr, char *value);
+typedef int (*PropStringLengthFunc)(struct PointerRNA *ptr);
+typedef void (*PropStringSetFunc)(struct PointerRNA *ptr, const char *value);
+typedef int (*PropEnumGetFunc)(struct PointerRNA *ptr);
+typedef void (*PropEnumSetFunc)(struct PointerRNA *ptr, int value);
+typedef void* (*PropPointerGetFunc)(struct PointerRNA *ptr);
+typedef void (*PropPointerSetFunc)(struct PointerRNA *ptr, void *value);
+typedef struct StructRNA* (*PropPointerTypeFunc)(struct PointerRNA *ptr);
+typedef void (*PropCollectionBeginFunc)(struct CollectionPropertyIterator *iter, struct PointerRNA *ptr);
+typedef void (*PropCollectionNextFunc)(struct CollectionPropertyIterator *iter);
+typedef void (*PropCollectionEndFunc)(struct CollectionPropertyIterator *iter);
+typedef void* (*PropCollectionGetFunc)(struct CollectionPropertyIterator *iter);
+typedef struct StructRNA* (*PropCollectionTypeFunc)(struct CollectionPropertyIterator *iter);
+typedef int (*PropCollectionLengthFunc)(struct PointerRNA *ptr);
+typedef void* (*PropCollectionLookupIntFunc)(struct PointerRNA *ptr, int key, struct StructRNA **type);
+typedef void* (*PropCollectionLookupStringFunc)(struct PointerRNA *ptr, const char *key, struct StructRNA **type);
+
+struct PropertyRNA {
+ struct PropertyRNA *next, *prev;
+
+ /* magic bytes to distinguish with IDProperty */
+ int magic;
+
+ /* unique identifier */
+ const char *identifier;
+ /* various options */
+ int flag;
+
+ /* user readable name */
+ const char *name;
+ /* single line description, displayed in the tooltip for example */
+ const char *description;
+
+ /* property type as it appears to the outside */
+ PropertyType type;
+ /* subtype, 'interpretation' of the property */
+ PropertySubType subtype;
+ /* if an array this is > 0, specifying the length */
+ unsigned int arraylength;
+
+ /* callback for notifys on change */
+ PropNotifyFunc notify;
+};
+
+/* Property Types */
+
+typedef struct BooleanPropertyRNA {
+ PropertyRNA property;
+
+ PropBooleanGetFunc get;
+ PropBooleanSetFunc set;
+
+ PropBooleanArrayGetFunc getarray;
+ PropBooleanArraySetFunc setarray;
+
+ int defaultvalue;
+ const int *defaultarray;
+} BooleanPropertyRNA;
+
+typedef struct IntPropertyRNA {
+ PropertyRNA property;
+
+ PropIntGetFunc get;
+ PropIntSetFunc set;
+
+ PropIntArrayGetFunc getarray;
+ PropIntArraySetFunc setarray;
+
+ int softmin, softmax;
+ int hardmin, hardmax;
+ int step;
+
+ int defaultvalue;
+ const int *defaultarray;
+} IntPropertyRNA;
+
+typedef struct FloatPropertyRNA {
+ PropertyRNA property;
+
+ PropFloatGetFunc get;
+ PropFloatSetFunc set;
+
+ PropFloatArrayGetFunc getarray;
+ PropFloatArraySetFunc setarray;
+
+ float softmin, softmax;
+ float hardmin, hardmax;
+ float step;
+ int precision;
+
+ float defaultvalue;
+ const float *defaultarray;
+} FloatPropertyRNA;
+
+typedef struct StringPropertyRNA {
+ PropertyRNA property;
+
+ PropStringGetFunc get;
+ PropStringLengthFunc length;
+ PropStringSetFunc set;
+
+ int maxlength; /* includes string terminator! */
+
+ const char *defaultvalue;
+} StringPropertyRNA;
+
+typedef struct EnumPropertyRNA {
+ PropertyRNA property;
+
+ PropEnumGetFunc get;
+ PropEnumSetFunc set;
+
+ const EnumPropertyItem *item;
+ int totitem;
+
+ int defaultvalue;
+} EnumPropertyRNA;
+
+typedef struct PointerPropertyRNA {
+ PropertyRNA property;
+
+ PropPointerGetFunc get;
+ PropPointerSetFunc set;
+ PropPointerTypeFunc type; /* optional */
+
+ struct StructRNA *structtype;
+} PointerPropertyRNA;
+
+typedef struct CollectionPropertyRNA {
+ PropertyRNA property;
+
+ PropCollectionBeginFunc begin;
+ PropCollectionNextFunc next;
+ PropCollectionEndFunc end; /* optional */
+ PropCollectionGetFunc get;
+ PropCollectionTypeFunc type; /* optional */
+ PropCollectionLengthFunc length; /* optional */
+ PropCollectionLookupIntFunc lookupint; /* optional */
+ PropCollectionLookupStringFunc lookupstring; /* optional */
+
+ struct StructRNA *structtype;
+} CollectionPropertyRNA;
+
+struct StructRNA {
+ struct StructRNA *next, *prev;
+
+ /* unique identifier */
+ const char *identifier;
+ /* various options */
+ int flag;
+
+ /* user readable name */
+ const char *name;
+
+ /* property that defines the name */
+ PropertyRNA *nameproperty;
+
+ /* property to iterate over properties */
+ PropertyRNA *iteratorproperty;
+
+ /* properties of this struct */
+ ListBase properties;
+};
+
+/* Blender RNA
+ *
+ * Root RNA data structure that lists all struct types. */
+
+struct BlenderRNA {
+ ListBase structs;
+};
+
+#endif /* RNA_INTERNAL_TYPES */
+
diff --git a/source/blender/makesrna/intern/rna_main.c b/source/blender/makesrna/intern/rna_main.c
index 8f771eb4ea4..622e727b2c6 100644
--- a/source/blender/makesrna/intern/rna_main.c
+++ b/source/blender/makesrna/intern/rna_main.c
@@ -244,7 +244,7 @@ void RNA_def_main(BlenderRNA *brna)
{
prop= RNA_def_property(srna, lists[i][0], PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, lists[i][1]);
- RNA_def_property_collection_funcs(prop, lists[i][2], "rna_iterator_listbase_next", 0, "rna_iterator_listbase_get", 0, 0, 0, 0);
+ RNA_def_property_collection_funcs(prop, lists[i][2], "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0, 0);
RNA_def_property_ui_text(prop, lists[i][3], lists[i][4]);
}
}
diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c
index 9c38bf139a2..aa39dbed531 100644
--- a/source/blender/makesrna/intern/rna_rna.c
+++ b/source/blender/makesrna/intern/rna_rna.c
@@ -59,27 +59,69 @@ static void *rna_Struct_name_property_get(PointerRNA *ptr)
static void rna_Struct_properties_next(CollectionPropertyIterator *iter)
{
- do {
+ ListBaseIterator *internal= iter->internal;
+ ID *id;
+ StructRNA *type;
+ IDProperty *group;
+
+ if(internal->flag) {
+ /* id properties */
rna_iterator_listbase_next(iter);
- } while(iter->valid && (((PropertyRNA*)iter->internal)->flag & PROP_BUILTIN));
+ }
+ else {
+ /* regular properties */
+ do {
+ rna_iterator_listbase_next(iter);
+ } while(iter->valid && (((PropertyRNA*)internal->link)->flag & PROP_BUILTIN));
+
+ /* try id properties */
+ if(!iter->valid) {
+ type= iter->parent.id.type;
+ id= iter->parent.id.data;
+
+ if(iter->parent.type == &RNA_IDPropertyGroup)
+ group= iter->parent.data;
+ else if(iter->parent.data == id && type && (type->flag & STRUCT_ID))
+ group= IDP_GetProperties(id, 0);
+ else
+ group= NULL;
+
+ if(group) {
+ rna_iterator_listbase_end(iter);
+ rna_iterator_listbase_begin(iter, &group->data.group);
+ internal= iter->internal;
+ internal->flag= 1;
+ }
+ }
+ }
}
static void rna_Struct_properties_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
+ ListBaseIterator *internal;
+
rna_iterator_listbase_begin(iter, &((StructRNA*)ptr->data)->properties);
- if(iter->valid && (((PropertyRNA*)iter->internal)->flag & PROP_BUILTIN))
+ internal= iter->internal;
+ if(iter->valid && (((PropertyRNA*)internal->link)->flag & PROP_BUILTIN))
rna_Struct_properties_next(iter);
}
static void *rna_Struct_properties_get(CollectionPropertyIterator *iter)
{
- return rna_iterator_listbase_get(iter);
+ ListBaseIterator *internal= iter->internal;
+
+ /* we return either PropertyRNA* or IDProperty*, the rna_access.c
+ * functions can handle both as PropertyRNA* with some tricks */
+ return internal->link;
}
static StructRNA *rna_Struct_properties_type(CollectionPropertyIterator *iter)
{
- PropertyRNA *prop= iter->internal;
+ ListBaseIterator *internal= iter->internal;
+ PropertyRNA *prop= (PropertyRNA*)internal->link;
+
+ rna_idproperty_check(&prop, NULL);
switch(prop->type) {
case PROP_BOOLEAN: return &RNA_BooleanProperty;
@@ -137,112 +179,159 @@ static void *rna_builtin_type_get(PointerRNA *ptr)
static void rna_Property_identifier_get(PointerRNA *ptr, char *value)
{
- strcpy(value, ((PropertyRNA*)ptr->data)->identifier);
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ strcpy(value, ((PropertyRNA*)prop)->identifier);
}
static int rna_Property_identifier_length(PointerRNA *ptr)
{
- return strlen(((PropertyRNA*)ptr->data)->identifier);
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return strlen(prop->identifier);
}
static void rna_Property_name_get(PointerRNA *ptr, char *value)
{
- strcpy(value, ((PropertyRNA*)ptr->data)->name);
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ strcpy(value, prop->name);
}
static int rna_Property_name_length(PointerRNA *ptr)
{
- return strlen(((PropertyRNA*)ptr->data)->name);
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return strlen(prop->name);
}
static void rna_Property_description_get(PointerRNA *ptr, char *value)
{
- strcpy(value, ((PropertyRNA*)ptr->data)->description);
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ strcpy(value, prop->description);
}
static int rna_Property_description_length(PointerRNA *ptr)
{
- return strlen(((PropertyRNA*)ptr->data)->description);
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return strlen(prop->description);
}
static int rna_Property_type_get(PointerRNA *ptr)
{
- return ((PropertyRNA*)ptr->data)->type;
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return prop->type;
}
static int rna_Property_subtype_get(PointerRNA *ptr)
{
- return ((PropertyRNA*)ptr->data)->subtype;
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return prop->subtype;
}
static int rna_Property_array_length_get(PointerRNA *ptr)
{
- return ((PropertyRNA*)ptr->data)->arraylength;
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return prop->arraylength;
}
static int rna_IntProperty_hard_min_get(PointerRNA *ptr)
{
- return ((IntPropertyRNA*)ptr->data)->hardmin;
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return ((IntPropertyRNA*)prop)->hardmin;
}
static int rna_IntProperty_hard_max_get(PointerRNA *ptr)
{
- return ((IntPropertyRNA*)ptr->data)->hardmax;
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return ((IntPropertyRNA*)prop)->hardmax;
}
static int rna_IntProperty_soft_min_get(PointerRNA *ptr)
{
- return ((IntPropertyRNA*)ptr->data)->softmin;
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return ((IntPropertyRNA*)prop)->softmin;
}
static int rna_IntProperty_soft_max_get(PointerRNA *ptr)
{
- return ((IntPropertyRNA*)ptr->data)->softmax;
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return ((IntPropertyRNA*)prop)->softmax;
}
static int rna_IntProperty_step_get(PointerRNA *ptr)
{
- return ((IntPropertyRNA*)ptr->data)->step;
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return ((IntPropertyRNA*)prop)->step;
}
static float rna_FloatProperty_hard_min_get(PointerRNA *ptr)
{
- return ((FloatPropertyRNA*)ptr->data)->hardmin;
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return ((FloatPropertyRNA*)prop)->hardmin;
}
static float rna_FloatProperty_hard_max_get(PointerRNA *ptr)
{
- return ((FloatPropertyRNA*)ptr->data)->hardmax;
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return ((FloatPropertyRNA*)prop)->hardmax;
}
static float rna_FloatProperty_soft_min_get(PointerRNA *ptr)
{
- return ((FloatPropertyRNA*)ptr->data)->softmin;
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return ((FloatPropertyRNA*)prop)->softmin;
}
static float rna_FloatProperty_soft_max_get(PointerRNA *ptr)
{
- return ((FloatPropertyRNA*)ptr->data)->softmax;
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return ((FloatPropertyRNA*)prop)->softmax;
}
static float rna_FloatProperty_step_get(PointerRNA *ptr)
{
- return ((FloatPropertyRNA*)ptr->data)->step;
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return ((FloatPropertyRNA*)prop)->step;
}
static int rna_FloatProperty_precision_get(PointerRNA *ptr)
{
- return ((FloatPropertyRNA*)ptr->data)->precision;
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return ((FloatPropertyRNA*)prop)->precision;
}
static int rna_StringProperty_max_length_get(PointerRNA *ptr)
{
- return ((StringPropertyRNA*)ptr->data)->maxlength;
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return ((StringPropertyRNA*)prop)->maxlength;
}
static void rna_EnumProperty_items_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
- EnumPropertyRNA *eprop= (EnumPropertyRNA*)ptr->data;
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ EnumPropertyRNA *eprop;
+
+ rna_idproperty_check(&prop, NULL);
+ eprop= (EnumPropertyRNA*)prop;
+
rna_iterator_array_begin(iter, (void*)eprop->item, sizeof(eprop->item[0]), eprop->totitem);
}
@@ -273,12 +362,16 @@ static int rna_EnumPropertyItem_value_get(PointerRNA *ptr)
static void *rna_PointerProperty_fixed_type_get(PointerRNA *ptr)
{
- return ((PointerPropertyRNA*)ptr->data)->structtype;
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return ((PointerPropertyRNA*)prop)->structtype;
}
static void *rna_CollectionProperty_fixed_type_get(PointerRNA *ptr)
{
- return ((CollectionPropertyRNA*)ptr->data)->structtype;
+ PropertyRNA *prop= (PropertyRNA*)ptr->data;
+ rna_idproperty_check(&prop, NULL);
+ return ((CollectionPropertyRNA*)prop)->structtype;
}
#else
@@ -454,7 +547,7 @@ void RNA_def_rna(BlenderRNA *brna)
prop= RNA_def_property(srna, "properties", PROP_COLLECTION, PROP_NONE);
RNA_def_property_flag(prop, PROP_NOT_EDITABLE);
- RNA_def_property_collection_funcs(prop, "rna_Struct_properties_begin", "rna_Struct_properties_next", 0, "rna_Struct_properties_get", "rna_Struct_properties_type", 0, 0, 0);
+ RNA_def_property_collection_funcs(prop, "rna_Struct_properties_begin", "rna_Struct_properties_next", "rna_iterator_listbase_end", "rna_Struct_properties_get", "rna_Struct_properties_type", 0, 0, 0);
RNA_def_property_ui_text(prop, "Properties", "Properties in the struct.");
/* BooleanProperty */
@@ -502,8 +595,8 @@ void rna_def_builtin_properties(StructRNA *srna)
PropertyRNA *prop;
prop= RNA_def_property(srna, "rna_properties", PROP_COLLECTION, PROP_NONE);
- RNA_def_property_flag(prop, PROP_NOT_EDITABLE|PROP_BUILTIN);
- RNA_def_property_collection_funcs(prop, "rna_builtin_properties_begin", "rna_builtin_properties_next", 0, "rna_builtin_properties_get", "rna_builtin_properties_type", 0, 0, 0);
+ RNA_def_property_flag(prop, PROP_BUILTIN);
+ RNA_def_property_collection_funcs(prop, "rna_builtin_properties_begin", "rna_builtin_properties_next", "rna_iterator_listbase_end", "rna_builtin_properties_get", "rna_builtin_properties_type", 0, 0, 0);
RNA_def_property_ui_text(prop, "Properties", "RNA property collection.");
prop= RNA_def_property(srna, "rna_type", PROP_POINTER, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 5e6743e56ff..217a32ecd84 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -37,8 +37,10 @@
void *rna_Scene_objects_get(CollectionPropertyIterator *iter)
{
+ ListBaseIterator *internal= iter->internal;
+
/* we are actually iterating a Base list, so override get */
- return ((Base*)iter->internal)->object;
+ return ((Base*)internal->link)->object;
}
static void rna_Scene_layer_set(PointerRNA *ptr, int index, int value)