6f6a27abe7c911b2ad0a78cc8eb91d08d5c57ed1
[blender.git] / source / blender / makesrna / intern / rna_image.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): Brecht Van Lommel
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file blender/makesrna/intern/rna_image.c
24  *  \ingroup RNA
25  */
26
27
28 #include <stdlib.h>
29
30 #include "RNA_define.h"
31 #include "RNA_enum_types.h"
32
33 #include "rna_internal.h"
34
35 #include "DNA_image_types.h"
36 #include "DNA_scene_types.h"
37
38 #include "BKE_context.h"
39 #include "BKE_depsgraph.h"
40 #include "BKE_image.h"
41
42 #include "WM_types.h"
43
44 static EnumPropertyItem image_source_items[]= {
45         {IMA_SRC_FILE, "FILE", 0, "Single Image", "Single image file"},
46         {IMA_SRC_SEQUENCE, "SEQUENCE", 0, "Image Sequence", "Multiple image files, as a sequence"},
47         {IMA_SRC_MOVIE, "MOVIE", 0, "Movie File", "Movie file"},
48         {IMA_SRC_GENERATED, "GENERATED", 0, "Generated", "Generated image"},
49         {IMA_SRC_VIEWER, "VIEWER", 0, "Viewer", "Compositing node viewer"},
50         {0, NULL, 0, NULL, NULL}};
51
52 #ifdef RNA_RUNTIME
53
54 #include "IMB_imbuf_types.h"
55
56 static void rna_Image_animated_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
57 {
58         Image *ima= (Image*)ptr->data;
59         int  nr;
60
61         if(ima->flag & IMA_TWINANIM) {
62                 nr= ima->xrep*ima->yrep;
63                 if(ima->twsta>=nr) ima->twsta= 1;
64                 if(ima->twend>=nr) ima->twend= nr-1;
65                 if(ima->twsta>ima->twend) ima->twsta= 1;
66         }
67 }
68
69 static int rna_Image_dirty_get(PointerRNA *ptr)
70 {
71         Image *ima= (Image*)ptr->data;
72         ImBuf *ibuf;
73
74         for(ibuf=ima->ibufs.first; ibuf; ibuf=ibuf->next)
75                 if(ibuf->userflags & IB_BITMAPDIRTY)
76                         return 1;
77         
78         return 0;
79 }
80
81 static void rna_Image_source_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
82 {
83         Image *ima= ptr->id.data;
84         BKE_image_signal(ima, NULL, IMA_SIGNAL_SRC_CHANGE);
85         DAG_id_tag_update(&ima->id, 0);
86 }
87
88 static void rna_Image_fields_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
89 {
90         Image *ima= ptr->id.data;
91         ImBuf *ibuf;
92         void *lock;
93
94         ibuf= BKE_image_acquire_ibuf(ima, NULL, &lock);
95
96         if(ibuf) {
97                 short nr= 0;
98
99                 if(!(ima->flag & IMA_FIELDS) && (ibuf->flags & IB_fields)) nr= 1;
100                 if((ima->flag & IMA_FIELDS) && !(ibuf->flags & IB_fields)) nr= 1;
101
102                 if(nr)
103                         BKE_image_signal(ima, NULL, IMA_SIGNAL_FREE);
104         }
105
106         BKE_image_release_ibuf(ima, lock);
107 }
108
109 static void rna_Image_reload_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
110 {
111         Image *ima= ptr->id.data;
112         BKE_image_signal(ima, NULL, IMA_SIGNAL_RELOAD);
113         DAG_id_tag_update(&ima->id, 0);
114 }
115
116 static void rna_Image_generated_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
117 {
118         Image *ima= ptr->id.data;
119         BKE_image_signal(ima, NULL, IMA_SIGNAL_FREE);
120 }
121
122 static void rna_ImageUser_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
123 {
124         ImageUser *iuser= ptr->data;
125
126         BKE_image_user_calc_frame(iuser, scene->r.cfra, 0);
127 }
128
129
130 char *rna_ImageUser_path(PointerRNA *ptr)
131 {
132         if (ptr->id.data) {
133                 // ImageUser *iuser= ptr->data;
134                 
135                 switch(GS(((ID *)ptr->id.data)->name)) {
136                 case ID_TE:
137                         return BLI_strdup("image_user");
138                 }
139         }
140         
141         return BLI_strdup("");
142 }
143
144 static EnumPropertyItem *rna_Image_source_itemf(bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), int *free)
145 {
146         Image *ima= (Image*)ptr->data;
147         EnumPropertyItem *item= NULL;
148         int totitem= 0;
149         
150         if(ima->source == IMA_SRC_VIEWER) {
151                 RNA_enum_items_add_value(&item, &totitem, image_source_items, IMA_SRC_VIEWER);
152         }
153         else {
154                 RNA_enum_items_add_value(&item, &totitem, image_source_items, IMA_SRC_FILE);
155                 RNA_enum_items_add_value(&item, &totitem, image_source_items, IMA_SRC_SEQUENCE);
156                 RNA_enum_items_add_value(&item, &totitem, image_source_items, IMA_SRC_MOVIE);
157                 RNA_enum_items_add_value(&item, &totitem, image_source_items, IMA_SRC_GENERATED);
158         }
159
160         RNA_enum_item_end(&item, &totitem);
161         *free= 1;
162
163         return item;
164 }
165
166 static int rna_Image_file_format_get(PointerRNA *ptr)
167 {
168         Image *image= (Image*)ptr->data;
169         ImBuf *ibuf= BKE_image_get_ibuf(image, NULL);
170         return BKE_ftype_to_imtype(ibuf ? ibuf->ftype : 0);
171 }
172
173 static void rna_Image_file_format_set(PointerRNA *ptr, int value)
174 {
175         Image *image= (Image*)ptr->data;
176         if(BKE_imtype_is_movie(value) == 0) { /* should be able to throw an error here */
177                 ImBuf *ibuf;
178                 int ftype= BKE_imtype_to_ftype(value);
179
180                 /*
181                 ibuf= BKE_image_get_ibuf(image, NULL);
182                 if(ibuf)
183                         ibuf->ftype= ftype;
184                 */
185
186                 /* to be safe change all buffer file types */
187                 for(ibuf= image->ibufs.first; ibuf; ibuf= ibuf->next) {
188                         ibuf->ftype= ftype;
189                 }
190         }
191 }
192
193 static int rna_Image_has_data_get(PointerRNA *ptr)
194 {
195         Image *im= (Image*)ptr->data;
196
197         if (im->ibufs.first)
198                 return 1;
199
200         return 0;
201 }
202
203 static void rna_Image_size_get(PointerRNA *ptr,int *values)
204 {
205         Image *im= (Image*)ptr->data;
206         ImBuf *ibuf;
207         void *lock;
208
209         ibuf = BKE_image_acquire_ibuf(im, NULL , &lock);
210         if (ibuf) {
211                 values[0]= ibuf->x;
212                 values[1]= ibuf->y;
213         }
214         else {
215                 values[0]= 0;
216                 values[1]= 0;
217         }
218
219         BKE_image_release_ibuf(im, lock);
220 }
221
222 static void rna_Image_resolution_get(PointerRNA *ptr, float *values)
223 {
224         Image *im= (Image*)ptr->data;
225         ImBuf *ibuf;
226         void *lock;
227
228         ibuf = BKE_image_acquire_ibuf(im, NULL , &lock);
229         if (ibuf) {
230                 values[0]= ibuf->ppm[0];
231                 values[1]= ibuf->ppm[1];
232         }
233         else {
234                 values[0]= 0;
235                 values[1]= 0;
236         }
237
238         BKE_image_release_ibuf(im, lock);
239 }
240
241 static void rna_Image_resolution_set(PointerRNA *ptr, const float *values)
242 {
243         Image *im= (Image*)ptr->data;
244         ImBuf *ibuf;
245         void *lock;
246
247         ibuf = BKE_image_acquire_ibuf(im, NULL , &lock);
248         if (ibuf) {
249                 ibuf->ppm[0]= values[0];
250                 ibuf->ppm[1]= values[1];
251         }
252
253         BKE_image_release_ibuf(im, lock);
254 }
255
256 static int rna_Image_depth_get(PointerRNA *ptr)
257 {
258         Image *im= (Image*)ptr->data;
259         ImBuf *ibuf;
260         void *lock;
261         int planes;
262         
263         ibuf= BKE_image_acquire_ibuf(im, NULL, &lock);
264
265         if(!ibuf)
266                 planes= 0;
267         else if(ibuf->rect_float)
268                 planes= ibuf->planes * 4;
269         else
270                 planes= ibuf->planes;
271
272         BKE_image_release_ibuf(im, lock);
273
274         return planes;
275 }
276
277 static int rna_Image_pixels_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
278 {
279         Image *ima= ptr->id.data;
280         ImBuf *ibuf;
281         void *lock;
282
283         ibuf= BKE_image_acquire_ibuf(ima, NULL, &lock);
284
285         if(ibuf)
286                 length[0]= ibuf->x*ibuf->y*ibuf->channels;
287         else
288                 length[0]= 0;
289
290         BKE_image_release_ibuf(ima, lock);
291
292         return length[0];
293 }
294
295 static void rna_Image_pixels_get(PointerRNA *ptr, float *values)
296 {
297         Image *ima= ptr->id.data;
298         ImBuf *ibuf;
299         void *lock;
300         int i, size;
301
302         ibuf= BKE_image_acquire_ibuf(ima, NULL, &lock);
303
304         if(ibuf) {
305                 size= ibuf->x*ibuf->y*ibuf->channels;
306
307                 if(ibuf->rect_float) {
308                         memcpy(values, ibuf->rect_float, sizeof(float)*size);
309                 }
310                 else {
311                         for(i = 0; i < size; i++)
312                                 values[i] = ((unsigned char*)ibuf->rect)[i]*(1.0f/255.0f);
313                 }
314         }
315
316         BKE_image_release_ibuf(ima, lock);
317 }
318
319 static void rna_Image_pixels_set(PointerRNA *ptr, const float *values)
320 {
321         Image *ima= ptr->id.data;
322         ImBuf *ibuf;
323         void *lock;
324         int i, size;
325
326         ibuf= BKE_image_acquire_ibuf(ima, NULL, &lock);
327
328         if(ibuf) {
329                 size= ibuf->x*ibuf->y*ibuf->channels;
330
331                 if(ibuf->rect_float) {
332                         memcpy(ibuf->rect_float, values, sizeof(float)*size);
333                 }
334                 else {
335                         for(i = 0; i < size; i++)
336                                 ((unsigned char*)ibuf->rect)[i] = FTOCHAR(values[i]);
337                 }
338
339                 ibuf->userflags |= IB_BITMAPDIRTY;
340         }
341
342         BKE_image_release_ibuf(ima, lock);
343 }
344
345 #else
346
347 static void rna_def_imageuser(BlenderRNA *brna)
348 {
349         StructRNA *srna;
350         PropertyRNA *prop;
351
352         srna= RNA_def_struct(brna, "ImageUser", NULL);
353         RNA_def_struct_ui_text(srna, "Image User", "Parameters defining how an Image datablock is used by another datablock");
354         RNA_def_struct_path_func(srna, "rna_ImageUser_path");
355
356         prop= RNA_def_property(srna, "use_auto_refresh", PROP_BOOLEAN, PROP_NONE);
357         RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_ANIM_ALWAYS);
358         RNA_def_property_ui_text(prop, "Auto Refresh", "Always refresh image on frame changes");
359         RNA_def_property_update(prop, 0, "rna_ImageUser_update");
360
361         /* animation */
362         prop= RNA_def_property(srna, "use_cyclic", PROP_BOOLEAN, PROP_NONE);
363         RNA_def_property_boolean_sdna(prop, NULL, "cycl", 0);
364         RNA_def_property_ui_text(prop, "Cyclic", "Cycle the images in the movie");
365         RNA_def_property_update(prop, 0, "rna_ImageUser_update");
366
367         prop= RNA_def_property(srna, "frame_duration", PROP_INT, PROP_NONE);
368         RNA_def_property_int_sdna(prop, NULL, "frames");
369         RNA_def_property_range(prop, 0, MAXFRAMEF);
370         RNA_def_property_ui_text(prop, "Frames", "Number of images of a movie to use");
371         RNA_def_property_update(prop, 0, "rna_ImageUser_update");
372
373         prop= RNA_def_property(srna, "frame_offset", PROP_INT, PROP_NONE);
374         RNA_def_property_int_sdna(prop, NULL, "offset");
375         RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF);
376         RNA_def_property_ui_text(prop, "Offset", "Offset the number of the frame to use in the animation");
377         RNA_def_property_update(prop, 0, "rna_ImageUser_update");
378
379         prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME);
380         RNA_def_property_int_sdna(prop, NULL, "sfra");
381         RNA_def_property_range(prop, MINAFRAMEF, MAXFRAMEF);
382         RNA_def_property_ui_text(prop, "Start Frame", "Global starting frame of the movie/sequence, assuming first picture has a #1");
383         RNA_def_property_update(prop, 0, "rna_ImageUser_update");
384
385         prop= RNA_def_property(srna, "fields_per_frame", PROP_INT, PROP_NONE);
386         RNA_def_property_int_sdna(prop, NULL, "fie_ima");
387         RNA_def_property_range(prop, 1, 200);
388         RNA_def_property_ui_text(prop, "Fields per Frame", "Number of fields per rendered frame (2 fields is 1 image)");
389         RNA_def_property_update(prop, 0, "rna_ImageUser_update");
390
391         prop= RNA_def_property(srna, "multilayer_layer", PROP_INT, PROP_UNSIGNED);
392         RNA_def_property_int_sdna(prop, NULL, "layer");
393         RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* image_multi_cb */
394         RNA_def_property_ui_text(prop, "Layer", "Layer in multilayer image");
395
396         prop= RNA_def_property(srna, "multilayer_pass", PROP_INT, PROP_UNSIGNED);
397         RNA_def_property_int_sdna(prop, NULL, "pass");
398         RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* image_multi_cb */
399         RNA_def_property_ui_text(prop, "Pass", "Pass in multilayer image");
400 }
401
402 static void rna_def_image(BlenderRNA *brna)
403 {
404         StructRNA *srna;
405         PropertyRNA *prop;
406         static const EnumPropertyItem prop_type_items[]= {
407                 {IMA_TYPE_IMAGE, "IMAGE", 0, "Image", ""},
408                 {IMA_TYPE_MULTILAYER, "MULTILAYER", 0, "Multilayer", ""},
409                 {IMA_TYPE_UV_TEST, "UV_TEST", 0, "UV Test", ""},
410                 {IMA_TYPE_R_RESULT, "RENDER_RESULT", 0, "Render Result", ""},
411                 {IMA_TYPE_COMPOSITE, "COMPOSITING", 0, "Compositing", ""},
412                 {0, NULL, 0, NULL, NULL}};
413         static const EnumPropertyItem prop_generated_type_items[]= {
414                 {0, "BLANK", 0, "Blank", "Generate a blank image"},
415                 {1, "UV_GRID", 0, "UV Grid", "Generated grid to test UV mappings"},
416                 {2, "COLOR_GRID", 0, "Color Grid", "Generated improved UV grid to test UV mappings"},
417                 {0, NULL, 0, NULL, NULL}};
418         static const EnumPropertyItem prop_mapping_items[]= {
419                 {0, "UV", 0, "UV Coordinates", "Use UV coordinates for mapping the image"},
420                 {IMA_REFLECT, "REFLECTION", 0, "Reflection", "Use reflection mapping for mapping the image"},
421                 {0, NULL, 0, NULL, NULL}};
422         static const EnumPropertyItem prop_field_order_items[]= {
423                 {0, "EVEN", 0, "Upper First", "Upper field first"},
424                 {IMA_STD_FIELD, "ODD", 0, "Lower First", "Lower field first"},
425                 {0, NULL, 0, NULL, NULL}};
426
427         srna= RNA_def_struct(brna, "Image", "ID");
428         RNA_def_struct_ui_text(srna, "Image", "Image datablock referencing an external or packed image");
429         RNA_def_struct_ui_icon(srna, ICON_IMAGE_DATA);
430
431         prop= RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
432         RNA_def_property_string_sdna(prop, NULL, "name");
433         RNA_def_property_ui_text(prop, "File Name", "Image/Movie file name");
434         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_reload_update");
435
436         /* eek. this is horrible but needed so we can save to a new name without blanking the data :( */
437         prop= RNA_def_property(srna, "filepath_raw", PROP_STRING, PROP_FILEPATH);
438         RNA_def_property_string_sdna(prop, NULL, "name");
439         RNA_def_property_ui_text(prop, "File Name", "Image/Movie file name (without data refreshing)");
440
441         prop= RNA_def_property(srna, "file_format", PROP_ENUM, PROP_NONE);
442         RNA_def_property_enum_items(prop, image_type_items);
443         RNA_def_property_enum_funcs(prop, "rna_Image_file_format_get", "rna_Image_file_format_set", NULL);
444         RNA_def_property_ui_text(prop, "File Format", "Format used for re-saving this file");
445
446         prop= RNA_def_property(srna, "source", PROP_ENUM, PROP_NONE);
447         RNA_def_property_enum_items(prop, image_source_items);
448         RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Image_source_itemf");
449         RNA_def_property_ui_text(prop, "Source", "Where the image comes from");
450         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_source_update");
451
452         prop= RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
453         RNA_def_property_enum_items(prop, prop_type_items);
454         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
455         RNA_def_property_ui_text(prop, "Type", "How to generate the image");
456         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
457
458         prop= RNA_def_property(srna, "packed_file", PROP_POINTER, PROP_NONE);
459         RNA_def_property_pointer_sdna(prop, NULL, "packedfile");
460         RNA_def_property_ui_text(prop, "Packed File", "");
461         
462         prop= RNA_def_property(srna, "field_order", PROP_ENUM, PROP_NONE);
463         RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
464         RNA_def_property_enum_items(prop, prop_field_order_items);
465         RNA_def_property_ui_text(prop, "Field Order", "Order of video fields (select which lines are displayed first)");
466         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
467         
468         /* booleans */
469         prop= RNA_def_property(srna, "use_fields", PROP_BOOLEAN, PROP_NONE);
470         RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_FIELDS);
471         RNA_def_property_ui_text(prop, "Fields", "Use fields of the image");
472         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_fields_update");
473
474         prop= RNA_def_property(srna, "use_premultiply", PROP_BOOLEAN, PROP_NONE);
475         RNA_def_property_boolean_sdna(prop, NULL, "flag", IMA_DO_PREMUL);
476         RNA_def_property_ui_text(prop, "Premultiply", "Convert RGB from key alpha to premultiplied alpha");
477         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_reload_update");
478
479         prop= RNA_def_property(srna, "is_dirty", PROP_BOOLEAN, PROP_NONE);
480         RNA_def_property_boolean_funcs(prop, "rna_Image_dirty_get", NULL);
481         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
482         RNA_def_property_ui_text(prop, "Dirty", "Image has changed and is not saved");
483
484         /* generated image (image_generated_change_cb) */
485         prop= RNA_def_property(srna, "generated_type", PROP_ENUM, PROP_NONE);
486         RNA_def_property_enum_sdna(prop, NULL, "gen_type");
487         RNA_def_property_enum_items(prop, prop_generated_type_items);
488         RNA_def_property_ui_text(prop, "Generated Type", "Generated image type");
489         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_generated_update");
490
491         prop= RNA_def_property(srna, "generated_width", PROP_INT, PROP_NONE);
492         RNA_def_property_int_sdna(prop, NULL, "gen_x");
493         RNA_def_property_range(prop, 1, 16384);
494         RNA_def_property_ui_text(prop, "Generated Width", "Generated image width");
495         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_generated_update");
496
497         prop= RNA_def_property(srna, "generated_height", PROP_INT, PROP_NONE);
498         RNA_def_property_int_sdna(prop, NULL, "gen_y");
499         RNA_def_property_range(prop, 1, 16384);
500         RNA_def_property_ui_text(prop, "Generated Height", "Generated image height");
501         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_generated_update");
502
503         prop= RNA_def_property(srna, "use_generated_float", PROP_BOOLEAN, PROP_NONE);
504         RNA_def_property_boolean_sdna(prop, NULL, "gen_flag", IMA_GEN_FLOAT);
505         RNA_def_property_ui_text(prop, "Float Buffer", "Generate floating point buffer");
506         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_generated_update");
507
508         /* realtime properties */
509         prop= RNA_def_property(srna, "mapping", PROP_ENUM, PROP_NONE);
510         RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
511         RNA_def_property_enum_items(prop, prop_mapping_items);
512         RNA_def_property_ui_text(prop, "Mapping", "Mapping type to use for this image in the game engine");
513         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
514
515         prop= RNA_def_property(srna, "display_aspect", PROP_FLOAT, PROP_XYZ);
516         RNA_def_property_float_sdna(prop, NULL, "aspx");
517         RNA_def_property_array(prop, 2);
518         RNA_def_property_range(prop, 0.1f, 5000.0f);
519         RNA_def_property_ui_text(prop, "Display Aspect", "Display Aspect for this image, does not affect rendering");
520         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
521
522         prop= RNA_def_property(srna, "use_animation", PROP_BOOLEAN, PROP_NONE);
523         RNA_def_property_boolean_sdna(prop, NULL, "tpageflag", IMA_TWINANIM);
524         RNA_def_property_ui_text(prop, "Animated", "Use as animated texture in the game engine");
525         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_animated_update");
526
527         prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE);
528         RNA_def_property_int_sdna(prop, NULL, "twsta");
529         RNA_def_property_range(prop, 0, 128);
530         RNA_def_property_ui_text(prop, "Animation Start", "Start frame of an animated texture");
531         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_animated_update");
532
533         prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_NONE);
534         RNA_def_property_int_sdna(prop, NULL, "twend");
535         RNA_def_property_range(prop, 0, 128);
536         RNA_def_property_ui_text(prop, "Animation End", "End frame of an animated texture");
537         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, "rna_Image_animated_update");
538
539         prop= RNA_def_property(srna, "fps", PROP_INT, PROP_NONE);
540         RNA_def_property_int_sdna(prop, NULL, "animspeed");
541         RNA_def_property_range(prop, 1, 100);
542         RNA_def_property_ui_text(prop, "Animation Speed", "Speed of the animation in frames per second");
543         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
544
545         prop= RNA_def_property(srna, "use_tiles", PROP_BOOLEAN, PROP_NONE);
546         RNA_def_property_boolean_sdna(prop, NULL, "tpageflag", IMA_TILES);
547         RNA_def_property_ui_text(prop, "Tiles", "Use of tilemode for faces (default shift-LMB to pick the tile for selected faces)");
548         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
549
550         prop= RNA_def_property(srna, "tiles_x", PROP_INT, PROP_NONE);
551         RNA_def_property_int_sdna(prop, NULL, "xrep");
552         RNA_def_property_range(prop, 1, 16);
553         RNA_def_property_ui_text(prop, "Tiles X", "Degree of repetition in the X direction");
554         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
555
556         prop= RNA_def_property(srna, "tiles_y", PROP_INT, PROP_NONE);
557         RNA_def_property_int_sdna(prop, NULL, "yrep");
558         RNA_def_property_range(prop, 1, 16);
559         RNA_def_property_ui_text(prop, "Tiles Y", "Degree of repetition in the Y direction");
560         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
561
562         prop= RNA_def_property(srna, "use_clamp_x", PROP_BOOLEAN, PROP_NONE);
563         RNA_def_property_boolean_sdna(prop, NULL, "tpageflag", IMA_CLAMP_U);
564         RNA_def_property_ui_text(prop, "Clamp X", "Disable texture repeating horizontally");
565         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
566
567         prop= RNA_def_property(srna, "use_clamp_y", PROP_BOOLEAN, PROP_NONE);
568         RNA_def_property_boolean_sdna(prop, NULL, "tpageflag", IMA_CLAMP_V);
569         RNA_def_property_ui_text(prop, "Clamp Y", "Disable texture repeating vertically");
570         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
571
572         prop= RNA_def_property(srna, "bindcode", PROP_INT, PROP_UNSIGNED);
573         RNA_def_property_int_sdna(prop, NULL, "bindcode");
574         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
575         RNA_def_property_ui_text(prop, "Bindcode", "OpenGL bindcode");
576         RNA_def_property_update(prop, NC_IMAGE|ND_DISPLAY, NULL);
577
578         /*
579            Image.has_data and Image.depth are temporary,
580            Update import_obj.py when they are replaced (Arystan)
581         */
582         prop= RNA_def_property(srna, "has_data", PROP_BOOLEAN, PROP_NONE);
583         RNA_def_property_boolean_funcs(prop, "rna_Image_has_data_get", NULL);
584         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
585         RNA_def_property_ui_text(prop, "Has data", "True if this image has data");
586
587         prop= RNA_def_property(srna, "depth", PROP_INT, PROP_UNSIGNED);
588         RNA_def_property_int_funcs(prop, "rna_Image_depth_get", NULL, NULL);
589         RNA_def_property_ui_text(prop, "Depth", "Image bit depth");
590         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
591
592         prop= RNA_def_int_vector(srna, "size" , 2 , NULL , 0, 0, "Size" , "Width and height in pixels, zero when image data cant be loaded" , 0 , 0);
593         RNA_def_property_int_funcs(prop, "rna_Image_size_get" , NULL, NULL);
594         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
595
596         prop= RNA_def_float_vector(srna, "resolution" , 2 , NULL , 0, 0, "Resolution" , "X/Y pixels per meter" , 0 , 0);
597         RNA_def_property_float_funcs(prop, "rna_Image_resolution_get" , "rna_Image_resolution_set", NULL);
598
599         prop= RNA_def_property(srna, "pixels", PROP_FLOAT, PROP_NONE);
600         RNA_def_property_flag(prop, PROP_DYNAMIC);
601         RNA_def_property_multi_array(prop, 1, NULL);
602         RNA_def_property_ui_text(prop, "Pixels", "Image pixels in floating point values");
603         RNA_def_property_dynamic_array_funcs(prop, "rna_Image_pixels_get_length");
604         RNA_def_property_float_funcs(prop, "rna_Image_pixels_get", "rna_Image_pixels_set", NULL);
605
606         RNA_api_image(srna);
607 }
608
609 void RNA_def_image(BlenderRNA *brna)
610 {
611         rna_def_image(brna);
612         rna_def_imageuser(brna);
613 }
614
615 #endif
616