4 * ***** BEGIN GPL LICENSE BLOCK *****
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 * Contributor(s): Blender Foundation (2008).
22 * ***** END GPL LICENSE BLOCK *****
28 #include "MEM_guardedalloc.h"
31 #include "DNA_windowmanager_types.h"
33 #include "BLI_blenlib.h"
34 #include "BLI_dynstr.h"
35 #include "BLI_ghash.h"
37 #include "BKE_context.h"
38 #include "BKE_idprop.h"
39 #include "BKE_report.h"
40 #include "BKE_utildefines.h"
44 #include "RNA_access.h"
45 #include "RNA_define.h"
46 #include "RNA_types.h"
48 #include "rna_internal.h"
57 for(srna=BLENDER_RNA.structs.first; srna; srna=srna->cont.next) {
58 if(!srna->cont.prophash) {
59 srna->cont.prophash= BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp);
61 for(prop=srna->cont.properties.first; prop; prop=prop->next)
62 if(!(prop->flag & PROP_BUILTIN))
63 BLI_ghash_insert(srna->cont.prophash, (void*)prop->identifier, prop);
72 for(srna=BLENDER_RNA.structs.first; srna; srna=srna->cont.next) {
73 if(srna->cont.prophash) {
74 BLI_ghash_free(srna->cont.prophash, NULL, NULL);
75 srna->cont.prophash= NULL;
79 RNA_free(&BLENDER_RNA);
84 PointerRNA PointerRNA_NULL = {{0}, 0, 0};
86 void RNA_main_pointer_create(struct Main *main, PointerRNA *r_ptr)
89 r_ptr->type= &RNA_Main;
93 void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr)
96 StructRNA *type, *idtype= NULL;
99 memset(&tmp, 0, sizeof(tmp));
101 idtype= rna_ID_refine(&tmp);
103 while(idtype->refine) {
104 type= idtype->refine(&tmp);
118 void RNA_pointer_create(ID *id, StructRNA *type, void *data, PointerRNA *r_ptr)
121 StructRNA *idtype= NULL;
124 memset(&tmp, 0, sizeof(tmp));
126 idtype= rna_ID_refine(&tmp);
134 while(r_ptr->type && r_ptr->type->refine) {
135 StructRNA *rtype= r_ptr->type->refine(r_ptr);
137 if(rtype == r_ptr->type)
145 static void rna_pointer_inherit_id(StructRNA *type, PointerRNA *parent, PointerRNA *ptr)
147 if(type && type->flag & STRUCT_ID) {
148 ptr->id.data= ptr->data;
151 ptr->id.data= parent->id.data;
155 void RNA_blender_rna_pointer_create(PointerRNA *r_ptr)
157 r_ptr->id.data= NULL;
158 r_ptr->type= &RNA_BlenderRNA;
159 r_ptr->data= &BLENDER_RNA;
162 PointerRNA rna_pointer_inherit_refine(PointerRNA *ptr, StructRNA *type, void *data)
169 rna_pointer_inherit_id(type, ptr, &result);
171 while(result.type->refine) {
172 type= result.type->refine(&result);
174 if(type == result.type)
181 memset(&result, 0, sizeof(result));
188 IDProperty *RNA_struct_idproperties(PointerRNA *ptr, int create)
190 StructRNA *type= ptr->type;
192 if(type && type->idproperties)
193 return type->idproperties(ptr, create);
198 static IDProperty *rna_idproperty_find(PointerRNA *ptr, const char *name)
200 IDProperty *group= RNA_struct_idproperties(ptr, 0);
204 for(idprop=group->data.group.first; idprop; idprop=idprop->next)
205 if(strcmp(idprop->name, name) == 0)
212 static int rna_idproperty_verify_valid(PropertyRNA *prop, IDProperty *idprop)
214 /* this verifies if the idproperty actually matches the property
215 * description and otherwise removes it. this is to ensure that
216 * rna property access is type safe, e.g. if you defined the rna
217 * to have a certain array length you can count on that staying so */
219 switch(idprop->type) {
221 if(prop->type != PROP_COLLECTION)
225 if(prop->arraylength != idprop->len)
228 if(idprop->subtype == IDP_FLOAT && prop->type != PROP_FLOAT)
230 if(idprop->subtype == IDP_INT && !ELEM3(prop->type, PROP_BOOLEAN, PROP_INT, PROP_ENUM))
235 if(!ELEM3(prop->type, PROP_BOOLEAN, PROP_INT, PROP_ENUM))
240 if(prop->type != PROP_FLOAT)
244 if(prop->type != PROP_STRING)
248 if(prop->type != PROP_POINTER)
258 static PropertyRNA *typemap[IDP_NUMTYPES] =
259 {(PropertyRNA*)&rna_IDProperty_string,
260 (PropertyRNA*)&rna_IDProperty_int,
261 (PropertyRNA*)&rna_IDProperty_float,
263 (PropertyRNA*)&rna_IDProperty_group, NULL,
264 (PropertyRNA*)&rna_IDProperty_double};
266 static PropertyRNA *arraytypemap[IDP_NUMTYPES] =
267 {NULL, (PropertyRNA*)&rna_IDProperty_int_array,
268 (PropertyRNA*)&rna_IDProperty_float_array,
270 (PropertyRNA*)&rna_IDProperty_collection, NULL,
271 (PropertyRNA*)&rna_IDProperty_double_array};
273 IDProperty *rna_idproperty_check(PropertyRNA **prop, PointerRNA *ptr)
275 /* This is quite a hack, but avoids some complexity in the API. we
276 * pass IDProperty structs as PropertyRNA pointers to the outside.
277 * We store some bytes in PropertyRNA structs that allows us to
278 * distinguish it from IDProperty structs. If it is an ID property,
279 * we look up an IDP PropertyRNA based on the type, and set the data
280 * pointer to the IDProperty. */
282 if((*prop)->magic == RNA_MAGIC) {
283 if((*prop)->flag & PROP_IDPROPERTY) {
284 IDProperty *idprop= rna_idproperty_find(ptr, (*prop)->identifier);
286 if(idprop && !rna_idproperty_verify_valid(*prop, idprop)) {
287 IDProperty *group= RNA_struct_idproperties(ptr, 0);
289 IDP_RemFromGroup(group, idprop);
290 IDP_FreeProperty(idprop);
302 IDProperty *idprop= (IDProperty*)(*prop);
304 if(idprop->type == IDP_ARRAY)
305 *prop= arraytypemap[(int)(idprop->subtype)];
307 *prop= typemap[(int)(idprop->type)];
313 PropertyRNA *rna_ensure_property(PropertyRNA *prop)
315 /* the quick version if we don't need the idproperty */
317 if(prop->magic == RNA_MAGIC)
321 IDProperty *idprop= (IDProperty*)prop;
323 if(idprop->type == IDP_ARRAY)
324 return arraytypemap[(int)(idprop->subtype)];
326 return typemap[(int)(idprop->type)];
330 const char *rna_ensure_property_identifier(PropertyRNA *prop)
332 if(prop->magic == RNA_MAGIC)
333 return prop->identifier;
335 return ((IDProperty*)prop)->name;
338 const char *rna_ensure_property_name(PropertyRNA *prop)
340 if(prop->magic == RNA_MAGIC)
343 return ((IDProperty*)prop)->name;
346 int rna_ensure_property_array_length(PropertyRNA *prop)
348 if(prop->magic == RNA_MAGIC)
349 return prop->arraylength;
351 IDProperty *idprop= (IDProperty*)prop;
353 if(idprop->type == IDP_ARRAY)
362 const char *RNA_struct_identifier(StructRNA *type)
364 return type->identifier;
367 const char *RNA_struct_ui_name(StructRNA *type)
372 int RNA_struct_ui_icon(StructRNA *type)
380 const char *RNA_struct_ui_description(StructRNA *type)
382 return type->description;
385 PropertyRNA *RNA_struct_name_property(StructRNA *type)
387 return type->nameproperty;
390 PropertyRNA *RNA_struct_iterator_property(StructRNA *type)
392 return type->iteratorproperty;
395 StructRNA *RNA_struct_base(StructRNA *type)
400 int RNA_struct_is_ID(StructRNA *type)
402 return (type->flag & STRUCT_ID) != 0;
405 int RNA_struct_is_a(StructRNA *type, StructRNA *srna)
412 /* ptr->type is always maximally refined */
413 for(base=type; base; base=base->base)
420 PropertyRNA *RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
422 PropertyRNA *iterprop= RNA_struct_iterator_property(ptr->type);
425 if(RNA_property_collection_lookup_string(ptr, iterprop, identifier, &propptr))
431 /* Find the property which uses the given nested struct */
432 PropertyRNA *RNA_struct_find_nested(PointerRNA *ptr, StructRNA *srna)
434 PropertyRNA *prop= NULL;
436 RNA_STRUCT_BEGIN(ptr, iprop) {
437 /* This assumes that there can only be one user of this nested struct */
438 if (RNA_property_pointer_type(ptr, iprop) == srna) {
448 const struct ListBase *RNA_struct_defined_properties(StructRNA *srna)
450 return &srna->cont.properties;
453 FunctionRNA *RNA_struct_find_function(PointerRNA *ptr, const char *identifier)
456 PropertyRNA *iterprop;
459 RNA_pointer_create(NULL, &RNA_Struct, ptr->type, &tptr);
460 iterprop= RNA_struct_find_property(&tptr, "functions");
464 RNA_PROP_BEGIN(&tptr, funcptr, iterprop) {
465 if(strcmp(identifier, RNA_function_identifier(funcptr.data)) == 0) {
475 const struct ListBase *RNA_struct_defined_functions(StructRNA *srna)
477 return &srna->functions;
480 StructRegisterFunc RNA_struct_register(StructRNA *type)
485 StructUnregisterFunc RNA_struct_unregister(StructRNA *type)
490 } while((type=type->base));
495 void *RNA_struct_py_type_get(StructRNA *srna)
497 return srna->py_type;
500 void RNA_struct_py_type_set(StructRNA *srna, void *py_type)
502 srna->py_type= py_type;
505 void *RNA_struct_blender_type_get(StructRNA *srna)
507 return srna->blender_type;
510 void RNA_struct_blender_type_set(StructRNA *srna, void *blender_type)
512 srna->blender_type= blender_type;
515 char *RNA_struct_name_get_alloc(PointerRNA *ptr, char *fixedbuf, int fixedlen)
517 PropertyRNA *nameprop;
519 if(ptr->data && (nameprop = RNA_struct_name_property(ptr->type)))
520 return RNA_property_string_get_alloc(ptr, nameprop, fixedbuf, fixedlen);
525 /* Property Information */
527 const char *RNA_property_identifier(PropertyRNA *prop)
529 return rna_ensure_property_identifier(prop);
532 PropertyType RNA_property_type(PropertyRNA *prop)
534 return rna_ensure_property(prop)->type;
537 PropertySubType RNA_property_subtype(PropertyRNA *prop)
539 return rna_ensure_property(prop)->subtype;
542 int RNA_property_flag(PropertyRNA *prop)
544 return rna_ensure_property(prop)->flag;
547 int RNA_property_array_length(PropertyRNA *prop)
549 return rna_ensure_property_array_length(prop);
552 void RNA_property_int_range(PointerRNA *ptr, PropertyRNA *prop, int *hardmin, int *hardmax)
554 IntPropertyRNA *iprop= (IntPropertyRNA*)rna_ensure_property(prop);
557 iprop->range(ptr, hardmin, hardmax);
560 *hardmin= iprop->hardmin;
561 *hardmax= iprop->hardmax;
565 void RNA_property_int_ui_range(PointerRNA *ptr, PropertyRNA *prop, int *softmin, int *softmax, int *step)
567 IntPropertyRNA *iprop= (IntPropertyRNA*)rna_ensure_property(prop);
568 int hardmin, hardmax;
571 iprop->range(ptr, &hardmin, &hardmax);
572 *softmin= MAX2(iprop->softmin, hardmin);
573 *softmax= MIN2(iprop->softmax, hardmax);
576 *softmin= iprop->softmin;
577 *softmax= iprop->softmax;
583 void RNA_property_float_range(PointerRNA *ptr, PropertyRNA *prop, float *hardmin, float *hardmax)
585 FloatPropertyRNA *fprop= (FloatPropertyRNA*)rna_ensure_property(prop);
588 fprop->range(ptr, hardmin, hardmax);
591 *hardmin= fprop->hardmin;
592 *hardmax= fprop->hardmax;
596 void RNA_property_float_ui_range(PointerRNA *ptr, PropertyRNA *prop, float *softmin, float *softmax, float *step, float *precision)
598 FloatPropertyRNA *fprop= (FloatPropertyRNA*)rna_ensure_property(prop);
599 float hardmin, hardmax;
602 fprop->range(ptr, &hardmin, &hardmax);
603 *softmin= MAX2(fprop->softmin, hardmin);
604 *softmax= MIN2(fprop->softmax, hardmax);
607 *softmin= fprop->softmin;
608 *softmax= fprop->softmax;
612 *precision= (float)fprop->precision;
615 int RNA_property_string_maxlength(PropertyRNA *prop)
617 StringPropertyRNA *sprop= (StringPropertyRNA*)rna_ensure_property(prop);
618 return sprop->maxlength;
621 StructRNA *RNA_property_pointer_type(PointerRNA *ptr, PropertyRNA *prop)
623 prop= rna_ensure_property(prop);
625 if(prop->type == PROP_POINTER) {
626 PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
629 return pprop->typef(ptr);
633 else if(prop->type == PROP_COLLECTION) {
634 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
640 return &RNA_UnknownType;
643 void RNA_property_enum_items(bContext *C, PointerRNA *ptr, PropertyRNA *prop, EnumPropertyItem **item, int *totitem, int *free)
645 EnumPropertyRNA *eprop= (EnumPropertyRNA*)rna_ensure_property(prop);
651 *item= eprop->itemf(C, ptr, free);
655 for( ; (*item)[tot].identifier; tot++);
664 *totitem= eprop->totitem;
668 int RNA_property_enum_value(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const char *identifier, int *value)
670 EnumPropertyItem *item;
673 RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
675 for(; item->identifier; item++) {
676 if(item->identifier[0] && strcmp(item->identifier, identifier)==0) {
677 *value = item->value;
688 int RNA_enum_identifier(EnumPropertyItem *item, const int value, const char **identifier)
690 for (; item->identifier; item++) {
691 if(item->identifier[0] && item->value==value) {
692 *identifier = item->identifier;
699 int RNA_enum_name(EnumPropertyItem *item, const int value, const char **name)
701 for (; item->identifier; item++) {
702 if(item->identifier[0] && item->value==value) {
710 int RNA_property_enum_identifier(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier)
712 EnumPropertyItem *item= NULL;
715 RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
717 result= RNA_enum_identifier(item, value, identifier);
726 const char *RNA_property_ui_name(PropertyRNA *prop)
728 return rna_ensure_property_name(prop);
731 const char *RNA_property_ui_description(PropertyRNA *prop)
733 return rna_ensure_property(prop)->description;
736 int RNA_property_ui_icon(PropertyRNA *prop)
738 return rna_ensure_property(prop)->icon;
741 int RNA_property_editable(PointerRNA *ptr, PropertyRNA *prop)
746 prop= rna_ensure_property(prop);
749 flag= prop->editable(ptr);
755 return (flag & PROP_EDITABLE) && (!id || !id->lib);
758 int RNA_property_animateable(PointerRNA *ptr, PropertyRNA *prop)
762 prop= rna_ensure_property(prop);
764 if(!(prop->flag & PROP_ANIMATEABLE))
768 flag= prop->editable(ptr);
772 return (flag & PROP_EDITABLE);
775 int RNA_property_animated(PointerRNA *ptr, PropertyRNA *prop)
777 /* would need to ask animation system */
782 void RNA_property_update(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
784 prop= rna_ensure_property(prop);
787 prop->update(C, ptr);
789 WM_event_add_notifier(C, prop->noteflag, ptr->id.data);
794 int RNA_property_boolean_get(PointerRNA *ptr, PropertyRNA *prop)
796 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
799 if((idprop=rna_idproperty_check(&prop, ptr)))
800 return IDP_Int(idprop);
802 return bprop->get(ptr);
804 return bprop->defaultvalue;
807 void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, int value)
809 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
812 if((idprop=rna_idproperty_check(&prop, ptr)))
813 IDP_Int(idprop)= value;
815 bprop->set(ptr, value);
816 else if(prop->flag & PROP_EDITABLE) {
817 IDPropertyTemplate val = {0};
822 group= RNA_struct_idproperties(ptr, 1);
824 IDP_AddToGroup(group, IDP_New(IDP_INT, val, (char*)prop->identifier));
828 void RNA_property_boolean_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values)
830 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
833 if((idprop=rna_idproperty_check(&prop, ptr))) {
834 if(prop->arraylength == 0)
835 values[0]= RNA_property_boolean_get(ptr, prop);
837 memcpy(values, IDP_Array(idprop), sizeof(int)*idprop->len);
839 else if(prop->arraylength == 0)
840 values[0]= RNA_property_boolean_get(ptr, prop);
841 else if(bprop->getarray)
842 bprop->getarray(ptr, values);
843 else if(bprop->defaultarray)
844 memcpy(values, bprop->defaultarray, sizeof(int)*prop->arraylength);
846 memset(values, 0, sizeof(int)*prop->arraylength);
849 int RNA_property_boolean_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
851 int tmp[RNA_MAX_ARRAY];
853 RNA_property_boolean_get_array(ptr, prop, tmp);
857 void RNA_property_boolean_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *values)
859 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
862 if((idprop=rna_idproperty_check(&prop, ptr))) {
863 if(prop->arraylength == 0)
864 IDP_Int(idprop)= values[0];
866 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);
868 else if(prop->arraylength == 0)
869 RNA_property_boolean_set(ptr, prop, values[0]);
870 else if(bprop->setarray)
871 bprop->setarray(ptr, values);
872 else if(prop->flag & PROP_EDITABLE) {
873 IDPropertyTemplate val = {0};
876 val.array.len= prop->arraylength;
877 val.array.type= IDP_INT;
879 group= RNA_struct_idproperties(ptr, 1);
881 idprop= IDP_New(IDP_ARRAY, val, (char*)prop->identifier);
882 IDP_AddToGroup(group, idprop);
883 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);
888 void RNA_property_boolean_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, int value)
890 int tmp[RNA_MAX_ARRAY];
892 RNA_property_boolean_get_array(ptr, prop, tmp);
894 RNA_property_boolean_set_array(ptr, prop, tmp);
897 int RNA_property_int_get(PointerRNA *ptr, PropertyRNA *prop)
899 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
902 if((idprop=rna_idproperty_check(&prop, ptr)))
903 return IDP_Int(idprop);
905 return iprop->get(ptr);
907 return iprop->defaultvalue;
910 void RNA_property_int_set(PointerRNA *ptr, PropertyRNA *prop, int value)
912 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
915 if((idprop=rna_idproperty_check(&prop, ptr)))
916 IDP_Int(idprop)= value;
918 iprop->set(ptr, value);
919 else if(prop->flag & PROP_EDITABLE) {
920 IDPropertyTemplate val = {0};
925 group= RNA_struct_idproperties(ptr, 1);
927 IDP_AddToGroup(group, IDP_New(IDP_INT, val, (char*)prop->identifier));
931 void RNA_property_int_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values)
933 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
936 if((idprop=rna_idproperty_check(&prop, ptr))) {
937 if(prop->arraylength == 0)
938 values[0]= RNA_property_int_get(ptr, prop);
940 memcpy(values, IDP_Array(idprop), sizeof(int)*idprop->len);
942 else if(prop->arraylength == 0)
943 values[0]= RNA_property_int_get(ptr, prop);
944 else if(iprop->getarray)
945 iprop->getarray(ptr, values);
946 else if(iprop->defaultarray)
947 memcpy(values, iprop->defaultarray, sizeof(int)*prop->arraylength);
949 memset(values, 0, sizeof(int)*prop->arraylength);
952 int RNA_property_int_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
954 int tmp[RNA_MAX_ARRAY];
956 RNA_property_int_get_array(ptr, prop, tmp);
960 void RNA_property_int_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *values)
962 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
965 if((idprop=rna_idproperty_check(&prop, ptr))) {
966 if(prop->arraylength == 0)
967 IDP_Int(idprop)= values[0];
969 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);\
971 else if(prop->arraylength == 0)
972 RNA_property_int_set(ptr, prop, values[0]);
973 else if(iprop->setarray)
974 iprop->setarray(ptr, values);
975 else if(prop->flag & PROP_EDITABLE) {
976 IDPropertyTemplate val = {0};
979 val.array.len= prop->arraylength;
980 val.array.type= IDP_INT;
982 group= RNA_struct_idproperties(ptr, 1);
984 idprop= IDP_New(IDP_ARRAY, val, (char*)prop->identifier);
985 IDP_AddToGroup(group, idprop);
986 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);
991 void RNA_property_int_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, int value)
993 int tmp[RNA_MAX_ARRAY];
995 RNA_property_int_get_array(ptr, prop, tmp);
997 RNA_property_int_set_array(ptr, prop, tmp);
1000 float RNA_property_float_get(PointerRNA *ptr, PropertyRNA *prop)
1002 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
1005 if((idprop=rna_idproperty_check(&prop, ptr))) {
1006 if(idprop->type == IDP_FLOAT)
1007 return IDP_Float(idprop);
1009 return (float)IDP_Double(idprop);
1012 return fprop->get(ptr);
1014 return fprop->defaultvalue;
1017 void RNA_property_float_set(PointerRNA *ptr, PropertyRNA *prop, float value)
1019 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
1022 if((idprop=rna_idproperty_check(&prop, ptr))) {
1023 if(idprop->type == IDP_FLOAT)
1024 IDP_Float(idprop)= value;
1026 IDP_Double(idprop)= value;
1028 else if(fprop->set) {
1029 fprop->set(ptr, value);
1031 else if(prop->flag & PROP_EDITABLE) {
1032 IDPropertyTemplate val = {0};
1037 group= RNA_struct_idproperties(ptr, 1);
1039 IDP_AddToGroup(group, IDP_New(IDP_FLOAT, val, (char*)prop->identifier));
1043 void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *values)
1045 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
1049 if((idprop=rna_idproperty_check(&prop, ptr))) {
1050 if(prop->arraylength == 0)
1051 values[0]= RNA_property_float_get(ptr, prop);
1052 else if(idprop->subtype == IDP_FLOAT) {
1053 memcpy(values, IDP_Array(idprop), sizeof(float)*idprop->len);
1056 for(i=0; i<idprop->len; i++)
1057 values[i]= (float)(((double*)IDP_Array(idprop))[i]);
1060 else if(prop->arraylength == 0)
1061 values[0]= RNA_property_float_get(ptr, prop);
1062 else if(fprop->getarray)
1063 fprop->getarray(ptr, values);
1064 else if(fprop->defaultarray)
1065 memcpy(values, fprop->defaultarray, sizeof(float)*prop->arraylength);
1067 memset(values, 0, sizeof(float)*prop->arraylength);
1070 float RNA_property_float_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
1072 float tmp[RNA_MAX_ARRAY];
1074 RNA_property_float_get_array(ptr, prop, tmp);
1078 void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const float *values)
1080 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
1084 if((idprop=rna_idproperty_check(&prop, ptr))) {
1085 if(prop->arraylength == 0)
1086 IDP_Double(idprop)= values[0];
1087 else if(idprop->subtype == IDP_FLOAT) {
1088 memcpy(IDP_Array(idprop), values, sizeof(float)*idprop->len);
1091 for(i=0; i<idprop->len; i++)
1092 ((double*)IDP_Array(idprop))[i]= values[i];
1095 else if(prop->arraylength == 0)
1096 RNA_property_float_set(ptr, prop, values[0]);
1097 else if(fprop->setarray) {
1098 fprop->setarray(ptr, values);
1100 else if(prop->flag & PROP_EDITABLE) {
1101 IDPropertyTemplate val = {0};
1104 val.array.len= prop->arraylength;
1105 val.array.type= IDP_FLOAT;
1107 group= RNA_struct_idproperties(ptr, 1);
1109 idprop= IDP_New(IDP_ARRAY, val, (char*)prop->identifier);
1110 IDP_AddToGroup(group, idprop);
1111 memcpy(IDP_Array(idprop), values, sizeof(float)*idprop->len);
1116 void RNA_property_float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, float value)
1118 float tmp[RNA_MAX_ARRAY];
1120 RNA_property_float_get_array(ptr, prop, tmp);
1122 RNA_property_float_set_array(ptr, prop, tmp);
1125 void RNA_property_string_get(PointerRNA *ptr, PropertyRNA *prop, char *value)
1127 StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
1130 if((idprop=rna_idproperty_check(&prop, ptr)))
1131 strcpy(value, IDP_String(idprop));
1133 sprop->get(ptr, value);
1135 strcpy(value, sprop->defaultvalue);
1138 char *RNA_property_string_get_alloc(PointerRNA *ptr, PropertyRNA *prop, char *fixedbuf, int fixedlen)
1143 length= RNA_property_string_length(ptr, prop);
1145 if(length+1 < fixedlen)
1148 buf= MEM_callocN(sizeof(char)*(length+1), "RNA_string_get_alloc");
1150 RNA_property_string_get(ptr, prop, buf);
1155 int RNA_property_string_length(PointerRNA *ptr, PropertyRNA *prop)
1157 StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
1160 if((idprop=rna_idproperty_check(&prop, ptr)))
1161 return strlen(IDP_String(idprop));
1162 else if(sprop->length)
1163 return sprop->length(ptr);
1165 return strlen(sprop->defaultvalue);
1168 void RNA_property_string_set(PointerRNA *ptr, PropertyRNA *prop, const char *value)
1170 StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
1173 if((idprop=rna_idproperty_check(&prop, ptr)))
1174 IDP_AssignString(idprop, (char*)value);
1176 sprop->set(ptr, value);
1177 else if(prop->flag & PROP_EDITABLE) {
1178 IDPropertyTemplate val = {0};
1181 val.str= (char*)value;
1183 group= RNA_struct_idproperties(ptr, 1);
1185 IDP_AddToGroup(group, IDP_New(IDP_STRING, val, (char*)prop->identifier));
1189 int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
1191 EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
1194 if((idprop=rna_idproperty_check(&prop, ptr)))
1195 return IDP_Int(idprop);
1197 return eprop->get(ptr);
1199 return eprop->defaultvalue;
1203 void RNA_property_enum_set(PointerRNA *ptr, PropertyRNA *prop, int value)
1205 EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
1208 if((idprop=rna_idproperty_check(&prop, ptr)))
1209 IDP_Int(idprop)= value;
1210 else if(eprop->set) {
1211 eprop->set(ptr, value);
1213 else if(prop->flag & PROP_EDITABLE) {
1214 IDPropertyTemplate val = {0};
1219 group= RNA_struct_idproperties(ptr, 1);
1221 IDP_AddToGroup(group, IDP_New(IDP_INT, val, (char*)prop->identifier));
1225 PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop)
1227 PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
1230 if((idprop=rna_idproperty_check(&prop, ptr))) {
1231 pprop= (PointerPropertyRNA*)prop;
1233 /* for groups, data is idprop itself */
1234 return rna_pointer_inherit_refine(ptr, pprop->type, idprop);
1236 else if(pprop->get) {
1237 return pprop->get(ptr);
1241 memset(&result, 0, sizeof(result));
1246 void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr_value)
1248 PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
1251 pprop->set(ptr, ptr_value);
1254 void RNA_property_pointer_add(PointerRNA *ptr, PropertyRNA *prop)
1258 if((idprop=rna_idproperty_check(&prop, ptr))) {
1259 /* already exists */
1261 else if(prop->flag & PROP_IDPROPERTY) {
1262 IDPropertyTemplate val = {0};
1267 group= RNA_struct_idproperties(ptr, 1);
1269 IDP_AddToGroup(group, IDP_New(IDP_GROUP, val, (char*)prop->identifier));
1272 printf("RNA_property_pointer_add %s.%s: only supported for id properties.\n", ptr->type->identifier, prop->identifier);
1275 void RNA_property_pointer_remove(PointerRNA *ptr, PropertyRNA *prop)
1277 IDProperty *idprop, *group;
1279 if((idprop=rna_idproperty_check(&prop, ptr))) {
1280 group= RNA_struct_idproperties(ptr, 0);
1283 IDP_RemFromGroup(group, idprop);
1284 IDP_FreeProperty(idprop);
1289 printf("RNA_property_pointer_remove %s.%s: only supported for id properties.\n", ptr->type->identifier, prop->identifier);
1292 static void rna_property_collection_get_idp(CollectionPropertyIterator *iter)
1294 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)iter->prop;
1296 iter->ptr.data= rna_iterator_array_get(iter);
1297 iter->ptr.type= cprop->type;
1298 rna_pointer_inherit_id(cprop->type, &iter->parent, &iter->ptr);
1301 void RNA_property_collection_begin(PointerRNA *ptr, PropertyRNA *prop, CollectionPropertyIterator *iter)
1305 memset(iter, 0, sizeof(*iter));
1307 if((idprop=rna_idproperty_check(&prop, ptr)) || (prop->flag & PROP_IDPROPERTY)) {
1312 rna_iterator_array_begin(iter, IDP_IDPArray(idprop), sizeof(IDProperty), idprop->len, 0, NULL);
1314 rna_iterator_array_begin(iter, NULL, sizeof(IDProperty), 0, 0, NULL);
1317 rna_property_collection_get_idp(iter);
1322 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1323 cprop->begin(iter, ptr);
1327 void RNA_property_collection_next(CollectionPropertyIterator *iter)
1329 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)iter->prop;
1332 rna_iterator_array_next(iter);
1335 rna_property_collection_get_idp(iter);
1341 void RNA_property_collection_end(CollectionPropertyIterator *iter)
1343 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)iter->prop;
1346 rna_iterator_array_end(iter);
1351 int RNA_property_collection_length(PointerRNA *ptr, PropertyRNA *prop)
1353 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1356 if((idprop=rna_idproperty_check(&prop, ptr))) {
1359 else if(cprop->length) {
1360 return cprop->length(ptr);
1363 CollectionPropertyIterator iter;
1366 RNA_property_collection_begin(ptr, prop, &iter);
1367 for(; iter.valid; RNA_property_collection_next(&iter))
1369 RNA_property_collection_end(&iter);
1375 void RNA_property_collection_add(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *r_ptr)
1378 //CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1380 if((idprop=rna_idproperty_check(&prop, ptr))) {
1381 IDPropertyTemplate val = {0};
1384 item= IDP_New(IDP_GROUP, val, "");
1385 IDP_AppendArray(idprop, item);
1386 IDP_FreeProperty(item);
1389 else if(prop->flag & PROP_IDPROPERTY) {
1390 IDProperty *group, *item;
1391 IDPropertyTemplate val = {0};
1393 group= RNA_struct_idproperties(ptr, 1);
1395 idprop= IDP_NewIDPArray(prop->identifier);
1396 IDP_AddToGroup(group, idprop);
1398 item= IDP_New(IDP_GROUP, val, "");
1399 IDP_AppendArray(idprop, item);
1400 IDP_FreeProperty(item);
1405 else if(cprop->add){
1406 if(!(cprop->add->flag & FUNC_USE_CONTEXT)) { /* XXX check for this somewhere else */
1407 ParameterList params;
1408 RNA_parameter_list_create(¶ms, ptr, cprop->add);
1409 RNA_function_call(NULL, NULL, ptr, cprop->add, ¶ms);
1410 RNA_parameter_list_free(¶ms);
1415 printf("RNA_property_collection_add %s.%s: not implemented for this property.\n", ptr->type->identifier, prop->identifier);
1419 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1421 r_ptr->data= IDP_GetIndexArray(idprop, idprop->len-1);
1422 r_ptr->type= cprop->type;
1423 rna_pointer_inherit_id(NULL, ptr, r_ptr);
1426 memset(r_ptr, 0, sizeof(*r_ptr));
1430 void RNA_property_collection_remove(PointerRNA *ptr, PropertyRNA *prop, int key)
1433 //CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1435 if((idprop=rna_idproperty_check(&prop, ptr))) {
1436 IDProperty tmp, *array;
1440 array= IDP_IDPArray(idprop);
1442 if(key >= 0 && key < len) {
1444 /* move element to be removed to the back */
1445 memcpy(&tmp, &array[key], sizeof(IDProperty));
1446 memmove(array+key, array+key+1, sizeof(IDProperty)*(len-key+1));
1447 memcpy(&array[len-1], &tmp, sizeof(IDProperty));
1450 IDP_ResizeIDPArray(idprop, len-1);
1453 else if(prop->flag & PROP_IDPROPERTY);
1455 else if(cprop->remove){
1456 if(!(cprop->remove->flag & FUNC_USE_CONTEXT)) { /* XXX check for this somewhere else */
1457 ParameterList params;
1458 RNA_parameter_list_create(&ptr, cprop->remove);
1459 RNA_function_call(NULL, NULL, ptr, cprop->remove, ¶ms);
1460 RNA_parameter_list_free(¶ms);
1465 printf("RNA_property_collection_remove %s.%s: only supported for id properties.\n", ptr->type->identifier, prop->identifier);
1468 void RNA_property_collection_clear(PointerRNA *ptr, PropertyRNA *prop)
1472 if((idprop=rna_idproperty_check(&prop, ptr)))
1473 IDP_ResizeIDPArray(idprop, 0);
1476 int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int key, PointerRNA *r_ptr)
1478 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1480 if(cprop->lookupint) {
1481 /* we have a callback defined, use it */
1482 *r_ptr= cprop->lookupint(ptr, key);
1483 return (r_ptr->data != NULL);
1486 /* no callback defined, just iterate and find the nth item */
1487 CollectionPropertyIterator iter;
1490 RNA_property_collection_begin(ptr, prop, &iter);
1491 for(i=0; iter.valid; RNA_property_collection_next(&iter), i++) {
1497 RNA_property_collection_end(&iter);
1500 memset(r_ptr, 0, sizeof(*r_ptr));
1506 int RNA_property_collection_lookup_string(PointerRNA *ptr, PropertyRNA *prop, const char *key, PointerRNA *r_ptr)
1508 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1510 if(cprop->lookupstring) {
1511 /* we have a callback defined, use it */
1512 *r_ptr= cprop->lookupstring(ptr, key);
1513 return (r_ptr->data != NULL);
1516 /* no callback defined, compare with name properties if they exist */
1517 CollectionPropertyIterator iter;
1518 PropertyRNA *nameprop;
1519 char name[256], *nameptr;
1522 RNA_property_collection_begin(ptr, prop, &iter);
1523 for(; iter.valid; RNA_property_collection_next(&iter)) {
1524 if(iter.ptr.data && iter.ptr.type->nameproperty) {
1525 nameprop= iter.ptr.type->nameproperty;
1527 nameptr= RNA_property_string_get_alloc(&iter.ptr, nameprop, name, sizeof(name));
1529 if(strcmp(nameptr, key) == 0) {
1534 if((char *)&name != nameptr)
1541 RNA_property_collection_end(&iter);
1544 memset(r_ptr, 0, sizeof(*r_ptr));
1550 int RNA_property_collection_raw_array(PointerRNA *ptr, PropertyRNA *prop, PropertyRNA *itemprop, RawArray *array)
1552 CollectionPropertyIterator iter;
1553 ArrayIterator *internal;
1556 if(!(prop->flag & PROP_RAW_ARRAY) || !(itemprop->flag & PROP_RAW_ACCESS))
1559 RNA_property_collection_begin(ptr, prop, &iter);
1562 /* get data from array iterator and item property */
1563 internal= iter.internal;
1564 arrayp= (iter.valid)? iter.ptr.data: NULL;
1566 if(internal->skip || !RNA_property_editable(&iter.ptr, itemprop)) {
1567 /* we might skip some items, so it's not a proper array */
1568 RNA_property_collection_end(&iter);
1572 array->array= arrayp + itemprop->rawoffset;
1573 array->stride= internal->itemsize;
1574 array->len= ((char*)internal->endptr - arrayp)/internal->itemsize;
1575 array->type= itemprop->rawtype;
1578 memset(array, 0, sizeof(RawArray));
1580 RNA_property_collection_end(&iter);
1585 #define RAW_GET(dtype, var, raw, a) \
1587 switch(raw.type) { \
1588 case PROP_RAW_CHAR: var = (dtype)((char*)raw.array)[a]; break; \
1589 case PROP_RAW_SHORT: var = (dtype)((short*)raw.array)[a]; break; \
1590 case PROP_RAW_INT: var = (dtype)((int*)raw.array)[a]; break; \
1591 case PROP_RAW_FLOAT: var = (dtype)((float*)raw.array)[a]; break; \
1592 case PROP_RAW_DOUBLE: var = (dtype)((double*)raw.array)[a]; break; \
1593 default: var = (dtype)0; \
1597 #define RAW_SET(dtype, raw, a, var) \
1599 switch(raw.type) { \
1600 case PROP_RAW_CHAR: ((char*)raw.array)[a] = (char)var; break; \
1601 case PROP_RAW_SHORT: ((short*)raw.array)[a] = (short)var; break; \
1602 case PROP_RAW_INT: ((int*)raw.array)[a] = (int)var; break; \
1603 case PROP_RAW_FLOAT: ((float*)raw.array)[a] = (float)var; break; \
1604 case PROP_RAW_DOUBLE: ((double*)raw.array)[a] = (double)var; break; \
1608 int RNA_raw_type_sizeof(RawPropertyType type)
1611 case PROP_RAW_CHAR: return sizeof(char);
1612 case PROP_RAW_SHORT: return sizeof(short);
1613 case PROP_RAW_INT: return sizeof(int);
1614 case PROP_RAW_FLOAT: return sizeof(float);
1615 case PROP_RAW_DOUBLE: return sizeof(double);
1620 static int rna_raw_access(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *inarray, RawPropertyType intype, int inlen, int set)
1624 PropertyRNA *itemprop, *iprop;
1625 PropertyType itemtype=0;
1629 /* initialize in array, stride assumed 0 in following code */
1635 ptype= RNA_property_pointer_type(ptr, prop);
1637 /* try to get item property pointer */
1638 RNA_pointer_create(NULL, ptype, NULL, &itemptr);
1639 itemprop= RNA_struct_find_property(&itemptr, propname);
1642 /* we have item property pointer */
1646 itemtype= RNA_property_type(itemprop);
1648 if(!ELEM3(itemtype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) {
1649 BKE_report(reports, RPT_ERROR, "Only boolean, int and float properties supported.");
1653 /* check item array */
1654 itemlen= RNA_property_array_length(itemprop);
1656 /* try to access as raw array */
1657 if(RNA_property_collection_raw_array(ptr, prop, itemprop, &out)) {
1658 if(in.len != itemlen*out.len) {
1659 BKE_reportf(reports, RPT_ERROR, "Array length mismatch (expected %d, got %d).", out.len*itemlen, in.len);
1663 /* matching raw types */
1664 if(out.type == in.type) {
1665 void *inp= in.array;
1666 void *outp= out.array;
1669 itemlen= (itemlen == 0)? 1: itemlen;
1670 size= RNA_raw_type_sizeof(out.type) * itemlen;
1672 for(a=0; a<out.len; a++) {
1673 if(set) memcpy(outp, inp, size);
1674 else memcpy(inp, outp, size);
1676 inp= (char*)inp + size;
1677 outp= (char*)outp + out.stride;
1683 /* could also be faster with non-matching types,
1684 * for now we just do slower loop .. */
1689 void *tmparray= NULL;
1691 int err= 0, j, a= 0;
1693 /* no item property pointer, can still be id property, or
1694 * property of a type derived from the collection pointer type */
1695 RNA_PROP_BEGIN(ptr, itemptr, prop) {
1698 /* we got the property already */
1702 /* not yet, look it up and verify if it is valid */
1703 iprop= RNA_struct_find_property(&itemptr, propname);
1706 itemlen= RNA_property_array_length(iprop);
1707 itemtype= RNA_property_type(iprop);
1710 BKE_reportf(reports, RPT_ERROR, "Property named %s not found.", propname);
1715 if(!ELEM3(itemtype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) {
1716 BKE_report(reports, RPT_ERROR, "Only boolean, int and float properties supported.");
1722 /* editable check */
1723 if(RNA_property_editable(&itemptr, iprop)) {
1724 if(a+itemlen > in.len) {
1725 BKE_reportf(reports, RPT_ERROR, "Array length mismatch (got %d, expected more).", in.len);
1731 /* handle conversions */
1734 case PROP_BOOLEAN: {
1736 RAW_GET(int, b, in, a);
1737 RNA_property_boolean_set(&itemptr, iprop, b);
1742 RAW_GET(int, i, in, a);
1743 RNA_property_int_set(&itemptr, iprop, i);
1748 RAW_GET(float, f, in, a);
1749 RNA_property_float_set(&itemptr, iprop, f);
1758 case PROP_BOOLEAN: {
1759 int b= RNA_property_boolean_get(&itemptr, iprop);
1760 RAW_SET(int, in, a, b);
1764 int i= RNA_property_int_get(&itemptr, iprop);
1765 RAW_SET(int, in, a, i);
1769 float f= RNA_property_float_get(&itemptr, iprop);
1770 RAW_SET(float, in, a, f);
1780 /* allocate temporary array if needed */
1781 if(tmparray && tmplen != itemlen) {
1782 MEM_freeN(tmparray);
1786 tmparray= MEM_callocN(sizeof(float)*itemlen, "RNA tmparray\n");
1790 /* handle conversions */
1793 case PROP_BOOLEAN: {
1794 for(j=0; j<itemlen; j++, a++)
1795 RAW_GET(int, ((int*)tmparray)[j], in, a);
1796 RNA_property_boolean_set_array(&itemptr, iprop, tmparray);
1800 for(j=0; j<itemlen; j++, a++)
1801 RAW_GET(int, ((int*)tmparray)[j], in, a);
1802 RNA_property_int_set_array(&itemptr, iprop, tmparray);
1806 for(j=0; j<itemlen; j++, a++)
1807 RAW_GET(float, ((float*)tmparray)[j], in, a);
1808 RNA_property_float_set_array(&itemptr, iprop, tmparray);
1817 case PROP_BOOLEAN: {
1818 RNA_property_boolean_get_array(&itemptr, iprop, tmparray);
1819 for(j=0; j<itemlen; j++, a++)
1820 RAW_SET(int, in, a, ((int*)tmparray)[j]);
1824 RNA_property_int_get_array(&itemptr, iprop, tmparray);
1825 for(j=0; j<itemlen; j++, a++)
1826 RAW_SET(int, in, a, ((int*)tmparray)[j]);
1830 RNA_property_float_get_array(&itemptr, iprop, tmparray);
1831 for(j=0; j<itemlen; j++, a++)
1832 RAW_SET(float, in, a, ((float*)tmparray)[j]);
1846 MEM_freeN(tmparray);
1852 RawPropertyType RNA_property_raw_type(PropertyRNA *prop)
1854 return prop->rawtype;
1857 int RNA_property_collection_raw_get(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *array, RawPropertyType type, int len)
1859 return rna_raw_access(reports, ptr, prop, propname, array, type, len, 0);
1862 int RNA_property_collection_raw_set(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *array, RawPropertyType type, int len)
1864 return rna_raw_access(reports, ptr, prop, propname, array, type, len, 1);
1867 /* Standard iterator functions */
1869 void rna_iterator_listbase_begin(CollectionPropertyIterator *iter, ListBase *lb, IteratorSkipFunc skip)
1871 ListBaseIterator *internal;
1873 internal= MEM_callocN(sizeof(ListBaseIterator), "ListBaseIterator");
1874 internal->link= (lb)? lb->first: NULL;
1875 internal->skip= skip;
1877 iter->internal= internal;
1878 iter->valid= (internal->link != NULL);
1880 if(skip && iter->valid && skip(iter, internal->link))
1881 rna_iterator_listbase_next(iter);
1884 void rna_iterator_listbase_next(CollectionPropertyIterator *iter)
1886 ListBaseIterator *internal= iter->internal;
1888 if(internal->skip) {
1890 internal->link= internal->link->next;
1891 iter->valid= (internal->link != NULL);
1892 } while(iter->valid && internal->skip(iter, internal->link));
1895 internal->link= internal->link->next;
1896 iter->valid= (internal->link != NULL);
1900 void *rna_iterator_listbase_get(CollectionPropertyIterator *iter)
1902 ListBaseIterator *internal= iter->internal;
1904 return internal->link;
1907 void rna_iterator_listbase_end(CollectionPropertyIterator *iter)
1909 MEM_freeN(iter->internal);
1910 iter->internal= NULL;
1913 void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int itemsize, int length, int free_ptr, IteratorSkipFunc skip)
1915 ArrayIterator *internal;
1920 internal= MEM_callocN(sizeof(ArrayIterator), "ArrayIterator");
1922 internal->free_ptr= free_ptr ? ptr:NULL;
1923 internal->endptr= ((char*)ptr)+length*itemsize;
1924 internal->itemsize= itemsize;
1925 internal->skip= skip;
1927 iter->internal= internal;
1928 iter->valid= (internal->ptr != internal->endptr);
1930 if(skip && iter->valid && skip(iter, internal->ptr))
1931 rna_iterator_array_next(iter);
1934 void rna_iterator_array_next(CollectionPropertyIterator *iter)
1936 ArrayIterator *internal= iter->internal;
1938 if(internal->skip) {
1940 internal->ptr += internal->itemsize;
1941 iter->valid= (internal->ptr != internal->endptr);
1942 } while(iter->valid && internal->skip(iter, internal->ptr));
1945 internal->ptr += internal->itemsize;
1946 iter->valid= (internal->ptr != internal->endptr);
1950 void *rna_iterator_array_get(CollectionPropertyIterator *iter)
1952 ArrayIterator *internal= iter->internal;
1954 return internal->ptr;
1957 void *rna_iterator_array_dereference_get(CollectionPropertyIterator *iter)
1959 ArrayIterator *internal= iter->internal;
1962 return *(void**)(internal->ptr);
1965 void rna_iterator_array_end(CollectionPropertyIterator *iter)
1967 ArrayIterator *internal= iter->internal;
1969 if(internal->free_ptr)
1970 MEM_freeN(internal->free_ptr);
1972 MEM_freeN(iter->internal);
1973 iter->internal= NULL;
1976 /* RNA Path - Experiment */
1978 static char *rna_path_token(const char **path, char *fixedbuf, int fixedlen, int bracket)
1982 int i, j, len, escape;
1987 /* get data between [], check escaping ] with \] */
1988 if(**path == '[') (*path)++;
1994 while(*p && (*p != ']' || escape)) {
1995 escape= (*p == '\\');
2000 if(*p != ']') return NULL;
2003 /* get data until . or [ */
2006 while(*p && *p != '.' && *p != '[') {
2016 /* try to use fixed buffer if possible */
2017 if(len+1 < fixedlen)
2020 buf= MEM_callocN(sizeof(char)*(len+1), "rna_path_token");
2022 /* copy string, taking into account escaped ] */
2024 for(p=*path, i=0, j=0; i<len; i++, p++) {
2025 if(*p == '\\' && *(p+1) == ']');
2032 memcpy(buf, *path, sizeof(char)*len);
2036 /* set path to start of next token */
2044 int RNA_path_resolve(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)
2047 PointerRNA curptr, nextptr;
2048 char fixedbuf[256], *token;
2055 /* look up property name in current struct */
2056 token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 0);
2061 prop= RNA_struct_find_property(&curptr, token);
2063 if(token != fixedbuf)
2069 /* now look up the value of this property if it is a pointer or
2070 * collection, otherwise return the property rna so that the
2071 * caller can read the value of the property itself */
2072 if(RNA_property_type(prop) == PROP_POINTER) {
2073 nextptr= RNA_property_pointer_get(&curptr, prop);
2080 else if(RNA_property_type(prop) == PROP_COLLECTION && *path) {
2081 /* resolve the lookup with [] brackets */
2082 token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 1);
2089 /* check for "" to see if it is a string */
2090 if(len >= 2 && token[0] == '"' && token[len-1] == '"') {
2093 RNA_property_collection_lookup_string(&curptr, prop, token+1, &nextptr);
2096 /* otherwise do int lookup */
2097 intkey= atoi(token);
2098 RNA_property_collection_lookup_int(&curptr, prop, intkey, &nextptr);
2101 if(token != fixedbuf)
2117 char *RNA_path_append(const char *path, PointerRNA *ptr, PropertyRNA *prop, int intkey, const char *strkey)
2121 char appendstr[128], *result;
2123 dynstr= BLI_dynstr_new();
2125 /* add .identifier */
2127 BLI_dynstr_append(dynstr, (char*)path);
2129 BLI_dynstr_append(dynstr, ".");
2132 BLI_dynstr_append(dynstr, (char*)RNA_property_identifier(prop));
2134 if(RNA_property_type(prop) == PROP_COLLECTION) {
2135 /* add ["strkey"] or [intkey] */
2136 BLI_dynstr_append(dynstr, "[");
2139 BLI_dynstr_append(dynstr, "\"");
2140 for(s=strkey; *s; s++) {
2150 BLI_dynstr_append(dynstr, appendstr);
2152 BLI_dynstr_append(dynstr, "\"");
2155 sprintf(appendstr, "%d", intkey);
2156 BLI_dynstr_append(dynstr, appendstr);
2159 BLI_dynstr_append(dynstr, "]");
2162 result= BLI_dynstr_get_cstring(dynstr);
2163 BLI_dynstr_free(dynstr);
2168 char *RNA_path_back(const char *path)
2171 const char *previous, *current;
2172 char *result, *token;
2181 /* parse token by token until the end, then we back up to the previous
2182 * position and strip of the next token to get the path one step back */
2184 token= rna_path_token(¤t, fixedbuf, sizeof(fixedbuf), 0);
2188 if(token != fixedbuf)
2191 /* in case of collection we also need to strip off [] */
2192 token= rna_path_token(¤t, fixedbuf, sizeof(fixedbuf), 1);
2193 if(token && token != fixedbuf)
2205 /* copy and strip off last token */
2207 result= BLI_strdup(path);
2209 if(i > 0 && result[i-1] == '.') i--;
2215 char *RNA_path_from_ID_to_property(PointerRNA *ptr, PropertyRNA *prop)
2217 char *ptrpath=NULL, *path;
2218 const char *propname;
2220 if(!ptr->id.data || !ptr->data || !prop)
2223 if(!RNA_struct_is_ID(ptr->type)) {
2224 if(ptr->type->path) {
2225 /* if type has a path to some ID, use it */
2226 ptrpath= ptr->type->path(ptr);
2228 else if(ptr->type->nested) {
2229 PointerRNA parentptr;
2230 PropertyRNA *userprop;
2232 /* find the property in the struct we're nested in that references this struct, and
2233 * use its identifier as the first part of the path used...
2235 RNA_pointer_create(ptr->id.data, ptr->type->nested, ptr->data, &parentptr);
2236 userprop= RNA_struct_find_nested(&parentptr, ptr->type);
2239 ptrpath= BLI_strdup(RNA_property_identifier(userprop));
2241 return NULL; // can't do anything about this case yet...
2247 propname= RNA_property_identifier(prop);
2250 path= BLI_sprintfN("%s.%s", ptrpath, propname);
2254 path= BLI_strdup(propname);
2259 /* Quick name based property access */
2261 int RNA_boolean_get(PointerRNA *ptr, const char *name)
2263 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2266 return RNA_property_boolean_get(ptr, prop);
2269 printf("RNA_boolean_get: %s.%s not found.\n", ptr->type->identifier, name);
2274 void RNA_boolean_set(PointerRNA *ptr, const char *name, int value)
2276 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2279 RNA_property_boolean_set(ptr, prop, value);
2281 printf("RNA_boolean_set: %s.%s not found.\n", ptr->type->identifier, name);
2284 void RNA_boolean_get_array(PointerRNA *ptr, const char *name, int *values)
2286 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2289 RNA_property_boolean_get_array(ptr, prop, values);
2291 printf("RNA_boolean_get_array: %s.%s not found.\n", ptr->type->identifier, name);
2294 void RNA_boolean_set_array(PointerRNA *ptr, const char *name, const int *values)
2296 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2299 RNA_property_boolean_set_array(ptr, prop, values);
2301 printf("RNA_boolean_set_array: %s.%s not found.\n", ptr->type->identifier, name);
2304 int RNA_int_get(PointerRNA *ptr, const char *name)
2306 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2309 return RNA_property_int_get(ptr, prop);
2312 printf("RNA_int_get: %s.%s not found.\n", ptr->type->identifier, name);
2317 void RNA_int_set(PointerRNA *ptr, const char *name, int value)
2319 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2322 RNA_property_int_set(ptr, prop, value);
2324 printf("RNA_int_set: %s.%s not found.\n", ptr->type->identifier, name);
2327 void RNA_int_get_array(PointerRNA *ptr, const char *name, int *values)
2329 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2332 RNA_property_int_get_array(ptr, prop, values);
2334 printf("RNA_int_get_array: %s.%s not found.\n", ptr->type->identifier, name);
2337 void RNA_int_set_array(PointerRNA *ptr, const char *name, const int *values)
2339 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2342 RNA_property_int_set_array(ptr, prop, values);
2344 printf("RNA_int_set_array: %s.%s not found.\n", ptr->type->identifier, name);
2347 float RNA_float_get(PointerRNA *ptr, const char *name)
2349 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2352 return RNA_property_float_get(ptr, prop);
2355 printf("RNA_float_get: %s.%s not found.\n", ptr->type->identifier, name);
2360 void RNA_float_set(PointerRNA *ptr, const char *name, float value)
2362 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2365 RNA_property_float_set(ptr, prop, value);
2367 printf("RNA_float_set: %s.%s not found.\n", ptr->type->identifier, name);
2370 void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
2372 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2375 RNA_property_float_get_array(ptr, prop, values);
2377 printf("RNA_float_get_array: %s.%s not found.\n", ptr->type->identifier, name);
2380 void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
2382 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2385 RNA_property_float_set_array(ptr, prop, values);
2387 printf("RNA_float_set_array: %s.%s not found.\n", ptr->type->identifier, name);
2390 int RNA_enum_get(PointerRNA *ptr, const char *name)
2392 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2395 return RNA_property_enum_get(ptr, prop);
2398 printf("RNA_enum_get: %s.%s not found.\n", ptr->type->identifier, name);
2403 void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
2405 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2408 RNA_property_enum_set(ptr, prop, value);
2410 printf("RNA_enum_set: %s.%s not found.\n", ptr->type->identifier, name);
2413 int RNA_enum_is_equal(bContext *C, PointerRNA *ptr, const char *name, const char *enumname)
2415 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2416 EnumPropertyItem *item;
2420 RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
2422 for(; item->identifier; item++)
2423 if(strcmp(item->identifier, enumname) == 0)
2424 return (item->value == RNA_property_enum_get(ptr, prop));
2429 printf("RNA_enum_is_equal: %s.%s item %s not found.\n", ptr->type->identifier, name, enumname);
2433 printf("RNA_enum_is_equal: %s.%s not found.\n", ptr->type->identifier, name);
2438 int RNA_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int *value)
2440 for( ; item->identifier; item++) {
2441 if(strcmp(item->identifier, identifier)==0) {
2442 *value= item->value;
2450 int RNA_enum_id_from_value(EnumPropertyItem *item, int value, const char **identifier)
2452 for( ; item->identifier; item++) {
2453 if(item->value==value) {
2454 *identifier= item->identifier;
2464 void RNA_string_get(PointerRNA *ptr, const char *name, char *value)
2466 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2469 RNA_property_string_get(ptr, prop, value);
2471 printf("RNA_string_get: %s.%s not found.\n", ptr->type->identifier, name);
2474 char *RNA_string_get_alloc(PointerRNA *ptr, const char *name, char *fixedbuf, int fixedlen)
2476 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2479 return RNA_property_string_get_alloc(ptr, prop, fixedbuf, fixedlen);
2482 printf("RNA_string_get_alloc: %s.%s not found.\n", ptr->type->identifier, name);
2487 int RNA_string_length(PointerRNA *ptr, const char *name)
2489 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2492 return RNA_property_string_length(ptr, prop);
2495 printf("RNA_string_length: %s.%s not found.\n", ptr->type->identifier, name);
2500 void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
2502 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2505 RNA_property_string_set(ptr, prop, value);
2507 printf("RNA_string_set: %s.%s not found.\n", ptr->type->identifier, name);
2510 PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
2512 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2515 return RNA_property_pointer_get(ptr, prop);
2520 printf("RNA_pointer_get: %s.%s not found.\n", ptr->type->identifier, name);
2522 memset(&result, 0, sizeof(result));
2527 void RNA_pointer_add(PointerRNA *ptr, const char *name)
2529 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2532 RNA_property_pointer_add(ptr, prop);
2534 printf("RNA_pointer_set: %s.%s not found.\n", ptr->type->identifier, name);
2537 void RNA_collection_begin(PointerRNA *ptr, const char *name, CollectionPropertyIterator *iter)
2539 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2542 RNA_property_collection_begin(ptr, prop, iter);
2544 printf("RNA_collection_begin: %s.%s not found.\n", ptr->type->identifier, name);
2547 void RNA_collection_add(PointerRNA *ptr, const char *name, PointerRNA *r_value)
2549 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2552 RNA_property_collection_add(ptr, prop, r_value);
2554 printf("RNA_collection_add: %s.%s not found.\n", ptr->type->identifier, name);
2557 void RNA_collection_clear(PointerRNA *ptr, const char *name)
2559 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2562 RNA_property_collection_clear(ptr, prop);
2564 printf("RNA_collection_clear: %s.%s not found.\n", ptr->type->identifier, name);
2567 int RNA_collection_length(PointerRNA *ptr, const char *name)
2569 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2572 return RNA_property_collection_length(ptr, prop);
2575 printf("RNA_collection_length: %s.%s not found.\n", ptr->type->identifier, name);
2580 int RNA_property_is_set(PointerRNA *ptr, const char *name)
2582 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2585 return (rna_idproperty_find(ptr, name) != NULL);
2588 printf("RNA_property_is_set: %s.%s not found.\n", ptr->type->identifier, name);
2593 /* string representation of a property, python
2594 * compatible but can be used for display too*/
2595 char *RNA_pointer_as_string(PointerRNA *ptr)
2597 DynStr *dynstr= BLI_dynstr_new();
2600 const char *propname;
2603 BLI_dynstr_append(dynstr, "{");
2605 RNA_STRUCT_BEGIN(ptr, prop) {
2606 propname = RNA_property_identifier(prop);
2608 if(strcmp(propname, "rna_type")==0)
2612 BLI_dynstr_append(dynstr, ", ");
2615 cstring = RNA_property_as_string(ptr, prop);
2616 BLI_dynstr_appendf(dynstr, "\"%s\":%s", propname, cstring);
2621 BLI_dynstr_append(dynstr, "}");
2624 cstring = BLI_dynstr_get_cstring(dynstr);
2625 BLI_dynstr_free(dynstr);
2629 char *RNA_property_as_string(PointerRNA *ptr, PropertyRNA *prop)
2631 int type = RNA_property_type(prop);
2632 int len = RNA_property_array_length(prop);
2635 DynStr *dynstr= BLI_dynstr_new();
2639 /* see if we can coorce into a python type - PropertyType */
2643 BLI_dynstr_append(dynstr, RNA_property_boolean_get(ptr, prop) ? "True" : "False");
2646 BLI_dynstr_append(dynstr, "(");
2647 for(i=0; i<len; i++) {
2648 BLI_dynstr_appendf(dynstr, i?", %s":"%s", RNA_property_boolean_get_index(ptr, prop, i) ? "True" : "False");
2651 BLI_dynstr_append(dynstr, ","); /* otherwise python wont see it as a tuple */
2652 BLI_dynstr_append(dynstr, ")");
2657 BLI_dynstr_appendf(dynstr, "%d", RNA_property_int_get(ptr, prop));
2660 BLI_dynstr_append(dynstr, "(");
2661 for(i=0; i<len; i++) {
2662 BLI_dynstr_appendf(dynstr, i?", %d":"%d", RNA_property_int_get_index(ptr, prop, i));
2665 BLI_dynstr_append(dynstr, ","); /* otherwise python wont see it as a tuple */
2666 BLI_dynstr_append(dynstr, ")");
2671 BLI_dynstr_appendf(dynstr, "%g", RNA_property_float_get(ptr, prop));
2674 BLI_dynstr_append(dynstr, "(");
2675 for(i=0; i<len; i++) {
2676 BLI_dynstr_appendf(dynstr, i?", %g":"%g", RNA_property_float_get_index(ptr, prop, i));
2679 BLI_dynstr_append(dynstr, ","); /* otherwise python wont see it as a tuple */
2680 BLI_dynstr_append(dynstr, ")");
2685 /* string arrays dont exist */
2687 buf = RNA_property_string_get_alloc(ptr, prop, NULL, -1);
2688 BLI_dynstr_appendf(dynstr, "\"%s\"", buf);
2694 /* string arrays dont exist */
2695 const char *identifier;
2696 int val = RNA_property_enum_get(ptr, prop);
2698 if(RNA_property_enum_identifier(NULL, ptr, prop, val, &identifier)) {
2699 BLI_dynstr_appendf(dynstr, "'%s'", identifier);
2702 BLI_dynstr_appendf(dynstr, "'<UNKNOWN ENUM>'", identifier);
2708 BLI_dynstr_append(dynstr, "'<POINTER>'"); /* TODO */
2711 case PROP_COLLECTION:
2714 CollectionPropertyIterator collect_iter;
2715 BLI_dynstr_append(dynstr, "[");
2717 for(RNA_property_collection_begin(ptr, prop, &collect_iter); collect_iter.valid; RNA_property_collection_next(&collect_iter)) {
2718 PointerRNA itemptr= collect_iter.ptr;
2721 BLI_dynstr_append(dynstr, ", ");
2724 /* now get every prop of the collection */
2725 cstring= RNA_pointer_as_string(&itemptr);
2726 BLI_dynstr_append(dynstr, cstring);
2730 RNA_property_collection_end(&collect_iter);
2731 BLI_dynstr_append(dynstr, "]");
2735 BLI_dynstr_append(dynstr, "'<UNKNOWN TYPE>'"); /* TODO */
2739 cstring = BLI_dynstr_get_cstring(dynstr);
2740 BLI_dynstr_free(dynstr);
2746 const char *RNA_function_identifier(FunctionRNA *func)
2748 return func->identifier;
2751 PropertyRNA *RNA_function_return(FunctionRNA *func)
2756 const char *RNA_function_ui_description(FunctionRNA *func)
2758 return func->description;
2761 int RNA_function_flag(FunctionRNA *func)
2766 PropertyRNA *RNA_function_get_parameter(PointerRNA *ptr, FunctionRNA *func, int index)
2771 parm= func->cont.properties.first;
2772 for(i= 0; parm; parm= parm->next, i++)
2779 PropertyRNA *RNA_function_find_parameter(PointerRNA *ptr, FunctionRNA *func, const char *identifier)
2783 parm= func->cont.properties.first;
2784 for(; parm; parm= parm->next)
2785 if(strcmp(parm->identifier, identifier)==0)
2791 const struct ListBase *RNA_function_defined_parameters(FunctionRNA *func)
2793 return &func->cont.properties;
2798 ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *ptr, FunctionRNA *func)
2803 for(parm= func->cont.properties.first; parm; parm= parm->next)
2804 tot+= rna_parameter_size(parm);
2806 parms->data= MEM_callocN(tot, "RNA_parameter_list_create");
2813 void RNA_parameter_list_free(ParameterList *parms)
2818 parm= parms->func->cont.properties.first;
2819 for(tot= 0; parm; parm= parm->next) {
2820 if(parm->type == PROP_COLLECTION)
2821 BLI_freelistN((ListBase*)((char*)parms->data+tot));
2823 tot+= rna_parameter_size(parm);
2826 MEM_freeN(parms->data);
2832 int RNA_parameter_list_size(ParameterList *parms)
2837 void RNA_parameter_list_begin(ParameterList *parms, ParameterIterator *iter)
2841 RNA_pointer_create(NULL, &RNA_Function, parms->func, &iter->funcptr);
2844 iter->parm= parms->func->cont.properties.first;
2845 iter->valid= iter->parm != NULL;
2849 iter->size= rna_parameter_size(iter->parm);
2850 iter->data= (((char*)iter->parms->data)+iter->offset);
2851 ptype= RNA_property_type(iter->parm);
2855 void RNA_parameter_list_next(ParameterIterator *iter)
2859 iter->offset+= iter->size;
2860 iter->parm= iter->parm->next;
2861 iter->valid= iter->parm != NULL;
2864 iter->size= rna_parameter_size(iter->parm);
2865 iter->data= (((char*)iter->parms->data)+iter->offset);
2866 ptype= RNA_property_type(iter->parm);
2870 void RNA_parameter_list_end(ParameterIterator *iter)
2875 void RNA_parameter_get(ParameterList *parms, PropertyRNA *parm, void **value)
2877 ParameterIterator iter;
2879 RNA_parameter_list_begin(parms, &iter);
2881 for(; iter.valid; RNA_parameter_list_next(&iter))
2890 RNA_parameter_list_end(&iter);
2893 void RNA_parameter_get_lookup(ParameterList *parms, const char *identifier, void **value)
2897 parm= parms->func->cont.properties.first;
2898 for(; parm; parm= parm->next)
2899 if(strcmp(RNA_property_identifier(parm), identifier)==0)
2903 RNA_parameter_get(parms, parm, value);
2906 void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, void *value)
2908 ParameterIterator iter;
2910 RNA_parameter_list_begin(parms, &iter);
2912 for(; iter.valid; RNA_parameter_list_next(&iter))
2917 memcpy(iter.data, value, iter.size);
2919 RNA_parameter_list_end(&iter);
2922 void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, void *value)
2926 parm= parms->func->cont.properties.first;
2927 for(; parm; parm= parm->next)
2928 if(strcmp(RNA_property_identifier(parm), identifier)==0)
2932 RNA_parameter_set(parms, parm, value);
2935 int RNA_function_call(bContext *C, ReportList *reports, PointerRNA *ptr, FunctionRNA *func, ParameterList *parms)
2938 func->call(C, reports, ptr, parms);
2946 int RNA_function_call_lookup(bContext *C, ReportList *reports, PointerRNA *ptr, const char *identifier, ParameterList *parms)
2950 func= RNA_struct_find_function(ptr, identifier);
2953 return RNA_function_call(C, reports, ptr, func, parms);
2958 int RNA_function_call_direct(bContext *C, ReportList *reports, PointerRNA *ptr, FunctionRNA *func, const char *format, ...)
2963 va_start(args, format);
2965 ret= RNA_function_call_direct_va(C, reports, ptr, func, format, args);
2972 int RNA_function_call_direct_lookup(bContext *C, ReportList *reports, PointerRNA *ptr, const char *identifier, const char *format, ...)
2976 func= RNA_struct_find_function(ptr, identifier);
2982 va_start(args, format);
2984 ret= RNA_function_call_direct_va(C, reports, ptr, func, format, args);
2994 static int rna_function_format_array_length(const char *format, int ofs, int flen)
2999 if (format[ofs++]=='[')
3000 for (; ofs<flen && format[ofs]!=']' && idx<sizeof(*lenbuf)-1; idx++, ofs++)
3001 lenbuf[idx]= format[ofs];
3003 if (ofs<flen && format[ofs++]==']') {
3004 /* XXX put better error reporting for ofs>=flen or idx over lenbuf capacity */
3006 return atoi(lenbuf);
3012 static int rna_function_parameter_parse(PointerRNA *ptr, PropertyRNA *prop, PropertyType type, char ftype, int len, void *dest, void *src, StructRNA *srna, const char *tid, const char *fid, const char *pid)
3014 /* ptr is always a function pointer, prop always a parameter */
3020 fprintf(stderr, "%s.%s: wrong type for parameter %s, a boolean was expected\n", tid, fid, pid);
3025 *((int*)dest)= *((int*)src);
3027 memcpy(dest, src, len*sizeof(int));
3034 fprintf(stderr, "%s.%s: wrong type for parameter %s, an integer was expected\n", tid, fid, pid);
3039 *((int*)dest)= *((int*)src);
3041 memcpy(dest, src, len*sizeof(int));
3048 fprintf(stderr, "%s.%s: wrong type for parameter %s, a float was expected\n", tid, fid, pid);
3053 *((float*)dest)= *((float*)src);
3055 memcpy(dest, src, len*sizeof(float));
3062 fprintf(stderr, "%s.%s: wrong type for parameter %s, a string was expected\n", tid, fid, pid);
3066 *((char**)dest)= *((char**)src);
3073 fprintf(stderr, "%s.%s: wrong type for parameter %s, an enum was expected\n", tid, fid, pid);
3077 *((int*)dest)= *((int*)src);
3086 fprintf(stderr, "%s.%s: wrong type for parameter %s, an object was expected\n", tid, fid, pid);
3090 ptype= RNA_property_pointer_type(ptr, prop);
3092 if(prop->flag & PROP_RNAPTR) {
3093 *((PointerRNA*)dest)= *((PointerRNA*)src);
3097 if (ptype!=srna && !RNA_struct_is_a(srna, ptype)) {
3098 fprintf(stderr, "%s.%s: wrong type for parameter %s, an object of type %s was expected, passed an object of type %s\n", tid, fid, pid, RNA_struct_identifier(ptype), RNA_struct_identifier(srna));
3102 *((void**)dest)= *((void**)src);
3106 case PROP_COLLECTION:
3111 CollectionPointerLink *clink;
3114 fprintf(stderr, "%s.%s: wrong type for parameter %s, a collection was expected\n", tid, fid, pid);
3118 lb= (ListBase *)src;
3119 clb= (ListBase *)dest;
3120 ptype= RNA_property_pointer_type(ptr, prop);
3122 if (ptype!=srna && !RNA_struct_is_a(srna, ptype)) {
3123 fprintf(stderr, "%s.%s: wrong type for parameter %s, a collection of objects of type %s was expected, passed a collection of objects of type %s\n", tid, fid, pid, RNA_struct_identifier(ptype), RNA_struct_identifier(srna));
3127 for (link= lb->first; link; link= link->next) {
3128 clink= MEM_callocN(sizeof(CollectionPointerLink), "CCollectionPointerLink");
3129 RNA_pointer_create(NULL, srna, link, &clink->ptr);
3130 BLI_addtail(clb, clink);
3138 fprintf(stderr, "%s.%s: unknown type for parameter %s\n", tid, fid, pid);
3140 fprintf(stderr, "%s.%s: unknown array type for parameter %s\n", tid, fid, pid);
3149 int RNA_function_call_direct_va(bContext *C, ReportList *reports, PointerRNA *ptr, FunctionRNA *func, const char *format, va_list args)
3152 ParameterList parms;
3153 ParameterIterator iter;
3154 PropertyRNA *pret, *parm;
3156 int i, ofs, flen, flag, len, alen, err= 0;
3157 const char *tid, *fid, *pid=NULL;
3159 void **retdata=NULL;
3161 RNA_pointer_create(NULL, &RNA_Function, func, &funcptr);
3163 tid= RNA_struct_identifier(ptr->type);
3164 fid= RNA_function_identifier(func);
3165 pret= RNA_function_return(func);
3166 flen= strlen(format);
3168 RNA_parameter_list_create(&parms, ptr, func);
3169 RNA_parameter_list_begin(&parms, &iter);
3171 for(i= 0, ofs= 0; iter.valid; RNA_parameter_list_next(&iter), i++) {
3179 pid= RNA_property_identifier(parm);
3180 flag= RNA_property_flag(parm);
3182 if (ofs>=flen || format[ofs]=='N') {
3183 if (flag & PROP_REQUIRED) {
3185 fprintf(stderr, "%s.%s: missing required parameter %s\n", tid, fid, pid);
3192 type= RNA_property_type(parm);
3193 ftype= format[ofs++];
3194 len= RNA_property_array_length(parm);
3195 alen= rna_function_format_array_length(format, ofs, flen);
3199 fprintf(stderr, "%s.%s: for parameter %s, was expecting an array of %i elements, passed %i elements instead\n", tid, fid, pid, len, alen);