RNA
[blender.git] / source / blender / makesrna / RNA_types.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * Contributor(s): Blender Foundation (2008).
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 #ifndef RNA_TYPES
26 #define RNA_TYPES
27
28 #include "DNA_listBase.h"
29
30 struct BlenderRNA;
31 struct StructRNA;
32 struct PropertyRNA;
33 struct PointerRNA;
34 struct CollectionPropertyIterator;
35 struct bContext;
36
37 /* Function Callbacks */
38
39 typedef void (*PropNotifyFunc)(struct bContext *C, struct PointerRNA *ptr);
40 typedef int (*PropBooleanGetFunc)(struct PointerRNA *ptr);
41 typedef void (*PropBooleanSetFunc)(struct PointerRNA *ptr, int value);
42 typedef int (*PropBooleanArrayGetFunc)(struct PointerRNA *ptr, int index);
43 typedef void (*PropBooleanArraySetFunc)(struct PointerRNA *ptr, int index, int value);
44 typedef int (*PropIntGetFunc)(struct PointerRNA *ptr);
45 typedef void (*PropIntSetFunc)(struct PointerRNA *ptr, int value);
46 typedef int (*PropIntArrayGetFunc)(struct PointerRNA *ptr, int index);
47 typedef void (*PropIntArraySetFunc)(struct PointerRNA *ptr, int index, int value);
48 typedef float (*PropFloatGetFunc)(struct PointerRNA *ptr);
49 typedef void (*PropFloatSetFunc)(struct PointerRNA *ptr, float value);
50 typedef float (*PropFloatArrayGetFunc)(struct PointerRNA *ptr, int index);
51 typedef void (*PropFloatArraySetFunc)(struct PointerRNA *ptr, int index, float value);
52 typedef void (*PropStringGetFunc)(struct PointerRNA *ptr, char *value);
53 typedef int (*PropStringLengthFunc)(struct PointerRNA *ptr);
54 typedef void (*PropStringSetFunc)(struct PointerRNA *ptr, const char *value);
55 typedef int (*PropEnumGetFunc)(struct PointerRNA *ptr);
56 typedef void (*PropEnumSetFunc)(struct PointerRNA *ptr, int value);
57 typedef void* (*PropPointerGetFunc)(struct PointerRNA *ptr);
58 typedef void (*PropPointerSetFunc)(struct PointerRNA *ptr, void *value);
59 typedef struct StructRNA* (*PropPointerTypeFunc)(struct PointerRNA *ptr);
60 typedef void (*PropCollectionBeginFunc)(struct CollectionPropertyIterator *iter, struct PointerRNA *ptr);
61 typedef void (*PropCollectionNextFunc)(struct CollectionPropertyIterator *iter);
62 typedef void (*PropCollectionEndFunc)(struct CollectionPropertyIterator *iter);
63 typedef void* (*PropCollectionGetFunc)(struct CollectionPropertyIterator *iter);
64 typedef struct StructRNA* (*PropCollectionTypeFunc)(struct CollectionPropertyIterator *iter);
65 typedef int (*PropCollectionLengthFunc)(struct PointerRNA *ptr);
66 typedef void* (*PropCollectionLookupIntFunc)(struct PointerRNA *ptr, int key, struct StructRNA **type);
67 typedef void* (*PropCollectionLookupStringFunc)(struct PointerRNA *ptr, const char *key, struct StructRNA **type);
68
69 /* Pointer
70  *
71  * RNA pointers are not a single C pointer but include the type,
72  * and a pointer to the ID struct that owns the struct, since
73  * in some cases this information is needed to correctly get/set
74  * the properties and validate them. */
75
76 typedef struct PointerRNA {
77         struct {
78                 struct StructRNA *type;
79                 void *data;
80         } id;
81
82         struct StructRNA *type;
83         void *data;
84 } PointerRNA;
85
86 /* Property */
87
88 typedef enum PropertyType {
89         PROP_BOOLEAN = 0,
90         PROP_INT = 1,
91         PROP_FLOAT = 2,
92         PROP_STRING = 3,
93         PROP_ENUM = 4,
94         PROP_POINTER = 5,
95         PROP_COLLECTION = 6
96 } PropertyType;
97
98 typedef enum PropertySubType {
99         PROP_NONE = 0,
100         PROP_UNSIGNED = 1,
101         PROP_FILEPATH = 2,
102         PROP_COLOR = 3,
103         PROP_VECTOR = 4,
104         PROP_MATRIX = 5,
105         PROP_ROTATION = 6
106 } PropertySubType;
107
108 typedef enum PropertyFlag {
109         /* editable means the property is editable in the user
110          * interface, evaluated means that the property is set
111          * as part of an evaluation. these can change at runtime
112          * the property flag contains the default. editable is
113          * enabled by default except for collections. */
114         PROP_NOT_EDITABLE = 1,
115         PROP_EVALUATED = 2,
116
117         /* driveable means the property can be driven by some
118          * other input, be it animation curves, expressions, ..
119          * in other words making the property evaluated.
120          * enable by default except for pointers and collections. */
121         PROP_NOT_DRIVEABLE = 4,
122
123 #if 0
124         /* for pointers and collections, means that the struct
125          * depends on the data pointed to for evaluation, such
126          * that a change in the data pointed to will affect the
127          * evaluated result of this struct. */
128         PROP_EVALUATE_DEPENDENCY = 8,
129         PROP_INVERSE_EVALUATE_DEPENDENCY = 16,
130
131         /* for pointers and collections, means that the struct
132          * requires the data pointed to for rendering in the,
133          * be it the render engine or viewport */
134         PROP_RENDER_DEPENDENCY = 32,
135         PROP_INVERSE_RENDER_DEPENDENCY = 64,
136 #endif
137
138         /* internal flag */
139         PROP_BUILTIN = 128
140 } PropertyFlag;
141
142 typedef struct CollectionPropertyIterator {
143         PointerRNA parent;
144         void *internal;
145
146         int valid;
147         PointerRNA ptr;
148 } CollectionPropertyIterator;
149
150 typedef struct PropertyEnumItem {
151         int value;
152         const char *cname;
153         const char *name;
154 } PropertyEnumItem;
155
156 typedef struct PropertyRNA {
157         struct PropertyRNA *next, *prev;
158
159         /* C code name */
160         const char *cname;
161         /* various options */
162         int flag;
163
164         /* user readable name */
165         const char *name;
166         /* single line description, displayed in the tooltip for example */
167         const char *description;
168
169         /* property type as it appears to the outside */
170         PropertyType type;
171         /* subtype, 'interpretation' of the property */
172         PropertySubType subtype;
173         /* if an array this is > 0, specifying the length */
174         unsigned int arraylength;
175         
176         /* callback for notifys on change */
177         PropNotifyFunc notify;
178 } PropertyRNA;
179
180 /* Property Types */
181
182 typedef struct BooleanPropertyRNA {
183         PropertyRNA property;
184
185         PropBooleanGetFunc get;
186         PropBooleanSetFunc set;
187
188         PropBooleanArrayGetFunc getarray;
189         PropBooleanArraySetFunc setarray;
190
191         int defaultvalue;
192         const int *defaultarray;
193 } BooleanPropertyRNA;
194
195 typedef struct IntPropertyRNA {
196         PropertyRNA property;
197
198         PropIntGetFunc get;
199         PropIntSetFunc set;
200
201         PropIntArrayGetFunc getarray;
202         PropIntArraySetFunc setarray;
203
204         int softmin, softmax;
205         int hardmin, hardmax;
206         int step;
207
208         int defaultvalue;
209         const int *defaultarray;
210 } IntPropertyRNA;
211
212 typedef struct FloatPropertyRNA {
213         PropertyRNA property;
214
215         PropFloatGetFunc get;
216         PropFloatSetFunc set;
217
218         PropFloatArrayGetFunc getarray;
219         PropFloatArraySetFunc setarray;
220
221         float softmin, softmax;
222         float hardmin, hardmax;
223         float step, precision;
224
225         float defaultvalue;
226         const float *defaultarray;
227 } FloatPropertyRNA;
228
229 typedef struct StringPropertyRNA {
230         PropertyRNA property;
231
232         PropStringGetFunc get;
233         PropStringLengthFunc length;
234         PropStringSetFunc set;
235
236         int maxlength;  /* includes string terminator! */
237
238         const char *defaultvalue;
239 } StringPropertyRNA;
240
241 typedef struct EnumPropertyRNA {
242         PropertyRNA property;
243
244         PropEnumGetFunc get;
245         PropEnumSetFunc set;
246
247         const PropertyEnumItem *item;
248         int totitem;
249
250         int defaultvalue;
251 } EnumPropertyRNA;
252
253 typedef struct PointerPropertyRNA {
254         PropertyRNA property;
255
256         PropPointerGetFunc get;
257         PropPointerSetFunc set;
258         PropPointerTypeFunc type;       /* optional */
259
260         struct StructRNA *structtype;
261 } PointerPropertyRNA;
262
263 typedef struct CollectionPropertyRNA {
264         PropertyRNA property;
265
266         PropCollectionBeginFunc begin;
267         PropCollectionNextFunc next;
268         PropCollectionEndFunc end;                                              /* optional */
269         PropCollectionGetFunc get;
270         PropCollectionTypeFunc type;                                    /* optional */
271         PropCollectionLengthFunc length;                                /* optional */
272         PropCollectionLookupIntFunc lookupint;                  /* optional */
273         PropCollectionLookupStringFunc lookupstring;    /* optional */
274
275         struct StructRNA *structtype;
276 } CollectionPropertyRNA;
277
278 /* Struct */
279
280 typedef enum StructFlag {
281         /* indicates that this struct is an ID struct */
282         STRUCT_ID = 1
283 } StructFlag;
284
285 typedef struct StructRNA {
286         struct StructRNA *next, *prev;
287
288         /* C code name */
289         const char *cname;
290         /* various options */
291         int flag;
292
293         /* user readable name */
294         const char *name;
295
296         /* property that defines the name */
297         PropertyRNA *nameproperty;
298
299         /* property to iterate over properties */
300         PropertyRNA *iteratorproperty;
301
302         /* properties of this struct */
303         ListBase properties; 
304 } StructRNA;
305
306 /* Blender RNA
307  *
308  * Root RNA data structure that lists all struct types. */
309
310 typedef struct BlenderRNA {
311         ListBase structs;
312 } BlenderRNA;
313
314 #endif /* RNA_TYPES */
315