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_ensure_property_array_length(PointerRNA *ptr, PropertyRNA *prop)
214 if(prop->magic == RNA_MAGIC) {
215 int arraylen[RNA_MAX_ARRAY_DIMENSION];
216 return (prop->getlength)? prop->getlength(ptr, arraylen): prop->totarraylength;
219 IDProperty *idprop= (IDProperty*)prop;
221 if(idprop->type == IDP_ARRAY)
228 static int rna_ensure_property_array_check(PointerRNA *ptr, PropertyRNA *prop)
230 if(prop->magic == RNA_MAGIC) {
231 return (prop->getlength || prop->totarraylength) ? 1:0;
234 IDProperty *idprop= (IDProperty*)prop;
236 return idprop->type == IDP_ARRAY ? 1:0;
240 static void rna_ensure_property_multi_array_length(PointerRNA *ptr, PropertyRNA *prop, int length[])
242 if(prop->magic == RNA_MAGIC) {
244 prop->getlength(ptr, length);
246 memcpy(length, prop->arraylength, prop->arraydimension*sizeof(int));
249 IDProperty *idprop= (IDProperty*)prop;
251 if(idprop->type == IDP_ARRAY)
252 length[0]= idprop->len;
258 static int rna_idproperty_verify_valid(PointerRNA *ptr, PropertyRNA *prop, IDProperty *idprop)
260 /* this verifies if the idproperty actually matches the property
261 * description and otherwise removes it. this is to ensure that
262 * rna property access is type safe, e.g. if you defined the rna
263 * to have a certain array length you can count on that staying so */
265 switch(idprop->type) {
267 if(prop->type != PROP_COLLECTION)
271 if(rna_ensure_property_array_length(ptr, prop) != idprop->len)
274 if(idprop->subtype == IDP_FLOAT && prop->type != PROP_FLOAT)
276 if(idprop->subtype == IDP_INT && !ELEM3(prop->type, PROP_BOOLEAN, PROP_INT, PROP_ENUM))
281 if(!ELEM3(prop->type, PROP_BOOLEAN, PROP_INT, PROP_ENUM))
286 if(prop->type != PROP_FLOAT)
290 if(prop->type != PROP_STRING)
294 if(prop->type != PROP_POINTER)
304 static PropertyRNA *typemap[IDP_NUMTYPES] =
305 {(PropertyRNA*)&rna_IDProperty_string,
306 (PropertyRNA*)&rna_IDProperty_int,
307 (PropertyRNA*)&rna_IDProperty_float,
309 (PropertyRNA*)&rna_IDProperty_group, NULL,
310 (PropertyRNA*)&rna_IDProperty_double};
312 static PropertyRNA *arraytypemap[IDP_NUMTYPES] =
313 {NULL, (PropertyRNA*)&rna_IDProperty_int_array,
314 (PropertyRNA*)&rna_IDProperty_float_array,
316 (PropertyRNA*)&rna_IDProperty_collection, NULL,
317 (PropertyRNA*)&rna_IDProperty_double_array};
319 IDProperty *rna_idproperty_check(PropertyRNA **prop, PointerRNA *ptr)
321 /* This is quite a hack, but avoids some complexity in the API. we
322 * pass IDProperty structs as PropertyRNA pointers to the outside.
323 * We store some bytes in PropertyRNA structs that allows us to
324 * distinguish it from IDProperty structs. If it is an ID property,
325 * we look up an IDP PropertyRNA based on the type, and set the data
326 * pointer to the IDProperty. */
328 if((*prop)->magic == RNA_MAGIC) {
329 if((*prop)->flag & PROP_IDPROPERTY) {
330 IDProperty *idprop= rna_idproperty_find(ptr, (*prop)->identifier);
332 if(idprop && !rna_idproperty_verify_valid(ptr, *prop, idprop)) {
333 IDProperty *group= RNA_struct_idproperties(ptr, 0);
335 IDP_RemFromGroup(group, idprop);
336 IDP_FreeProperty(idprop);
348 IDProperty *idprop= (IDProperty*)(*prop);
350 if(idprop->type == IDP_ARRAY)
351 *prop= arraytypemap[(int)(idprop->subtype)];
353 *prop= typemap[(int)(idprop->type)];
359 static PropertyRNA *rna_ensure_property(PropertyRNA *prop)
361 /* the quick version if we don't need the idproperty */
363 if(prop->magic == RNA_MAGIC)
367 IDProperty *idprop= (IDProperty*)prop;
369 if(idprop->type == IDP_ARRAY)
370 return arraytypemap[(int)(idprop->subtype)];
372 return typemap[(int)(idprop->type)];
376 static const char *rna_ensure_property_identifier(PropertyRNA *prop)
378 if(prop->magic == RNA_MAGIC)
379 return prop->identifier;
381 return ((IDProperty*)prop)->name;
384 static const char *rna_ensure_property_description(PropertyRNA *prop)
386 if(prop->magic == RNA_MAGIC)
387 return prop->description;
389 return ((IDProperty*)prop)->name; /* XXX - not correct */
392 static const char *rna_ensure_property_name(PropertyRNA *prop)
394 if(prop->magic == RNA_MAGIC)
397 return ((IDProperty*)prop)->name;
402 const char *RNA_struct_identifier(StructRNA *type)
404 return type->identifier;
407 const char *RNA_struct_ui_name(StructRNA *type)
412 int RNA_struct_ui_icon(StructRNA *type)
420 const char *RNA_struct_ui_description(StructRNA *type)
422 return type->description;
425 PropertyRNA *RNA_struct_name_property(StructRNA *type)
427 return type->nameproperty;
430 PropertyRNA *RNA_struct_iterator_property(StructRNA *type)
432 return type->iteratorproperty;
435 StructRNA *RNA_struct_base(StructRNA *type)
440 int RNA_struct_is_ID(StructRNA *type)
442 return (type->flag & STRUCT_ID) != 0;
445 int RNA_struct_is_a(StructRNA *type, StructRNA *srna)
452 /* ptr->type is always maximally refined */
453 for(base=type; base; base=base->base)
460 PropertyRNA *RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
462 PropertyRNA *iterprop= RNA_struct_iterator_property(ptr->type);
465 if(RNA_property_collection_lookup_string(ptr, iterprop, identifier, &propptr))
471 /* Find the property which uses the given nested struct */
472 PropertyRNA *RNA_struct_find_nested(PointerRNA *ptr, StructRNA *srna)
474 PropertyRNA *prop= NULL;
476 RNA_STRUCT_BEGIN(ptr, iprop) {
477 /* This assumes that there can only be one user of this nested struct */
478 if (RNA_property_pointer_type(ptr, iprop) == srna) {
488 const struct ListBase *RNA_struct_defined_properties(StructRNA *srna)
490 return &srna->cont.properties;
493 FunctionRNA *RNA_struct_find_function(PointerRNA *ptr, const char *identifier)
496 PropertyRNA *iterprop;
499 RNA_pointer_create(NULL, &RNA_Struct, ptr->type, &tptr);
500 iterprop= RNA_struct_find_property(&tptr, "functions");
504 RNA_PROP_BEGIN(&tptr, funcptr, iterprop) {
505 if(strcmp(identifier, RNA_function_identifier(funcptr.data)) == 0) {
515 const struct ListBase *RNA_struct_defined_functions(StructRNA *srna)
517 return &srna->functions;
520 StructRegisterFunc RNA_struct_register(StructRNA *type)
525 StructUnregisterFunc RNA_struct_unregister(StructRNA *type)
530 } while((type=type->base));
535 void *RNA_struct_py_type_get(StructRNA *srna)
537 return srna->py_type;
540 void RNA_struct_py_type_set(StructRNA *srna, void *py_type)
542 srna->py_type= py_type;
545 void *RNA_struct_blender_type_get(StructRNA *srna)
547 return srna->blender_type;
550 void RNA_struct_blender_type_set(StructRNA *srna, void *blender_type)
552 srna->blender_type= blender_type;
555 char *RNA_struct_name_get_alloc(PointerRNA *ptr, char *fixedbuf, int fixedlen)
557 PropertyRNA *nameprop;
559 if(ptr->data && (nameprop = RNA_struct_name_property(ptr->type)))
560 return RNA_property_string_get_alloc(ptr, nameprop, fixedbuf, fixedlen);
565 /* Property Information */
567 const char *RNA_property_identifier(PropertyRNA *prop)
569 return rna_ensure_property_identifier(prop);
572 const char *RNA_property_description(PropertyRNA *prop)
574 return rna_ensure_property_description(prop);
577 PropertyType RNA_property_type(PropertyRNA *prop)
579 return rna_ensure_property(prop)->type;
582 PropertySubType RNA_property_subtype(PropertyRNA *prop)
584 return rna_ensure_property(prop)->subtype;
587 PropertyUnit RNA_property_unit(PropertyRNA *prop)
589 return RNA_SUBTYPE_UNIT(rna_ensure_property(prop)->subtype);
592 int RNA_property_flag(PropertyRNA *prop)
594 return rna_ensure_property(prop)->flag;
597 int RNA_property_array_length(PointerRNA *ptr, PropertyRNA *prop)
599 return rna_ensure_property_array_length(ptr, prop);
602 int RNA_property_array_check(PointerRNA *ptr, PropertyRNA *prop)
604 return rna_ensure_property_array_check(ptr, prop);
607 /* used by BPY to make an array from the python object */
608 int RNA_property_array_dimension(PointerRNA *ptr, PropertyRNA *prop, int length[])
610 PropertyRNA *rprop= rna_ensure_property(prop);
612 if(length && rprop->arraydimension > 1)
613 rna_ensure_property_multi_array_length(ptr, prop, length);
615 return rprop->arraydimension;
618 /* Return the size of Nth dimension. */
619 int RNA_property_multi_array_length(PointerRNA *ptr, PropertyRNA *prop, int dim)
621 int len[RNA_MAX_ARRAY_DIMENSION];
623 rna_ensure_property_multi_array_length(ptr, prop, len);
628 char RNA_property_array_item_char(PropertyRNA *prop, int index)
630 const char *vectoritem= "XYZW";
631 const char *quatitem= "WXYZ";
632 const char *coloritem= "RGBA";
633 PropertySubType subtype= rna_ensure_property(prop)->subtype;
635 /* get string to use for array index */
636 if ((index < 4) && ELEM(subtype, PROP_QUATERNION, PROP_AXISANGLE))
637 return quatitem[index];
638 else if((index < 4) && ELEM6(subtype, PROP_TRANSLATION, PROP_DIRECTION, PROP_XYZ, PROP_EULER, PROP_VELOCITY, PROP_ACCELERATION))
639 return vectoritem[index];
640 else if ((index < 4) && ELEM(subtype, PROP_COLOR, PROP_RGB))
641 return coloritem[index];
646 void RNA_property_int_range(PointerRNA *ptr, PropertyRNA *prop, int *hardmin, int *hardmax)
648 IntPropertyRNA *iprop= (IntPropertyRNA*)rna_ensure_property(prop);
651 iprop->range(ptr, hardmin, hardmax);
654 *hardmin= iprop->hardmin;
655 *hardmax= iprop->hardmax;
659 void RNA_property_int_ui_range(PointerRNA *ptr, PropertyRNA *prop, int *softmin, int *softmax, int *step)
661 IntPropertyRNA *iprop= (IntPropertyRNA*)rna_ensure_property(prop);
662 int hardmin, hardmax;
665 iprop->range(ptr, &hardmin, &hardmax);
666 *softmin= MAX2(iprop->softmin, hardmin);
667 *softmax= MIN2(iprop->softmax, hardmax);
670 *softmin= iprop->softmin;
671 *softmax= iprop->softmax;
677 void RNA_property_float_range(PointerRNA *ptr, PropertyRNA *prop, float *hardmin, float *hardmax)
679 FloatPropertyRNA *fprop= (FloatPropertyRNA*)rna_ensure_property(prop);
682 fprop->range(ptr, hardmin, hardmax);
685 *hardmin= fprop->hardmin;
686 *hardmax= fprop->hardmax;
690 void RNA_property_float_ui_range(PointerRNA *ptr, PropertyRNA *prop, float *softmin, float *softmax, float *step, float *precision)
692 FloatPropertyRNA *fprop= (FloatPropertyRNA*)rna_ensure_property(prop);
693 float hardmin, hardmax;
696 fprop->range(ptr, &hardmin, &hardmax);
697 *softmin= MAX2(fprop->softmin, hardmin);
698 *softmax= MIN2(fprop->softmax, hardmax);
701 *softmin= fprop->softmin;
702 *softmax= fprop->softmax;
706 *precision= (float)fprop->precision;
709 int RNA_property_string_maxlength(PropertyRNA *prop)
711 StringPropertyRNA *sprop= (StringPropertyRNA*)rna_ensure_property(prop);
712 return sprop->maxlength;
715 StructRNA *RNA_property_pointer_type(PointerRNA *ptr, PropertyRNA *prop)
717 prop= rna_ensure_property(prop);
719 if(prop->type == PROP_POINTER) {
720 PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
723 return pprop->typef(ptr);
727 else if(prop->type == PROP_COLLECTION) {
728 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
734 return &RNA_UnknownType;
737 /* Reuse for dynamic types */
738 EnumPropertyItem DummyRNA_NULL_items[] = {
739 {0, NULL, 0, NULL, NULL}
742 void RNA_property_enum_items(bContext *C, PointerRNA *ptr, PropertyRNA *prop, EnumPropertyItem **item, int *totitem, int *free)
744 EnumPropertyRNA *eprop= (EnumPropertyRNA*)rna_ensure_property(prop);
748 if(eprop->itemf && C) {
750 *item= eprop->itemf(C, ptr, free);
754 for( ; (*item)[tot].identifier; tot++);
763 *totitem= eprop->totitem;
767 int RNA_property_enum_value(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const char *identifier, int *value)
769 EnumPropertyItem *item;
772 RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
774 for(; item->identifier; item++) {
775 if(item->identifier[0] && strcmp(item->identifier, identifier)==0) {
776 *value = item->value;
787 int RNA_enum_identifier(EnumPropertyItem *item, const int value, const char **identifier)
789 for (; item->identifier; item++) {
790 if(item->identifier[0] && item->value==value) {
791 *identifier = item->identifier;
798 int RNA_enum_name(EnumPropertyItem *item, const int value, const char **name)
800 for (; item->identifier; item++) {
801 if(item->identifier[0] && item->value==value) {
809 int RNA_property_enum_identifier(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier)
811 EnumPropertyItem *item= NULL;
814 RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
816 result= RNA_enum_identifier(item, value, identifier);
825 const char *RNA_property_ui_name(PropertyRNA *prop)
827 return rna_ensure_property_name(prop);
830 const char *RNA_property_ui_description(PropertyRNA *prop)
832 return rna_ensure_property(prop)->description;
835 int RNA_property_ui_icon(PropertyRNA *prop)
837 return rna_ensure_property(prop)->icon;
840 int RNA_property_editable(PointerRNA *ptr, PropertyRNA *prop)
845 prop= rna_ensure_property(prop);
848 flag= prop->editable(ptr);
854 return (flag & PROP_EDITABLE) && (!id || !id->lib || (flag & PROP_LIB_EXCEPTION));
857 int RNA_property_animateable(PointerRNA *ptr, PropertyRNA *prop)
861 prop= rna_ensure_property(prop);
863 if(!(prop->flag & PROP_ANIMATEABLE))
867 flag= prop->editable(ptr);
871 return (flag & PROP_EDITABLE);
874 int RNA_property_animated(PointerRNA *ptr, PropertyRNA *prop)
876 /* would need to ask animation system */
881 void RNA_property_update(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
883 prop= rna_ensure_property(prop);
886 prop->update(C, ptr);
888 WM_event_add_notifier(C, prop->noteflag, ptr->id.data);
893 int RNA_property_boolean_get(PointerRNA *ptr, PropertyRNA *prop)
895 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
898 if((idprop=rna_idproperty_check(&prop, ptr)))
899 return IDP_Int(idprop);
901 return bprop->get(ptr);
903 return bprop->defaultvalue;
906 void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, int value)
908 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
911 /* just incase other values are passed */
914 if((idprop=rna_idproperty_check(&prop, ptr)))
915 IDP_Int(idprop)= value;
917 bprop->set(ptr, value);
918 else if(prop->flag & PROP_EDITABLE) {
919 IDPropertyTemplate val = {0};
924 group= RNA_struct_idproperties(ptr, 1);
926 IDP_AddToGroup(group, IDP_New(IDP_INT, val, (char*)prop->identifier));
930 void RNA_property_boolean_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values)
932 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
935 if((idprop=rna_idproperty_check(&prop, ptr))) {
936 if(prop->arraydimension == 0)
937 values[0]= RNA_property_boolean_get(ptr, prop);
939 memcpy(values, IDP_Array(idprop), sizeof(int)*idprop->len);
941 else if(prop->arraydimension == 0)
942 values[0]= RNA_property_boolean_get(ptr, prop);
943 else if(bprop->getarray)
944 bprop->getarray(ptr, values);
945 else if(bprop->defaultarray)
946 memcpy(values, bprop->defaultarray, sizeof(int)*prop->totarraylength);
948 memset(values, 0, sizeof(int)*prop->totarraylength);
951 int RNA_property_boolean_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
953 int tmp[RNA_MAX_ARRAY_LENGTH];
954 int len= rna_ensure_property_array_length(ptr, prop);
956 if(len <= RNA_MAX_ARRAY_LENGTH) {
957 RNA_property_boolean_get_array(ptr, prop, tmp);
961 int *tmparray, value;
963 tmparray= MEM_callocN(sizeof(int)*len, "RNA_property_boolean_get_index");
964 RNA_property_boolean_get_array(ptr, prop, tmparray);
965 value= tmparray[index];
972 void RNA_property_boolean_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *values)
974 BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
977 if((idprop=rna_idproperty_check(&prop, ptr))) {
978 if(prop->arraydimension == 0)
979 IDP_Int(idprop)= values[0];
981 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);
983 else if(prop->arraydimension == 0)
984 RNA_property_boolean_set(ptr, prop, values[0]);
985 else if(bprop->setarray)
986 bprop->setarray(ptr, values);
987 else if(prop->flag & PROP_EDITABLE) {
988 IDPropertyTemplate val = {0};
991 val.array.len= prop->totarraylength;
992 val.array.type= IDP_INT;
994 group= RNA_struct_idproperties(ptr, 1);
996 idprop= IDP_New(IDP_ARRAY, val, (char*)prop->identifier);
997 IDP_AddToGroup(group, idprop);
998 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);
1003 void RNA_property_boolean_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, int value)
1005 int tmp[RNA_MAX_ARRAY_LENGTH];
1006 int len= rna_ensure_property_array_length(ptr, prop);
1008 if(len <= RNA_MAX_ARRAY_LENGTH) {
1009 RNA_property_boolean_get_array(ptr, prop, tmp);
1011 RNA_property_boolean_set_array(ptr, prop, tmp);
1016 tmparray= MEM_callocN(sizeof(int)*len, "RNA_property_boolean_get_index");
1017 RNA_property_boolean_get_array(ptr, prop, tmparray);
1018 tmparray[index]= value;
1019 RNA_property_boolean_set_array(ptr, prop, tmparray);
1020 MEM_freeN(tmparray);
1024 int RNA_property_int_get(PointerRNA *ptr, PropertyRNA *prop)
1026 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
1029 if((idprop=rna_idproperty_check(&prop, ptr)))
1030 return IDP_Int(idprop);
1032 return iprop->get(ptr);
1034 return iprop->defaultvalue;
1037 void RNA_property_int_set(PointerRNA *ptr, PropertyRNA *prop, int value)
1039 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
1042 if((idprop=rna_idproperty_check(&prop, ptr)))
1043 IDP_Int(idprop)= value;
1045 iprop->set(ptr, value);
1046 else if(prop->flag & PROP_EDITABLE) {
1047 IDPropertyTemplate val = {0};
1052 group= RNA_struct_idproperties(ptr, 1);
1054 IDP_AddToGroup(group, IDP_New(IDP_INT, val, (char*)prop->identifier));
1058 void RNA_property_int_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values)
1060 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
1063 if((idprop=rna_idproperty_check(&prop, ptr))) {
1064 if(prop->arraydimension == 0)
1065 values[0]= RNA_property_int_get(ptr, prop);
1067 memcpy(values, IDP_Array(idprop), sizeof(int)*idprop->len);
1069 else if(prop->arraydimension == 0)
1070 values[0]= RNA_property_int_get(ptr, prop);
1071 else if(iprop->getarray)
1072 iprop->getarray(ptr, values);
1073 else if(iprop->defaultarray)
1074 memcpy(values, iprop->defaultarray, sizeof(int)*prop->totarraylength);
1076 memset(values, 0, sizeof(int)*prop->totarraylength);
1079 int RNA_property_int_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
1081 int tmp[RNA_MAX_ARRAY_LENGTH];
1082 int len= rna_ensure_property_array_length(ptr, prop);
1084 if(len <= RNA_MAX_ARRAY_LENGTH) {
1085 RNA_property_int_get_array(ptr, prop, tmp);
1089 int *tmparray, value;
1091 tmparray= MEM_callocN(sizeof(int)*len, "RNA_property_int_get_index");
1092 RNA_property_int_get_array(ptr, prop, tmparray);
1093 value= tmparray[index];
1094 MEM_freeN(tmparray);
1100 void RNA_property_int_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *values)
1102 IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
1105 if((idprop=rna_idproperty_check(&prop, ptr))) {
1106 if(prop->arraydimension == 0)
1107 IDP_Int(idprop)= values[0];
1109 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);\
1111 else if(prop->arraydimension == 0)
1112 RNA_property_int_set(ptr, prop, values[0]);
1113 else if(iprop->setarray)
1114 iprop->setarray(ptr, values);
1115 else if(prop->flag & PROP_EDITABLE) {
1116 IDPropertyTemplate val = {0};
1119 val.array.len= prop->totarraylength;
1120 val.array.type= IDP_INT;
1122 group= RNA_struct_idproperties(ptr, 1);
1124 idprop= IDP_New(IDP_ARRAY, val, (char*)prop->identifier);
1125 IDP_AddToGroup(group, idprop);
1126 memcpy(IDP_Array(idprop), values, sizeof(int)*idprop->len);
1131 void RNA_property_int_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, int value)
1133 int tmp[RNA_MAX_ARRAY_LENGTH];
1134 int len= rna_ensure_property_array_length(ptr, prop);
1136 if(len <= RNA_MAX_ARRAY_LENGTH) {
1137 RNA_property_int_get_array(ptr, prop, tmp);
1139 RNA_property_int_set_array(ptr, prop, tmp);
1144 tmparray= MEM_callocN(sizeof(int)*len, "RNA_property_int_get_index");
1145 RNA_property_int_get_array(ptr, prop, tmparray);
1146 tmparray[index]= value;
1147 RNA_property_int_set_array(ptr, prop, tmparray);
1148 MEM_freeN(tmparray);
1152 float RNA_property_float_get(PointerRNA *ptr, PropertyRNA *prop)
1154 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
1157 if((idprop=rna_idproperty_check(&prop, ptr))) {
1158 if(idprop->type == IDP_FLOAT)
1159 return IDP_Float(idprop);
1161 return (float)IDP_Double(idprop);
1164 return fprop->get(ptr);
1166 return fprop->defaultvalue;
1169 void RNA_property_float_set(PointerRNA *ptr, PropertyRNA *prop, float value)
1171 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
1174 if((idprop=rna_idproperty_check(&prop, ptr))) {
1175 if(idprop->type == IDP_FLOAT)
1176 IDP_Float(idprop)= value;
1178 IDP_Double(idprop)= value;
1180 else if(fprop->set) {
1181 fprop->set(ptr, value);
1183 else if(prop->flag & PROP_EDITABLE) {
1184 IDPropertyTemplate val = {0};
1189 group= RNA_struct_idproperties(ptr, 1);
1191 IDP_AddToGroup(group, IDP_New(IDP_FLOAT, val, (char*)prop->identifier));
1195 void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *values)
1197 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
1201 if((idprop=rna_idproperty_check(&prop, ptr))) {
1202 if(prop->arraydimension == 0)
1203 values[0]= RNA_property_float_get(ptr, prop);
1204 else if(idprop->subtype == IDP_FLOAT) {
1205 memcpy(values, IDP_Array(idprop), sizeof(float)*idprop->len);
1208 for(i=0; i<idprop->len; i++)
1209 values[i]= (float)(((double*)IDP_Array(idprop))[i]);
1212 else if(prop->arraydimension == 0)
1213 values[0]= RNA_property_float_get(ptr, prop);
1214 else if(fprop->getarray)
1215 fprop->getarray(ptr, values);
1216 else if(fprop->defaultarray)
1217 memcpy(values, fprop->defaultarray, sizeof(float)*prop->totarraylength);
1219 memset(values, 0, sizeof(float)*prop->totarraylength);
1222 float RNA_property_float_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
1224 float tmp[RNA_MAX_ARRAY_LENGTH];
1225 int len= rna_ensure_property_array_length(ptr, prop);
1227 if(len <= RNA_MAX_ARRAY_LENGTH) {
1228 RNA_property_float_get_array(ptr, prop, tmp);
1232 float *tmparray, value;
1234 tmparray= MEM_callocN(sizeof(float)*len, "RNA_property_float_get_index");
1235 RNA_property_float_get_array(ptr, prop, tmparray);
1236 value= tmparray[index];
1237 MEM_freeN(tmparray);
1244 void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const float *values)
1246 FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
1250 if((idprop=rna_idproperty_check(&prop, ptr))) {
1251 if(prop->arraydimension == 0)
1252 IDP_Double(idprop)= values[0];
1253 else if(idprop->subtype == IDP_FLOAT) {
1254 memcpy(IDP_Array(idprop), values, sizeof(float)*idprop->len);
1257 for(i=0; i<idprop->len; i++)
1258 ((double*)IDP_Array(idprop))[i]= values[i];
1261 else if(prop->arraydimension == 0)
1262 RNA_property_float_set(ptr, prop, values[0]);
1263 else if(fprop->setarray) {
1264 fprop->setarray(ptr, values);
1266 else if(prop->flag & PROP_EDITABLE) {
1267 IDPropertyTemplate val = {0};
1270 val.array.len= prop->totarraylength;
1271 val.array.type= IDP_FLOAT;
1273 group= RNA_struct_idproperties(ptr, 1);
1275 idprop= IDP_New(IDP_ARRAY, val, (char*)prop->identifier);
1276 IDP_AddToGroup(group, idprop);
1277 memcpy(IDP_Array(idprop), values, sizeof(float)*idprop->len);
1282 void RNA_property_float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, float value)
1284 float tmp[RNA_MAX_ARRAY_LENGTH];
1285 int len= rna_ensure_property_array_length(ptr, prop);
1287 if(len <= RNA_MAX_ARRAY_LENGTH) {
1288 RNA_property_float_get_array(ptr, prop, tmp);
1290 RNA_property_float_set_array(ptr, prop, tmp);
1295 tmparray= MEM_callocN(sizeof(float)*len, "RNA_property_float_get_index");
1296 RNA_property_float_get_array(ptr, prop, tmparray);
1297 tmparray[index]= value;
1298 RNA_property_float_set_array(ptr, prop, tmparray);
1299 MEM_freeN(tmparray);
1303 void RNA_property_string_get(PointerRNA *ptr, PropertyRNA *prop, char *value)
1305 StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
1308 if((idprop=rna_idproperty_check(&prop, ptr)))
1309 strcpy(value, IDP_String(idprop));
1311 sprop->get(ptr, value);
1313 strcpy(value, sprop->defaultvalue);
1316 char *RNA_property_string_get_alloc(PointerRNA *ptr, PropertyRNA *prop, char *fixedbuf, int fixedlen)
1321 length= RNA_property_string_length(ptr, prop);
1323 if(length+1 < fixedlen)
1326 buf= MEM_callocN(sizeof(char)*(length+1), "RNA_string_get_alloc");
1328 RNA_property_string_get(ptr, prop, buf);
1333 int RNA_property_string_length(PointerRNA *ptr, PropertyRNA *prop)
1335 StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
1338 if((idprop=rna_idproperty_check(&prop, ptr)))
1339 return strlen(IDP_String(idprop));
1340 else if(sprop->length)
1341 return sprop->length(ptr);
1343 return strlen(sprop->defaultvalue);
1346 void RNA_property_string_set(PointerRNA *ptr, PropertyRNA *prop, const char *value)
1348 StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
1351 if((idprop=rna_idproperty_check(&prop, ptr)))
1352 IDP_AssignString(idprop, (char*)value);
1354 sprop->set(ptr, value);
1355 else if(prop->flag & PROP_EDITABLE) {
1356 IDPropertyTemplate val = {0};
1359 val.str= (char*)value;
1361 group= RNA_struct_idproperties(ptr, 1);
1363 IDP_AddToGroup(group, IDP_New(IDP_STRING, val, (char*)prop->identifier));
1367 int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
1369 EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
1372 if((idprop=rna_idproperty_check(&prop, ptr)))
1373 return IDP_Int(idprop);
1375 return eprop->get(ptr);
1377 return eprop->defaultvalue;
1381 void RNA_property_enum_set(PointerRNA *ptr, PropertyRNA *prop, int value)
1383 EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
1386 if((idprop=rna_idproperty_check(&prop, ptr)))
1387 IDP_Int(idprop)= value;
1388 else if(eprop->set) {
1389 eprop->set(ptr, value);
1391 else if(prop->flag & PROP_EDITABLE) {
1392 IDPropertyTemplate val = {0};
1397 group= RNA_struct_idproperties(ptr, 1);
1399 IDP_AddToGroup(group, IDP_New(IDP_INT, val, (char*)prop->identifier));
1403 PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop)
1405 PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
1408 if((idprop=rna_idproperty_check(&prop, ptr))) {
1409 pprop= (PointerPropertyRNA*)prop;
1411 /* for groups, data is idprop itself */
1412 return rna_pointer_inherit_refine(ptr, pprop->type, idprop);
1414 else if(pprop->get) {
1415 return pprop->get(ptr);
1417 else if(prop->flag & PROP_IDPROPERTY) {
1418 /* XXX temporary hack to add it automatically, reading should
1419 never do any write ops, to ensure thread safety etc .. */
1420 RNA_property_pointer_add(ptr, prop);
1421 return RNA_property_pointer_get(ptr, prop);
1426 memset(&result, 0, sizeof(result));
1431 void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr_value)
1435 if((idprop=rna_idproperty_check(&prop, ptr))) {
1439 PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
1441 if(pprop->set && !((prop->flag & PROP_NEVER_NULL) && ptr_value.data == NULL))
1442 pprop->set(ptr, ptr_value);
1446 void RNA_property_pointer_add(PointerRNA *ptr, PropertyRNA *prop)
1450 if((idprop=rna_idproperty_check(&prop, ptr))) {
1451 /* already exists */
1453 else if(prop->flag & PROP_IDPROPERTY) {
1454 IDPropertyTemplate val = {0};
1459 group= RNA_struct_idproperties(ptr, 1);
1461 IDP_AddToGroup(group, IDP_New(IDP_GROUP, val, (char*)prop->identifier));
1464 printf("RNA_property_pointer_add %s.%s: only supported for id properties.\n", ptr->type->identifier, prop->identifier);
1467 void RNA_property_pointer_remove(PointerRNA *ptr, PropertyRNA *prop)
1469 IDProperty *idprop, *group;
1471 if((idprop=rna_idproperty_check(&prop, ptr))) {
1472 group= RNA_struct_idproperties(ptr, 0);
1475 IDP_RemFromGroup(group, idprop);
1476 IDP_FreeProperty(idprop);
1481 printf("RNA_property_pointer_remove %s.%s: only supported for id properties.\n", ptr->type->identifier, prop->identifier);
1484 static void rna_property_collection_get_idp(CollectionPropertyIterator *iter)
1486 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)iter->prop;
1488 iter->ptr.data= rna_iterator_array_get(iter);
1489 iter->ptr.type= cprop->type;
1490 rna_pointer_inherit_id(cprop->type, &iter->parent, &iter->ptr);
1493 void RNA_property_collection_begin(PointerRNA *ptr, PropertyRNA *prop, CollectionPropertyIterator *iter)
1497 memset(iter, 0, sizeof(*iter));
1499 if((idprop=rna_idproperty_check(&prop, ptr)) || (prop->flag & PROP_IDPROPERTY)) {
1504 rna_iterator_array_begin(iter, IDP_IDPArray(idprop), sizeof(IDProperty), idprop->len, 0, NULL);
1506 rna_iterator_array_begin(iter, NULL, sizeof(IDProperty), 0, 0, NULL);
1509 rna_property_collection_get_idp(iter);
1514 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1515 cprop->begin(iter, ptr);
1519 void RNA_property_collection_next(CollectionPropertyIterator *iter)
1521 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)iter->prop;
1524 rna_iterator_array_next(iter);
1527 rna_property_collection_get_idp(iter);
1533 void RNA_property_collection_end(CollectionPropertyIterator *iter)
1535 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)iter->prop;
1538 rna_iterator_array_end(iter);
1543 int RNA_property_collection_length(PointerRNA *ptr, PropertyRNA *prop)
1545 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1548 if((idprop=rna_idproperty_check(&prop, ptr))) {
1551 else if(cprop->length) {
1552 return cprop->length(ptr);
1555 CollectionPropertyIterator iter;
1558 RNA_property_collection_begin(ptr, prop, &iter);
1559 for(; iter.valid; RNA_property_collection_next(&iter))
1561 RNA_property_collection_end(&iter);
1567 void RNA_property_collection_add(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *r_ptr)
1570 // CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1572 if((idprop=rna_idproperty_check(&prop, ptr))) {
1573 IDPropertyTemplate val = {0};
1576 item= IDP_New(IDP_GROUP, val, "");
1577 IDP_AppendArray(idprop, item);
1578 IDP_FreeProperty(item);
1581 else if(prop->flag & PROP_IDPROPERTY) {
1582 IDProperty *group, *item;
1583 IDPropertyTemplate val = {0};
1585 group= RNA_struct_idproperties(ptr, 1);
1587 idprop= IDP_NewIDPArray(prop->identifier);
1588 IDP_AddToGroup(group, idprop);
1590 item= IDP_New(IDP_GROUP, val, "");
1591 IDP_AppendArray(idprop, item);
1592 IDP_FreeProperty(item);
1597 /* py api calls directly */
1599 else if(cprop->add){
1600 if(!(cprop->add->flag & FUNC_USE_CONTEXT)) { /* XXX check for this somewhere else */
1601 ParameterList params;
1602 RNA_parameter_list_create(¶ms, ptr, cprop->add);
1603 RNA_function_call(NULL, NULL, ptr, cprop->add, ¶ms);
1604 RNA_parameter_list_free(¶ms);
1608 printf("RNA_property_collection_add %s.%s: not implemented for this property.\n", ptr->type->identifier, prop->identifier);*/
1613 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1615 r_ptr->data= IDP_GetIndexArray(idprop, idprop->len-1);
1616 r_ptr->type= cprop->type;
1617 rna_pointer_inherit_id(NULL, ptr, r_ptr);
1620 memset(r_ptr, 0, sizeof(*r_ptr));
1624 int RNA_property_collection_remove(PointerRNA *ptr, PropertyRNA *prop, int key)
1627 // CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1629 if((idprop=rna_idproperty_check(&prop, ptr))) {
1630 IDProperty tmp, *array;
1634 array= IDP_IDPArray(idprop);
1636 if(key >= 0 && key < len) {
1638 /* move element to be removed to the back */
1639 memcpy(&tmp, &array[key], sizeof(IDProperty));
1640 memmove(array+key, array+key+1, sizeof(IDProperty)*(len-key+1));
1641 memcpy(&array[len-1], &tmp, sizeof(IDProperty));
1644 IDP_ResizeIDPArray(idprop, len-1);
1649 else if(prop->flag & PROP_IDPROPERTY)
1652 /* py api calls directly */
1654 else if(cprop->remove){
1655 if(!(cprop->remove->flag & FUNC_USE_CONTEXT)) { /* XXX check for this somewhere else */
1656 ParameterList params;
1657 RNA_parameter_list_create(¶ms, ptr, cprop->remove);
1658 RNA_function_call(NULL, NULL, ptr, cprop->remove, ¶ms);
1659 RNA_parameter_list_free(¶ms);
1665 printf("RNA_property_collection_remove %s.%s: only supported for id properties.\n", ptr->type->identifier, prop->identifier);*/
1670 void RNA_property_collection_clear(PointerRNA *ptr, PropertyRNA *prop)
1674 if((idprop=rna_idproperty_check(&prop, ptr)))
1675 IDP_ResizeIDPArray(idprop, 0);
1678 int RNA_property_collection_lookup_index(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *t_ptr)
1680 CollectionPropertyIterator iter;
1683 RNA_property_collection_begin(ptr, prop, &iter);
1684 for(index=0; iter.valid; RNA_property_collection_next(&iter), index++) {
1685 if (iter.ptr.data == t_ptr->data)
1688 RNA_property_collection_end(&iter);
1690 /* did we find it? */
1697 int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int key, PointerRNA *r_ptr)
1699 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1701 if(cprop->lookupint) {
1702 /* we have a callback defined, use it */
1703 *r_ptr= cprop->lookupint(ptr, key);
1704 return (r_ptr->data != NULL);
1707 /* no callback defined, just iterate and find the nth item */
1708 CollectionPropertyIterator iter;
1711 RNA_property_collection_begin(ptr, prop, &iter);
1712 for(i=0; iter.valid; RNA_property_collection_next(&iter), i++) {
1718 RNA_property_collection_end(&iter);
1721 memset(r_ptr, 0, sizeof(*r_ptr));
1727 int RNA_property_collection_lookup_string(PointerRNA *ptr, PropertyRNA *prop, const char *key, PointerRNA *r_ptr)
1729 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1731 if(cprop->lookupstring) {
1732 /* we have a callback defined, use it */
1733 *r_ptr= cprop->lookupstring(ptr, key);
1734 return (r_ptr->data != NULL);
1737 /* no callback defined, compare with name properties if they exist */
1738 CollectionPropertyIterator iter;
1739 PropertyRNA *nameprop;
1740 char name[256], *nameptr;
1743 RNA_property_collection_begin(ptr, prop, &iter);
1744 for(; iter.valid; RNA_property_collection_next(&iter)) {
1745 if(iter.ptr.data && iter.ptr.type->nameproperty) {
1746 nameprop= iter.ptr.type->nameproperty;
1748 nameptr= RNA_property_string_get_alloc(&iter.ptr, nameprop, name, sizeof(name));
1750 if(strcmp(nameptr, key) == 0) {
1755 if((char *)&name != nameptr)
1762 RNA_property_collection_end(&iter);
1765 memset(r_ptr, 0, sizeof(*r_ptr));
1771 PropertyRNA *RNA_property_collection_active(PropertyRNA *prop)
1773 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1774 return cprop->active;
1777 FunctionRNA *RNA_property_collection_add_func(PropertyRNA *prop)
1779 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1783 FunctionRNA *RNA_property_collection_remove_func(PropertyRNA *prop)
1785 CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
1786 return cprop->remove;
1789 int RNA_property_collection_raw_array(PointerRNA *ptr, PropertyRNA *prop, PropertyRNA *itemprop, RawArray *array)
1791 CollectionPropertyIterator iter;
1792 ArrayIterator *internal;
1795 if(!(prop->flag & PROP_RAW_ARRAY) || !(itemprop->flag & PROP_RAW_ACCESS))
1798 RNA_property_collection_begin(ptr, prop, &iter);
1801 /* get data from array iterator and item property */
1802 internal= iter.internal;
1803 arrayp= (iter.valid)? iter.ptr.data: NULL;
1805 if(internal->skip || !RNA_property_editable(&iter.ptr, itemprop)) {
1806 /* we might skip some items, so it's not a proper array */
1807 RNA_property_collection_end(&iter);
1811 array->array= arrayp + itemprop->rawoffset;
1812 array->stride= internal->itemsize;
1813 array->len= ((char*)internal->endptr - arrayp)/internal->itemsize;
1814 array->type= itemprop->rawtype;
1817 memset(array, 0, sizeof(RawArray));
1819 RNA_property_collection_end(&iter);
1824 #define RAW_GET(dtype, var, raw, a) \
1826 switch(raw.type) { \
1827 case PROP_RAW_CHAR: var = (dtype)((char*)raw.array)[a]; break; \
1828 case PROP_RAW_SHORT: var = (dtype)((short*)raw.array)[a]; break; \
1829 case PROP_RAW_INT: var = (dtype)((int*)raw.array)[a]; break; \
1830 case PROP_RAW_FLOAT: var = (dtype)((float*)raw.array)[a]; break; \
1831 case PROP_RAW_DOUBLE: var = (dtype)((double*)raw.array)[a]; break; \
1832 default: var = (dtype)0; \
1836 #define RAW_SET(dtype, raw, a, var) \
1838 switch(raw.type) { \
1839 case PROP_RAW_CHAR: ((char*)raw.array)[a] = (char)var; break; \
1840 case PROP_RAW_SHORT: ((short*)raw.array)[a] = (short)var; break; \
1841 case PROP_RAW_INT: ((int*)raw.array)[a] = (int)var; break; \
1842 case PROP_RAW_FLOAT: ((float*)raw.array)[a] = (float)var; break; \
1843 case PROP_RAW_DOUBLE: ((double*)raw.array)[a] = (double)var; break; \
1847 int RNA_raw_type_sizeof(RawPropertyType type)
1850 case PROP_RAW_CHAR: return sizeof(char);
1851 case PROP_RAW_SHORT: return sizeof(short);
1852 case PROP_RAW_INT: return sizeof(int);
1853 case PROP_RAW_FLOAT: return sizeof(float);
1854 case PROP_RAW_DOUBLE: return sizeof(double);
1859 static int rna_raw_access(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *inarray, RawPropertyType intype, int inlen, int set)
1863 PropertyRNA *itemprop, *iprop;
1864 PropertyType itemtype=0;
1868 /* initialize in array, stride assumed 0 in following code */
1874 ptype= RNA_property_pointer_type(ptr, prop);
1876 /* try to get item property pointer */
1877 RNA_pointer_create(NULL, ptype, NULL, &itemptr);
1878 itemprop= RNA_struct_find_property(&itemptr, propname);
1881 /* we have item property pointer */
1885 itemtype= RNA_property_type(itemprop);
1887 if(!ELEM3(itemtype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) {
1888 BKE_report(reports, RPT_ERROR, "Only boolean, int and float properties supported.");
1892 /* check item array */
1893 itemlen= RNA_property_array_length(&itemptr, itemprop);
1895 /* try to access as raw array */
1896 if(RNA_property_collection_raw_array(ptr, prop, itemprop, &out)) {
1897 if(in.len != itemlen*out.len) {
1898 BKE_reportf(reports, RPT_ERROR, "Array length mismatch (expected %d, got %d).", out.len*itemlen, in.len);
1902 /* matching raw types */
1903 if(out.type == in.type) {
1904 void *inp= in.array;
1905 void *outp= out.array;
1908 itemlen= (itemlen == 0)? 1: itemlen;
1909 size= RNA_raw_type_sizeof(out.type) * itemlen;
1911 for(a=0; a<out.len; a++) {
1912 if(set) memcpy(outp, inp, size);
1913 else memcpy(inp, outp, size);
1915 inp= (char*)inp + size;
1916 outp= (char*)outp + out.stride;
1922 /* could also be faster with non-matching types,
1923 * for now we just do slower loop .. */
1928 void *tmparray= NULL;
1930 int err= 0, j, a= 0;
1932 /* no item property pointer, can still be id property, or
1933 * property of a type derived from the collection pointer type */
1934 RNA_PROP_BEGIN(ptr, itemptr, prop) {
1937 /* we got the property already */
1941 /* not yet, look it up and verify if it is valid */
1942 iprop= RNA_struct_find_property(&itemptr, propname);
1945 itemlen= RNA_property_array_length(&itemptr, iprop);
1946 itemtype= RNA_property_type(iprop);
1949 BKE_reportf(reports, RPT_ERROR, "Property named %s not found.", propname);
1954 if(!ELEM3(itemtype, PROP_BOOLEAN, PROP_INT, PROP_FLOAT)) {
1955 BKE_report(reports, RPT_ERROR, "Only boolean, int and float properties supported.");
1961 /* editable check */
1962 if(RNA_property_editable(&itemptr, iprop)) {
1963 if(a+itemlen > in.len) {
1964 BKE_reportf(reports, RPT_ERROR, "Array length mismatch (got %d, expected more).", in.len);
1970 /* handle conversions */
1973 case PROP_BOOLEAN: {
1975 RAW_GET(int, b, in, a);
1976 RNA_property_boolean_set(&itemptr, iprop, b);
1981 RAW_GET(int, i, in, a);
1982 RNA_property_int_set(&itemptr, iprop, i);
1987 RAW_GET(float, f, in, a);
1988 RNA_property_float_set(&itemptr, iprop, f);
1997 case PROP_BOOLEAN: {
1998 int b= RNA_property_boolean_get(&itemptr, iprop);
1999 RAW_SET(int, in, a, b);
2003 int i= RNA_property_int_get(&itemptr, iprop);
2004 RAW_SET(int, in, a, i);
2008 float f= RNA_property_float_get(&itemptr, iprop);
2009 RAW_SET(float, in, a, f);
2019 /* allocate temporary array if needed */
2020 if(tmparray && tmplen != itemlen) {
2021 MEM_freeN(tmparray);
2025 tmparray= MEM_callocN(sizeof(float)*itemlen, "RNA tmparray\n");
2029 /* handle conversions */
2032 case PROP_BOOLEAN: {
2033 for(j=0; j<itemlen; j++, a++)
2034 RAW_GET(int, ((int*)tmparray)[j], in, a);
2035 RNA_property_boolean_set_array(&itemptr, iprop, tmparray);
2039 for(j=0; j<itemlen; j++, a++)
2040 RAW_GET(int, ((int*)tmparray)[j], in, a);
2041 RNA_property_int_set_array(&itemptr, iprop, tmparray);
2045 for(j=0; j<itemlen; j++, a++)
2046 RAW_GET(float, ((float*)tmparray)[j], in, a);
2047 RNA_property_float_set_array(&itemptr, iprop, tmparray);
2056 case PROP_BOOLEAN: {
2057 RNA_property_boolean_get_array(&itemptr, iprop, tmparray);
2058 for(j=0; j<itemlen; j++, a++)
2059 RAW_SET(int, in, a, ((int*)tmparray)[j]);
2063 RNA_property_int_get_array(&itemptr, iprop, tmparray);
2064 for(j=0; j<itemlen; j++, a++)
2065 RAW_SET(int, in, a, ((int*)tmparray)[j]);
2069 RNA_property_float_get_array(&itemptr, iprop, tmparray);
2070 for(j=0; j<itemlen; j++, a++)
2071 RAW_SET(float, in, a, ((float*)tmparray)[j]);
2085 MEM_freeN(tmparray);
2091 RawPropertyType RNA_property_raw_type(PropertyRNA *prop)
2093 return prop->rawtype;
2096 int RNA_property_collection_raw_get(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *array, RawPropertyType type, int len)
2098 return rna_raw_access(reports, ptr, prop, propname, array, type, len, 0);
2101 int RNA_property_collection_raw_set(ReportList *reports, PointerRNA *ptr, PropertyRNA *prop, char *propname, void *array, RawPropertyType type, int len)
2103 return rna_raw_access(reports, ptr, prop, propname, array, type, len, 1);
2106 /* Standard iterator functions */
2108 void rna_iterator_listbase_begin(CollectionPropertyIterator *iter, ListBase *lb, IteratorSkipFunc skip)
2110 ListBaseIterator *internal;
2112 internal= MEM_callocN(sizeof(ListBaseIterator), "ListBaseIterator");
2113 internal->link= (lb)? lb->first: NULL;
2114 internal->skip= skip;
2116 iter->internal= internal;
2117 iter->valid= (internal->link != NULL);
2119 if(skip && iter->valid && skip(iter, internal->link))
2120 rna_iterator_listbase_next(iter);
2123 void rna_iterator_listbase_next(CollectionPropertyIterator *iter)
2125 ListBaseIterator *internal= iter->internal;
2127 if(internal->skip) {
2129 internal->link= internal->link->next;
2130 iter->valid= (internal->link != NULL);
2131 } while(iter->valid && internal->skip(iter, internal->link));
2134 internal->link= internal->link->next;
2135 iter->valid= (internal->link != NULL);
2139 void *rna_iterator_listbase_get(CollectionPropertyIterator *iter)
2141 ListBaseIterator *internal= iter->internal;
2143 return internal->link;
2146 void rna_iterator_listbase_end(CollectionPropertyIterator *iter)
2148 MEM_freeN(iter->internal);
2149 iter->internal= NULL;
2152 void rna_iterator_array_begin(CollectionPropertyIterator *iter, void *ptr, int itemsize, int length, int free_ptr, IteratorSkipFunc skip)
2154 ArrayIterator *internal;
2159 internal= MEM_callocN(sizeof(ArrayIterator), "ArrayIterator");
2161 internal->free_ptr= free_ptr ? ptr:NULL;
2162 internal->endptr= ((char*)ptr)+length*itemsize;
2163 internal->itemsize= itemsize;
2164 internal->skip= skip;
2166 iter->internal= internal;
2167 iter->valid= (internal->ptr != internal->endptr);
2169 if(skip && iter->valid && skip(iter, internal->ptr))
2170 rna_iterator_array_next(iter);
2173 void rna_iterator_array_next(CollectionPropertyIterator *iter)
2175 ArrayIterator *internal= iter->internal;
2177 if(internal->skip) {
2179 internal->ptr += internal->itemsize;
2180 iter->valid= (internal->ptr != internal->endptr);
2181 } while(iter->valid && internal->skip(iter, internal->ptr));
2184 internal->ptr += internal->itemsize;
2185 iter->valid= (internal->ptr != internal->endptr);
2189 void *rna_iterator_array_get(CollectionPropertyIterator *iter)
2191 ArrayIterator *internal= iter->internal;
2193 return internal->ptr;
2196 void *rna_iterator_array_dereference_get(CollectionPropertyIterator *iter)
2198 ArrayIterator *internal= iter->internal;
2201 return *(void**)(internal->ptr);
2204 void rna_iterator_array_end(CollectionPropertyIterator *iter)
2206 ArrayIterator *internal= iter->internal;
2208 if(internal->free_ptr) {
2209 MEM_freeN(internal->free_ptr);
2210 internal->free_ptr= NULL;
2212 MEM_freeN(iter->internal);
2213 iter->internal= NULL;
2216 /* RNA Path - Experiment */
2218 static char *rna_path_token(const char **path, char *fixedbuf, int fixedlen, int bracket)
2222 int i, j, len, escape;
2227 /* get data between [], check escaping ] with \] */
2228 if(**path == '[') (*path)++;
2234 while(*p && (*p != ']' || escape)) {
2235 escape= (*p == '\\');
2240 if(*p != ']') return NULL;
2243 /* get data until . or [ */
2246 while(*p && *p != '.' && *p != '[') {
2256 /* try to use fixed buffer if possible */
2257 if(len+1 < fixedlen)
2260 buf= MEM_callocN(sizeof(char)*(len+1), "rna_path_token");
2262 /* copy string, taking into account escaped ] */
2264 for(p=*path, i=0, j=0; i<len; i++, p++) {
2265 if(*p == '\\' && *(p+1) == ']');
2272 memcpy(buf, *path, sizeof(char)*len);
2276 /* set path to start of next token */
2284 /* Resolve the given RNA path to find the pointer+property indicated at the end of the path */
2285 int RNA_path_resolve(PointerRNA *ptr, const char *path, PointerRNA *r_ptr, PropertyRNA **r_prop)
2288 PointerRNA curptr, nextptr;
2289 char fixedbuf[256], *token;
2299 /* look up property name in current struct */
2300 token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 0);
2305 prop= RNA_struct_find_property(&curptr, token);
2307 if(token != fixedbuf)
2313 /* now look up the value of this property if it is a pointer or
2314 * collection, otherwise return the property rna so that the
2315 * caller can read the value of the property itself */
2316 if(RNA_property_type(prop) == PROP_POINTER) {
2317 nextptr= RNA_property_pointer_get(&curptr, prop);
2324 else if(RNA_property_type(prop) == PROP_COLLECTION && *path) {
2325 /* resolve the lookup with [] brackets */
2326 token= rna_path_token(&path, fixedbuf, sizeof(fixedbuf), 1);
2333 /* check for "" to see if it is a string */
2334 if(len >= 2 && token[0] == '"' && token[len-1] == '"') {
2337 RNA_property_collection_lookup_string(&curptr, prop, token+1, &nextptr);
2340 /* otherwise do int lookup */
2341 intkey= atoi(token);
2342 RNA_property_collection_lookup_int(&curptr, prop, intkey, &nextptr);
2345 if(token != fixedbuf)
2361 char *RNA_path_append(const char *path, PointerRNA *ptr, PropertyRNA *prop, int intkey, const char *strkey)
2365 char appendstr[128], *result;
2367 dynstr= BLI_dynstr_new();
2369 /* add .identifier */
2371 BLI_dynstr_append(dynstr, (char*)path);
2373 BLI_dynstr_append(dynstr, ".");
2376 BLI_dynstr_append(dynstr, (char*)RNA_property_identifier(prop));
2378 if(RNA_property_type(prop) == PROP_COLLECTION) {
2379 /* add ["strkey"] or [intkey] */
2380 BLI_dynstr_append(dynstr, "[");
2383 BLI_dynstr_append(dynstr, "\"");
2384 for(s=strkey; *s; s++) {
2394 BLI_dynstr_append(dynstr, appendstr);
2396 BLI_dynstr_append(dynstr, "\"");
2399 sprintf(appendstr, "%d", intkey);
2400 BLI_dynstr_append(dynstr, appendstr);
2403 BLI_dynstr_append(dynstr, "]");
2406 result= BLI_dynstr_get_cstring(dynstr);
2407 BLI_dynstr_free(dynstr);
2412 char *RNA_path_back(const char *path)
2415 const char *previous, *current;
2416 char *result, *token;
2425 /* parse token by token until the end, then we back up to the previous
2426 * position and strip of the next token to get the path one step back */
2428 token= rna_path_token(¤t, fixedbuf, sizeof(fixedbuf), 0);
2432 if(token != fixedbuf)
2435 /* in case of collection we also need to strip off [] */
2436 token= rna_path_token(¤t, fixedbuf, sizeof(fixedbuf), 1);
2437 if(token && token != fixedbuf)
2449 /* copy and strip off last token */
2451 result= BLI_strdup(path);
2453 if(i > 0 && result[i-1] == '.') i--;
2459 char *RNA_path_from_ID_to_struct(PointerRNA *ptr)
2463 if(!ptr->id.data || !ptr->data)
2466 if(!RNA_struct_is_ID(ptr->type)) {
2467 if(ptr->type->path) {
2468 /* if type has a path to some ID, use it */
2469 ptrpath= ptr->type->path(ptr);
2471 else if(ptr->type->nested && RNA_struct_is_ID(ptr->type->nested)) {
2472 PointerRNA parentptr;
2473 PropertyRNA *userprop;
2475 /* find the property in the struct we're nested in that references this struct, and
2476 * use its identifier as the first part of the path used...
2478 RNA_id_pointer_create(ptr->id.data, &parentptr);
2479 userprop= RNA_struct_find_nested(&parentptr, ptr->type);
2482 ptrpath= BLI_strdup(RNA_property_identifier(userprop));
2484 return NULL; // can't do anything about this case yet...
2493 char *RNA_path_from_ID_to_property(PointerRNA *ptr, PropertyRNA *prop)
2495 const char *propname;
2496 char *ptrpath, *path;
2498 if(!ptr->id.data || !ptr->data || !prop)
2501 /* path from ID to the struct holding this property */
2502 ptrpath= RNA_path_from_ID_to_struct(ptr);
2504 propname= RNA_property_identifier(prop);
2507 path= BLI_sprintfN("%s.%s", ptrpath, propname);
2511 path= BLI_strdup(propname);
2516 /* Quick name based property access */
2518 int RNA_boolean_get(PointerRNA *ptr, const char *name)
2520 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2523 return RNA_property_boolean_get(ptr, prop);
2526 printf("RNA_boolean_get: %s.%s not found.\n", ptr->type->identifier, name);
2531 void RNA_boolean_set(PointerRNA *ptr, const char *name, int value)
2533 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2536 RNA_property_boolean_set(ptr, prop, value);
2538 printf("RNA_boolean_set: %s.%s not found.\n", ptr->type->identifier, name);
2541 void RNA_boolean_get_array(PointerRNA *ptr, const char *name, int *values)
2543 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2546 RNA_property_boolean_get_array(ptr, prop, values);
2548 printf("RNA_boolean_get_array: %s.%s not found.\n", ptr->type->identifier, name);
2551 void RNA_boolean_set_array(PointerRNA *ptr, const char *name, const int *values)
2553 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2556 RNA_property_boolean_set_array(ptr, prop, values);
2558 printf("RNA_boolean_set_array: %s.%s not found.\n", ptr->type->identifier, name);
2561 int RNA_int_get(PointerRNA *ptr, const char *name)
2563 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2566 return RNA_property_int_get(ptr, prop);
2569 printf("RNA_int_get: %s.%s not found.\n", ptr->type->identifier, name);
2574 void RNA_int_set(PointerRNA *ptr, const char *name, int value)
2576 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2579 RNA_property_int_set(ptr, prop, value);
2581 printf("RNA_int_set: %s.%s not found.\n", ptr->type->identifier, name);
2584 void RNA_int_get_array(PointerRNA *ptr, const char *name, int *values)
2586 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2589 RNA_property_int_get_array(ptr, prop, values);
2591 printf("RNA_int_get_array: %s.%s not found.\n", ptr->type->identifier, name);
2594 void RNA_int_set_array(PointerRNA *ptr, const char *name, const int *values)
2596 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2599 RNA_property_int_set_array(ptr, prop, values);
2601 printf("RNA_int_set_array: %s.%s not found.\n", ptr->type->identifier, name);
2604 float RNA_float_get(PointerRNA *ptr, const char *name)
2606 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2609 return RNA_property_float_get(ptr, prop);
2612 printf("RNA_float_get: %s.%s not found.\n", ptr->type->identifier, name);
2617 void RNA_float_set(PointerRNA *ptr, const char *name, float value)
2619 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2622 RNA_property_float_set(ptr, prop, value);
2624 printf("RNA_float_set: %s.%s not found.\n", ptr->type->identifier, name);
2627 void RNA_float_get_array(PointerRNA *ptr, const char *name, float *values)
2629 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2632 RNA_property_float_get_array(ptr, prop, values);
2634 printf("RNA_float_get_array: %s.%s not found.\n", ptr->type->identifier, name);
2637 void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
2639 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2642 RNA_property_float_set_array(ptr, prop, values);
2644 printf("RNA_float_set_array: %s.%s not found.\n", ptr->type->identifier, name);
2647 int RNA_enum_get(PointerRNA *ptr, const char *name)
2649 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2652 return RNA_property_enum_get(ptr, prop);
2655 printf("RNA_enum_get: %s.%s not found.\n", ptr->type->identifier, name);
2660 void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
2662 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2665 RNA_property_enum_set(ptr, prop, value);
2667 printf("RNA_enum_set: %s.%s not found.\n", ptr->type->identifier, name);
2670 int RNA_enum_is_equal(bContext *C, PointerRNA *ptr, const char *name, const char *enumname)
2672 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2673 EnumPropertyItem *item;
2677 RNA_property_enum_items(C, ptr, prop, &item, NULL, &free);
2679 for(; item->identifier; item++)
2680 if(strcmp(item->identifier, enumname) == 0)
2681 return (item->value == RNA_property_enum_get(ptr, prop));
2686 printf("RNA_enum_is_equal: %s.%s item %s not found.\n", ptr->type->identifier, name, enumname);
2690 printf("RNA_enum_is_equal: %s.%s not found.\n", ptr->type->identifier, name);
2695 int RNA_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int *value)
2697 for( ; item->identifier; item++) {
2698 if(strcmp(item->identifier, identifier)==0) {
2699 *value= item->value;
2707 int RNA_enum_id_from_value(EnumPropertyItem *item, int value, const char **identifier)
2709 for( ; item->identifier; item++) {
2710 if(item->value==value) {
2711 *identifier= item->identifier;
2721 void RNA_string_get(PointerRNA *ptr, const char *name, char *value)
2723 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2726 RNA_property_string_get(ptr, prop, value);
2728 printf("RNA_string_get: %s.%s not found.\n", ptr->type->identifier, name);
2731 char *RNA_string_get_alloc(PointerRNA *ptr, const char *name, char *fixedbuf, int fixedlen)
2733 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2736 return RNA_property_string_get_alloc(ptr, prop, fixedbuf, fixedlen);
2739 printf("RNA_string_get_alloc: %s.%s not found.\n", ptr->type->identifier, name);
2744 int RNA_string_length(PointerRNA *ptr, const char *name)
2746 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2749 return RNA_property_string_length(ptr, prop);
2752 printf("RNA_string_length: %s.%s not found.\n", ptr->type->identifier, name);
2757 void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
2759 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2762 RNA_property_string_set(ptr, prop, value);
2764 printf("RNA_string_set: %s.%s not found.\n", ptr->type->identifier, name);
2767 PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
2769 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2772 return RNA_property_pointer_get(ptr, prop);
2777 printf("RNA_pointer_get: %s.%s not found.\n", ptr->type->identifier, name);
2779 memset(&result, 0, sizeof(result));
2784 void RNA_pointer_set(PointerRNA *ptr, const char *name, PointerRNA ptr_value)
2786 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2789 RNA_property_pointer_set(ptr, prop, ptr_value);
2792 printf("RNA_pointer_set: %s.%s not found.\n", ptr->type->identifier, name);
2796 void RNA_pointer_add(PointerRNA *ptr, const char *name)
2798 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2801 RNA_property_pointer_add(ptr, prop);
2803 printf("RNA_pointer_set: %s.%s not found.\n", ptr->type->identifier, name);
2806 void RNA_collection_begin(PointerRNA *ptr, const char *name, CollectionPropertyIterator *iter)
2808 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2811 RNA_property_collection_begin(ptr, prop, iter);
2813 printf("RNA_collection_begin: %s.%s not found.\n", ptr->type->identifier, name);
2816 void RNA_collection_add(PointerRNA *ptr, const char *name, PointerRNA *r_value)
2818 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2821 RNA_property_collection_add(ptr, prop, r_value);
2823 printf("RNA_collection_add: %s.%s not found.\n", ptr->type->identifier, name);
2826 void RNA_collection_clear(PointerRNA *ptr, const char *name)
2828 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2831 RNA_property_collection_clear(ptr, prop);
2833 printf("RNA_collection_clear: %s.%s not found.\n", ptr->type->identifier, name);
2836 int RNA_collection_length(PointerRNA *ptr, const char *name)
2838 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2841 return RNA_property_collection_length(ptr, prop);
2844 printf("RNA_collection_length: %s.%s not found.\n", ptr->type->identifier, name);
2849 int RNA_property_is_set(PointerRNA *ptr, const char *name)
2851 PropertyRNA *prop= RNA_struct_find_property(ptr, name);
2854 if(prop->flag & PROP_IDPROPERTY)
2855 return (rna_idproperty_find(ptr, name) != NULL);
2860 // printf("RNA_property_is_set: %s.%s not found.\n", ptr->type->identifier, name);
2865 /* string representation of a property, python
2866 * compatible but can be used for display too*/
2867 char *RNA_pointer_as_string(PointerRNA *ptr)
2869 DynStr *dynstr= BLI_dynstr_new();
2872 const char *propname;
2875 BLI_dynstr_append(dynstr, "{");
2877 RNA_STRUCT_BEGIN(ptr, prop) {
2878 propname = RNA_property_identifier(prop);
2880 if(strcmp(propname, "rna_type")==0)
2884 BLI_dynstr_append(dynstr, ", ");
2887 cstring = RNA_property_as_string(NULL, ptr, prop);
2888 BLI_dynstr_appendf(dynstr, "\"%s\":%s", propname, cstring);
2893 BLI_dynstr_append(dynstr, "}");
2896 cstring = BLI_dynstr_get_cstring(dynstr);
2897 BLI_dynstr_free(dynstr);
2901 char *RNA_property_as_string(bContext *C, PointerRNA *ptr, PropertyRNA *prop)
2903 int type = RNA_property_type(prop);
2904 int len = RNA_property_array_length(ptr, prop);
2907 DynStr *dynstr= BLI_dynstr_new();
2911 /* see if we can coorce into a python type - PropertyType */
2915 BLI_dynstr_append(dynstr, RNA_property_boolean_get(ptr, prop) ? "True" : "False");
2918 BLI_dynstr_append(dynstr, "(");
2919 for(i=0; i<len; i++) {
2920 BLI_dynstr_appendf(dynstr, i?", %s":"%s", RNA_property_boolean_get_index(ptr, prop, i) ? "True" : "False");
2923 BLI_dynstr_append(dynstr, ","); /* otherwise python wont see it as a tuple */
2924 BLI_dynstr_append(dynstr, ")");
2929 BLI_dynstr_appendf(dynstr, "%d", RNA_property_int_get(ptr, prop));
2932 BLI_dynstr_append(dynstr, "(");
2933 for(i=0; i<len; i++) {
2934 BLI_dynstr_appendf(dynstr, i?", %d":"%d", RNA_property_int_get_index(ptr, prop, i));
2937 BLI_dynstr_append(dynstr, ","); /* otherwise python wont see it as a tuple */
2938 BLI_dynstr_append(dynstr, ")");
2943 BLI_dynstr_appendf(dynstr, "%g", RNA_property_float_get(ptr, prop));
2946 BLI_dynstr_append(dynstr, "(");
2947 for(i=0; i<len; i++) {
2948 BLI_dynstr_appendf(dynstr, i?", %g":"%g", RNA_property_float_get_index(ptr, prop, i));
2951 BLI_dynstr_append(dynstr, ","); /* otherwise python wont see it as a tuple */
2952 BLI_dynstr_append(dynstr, ")");
2957 /* string arrays dont exist */
2959 buf = RNA_property_string_get_alloc(ptr, prop, NULL, -1);
2960 BLI_dynstr_appendf(dynstr, "\"%s\"", buf);
2966 /* string arrays dont exist */
2967 const char *identifier;
2968 int val = RNA_property_enum_get(ptr, prop);
2970 if(RNA_property_enum_identifier(C, ptr, prop, val, &identifier)) {
2971 BLI_dynstr_appendf(dynstr, "'%s'", identifier);
2974 BLI_dynstr_appendf(dynstr, "'<UNKNOWN ENUM>'", identifier);
2980 BLI_dynstr_append(dynstr, "'<POINTER>'"); /* TODO */
2983 case PROP_COLLECTION:
2986 CollectionPropertyIterator collect_iter;
2987 BLI_dynstr_append(dynstr, "[");
2989 for(RNA_property_collection_begin(ptr, prop, &collect_iter); collect_iter.valid; RNA_property_collection_next(&collect_iter)) {
2990 PointerRNA itemptr= collect_iter.ptr;
2993 BLI_dynstr_append(dynstr, ", ");
2996 /* now get every prop of the collection */
2997 cstring= RNA_pointer_as_string(&itemptr);
2998 BLI_dynstr_append(dynstr, cstring);
3002 RNA_property_collection_end(&collect_iter);
3003 BLI_dynstr_append(dynstr, "]");
3007 BLI_dynstr_append(dynstr, "'<UNKNOWN TYPE>'"); /* TODO */
3011 cstring = BLI_dynstr_get_cstring(dynstr);
3012 BLI_dynstr_free(dynstr);
3018 const char *RNA_function_identifier(FunctionRNA *func)
3020 return func->identifier;
3023 PropertyRNA *RNA_function_return(FunctionRNA *func)
3028 const char *RNA_function_ui_description(FunctionRNA *func)
3030 return func->description;
3033 int RNA_function_flag(FunctionRNA *func)
3038 PropertyRNA *RNA_function_get_parameter(PointerRNA *ptr, FunctionRNA *func, int index)
3043 parm= func->cont.properties.first;
3044 for(i= 0; parm; parm= parm->next, i++)
3051 PropertyRNA *RNA_function_find_parameter(PointerRNA *ptr, FunctionRNA *func, const char *identifier)
3055 parm= func->cont.properties.first;
3056 for(; parm; parm= parm->next)
3057 if(strcmp(parm->identifier, identifier)==0)
3063 const struct ListBase *RNA_function_defined_parameters(FunctionRNA *func)
3065 return &func->cont.properties;
3070 ParameterList *RNA_parameter_list_create(ParameterList *parms, PointerRNA *ptr, FunctionRNA *func)
3077 for(parm= func->cont.properties.first; parm; parm= parm->next)
3078 tot+= rna_parameter_size(parm);
3080 parms->data= MEM_callocN(tot, "RNA_parameter_list_create");
3084 /* set default values */
3087 for(parm= func->cont.properties.first; parm; parm= parm->next) {
3088 size= rna_parameter_size(parm);
3090 if(!(parm->flag & PROP_REQUIRED)) {
3091 switch(parm->type) {
3093 if(parm->arraydimension) memcpy(data, &((BooleanPropertyRNA*)parm)->defaultarray, size);
3094 else memcpy(data, &((BooleanPropertyRNA*)parm)->defaultvalue, size);
3097 if(parm->arraydimension) memcpy(data, &((IntPropertyRNA*)parm)->defaultarray, size);
3098 else memcpy(data, &((IntPropertyRNA*)parm)->defaultvalue, size);
3101 if(parm->arraydimension) memcpy(data, &((FloatPropertyRNA*)parm)->defaultarray, size);
3102 else memcpy(data, &((FloatPropertyRNA*)parm)->defaultvalue, size);
3105 memcpy(data, &((EnumPropertyRNA*)parm)->defaultvalue, size);
3108 const char *defvalue= ((StringPropertyRNA*)parm)->defaultvalue;
3109 if(defvalue && defvalue[0])
3110 memcpy(data, &defvalue, size);
3114 case PROP_COLLECTION:
3119 data= ((char*)data) + size;
3125 void RNA_parameter_list_free(ParameterList *parms)
3130 parm= parms->func->cont.properties.first;
3131 for(tot= 0; parm; parm= parm->next) {
3132 if(parm->type == PROP_COLLECTION)
3133 BLI_freelistN((ListBase*)((char*)parms->data+tot));
3134 else if (parm->flag & PROP_DYNAMIC) {
3135 /* for dynamic arrays and strings, data is a pointer to an array */
3136 char *array= *(char**)((char*)parms->data+tot);
3141 tot+= rna_parameter_size(parm);
3144 MEM_freeN(parms->data);
3150 int RNA_parameter_list_size(ParameterList *parms)
3155 void RNA_parameter_list_begin(ParameterList *parms, ParameterIterator *iter)
3159 RNA_pointer_create(NULL, &RNA_Function, parms->func, &iter->funcptr);
3162 iter->parm= parms->func->cont.properties.first;
3163 iter->valid= iter->parm != NULL;
3167 iter->size= rna_parameter_size(iter->parm);
3168 iter->data= (((char*)iter->parms->data)+iter->offset);
3169 ptype= RNA_property_type(iter->parm);
3173 void RNA_parameter_list_next(ParameterIterator *iter)
3177 iter->offset+= iter->size;
3178 iter->parm= iter->parm->next;
3179 iter->valid= iter->parm != NULL;
3182 iter->size= rna_parameter_size(iter->parm);
3183 iter->data= (((char*)iter->parms->data)+iter->offset);
3184 ptype= RNA_property_type(iter->parm);
3188 void RNA_parameter_list_end(ParameterIterator *iter)
3193 void RNA_parameter_get(ParameterList *parms, PropertyRNA *parm, void **value)
3195 ParameterIterator iter;
3197 RNA_parameter_list_begin(parms, &iter);
3199 for(; iter.valid; RNA_parameter_list_next(&iter))
3208 RNA_parameter_list_end(&iter);
3211 void RNA_parameter_get_lookup(ParameterList *parms, const char *identifier, void **value)
3215 parm= parms->func->cont.properties.first;
3216 for(; parm; parm= parm->next)
3217 if(strcmp(RNA_property_identifier(parm), identifier)==0)
3221 RNA_parameter_get(parms, parm, value);
3224 void RNA_parameter_set(ParameterList *parms, PropertyRNA *parm, void *value)
3226 ParameterIterator iter;
3228 RNA_parameter_list_begin(parms, &iter);
3230 for(; iter.valid; RNA_parameter_list_next(&iter))
3235 memcpy(iter.data, value, iter.size);
3237 RNA_parameter_list_end(&iter);
3240 void RNA_parameter_set_lookup(ParameterList *parms, const char *identifier, void *value)
3244 parm= parms->func->cont.properties.first;
3245 for(; parm; parm= parm->next)
3246 if(strcmp(RNA_property_identifier(parm), identifier)==0)
3250 RNA_parameter_set(parms, parm, value);
3253 int RNA_function_call(bContext *C, ReportList *reports, PointerRNA *ptr, FunctionRNA *func, ParameterList *parms)
3256 func->call(C, reports, ptr, parms);
3264 int RNA_function_call_lookup(bContext *C, ReportList *reports, PointerRNA *ptr, const char *identifier, ParameterList *parms)
3268 func= RNA_struct_find_function(ptr, identifier);
3271 return RNA_function_call(C, reports, ptr, func, parms);
3276 int RNA_function_call_direct(bContext *C, ReportList *reports, PointerRNA *ptr, FunctionRNA *func, const char *format, ...)
3281 va_start(args, format);
3283 ret= RNA_function_call_direct_va(C, reports, ptr, func, format, args);
3290 int RNA_function_call_direct_lookup(bContext *C, ReportList *reports, PointerRNA *ptr, const char *identifier, const char *format, ...)
3294 func= RNA_struct_find_function(ptr, identifier);
3300 va_start(args, format);
3302 ret= RNA_function_call_direct_va(C, reports, ptr, func, format, args);