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"
49 #include "DNA_object_types.h"
50 #include "BKE_depsgraph.h"
53 #include "rna_internal.h"
62 for(srna=BLENDER_RNA.structs.first; srna; srna=srna->cont.next) {
63 if(!srna->cont.prophash) {
64 srna->cont.prophash= BLI_ghash_new(BLI_ghashutil_strhash, BLI_ghashutil_strcmp);
66 for(prop=srna->cont.properties.first; prop; prop=prop->next)
67 if(!(prop->flag & PROP_BUILTIN))
68 BLI_ghash_insert(srna->cont.prophash, (void*)prop->identifier, prop);
77 for(srna=BLENDER_RNA.structs.first; srna; srna=srna->cont.next) {
78 if(srna->cont.prophash) {
79 BLI_ghash_free(srna->cont.prophash, NULL, NULL);
80 srna->cont.prophash= NULL;
84 RNA_free(&BLENDER_RNA);
89 PointerRNA PointerRNA_NULL = {{0}, 0, 0};
91 void RNA_main_pointer_create(struct Main *main, PointerRNA *r_ptr)
94 r_ptr->type= &RNA_Main;
98 void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr)
101 StructRNA *type, *idtype= NULL;
104 memset(&tmp, 0, sizeof(tmp));
106 idtype= rna_ID_refine(&tmp);
108 while(idtype->refine) {
109 type= idtype->refine(&tmp);
123 void RNA_pointer_create(ID *id, StructRNA *type, void *data, PointerRNA *r_ptr)
126 StructRNA *idtype= NULL;
129 memset(&tmp, 0, sizeof(tmp));
131 idtype= rna_ID_refine(&tmp);
139 while(r_ptr->type && r_ptr->type->refine) {
140 StructRNA *rtype= r_ptr->type->refine(r_ptr);
142 if(rtype == r_ptr->type)
150 static void rna_pointer_inherit_id(StructRNA *type, PointerRNA *parent, PointerRNA *ptr)
152 if(type && type->flag & STRUCT_ID) {
153 ptr->id.data= ptr->data;
156 ptr->id.data= parent->id.data;
160 void RNA_blender_rna_pointer_create(PointerRNA *r_ptr)
162 r_ptr->id.data= NULL;
163 r_ptr->type= &RNA_BlenderRNA;
164 r_ptr->data= &BLENDER_RNA;
167 PointerRNA rna_pointer_inherit_refine(PointerRNA *ptr, StructRNA *type, void *data)
174 rna_pointer_inherit_id(type, ptr, &result);
176 while(result.type->refine) {
177 type= result.type->refine(&result);
179 if(type == result.type)
186 memset(&result, 0, sizeof(result));
193 IDProperty *RNA_struct_idproperties(PointerRNA *ptr, int create)
195 StructRNA *type= ptr->type;
197 if(type && type->idproperties)
198 return type->idproperties(ptr, create);
203 int RNA_struct_idproperties_check(PointerRNA *ptr)
205 StructRNA *type= ptr->type;
206 return (type && type->idproperties) ? 1 : 0;
209 static IDProperty *rna_idproperty_find(PointerRNA *ptr, const char *name)
211 IDProperty *group= RNA_struct_idproperties(ptr, 0);
215 for(idprop=group->data.group.first; idprop; idprop=idprop->next)
216 if(strcmp(idprop->name, name) == 0)
223 static int rna_ensure_property_array_length(PointerRNA *ptr, PropertyRNA *prop)
225 if(prop->magic == RNA_MAGIC) {
226 int arraylen[RNA_MAX_ARRAY_DIMENSION];
227 return (prop->getlength)? prop->getlength(ptr, arraylen): prop->totarraylength;
230 IDProperty *idprop= (IDProperty*)prop;
232 if(idprop->type == IDP_ARRAY)
239 static int rna_ensure_property_array_check(PointerRNA *ptr, PropertyRNA *prop)
241 if(prop->magic == RNA_MAGIC) {
242 return (prop->getlength || prop->totarraylength) ? 1:0;
245 IDProperty *idprop= (IDProperty*)prop;
247 return idprop->type == IDP_ARRAY ? 1:0;
251 static void rna_ensure_property_multi_array_length(PointerRNA *ptr, PropertyRNA *prop, int length[])
253 if(prop->magic == RNA_MAGIC) {
255 prop->getlength(ptr, length);
257 memcpy(length, prop->arraylength, prop->arraydimension*sizeof(int));
260 IDProperty *idprop= (IDProperty*)prop;
262 if(idprop->type == IDP_ARRAY)
263 length[0]= idprop->len;
269 static int rna_idproperty_verify_valid(PointerRNA *ptr, PropertyRNA *prop, IDProperty *idprop)
271 /* this verifies if the idproperty actually matches the property
272 * description and otherwise removes it. this is to ensure that
273 * rna property access is type safe, e.g. if you defined the rna
274 * to have a certain array length you can count on that staying so */
276 switch(idprop->type) {
278 if(prop->type != PROP_COLLECTION)
282 if(rna_ensure_property_array_length(ptr, prop) != idprop->len)
285 if(idprop->subtype == IDP_FLOAT && prop->type != PROP_FLOAT)
287 if(idprop->subtype == IDP_INT && !ELEM3(prop->type, PROP_BOOLEAN, PROP_INT, PROP_ENUM))
292 if(!ELEM3(prop->type, PROP_BOOLEAN, PROP_INT, PROP_ENUM))
297 if(prop->type != PROP_FLOAT)
301 if(prop->type != PROP_STRING)
305 if(prop->type != PROP_POINTER)
315 static PropertyRNA *typemap[IDP_NUMTYPES] =
316 {(PropertyRNA*)&rna_IDProperty_string,
317 (PropertyRNA*)&rna_IDProperty_int,
318 (PropertyRNA*)&rna_IDProperty_float,
320 (PropertyRNA*)&rna_IDProperty_group, NULL,
321 (PropertyRNA*)&rna_IDProperty_double};
323 static PropertyRNA *arraytypemap[IDP_NUMTYPES] =
324 {NULL, (PropertyRNA*)&rna_IDProperty_int_array,
325 (PropertyRNA*)&rna_IDProperty_float_array,
327 (PropertyRNA*)&rna_IDProperty_collection, NULL,
328 (PropertyRNA*)&rna_IDProperty_double_array};
330 IDProperty *rna_idproperty_check(PropertyRNA **prop, PointerRNA *ptr)
332 /* This is quite a hack, but avoids some complexity in the API. we
333 * pass IDProperty structs as PropertyRNA pointers to the outside.
334 * We store some bytes in PropertyRNA structs that allows us to
335 * distinguish it from IDProperty structs. If it is an ID property,
336 * we look up an IDP PropertyRNA based on the type, and set the data
337 * pointer to the IDProperty. */
339 if((*prop)->magic == RNA_MAGIC) {
340 if((*prop)->flag & PROP_IDPROPERTY) {
341 IDProperty *idprop= rna_idproperty_find(ptr, (*prop)->identifier);
343 if(idprop && !rna_idproperty_verify_valid(ptr, *prop, idprop)) {
344 IDProperty *group= RNA_struct_idproperties(ptr, 0);
346 IDP_RemFromGroup(group, idprop);
347 IDP_FreeProperty(idprop);
359 IDProperty *idprop= (IDProperty*)(*prop);
361 if(idprop->type == IDP_ARRAY)
362 *prop= arraytypemap[(int)(idprop->subtype)];
364 *prop= typemap[(int)(idprop->type)];
370 static PropertyRNA *rna_ensure_property(PropertyRNA *prop)
372 /* the quick version if we don't need the idproperty */
374 if(prop->magic == RNA_MAGIC)
378 IDProperty *idprop= (IDProperty*)prop;
380 if(idprop->type == IDP_ARRAY)
381 return arraytypemap[(int)(idprop->subtype)];
383 return typemap[(int)(idprop->type)];
387 static const char *rna_ensure_property_identifier(PropertyRNA *prop)
389 if(prop->magic == RNA_MAGIC)
390 return prop->identifier;
392 return ((IDProperty*)prop)->name;
395 static const char *rna_ensure_property_description(PropertyRNA *prop)
397 if(prop->magic == RNA_MAGIC)
398 return prop->description;
400 return ((IDProperty*)prop)->name; /* XXX - not correct */
403 static const char *rna_ensure_property_name(PropertyRNA *prop)
405 if(prop->magic == RNA_MAGIC)
408 return ((IDProperty*)prop)->name;
413 const char *RNA_struct_identifier(StructRNA *type)
415 return type->identifier;
418 const char *RNA_struct_ui_name(StructRNA *type)
423 int RNA_struct_ui_icon(StructRNA *type)
431 const char *RNA_struct_ui_description(StructRNA *type)
433 return type->description;
436 PropertyRNA *RNA_struct_name_property(StructRNA *type)
438 return type->nameproperty;
441 PropertyRNA *RNA_struct_iterator_property(StructRNA *type)
443 return type->iteratorproperty;
446 StructRNA *RNA_struct_base(StructRNA *type)
451 int RNA_struct_is_ID(StructRNA *type)
453 return (type->flag & STRUCT_ID) != 0;
456 int RNA_struct_is_a(StructRNA *type, StructRNA *srna)
463 /* ptr->type is always maximally refined */
464 for(base=type; base; base=base->base)
471 PropertyRNA *RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
473 if(identifier[0]=='[' && identifier[1]=='"') {
474 /* id prop lookup, not so common */
475 PropertyRNA *r_prop= NULL;
476 PointerRNA r_ptr; /* only support single level props */
477 if(RNA_path_resolve(ptr, identifier, &r_ptr, &r_prop) && r_ptr.type==ptr->type && r_ptr.data==ptr->data)
481 /* most common case */
482 PropertyRNA *iterprop= RNA_struct_iterator_property(ptr->type);
485 if(RNA_property_collection_lookup_string(ptr, iterprop, identifier, &propptr))
492 /* Find the property which uses the given nested struct */
493 PropertyRNA *RNA_struct_find_nested(PointerRNA *ptr, StructRNA *srna)
495 PropertyRNA *prop= NULL;
497 RNA_STRUCT_BEGIN(ptr, iprop) {
498 /* This assumes that there can only be one user of this nested struct */
499 if (RNA_property_pointer_type(ptr, iprop) == srna) {
509 const struct ListBase *RNA_struct_defined_properties(StructRNA *srna)
511 return &srna->cont.properties;
514 FunctionRNA *RNA_struct_find_function(PointerRNA *ptr, const char *identifier)
517 PropertyRNA *iterprop;
520 RNA_pointer_create(NULL, &RNA_Struct, ptr->type, &tptr);
521 iterprop= RNA_struct_find_property(&tptr, "functions");
525 RNA_PROP_BEGIN(&tptr, funcptr, iterprop) {
526 if(strcmp(identifier, RNA_function_identifier(funcptr.data)) == 0) {
536 const struct ListBase *RNA_struct_defined_functions(StructRNA *srna)
538 return &srna->functions;
541 StructRegisterFunc RNA_struct_register(StructRNA *type)
546 StructUnregisterFunc RNA_struct_unregister(StructRNA *type)
551 } while((type=type->base));
556 void *RNA_struct_py_type_get(StructRNA *srna)
558 return srna->py_type;
561 void RNA_struct_py_type_set(StructRNA *srna, void *py_type)
563 srna->py_type= py_type;
566 void *RNA_struct_blender_type_get(StructRNA *srna)
568 return srna->blender_type;
571 void RNA_struct_blender_type_set(StructRNA *srna, void *blender_type)
573 srna->blender_type= blender_type;
576 char *RNA_struct_name_get_alloc(PointerRNA *ptr, char *fixedbuf, int fixedlen)
578 PropertyRNA *nameprop;
580 if(ptr->data && (nameprop = RNA_struct_name_property(ptr->type)))
581 return RNA_property_string_get_alloc(ptr, nameprop, fixedbuf, fixedlen);
586 /* Property Information */
588 const char *RNA_property_identifier(PropertyRNA *prop)
590 return rna_ensure_property_identifier(prop);
593 const char *RNA_property_description(PropertyRNA *prop)
595 return rna_ensure_property_description(prop);
598 PropertyType RNA_property_type(PropertyRNA *prop)
600 return rna_ensure_property(prop)->type;
603 PropertySubType RNA_property_subtype(PropertyRNA *prop)
605 return rna_ensure_property(prop)->subtype;
608 PropertyUnit RNA_property_unit(PropertyRNA *prop)
610 return RNA_SUBTYPE_UNIT(rna_ensure_property(prop)->subtype);
613 int RNA_property_flag(PropertyRNA *prop)
615 return rna_ensure_property(prop)->flag;
618 int RNA_property_array_length(PointerRNA *ptr, PropertyRNA *prop)
620 return rna_ensure_property_array_length(ptr, prop);
623 int RNA_property_array_check(PointerRNA *ptr, PropertyRNA *prop)
625 return rna_ensure_property_array_check(ptr, prop);
628 /* used by BPY to make an array from the python object */
629 int RNA_property_array_dimension(PointerRNA *ptr, PropertyRNA *prop, int length[])
631 PropertyRNA *rprop= rna_ensure_property(prop);
633 if(length && rprop->arraydimension > 1)
634 rna_ensure_property_multi_array_length(ptr, prop, length);
636 return rprop->arraydimension;
639 /* Return the size of Nth dimension. */
640 int RNA_property_multi_array_length(PointerRNA *ptr, PropertyRNA *prop, int dim)
642 int len[RNA_MAX_ARRAY_DIMENSION];
644 rna_ensure_property_multi_array_length(ptr, prop, len);
649 char RNA_property_array_item_char(PropertyRNA *prop, int index)
651 const char *vectoritem= "XYZW";
652 const char *quatitem= "WXYZ";
653 const char *coloritem= "RGBA";
654 PropertySubType subtype= rna_ensure_property(prop)->subtype;
656 /* get string to use for array index */
657 if ((index < 4) && ELEM(subtype, PROP_QUATERNION, PROP_AXISANGLE))
658 return quatitem[index];
659 else if((index < 4) && ELEM6(subtype, PROP_TRANSLATION, PROP_DIRECTION, PROP_XYZ, PROP_EULER, PROP_VELOCITY, PROP_ACCELERATION))
660 return vectoritem[index];
661 else if ((index < 4) && ELEM(subtype, PROP_COLOR, PROP_RGB))
662 return coloritem[index];
667 void RNA_property_int_range(PointerRNA *ptr, PropertyRNA *prop, int *hardmin, int *hardmax)
669 IntPropertyRNA *iprop= (IntPropertyRNA*)rna_ensure_property(prop);
672 iprop->range(ptr, hardmin, hardmax);
675 *hardmin= iprop->hardmin;
676 *hardmax= iprop->hardmax;
680 void RNA_property_int_ui_range(PointerRNA *ptr, PropertyRNA *prop, int *softmin, int *softmax, int *step)
682 IntPropertyRNA *iprop= (IntPropertyRNA*)rna_ensure_property(prop);
683 int hardmin, hardmax;
686 iprop->range(ptr, &hardmin, &hardmax);
687 *softmin= MAX2(iprop->softmin, hardmin);
688 *softmax= MIN2(iprop->softmax, hardmax);
691 *softmin= iprop->softmin;
692 *softmax= iprop->softmax;
698 void RNA_property_float_range(PointerRNA *ptr, PropertyRNA *prop, float *hardmin, float *hardmax)
700 FloatPropertyRNA *fprop= (FloatPropertyRNA*)rna_ensure_property(prop);
703 fprop->range(ptr, hardmin, hardmax);
706 *hardmin= fprop->hardmin;
707 *hardmax= fprop->hardmax;
711 void RNA_property_float_ui_range(PointerRNA *ptr, PropertyRNA *prop, float *softmin, float *softmax, float *step, float *precision)
713 FloatPropertyRNA *fprop= (FloatPropertyRNA*)rna_ensure_property(prop);
714 float hardmin, hardmax;
717 fprop->range(ptr, &hardmin, &hardmax);
718 *softmin= MAX2(fprop->softmin, hardmin);
719 *softmax= MIN2(fprop->softmax, hardmax);
722 *softmin= fprop->softmin;
723 *softmax= fprop->softmax;
727 *precision= (float)fprop->precision;
730 int RNA_property_string_maxlength(PropertyRNA *prop)
732 StringPropertyRNA *sprop= (StringPropertyRNA*)rna_ensure_property(prop);
733 return sprop->maxlength;
736 StructRNA *RNA_property_pointer_type(PointerRNA *ptr, PropertyRNA *prop)
738 prop= rna_ensure_property(prop);
740 if(prop->type == PROP_POINTER) {
741 PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
744 return pprop->typef(ptr);
748 else if(prop->type == PROP_COLLECTION) {
749 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
752 return cprop->item_type;
755 return &RNA_UnknownType;
758 /* Reuse for dynamic types */
759 EnumPropertyItem DummyRNA_NULL_items[] = {
760 {0, NULL, 0, NULL, NULL}
763 void RNA_property_enum_items(bContext *C, PointerRNA *ptr, PropertyRNA *prop, EnumPropertyItem **item, int *totitem, int *free)
765 EnumPropertyRNA *eprop= (EnumPropertyRNA*)rna_ensure_property(prop);
769 if(eprop->itemf && C) {
771 *item= eprop->itemf(C, ptr, free);
775 for( ; (*item)[tot].identifier; tot++);
784 *totitem= eprop->totitem;
788 int RNA_property_enum_value(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const char *identifier, int *value)
790 EnumPropertyItem *item;
793 RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
795 for(; item->identifier; item++) {
796 if(item->identifier[0] && strcmp(item->identifier, identifier)==0) {
797 *value = item->value;
808 int RNA_enum_identifier(EnumPropertyItem *item, const int value, const char **identifier)
810 for (; item->identifier; item++) {
811 if(item->identifier[0] && item->value==value) {
812 *identifier = item->identifier;
819 int RNA_enum_name(EnumPropertyItem *item, const int value, const char **name)
821 for (; item->identifier; item++) {
822 if(item->identifier[0] && item->value==value) {
830 int RNA_property_enum_identifier(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier)
832 EnumPropertyItem *item= NULL;
835 RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
837 result= RNA_enum_identifier(item, value, identifier);
846 const char *RNA_property_ui_name(PropertyRNA *prop)
848 return rna_ensure_property_name(prop);
851 const char *RNA_property_ui_description(PropertyRNA *prop)
853 return rna_ensure_property(prop)->description;
856 int RNA_property_ui_icon(PropertyRNA *prop)
858 return rna_ensure_property(prop)->icon;
861 int RNA_property_editable(PointerRNA *ptr, PropertyRNA *prop)
866 prop= rna_ensure_property(prop);
869 flag= prop->editable(ptr);
875 return (flag & PROP_EDITABLE) && (!id || !id->lib || (flag & PROP_LIB_EXCEPTION));
878 int RNA_property_animateable(PointerRNA *ptr, PropertyRNA *prop)
882 prop= rna_ensure_property(prop);
884 if(!(prop->flag & PROP_ANIMATEABLE))
888 flag= prop->editable(ptr);
892 return (flag & PROP_EDITABLE);
895 int RNA_property_animated(PointerRNA *ptr, PropertyRNA *prop)
897 /* would need to ask animation system */
902 void RNA_property_update(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
904 int is_rna = (prop->magic == RNA_MAGIC);
905 prop= rna_ensure_property(prop);
909 prop->update(C, ptr);
911 WM_event_add_notifier(C, prop->noteflag, ptr->id.data);
914 /* WARNING! This is so property drivers update the display!
915 * not especially nice */
916 DAG_id_flush_update(ptr->id.data, OB_RECALC_OB);
917 WM_event_add_notifier(C, NC_WINDOW, NULL);
923 int RNA_property_boolean_get(PointerRNA *ptr, PropertyRNA *prop)
925 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
928 if((idprop=rna_idproperty_check(&prop, ptr)))
929 return IDP_Int(idprop);
931 return bprop->get(ptr);
933 return bprop->defaultvalue;
936 void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, int value)
938 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
941 /* just incase other values are passed */
944 if((idprop=rna_idproperty_check(&prop, ptr)))
945 IDP_Int(idprop)= value;
947 bprop->set(ptr, value);
948 else if(prop->flag & PROP_EDITABLE) {
949 IDPropertyTemplate val = {0};
954 group= RNA_struct_idproperties(ptr, 1);
956 IDP_AddToGroup(group, IDP_New(IDP_INT, val, (char*)prop->identifier));
960 void RNA_property_boolean_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values)
962 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
965 if((idprop=rna_idproperty_check(&prop, ptr))) {
966 if(prop->arraydimension == 0)
967 values[0]= RNA_property_boolean_get(ptr, prop);
969 memcpy(values, IDP_Array(idprop), sizeof(int)*idprop->len);
971 else if(prop->arraydimension == 0)
972 values[0]= RNA_property_boolean_get(ptr, prop);
973 else if(bprop->getarray)
974 bprop->getarray(ptr, values);
975 else if(bprop->defaultarray)
976 memcpy(values, bprop->defaultarray, sizeof(int)*prop->totarraylength);
978 memset(values, 0, sizeof(int)*prop->totarraylength);
981 int RNA_property_boolean_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
983 int tmp[RNA_MAX_ARRAY_LENGTH];
984 int len= rna_ensure_property_array_length(ptr, prop);
986 if(len <= RNA_MAX_ARRAY_LENGTH) {
987 RNA_property_boolean_get_array(ptr, prop, tmp);
991 int *tmparray, value;
993 tmparray= MEM_callocN(sizeof(int)*len, "RNA_property_boolean_get_index");
994 RNA_property_boolean_get_array(ptr, prop, tmparray);
995 value= tmparray[index];
1002 void RNA_property_boolean_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *values)
1004 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
1007 if((idprop=rna_idproperty_check(&prop, ptr))) {
1008 if(prop->arraydimension == 0)
1009 IDP_Int(idprop)= values[0];
1011 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);
1013 else if(prop->arraydimension == 0)
1014 RNA_property_boolean_set(ptr, prop, values[0]);
1015 else if(bprop->setarray)
1016 bprop->setarray(ptr, values);
1017 else if(prop->flag & PROP_EDITABLE) {
1018 IDPropertyTemplate val = {0};
1021 val.array.len= prop->totarraylength;
1022 val.array.type= IDP_INT;
1024 group= RNA_struct_idproperties(ptr, 1);
1026 idprop= IDP_New(IDP_ARRAY, val, (char*)prop->identifier);
1027 IDP_AddToGroup(group, idprop);
1028 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);
1033 void RNA_property_boolean_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, int value)
1035 int tmp[RNA_MAX_ARRAY_LENGTH];
1036 int len= rna_ensure_property_array_length(ptr, prop);
1038 if(len <= RNA_MAX_ARRAY_LENGTH) {
1039 RNA_property_boolean_get_array(ptr, prop, tmp);
1041 RNA_property_boolean_set_array(ptr, prop, tmp);
1046 tmparray= MEM_callocN(sizeof(int)*len, "RNA_property_boolean_get_index");
1047 RNA_property_boolean_get_array(ptr, prop, tmparray);
1048 tmparray[index]= value;
1049 RNA_property_boolean_set_array(ptr, prop, tmparray);
1050 MEM_freeN(tmparray);
1054 int RNA_property_int_get(PointerRNA *ptr, PropertyRNA *prop)
1056 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
1059 if((idprop=rna_idproperty_check(&prop, ptr)))
1060 return IDP_Int(idprop);
1062 return iprop->get(ptr);
1064 return iprop->defaultvalue;
1067 void RNA_property_int_set(PointerRNA *ptr, PropertyRNA *prop, int value)
1069 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
1072 if((idprop=rna_idproperty_check(&prop, ptr)))
1073 IDP_Int(idprop)= value;
1075 iprop->set(ptr, value);
1076 else if(prop->flag & PROP_EDITABLE) {
1077 IDPropertyTemplate val = {0};
1082 group= RNA_struct_idproperties(ptr, 1);
1084 IDP_AddToGroup(group, IDP_New(IDP_INT, val, (char*)prop->identifier));
1088 void RNA_property_int_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values)
1090 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
1093 if((idprop=rna_idproperty_check(&prop, ptr))) {
1094 if(prop->arraydimension == 0)
1095 values[0]= RNA_property_int_get(ptr, prop);
1097 memcpy(values, IDP_Array(idprop), sizeof(int)*idprop->len);
1099 else if(prop->arraydimension == 0)
1100 values[0]= RNA_property_int_get(ptr, prop);
1101 else if(iprop->getarray)
1102 iprop->getarray(ptr, values);
1103 else if(iprop->defaultarray)
1104 memcpy(values, iprop->defaultarray, sizeof(int)*prop->totarraylength);
1106 memset(values, 0, sizeof(int)*prop->totarraylength);
1109 int RNA_property_int_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
1111 int tmp[RNA_MAX_ARRAY_LENGTH];
1112 int len= rna_ensure_property_array_length(ptr, prop);
1114 if(len <= RNA_MAX_ARRAY_LENGTH) {
1115 RNA_property_int_get_array(ptr, prop, tmp);
1119 int *tmparray, value;
1121 tmparray= MEM_callocN(sizeof(int)*len, "RNA_property_int_get_index");
1122 RNA_property_int_get_array(ptr, prop, tmparray);
1123 value= tmparray[index];
1124 MEM_freeN(tmparray);
1130 void RNA_property_int_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *values)
1132 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
1135 if((idprop=rna_idproperty_check(&prop, ptr))) {
1136 if(prop->arraydimension == 0)
1137 IDP_Int(idprop)= values[0];
1139 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);\
1141 else if(prop->arraydimension == 0)
1142 RNA_property_int_set(ptr, prop, values[0]);
1143 else if(iprop->setarray)
1144 iprop->setarray(ptr, values);
1145 else if(prop->flag & PROP_EDITABLE) {
1146 IDPropertyTemplate val = {0};
1149 val.array.len= prop->totarraylength;
1150 val.array.type= IDP_INT;
1152 group= RNA_struct_idproperties(ptr, 1);
1154 idprop= IDP_New(IDP_ARRAY, val, (char*)prop->identifier);
1155 IDP_AddToGroup(group, idprop);
1156 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);
1161 void RNA_property_int_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, int value)
1163 int tmp[RNA_MAX_ARRAY_LENGTH];
1164 int len= rna_ensure_property_array_length(ptr, prop);
1166 if(len <= RNA_MAX_ARRAY_LENGTH) {
1167 RNA_property_int_get_array(ptr, prop, tmp);
1169 RNA_property_int_set_array(ptr, prop, tmp);
1174 tmparray= MEM_callocN(sizeof(int)*len, "RNA_property_int_get_index");
1175 RNA_property_int_get_array(ptr, prop, tmparray);
1176 tmparray[index]= value;
1177 RNA_property_int_set_array(ptr, prop, tmparray);
1178 MEM_freeN(tmparray);
1182 float RNA_property_float_get(PointerRNA *ptr, PropertyRNA *prop)
1184 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
1187 if((idprop=rna_idproperty_check(&prop, ptr))) {
1188 if(idprop->type == IDP_FLOAT)
1189 return IDP_Float(idprop);
1191 return (float)IDP_Double(idprop);
1194 return fprop->get(ptr);
1196 return fprop->defaultvalue;
1199 void RNA_property_float_set(PointerRNA *ptr, PropertyRNA *prop, float value)
1201 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
1204 if((idprop=rna_idproperty_check(&prop, ptr))) {
1205 if(idprop->type == IDP_FLOAT)
1206 IDP_Float(idprop)= value;
1208 IDP_Double(idprop)= value;
1210 else if(fprop->set) {
1211 fprop->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_FLOAT, val, (char*)prop->identifier));
1225 void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *values)
1227 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
1231 if((idprop=rna_idproperty_check(&prop, ptr))) {
1232 if(prop->arraydimension == 0)
1233 values[0]= RNA_property_float_get(ptr, prop);
1234 else if(idprop->subtype == IDP_FLOAT) {
1235 memcpy(values, IDP_Array(idprop), sizeof(float)*idprop->len);
1238 for(i=0; i<idprop->len; i++)
1239 values[i]= (float)(((double*)IDP_Array(idprop))[i]);
1242 else if(prop->arraydimension == 0)
1243 values[0]= RNA_property_float_get(ptr, prop);
1244 else if(fprop->getarray)
1245 fprop->getarray(ptr, values);
1246 else if(fprop->defaultarray)
1247 memcpy(values, fprop->defaultarray, sizeof(float)*prop->totarraylength);
1249 memset(values, 0, sizeof(float)*prop->totarraylength);
1252 float RNA_property_float_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
1254 float tmp[RNA_MAX_ARRAY_LENGTH];
1255 int len= rna_ensure_property_array_length(ptr, prop);
1257 if(len <= RNA_MAX_ARRAY_LENGTH) {
1258 RNA_property_float_get_array(ptr, prop, tmp);
1262 float *tmparray, value;
1264 tmparray= MEM_callocN(sizeof(float)*len, "RNA_property_float_get_index");
1265 RNA_property_float_get_array(ptr, prop, tmparray);
1266 value= tmparray[index];
1267 MEM_freeN(tmparray);
1274 void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const float *values)
1276 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
1280 if((idprop=rna_idproperty_check(&prop, ptr))) {
1281 if(prop->arraydimension == 0) {
1282 if(idprop->type == IDP_FLOAT)
1283 IDP_Float(idprop)= values[0];
1285 IDP_Double(idprop)= values[0];
1287 else if(idprop->subtype == IDP_FLOAT) {
1288 memcpy(IDP_Array(idprop), values, sizeof(float)*idprop->len);
1291 for(i=0; i<idprop->len; i++)
1292 ((double*)IDP_Array(idprop))[i]= values[i];
1295 else if(prop->arraydimension == 0)
1296 RNA_property_float_set(ptr, prop, values[0]);
1297 else if(fprop->setarray) {
1298 fprop->setarray(ptr, values);
1300 else if(prop->flag & PROP_EDITABLE) {
1301 IDPropertyTemplate val = {0};
1304 val.array.len= prop->totarraylength;
1305 val.array.type= IDP_FLOAT;
1307 group= RNA_struct_idproperties(ptr, 1);
1309 idprop= IDP_New(IDP_ARRAY, val, (char*)prop->identifier);
1310 IDP_AddToGroup(group, idprop);
1311 memcpy(IDP_Array(idprop), values, sizeof(float)*idprop->len);
1316 void RNA_property_float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, float value)
1318 float tmp[RNA_MAX_ARRAY_LENGTH];
1319 int len= rna_ensure_property_array_length(ptr, prop);
1321 if(len <= RNA_MAX_ARRAY_LENGTH) {
1322 RNA_property_float_get_array(ptr, prop, tmp);
1324 RNA_property_float_set_array(ptr, prop, tmp);
1329 tmparray= MEM_callocN(sizeof(float)*len, "RNA_property_float_get_index");
1330 RNA_property_float_get_array(ptr, prop, tmparray);
1331 tmparray[index]= value;
1332 RNA_property_float_set_array(ptr, prop, tmparray);
1333 MEM_freeN(tmparray);
1337 void RNA_property_string_get(PointerRNA *ptr, PropertyRNA *prop, char *value)
1339 StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
1342 if((idprop=rna_idproperty_check(&prop, ptr)))
1343 strcpy(value, IDP_String(idprop));
1345 sprop->get(ptr, value);
1347 strcpy(value, sprop->defaultvalue);
1350 char *RNA_property_string_get_alloc(PointerRNA *ptr, PropertyRNA *prop, char *fixedbuf, int fixedlen)
1355 length= RNA_property_string_length(ptr, prop);
1357 if(length+1 < fixedlen)
1360 buf= MEM_callocN(sizeof(char)*(length+1), "RNA_string_get_alloc");
1362 RNA_property_string_get(ptr, prop, buf);
1367 int RNA_property_string_length(PointerRNA *ptr, PropertyRNA *prop)
1369 StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
1372 if((idprop=rna_idproperty_check(&prop, ptr)))
1373 return strlen(IDP_String(idprop));
1374 else if(sprop->length)
1375 return sprop->length(ptr);
1377 return strlen(sprop->defaultvalue);
1380 void RNA_property_string_set(PointerRNA *ptr, PropertyRNA *prop, const char *value)
1382 StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
1385 if((idprop=rna_idproperty_check(&prop, ptr)))
1386 IDP_AssignString(idprop, (char*)value);
1388 sprop->set(ptr, value);
1389 else if(prop->flag & PROP_EDITABLE) {
1390 IDPropertyTemplate val = {0};
1393 val.str= (char*)value;
1395 group= RNA_struct_idproperties(ptr, 1);
1397 IDP_AddToGroup(group, IDP_New(IDP_STRING, val, (char*)prop->identifier));
1401 int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
1403 EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
1406 if((idprop=rna_idproperty_check(&prop, ptr)))
1407 return IDP_Int(idprop);
1409 return eprop->get(ptr);
1411 return eprop->defaultvalue;
1415 void RNA_property_enum_set(PointerRNA *ptr, PropertyRNA *prop, int value)
1417 EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
1420 if((idprop=rna_idproperty_check(&prop, ptr)))
1421 IDP_Int(idprop)= value;
1422 else if(eprop->set) {
1423 eprop->set(ptr, value);
1425 else if(prop->flag & PROP_EDITABLE) {
1426 IDPropertyTemplate val = {0};
1431 group= RNA_struct_idproperties(ptr, 1);
1433 IDP_AddToGroup(group, IDP_New(IDP_INT, val, (char*)prop->identifier));
1437 PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop)
1439 PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
1442 if((idprop=rna_idproperty_check(&prop, ptr))) {
1443 pprop= (PointerPropertyRNA*)prop;
1445 /* for groups, data is idprop itself */
1446 return rna_pointer_inherit_refine(ptr, pprop->type, idprop);
1448 else if(pprop->get) {
1449 return pprop->get(ptr);
1451 else if(prop->flag & PROP_IDPROPERTY) {
1452 /* XXX temporary hack to add it automatically, reading should
1453 never do any write ops, to ensure thread safety etc .. */
1454 RNA_property_pointer_add(ptr, prop);
1455 return RNA_property_pointer_get(ptr, prop);
1460 memset(&result, 0, sizeof(result));
1465 void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr_value)
1469 if((idprop=rna_idproperty_check(&prop, ptr))) {
1473 PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
1475 if(pprop->set && !((prop->flag & PROP_NEVER_NULL) && ptr_value.data == NULL))
1476 pprop->set(ptr, ptr_value);
1480 void RNA_property_pointer_add(PointerRNA *ptr, PropertyRNA *prop)
1484 if((idprop=rna_idproperty_check(&prop, ptr))) {
1485 /* already exists */
1487 else if(prop->flag & PROP_IDPROPERTY) {
1488 IDPropertyTemplate val = {0};
1493 group= RNA_struct_idproperties(ptr, 1);
1495 IDP_AddToGroup(group, IDP_New(IDP_GROUP, val, (char*)prop->identifier));
1498 printf("RNA_property_pointer_add %s.%s: only supported for id properties.\n", ptr->type->identifier, prop->identifier);
1501 void RNA_property_pointer_remove(PointerRNA *ptr, PropertyRNA *prop)
1503 IDProperty *idprop, *group;
1505 if((idprop=rna_idproperty_check(&prop, ptr))) {
1506 group= RNA_struct_idproperties(ptr, 0);
1509 IDP_RemFromGroup(group, idprop);
1510 IDP_FreeProperty(idprop);
1515 printf("RNA_property_pointer_remove %s.%s: only supported for id properties.\n", ptr->type->identifier, prop->identifier);
1518 static void rna_property_collection_get_idp(CollectionPropertyIterator *iter)
1520 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)iter->prop;
1522 iter->ptr.data= rna_iterator_array_get(iter);
1523 iter->ptr.type= cprop->item_type;
1524 rna_pointer_inherit_id(cprop->item_type, &iter->parent, &iter->ptr);
1527 void RNA_property_collection_begin(PointerRNA *ptr, PropertyRNA *prop, CollectionPropertyIterator *iter)
1531 memset(iter, 0, sizeof(*iter));
1533 if((idprop=rna_idproperty_check(&prop, ptr)) || (prop->flag & PROP_IDPROPERTY)) {
1538 rna_iterator_array_begin(iter, IDP_IDPArray(idprop), sizeof(IDProperty), idprop->len, 0, NULL);
1540 rna_iterator_array_begin(iter, NULL, sizeof(IDProperty), 0, 0, NULL);
1543 rna_property_collection_get_idp(iter);
1548 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1549 cprop->begin(iter, ptr);
1553 void RNA_property_collection_next(CollectionPropertyIterator *iter)
1555 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)iter->prop;
1558 rna_iterator_array_next(iter);
1561 rna_property_collection_get_idp(iter);
1567 void RNA_property_collection_end(CollectionPropertyIterator *iter)
1569 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)iter->prop;
1572 rna_iterator_array_end(iter);
1577 int RNA_property_collection_length(PointerRNA *ptr, PropertyRNA *prop)
1579 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1582 if((idprop=rna_idproperty_check(&prop, ptr))) {
1585 else if(cprop->length) {
1586 return cprop->length(ptr);
1589 CollectionPropertyIterator iter;
1592 RNA_property_collection_begin(ptr, prop, &iter);
1593 for(; iter.valid; RNA_property_collection_next(&iter))
1595 RNA_property_collection_end(&iter);
1601 void RNA_property_collection_add(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *r_ptr)
1604 // CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1606 if((idprop=rna_idproperty_check(&prop, ptr))) {
1607 IDPropertyTemplate val = {0};
1610 item= IDP_New(IDP_GROUP, val, "");
1611 IDP_AppendArray(idprop, item);
1612 IDP_FreeProperty(item);
1615 else if(prop->flag & PROP_IDPROPERTY) {
1616 IDProperty *group, *item;
1617 IDPropertyTemplate val = {0};
1619 group= RNA_struct_idproperties(ptr, 1);
1621 idprop= IDP_NewIDPArray(prop->identifier);
1622 IDP_AddToGroup(group, idprop);
1624 item= IDP_New(IDP_GROUP, val, "");
1625 IDP_AppendArray(idprop, item);
1626 IDP_FreeProperty(item);
1631 /* py api calls directly */
1633 else if(cprop->add){
1634 if(!(cprop->add->flag & FUNC_USE_CONTEXT)) { /* XXX check for this somewhere else */
1635 ParameterList params;
1636 RNA_parameter_list_create(¶ms, ptr, cprop->add);
1637 RNA_function_call(NULL, NULL, ptr, cprop->add, ¶ms);
1638 RNA_parameter_list_free(¶ms);
1642 printf("RNA_property_collection_add %s.%s: not implemented for this property.\n", ptr->type->identifier, prop->identifier);*/
1647 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1649 r_ptr->data= IDP_GetIndexArray(idprop, idprop->len-1);
1650 r_ptr->type= cprop->item_type;
1651 rna_pointer_inherit_id(NULL, ptr, r_ptr);
1654 memset(r_ptr, 0, sizeof(*r_ptr));
1658 int RNA_property_collection_remove(PointerRNA *ptr, PropertyRNA *prop, int key)
1661 // CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1663 if((idprop=rna_idproperty_check(&prop, ptr))) {
1664 IDProperty tmp, *array;
1668 array= IDP_IDPArray(idprop);
1670 if(key >= 0 && key < len) {
1672 /* move element to be removed to the back */
1673 memcpy(&tmp, &array[key], sizeof(IDProperty));
1674 memmove(array+key, array+key+1, sizeof(IDProperty)*(len-key+1));
1675 memcpy(&array[len-1], &tmp, sizeof(IDProperty));
1678 IDP_ResizeIDPArray(idprop, len-1);
1683 else if(prop->flag & PROP_IDPROPERTY)
1686 /* py api calls directly */
1688 else if(cprop->remove){
1689 if(!(cprop->remove->flag & FUNC_USE_CONTEXT)) { /* XXX check for this somewhere else */
1690 ParameterList params;
1691 RNA_parameter_list_create(¶ms, ptr, cprop->remove);
1692 RNA_function_call(NULL, NULL, ptr, cprop->remove, ¶ms);
1693 RNA_parameter_list_free(¶ms);
1699 printf("RNA_property_collection_remove %s.%s: only supported for id properties.\n", ptr->type->identifier, prop->identifier);*/
1704 void RNA_property_collection_clear(PointerRNA *ptr, PropertyRNA *prop)
1708 if((idprop=rna_idproperty_check(&prop, ptr)))
1709 IDP_ResizeIDPArray(idprop, 0);
1712 int RNA_property_collection_lookup_index(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *t_ptr)
1714 CollectionPropertyIterator iter;
1717 RNA_property_collection_begin(ptr, prop, &iter);
1718 for(index=0; iter.valid; RNA_property_collection_next(&iter), index++) {
1719 if (iter.ptr.data == t_ptr->data)
1722 RNA_property_collection_end(&iter);
1724 /* did we find it? */
1731 int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int key, PointerRNA *r_ptr)
1733 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1735 if(cprop->lookupint) {
1736 /* we have a callback defined, use it */
1737 *r_ptr= cprop->lookupint(ptr, key);
1738 return (r_ptr->data != NULL);
1741 /* no callback defined, just iterate and find the nth item */
1742 CollectionPropertyIterator iter;
1745 RNA_property_collection_begin(ptr, prop, &iter);
1746 for(i=0; iter.valid; RNA_property_collection_next(&iter), i++) {
1752 RNA_property_collection_end(&iter);
1755 memset(r_ptr, 0, sizeof(*r_ptr));
1761 int RNA_property_collection_lookup_string(PointerRNA *ptr, PropertyRNA *prop, const char *key, PointerRNA *r_ptr)
1763 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1765 if(cprop->lookupstring) {
1766 /* we have a callback defined, use it */
1767 *r_ptr= cprop->lookupstring(ptr, key);
1768 return (r_ptr->data != NULL);
1771 /* no callback defined, compare with name properties if they exist */
1772 CollectionPropertyIterator iter;
1773 PropertyRNA *nameprop;
1774 char name[256], *nameptr;
1777 RNA_property_collection_begin(ptr, prop, &iter);
1778 for(; iter.valid; RNA_property_collection_next(&iter)) {
1779 if(iter.ptr.data && iter.ptr.type->nameproperty) {
1780 nameprop= iter.ptr.type->nameproperty;
1782 nameptr= RNA_property_string_get_alloc(&iter.ptr, nameprop, name, sizeof(name));
1784 if(strcmp(nameptr, key) == 0) {
1789 if((char *)&name != nameptr)
1796 RNA_property_collection_end(&iter);
1799 memset(r_ptr, 0, sizeof(*r_ptr));
1805 int RNA_property_collection_type_get(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *r_ptr)
1808 return ((r_ptr->type = prop->srna) ? 1:0);
1811 int RNA_property_collection_raw_array(PointerRNA *ptr, PropertyRNA *prop, PropertyRNA *itemprop, RawArray *array)
1813 CollectionPropertyIterator iter;
1814 ArrayIterator *internal;
1817 if(!(prop->flag & PROP_RAW_ARRAY) || !(itemprop->flag & PROP_RAW_ACCESS))
1820 RNA_property_collection_begin(ptr, prop, &iter);
1823 /* get data from array iterator and item property */
1824 internal= iter.internal;
1825 arrayp= (iter.valid)? iter.ptr.data: NULL;
1827 if(internal->skip || !RNA_property_editable(&iter.ptr, itemprop)) {
1828 /* we might skip some items, so it's not a proper array */
1829 RNA_property_collection_end(&iter);
1833 array->array= arrayp + itemprop->rawoffset;
1834 array->stride= internal->itemsize;
1835 array->len= ((char*)internal->endptr - arrayp)/internal->itemsize;
1836 array->type= itemprop->rawtype;
1839 memset(array, 0, sizeof(RawArray));
1841 RNA_property_collection_end(&iter);
1846 #define RAW_GET(dtype, var, raw, a) \
1848 switch(raw.type) { \
1849 case PROP_RAW_CHAR: var = (dtype)((char*)raw.array)[a]; break; \
1850 case PROP_RAW_SHORT: var = (dtype)((short*)raw.array)[a]; break; \
1851 case PROP_RAW_INT: var = (dtype)((int*)raw.array)[a]; break; \
1852 case PROP_RAW_FLOAT: var = (dtype)((float*)raw.array)[a]; break; \
1853 case PROP_RAW_DOUBLE: var = (dtype)((double*)raw.array)[a]; break; \
1854 default: var = (dtype)0; \
1858 #define RAW_SET(dtype, raw, a, var) \
1860 switch(raw.type) { \
1861 case PROP_RAW_CHAR: ((char*)raw.array)[a] = (char)var; break; \
1862 case PROP_RAW_SHORT: ((short*)raw.array)[a] = (short)var; break; \
1863 case PROP_RAW_INT: ((int*)raw.array)[a] = (int)var; break; \
1864 case PROP_RAW_FLOAT: ((float*)raw.array)[a] = (float)var; break; \
1865 case PROP_RAW_DOUBLE: ((double*)raw.array)[a] = (double)var; break; \
1869 int RNA_raw_type_sizeof(RawPropertyType type)
1872 case PROP_RAW_CHAR: return sizeof(char);
1873 case PROP_RAW_SHORT: return sizeof(short);
1874 case PROP_RAW_INT: return sizeof(int);
1875 case PROP_RAW_FLOAT: return sizeof(float);
1876 case PROP_RAW_DOUBLE: return sizeof(double);
1881 static int rna_raw_access(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *inarray, RawPropertyType intype, int inlen, int set)
1885 PropertyRNA *itemprop, *iprop;
1886 PropertyType itemtype=0;
1890 /* initialize in array, stride assumed 0 in following code */
1896 ptype= RNA_property_pointer_type(ptr, prop);
1898 /* try to get item property pointer */
1899 RNA_pointer_create(NULL, ptype, NULL, &itemptr);
1900 itemprop= RNA_struct_find_property(&itemptr, propname);
1903 /* we have item property pointer */
1907 itemtype= RNA_property_type(itemprop);
1909 if(!ELEM3(itemtype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) {
1910 BKE_report(reports, RPT_ERROR, "Only boolean, int and float properties supported.");
1914 /* check item array */
1915 itemlen= RNA_property_array_length(&itemptr, itemprop);
1917 /* try to access as raw array */
1918 if(RNA_property_collection_raw_array(ptr, prop, itemprop, &out)) {
1919 if(in.len != itemlen*out.len) {
1920 BKE_reportf(reports, RPT_ERROR, "Array length mismatch (expected %d, got %d).", out.len*itemlen, in.len);
1924 /* matching raw types */
1925 if(out.type == in.type) {
1926 void *inp= in.array;
1927 void *outp= out.array;
1930 itemlen= (itemlen == 0)? 1: itemlen;
1931 size= RNA_raw_type_sizeof(out.type) * itemlen;
1933 for(a=0; a<out.len; a++) {
1934 if(set) memcpy(outp, inp, size);
1935 else memcpy(inp, outp, size);
1937 inp= (char*)inp + size;
1938 outp= (char*)outp + out.stride;
1944 /* could also be faster with non-matching types,
1945 * for now we just do slower loop .. */
1950 void *tmparray= NULL;
1952 int err= 0, j, a= 0;
1954 /* no item property pointer, can still be id property, or
1955 * property of a type derived from the collection pointer type */
1956 RNA_PROP_BEGIN(ptr, itemptr, prop) {
1959 /* we got the property already */
1963 /* not yet, look it up and verify if it is valid */
1964 iprop= RNA_struct_find_property(&itemptr, propname);
1967 itemlen= RNA_property_array_length(&itemptr, iprop);
1968 itemtype= RNA_property_type(iprop);
1971 BKE_reportf(reports, RPT_ERROR, "Property named %s not found.", propname);
1976 if(!ELEM3(itemtype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) {
1977 BKE_report(reports, RPT_ERROR, "Only boolean, int and float properties supported.");
1983 /* editable check */
1984 if(RNA_property_editable(&itemptr, iprop)) {
1985 if(a+itemlen > in.len) {
1986 BKE_reportf(reports, RPT_ERROR, "Array length mismatch (got %d, expected more).", in.len);
1992 /* handle conversions */
1995 case PROP_BOOLEAN: {
1997 RAW_GET(int, b, in, a);
1998 RNA_property_boolean_set(&itemptr, iprop, b);
2003 RAW_GET(int, i, in, a);
2004 RNA_property_int_set(&itemptr, iprop, i);
2009 RAW_GET(float, f, in, a);
2010 RNA_property_float_set(&itemptr, iprop, f);
2019 case PROP_BOOLEAN: {
2020 int b= RNA_property_boolean_get(&itemptr, iprop);
2021 RAW_SET(int, in, a, b);
2025 int i= RNA_property_int_get(&itemptr, iprop);
2026 RAW_SET(int, in, a, i);
2030 float f= RNA_property_float_get(&itemptr, iprop);
2031 RAW_SET(float, in, a, f);
2041 /* allocate temporary array if needed */
2042 if(tmparray && tmplen != itemlen) {
2043 MEM_freeN(tmparray);
2047 tmparray= MEM_callocN(sizeof(float)*itemlen, "RNA tmparray\n");
2051 /* handle conversions */
2054 case PROP_BOOLEAN: {
2055 for(j=0; j<itemlen; j++, a++)
2056 RAW_GET(int, ((int*)tmparray)[j], in, a);
2057 RNA_property_boolean_set_array(&itemptr, iprop, tmparray);
2061 for(j=0; j<itemlen; j++, a++)
2062 RAW_GET(int, ((int*)tmparray)[j], in, a);
2063 RNA_property_int_set_array(&itemptr, iprop, tmparray);
2067 for(j=0; j<itemlen; j++, a++)
2068 RAW_GET(float, ((float*)tmparray)[j], in, a);
2069 RNA_property_float_set_array(&itemptr, iprop, tmparray);
2078 case PROP_BOOLEAN: {
2079 RNA_property_boolean_get_array(&itemptr, iprop, tmparray);
2080 for(j=0; j<itemlen; j++, a++)
2081 RAW_SET(int, in, a, ((int*)tmparray)[j]);
2085 RNA_property_int_get_array(&itemptr, iprop, tmparray);
2086 for(j=0; j<itemlen; j++, a++)
2087 RAW_SET(int, in, a, ((int*)tmparray)[j]);
2091 RNA_property_float_get_array(&itemptr, iprop, tmparray);
2092 for(j=0; j<itemlen; j++, a++)
2093 RAW_SET(float, in, a, ((float*)tmparray)[j]);
2107 MEM_freeN(tmparray);
2113 RawPropertyType RNA_property_raw_type(PropertyRNA *prop)
2115 return prop->rawtype;
2118 int RNA_property_collection_raw_get(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *array, RawPropertyType type, int len)
2120 return rna_raw_access(reports, ptr, prop, propname, array, type, len, 0);
2123 int RNA_property_collection_raw_set(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *array, RawPropertyType type, int len)
2125 return rna_raw_access(reports, ptr, prop, propname, array, type, len, 1);
2128 /* Standard iterator functions */
2130 void rna_iterator_listbase_begin(CollectionPropertyIterator *iter, ListBase *lb, IteratorSkipFunc skip)
2132 ListBaseIterator *internal;
2134 internal= MEM_callocN(sizeof(ListBaseIterator), "ListBaseIterator");
2135 internal->link= (lb)? lb->first: NULL;
2136 internal->skip= skip;
2138 iter->internal= internal;
2139 iter->valid= (internal->link != NULL);
2141 if(skip && iter->valid && skip(iter, internal->link))
2142 rna_iterator_listbase_next(iter);
2145 void rna_iterator_listbase_next(CollectionPropertyIterator *iter)
2147 ListBaseIterator *internal= iter->internal;
2149 if(internal->skip) {
2151 internal->link= internal->link->next;
2152 iter->valid= (internal->link != NULL);
2153 } while(iter->valid && internal->skip(iter, internal->link));
2156 internal->link= internal->link->next;
2157 iter->valid= (internal->link != NULL);
2161 void *rna_iterator_listbase_get(CollectionPropertyIterator *iter)
2163 ListBaseIterator *internal= iter->internal;
2165 return internal->link;
2168 void rna_iterator_listbase_end(CollectionPropertyIterator *iter)
2170 MEM_freeN(iter->internal);
2171 iter->internal= NULL;
2174 void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int itemsize, int length, int free_ptr, IteratorSkipFunc skip)
2176 ArrayIterator *internal;
2181 internal= MEM_callocN(sizeof(ArrayIterator), "ArrayIterator");
2183 internal->free_ptr= free_ptr ? ptr:NULL;
2184 internal->endptr= ((char*)ptr)+length*itemsize;
2185 internal->itemsize= itemsize;
2186 internal->skip= skip;
2188 iter->internal= internal;
2189 iter->valid= (internal->ptr != internal->endptr);
2191 if(skip && iter->valid && skip(iter, internal->ptr))
2192 rna_iterator_array_next(iter);
2195 void rna_iterator_array_next(CollectionPropertyIterator *iter)
2197 ArrayIterator *internal= iter->internal;
2199 if(internal->skip) {
2201 internal->ptr += internal->itemsize;
2202 iter->valid= (internal->ptr != internal->endptr);
2203 } while(iter->valid && internal->skip(iter, internal->ptr));
2206 internal->ptr += internal->itemsize;
2207 iter->valid= (internal->ptr != internal->endptr);
2211 void *rna_iterator_array_get(CollectionPropertyIterator *iter)
2213 ArrayIterator *internal= iter->internal;
2215 return internal->ptr;
2218 void *rna_iterator_array_dereference_get(CollectionPropertyIterator *iter)
2220 ArrayIterator *internal= iter->internal;
2223 return *(void**)(internal->ptr);
2226 void rna_iterator_array_end(CollectionPropertyIterator *iter)
2228 ArrayIterator *internal= iter->internal;
2230 if(internal->free_ptr) {
2231 MEM_freeN(internal->free_ptr);
2232 internal->free_ptr= NULL;
2234 MEM_freeN(iter->internal);
2235 iter->internal= NULL;
2238 /* RNA Path - Experiment */
2240 static char *rna_path_token(const char **path, char *fixedbuf, int fixedlen, int bracket)
2244 int i, j, len, escape;
2249 /* get data between [], check escaping ] with \] */
2250 if(**path == '[') (*path)++;
2256 while(*p && (*p != ']' || escape)) {
2257 escape= (*p == '\\');
2262 if(*p != ']') return NULL;
2265 /* get data until . or [ */
2268 while(*p && *p != '.' && *p != '[') {
2278 /* try to use fixed buffer if possible */
2279 if(len+1 < fixedlen)
2282 buf= MEM_callocN(sizeof(char)*(len+1), "rna_path_token");
2284 /* copy string, taking into account escaped ] */
2286 for(p=*path, i=0, j=0; i<len; i++, p++) {
2287 if(*p == '\\' && *(p+1) == ']');
2294 memcpy(buf, *path, sizeof(char)*len);
2298 /* set path to start of next token */
2306 static int rna_token_strip_quotes(char *token)
2309 int len = strlen(token);
2310 if (len >= 2 && token[len-1]=='"') {
2319 /* Resolve the given RNA path to find the pointer+property indicated at the end of the path */
2320 int RNA_path_resolve(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)
2323 PointerRNA curptr, nextptr;
2324 char fixedbuf[256], *token;
2330 if(path==NULL || *path=='\0')
2334 int use_id_prop = (*path=='[') ? 1:0;
2335 /* custom property lookup ?
2336 * C.object["someprop"]
2339 /* look up property name in current struct */
2340 token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), use_id_prop);
2345 if(use_id_prop) { /* look up property name in current struct */
2346 IDProperty *group= RNA_struct_idproperties(ptr, 0);
2350 if(rna_token_strip_quotes(token))
2351 prop= (PropertyRNA *)IDP_GetPropertyFromGroup(group, token+1);
2356 prop= RNA_struct_find_property(&curptr, token);
2359 if(token != fixedbuf)
2365 /* now look up the value of this property if it is a pointer or
2366 * collection, otherwise return the property rna so that the
2367 * caller can read the value of the property itself */
2368 if(RNA_property_type(prop) == PROP_POINTER) {
2369 nextptr= RNA_property_pointer_get(&curptr, prop);
2376 else if(RNA_property_type(prop) == PROP_COLLECTION && *path) {
2377 /* resolve the lookup with [] brackets */
2378 token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 1);
2385 /* check for "" to see if it is a string */
2386 if(rna_token_strip_quotes(token)) {
2387 RNA_property_collection_lookup_string(&curptr, prop, token+1, &nextptr);
2390 /* otherwise do int lookup */
2391 intkey= atoi(token);
2392 RNA_property_collection_lookup_int(&curptr, prop, intkey, &nextptr);
2395 if(token != fixedbuf)
2412 char *RNA_path_append(const char *path, PointerRNA *ptr, PropertyRNA *prop, int intkey, const char *strkey)
2416 char appendstr[128], *result;
2418 dynstr= BLI_dynstr_new();
2420 /* add .identifier */
2422 BLI_dynstr_append(dynstr, (char*)path);
2424 BLI_dynstr_append(dynstr, ".");
2427 BLI_dynstr_append(dynstr, (char*)RNA_property_identifier(prop));
2429 if(RNA_property_type(prop) == PROP_COLLECTION) {
2430 /* add ["strkey"] or [intkey] */
2431 BLI_dynstr_append(dynstr, "[");
2434 BLI_dynstr_append(dynstr, "\"");
2435 for(s=strkey; *s; s++) {
2445 BLI_dynstr_append(dynstr, appendstr);
2447 BLI_dynstr_append(dynstr, "\"");
2450 sprintf(appendstr, "%d", intkey);
2451 BLI_dynstr_append(dynstr, appendstr);
2454 BLI_dynstr_append(dynstr, "]");
2457 result= BLI_dynstr_get_cstring(dynstr);
2458 BLI_dynstr_free(dynstr);
2463 char *RNA_path_back(const char *path)
2466 const char *previous, *current;
2467 char *result, *token;
2476 /* parse token by token until the end, then we back up to the previous
2477 * position and strip of the next token to get the path one step back */
2479 token= rna_path_token(¤t, fixedbuf, sizeof(fixedbuf), 0);
2483 if(token != fixedbuf)
2486 /* in case of collection we also need to strip off [] */
2487 token= rna_path_token(¤t, fixedbuf, sizeof(fixedbuf), 1);
2488 if(token && token != fixedbuf)
2500 /* copy and strip off last token */
2502 result= BLI_strdup(path);
2504 if(i > 0 && result[i-1] == '.') i--;
2510 char *RNA_path_from_ID_to_struct(PointerRNA *ptr)
2514 if(!ptr->id.data || !ptr->data)
2517 if(!RNA_struct_is_ID(ptr->type)) {
2518 if(ptr->type->path) {
2519 /* if type has a path to some ID, use it */
2520 ptrpath= ptr->type->path(ptr);
2522 else if(ptr->type->nested && RNA_struct_is_ID(ptr->type->nested)) {
2523 PointerRNA parentptr;
2524 PropertyRNA *userprop;
2526 /* find the property in the struct we're nested in that references this struct, and
2527 * use its identifier as the first part of the path used...
2529 RNA_id_pointer_create(ptr->id.data, &parentptr);
2530 userprop= RNA_struct_find_nested(&parentptr, ptr->type);
2533 ptrpath= BLI_strdup(RNA_property_identifier(userprop));
2535 return NULL; // can't do anything about this case yet...
2544 char *RNA_path_from_ID_to_property(PointerRNA *ptr, PropertyRNA *prop)
2546 int is_rna = (prop->magic == RNA_MAGIC);
2547 const char *propname;
2548 char *ptrpath, *path;
2550 if(!ptr->id.data || !ptr->data || !prop)
2553 /* path from ID to the struct holding this property */
2554 ptrpath= RNA_path_from_ID_to_struct(ptr);
2556 propname= RNA_property_identifier(prop);
2559 path= BLI_sprintfN(is_rna ? "%s.%s":"%s[\"%s\"]", ptrpath, propname);
2563 path= BLI_strdup(propname);
2565 path= BLI_sprintfN("[\"%s\"]", propname);
2571 /* Quick name based property access */
2573 int RNA_boolean_get(PointerRNA *ptr, const char *name)
2575 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2578 return RNA_property_boolean_get(ptr, prop);
2581 printf("RNA_boolean_get: %s.%s not found.\n", ptr->type->identifier, name);
2586 void RNA_boolean_set(PointerRNA *ptr, const char *name, int value)
2588 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2591 RNA_property_boolean_set(ptr, prop, value);
2593 printf("RNA_boolean_set: %s.%s not found.\n", ptr->type->identifier, name);
2596 void RNA_boolean_get_array(PointerRNA *ptr, const char *name, int *values)
2598 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2601 RNA_property_boolean_get_array(ptr, prop, values);
2603 printf("RNA_boolean_get_array: %s.%s not found.\n", ptr->type->identifier, name);
2606 void RNA_boolean_set_array(PointerRNA *ptr, const char *name, const int *values)
2608 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2611 RNA_property_boolean_set_array(ptr, prop, values);
2613 printf("RNA_boolean_set_array: %s.%s not found.\n", ptr->type->identifier, name);
2616 int RNA_int_get(PointerRNA *ptr, const char *name)
2618 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2621 return RNA_property_int_get(ptr, prop);
2624 printf("RNA_int_get: %s.%s not found.\n", ptr->type->identifier, name);
2629 void RNA_int_set(PointerRNA *ptr, const char *name, int value)
2631 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2634 RNA_property_int_set(ptr, prop, value);
2636 printf("RNA_int_set: %s.%s not found.\n", ptr->type->identifier, name);
2639 void RNA_int_get_array(PointerRNA *ptr, const char *name, int *values)
2641 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2644 RNA_property_int_get_array(ptr, prop, values);
2646 printf("RNA_int_get_array: %s.%s not found.\n", ptr->type->identifier, name);
2649 void RNA_int_set_array(PointerRNA *ptr, const char *name, const int *values)
2651 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2654 RNA_property_int_set_array(ptr, prop, values);
2656 printf("RNA_int_set_array: %s.%s not found.\n", ptr->type->identifier, name);
2659 float RNA_float_get(PointerRNA *ptr, const char *name)
2661 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2664 return RNA_property_float_get(ptr, prop);
2667 printf("RNA_float_get: %s.%s not found.\n", ptr->type->identifier, name);
2672 void RNA_float_set(PointerRNA *ptr, const char *name, float value)
2674 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2677 RNA_property_float_set(ptr, prop, value);
2679 printf("RNA_float_set: %s.%s not found.\n", ptr->type->identifier, name);
2682 void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
2684 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2687 RNA_property_float_get_array(ptr, prop, values);
2689 printf("RNA_float_get_array: %s.%s not found.\n", ptr->type->identifier, name);
2692 void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
2694 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2697 RNA_property_float_set_array(ptr, prop, values);
2699 printf("RNA_float_set_array: %s.%s not found.\n", ptr->type->identifier, name);
2702 int RNA_enum_get(PointerRNA *ptr, const char *name)
2704 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2707 return RNA_property_enum_get(ptr, prop);
2710 printf("RNA_enum_get: %s.%s not found.\n", ptr->type->identifier, name);
2715 void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
2717 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2720 RNA_property_enum_set(ptr, prop, value);
2722 printf("RNA_enum_set: %s.%s not found.\n", ptr->type->identifier, name);
2725 int RNA_enum_is_equal(bContext *C, PointerRNA *ptr, const char *name, const char *enumname)
2727 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2728 EnumPropertyItem *item;
2732 RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
2734 for(; item->identifier; item++)
2735 if(strcmp(item->identifier, enumname) == 0)
2736 return (item->value == RNA_property_enum_get(ptr, prop));
2741 printf("RNA_enum_is_equal: %s.%s item %s not found.\n", ptr->type->identifier, name, enumname);
2745 printf("RNA_enum_is_equal: %s.%s not found.\n", ptr->type->identifier, name);
2750 int RNA_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int *value)
2752 for( ; item->identifier; item++) {
2753 if(strcmp(item->identifier, identifier)==0) {
2754 *value= item->value;
2762 int RNA_enum_id_from_value(EnumPropertyItem *item, int value, const char **identifier)
2764 for( ; item->identifier; item++) {
2765 if(item->value==value) {
2766 *identifier= item->identifier;
2774 void RNA_string_get(PointerRNA *ptr, const char *name, char *value)
2776 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2779 RNA_property_string_get(ptr, prop, value);
2781 printf("RNA_string_get: %s.%s not found.\n", ptr->type->identifier, name);
2784 char *RNA_string_get_alloc(PointerRNA *ptr, const char *name, char *fixedbuf, int fixedlen)
2786 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2789 return RNA_property_string_get_alloc(ptr, prop, fixedbuf, fixedlen);
2792 printf("RNA_string_get_alloc: %s.%s not found.\n", ptr->type->identifier, name);
2797 int RNA_string_length(PointerRNA *ptr, const char *name)
2799 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2802 return RNA_property_string_length(ptr, prop);
2805 printf("RNA_string_length: %s.%s not found.\n", ptr->type->identifier, name);
2810 void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
2812 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2815 RNA_property_string_set(ptr, prop, value);
2817 printf("RNA_string_set: %s.%s not found.\n", ptr->type->identifier, name);
2820 PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
2822 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2825 return RNA_property_pointer_get(ptr, prop);
2830 printf("RNA_pointer_get: %s.%s not found.\n", ptr->type->identifier, name);
2832 memset(&result, 0, sizeof(result));
2837 void RNA_pointer_set(PointerRNA *ptr, const char *name, PointerRNA ptr_value)
2839 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2842 RNA_property_pointer_set(ptr, prop, ptr_value);
2845 printf("RNA_pointer_set: %s.%s not found.\n", ptr->type->identifier, name);
2849 void RNA_pointer_add(PointerRNA *ptr, const char *name)
2851 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2854 RNA_property_pointer_add(ptr, prop);
2856 printf("RNA_pointer_set: %s.%s not found.\n", ptr->type->identifier, name);
2859 void RNA_collection_begin(PointerRNA *ptr, const char *name, CollectionPropertyIterator *iter)
2861 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2864 RNA_property_collection_begin(ptr, prop, iter);
2866 printf("RNA_collection_begin: %s.%s not found.\n", ptr->type->identifier, name);
2869 void RNA_collection_add(PointerRNA *ptr, const char *name, PointerRNA *r_value)
2871 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2874 RNA_property_collection_add(ptr, prop, r_value);
2876 printf("RNA_collection_add: %s.%s not found.\n", ptr->type->identifier, name);
2879 void RNA_collection_clear(PointerRNA *ptr, const char *name)
2881 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2884 RNA_property_collection_clear(ptr, prop);
2886 printf("RNA_collection_clear: %s.%s not found.\n", ptr->type->identifier, name);
2889 int RNA_collection_length(PointerRNA *ptr, const char *name)
2891 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2894 return RNA_property_collection_length(ptr, prop);
2897 printf("RNA_collection_length: %s.%s not found.\n", ptr->type->identifier, name);
2902 int RNA_property_is_set(PointerRNA *ptr, const char *name)
2904 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2907 if(prop->flag & PROP_IDPROPERTY)
2908 return (rna_idproperty_find(ptr, name) != NULL);
2913 // printf("RNA_property_is_set: %s.%s not found.\n", ptr->type->identifier, name);
2918 /* string representation of a property, python
2919 * compatible but can be used for display too*/
2920 char *RNA_pointer_as_string(PointerRNA *ptr)
2922 DynStr *dynstr= BLI_dynstr_new();
2925 const char *propname;
2928 BLI_dynstr_append(dynstr, "{");
2930 RNA_STRUCT_BEGIN(ptr, prop) {
2931 propname = RNA_property_identifier(prop);
2933 if(strcmp(propname, "rna_type")==0)
2937 BLI_dynstr_append(dynstr, ", ");
2940 cstring = RNA_property_as_string(NULL, ptr, prop);
2941 BLI_dynstr_appendf(dynstr, "\"%s\":%s", propname, cstring);
2946 BLI_dynstr_append(dynstr, "}");
2949 cstring = BLI_dynstr_get_cstring(dynstr);
2950 BLI_dynstr_free(dynstr);
2954 char *RNA_property_as_string(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
2956 int type = RNA_property_type(prop);
2957 int len = RNA_property_array_length(ptr, prop);
2960 DynStr *dynstr= BLI_dynstr_new();
2964 /* see if we can coorce into a python type - PropertyType */
2968 BLI_dynstr_append(dynstr, RNA_property_boolean_get(ptr, prop) ? "True" : "False");
2971 BLI_dynstr_append(dynstr, "(");
2972 for(i=0; i<len; i++) {
2973 BLI_dynstr_appendf(dynstr, i?", %s":"%s", RNA_property_boolean_get_index(ptr, prop, i) ? "True" : "False");
2976 BLI_dynstr_append(dynstr, ","); /* otherwise python wont see it as a tuple */
2977 BLI_dynstr_append(dynstr, ")");
2982 BLI_dynstr_appendf(dynstr, "%d", RNA_property_int_get(ptr, prop));
2985 BLI_dynstr_append(dynstr, "(");
2986 for(i=0; i<len; i++) {
2987 BLI_dynstr_appendf(dynstr, i?", %d":"%d", RNA_property_int_get_index(ptr, prop, i));
2990 BLI_dynstr_append(dynstr, ","); /* otherwise python wont see it as a tuple */
2991 BLI_dynstr_append(dynstr, ")");
2996 BLI_dynstr_appendf(dynstr, "%g", RNA_property_float_get(ptr, prop));
2999 BLI_dynstr_append(dynstr, "(");
3000 for(i=0; i<len; i++) {
3001 BLI_dynstr_appendf(dynstr, i?", %g":"%g", RNA_property_float_get_index(ptr, prop, i));
3004 BLI_dynstr_append(dynstr, ","); /* otherwise python wont see it as a tuple */
3005 BLI_dynstr_append(dynstr, ")");
3010 /* string arrays dont exist */
3012 buf = RNA_property_string_get_alloc(ptr, prop, NULL, -1);
3013 BLI_dynstr_appendf(dynstr, "\"%s\"", buf);
3019 /* string arrays dont exist */
3020 const char *identifier;
3021 int val = RNA_property_enum_get(ptr, prop);
3023 if(RNA_property_enum_identifier(C, ptr, prop, val, &identifier)) {
3024 BLI_dynstr_appendf(dynstr, "'%s'", identifier);
3027 BLI_dynstr_appendf(dynstr, "'<UNKNOWN ENUM>'", identifier);
3033 BLI_dynstr_append(dynstr, "'<POINTER>'"); /* TODO */
3036 case PROP_COLLECTION:
3039 CollectionPropertyIterator collect_iter;
3040 BLI_dynstr_append(dynstr, "[");
3042 for(RNA_property_collection_begin(ptr, prop, &collect_iter); collect_iter.valid; RNA_property_collection_next(&collect_iter)) {
3043 PointerRNA itemptr= collect_iter.ptr;
3046 BLI_dynstr_append(dynstr, ", ");
3049 /* now get every prop of the collection */
3050 cstring= RNA_pointer_as_string(&itemptr);
3051 BLI_dynstr_append(dynstr, cstring);
3055 RNA_property_collection_end(&collect_iter);
3056 BLI_dynstr_append(dynstr, "]");
3060 BLI_dynstr_append(dynstr, "'<UNKNOWN TYPE>'"); /* TODO */
3064 cstring = BLI_dynstr_get_cstring(dynstr);
3065 BLI_dynstr_free(dynstr);
3071 const char *RNA_function_identifier(FunctionRNA *func)
3073 return func->identifier;
3076 PropertyRNA *RNA_function_return(FunctionRNA *func)
3081 const char *RNA_function_ui_description(FunctionRNA *func)
3083 return func->description;
3086 int RNA_function_flag(FunctionRNA *func)
3091 PropertyRNA *RNA_function_get_parameter(PointerRNA *ptr, FunctionRNA *func, int index)
3096 parm= func->cont.properties.first;
3097 for(i= 0; parm; parm= parm->next, i++)
3104 PropertyRNA *RNA_function_find_parameter(PointerRNA *ptr, FunctionRNA *func, const char *identifier)
3108 parm= func->cont.properties.first;
3109 for(; parm; parm= parm->next)
3110 if(strcmp(parm->identifier, identifier)==0)
3116 const struct ListBase *RNA_function_defined_parameters(FunctionRNA *func)
3118 return &func->cont.properties;
3123 ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *ptr, FunctionRNA *func)
3130 for(parm= func->cont.properties.first; parm; parm= parm->next)
3131 tot+= rna_parameter_size(parm);
3133 parms->data= MEM_callocN(tot, "RNA_parameter_list_create");
3137 /* set default values */
3140 for(parm= func->cont.properties.first; parm; parm= parm->next) {
3141 size= rna_parameter_size(parm);
3143 if(!(parm->flag & PROP_REQUIRED)) {
3144 switch(parm->type) {
3146 if(parm->arraydimension) memcpy(data, &((BooleanPropertyRNA*)parm)->defaultarray, size);
3147 else memcpy(data, &((BooleanPropertyRNA*)parm)->defaultvalue, size);
3150 if(parm->arraydimension) memcpy(data, &((IntPropertyRNA*)parm)->defaultarray, size);
3151 else memcpy(data, &((IntPropertyRNA*)parm)->defaultvalue, size);
3154 if(parm->arraydimension) memcpy(data, &((FloatPropertyRNA*)parm)->defaultarray, size);
3155 else memcpy(data, &((FloatPropertyRNA*)parm)->defaultvalue, size);
3158 memcpy(data, &((EnumPropertyRNA*)parm)->defaultvalue, size);
3161 const char *defvalue= ((StringPropertyRNA*)parm)->defaultvalue;
3162 if(defvalue && defvalue[0])
3163 memcpy(data, &defvalue, size);
3167 case PROP_COLLECTION:
3172 data= ((char*)data) + size;
3178 void RNA_parameter_list_free(ParameterList *parms)
3183 parm= parms->func->cont.properties.first;
3184 for(tot= 0; parm; parm= parm->next) {
3185 if(parm->type == PROP_COLLECTION)
3186 BLI_freelistN((ListBase*)((char*)parms->data+tot));
3187 else if (parm->flag & PROP_DYNAMIC) {
3188 /* for dynamic arrays and strings, data is a pointer to an array */
3189 char *array= *(char**)((char*)parms->data+tot);
3194 tot+= rna_parameter_size(parm);
3197 MEM_freeN(parms->data);
3203 int RNA_parameter_list_size(ParameterList *parms)
3208 void RNA_parameter_list_begin(ParameterList *parms, ParameterIterator *iter)
3212 RNA_pointer_create(NULL, &RNA_Function, parms->func, &iter->funcptr);
3215 iter->parm= parms->func->cont.properties.first;
3216 iter->valid= iter->parm != NULL;
3220 iter->size= rna_parameter_size(iter->parm);
3221 iter->data= (((char*)iter->parms->data)+iter->offset);
3222 ptype= RNA_property_type(iter->parm);
3226 void RNA_parameter_list_next(ParameterIterator *iter)
3230 iter->offset+= iter->size;
3231 iter->parm= iter->parm->next;
3232 iter->valid= iter->parm != NULL;
3235 iter->size= rna_parameter_size(iter->parm);
3236 iter->data= (((char*)iter->parms->data)+iter->offset);
3237 ptype= RNA_property_type(iter->parm);
3241 void RNA_parameter_list_end(ParameterIterator *iter)
3246 void RNA_parameter_get(ParameterList *parms, PropertyRNA *parm, void **value)
3248 ParameterIterator iter;
3250 RNA_parameter_list_begin(parms, &iter);
3252 for(; iter.valid; RNA_parameter_list_next(&iter))
3261 RNA_parameter_list_end(&iter);
3264 void RNA_parameter_get_lookup(ParameterList *parms, const char *identifier, void **value)
3268 parm= parms->func->cont.properties.first;
3269 for(; parm; parm= parm->next)
3270 if(strcmp(RNA_property_identifier(parm), identifier)==0)
3274 RNA_parameter_get(parms, parm, value);
3277 void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, void *value)
3279 ParameterIterator iter;
3281 RNA_parameter_list_begin(parms, &iter);