f86f6010e27b7e62b5f8faa2be0cea9e8a1295f2
[blender.git] / source / blender / makesrna / intern / rna_rna.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Blender Foundation (2008).
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file blender/makesrna/intern/rna_rna.c
24  *  \ingroup RNA
25  */
26
27
28 #include <stdlib.h>
29
30 #include "DNA_ID.h"
31
32 #include "RNA_access.h"
33 #include "RNA_define.h"
34 #include "RNA_enum_types.h"
35
36 #include "rna_internal.h"
37
38 EnumPropertyItem property_type_items[] = {
39         {PROP_BOOLEAN, "BOOLEAN", 0, "Boolean", ""},
40         {PROP_INT, "INT", 0, "Integer", ""},
41         {PROP_FLOAT, "FLOAT", 0, "Float", ""},
42         {PROP_STRING, "STRING", 0, "String", ""},
43         {PROP_ENUM, "ENUM", 0, "Enumeration", ""},
44         {PROP_POINTER, "POINTER", 0, "Pointer", ""},
45         {PROP_COLLECTION, "COLLECTION", 0, "Collection", ""},
46         {0, NULL, 0, NULL, NULL}
47 };
48
49 EnumPropertyItem property_subtype_items[] = {
50         {PROP_NONE, "NONE", 0, "None", ""},
51
52         /* strings */
53         {PROP_FILEPATH, "FILEPATH", 0, "File Path", ""},
54         {PROP_DIRPATH, "DIRPATH", 0, "Directory Path", ""},
55         {PROP_FILENAME, "FILENAME", 0, "File Name", ""},
56         {PROP_TRANSLATE, "TRANSLATE", 0, "Translate", ""},
57
58         /* numbers */
59         {PROP_UNSIGNED, "UNSIGNED", 0, "Unsigned", ""},
60         {PROP_PERCENTAGE, "PERCENTAGE", 0, "Percentage", ""},
61         {PROP_FACTOR, "FACTOR", 0, "Factor", ""},
62         {PROP_ANGLE, "ANGLE", 0, "Angle", ""},
63         {PROP_TIME, "TIME", 0, "Time", ""},
64         {PROP_DISTANCE, "DISTANCE", 0, "Distance", ""},
65
66         /* number arrays */
67         {PROP_COLOR, "COLOR", 0, "Color", ""},
68         {PROP_TRANSLATION, "TRANSLATION", 0, "Translation", ""},
69         {PROP_DIRECTION, "DIRECTION", 0, "Direction", ""},
70         {PROP_VELOCITY, "VELOCITY", 0, "Velocity", ""},
71         {PROP_ACCELERATION, "ACCELERATION", 0, "Acceleration", ""},
72         {PROP_MATRIX, "MATRIX", 0, "Matrix", ""},
73         {PROP_EULER, "EULER", 0, "Euler Angles", ""},
74         {PROP_QUATERNION, "QUATERNION", 0, "Quaternion", ""},
75         {PROP_AXISANGLE, "AXISANGLE", 0, "Axis-Angle", ""},
76         {PROP_XYZ, "XYZ", 0, "XYZ", ""},
77         {PROP_XYZ_LENGTH, "XYZ_LENGTH", 0, "XYZ Length", ""},
78         {PROP_COLOR_GAMMA, "COLOR_GAMMA", 0, "Color", ""},
79         {PROP_COORDS, "COORDS", 0, "Coordinates", ""},
80
81         /* booleans */
82         {PROP_LAYER, "LAYER", 0, "Layer", ""},
83         {PROP_LAYER_MEMBER, "LAYER_MEMBER", 0, "Layer Member", ""},
84         {0, NULL, 0, NULL, NULL}
85 };
86
87 EnumPropertyItem property_unit_items[] = {
88         {PROP_UNIT_NONE, "NONE", 0, "None", ""},
89         {PROP_UNIT_LENGTH, "LENGTH", 0, "Length", ""},
90         {PROP_UNIT_AREA, "AREA", 0, "Area", ""},
91         {PROP_UNIT_VOLUME, "VOLUME", 0, "Volume", ""},
92         {PROP_UNIT_ROTATION, "ROTATION", 0, "Rotation", ""},
93         {PROP_UNIT_TIME, "TIME", 0, "Time", ""},
94         {PROP_UNIT_VELOCITY, "VELOCITY", 0, "Velocity", ""},
95         {PROP_UNIT_ACCELERATION, "ACCELERATION", 0, "Acceleration", ""},
96         {0, NULL, 0, NULL, NULL}
97 };
98
99 #ifdef RNA_RUNTIME
100 #include "MEM_guardedalloc.h"
101 #include "BLI_utildefines.h"
102 #include "BLI_ghash.h"
103
104 /* Struct */
105
106 static void rna_Struct_identifier_get(PointerRNA *ptr, char *value)
107 {
108         strcpy(value, ((StructRNA *)ptr->data)->identifier);
109 }
110
111 static int rna_Struct_identifier_length(PointerRNA *ptr)
112 {
113         return strlen(((StructRNA *)ptr->data)->identifier);
114 }
115
116 static void rna_Struct_description_get(PointerRNA *ptr, char *value)
117 {
118         strcpy(value, ((StructRNA *)ptr->data)->description);
119 }
120
121 static int rna_Struct_description_length(PointerRNA *ptr)
122 {
123         return strlen(((StructRNA *)ptr->data)->description);
124 }
125
126 static void rna_Struct_name_get(PointerRNA *ptr, char *value)
127 {
128         strcpy(value, ((StructRNA *)ptr->data)->name);
129 }
130
131 static int rna_Struct_name_length(PointerRNA *ptr)
132 {
133         return strlen(((StructRNA *)ptr->data)->name);
134 }
135
136 static void rna_Struct_translation_context_get(PointerRNA *ptr, char *value)
137 {
138         strcpy(value, ((StructRNA *)ptr->data)->translation_context ? ((StructRNA *)ptr->data)->translation_context : "");
139 }
140
141 static int rna_Struct_translation_context_length(PointerRNA *ptr)
142 {
143         return ((StructRNA *)ptr->data)->translation_context ? strlen(((StructRNA *)ptr->data)->translation_context) : 0;
144 }
145
146 static PointerRNA rna_Struct_base_get(PointerRNA *ptr)
147 {
148         return rna_pointer_inherit_refine(ptr, &RNA_Struct, ((StructRNA *)ptr->data)->base);
149 }
150
151 static PointerRNA rna_Struct_nested_get(PointerRNA *ptr)
152 {
153         return rna_pointer_inherit_refine(ptr, &RNA_Struct, ((StructRNA *)ptr->data)->nested);
154 }
155
156 static PointerRNA rna_Struct_name_property_get(PointerRNA *ptr)
157 {
158         return rna_pointer_inherit_refine(ptr, &RNA_Property, ((StructRNA *)ptr->data)->nameproperty);
159 }
160
161 /* Struct property iteration. This is quite complicated, the purpose is to
162  * iterate over properties of all inheritance levels, and for each struct to
163  * also iterator over id properties not known by RNA. */
164
165 static int rna_idproperty_known(CollectionPropertyIterator *iter, void *data)
166 {
167         IDProperty *idprop = (IDProperty *)data;
168         PropertyRNA *prop;
169         StructRNA *ptype = iter->builtin_parent.type;
170
171         /* function to skip any id properties that are already known by RNA,
172          * for the second loop where we go over unknown id properties */
173         do {
174                 for (prop = ptype->cont.properties.first; prop; prop = prop->next)
175                         if ((prop->flag & PROP_BUILTIN) == 0 && strcmp(prop->identifier, idprop->name) == 0)
176                                 return 1;
177         } while ((ptype = ptype->base));
178
179         return 0;
180 }
181
182 static int rna_property_builtin(CollectionPropertyIterator *UNUSED(iter), void *data)
183 {
184         PropertyRNA *prop = (PropertyRNA *)data;
185
186         /* function to skip builtin rna properties */
187
188         return (prop->flag & PROP_BUILTIN);
189 }
190
191 static int rna_function_builtin(CollectionPropertyIterator *UNUSED(iter), void *data)
192 {
193         FunctionRNA *func = (FunctionRNA *)data;
194
195         /* function to skip builtin rna functions */
196
197         return (func->flag & FUNC_BUILTIN);
198 }
199
200 static void rna_inheritance_next_level_restart(CollectionPropertyIterator *iter, IteratorSkipFunc skip, int funcs)
201 {
202         /* RNA struct inheritance */
203         while (!iter->valid && iter->level > 0) {
204                 StructRNA *srna;
205                 int i;
206
207                 srna = (StructRNA *)iter->parent.data;
208                 iter->level--;
209                 for (i = iter->level; i > 0; i--)
210                         srna = srna->base;
211
212                 rna_iterator_listbase_end(iter);
213
214                 if (funcs)
215                         rna_iterator_listbase_begin(iter, &srna->functions, skip);
216                 else
217                         rna_iterator_listbase_begin(iter, &srna->cont.properties, skip);
218         }
219 }
220
221 static void rna_inheritance_properties_listbase_begin(CollectionPropertyIterator *iter, ListBase *lb,
222                                                       IteratorSkipFunc skip)
223 {
224         rna_iterator_listbase_begin(iter, lb, skip);
225         rna_inheritance_next_level_restart(iter, skip, 0);
226 }
227
228 static void rna_inheritance_properties_listbase_next(CollectionPropertyIterator *iter, IteratorSkipFunc skip)
229 {
230         rna_iterator_listbase_next(iter);
231         rna_inheritance_next_level_restart(iter, skip, 0);
232 }
233
234 static void rna_inheritance_functions_listbase_begin(CollectionPropertyIterator *iter, ListBase *lb,
235                                                      IteratorSkipFunc skip)
236 {
237         rna_iterator_listbase_begin(iter, lb, skip);
238         rna_inheritance_next_level_restart(iter, skip, 1);
239 }
240
241 static void rna_inheritance_functions_listbase_next(CollectionPropertyIterator *iter, IteratorSkipFunc skip)
242 {
243         rna_iterator_listbase_next(iter);
244         rna_inheritance_next_level_restart(iter, skip, 1);
245 }
246
247 static void rna_Struct_properties_next(CollectionPropertyIterator *iter)
248 {
249         ListBaseIterator *internal = iter->internal;
250         IDProperty *group;
251
252         if (internal->flag) {
253                 /* id properties */
254                 rna_iterator_listbase_next(iter);
255         }
256         else {
257                 /* regular properties */
258                 rna_inheritance_properties_listbase_next(iter, rna_property_builtin);
259
260                 /* try id properties */
261                 if (!iter->valid) {
262                         group = RNA_struct_idprops(&iter->builtin_parent, 0);
263
264                         if (group) {
265                                 rna_iterator_listbase_end(iter);
266                                 rna_iterator_listbase_begin(iter, &group->data.group, rna_idproperty_known);
267                                 internal = iter->internal;
268                                 internal->flag = 1;
269                         }
270                 }
271         }
272 }
273
274 static void rna_Struct_properties_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
275 {
276         StructRNA *srna;
277
278         /* here ptr->data should always be the same as iter->parent.type */
279         srna = (StructRNA *)ptr->data;
280
281         while (srna->base) {
282                 iter->level++;
283                 srna = srna->base;
284         }
285
286         rna_inheritance_properties_listbase_begin(iter, &srna->cont.properties, rna_property_builtin);
287 }
288
289 static PointerRNA rna_Struct_properties_get(CollectionPropertyIterator *iter)
290 {
291         ListBaseIterator *internal = iter->internal;
292
293         /* we return either PropertyRNA* or IDProperty*, the rna_access.c
294          * functions can handle both as PropertyRNA* with some tricks */
295         return rna_pointer_inherit_refine(&iter->parent, &RNA_Property, internal->link);
296 }
297
298 static void rna_Struct_functions_next(CollectionPropertyIterator *iter)
299 {
300         rna_inheritance_functions_listbase_next(iter, rna_function_builtin);
301 }
302
303 static void rna_Struct_functions_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
304 {
305         StructRNA *srna;
306
307         /* here ptr->data should always be the same as iter->parent.type */
308         srna = (StructRNA *)ptr->data;
309
310         while (srna->base) {
311                 iter->level++;
312                 srna = srna->base;
313         }
314
315         rna_inheritance_functions_listbase_begin(iter, &srna->functions, rna_function_builtin);
316 }
317
318 static PointerRNA rna_Struct_functions_get(CollectionPropertyIterator *iter)
319 {
320         ListBaseIterator *internal = iter->internal;
321
322         /* we return either PropertyRNA* or IDProperty*, the rna_access.c
323          * functions can handle both as PropertyRNA* with some tricks */
324         return rna_pointer_inherit_refine(&iter->parent, &RNA_Function, internal->link);
325 }
326
327 /* Builtin properties iterator re-uses the Struct properties iterator, only
328  * difference is that we need to set the ptr data to the type of the struct
329  * whose properties we want to iterate over. */
330
331 void rna_builtin_properties_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
332 {
333         PointerRNA newptr;
334
335         /* we create a new pointer with the type as the data */
336         newptr.type = &RNA_Struct;
337         newptr.data = ptr->type;
338
339         if (ptr->type->flag & STRUCT_ID)
340                 newptr.id.data = ptr->data;
341         else
342                 newptr.id.data = NULL;
343
344         iter->parent = newptr;
345         iter->builtin_parent = *ptr;
346
347         rna_Struct_properties_begin(iter, &newptr);
348 }
349
350 void rna_builtin_properties_next(CollectionPropertyIterator *iter)
351 {
352         rna_Struct_properties_next(iter);
353 }
354
355 PointerRNA rna_builtin_properties_get(CollectionPropertyIterator *iter)
356 {
357         return rna_Struct_properties_get(iter);
358 }
359
360 int rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
361 {
362         StructRNA *srna;
363         PropertyRNA *prop;
364         PointerRNA propptr = {{NULL}};
365
366         srna = ptr->type;
367
368         do {
369                 if (srna->cont.prophash) {
370                         prop = BLI_ghash_lookup(srna->cont.prophash, (void *)key);
371
372                         if (prop) {
373                                 propptr.type = &RNA_Property;
374                                 propptr.data = prop;
375
376                                 *r_ptr = propptr;
377                                 return TRUE;
378                         }
379                 }
380                 else {
381                         for (prop = srna->cont.properties.first; prop; prop = prop->next) {
382                                 if (!(prop->flag & PROP_BUILTIN) && strcmp(prop->identifier, key) == 0) {
383                                         propptr.type = &RNA_Property;
384                                         propptr.data = prop;
385
386                                         *r_ptr = propptr;
387                                         return TRUE;
388                                 }
389                         }
390                 }
391         } while ((srna = srna->base));
392
393         /* this was used pre 2.5beta0, now ID property access uses python's
394          * getitem style access
395          * - ob["foo"] rather than ob.foo */
396 #if 0
397         if (ptr->data) {
398                 IDProperty *group, *idp;
399
400                 group = RNA_struct_idprops(ptr, 0);
401
402                 if (group) {
403                         for (idp = group->data.group.first; idp; idp = idp->next) {
404                                 if (strcmp(idp->name, key) == 0) {
405                                         propptr.type = &RNA_Property;
406                                         propptr.data = idp;
407
408                                         *r_ptr = propptr;
409                                         return TRUE;
410                                 }
411                         }
412                 }
413         }
414 #endif
415         return FALSE;
416 }
417
418 PointerRNA rna_builtin_type_get(PointerRNA *ptr)
419 {
420         return rna_pointer_inherit_refine(ptr, &RNA_Struct, ptr->type);
421 }
422
423 /* Property */
424
425 static StructRNA *rna_Property_refine(PointerRNA *ptr)
426 {
427         PropertyRNA *prop = (PropertyRNA *)ptr->data;
428
429         rna_idproperty_check(&prop, ptr); /* XXX ptr? */
430
431         switch (prop->type) {
432                 case PROP_BOOLEAN: return &RNA_BoolProperty;
433                 case PROP_INT: return &RNA_IntProperty;
434                 case PROP_FLOAT: return &RNA_FloatProperty;
435                 case PROP_STRING: return &RNA_StringProperty;
436                 case PROP_ENUM: return &RNA_EnumProperty;
437                 case PROP_POINTER: return &RNA_PointerProperty;
438                 case PROP_COLLECTION: return &RNA_CollectionProperty;
439                 default: return &RNA_Property;
440         }
441 }
442
443 static void rna_Property_identifier_get(PointerRNA *ptr, char *value)
444 {
445         PropertyRNA *prop = (PropertyRNA *)ptr->data;
446         rna_idproperty_check(&prop, ptr);
447         strcpy(value, ((PropertyRNA *)prop)->identifier);
448 }
449
450 static int rna_Property_identifier_length(PointerRNA *ptr)
451 {
452         PropertyRNA *prop = (PropertyRNA *)ptr->data;
453         rna_idproperty_check(&prop, ptr);
454         return strlen(prop->identifier);
455 }
456
457 static void rna_Property_name_get(PointerRNA *ptr, char *value)
458 {
459         PropertyRNA *prop = (PropertyRNA *)ptr->data;
460         rna_idproperty_check(&prop, ptr);
461         strcpy(value, prop->name);
462 }
463
464 static int rna_Property_name_length(PointerRNA *ptr)
465 {
466         PropertyRNA *prop = (PropertyRNA *)ptr->data;
467         rna_idproperty_check(&prop, ptr);
468         return strlen(prop->name);
469 }
470
471 static void rna_Property_description_get(PointerRNA *ptr, char *value)
472 {
473         PropertyRNA *prop = (PropertyRNA *)ptr->data;
474         rna_idproperty_check(&prop, ptr);
475         strcpy(value, prop->description ? prop->description : "");
476 }
477 static int rna_Property_description_length(PointerRNA *ptr)
478 {
479         PropertyRNA *prop = (PropertyRNA *)ptr->data;
480         rna_idproperty_check(&prop, ptr);
481         return prop->description ? strlen(prop->description) : 0;
482 }
483
484 static void rna_Property_translation_context_get(PointerRNA *ptr, char *value)
485 {
486         PropertyRNA *prop = (PropertyRNA *)ptr->data;
487         rna_idproperty_check(&prop, ptr);
488         strcpy(value, prop->translation_context ? prop->translation_context : "");
489 }
490
491 static int rna_Property_translation_context_length(PointerRNA *ptr)
492 {
493         PropertyRNA *prop = (PropertyRNA *)ptr->data;
494         rna_idproperty_check(&prop, ptr);
495         return prop->translation_context ? strlen(prop->translation_context) : 0;
496 }
497
498 static int rna_Property_type_get(PointerRNA *ptr)
499 {
500         PropertyRNA *prop = (PropertyRNA *)ptr->data;
501         rna_idproperty_check(&prop, ptr);
502         return prop->type;
503 }
504
505 static int rna_Property_subtype_get(PointerRNA *ptr)
506 {
507         PropertyRNA *prop = (PropertyRNA *)ptr->data;
508         rna_idproperty_check(&prop, ptr);
509         return prop->subtype;
510 }
511
512 static PointerRNA rna_Property_srna_get(PointerRNA *ptr)
513 {
514         PropertyRNA *prop = (PropertyRNA *)ptr->data;
515         rna_idproperty_check(&prop, ptr);
516         return rna_pointer_inherit_refine(ptr, &RNA_Struct, prop->srna);
517 }
518
519 static int rna_Property_unit_get(PointerRNA *ptr)
520 {
521         PropertyRNA *prop = (PropertyRNA *)ptr->data;
522         rna_idproperty_check(&prop, ptr);
523         return RNA_SUBTYPE_UNIT(prop->subtype);
524 }
525
526 static int rna_Property_icon_get(PointerRNA *ptr)
527 {
528         PropertyRNA *prop = (PropertyRNA *)ptr->data;
529         rna_idproperty_check(&prop, ptr);
530         return prop->icon;
531 }
532
533 static int rna_Property_readonly_get(PointerRNA *ptr)
534 {
535         PropertyRNA *prop = (PropertyRNA *)ptr->data;
536
537         /* don't use this because it will call functions that check the internal
538          * data for introspection we only need to know if it can be edited so the
539          * flag is better for this */
540 /*      return RNA_property_editable(ptr, prop); */
541         return prop->flag & PROP_EDITABLE ? 0 : 1;
542 }
543
544 static int rna_Property_animatable_get(PointerRNA *ptr)
545 {
546         PropertyRNA *prop = (PropertyRNA *)ptr->data;
547
548         return (prop->flag & PROP_ANIMATABLE) != 0;
549 }
550
551 static int rna_Property_use_output_get(PointerRNA *ptr)
552 {
553         PropertyRNA *prop = (PropertyRNA *)ptr->data;
554         return prop->flag & PROP_OUTPUT ? 1 : 0;
555 }
556
557 static int rna_Property_is_required_get(PointerRNA *ptr)
558 {
559         PropertyRNA *prop = (PropertyRNA *)ptr->data;
560         return prop->flag & PROP_REQUIRED ? 1 : 0;
561 }
562
563 static int rna_Property_is_never_none_get(PointerRNA *ptr)
564 {
565         PropertyRNA *prop = (PropertyRNA *)ptr->data;
566         return prop->flag & PROP_NEVER_NULL ? 1 : 0;
567 }
568
569 static int rna_Property_is_hidden_get(PointerRNA *ptr)
570 {
571         PropertyRNA *prop = (PropertyRNA *)ptr->data;
572         return prop->flag & PROP_HIDDEN ? 1 : 0;
573 }
574
575 static int rna_Property_is_skip_save_get(PointerRNA *ptr)
576 {
577         PropertyRNA *prop = (PropertyRNA *)ptr->data;
578         return prop->flag & PROP_SKIP_SAVE ? 1 : 0;
579 }
580
581
582 static int rna_Property_is_enum_flag_get(PointerRNA *ptr)
583 {
584         PropertyRNA *prop = (PropertyRNA *)ptr->data;
585         return prop->flag & PROP_ENUM_FLAG ? 1 : 0;
586 }
587
588 static int rna_Property_is_library_editable_flag_get(PointerRNA *ptr)
589 {
590         PropertyRNA *prop = (PropertyRNA *)ptr->data;
591         return prop->flag & PROP_LIB_EXCEPTION ? 1 : 0;
592 }
593
594 static int rna_Property_array_length_get(PointerRNA *ptr)
595 {
596         PropertyRNA *prop = (PropertyRNA *)ptr->data;
597         rna_idproperty_check(&prop, ptr);
598         return prop->totarraylength;
599 }
600
601 static int rna_Property_registered_get(PointerRNA *ptr)
602 {
603         PropertyRNA *prop = (PropertyRNA *)ptr->data;
604         return prop->flag & PROP_REGISTER;
605 }
606
607 static int rna_Property_registered_optional_get(PointerRNA *ptr)
608 {
609         PropertyRNA *prop = (PropertyRNA *)ptr->data;
610         return prop->flag & PROP_REGISTER_OPTIONAL;
611 }
612
613 static int rna_Property_runtime_get(PointerRNA *ptr)
614 {
615         PropertyRNA *prop = (PropertyRNA *)ptr->data;
616         return prop->flag & PROP_RUNTIME;
617 }
618
619
620 static int rna_BoolProperty_default_get(PointerRNA *ptr)
621 {
622         PropertyRNA *prop = (PropertyRNA *)ptr->data;
623         rna_idproperty_check(&prop, ptr);
624         return ((BoolPropertyRNA *)prop)->defaultvalue;
625 }
626
627 static int rna_IntProperty_default_get(PointerRNA *ptr)
628 {
629         PropertyRNA *prop = (PropertyRNA *)ptr->data;
630         rna_idproperty_check(&prop, ptr);
631         return ((IntPropertyRNA *)prop)->defaultvalue;
632 }
633 /* int/float/bool */
634 static int rna_NumberProperty_default_array_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
635 {
636         PropertyRNA *prop = (PropertyRNA *)ptr->data;
637         rna_idproperty_check(&prop, ptr);
638
639         length[0] = prop->totarraylength;
640
641         return length[0];
642 }
643 static void rna_IntProperty_default_array_get(PointerRNA *ptr, int *values)
644 {
645         PropertyRNA *prop = (PropertyRNA *)ptr->data;
646         IntPropertyRNA *nprop = (IntPropertyRNA *)prop;
647         rna_idproperty_check(&prop, ptr);
648
649         if (nprop->defaultarray) {
650                 memcpy(values, nprop->defaultarray, prop->totarraylength * sizeof(int));
651         }
652         else {
653                 int i;
654                 for (i = 0; i < prop->totarraylength; i++)
655                         values[i] = nprop->defaultvalue;
656         }
657 }
658 static void rna_BoolProperty_default_array_get(PointerRNA *ptr, int *values)
659 {
660         PropertyRNA *prop = (PropertyRNA *)ptr->data;
661         BoolPropertyRNA *nprop = (BoolPropertyRNA *)prop;
662         rna_idproperty_check(&prop, ptr);
663
664         if (nprop->defaultarray) {
665                 memcpy(values, nprop->defaultarray, prop->totarraylength * sizeof(int));
666         }
667         else {
668                 int i;
669                 for (i = 0; i < prop->totarraylength; i++)
670                         values[i] = nprop->defaultvalue;
671         }
672 }
673 static void rna_FloatProperty_default_array_get(PointerRNA *ptr, float *values)
674 {
675         PropertyRNA *prop = (PropertyRNA *)ptr->data;
676         FloatPropertyRNA *nprop = (FloatPropertyRNA *)prop;
677         rna_idproperty_check(&prop, ptr);
678
679         if (nprop->defaultarray) {
680                 memcpy(values, nprop->defaultarray, prop->totarraylength * sizeof(float));
681         }
682         else {
683                 int i;
684                 for (i = 0; i < prop->totarraylength; i++)
685                         values[i] = nprop->defaultvalue;
686         }
687 }
688
689 static int rna_IntProperty_hard_min_get(PointerRNA *ptr)
690 {
691         PropertyRNA *prop = (PropertyRNA *)ptr->data;
692         rna_idproperty_check(&prop, ptr);
693         return ((IntPropertyRNA *)prop)->hardmin;
694 }
695
696 static int rna_IntProperty_hard_max_get(PointerRNA *ptr)
697 {
698         PropertyRNA *prop = (PropertyRNA *)ptr->data;
699         rna_idproperty_check(&prop, ptr);
700         return ((IntPropertyRNA *)prop)->hardmax;
701 }
702
703 static int rna_IntProperty_soft_min_get(PointerRNA *ptr)
704 {
705         PropertyRNA *prop = (PropertyRNA *)ptr->data;
706         rna_idproperty_check(&prop, ptr);
707         return ((IntPropertyRNA *)prop)->softmin;
708 }
709
710 static int rna_IntProperty_soft_max_get(PointerRNA *ptr)
711 {
712         PropertyRNA *prop = (PropertyRNA *)ptr->data;
713         rna_idproperty_check(&prop, ptr);
714         return ((IntPropertyRNA *)prop)->softmax;
715 }
716
717 static int rna_IntProperty_step_get(PointerRNA *ptr)
718 {
719         PropertyRNA *prop = (PropertyRNA *)ptr->data;
720         rna_idproperty_check(&prop, ptr);
721         return ((IntPropertyRNA *)prop)->step;
722 }
723
724 static float rna_FloatProperty_default_get(PointerRNA *ptr)
725 {
726         PropertyRNA *prop = (PropertyRNA *)ptr->data;
727         rna_idproperty_check(&prop, ptr);
728         return ((FloatPropertyRNA *)prop)->defaultvalue;
729 }
730 static float rna_FloatProperty_hard_min_get(PointerRNA *ptr)
731 {
732         PropertyRNA *prop = (PropertyRNA *)ptr->data;
733         rna_idproperty_check(&prop, ptr);
734         return ((FloatPropertyRNA *)prop)->hardmin;
735 }
736
737 static float rna_FloatProperty_hard_max_get(PointerRNA *ptr)
738 {
739         PropertyRNA *prop = (PropertyRNA *)ptr->data;
740         rna_idproperty_check(&prop, ptr);
741         return ((FloatPropertyRNA *)prop)->hardmax;
742 }
743
744 static float rna_FloatProperty_soft_min_get(PointerRNA *ptr)
745 {
746         PropertyRNA *prop = (PropertyRNA *)ptr->data;
747         rna_idproperty_check(&prop, ptr);
748         return ((FloatPropertyRNA *)prop)->softmin;
749 }
750
751 static float rna_FloatProperty_soft_max_get(PointerRNA *ptr)
752 {
753         PropertyRNA *prop = (PropertyRNA *)ptr->data;
754         rna_idproperty_check(&prop, ptr);
755         return ((FloatPropertyRNA *)prop)->softmax;
756 }
757
758 static float rna_FloatProperty_step_get(PointerRNA *ptr)
759 {
760         PropertyRNA *prop = (PropertyRNA *)ptr->data;
761         rna_idproperty_check(&prop, ptr);
762         return ((FloatPropertyRNA *)prop)->step;
763 }
764
765 static int rna_FloatProperty_precision_get(PointerRNA *ptr)
766 {
767         PropertyRNA *prop = (PropertyRNA *)ptr->data;
768         rna_idproperty_check(&prop, ptr);
769         return ((FloatPropertyRNA *)prop)->precision;
770 }
771
772 static void rna_StringProperty_default_get(PointerRNA *ptr, char *value)
773 {
774         PropertyRNA *prop = (PropertyRNA *)ptr->data;
775         rna_idproperty_check(&prop, ptr);
776         strcpy(value, ((StringPropertyRNA *)prop)->defaultvalue);
777 }
778 static int rna_StringProperty_default_length(PointerRNA *ptr)
779 {
780         PropertyRNA *prop = (PropertyRNA *)ptr->data;
781         rna_idproperty_check(&prop, ptr);
782         return strlen(((StringPropertyRNA *)prop)->defaultvalue);
783 }
784
785 static int rna_StringProperty_max_length_get(PointerRNA *ptr)
786 {
787         PropertyRNA *prop = (PropertyRNA *)ptr->data;
788         rna_idproperty_check(&prop, ptr);
789         return ((StringPropertyRNA *)prop)->maxlength;
790 }
791
792 static EnumPropertyItem *rna_EnumProperty_default_itemf(bContext *C, PointerRNA *ptr,
793                                                         PropertyRNA *prop_parent, int *free)
794 {
795         PropertyRNA *prop = (PropertyRNA *)ptr->data;
796         EnumPropertyRNA *eprop;
797
798         rna_idproperty_check(&prop, ptr);
799         eprop = (EnumPropertyRNA *)prop;
800
801         /* incompatible default attributes */
802         if ((prop_parent->flag & PROP_ENUM_FLAG) != (prop->flag & PROP_ENUM_FLAG)) {
803                 return NULL;
804         }
805
806         if ((eprop->itemf == NULL) ||
807             (eprop->itemf == rna_EnumProperty_default_itemf) ||
808             (ptr->type == &RNA_EnumProperty) ||
809             (C == NULL))
810         {
811                 return eprop->item;
812         }
813
814         return eprop->itemf(C, ptr, prop, free);
815 }
816
817 /* XXX - not sure this is needed? */
818 static int rna_EnumProperty_default_get(PointerRNA *ptr)
819 {
820         PropertyRNA *prop = (PropertyRNA *)ptr->data;
821         rna_idproperty_check(&prop, ptr);
822         return ((EnumPropertyRNA *)prop)->defaultvalue;
823 }
824
825 static int rna_enum_check_separator(CollectionPropertyIterator *UNUSED(iter), void *data)
826 {
827         EnumPropertyItem *item = (EnumPropertyItem *)data;
828
829         return (item->identifier[0] == 0);
830 }
831
832 static void rna_EnumProperty_items_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
833 {
834         PropertyRNA *prop = (PropertyRNA *)ptr->data;
835         /* EnumPropertyRNA *eprop;  *//* UNUSED */
836         EnumPropertyItem *item = NULL;
837         int totitem, free = 0;
838         
839         rna_idproperty_check(&prop, ptr);
840         /* eprop = (EnumPropertyRNA *)prop; */
841         
842         RNA_property_enum_items(NULL, ptr, prop, &item, &totitem, &free);
843         rna_iterator_array_begin(iter, (void *)item, sizeof(EnumPropertyItem), totitem, free, rna_enum_check_separator);
844 }
845
846 static void rna_EnumPropertyItem_identifier_get(PointerRNA *ptr, char *value)
847 {
848         strcpy(value, ((EnumPropertyItem *)ptr->data)->identifier);
849 }
850
851 static int rna_EnumPropertyItem_identifier_length(PointerRNA *ptr)
852 {
853         return strlen(((EnumPropertyItem *)ptr->data)->identifier);
854 }
855
856 static void rna_EnumPropertyItem_name_get(PointerRNA *ptr, char *value)
857 {
858         strcpy(value, ((EnumPropertyItem *)ptr->data)->name);
859 }
860
861 static int rna_EnumPropertyItem_name_length(PointerRNA *ptr)
862 {
863         return strlen(((EnumPropertyItem *)ptr->data)->name);
864 }
865
866 static void rna_EnumPropertyItem_description_get(PointerRNA *ptr, char *value)
867 {
868         EnumPropertyItem *eprop = (EnumPropertyItem *)ptr->data;
869
870         if (eprop->description)
871                 strcpy(value, eprop->description);
872         else
873                 value[0] = '\0';
874 }
875
876 static int rna_EnumPropertyItem_description_length(PointerRNA *ptr)
877 {
878         EnumPropertyItem *eprop = (EnumPropertyItem *)ptr->data;
879
880         if (eprop->description)
881                 return strlen(eprop->description);
882         else
883                 return 0;
884 }
885
886 static int rna_EnumPropertyItem_value_get(PointerRNA *ptr)
887 {
888         return ((EnumPropertyItem *)ptr->data)->value;
889 }
890
891 static int rna_EnumPropertyItem_icon_get(PointerRNA *ptr)
892 {
893         return ((EnumPropertyItem *)ptr->data)->icon;
894 }
895
896 static PointerRNA rna_PointerProperty_fixed_type_get(PointerRNA *ptr)
897 {
898         PropertyRNA *prop = (PropertyRNA *)ptr->data;
899         rna_idproperty_check(&prop, ptr);
900         return rna_pointer_inherit_refine(ptr, &RNA_Struct, ((PointerPropertyRNA *)prop)->type);
901 }
902
903 static PointerRNA rna_CollectionProperty_fixed_type_get(PointerRNA *ptr)
904 {
905         PropertyRNA *prop = (PropertyRNA *)ptr->data;
906         rna_idproperty_check(&prop, ptr);
907         return rna_pointer_inherit_refine(ptr, &RNA_Struct, ((CollectionPropertyRNA *)prop)->item_type);
908 }
909
910 /* Function */
911
912 static void rna_Function_identifier_get(PointerRNA *ptr, char *value)
913 {
914         strcpy(value, ((FunctionRNA *)ptr->data)->identifier);
915 }
916
917 static int rna_Function_identifier_length(PointerRNA *ptr)
918 {
919         return strlen(((FunctionRNA *)ptr->data)->identifier);
920 }
921
922 static void rna_Function_description_get(PointerRNA *ptr, char *value)
923 {
924         strcpy(value, ((FunctionRNA *)ptr->data)->description);
925 }
926
927 static int rna_Function_description_length(PointerRNA *ptr)
928 {
929         return strlen(((FunctionRNA *)ptr->data)->description);
930 }
931
932 static void rna_Function_parameters_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
933 {
934         rna_iterator_listbase_begin(iter, &((FunctionRNA *)ptr->data)->cont.properties, rna_property_builtin);
935 }
936
937 static int rna_Function_registered_get(PointerRNA *ptr)
938 {
939         FunctionRNA *func = (FunctionRNA *)ptr->data;
940         return func->flag & FUNC_REGISTER;
941 }
942
943 static int rna_Function_registered_optional_get(PointerRNA *ptr)
944 {
945         FunctionRNA *func = (FunctionRNA *)ptr->data;
946         return func->flag & FUNC_REGISTER_OPTIONAL;
947 }
948
949 static int rna_Function_no_self_get(PointerRNA *ptr)
950 {
951         FunctionRNA *func = (FunctionRNA *)ptr->data;
952         return !(func->flag & FUNC_NO_SELF);
953 }
954
955 static int rna_Function_use_self_type_get(PointerRNA *ptr)
956 {
957         FunctionRNA *func = (FunctionRNA *)ptr->data;
958         return (func->flag & FUNC_USE_SELF_TYPE);
959 }
960
961 /* Blender RNA */
962
963 static void rna_BlenderRNA_structs_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
964 {
965         rna_iterator_listbase_begin(iter, &((BlenderRNA *)ptr->data)->structs, NULL);
966 }
967
968 /* optional, for faster lookups */
969 static int rna_BlenderRNA_structs_length(PointerRNA *ptr)
970 {
971         return BLI_countlist(&((BlenderRNA *)ptr->data)->structs);
972 }
973 static int rna_BlenderRNA_structs_lookup_int(PointerRNA *ptr, int index, PointerRNA *r_ptr)
974 {
975         StructRNA *srna = BLI_findlink(&((BlenderRNA *)ptr->data)->structs, index);
976
977         if (srna) {
978                 RNA_pointer_create(NULL, &RNA_Struct, srna, r_ptr);
979                 return TRUE;
980         }
981         else {
982                 return FALSE;
983         }
984 }
985 static int rna_BlenderRNA_structs_lookup_string(PointerRNA *ptr, const char *key, PointerRNA *r_ptr)
986 {
987         StructRNA *srna = ((BlenderRNA *)ptr->data)->structs.first;
988         for (; srna; srna = srna->cont.next) {
989                 if (key[0] == srna->identifier[0] && strcmp(key, srna->identifier) == 0) {
990                         RNA_pointer_create(NULL, &RNA_Struct, srna, r_ptr);
991                         return TRUE;
992                 }
993         }
994
995         return FALSE;
996 }
997
998
999 #else
1000
1001 static void rna_def_struct(BlenderRNA *brna)
1002 {
1003         StructRNA *srna;
1004         PropertyRNA *prop;
1005
1006         srna = RNA_def_struct(brna, "Struct", NULL);
1007         RNA_def_struct_ui_text(srna, "Struct Definition", "RNA structure definition");
1008         RNA_def_struct_ui_icon(srna, ICON_RNA);
1009
1010         prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
1011         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1012         RNA_def_property_string_funcs(prop, "rna_Struct_name_get", "rna_Struct_name_length", NULL);
1013         RNA_def_property_ui_text(prop, "Name", "Human readable name");
1014
1015         prop = RNA_def_property(srna, "identifier", PROP_STRING, PROP_NONE);
1016         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1017         RNA_def_property_string_funcs(prop, "rna_Struct_identifier_get", "rna_Struct_identifier_length", NULL);
1018         RNA_def_property_ui_text(prop, "Identifier", "Unique name used in the code and scripting");
1019         RNA_def_struct_name_property(srna, prop);
1020         
1021         prop = RNA_def_property(srna, "description", PROP_STRING, PROP_NONE);
1022         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1023         RNA_def_property_string_funcs(prop, "rna_Struct_description_get", "rna_Struct_description_length", NULL);
1024         RNA_def_property_ui_text(prop, "Description", "Description of the Struct's purpose");
1025         
1026         prop = RNA_def_property(srna, "translation_context", PROP_STRING, PROP_NONE);
1027         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1028         RNA_def_property_string_funcs(prop, "rna_Struct_translation_context_get",
1029                                       "rna_Struct_translation_context_length", NULL);
1030         RNA_def_property_ui_text(prop, "Translation Context", "Translation context of the struct's name");
1031         
1032         prop = RNA_def_property(srna, "base", PROP_POINTER, PROP_NONE);
1033         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1034         RNA_def_property_struct_type(prop, "Struct");
1035         RNA_def_property_pointer_funcs(prop, "rna_Struct_base_get", NULL, NULL, NULL);
1036         RNA_def_property_ui_text(prop, "Base", "Struct definition this is derived from");
1037
1038         prop = RNA_def_property(srna, "nested", PROP_POINTER, PROP_NONE);
1039         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1040         RNA_def_property_struct_type(prop, "Struct");
1041         RNA_def_property_pointer_funcs(prop, "rna_Struct_nested_get", NULL, NULL, NULL);
1042         RNA_def_property_ui_text(prop, "Nested",
1043                                  "Struct in which this struct is always nested, and to which it logically belongs");
1044
1045         prop = RNA_def_property(srna, "name_property", PROP_POINTER, PROP_NONE);
1046         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1047         RNA_def_property_struct_type(prop, "StringProperty");
1048         RNA_def_property_pointer_funcs(prop, "rna_Struct_name_property_get", NULL, NULL, NULL);
1049         RNA_def_property_ui_text(prop, "Name Property", "Property that gives the name of the struct");
1050
1051         prop = RNA_def_property(srna, "properties", PROP_COLLECTION, PROP_NONE);
1052         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1053         RNA_def_property_struct_type(prop, "Property");
1054         RNA_def_property_collection_funcs(prop, "rna_Struct_properties_begin", "rna_Struct_properties_next",
1055                                           "rna_iterator_listbase_end", "rna_Struct_properties_get",
1056                                           NULL, NULL, NULL, NULL);
1057         RNA_def_property_ui_text(prop, "Properties", "Properties in the struct");
1058
1059         prop = RNA_def_property(srna, "functions", PROP_COLLECTION, PROP_NONE);
1060         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1061         RNA_def_property_struct_type(prop, "Function");
1062         RNA_def_property_collection_funcs(prop, "rna_Struct_functions_begin", "rna_Struct_functions_next",
1063                                           "rna_iterator_listbase_end", "rna_Struct_functions_get",
1064                                           NULL, NULL, NULL, NULL);
1065         RNA_def_property_ui_text(prop, "Functions", "");
1066 }
1067
1068 static void rna_def_property(BlenderRNA *brna)
1069 {
1070         StructRNA *srna;
1071         PropertyRNA *prop;
1072         static EnumPropertyItem subtype_items[] = {
1073                 {PROP_NONE, "NONE", 0, "None", ""},
1074                 {PROP_FILEPATH, "FILE_PATH", 0, "File Path", ""},
1075                 {PROP_DIRPATH, "DIRECTORY_PATH", 0, "Directory Path", ""},
1076                 {PROP_UNSIGNED, "UNSIGNED", 0, "Unsigned Number", ""},
1077                 {PROP_PERCENTAGE, "PERCENTAGE", 0, "Percentage", ""},
1078                 {PROP_FACTOR, "FACTOR", 0, "Factor", ""},
1079                 {PROP_ANGLE, "ANGLE", 0, "Angle", ""},
1080                 {PROP_TIME, "TIME", 0, "Time", ""},
1081                 {PROP_DISTANCE, "DISTANCE", 0, "Distance", ""},
1082                 {PROP_COLOR, "COLOR", 0, "Color", ""},
1083                 {PROP_TRANSLATION, "TRANSLATION", 0, "Translation", ""},
1084                 {PROP_DIRECTION, "DIRECTION", 0, "Direction", ""},
1085                 {PROP_MATRIX, "MATRIX", 0, "Matrix", ""},
1086                 {PROP_EULER, "EULER", 0, "Euler", ""},
1087                 {PROP_QUATERNION, "QUATERNION", 0, "Quaternion", ""},
1088                 {PROP_XYZ, "XYZ", 0, "XYZ", ""},
1089                 {PROP_COLOR_GAMMA, "COLOR_GAMMA", 0, "Gamma Corrected Color", ""},
1090                 {PROP_COORDS, "COORDINATES", 0, "Vector Coordinates", ""},
1091                 {PROP_LAYER, "LAYER", 0, "Layer", ""},
1092                 {PROP_LAYER_MEMBER, "LAYER_MEMBERSHIP", 0, "Layer Membership", ""},
1093                 {0, NULL, 0, NULL, NULL}
1094         };
1095
1096         srna = RNA_def_struct(brna, "Property", NULL);
1097         RNA_def_struct_ui_text(srna, "Property Definition", "RNA property definition");
1098         RNA_def_struct_refine_func(srna, "rna_Property_refine");
1099         RNA_def_struct_ui_icon(srna, ICON_RNA);
1100
1101         prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
1102         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1103         RNA_def_property_string_funcs(prop, "rna_Property_name_get", "rna_Property_name_length", NULL);
1104         RNA_def_property_ui_text(prop, "Name", "Human readable name");
1105
1106         prop = RNA_def_property(srna, "identifier", PROP_STRING, PROP_NONE);
1107         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1108         RNA_def_property_string_funcs(prop, "rna_Property_identifier_get", "rna_Property_identifier_length", NULL);
1109         RNA_def_property_ui_text(prop, "Identifier", "Unique name used in the code and scripting");
1110         RNA_def_struct_name_property(srna, prop);
1111                 
1112         prop = RNA_def_property(srna, "description", PROP_STRING, PROP_NONE);
1113         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1114         RNA_def_property_string_funcs(prop, "rna_Property_description_get", "rna_Property_description_length", NULL);
1115         RNA_def_property_ui_text(prop, "Description", "Description of the property for tooltips");
1116
1117         prop = RNA_def_property(srna, "translation_context", PROP_STRING, PROP_NONE);
1118         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1119         RNA_def_property_string_funcs(prop, "rna_Property_translation_context_get",
1120                                       "rna_Property_translation_context_length", NULL);
1121         RNA_def_property_ui_text(prop, "Translation Context", "Translation context of the property's name");
1122
1123         prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
1124         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1125         RNA_def_property_enum_items(prop, property_type_items);
1126         RNA_def_property_enum_funcs(prop, "rna_Property_type_get", NULL, NULL);
1127         RNA_def_property_ui_text(prop, "Type", "Data type of the property");
1128
1129         prop = RNA_def_property(srna, "subtype", PROP_ENUM, PROP_NONE);
1130         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1131         RNA_def_property_enum_items(prop, subtype_items);
1132         RNA_def_property_enum_funcs(prop, "rna_Property_subtype_get", NULL, NULL);
1133         RNA_def_property_ui_text(prop, "Subtype", "Semantic interpretation of the property");
1134
1135         prop = RNA_def_property(srna, "srna", PROP_POINTER, PROP_NONE);
1136         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1137         RNA_def_property_struct_type(prop, "Struct");
1138         RNA_def_property_pointer_funcs(prop, "rna_Property_srna_get", NULL, NULL, NULL);
1139         RNA_def_property_ui_text(prop, "Base", "Struct definition used for properties assigned to this item");
1140
1141         prop = RNA_def_property(srna, "unit", PROP_ENUM, PROP_NONE);
1142         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1143         RNA_def_property_enum_items(prop, property_unit_items);
1144         RNA_def_property_enum_funcs(prop, "rna_Property_unit_get", NULL, NULL);
1145         RNA_def_property_ui_text(prop, "Unit", "Type of units for this property");
1146
1147         prop = RNA_def_property(srna, "icon", PROP_ENUM, PROP_NONE);
1148         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1149         RNA_def_property_enum_items(prop, icon_items);
1150         RNA_def_property_enum_funcs(prop, "rna_Property_icon_get", NULL, NULL);
1151         RNA_def_property_ui_text(prop, "Icon", "Icon of the item");
1152
1153         prop = RNA_def_property(srna, "is_readonly", PROP_BOOLEAN, PROP_NONE);
1154         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1155         RNA_def_property_boolean_funcs(prop, "rna_Property_readonly_get", NULL);
1156         RNA_def_property_ui_text(prop, "Read Only", "Property is editable through RNA");
1157
1158         prop = RNA_def_property(srna, "is_animatable", PROP_BOOLEAN, PROP_NONE);
1159         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1160         RNA_def_property_boolean_funcs(prop, "rna_Property_animatable_get", NULL);
1161         RNA_def_property_ui_text(prop, "Animatable", "Property is animatable through RNA");
1162
1163         prop = RNA_def_property(srna, "is_required", PROP_BOOLEAN, PROP_NONE);
1164         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1165         RNA_def_property_boolean_funcs(prop, "rna_Property_is_required_get", NULL);
1166         RNA_def_property_ui_text(prop, "Required", "False when this property is an optional argument in an RNA function");
1167
1168         prop = RNA_def_property(srna, "is_never_none", PROP_BOOLEAN, PROP_NONE);
1169         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1170         RNA_def_property_boolean_funcs(prop, "rna_Property_is_never_none_get", NULL);
1171         RNA_def_property_ui_text(prop, "Never None", "True when this value can't be set to None");
1172
1173         prop = RNA_def_property(srna, "is_hidden", PROP_BOOLEAN, PROP_NONE);
1174         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1175         RNA_def_property_boolean_funcs(prop, "rna_Property_is_hidden_get", NULL);
1176         RNA_def_property_ui_text(prop, "Hidden", "True when the property is hidden");
1177
1178         prop = RNA_def_property(srna, "is_skip_save", PROP_BOOLEAN, PROP_NONE);
1179         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1180         RNA_def_property_boolean_funcs(prop, "rna_Property_is_skip_save_get", NULL);
1181         RNA_def_property_ui_text(prop, "Skip Save", "True when the property is not saved in presets");
1182
1183         prop = RNA_def_property(srna, "is_output", PROP_BOOLEAN, PROP_NONE);
1184         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1185         RNA_def_property_boolean_funcs(prop, "rna_Property_use_output_get", NULL);
1186         RNA_def_property_ui_text(prop, "Return", "True when this property is an output value from an RNA function");
1187
1188         prop = RNA_def_property(srna, "is_registered", PROP_BOOLEAN, PROP_NONE);
1189         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1190         RNA_def_property_boolean_funcs(prop, "rna_Property_registered_get", NULL);
1191         RNA_def_property_ui_text(prop, "Registered", "Property is registered as part of type registration");
1192
1193         prop = RNA_def_property(srna, "is_registered_optional", PROP_BOOLEAN, PROP_NONE);
1194         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1195         RNA_def_property_boolean_funcs(prop, "rna_Property_registered_optional_get", NULL);
1196         RNA_def_property_ui_text(prop, "Registered Optionally",
1197                                  "Property is optionally registered as part of type registration");
1198         
1199         prop = RNA_def_property(srna, "is_runtime", PROP_BOOLEAN, PROP_NONE);
1200         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1201         RNA_def_property_boolean_funcs(prop, "rna_Property_runtime_get", NULL);
1202         RNA_def_property_ui_text(prop, "Runtime", "Property has been dynamically created at runtime");
1203
1204         prop = RNA_def_property(srna, "is_enum_flag", PROP_BOOLEAN, PROP_NONE);
1205         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1206         RNA_def_property_boolean_funcs(prop, "rna_Property_is_enum_flag_get", NULL);
1207         RNA_def_property_ui_text(prop, "Enum Flag", "True when multiple enums ");
1208
1209         prop = RNA_def_property(srna, "is_library_editable", PROP_BOOLEAN, PROP_NONE);
1210         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1211         RNA_def_property_boolean_funcs(prop, "rna_Property_is_library_editable_flag_get", NULL);
1212         RNA_def_property_ui_text(prop, "Library Editable", "Property is editable from linked instances (changes not saved)");
1213 }
1214
1215 static void rna_def_function(BlenderRNA *brna)
1216 {
1217         StructRNA *srna;
1218         PropertyRNA *prop;
1219
1220         srna = RNA_def_struct(brna, "Function", NULL);
1221         RNA_def_struct_ui_text(srna, "Function Definition", "RNA function definition");
1222         RNA_def_struct_ui_icon(srna, ICON_RNA);
1223
1224         prop = RNA_def_property(srna, "identifier", PROP_STRING, PROP_NONE);
1225         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1226         RNA_def_property_string_funcs(prop, "rna_Function_identifier_get", "rna_Function_identifier_length", NULL);
1227         RNA_def_property_ui_text(prop, "Identifier", "Unique name used in the code and scripting");
1228         RNA_def_struct_name_property(srna, prop);
1229
1230         prop = RNA_def_property(srna, "description", PROP_STRING, PROP_NONE);
1231         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1232         RNA_def_property_string_funcs(prop, "rna_Function_description_get", "rna_Function_description_length", NULL);
1233         RNA_def_property_ui_text(prop, "Description", "Description of the Function's purpose");
1234
1235         prop = RNA_def_property(srna, "parameters", PROP_COLLECTION, PROP_NONE);
1236         /*RNA_def_property_clear_flag(prop, PROP_EDITABLE);*/
1237         RNA_def_property_struct_type(prop, "Property");
1238         RNA_def_property_collection_funcs(prop, "rna_Function_parameters_begin", "rna_iterator_listbase_next",
1239                                           "rna_iterator_listbase_end", "rna_iterator_listbase_get",
1240                                           NULL, NULL, NULL, NULL);
1241         RNA_def_property_ui_text(prop, "Parameters", "Parameters for the function");
1242
1243         prop = RNA_def_property(srna, "is_registered", PROP_BOOLEAN, PROP_NONE);
1244         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1245         RNA_def_property_boolean_funcs(prop, "rna_Function_registered_get", NULL);
1246         RNA_def_property_ui_text(prop, "Registered", "Function is registered as callback as part of type registration");
1247
1248         prop = RNA_def_property(srna, "is_registered_optional", PROP_BOOLEAN, PROP_NONE);
1249         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1250         RNA_def_property_boolean_funcs(prop, "rna_Function_registered_optional_get", NULL);
1251         RNA_def_property_ui_text(prop, "Registered Optionally",
1252                                  "Function is optionally registered as callback part of type registration");
1253
1254         prop = RNA_def_property(srna, "use_self", PROP_BOOLEAN, PROP_NONE);
1255         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1256         RNA_def_property_boolean_funcs(prop, "rna_Function_no_self_get", NULL);
1257         RNA_def_property_ui_text(prop, "No Self",
1258                                  "Function does not pass its self as an argument (becomes a static method in python)");
1259         
1260         prop = RNA_def_property(srna, "use_self_type", PROP_BOOLEAN, PROP_NONE);
1261         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1262         RNA_def_property_boolean_funcs(prop, "rna_Function_use_self_type_get", NULL);
1263         RNA_def_property_ui_text(prop, "Use Self Type",
1264                                  "Function passes its self type as an argument (becomes a class method in python if use_self is false)");
1265 }
1266
1267 static void rna_def_number_property(StructRNA *srna, PropertyType type)
1268 {
1269         PropertyRNA *prop;
1270
1271         prop = RNA_def_property(srna, "default", type, PROP_NONE);
1272         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1273         RNA_def_property_ui_text(prop, "Default", "Default value for this number");
1274
1275         switch (type) {
1276                 case PROP_BOOLEAN:
1277                         RNA_def_property_boolean_funcs(prop, "rna_BoolProperty_default_get", NULL);
1278                         break;
1279                 case PROP_INT:
1280                         RNA_def_property_int_funcs(prop, "rna_IntProperty_default_get", NULL, NULL);
1281                         break;
1282                 case PROP_FLOAT:
1283                         RNA_def_property_float_funcs(prop, "rna_FloatProperty_default_get", NULL, NULL);
1284                         break;
1285                 default:
1286                         break;
1287         }
1288
1289
1290         prop = RNA_def_property(srna, "default_array", type, PROP_NONE);
1291         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1292         RNA_def_property_array(prop, RNA_MAX_ARRAY_DIMENSION); /* no fixed default length, important its not 0 though */
1293         RNA_def_property_flag(prop, PROP_DYNAMIC);
1294         RNA_def_property_dynamic_array_funcs(prop, "rna_NumberProperty_default_array_get_length"); /* same for all types */
1295
1296         switch (type) {
1297                 case PROP_BOOLEAN:
1298                         RNA_def_property_boolean_funcs(prop, "rna_BoolProperty_default_array_get", NULL);
1299                         break;
1300                 case PROP_INT:
1301                         RNA_def_property_int_funcs(prop, "rna_IntProperty_default_array_get", NULL, NULL);
1302                         break;
1303                 case PROP_FLOAT:
1304                         RNA_def_property_float_funcs(prop, "rna_FloatProperty_default_array_get", NULL, NULL);
1305                         break;
1306                 default:
1307                         break;
1308         }
1309         RNA_def_property_ui_text(prop, "Default Array", "Default value for this array");
1310
1311
1312         prop = RNA_def_property(srna, "array_length", PROP_INT, PROP_UNSIGNED);
1313         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1314         RNA_def_property_int_funcs(prop, "rna_Property_array_length_get", NULL, NULL);
1315         RNA_def_property_ui_text(prop, "Array Length", "Maximum length of the array, 0 means unlimited");
1316
1317         if (type == PROP_BOOLEAN)
1318                 return;
1319
1320         prop = RNA_def_property(srna, "hard_min", type, PROP_NONE);
1321         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1322         if (type == PROP_INT) RNA_def_property_int_funcs(prop, "rna_IntProperty_hard_min_get", NULL, NULL);
1323         else RNA_def_property_float_funcs(prop, "rna_FloatProperty_hard_min_get", NULL, NULL);
1324         RNA_def_property_ui_text(prop, "Hard Minimum", "Minimum value used by buttons");
1325
1326         prop = RNA_def_property(srna, "hard_max", type, PROP_NONE);
1327         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1328         if (type == PROP_INT) RNA_def_property_int_funcs(prop, "rna_IntProperty_hard_max_get", NULL, NULL);
1329         else RNA_def_property_float_funcs(prop, "rna_FloatProperty_hard_max_get", NULL, NULL);
1330         RNA_def_property_ui_text(prop, "Hard Maximum", "Maximum value used by buttons");
1331
1332         prop = RNA_def_property(srna, "soft_min", type, PROP_NONE);
1333         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1334         if (type == PROP_INT) RNA_def_property_int_funcs(prop, "rna_IntProperty_soft_min_get", NULL, NULL);
1335         else RNA_def_property_float_funcs(prop, "rna_FloatProperty_soft_min_get", NULL, NULL);
1336         RNA_def_property_ui_text(prop, "Soft Minimum", "Minimum value used by buttons");
1337
1338         prop = RNA_def_property(srna, "soft_max", type, PROP_NONE);
1339         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1340         if (type == PROP_INT) RNA_def_property_int_funcs(prop, "rna_IntProperty_soft_max_get", NULL, NULL);
1341         else RNA_def_property_float_funcs(prop, "rna_FloatProperty_soft_max_get", NULL, NULL);
1342         RNA_def_property_ui_text(prop, "Soft Maximum", "Maximum value used by buttons");
1343
1344         prop = RNA_def_property(srna, "step", type, PROP_UNSIGNED);
1345         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1346         if (type == PROP_INT) RNA_def_property_int_funcs(prop, "rna_IntProperty_step_get", NULL, NULL);
1347         else RNA_def_property_float_funcs(prop, "rna_FloatProperty_step_get", NULL, NULL);
1348         RNA_def_property_ui_text(prop, "Step", "Step size used by number buttons, for floats 1/100th of the step size");
1349
1350         if (type == PROP_FLOAT) {
1351                 prop = RNA_def_property(srna, "precision", PROP_INT, PROP_UNSIGNED);
1352                 RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1353                 RNA_def_property_int_funcs(prop, "rna_FloatProperty_precision_get", NULL, NULL);
1354                 RNA_def_property_ui_text(prop, "Precision", "Number of digits after the dot used by buttons");
1355         }
1356 }
1357
1358 static void rna_def_string_property(StructRNA *srna)
1359 {
1360         PropertyRNA *prop;
1361
1362         prop = RNA_def_property(srna, "default", PROP_STRING, PROP_NONE);
1363         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1364         RNA_def_property_string_funcs(prop, "rna_StringProperty_default_get", "rna_StringProperty_default_length", NULL);
1365         RNA_def_property_ui_text(prop, "Default", "string default value");
1366
1367         prop = RNA_def_property(srna, "length_max", PROP_INT, PROP_UNSIGNED);
1368         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1369         RNA_def_property_int_funcs(prop, "rna_StringProperty_max_length_get", NULL, NULL);
1370         RNA_def_property_ui_text(prop, "Maximum Length", "Maximum length of the string, 0 means unlimited");
1371 }
1372
1373 static void rna_def_enum_property(BlenderRNA *brna, StructRNA *srna)
1374 {
1375         PropertyRNA *prop;
1376
1377         /* the itemf func is used instead, keep blender happy */
1378         static EnumPropertyItem default_dummy_items[] = {
1379                 {PROP_NONE, "DUMMY", 0, "Dummy", ""},
1380                 {0, NULL, 0, NULL, NULL}
1381         };
1382
1383         prop = RNA_def_property(srna, "default", PROP_ENUM, PROP_NONE);
1384         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1385         RNA_def_property_enum_items(prop, default_dummy_items);
1386         RNA_def_property_enum_funcs(prop, "rna_EnumProperty_default_get", NULL, "rna_EnumProperty_default_itemf");
1387         RNA_def_property_ui_text(prop, "Default", "Default value for this enum");
1388
1389         /* same 'default' but uses 'PROP_ENUM_FLAG' */
1390         prop = RNA_def_property(srna, "default_flag", PROP_ENUM, PROP_NONE);
1391         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1392         RNA_def_property_flag(prop, PROP_ENUM_FLAG);
1393         RNA_def_property_enum_items(prop, default_dummy_items);
1394         RNA_def_property_enum_funcs(prop, "rna_EnumProperty_default_get", NULL, "rna_EnumProperty_default_itemf");
1395         RNA_def_property_ui_text(prop, "Default", "Default value for this enum");
1396
1397         prop = RNA_def_property(srna, "enum_items", PROP_COLLECTION, PROP_NONE);
1398         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1399         RNA_def_property_struct_type(prop, "EnumPropertyItem");
1400         RNA_def_property_collection_funcs(prop, "rna_EnumProperty_items_begin", "rna_iterator_array_next",
1401                                           "rna_iterator_array_end", "rna_iterator_array_get", NULL, NULL, NULL, NULL);
1402         RNA_def_property_ui_text(prop, "Items", "Possible values for the property");
1403
1404         srna = RNA_def_struct(brna, "EnumPropertyItem", NULL);
1405         RNA_def_struct_ui_text(srna, "Enum Item Definition", "Definition of a choice in an RNA enum property");
1406         RNA_def_struct_ui_icon(srna, ICON_RNA);
1407
1408         prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
1409         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1410         RNA_def_property_string_funcs(prop, "rna_EnumPropertyItem_name_get", "rna_EnumPropertyItem_name_length", NULL);
1411         RNA_def_property_ui_text(prop, "Name", "Human readable name");
1412
1413         prop = RNA_def_property(srna, "description", PROP_STRING, PROP_NONE);
1414         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1415         RNA_def_property_string_funcs(prop, "rna_EnumPropertyItem_description_get",
1416                                       "rna_EnumPropertyItem_description_length", NULL);
1417         RNA_def_property_ui_text(prop, "Description", "Description of the item's purpose");
1418
1419         prop = RNA_def_property(srna, "identifier", PROP_STRING, PROP_NONE);
1420         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1421         RNA_def_property_string_funcs(prop, "rna_EnumPropertyItem_identifier_get",
1422                                       "rna_EnumPropertyItem_identifier_length", NULL);
1423         RNA_def_property_ui_text(prop, "Identifier", "Unique name used in the code and scripting");
1424         RNA_def_struct_name_property(srna, prop);
1425
1426         prop = RNA_def_property(srna, "value", PROP_INT, PROP_UNSIGNED);
1427         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1428         RNA_def_property_int_funcs(prop, "rna_EnumPropertyItem_value_get", NULL, NULL);
1429         RNA_def_property_ui_text(prop, "Value", "Value of the item");
1430
1431         prop = RNA_def_property(srna, "icon", PROP_ENUM, PROP_NONE);
1432         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1433         RNA_def_property_enum_items(prop, icon_items);
1434         RNA_def_property_enum_funcs(prop, "rna_EnumPropertyItem_icon_get", NULL, NULL);
1435         RNA_def_property_ui_text(prop, "Icon", "Icon of the item");
1436 }
1437
1438 static void rna_def_pointer_property(StructRNA *srna, PropertyType type)
1439 {
1440         PropertyRNA *prop;
1441
1442         prop = RNA_def_property(srna, "fixed_type", PROP_POINTER, PROP_NONE);
1443         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1444         RNA_def_property_struct_type(prop, "Struct");
1445         if (type == PROP_POINTER)
1446                 RNA_def_property_pointer_funcs(prop, "rna_PointerProperty_fixed_type_get", NULL, NULL, NULL);
1447         else
1448                 RNA_def_property_pointer_funcs(prop, "rna_CollectionProperty_fixed_type_get", NULL, NULL, NULL);
1449         RNA_def_property_ui_text(prop, "Pointer Type", "Fixed pointer type, empty if variable type");
1450 }
1451
1452 void RNA_def_rna(BlenderRNA *brna)
1453 {
1454         StructRNA *srna;
1455         PropertyRNA *prop;
1456
1457         /* Struct*/
1458         rna_def_struct(brna);
1459
1460         /* Property */
1461         rna_def_property(brna);
1462
1463         /* BoolProperty */
1464         srna = RNA_def_struct(brna, "BoolProperty", "Property");
1465         RNA_def_struct_ui_text(srna, "Boolean Definition", "RNA boolean property definition");
1466         rna_def_number_property(srna, PROP_BOOLEAN);
1467
1468         /* IntProperty */
1469         srna = RNA_def_struct(brna, "IntProperty", "Property");
1470         RNA_def_struct_ui_text(srna, "Int Definition", "RNA integer number property definition");
1471         rna_def_number_property(srna, PROP_INT);
1472
1473         /* FloatProperty */
1474         srna = RNA_def_struct(brna, "FloatProperty", "Property");
1475         RNA_def_struct_ui_text(srna, "Float Definition", "RNA floating pointer number property definition");
1476         rna_def_number_property(srna, PROP_FLOAT);
1477
1478         /* StringProperty */
1479         srna = RNA_def_struct(brna, "StringProperty", "Property");
1480         RNA_def_struct_ui_text(srna, "String Definition", "RNA text string property definition");
1481         rna_def_string_property(srna);
1482
1483         /* EnumProperty */
1484         srna = RNA_def_struct(brna, "EnumProperty", "Property");
1485         RNA_def_struct_ui_text(srna, "Enum Definition",
1486                                "RNA enumeration property definition, to choose from a number of predefined options");
1487         rna_def_enum_property(brna, srna);
1488
1489         /* PointerProperty */
1490         srna = RNA_def_struct(brna, "PointerProperty", "Property");
1491         RNA_def_struct_ui_text(srna, "Pointer Definition", "RNA pointer property to point to another RNA struct");
1492         rna_def_pointer_property(srna, PROP_POINTER);
1493
1494         /* CollectionProperty */
1495         srna = RNA_def_struct(brna, "CollectionProperty", "Property");
1496         RNA_def_struct_ui_text(srna, "Collection Definition",
1497                                "RNA collection property to define lists, arrays and mappings");
1498         rna_def_pointer_property(srna, PROP_COLLECTION);
1499         
1500         /* Function */
1501         rna_def_function(brna);
1502
1503         /* Blender RNA */
1504         srna = RNA_def_struct(brna, "BlenderRNA", NULL);
1505         RNA_def_struct_ui_text(srna, "Blender RNA", "Blender RNA structure definitions");
1506         RNA_def_struct_ui_icon(srna, ICON_RNA);
1507
1508         prop = RNA_def_property(srna, "structs", PROP_COLLECTION, PROP_NONE);
1509         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
1510         RNA_def_property_struct_type(prop, "Struct");
1511         RNA_def_property_collection_funcs(prop, "rna_BlenderRNA_structs_begin", "rna_iterator_listbase_next",
1512                                           "rna_iterator_listbase_end", "rna_iterator_listbase_get",
1513                                           /* included for speed, can be removed */
1514 #if 0
1515                                           NULL, NULL, NULL, NULL);
1516 #else
1517                                           "rna_BlenderRNA_structs_length", "rna_BlenderRNA_structs_lookup_int",
1518                                           "rna_BlenderRNA_structs_lookup_string", NULL);
1519 #endif
1520
1521         RNA_def_property_ui_text(prop, "Structs", "");
1522 }
1523
1524 #endif