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