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 int RNA_struct_is_ID(StructRNA *type)
397 return (type->flag & STRUCT_ID) != 0;
400 int RNA_struct_is_a(StructRNA *type, StructRNA *srna)
407 /* ptr->type is always maximally refined */
408 for(base=type; base; base=base->base)
415 PropertyRNA *RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
417 PropertyRNA *iterprop= RNA_struct_iterator_property(ptr->type);
420 if(RNA_property_collection_lookup_string(ptr, iterprop, identifier, &propptr))
426 /* Find the property which uses the given nested struct */
427 PropertyRNA *RNA_struct_find_nested(PointerRNA *ptr, StructRNA *srna)
429 CollectionPropertyIterator iter;
430 PropertyRNA *iterprop, *prop;
433 iterprop= RNA_struct_iterator_property(ptr->type);
434 RNA_property_collection_begin(ptr, iterprop, &iter);
437 for(; iter.valid; RNA_property_collection_next(&iter), i++) {
438 /* This assumes that there can only be one user of this nested struct */
439 if (RNA_property_pointer_type(ptr, iter.ptr.data) == srna) {
445 RNA_property_collection_end(&iter);
450 const struct ListBase *RNA_struct_defined_properties(StructRNA *srna)
452 return &srna->cont.properties;
455 FunctionRNA *RNA_struct_find_function(PointerRNA *ptr, const char *identifier)
458 CollectionPropertyIterator iter;
459 PropertyRNA *iterprop;
463 RNA_pointer_create(NULL, &RNA_Struct, ptr->type, &tptr);
464 iterprop= RNA_struct_find_property(&tptr, "functions");
466 RNA_property_collection_begin(&tptr, iterprop, &iter);
469 for(; iter.valid; RNA_property_collection_next(&iter), i++) {
470 if(strcmp(identifier, RNA_function_identifier(iter.ptr.data)) == 0) {
476 RNA_property_collection_end(&iter);
481 const struct ListBase *RNA_struct_defined_functions(StructRNA *srna)
483 return &srna->functions;
486 StructRegisterFunc RNA_struct_register(StructRNA *type)
491 StructUnregisterFunc RNA_struct_unregister(StructRNA *type)
496 } while((type=type->base));
501 void *RNA_struct_py_type_get(StructRNA *srna)
503 return srna->py_type;
506 void RNA_struct_py_type_set(StructRNA *srna, void *py_type)
508 srna->py_type= py_type;
511 void *RNA_struct_blender_type_get(StructRNA *srna)
513 return srna->blender_type;
516 void RNA_struct_blender_type_set(StructRNA *srna, void *blender_type)
518 srna->blender_type= blender_type;
521 char *RNA_struct_name_get_alloc(PointerRNA *ptr, char *fixedbuf, int fixedlen)
523 PropertyRNA *nameprop;
525 if(ptr->data && (nameprop = RNA_struct_name_property(ptr->type)))
526 return RNA_property_string_get_alloc(ptr, nameprop, fixedbuf, fixedlen);
531 /* Property Information */
533 const char *RNA_property_identifier(PropertyRNA *prop)
535 return rna_ensure_property_identifier(prop);
538 PropertyType RNA_property_type(PropertyRNA *prop)
540 return rna_ensure_property(prop)->type;
543 PropertySubType RNA_property_subtype(PropertyRNA *prop)
545 return rna_ensure_property(prop)->subtype;
548 int RNA_property_flag(PropertyRNA *prop)
550 return rna_ensure_property(prop)->flag;
553 int RNA_property_array_length(PropertyRNA *prop)
555 return rna_ensure_property_array_length(prop);
558 void RNA_property_int_range(PointerRNA *ptr, PropertyRNA *prop, int *hardmin, int *hardmax)
560 IntPropertyRNA *iprop= (IntPropertyRNA*)rna_ensure_property(prop);
563 iprop->range(ptr, hardmin, hardmax);
566 *hardmin= iprop->hardmin;
567 *hardmax= iprop->hardmax;
571 void RNA_property_int_ui_range(PointerRNA *ptr, PropertyRNA *prop, int *softmin, int *softmax, int *step)
573 IntPropertyRNA *iprop= (IntPropertyRNA*)rna_ensure_property(prop);
574 int hardmin, hardmax;
577 iprop->range(ptr, &hardmin, &hardmax);
578 *softmin= MAX2(iprop->softmin, hardmin);
579 *softmax= MIN2(iprop->softmax, hardmax);
582 *softmin= iprop->softmin;
583 *softmax= iprop->softmax;
589 void RNA_property_float_range(PointerRNA *ptr, PropertyRNA *prop, float *hardmin, float *hardmax)
591 FloatPropertyRNA *fprop= (FloatPropertyRNA*)rna_ensure_property(prop);
594 fprop->range(ptr, hardmin, hardmax);
597 *hardmin= fprop->hardmin;
598 *hardmax= fprop->hardmax;
602 void RNA_property_float_ui_range(PointerRNA *ptr, PropertyRNA *prop, float *softmin, float *softmax, float *step, float *precision)
604 FloatPropertyRNA *fprop= (FloatPropertyRNA*)rna_ensure_property(prop);
605 float hardmin, hardmax;
608 fprop->range(ptr, &hardmin, &hardmax);
609 *softmin= MAX2(fprop->softmin, hardmin);
610 *softmax= MIN2(fprop->softmax, hardmax);
613 *softmin= fprop->softmin;
614 *softmax= fprop->softmax;
618 *precision= (float)fprop->precision;
621 int RNA_property_string_maxlength(PropertyRNA *prop)
623 StringPropertyRNA *sprop= (StringPropertyRNA*)rna_ensure_property(prop);
624 return sprop->maxlength;
627 StructRNA *RNA_property_pointer_type(PointerRNA *ptr, PropertyRNA *prop)
629 prop= rna_ensure_property(prop);
631 if(prop->type == PROP_POINTER) {
632 PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
635 return pprop->typef(ptr);
639 else if(prop->type == PROP_COLLECTION) {
640 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
646 return &RNA_UnknownType;
649 void RNA_property_enum_items(PointerRNA *ptr, PropertyRNA *prop, const EnumPropertyItem **item, int *totitem)
651 EnumPropertyRNA *eprop= (EnumPropertyRNA*)rna_ensure_property(prop);
655 *item= eprop->itemf(ptr);
657 for(tot=0; (*item)[tot].identifier; tot++);
664 *totitem= eprop->totitem;
668 int RNA_property_enum_value(PointerRNA *ptr, PropertyRNA *prop, const char *identifier, int *value)
670 const EnumPropertyItem *item;
672 RNA_property_enum_items(ptr, prop, &item, NULL);
674 for(; item->identifier; item++) {
675 if(strcmp(item->identifier, identifier)==0) {
676 *value = item->value;
684 int RNA_enum_identifier(const EnumPropertyItem *item, const int value, const char **identifier)
686 for (; item->identifier; item++) {
687 if(item->value==value) {
688 *identifier = item->identifier;
695 int RNA_enum_name(const EnumPropertyItem *item, const int value, const char **name)
697 for (; item->identifier; item++) {
698 if(item->value==value) {
706 int RNA_property_enum_identifier(PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier)
708 const EnumPropertyItem *item= NULL;
710 RNA_property_enum_items(ptr, prop, &item, NULL);
711 return RNA_enum_identifier(item, value, identifier);
714 const char *RNA_property_ui_name(PropertyRNA *prop)
716 return rna_ensure_property_name(prop);
719 const char *RNA_property_ui_description(PropertyRNA *prop)
721 return rna_ensure_property(prop)->description;
724 int RNA_property_ui_icon(PropertyRNA *prop)
726 return rna_ensure_property(prop)->icon;
729 int RNA_property_editable(PointerRNA *ptr, PropertyRNA *prop)
734 prop= rna_ensure_property(prop);
737 flag= prop->editable(ptr);
743 return (flag & PROP_EDITABLE) && (!id || !id->lib);
746 int RNA_property_animateable(PointerRNA *ptr, PropertyRNA *prop)
750 prop= rna_ensure_property(prop);
752 if(!(prop->flag & PROP_ANIMATEABLE))
756 flag= prop->editable(ptr);
760 return (flag & PROP_EDITABLE);
763 int RNA_property_animated(PointerRNA *ptr, PropertyRNA *prop)
765 /* would need to ask animation system */
770 void RNA_property_update(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
772 prop= rna_ensure_property(prop);
775 prop->update(C, ptr);
777 WM_event_add_notifier(C, prop->noteflag, ptr->id.data);
782 int RNA_property_boolean_get(PointerRNA *ptr, PropertyRNA *prop)
784 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
787 if((idprop=rna_idproperty_check(&prop, ptr)))
788 return IDP_Int(idprop);
790 return bprop->get(ptr);
792 return bprop->defaultvalue;
795 void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, int value)
797 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
800 if((idprop=rna_idproperty_check(&prop, ptr)))
801 IDP_Int(idprop)= value;
803 bprop->set(ptr, value);
804 else if(prop->flag & PROP_EDITABLE) {
805 IDPropertyTemplate val = {0};
810 group= RNA_struct_idproperties(ptr, 1);
812 IDP_AddToGroup(group, IDP_New(IDP_INT, val, (char*)prop->identifier));
816 void RNA_property_boolean_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values)
818 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
821 if((idprop=rna_idproperty_check(&prop, ptr))) {
822 if(prop->arraylength == 0)
823 values[0]= RNA_property_boolean_get(ptr, prop);
825 memcpy(values, IDP_Array(idprop), sizeof(int)*idprop->len);
827 else if(prop->arraylength == 0)
828 values[0]= RNA_property_boolean_get(ptr, prop);
829 else if(bprop->getarray)
830 bprop->getarray(ptr, values);
831 else if(bprop->defaultarray)
832 memcpy(values, bprop->defaultarray, sizeof(int)*prop->arraylength);
834 memset(values, 0, sizeof(int)*prop->arraylength);
837 int RNA_property_boolean_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
839 int tmp[RNA_MAX_ARRAY];
841 RNA_property_boolean_get_array(ptr, prop, tmp);
845 void RNA_property_boolean_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *values)
847 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
850 if((idprop=rna_idproperty_check(&prop, ptr))) {
851 if(prop->arraylength == 0)
852 IDP_Int(idprop)= values[0];
854 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);
856 else if(prop->arraylength == 0)
857 RNA_property_boolean_set(ptr, prop, values[0]);
858 else if(bprop->setarray)
859 bprop->setarray(ptr, values);
860 else if(prop->flag & PROP_EDITABLE) {
861 IDPropertyTemplate val = {0};
864 val.array.len= prop->arraylength;
865 val.array.type= IDP_INT;
867 group= RNA_struct_idproperties(ptr, 1);
869 idprop= IDP_New(IDP_ARRAY, val, (char*)prop->identifier);
870 IDP_AddToGroup(group, idprop);
871 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);
876 void RNA_property_boolean_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, int value)
878 int tmp[RNA_MAX_ARRAY];
880 RNA_property_boolean_get_array(ptr, prop, tmp);
882 RNA_property_boolean_set_array(ptr, prop, tmp);
885 int RNA_property_int_get(PointerRNA *ptr, PropertyRNA *prop)
887 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
890 if((idprop=rna_idproperty_check(&prop, ptr)))
891 return IDP_Int(idprop);
893 return iprop->get(ptr);
895 return iprop->defaultvalue;
898 void RNA_property_int_set(PointerRNA *ptr, PropertyRNA *prop, int value)
900 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
903 if((idprop=rna_idproperty_check(&prop, ptr)))
904 IDP_Int(idprop)= value;
906 iprop->set(ptr, value);
907 else if(prop->flag & PROP_EDITABLE) {
908 IDPropertyTemplate val = {0};
913 group= RNA_struct_idproperties(ptr, 1);
915 IDP_AddToGroup(group, IDP_New(IDP_INT, val, (char*)prop->identifier));
919 void RNA_property_int_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values)
921 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
924 if((idprop=rna_idproperty_check(&prop, ptr))) {
925 if(prop->arraylength == 0)
926 values[0]= RNA_property_int_get(ptr, prop);
928 memcpy(values, IDP_Array(idprop), sizeof(int)*idprop->len);
930 else if(prop->arraylength == 0)
931 values[0]= RNA_property_int_get(ptr, prop);
932 else if(iprop->getarray)
933 iprop->getarray(ptr, values);
934 else if(iprop->defaultarray)
935 memcpy(values, iprop->defaultarray, sizeof(int)*prop->arraylength);
937 memset(values, 0, sizeof(int)*prop->arraylength);
940 int RNA_property_int_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
942 int tmp[RNA_MAX_ARRAY];
944 RNA_property_int_get_array(ptr, prop, tmp);
948 void RNA_property_int_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *values)
950 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
953 if((idprop=rna_idproperty_check(&prop, ptr))) {
954 if(prop->arraylength == 0)
955 IDP_Int(idprop)= values[0];
957 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);\
959 else if(prop->arraylength == 0)
960 RNA_property_int_set(ptr, prop, values[0]);
961 else if(iprop->setarray)
962 iprop->setarray(ptr, values);
963 else if(prop->flag & PROP_EDITABLE) {
964 IDPropertyTemplate val = {0};
967 val.array.len= prop->arraylength;
968 val.array.type= IDP_INT;
970 group= RNA_struct_idproperties(ptr, 1);
972 idprop= IDP_New(IDP_ARRAY, val, (char*)prop->identifier);
973 IDP_AddToGroup(group, idprop);
974 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);
979 void RNA_property_int_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, int value)
981 int tmp[RNA_MAX_ARRAY];
983 RNA_property_int_get_array(ptr, prop, tmp);
985 RNA_property_int_set_array(ptr, prop, tmp);
988 float RNA_property_float_get(PointerRNA *ptr, PropertyRNA *prop)
990 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
993 if((idprop=rna_idproperty_check(&prop, ptr))) {
994 if(idprop->type == IDP_FLOAT)
995 return IDP_Float(idprop);
997 return (float)IDP_Double(idprop);
1000 return fprop->get(ptr);
1002 return fprop->defaultvalue;
1005 void RNA_property_float_set(PointerRNA *ptr, PropertyRNA *prop, float value)
1007 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
1010 if((idprop=rna_idproperty_check(&prop, ptr))) {
1011 if(idprop->type == IDP_FLOAT)
1012 IDP_Float(idprop)= value;
1014 IDP_Double(idprop)= value;
1016 else if(fprop->set) {
1017 fprop->set(ptr, value);
1019 else if(prop->flag & PROP_EDITABLE) {
1020 IDPropertyTemplate val = {0};
1025 group= RNA_struct_idproperties(ptr, 1);
1027 IDP_AddToGroup(group, IDP_New(IDP_FLOAT, val, (char*)prop->identifier));
1031 void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *values)
1033 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
1037 if((idprop=rna_idproperty_check(&prop, ptr))) {
1038 if(prop->arraylength == 0)
1039 values[0]= RNA_property_float_get(ptr, prop);
1040 else if(idprop->subtype == IDP_FLOAT) {
1041 memcpy(values, IDP_Array(idprop), sizeof(float)*idprop->len);
1044 for(i=0; i<idprop->len; i++)
1045 values[i]= (float)(((double*)IDP_Array(idprop))[i]);
1048 else if(prop->arraylength == 0)
1049 values[0]= RNA_property_float_get(ptr, prop);
1050 else if(fprop->getarray)
1051 fprop->getarray(ptr, values);
1052 else if(fprop->defaultarray)
1053 memcpy(values, fprop->defaultarray, sizeof(float)*prop->arraylength);
1055 memset(values, 0, sizeof(float)*prop->arraylength);
1058 float RNA_property_float_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
1060 float tmp[RNA_MAX_ARRAY];
1062 RNA_property_float_get_array(ptr, prop, tmp);
1066 void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const float *values)
1068 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
1072 if((idprop=rna_idproperty_check(&prop, ptr))) {
1073 if(prop->arraylength == 0)
1074 IDP_Double(idprop)= values[0];
1075 else if(idprop->subtype == IDP_FLOAT) {
1076 memcpy(IDP_Array(idprop), values, sizeof(float)*idprop->len);
1079 for(i=0; i<idprop->len; i++)
1080 ((double*)IDP_Array(idprop))[i]= values[i];
1083 else if(prop->arraylength == 0)
1084 RNA_property_float_set(ptr, prop, values[0]);
1085 else if(fprop->setarray) {
1086 fprop->setarray(ptr, values);
1088 else if(prop->flag & PROP_EDITABLE) {
1089 IDPropertyTemplate val = {0};
1092 val.array.len= prop->arraylength;
1093 val.array.type= IDP_FLOAT;
1095 group= RNA_struct_idproperties(ptr, 1);
1097 idprop= IDP_New(IDP_ARRAY, val, (char*)prop->identifier);
1098 IDP_AddToGroup(group, idprop);
1099 memcpy(IDP_Array(idprop), values, sizeof(float)*idprop->len);
1104 void RNA_property_float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, float value)
1106 float tmp[RNA_MAX_ARRAY];
1108 RNA_property_float_get_array(ptr, prop, tmp);
1110 RNA_property_float_set_array(ptr, prop, tmp);
1113 void RNA_property_string_get(PointerRNA *ptr, PropertyRNA *prop, char *value)
1115 StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
1118 if((idprop=rna_idproperty_check(&prop, ptr)))
1119 strcpy(value, IDP_String(idprop));
1121 sprop->get(ptr, value);
1123 strcpy(value, sprop->defaultvalue);
1126 char *RNA_property_string_get_alloc(PointerRNA *ptr, PropertyRNA *prop, char *fixedbuf, int fixedlen)
1131 length= RNA_property_string_length(ptr, prop);
1133 if(length+1 < fixedlen)
1136 buf= MEM_callocN(sizeof(char)*(length+1), "RNA_string_get_alloc");
1138 RNA_property_string_get(ptr, prop, buf);
1143 int RNA_property_string_length(PointerRNA *ptr, PropertyRNA *prop)
1145 StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
1148 if((idprop=rna_idproperty_check(&prop, ptr)))
1149 return strlen(IDP_String(idprop));
1150 else if(sprop->length)
1151 return sprop->length(ptr);
1153 return strlen(sprop->defaultvalue);
1156 void RNA_property_string_set(PointerRNA *ptr, PropertyRNA *prop, const char *value)
1158 StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
1161 if((idprop=rna_idproperty_check(&prop, ptr)))
1162 IDP_AssignString(idprop, (char*)value);
1164 sprop->set(ptr, value);
1165 else if(prop->flag & PROP_EDITABLE) {
1166 IDPropertyTemplate val = {0};
1169 val.str= (char*)value;
1171 group= RNA_struct_idproperties(ptr, 1);
1173 IDP_AddToGroup(group, IDP_New(IDP_STRING, val, (char*)prop->identifier));
1177 int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
1179 EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
1182 if((idprop=rna_idproperty_check(&prop, ptr)))
1183 return IDP_Int(idprop);
1185 return eprop->get(ptr);
1187 return eprop->defaultvalue;
1191 void RNA_property_enum_set(PointerRNA *ptr, PropertyRNA *prop, int value)
1193 EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
1196 if((idprop=rna_idproperty_check(&prop, ptr)))
1197 IDP_Int(idprop)= value;
1198 else if(eprop->set) {
1199 eprop->set(ptr, value);
1201 else if(prop->flag & PROP_EDITABLE) {
1202 IDPropertyTemplate val = {0};
1207 group= RNA_struct_idproperties(ptr, 1);
1209 IDP_AddToGroup(group, IDP_New(IDP_INT, val, (char*)prop->identifier));
1213 PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop)
1215 PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
1218 if((idprop=rna_idproperty_check(&prop, ptr))) {
1219 pprop= (PointerPropertyRNA*)prop;
1221 /* for groups, data is idprop itself */
1222 return rna_pointer_inherit_refine(ptr, pprop->type, idprop);
1224 else if(pprop->get) {
1225 return pprop->get(ptr);
1229 memset(&result, 0, sizeof(result));
1234 void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr_value)
1236 PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
1239 pprop->set(ptr, ptr_value);
1242 void RNA_property_pointer_add(PointerRNA *ptr, PropertyRNA *prop)
1246 if((idprop=rna_idproperty_check(&prop, ptr))) {
1247 /* already exists */
1249 else if(prop->flag & PROP_IDPROPERTY) {
1250 IDPropertyTemplate val = {0};
1255 group= RNA_struct_idproperties(ptr, 1);
1257 IDP_AddToGroup(group, IDP_New(IDP_GROUP, val, (char*)prop->identifier));
1260 printf("RNA_property_pointer_add %s.%s: only supported for id properties.\n", ptr->type->identifier, prop->identifier);
1263 void RNA_property_pointer_remove(PointerRNA *ptr, PropertyRNA *prop)
1265 IDProperty *idprop, *group;
1267 if((idprop=rna_idproperty_check(&prop, ptr))) {
1268 group= RNA_struct_idproperties(ptr, 0);
1271 IDP_RemFromGroup(group, idprop);
1272 IDP_FreeProperty(idprop);
1277 printf("RNA_property_pointer_remove %s.%s: only supported for id properties.\n", ptr->type->identifier, prop->identifier);
1280 static void rna_property_collection_get_idp(CollectionPropertyIterator *iter)
1282 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)iter->prop;
1284 iter->ptr.data= rna_iterator_array_get(iter);
1285 iter->ptr.type= cprop->type;
1286 rna_pointer_inherit_id(cprop->type, &iter->parent, &iter->ptr);
1289 void RNA_property_collection_begin(PointerRNA *ptr, PropertyRNA *prop, CollectionPropertyIterator *iter)
1293 memset(iter, 0, sizeof(*iter));
1295 if((idprop=rna_idproperty_check(&prop, ptr)) || (prop->flag & PROP_IDPROPERTY)) {
1300 rna_iterator_array_begin(iter, IDP_IDPArray(idprop), sizeof(IDProperty), idprop->len, NULL);
1302 rna_iterator_array_begin(iter, NULL, sizeof(IDProperty), 0, NULL);
1305 rna_property_collection_get_idp(iter);
1310 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1311 cprop->begin(iter, ptr);
1315 void RNA_property_collection_next(CollectionPropertyIterator *iter)
1317 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)iter->prop;
1320 rna_iterator_array_next(iter);
1323 rna_property_collection_get_idp(iter);
1329 void RNA_property_collection_end(CollectionPropertyIterator *iter)
1331 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)iter->prop;
1334 rna_iterator_array_end(iter);
1339 int RNA_property_collection_length(PointerRNA *ptr, PropertyRNA *prop)
1341 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1344 if((idprop=rna_idproperty_check(&prop, ptr))) {
1347 else if(cprop->length) {
1348 return cprop->length(ptr);
1351 CollectionPropertyIterator iter;
1354 RNA_property_collection_begin(ptr, prop, &iter);
1355 for(; iter.valid; RNA_property_collection_next(&iter))
1357 RNA_property_collection_end(&iter);
1363 void RNA_property_collection_add(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *r_ptr)
1366 //CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1368 if((idprop=rna_idproperty_check(&prop, ptr))) {
1369 IDPropertyTemplate val = {0};
1372 item= IDP_New(IDP_GROUP, val, "");
1373 IDP_AppendArray(idprop, item);
1374 IDP_FreeProperty(item);
1377 else if(prop->flag & PROP_IDPROPERTY) {
1378 IDProperty *group, *item;
1379 IDPropertyTemplate val = {0};
1381 group= RNA_struct_idproperties(ptr, 1);
1383 idprop= IDP_NewIDPArray(prop->identifier);
1384 IDP_AddToGroup(group, idprop);
1386 item= IDP_New(IDP_GROUP, val, "");
1387 IDP_AppendArray(idprop, item);
1388 IDP_FreeProperty(item);
1393 else if(cprop->add){
1394 if(!(cprop->add->flag & FUNC_USE_CONTEXT)) { /* XXX check for this somewhere else */
1395 ParameterList *params= RNA_parameter_list_create(ptr, cprop->add);
1396 RNA_function_call(NULL, NULL, ptr, cprop->add, params);
1397 RNA_parameter_list_free(params);
1402 printf("RNA_property_collection_add %s.%s: not implemented for this property.\n", ptr->type->identifier, prop->identifier);
1406 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1408 r_ptr->data= IDP_GetIndexArray(idprop, idprop->len-1);
1409 r_ptr->type= cprop->type;
1410 rna_pointer_inherit_id(NULL, ptr, r_ptr);
1413 memset(r_ptr, 0, sizeof(*r_ptr));
1417 void RNA_property_collection_remove(PointerRNA *ptr, PropertyRNA *prop, int key)
1420 //CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1422 if((idprop=rna_idproperty_check(&prop, ptr))) {
1423 IDProperty tmp, *array;
1427 array= IDP_IDPArray(idprop);
1429 if(key >= 0 && key < len) {
1431 /* move element to be removed to the back */
1432 memcpy(&tmp, &array[key], sizeof(IDProperty));
1433 memmove(array+key, array+key+1, sizeof(IDProperty)*(len-key+1));
1434 memcpy(&array[len-1], &tmp, sizeof(IDProperty));
1437 IDP_ResizeIDPArray(idprop, len-1);
1440 else if(prop->flag & PROP_IDPROPERTY);
1442 else if(cprop->remove){
1443 if(!(cprop->remove->flag & FUNC_USE_CONTEXT)) { /* XXX check for this somewhere else */
1444 ParameterList *params= RNA_parameter_list_create(ptr, cprop->remove);
1445 RNA_function_call(NULL, NULL, ptr, cprop->remove, params);
1446 RNA_parameter_list_free(params);
1451 printf("RNA_property_collection_remove %s.%s: only supported for id properties.\n", ptr->type->identifier, prop->identifier);
1454 void RNA_property_collection_clear(PointerRNA *ptr, PropertyRNA *prop)
1458 if((idprop=rna_idproperty_check(&prop, ptr)))
1459 IDP_ResizeIDPArray(idprop, 0);
1462 int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int key, PointerRNA *r_ptr)
1464 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1466 if(cprop->lookupint) {
1467 /* we have a callback defined, use it */
1468 *r_ptr= cprop->lookupint(ptr, key);
1469 return (r_ptr->data != NULL);
1472 /* no callback defined, just iterate and find the nth item */
1473 CollectionPropertyIterator iter;
1476 RNA_property_collection_begin(ptr, prop, &iter);
1477 for(i=0; iter.valid; RNA_property_collection_next(&iter), i++) {
1483 RNA_property_collection_end(&iter);
1486 memset(r_ptr, 0, sizeof(*r_ptr));
1492 int RNA_property_collection_lookup_string(PointerRNA *ptr, PropertyRNA *prop, const char *key, PointerRNA *r_ptr)
1494 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1496 if(cprop->lookupstring) {
1497 /* we have a callback defined, use it */
1498 *r_ptr= cprop->lookupstring(ptr, key);
1499 return (r_ptr->data != NULL);
1502 /* no callback defined, compare with name properties if they exist */
1503 CollectionPropertyIterator iter;
1504 PropertyRNA *nameprop;
1505 char name[256], *nameptr;
1508 RNA_property_collection_begin(ptr, prop, &iter);
1509 for(; iter.valid; RNA_property_collection_next(&iter)) {
1510 if(iter.ptr.data && iter.ptr.type->nameproperty) {
1511 nameprop= iter.ptr.type->nameproperty;
1513 nameptr= RNA_property_string_get_alloc(&iter.ptr, nameprop, name, sizeof(name));
1515 if(strcmp(nameptr, key) == 0) {
1520 if((char *)&name != nameptr)
1527 RNA_property_collection_end(&iter);
1530 memset(r_ptr, 0, sizeof(*r_ptr));
1536 /* Standard iterator functions */
1538 void rna_iterator_listbase_begin(CollectionPropertyIterator *iter, ListBase *lb, IteratorSkipFunc skip)
1540 ListBaseIterator *internal;
1542 internal= MEM_callocN(sizeof(ListBaseIterator), "ListBaseIterator");
1543 internal->link= (lb)? lb->first: NULL;
1544 internal->skip= skip;
1546 iter->internal= internal;
1547 iter->valid= (internal->link != NULL);
1549 if(skip && iter->valid && skip(iter, internal->link))
1550 rna_iterator_listbase_next(iter);
1553 void rna_iterator_listbase_next(CollectionPropertyIterator *iter)
1555 ListBaseIterator *internal= iter->internal;
1557 if(internal->skip) {
1559 internal->link= internal->link->next;
1560 iter->valid= (internal->link != NULL);
1561 } while(iter->valid && internal->skip(iter, internal->link));
1564 internal->link= internal->link->next;
1565 iter->valid= (internal->link != NULL);
1569 void *rna_iterator_listbase_get(CollectionPropertyIterator *iter)
1571 ListBaseIterator *internal= iter->internal;
1573 return internal->link;
1576 void rna_iterator_listbase_end(CollectionPropertyIterator *iter)
1578 MEM_freeN(iter->internal);
1579 iter->internal= NULL;
1582 void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int itemsize, int length, IteratorSkipFunc skip)
1584 ArrayIterator *internal;
1589 internal= MEM_callocN(sizeof(ArrayIterator), "ArrayIterator");
1591 internal->endptr= ((char*)ptr)+length*itemsize;
1592 internal->itemsize= itemsize;
1593 internal->skip= skip;
1595 iter->internal= internal;
1596 iter->valid= (internal->ptr != internal->endptr);
1598 if(skip && iter->valid && skip(iter, internal->ptr))
1599 rna_iterator_array_next(iter);
1602 void rna_iterator_array_next(CollectionPropertyIterator *iter)
1604 ArrayIterator *internal= iter->internal;
1606 if(internal->skip) {
1608 internal->ptr += internal->itemsize;
1609 iter->valid= (internal->ptr != internal->endptr);
1610 } while(iter->valid && internal->skip(iter, internal->ptr));
1613 internal->ptr += internal->itemsize;
1614 iter->valid= (internal->ptr != internal->endptr);
1618 void *rna_iterator_array_get(CollectionPropertyIterator *iter)
1620 ArrayIterator *internal= iter->internal;
1622 return internal->ptr;
1625 void *rna_iterator_array_dereference_get(CollectionPropertyIterator *iter)
1627 ArrayIterator *internal= iter->internal;
1630 return *(void**)(internal->ptr);
1633 void rna_iterator_array_end(CollectionPropertyIterator *iter)
1635 MEM_freeN(iter->internal);
1636 iter->internal= NULL;
1639 /* RNA Path - Experiment */
1641 static char *rna_path_token(const char **path, char *fixedbuf, int fixedlen, int bracket)
1645 int i, j, len, escape;
1650 /* get data between [], check escaping ] with \] */
1651 if(**path == '[') (*path)++;
1657 while(*p && (*p != ']' || escape)) {
1658 escape= (*p == '\\');
1663 if(*p != ']') return NULL;
1666 /* get data until . or [ */
1669 while(*p && *p != '.' && *p != '[') {
1679 /* try to use fixed buffer if possible */
1680 if(len+1 < fixedlen)
1683 buf= MEM_callocN(sizeof(char)*(len+1), "rna_path_token");
1685 /* copy string, taking into account escaped ] */
1687 for(p=*path, i=0, j=0; i<len; i++, p++) {
1688 if(*p == '\\' && *(p+1) == ']');
1695 memcpy(buf, *path, sizeof(char)*len);
1699 /* set path to start of next token */
1707 int RNA_path_resolve(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)
1710 PointerRNA curptr, nextptr;
1711 char fixedbuf[256], *token;
1718 /* look up property name in current struct */
1719 token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 0);
1724 prop= RNA_struct_find_property(&curptr, token);
1726 if(token != fixedbuf)
1732 /* now look up the value of this property if it is a pointer or
1733 * collection, otherwise return the property rna so that the
1734 * caller can read the value of the property itself */
1735 if(RNA_property_type(prop) == PROP_POINTER) {
1736 nextptr= RNA_property_pointer_get(&curptr, prop);
1743 else if(RNA_property_type(prop) == PROP_COLLECTION && *path) {
1744 /* resolve the lookup with [] brackets */
1745 token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 1);
1752 /* check for "" to see if it is a string */
1753 if(len >= 2 && token[0] == '"' && token[len-1] == '"') {
1756 RNA_property_collection_lookup_string(&curptr, prop, token+1, &nextptr);
1759 /* otherwise do int lookup */
1760 intkey= atoi(token);
1761 RNA_property_collection_lookup_int(&curptr, prop, intkey, &nextptr);
1764 if(token != fixedbuf)
1780 char *RNA_path_append(const char *path, PointerRNA *ptr, PropertyRNA *prop, int intkey, const char *strkey)
1784 char appendstr[128], *result;
1786 dynstr= BLI_dynstr_new();
1788 /* add .identifier */
1790 BLI_dynstr_append(dynstr, (char*)path);
1792 BLI_dynstr_append(dynstr, ".");
1795 BLI_dynstr_append(dynstr, (char*)RNA_property_identifier(prop));
1797 if(RNA_property_type(prop) == PROP_COLLECTION) {
1798 /* add ["strkey"] or [intkey] */
1799 BLI_dynstr_append(dynstr, "[");
1802 BLI_dynstr_append(dynstr, "\"");
1803 for(s=strkey; *s; s++) {
1813 BLI_dynstr_append(dynstr, appendstr);
1815 BLI_dynstr_append(dynstr, "\"");
1818 sprintf(appendstr, "%d", intkey);
1819 BLI_dynstr_append(dynstr, appendstr);
1822 BLI_dynstr_append(dynstr, "]");
1825 result= BLI_dynstr_get_cstring(dynstr);
1826 BLI_dynstr_free(dynstr);
1831 char *RNA_path_back(const char *path)
1834 const char *previous, *current;
1835 char *result, *token;
1844 /* parse token by token until the end, then we back up to the previous
1845 * position and strip of the next token to get the path one step back */
1847 token= rna_path_token(¤t, fixedbuf, sizeof(fixedbuf), 0);
1851 if(token != fixedbuf)
1854 /* in case of collection we also need to strip off [] */
1855 token= rna_path_token(¤t, fixedbuf, sizeof(fixedbuf), 1);
1856 if(token && token != fixedbuf)
1868 /* copy and strip off last token */
1870 result= BLI_strdup(path);
1872 if(i > 0 && result[i-1] == '.') i--;
1878 char *RNA_path_from_ID_to_property(PointerRNA *ptr, PropertyRNA *prop)
1880 char *ptrpath=NULL, *path;
1881 const char *propname;
1883 if(!ptr->id.data || !ptr->data || !prop)
1886 if(!RNA_struct_is_ID(ptr->type)) {
1887 if(ptr->type->path) {
1888 /* if type has a path to some ID, use it */
1889 ptrpath= ptr->type->path(ptr);
1891 else if(ptr->type->nested) {
1892 PointerRNA parentptr;
1893 PropertyRNA *userprop;
1895 /* find the property in the struct we're nested in that references this struct, and
1896 * use its identifier as the first part of the path used...
1898 RNA_pointer_create(ptr->id.data, ptr->type->nested, ptr->data, &parentptr);
1899 userprop= RNA_struct_find_nested(&parentptr, ptr->type);
1902 ptrpath= BLI_strdup(RNA_property_identifier(userprop));
1904 return NULL; // can't do anything about this case yet...
1910 propname= RNA_property_identifier(prop);
1913 path= BLI_sprintfN("%s.%s", ptrpath, propname);
1917 path= BLI_strdup(propname);
1922 /* Quick name based property access */
1924 int RNA_boolean_get(PointerRNA *ptr, const char *name)
1926 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1929 return RNA_property_boolean_get(ptr, prop);
1932 printf("RNA_boolean_get: %s.%s not found.\n", ptr->type->identifier, name);
1937 void RNA_boolean_set(PointerRNA *ptr, const char *name, int value)
1939 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1942 RNA_property_boolean_set(ptr, prop, value);
1944 printf("RNA_boolean_set: %s.%s not found.\n", ptr->type->identifier, name);
1947 void RNA_boolean_get_array(PointerRNA *ptr, const char *name, int *values)
1949 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1952 RNA_property_boolean_get_array(ptr, prop, values);
1954 printf("RNA_boolean_get_array: %s.%s not found.\n", ptr->type->identifier, name);
1957 void RNA_boolean_set_array(PointerRNA *ptr, const char *name, const int *values)
1959 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1962 RNA_property_boolean_set_array(ptr, prop, values);
1964 printf("RNA_boolean_set_array: %s.%s not found.\n", ptr->type->identifier, name);
1967 int RNA_int_get(PointerRNA *ptr, const char *name)
1969 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1972 return RNA_property_int_get(ptr, prop);
1975 printf("RNA_int_get: %s.%s not found.\n", ptr->type->identifier, name);
1980 void RNA_int_set(PointerRNA *ptr, const char *name, int value)
1982 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1985 RNA_property_int_set(ptr, prop, value);
1987 printf("RNA_int_set: %s.%s not found.\n", ptr->type->identifier, name);
1990 void RNA_int_get_array(PointerRNA *ptr, const char *name, int *values)
1992 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
1995 RNA_property_int_get_array(ptr, prop, values);
1997 printf("RNA_int_get_array: %s.%s not found.\n", ptr->type->identifier, name);
2000 void RNA_int_set_array(PointerRNA *ptr, const char *name, const int *values)
2002 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2005 RNA_property_int_set_array(ptr, prop, values);
2007 printf("RNA_int_set_array: %s.%s not found.\n", ptr->type->identifier, name);
2010 float RNA_float_get(PointerRNA *ptr, const char *name)
2012 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2015 return RNA_property_float_get(ptr, prop);
2018 printf("RNA_float_get: %s.%s not found.\n", ptr->type->identifier, name);
2023 void RNA_float_set(PointerRNA *ptr, const char *name, float value)
2025 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2028 RNA_property_float_set(ptr, prop, value);
2030 printf("RNA_float_set: %s.%s not found.\n", ptr->type->identifier, name);
2033 void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
2035 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2038 RNA_property_float_get_array(ptr, prop, values);
2040 printf("RNA_float_get_array: %s.%s not found.\n", ptr->type->identifier, name);
2043 void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
2045 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2048 RNA_property_float_set_array(ptr, prop, values);
2050 printf("RNA_float_set_array: %s.%s not found.\n", ptr->type->identifier, name);
2053 int RNA_enum_get(PointerRNA *ptr, const char *name)
2055 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2058 return RNA_property_enum_get(ptr, prop);
2061 printf("RNA_enum_get: %s.%s not found.\n", ptr->type->identifier, name);
2066 void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
2068 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2071 RNA_property_enum_set(ptr, prop, value);
2073 printf("RNA_enum_set: %s.%s not found.\n", ptr->type->identifier, name);
2076 int RNA_enum_is_equal(PointerRNA *ptr, const char *name, const char *enumname)
2078 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2079 const EnumPropertyItem *item;
2082 RNA_property_enum_items(ptr, prop, &item, NULL);
2084 for(; item->identifier; item++)
2085 if(strcmp(item->identifier, enumname) == 0)
2086 return (item->value == RNA_property_enum_get(ptr, prop));
2088 printf("RNA_enum_is_equal: %s.%s item %s not found.\n", ptr->type->identifier, name, enumname);
2092 printf("RNA_enum_is_equal: %s.%s not found.\n", ptr->type->identifier, name);
2097 int RNA_enum_value_from_id(const EnumPropertyItem *item, const char *identifier, int *value)
2099 for( ; item->identifier; item++) {
2100 if(strcmp(item->identifier, identifier)==0) {
2101 *value= item->value;
2109 int RNA_enum_id_from_value(const EnumPropertyItem *item, int value, const char **identifier)
2111 for( ; item->identifier; item++) {
2112 if(item->value==value) {
2113 *identifier= item->identifier;
2123 void RNA_string_get(PointerRNA *ptr, const char *name, char *value)
2125 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2128 RNA_property_string_get(ptr, prop, value);
2130 printf("RNA_string_get: %s.%s not found.\n", ptr->type->identifier, name);
2133 char *RNA_string_get_alloc(PointerRNA *ptr, const char *name, char *fixedbuf, int fixedlen)
2135 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2138 return RNA_property_string_get_alloc(ptr, prop, fixedbuf, fixedlen);
2141 printf("RNA_string_get_alloc: %s.%s not found.\n", ptr->type->identifier, name);
2146 int RNA_string_length(PointerRNA *ptr, const char *name)
2148 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2151 return RNA_property_string_length(ptr, prop);
2154 printf("RNA_string_length: %s.%s not found.\n", ptr->type->identifier, name);
2159 void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
2161 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2164 RNA_property_string_set(ptr, prop, value);
2166 printf("RNA_string_set: %s.%s not found.\n", ptr->type->identifier, name);
2169 PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
2171 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2174 return RNA_property_pointer_get(ptr, prop);
2179 printf("RNA_pointer_get: %s.%s not found.\n", ptr->type->identifier, name);
2181 memset(&result, 0, sizeof(result));
2186 void RNA_pointer_add(PointerRNA *ptr, const char *name)
2188 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2191 RNA_property_pointer_add(ptr, prop);
2193 printf("RNA_pointer_set: %s.%s not found.\n", ptr->type->identifier, name);
2196 void RNA_collection_begin(PointerRNA *ptr, const char *name, CollectionPropertyIterator *iter)
2198 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2201 RNA_property_collection_begin(ptr, prop, iter);
2203 printf("RNA_collection_begin: %s.%s not found.\n", ptr->type->identifier, name);
2206 void RNA_collection_add(PointerRNA *ptr, const char *name, PointerRNA *r_value)
2208 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2211 RNA_property_collection_add(ptr, prop, r_value);
2213 printf("RNA_collection_add: %s.%s not found.\n", ptr->type->identifier, name);
2216 void RNA_collection_clear(PointerRNA *ptr, const char *name)
2218 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2221 RNA_property_collection_clear(ptr, prop);
2223 printf("RNA_collection_clear: %s.%s not found.\n", ptr->type->identifier, name);
2226 int RNA_collection_length(PointerRNA *ptr, const char *name)
2228 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2231 return RNA_property_collection_length(ptr, prop);
2234 printf("RNA_collection_length: %s.%s not found.\n", ptr->type->identifier, name);
2239 int RNA_property_is_set(PointerRNA *ptr, const char *name)
2241 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2244 return (rna_idproperty_find(ptr, name) != NULL);
2247 printf("RNA_property_is_set: %s.%s not found.\n", ptr->type->identifier, name);
2252 /* string representation of a property, python
2253 * compatible but can be used for display too*/
2254 char *RNA_pointer_as_string(PointerRNA *ptr)
2256 DynStr *dynstr= BLI_dynstr_new();
2259 PropertyRNA *prop, *iterprop;
2260 CollectionPropertyIterator iter;
2261 const char *propname;
2264 BLI_dynstr_append(dynstr, "{");
2266 iterprop= RNA_struct_iterator_property(ptr->type);
2268 for(RNA_property_collection_begin(ptr, iterprop, &iter); iter.valid; RNA_property_collection_next(&iter)) {
2269 prop= iter.ptr.data;
2270 propname = RNA_property_identifier(prop);
2272 if(strcmp(propname, "rna_type")==0)
2276 BLI_dynstr_append(dynstr, ", ");
2279 cstring = RNA_property_as_string(ptr, prop);
2280 BLI_dynstr_appendf(dynstr, "\"%s\":%s", propname, cstring);
2284 RNA_property_collection_end(&iter);
2285 BLI_dynstr_append(dynstr, "}");
2288 cstring = BLI_dynstr_get_cstring(dynstr);
2289 BLI_dynstr_free(dynstr);
2293 char *RNA_property_as_string(PointerRNA *ptr, PropertyRNA *prop)
2295 int type = RNA_property_type(prop);
2296 int len = RNA_property_array_length(prop);
2299 DynStr *dynstr= BLI_dynstr_new();
2303 /* see if we can coorce into a python type - PropertyType */
2307 BLI_dynstr_append(dynstr, RNA_property_boolean_get(ptr, prop) ? "True" : "False");
2310 BLI_dynstr_append(dynstr, "(");
2311 for(i=0; i<len; i++) {
2312 BLI_dynstr_appendf(dynstr, i?", %s":"%s", RNA_property_boolean_get_index(ptr, prop, i) ? "True" : "False");
2314 BLI_dynstr_append(dynstr, ")");
2319 BLI_dynstr_appendf(dynstr, "%d", RNA_property_int_get(ptr, prop));
2322 BLI_dynstr_append(dynstr, "(");
2323 for(i=0; i<len; i++) {
2324 BLI_dynstr_appendf(dynstr, i?", %d":"%d", RNA_property_int_get_index(ptr, prop, i));
2326 BLI_dynstr_append(dynstr, ")");
2331 BLI_dynstr_appendf(dynstr, "%g", RNA_property_float_get(ptr, prop));
2334 BLI_dynstr_append(dynstr, "(");
2335 for(i=0; i<len; i++) {
2336 BLI_dynstr_appendf(dynstr, i?", %g":"%g", RNA_property_float_get_index(ptr, prop, i));
2338 BLI_dynstr_append(dynstr, ")");
2343 /* string arrays dont exist */
2345 buf = RNA_property_string_get_alloc(ptr, prop, NULL, -1);
2346 BLI_dynstr_appendf(dynstr, "\"%s\"", buf);
2352 /* string arrays dont exist */
2353 const char *identifier;
2354 int val = RNA_property_enum_get(ptr, prop);
2356 if(RNA_property_enum_identifier(ptr, prop, val, &identifier)) {
2357 BLI_dynstr_appendf(dynstr, "'%s'", identifier);
2360 BLI_dynstr_appendf(dynstr, "'<UNKNOWN ENUM>'", identifier);
2366 BLI_dynstr_append(dynstr, "'<POINTER>'"); /* TODO */
2369 case PROP_COLLECTION:
2372 CollectionPropertyIterator collect_iter;
2373 BLI_dynstr_append(dynstr, "[");
2375 for(RNA_property_collection_begin(ptr, prop, &collect_iter); collect_iter.valid; RNA_property_collection_next(&collect_iter)) {
2376 PointerRNA itemptr= collect_iter.ptr;
2379 BLI_dynstr_append(dynstr, ", ");
2382 /* now get every prop of the collection */
2383 cstring= RNA_pointer_as_string(&itemptr);
2384 BLI_dynstr_append(dynstr, cstring);
2388 RNA_property_collection_end(&collect_iter);
2389 BLI_dynstr_append(dynstr, "]");
2393 BLI_dynstr_append(dynstr, "'<UNKNOWN TYPE>'"); /* TODO */
2397 cstring = BLI_dynstr_get_cstring(dynstr);
2398 BLI_dynstr_free(dynstr);
2404 const char *RNA_function_identifier(FunctionRNA *func)
2406 return func->identifier;
2409 PropertyRNA *RNA_function_return(FunctionRNA *func)
2414 const char *RNA_function_ui_description(FunctionRNA *func)
2416 return func->description;
2419 int RNA_function_flag(FunctionRNA *func)
2424 PropertyRNA *RNA_function_get_parameter(PointerRNA *ptr, FunctionRNA *func, int index)
2429 parm= func->cont.properties.first;
2430 for(i= 0; parm; parm= parm->next, i++)
2437 PropertyRNA *RNA_function_find_parameter(PointerRNA *ptr, FunctionRNA *func, const char *identifier)
2441 parm= func->cont.properties.first;
2442 for(; parm; parm= parm->next)
2443 if(strcmp(parm->identifier, identifier)==0)
2449 const struct ListBase *RNA_function_defined_parameters(FunctionRNA *func)
2451 return &func->cont.properties;
2456 ParameterList *RNA_parameter_list_create(PointerRNA *ptr, FunctionRNA *func)
2458 ParameterList *parms;
2462 parms= MEM_callocN(sizeof(ParameterList), "ParameterList");
2464 parm= func->cont.properties.first;
2465 for(tot= 0; parm; parm= parm->next)
2466 tot+= rna_parameter_size(parm);
2468 parms->data= MEM_callocN(tot, "RNA_parameter_list_create");
2474 void RNA_parameter_list_free(ParameterList *parms)
2476 MEM_freeN(parms->data);
2484 void RNA_parameter_list_begin(ParameterList *parms, ParameterIterator *iter)
2488 RNA_pointer_create(NULL, &RNA_Function, parms->func, &iter->funcptr);
2491 iter->parm= parms->func->cont.properties.first;
2492 iter->valid= iter->parm != NULL;
2496 iter->size= rna_parameter_size(iter->parm);
2497 iter->data= (((char*)iter->parms->data)+iter->offset);
2498 ptype= RNA_property_type(iter->parm);
2502 void RNA_parameter_list_next(ParameterIterator *iter)
2506 iter->offset+= iter->size;
2507 iter->parm= iter->parm->next;
2508 iter->valid= iter->parm != NULL;
2511 iter->size= rna_parameter_size(iter->parm);
2512 iter->data= (((char*)iter->parms->data)+iter->offset);
2513 ptype= RNA_property_type(iter->parm);
2517 void RNA_parameter_list_end(ParameterIterator *iter)
2522 void RNA_parameter_get(ParameterList *parms, PropertyRNA *parm, void **value)
2524 ParameterIterator iter;
2526 RNA_parameter_list_begin(parms, &iter);
2528 for(; iter.valid; RNA_parameter_list_next(&iter))
2537 RNA_parameter_list_end(&iter);
2540 void RNA_parameter_get_lookup(ParameterList *parms, const char *identifier, void **value)
2544 parm= parms->func->cont.properties.first;
2545 for(; parm; parm= parm->next)
2546 if(strcmp(RNA_property_identifier(parm), identifier)==0)
2550 RNA_parameter_get(parms, parm, value);
2553 void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, void *value)
2555 ParameterIterator iter;
2557 RNA_parameter_list_begin(parms, &iter);
2559 for(; iter.valid; RNA_parameter_list_next(&iter))
2564 memcpy(iter.data, value, iter.size);
2566 RNA_parameter_list_end(&iter);
2569 void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, void *value)
2573 parm= parms->func->cont.properties.first;
2574 for(; parm; parm= parm->next)
2575 if(strcmp(RNA_property_identifier(parm), identifier)==0)
2579 RNA_parameter_set(parms, parm, value);
2582 int RNA_function_call(bContext *C, ReportList *reports, PointerRNA *ptr, FunctionRNA *func, ParameterList *parms)
2585 func->call(C, reports, ptr, parms);
2593 int RNA_function_call_lookup(bContext *C, ReportList *reports, PointerRNA *ptr, const char *identifier, ParameterList *parms)
2597 func= RNA_struct_find_function(ptr, identifier);
2600 return RNA_function_call(C, reports, ptr, func, parms);
2605 int RNA_function_call_direct(bContext *C, ReportList *reports, PointerRNA *ptr, FunctionRNA *func, const char *format, ...)
2610 va_start(args, format);
2612 ret= RNA_function_call_direct_va(C, reports, ptr, func, format, args);
2619 int RNA_function_call_direct_lookup(bContext *C, ReportList *reports, PointerRNA *ptr, const char *identifier, const char *format, ...)
2623 func= RNA_struct_find_function(ptr, identifier);
2629 va_start(args, format);
2631 ret= RNA_function_call_direct_va(C, reports, ptr, func, format, args);
2641 static int rna_function_format_array_length(const char *format, int ofs, int flen)
2646 if (format[ofs++]=='[')
2647 for (; ofs<flen && format[ofs]!=']' && idx<sizeof(*lenbuf)-1; idx++, ofs++)
2648 lenbuf[idx]= format[ofs];
2650 if (ofs<flen && format[ofs++]==']') {
2651 /* XXX put better error reporting for ofs>=flen or idx over lenbuf capacity */
2653 return atoi(lenbuf);
2659 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)
2661 /* ptr is always a function pointer, prop always a parameter */
2667 fprintf(stderr, "%s.%s: wrong type for parameter %s, a boolean was expected\n", tid, fid, pid);
2672 *((int*)dest)= *((int*)src);
2674 memcpy(dest, src, len*sizeof(int));
2681 fprintf(stderr, "%s.%s: wrong type for parameter %s, an integer was expected\n", tid, fid, pid);
2686 *((int*)dest)= *((int*)src);
2688 memcpy(dest, src, len*sizeof(int));
2695 fprintf(stderr, "%s.%s: wrong type for parameter %s, a float was expected\n", tid, fid, pid);
2700 *((float*)dest)= *((float*)src);
2702 memcpy(dest, src, len*sizeof(float));
2709 fprintf(stderr, "%s.%s: wrong type for parameter %s, a string was expected\n", tid, fid, pid);
2713 *((char**)dest)= *((char**)src);
2720 fprintf(stderr, "%s.%s: wrong type for parameter %s, an enum was expected\n", tid, fid, pid);
2724 *((int*)dest)= *((int*)src);
2733 fprintf(stderr, "%s.%s: wrong type for parameter %s, an object was expected\n", tid, fid, pid);
2737 ptype= RNA_property_pointer_type(ptr, prop);
2739 if(prop->flag & PROP_RNAPTR) {
2740 *((PointerRNA*)dest)= *((PointerRNA*)src);
2742 else if (ptype!=srna) {
2743 if (!RNA_struct_is_a(srna, ptype)) {
2744 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(ptype));
2748 *((void**)dest)= *((void**)src);
2753 case PROP_COLLECTION:
2755 /* XXX collections are not supported yet */
2756 fprintf(stderr, "%s.%s: for parameter %s, collections are not supported yet\n", tid, fid, pid);
2762 fprintf(stderr, "%s.%s: unknown type for parameter %s\n", tid, fid, pid);
2764 fprintf(stderr, "%s.%s: unknown array type for parameter %s\n", tid, fid, pid);
2773 int RNA_function_call_direct_va(bContext *C, ReportList *reports, PointerRNA *ptr, FunctionRNA *func, const char *format, va_list args)
2776 ParameterList *parms;
2777 ParameterIterator iter;
2778 PropertyRNA *pret, *parm;
2780 int i, ofs, flen, flag, len, alen, err= 0;
2781 const char *tid, *fid, *pid=NULL;
2783 void **retdata=NULL;
2785 RNA_pointer_create(NULL, &RNA_Function, func, &funcptr);
2787 tid= RNA_struct_identifier(ptr->type);
2788 fid= RNA_function_identifier(func);
2789 pret= RNA_function_return(func);
2790 flen= strlen(format);
2792 parms= RNA_parameter_list_create(ptr, func);
2793 RNA_parameter_list_begin(parms, &iter);
2795 for(i= 0, ofs= 0; iter.valid; RNA_parameter_list_next(&iter), i++) {
2803 pid= RNA_property_identifier(parm);
2804 flag= RNA_property_flag(parm);
2806 if (ofs>=flen || format[ofs]=='N') {
2807 if (flag & PROP_REQUIRED) {
2809 fprintf(stderr, "%s.%s: missing required parameter %s\n", tid, fid, pid);
2816 type= RNA_property_type(parm);
2817 ftype= format[ofs++];
2818 len= RNA_property_array_length(parm);
2819 alen= rna_function_format_array_length(format, ofs, flen);
2823 fprintf(stderr, "%s.%s: for parameter %s, was expecting an array of %i elements, passed %i elements instead\n", tid, fid, pid, len, alen);
2832 int arg= va_arg(args, int);
2833 err= rna_function_parameter_parse(&funcptr, parm, type, ftype, len, iter.data, &arg, NULL, tid, fid, pid);
2838 double arg= va_arg(args, double);
2839 err= rna_function_parameter_parse(&funcptr, parm, type, ftype, len, iter.data, &arg, NULL, tid, fid, pid);
2844 char *arg= va_arg(args, char*);
2845 err= rna_function_parameter_parse(&funcptr, parm, type, ftype, len, iter.data, &arg, NULL, tid, fid, pid);
2850 StructRNA *srna= va_arg(args, StructRNA*);
2851 void *arg= va_arg(args, void*);
2852 err= rna_function_parameter_parse(&funcptr, parm, type, ftype, len, iter.data, &arg, srna, tid, fid, pid);
2858 err= rna_function_parameter_parse(&funcptr, parm, type, ftype, len, iter.data, NULL, NULL, tid, fid, pid);
2868 err= RNA_function_call(C, reports, ptr, func, parms);
2870 /* XXX throw error when more parameters than those needed are passed or leave silent? */
2871 if (err==0 && pret && ofs<flen && format[ofs++]=='R') {
2874 type= RNA_property_type(parm);
2875 ftype= format[ofs++];
2876 len= RNA_property_array_length(parm);
2877 alen= rna_function_format_array_length(format, ofs, flen);
2881 fprintf(stderr, "%s.%s: for return parameter %s, was expecting an array of %i elements, passed %i elements instead\n", tid, fid, pid, len, alen);
2889 int *arg= va_arg(args, int*);
2890 err= rna_function_parameter_parse(&funcptr, parm, type, ftype, len, arg, retdata, NULL, tid, fid, pid);
2895 float *arg= va_arg(args, float*);
2896 err= rna_function_parameter_parse(&funcptr, parm, type, ftype, len, arg, retdata, NULL, tid, fid, pid);
2901 char **arg= va_arg(args, char**);
2902 err= rna_function_parameter_parse(&funcptr, parm, type, ftype, len, arg, retdata, NULL, tid, fid, pid);
2907 StructRNA *srna= va_arg(args, StructRNA*);
2908 void **arg= va_arg(args, void**);
2909 err= rna_function_parameter_parse(&funcptr, parm, type, ftype, len, arg, retdata, srna, tid, fid, pid);
2915 err= rna_function_parameter_parse(&funcptr, parm, type, ftype, len, NULL, NULL, NULL, tid, fid, pid);
2922 RNA_parameter_list_end(&iter);
2923 RNA_parameter_list_free(parms);
2928 int RNA_function_call_direct_va_lookup(bContext *C, ReportList *reports, PointerRNA *ptr, const char *identifier, const char *format, va_list args)
2932 func= RNA_struct_find_function(ptr, identifier);
2935 return RNA_function_call_direct_va(C, reports, ptr, func, format, args);