Blender V4.3
rna_image.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include <cstdlib>
10
11#include "DNA_image_types.h"
12#include "DNA_node_types.h"
13#include "DNA_scene_types.h"
14
15#include "BLI_utildefines.h"
16
17#include "BKE_image.hh"
18#include "BKE_image_format.hh"
20
21#include "BLT_translation.hh"
22#include "DEG_depsgraph.hh"
24
25#include "RNA_access.hh"
26#include "RNA_define.hh"
27#include "RNA_enum_types.hh"
28
29#include "rna_internal.hh"
30
31#include "WM_api.hh"
32#include "WM_types.hh"
33
35 {IMA_GENTYPE_BLANK, "BLANK", 0, "Blank", "Generate a blank image"},
36 {IMA_GENTYPE_GRID, "UV_GRID", 0, "UV Grid", "Generated grid to test UV mappings"},
38 "COLOR_GRID",
39 0,
40 "Color Grid",
41 "Generated improved UV grid to test UV mappings"},
42 {0, nullptr, 0, nullptr, nullptr},
43};
44
46 {IMA_SRC_FILE, "FILE", 0, "Single Image", "Single image file"},
47 {IMA_SRC_SEQUENCE, "SEQUENCE", 0, "Image Sequence", "Multiple image files, as a sequence"},
48 {IMA_SRC_MOVIE, "MOVIE", 0, "Movie", "Movie file"},
49 {IMA_SRC_GENERATED, "GENERATED", 0, "Generated", "Generated image"},
50 {IMA_SRC_VIEWER, "VIEWER", 0, "Viewer", "Compositing node viewer"},
51 {IMA_SRC_TILED, "TILED", 0, "UDIM Tiles", "Tiled UDIM image texture"},
52 {0, nullptr, 0, nullptr, nullptr},
53};
54
55#ifdef RNA_RUNTIME
56
57# include <algorithm>
58# include <fmt/format.h>
59
60# include "BLI_math_base.h"
61# include "BLI_math_vector.h"
62
63# include "BKE_global.hh"
64# include "BKE_screen.hh"
65
66# include "GPU_texture.hh"
67
68# include "IMB_imbuf.hh"
69# include "IMB_imbuf_types.hh"
70
71# include "ED_node.hh"
72
73# include "DNA_space_types.h"
74
75static bool rna_Image_is_stereo_3d_get(PointerRNA *ptr)
76{
78}
79
80static bool rna_Image_is_multiview_get(PointerRNA *ptr)
81{
83}
84
85static bool rna_Image_dirty_get(PointerRNA *ptr)
86{
87 return BKE_image_is_dirty((Image *)ptr->data);
88}
89
90static void rna_Image_source_set(PointerRNA *ptr, int value)
91{
92 Image *ima = (Image *)ptr->owner_id;
93
94 if (value != ima->source) {
95 ima->source = value;
98 if (ima->source == IMA_SRC_TILED) {
100 }
101
102 DEG_id_tag_update(&ima->id, 0);
105 }
106}
107
108static void rna_Image_reload_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr)
109{
110 Image *ima = (Image *)ptr->owner_id;
111 BKE_image_signal(bmain, ima, nullptr, IMA_SIGNAL_RELOAD);
113 DEG_id_tag_update(&ima->id, 0);
115}
116
117static int rna_Image_generated_type_get(PointerRNA *ptr)
118{
119 Image *ima = (Image *)ptr->data;
120 ImageTile *base_tile = BKE_image_get_tile(ima, 0);
121 return base_tile->gen_type;
122}
123
124static void rna_Image_generated_type_set(PointerRNA *ptr, int value)
125{
126 Image *ima = (Image *)ptr->data;
127 ImageTile *base_tile = BKE_image_get_tile(ima, 0);
128 base_tile->gen_type = value;
129}
130
131static int rna_Image_generated_width_get(PointerRNA *ptr)
132{
133 Image *ima = (Image *)ptr->data;
134 ImageTile *base_tile = BKE_image_get_tile(ima, 0);
135 return base_tile->gen_x;
136}
137
138static void rna_Image_generated_width_set(PointerRNA *ptr, int value)
139{
140 Image *ima = (Image *)ptr->data;
141 ImageTile *base_tile = BKE_image_get_tile(ima, 0);
142 base_tile->gen_x = std::clamp(value, 1, 65536);
143}
144
145static int rna_Image_generated_height_get(PointerRNA *ptr)
146{
147 Image *ima = (Image *)ptr->data;
148 ImageTile *base_tile = BKE_image_get_tile(ima, 0);
149 return base_tile->gen_y;
150}
151
152static void rna_Image_generated_height_set(PointerRNA *ptr, int value)
153{
154 Image *ima = (Image *)ptr->data;
155 ImageTile *base_tile = BKE_image_get_tile(ima, 0);
156 base_tile->gen_y = std::clamp(value, 1, 65536);
157}
158
159static bool rna_Image_generated_float_get(PointerRNA *ptr)
160{
161 Image *ima = (Image *)ptr->data;
162 ImageTile *base_tile = BKE_image_get_tile(ima, 0);
163 return (base_tile->gen_flag & IMA_GEN_FLOAT) != 0;
164}
165
166static void rna_Image_generated_float_set(PointerRNA *ptr, bool value)
167{
168 Image *ima = (Image *)ptr->data;
169 ImageTile *base_tile = BKE_image_get_tile(ima, 0);
170 if (value) {
171 base_tile->gen_flag |= IMA_GEN_FLOAT;
172 }
173 else {
174 base_tile->gen_flag &= ~IMA_GEN_FLOAT;
175 }
176}
177
178void rna_Image_generated_color_get(PointerRNA *ptr, float values[4])
179{
180 Image *ima = (Image *)(ptr->data);
181 ImageTile *base_tile = BKE_image_get_tile(ima, 0);
182 copy_v4_v4(values, base_tile->gen_color);
183}
184
185void rna_Image_generated_color_set(PointerRNA *ptr, const float values[4])
186{
187 Image *ima = (Image *)(ptr->data);
188 ImageTile *base_tile = BKE_image_get_tile(ima, 0);
189 for (uint i = 0; i < 4; i++) {
190 base_tile->gen_color[i] = std::clamp(values[i], 0.0f, FLT_MAX);
191 }
192}
193
194static void rna_Image_generated_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr)
195{
196 Image *ima = (Image *)ptr->owner_id;
197 BKE_image_signal(bmain, ima, nullptr, IMA_SIGNAL_FREE);
200}
201
202static void rna_Image_colormanage_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr)
203{
204 Image *ima = (Image *)ptr->owner_id;
205 BKE_image_signal(bmain, ima, nullptr, IMA_SIGNAL_COLORMANAGE);
206 DEG_id_tag_update(&ima->id, 0);
210}
211
212static void rna_Image_alpha_mode_update(Main *bmain, Scene *scene, PointerRNA *ptr)
213{
214 Image *ima = (Image *)ptr->owner_id;
215 /* When operating on a generated image, avoid re-generating when changing the alpha-mode
216 * as it doesn't impact generated images, causing them to reload pixel data, see #82785. */
217 if (ima->source == IMA_SRC_GENERATED) {
218 return;
219 }
220 rna_Image_colormanage_update(bmain, scene, ptr);
221}
222
223static void rna_Image_views_format_update(Main *bmain, Scene *scene, PointerRNA *ptr)
224{
225 Image *ima = (Image *)ptr->owner_id;
226 ImBuf *ibuf;
227 void *lock;
228
229 ibuf = BKE_image_acquire_ibuf(ima, nullptr, &lock);
230
231 if (ibuf) {
232 ImageUser iuser = {nullptr};
233 iuser.scene = scene;
234 BKE_image_signal(bmain, ima, &iuser, IMA_SIGNAL_FREE);
235 }
236
237 BKE_image_release_ibuf(ima, ibuf, lock);
240}
241
242static void rna_ImageUser_update(Main *bmain, Scene *scene, PointerRNA *ptr)
243{
244 ImageUser *iuser = static_cast<ImageUser *>(ptr->data);
245 ID *id = ptr->owner_id;
246
247 if (scene != nullptr) {
248 BKE_image_user_frame_calc(nullptr, iuser, scene->r.cfra);
249 }
250
251 if (id) {
252 if (GS(id->name) == ID_NT) {
253 /* Special update for node-trees. */
255 ED_node_tree_propagate_change(nullptr, bmain, nullptr);
256 }
257 else {
258 /* Update material or texture for render preview. */
259 DEG_id_tag_update(id, 0);
261 }
262 }
263}
264
265static void rna_ImageUser_relations_update(Main *bmain, Scene *scene, PointerRNA *ptr)
266{
267 rna_ImageUser_update(bmain, scene, ptr);
269}
270
271static std::optional<std::string> rna_ImageUser_path(const PointerRNA *ptr)
272{
273 if (ptr->owner_id) {
274 switch (GS(ptr->owner_id->name)) {
275 case ID_OB:
276 case ID_TE:
277 return "image_user";
278 case ID_NT:
280 case ID_CA:
282 case ID_SCR: {
283 const bScreen *screen = reinterpret_cast<bScreen *>(ptr->owner_id);
284 const ImageUser *iuser = static_cast<ImageUser *>(ptr->data);
285 int area_index;
286 int space_index;
287 LISTBASE_FOREACH_INDEX (ScrArea *, area, &screen->areabase, area_index) {
288 LISTBASE_FOREACH_INDEX (SpaceLink *, sl, &area->spacedata, space_index) {
289 if (sl->spacetype == SPACE_IMAGE) {
290 SpaceImage *sima = reinterpret_cast<SpaceImage *>(sl);
291 if (&sima->iuser == iuser) {
292 return fmt::format("areas[{}].spaces[{}].image_user", area_index, space_index);
293 }
294 }
295 }
296 }
297 return " ... image_user";
298 }
299 default:
300 break;
301 }
302 }
303
304 return "";
305}
306
307static void rna_Image_gpu_texture_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
308{
309 Image *ima = (Image *)ptr->owner_id;
310
311 if (!G.background) {
313 }
314
316}
317
318static const EnumPropertyItem *rna_Image_source_itemf(bContext * /*C*/,
320 PropertyRNA * /*prop*/,
321 bool *r_free)
322{
323 Image *ima = (Image *)ptr->data;
324 EnumPropertyItem *item = nullptr;
325 int totitem = 0;
326
327 if (ima->source == IMA_SRC_VIEWER) {
329 }
330 else {
336 }
337
338 RNA_enum_item_end(&item, &totitem);
339 *r_free = true;
340
341 return item;
342}
343
344static int rna_Image_file_format_get(PointerRNA *ptr)
345{
346 Image *image = (Image *)ptr->data;
347 ImBuf *ibuf = BKE_image_acquire_ibuf(image, nullptr, nullptr);
348 int imtype = BKE_ftype_to_imtype(ibuf ? ibuf->ftype : IMB_FTYPE_NONE,
349 ibuf ? &ibuf->foptions : nullptr);
350
351 BKE_image_release_ibuf(image, ibuf, nullptr);
352
353 return imtype;
354}
355
356static void rna_Image_file_format_set(PointerRNA *ptr, int value)
357{
358 Image *image = (Image *)ptr->data;
359 if (BKE_imtype_is_movie(value) == 0) { /* should be able to throw an error here */
361 int ftype = BKE_imtype_to_ftype(value, &options);
362 BKE_image_file_format_set(image, ftype, &options);
363 }
364}
365
366static void rna_UDIMTile_size_get(PointerRNA *ptr, int *values)
367{
369 Image *image = (Image *)ptr->owner_id;
370
371 ImageUser image_user;
372 BKE_imageuser_default(&image_user);
373 image_user.tile = tile->tile_number;
374
375 void *lock;
376 ImBuf *ibuf = BKE_image_acquire_ibuf(image, &image_user, &lock);
377 if (ibuf) {
378 values[0] = ibuf->x;
379 values[1] = ibuf->y;
380 }
381 else {
382 values[0] = 0;
383 values[1] = 0;
384 }
385
386 BKE_image_release_ibuf(image, ibuf, lock);
387}
388
389static int rna_UDIMTile_channels_get(PointerRNA *ptr)
390{
392 Image *image = (Image *)ptr->owner_id;
393
394 ImageUser image_user;
395 BKE_imageuser_default(&image_user);
396 image_user.tile = tile->tile_number;
397
398 int channels = 0;
399
400 void *lock;
401 ImBuf *ibuf = BKE_image_acquire_ibuf(image, &image_user, &lock);
402 if (ibuf) {
403 channels = ibuf->channels;
404 }
405
406 BKE_image_release_ibuf(image, ibuf, lock);
407
408 return channels;
409}
410
411static void rna_UDIMTile_label_get(PointerRNA *ptr, char *value)
412{
413 const ImageTile *tile = (ImageTile *)ptr->data;
414 const Image *image = (Image *)ptr->owner_id;
415
416 /* Pass in a fixed size buffer as the value may be allocated based on the callbacks length. */
417 char value_buf[sizeof(tile->label)];
418 int len = BKE_image_get_tile_label(image, tile, value_buf, sizeof(tile->label));
419 memcpy(value, value_buf, len + 1);
420}
421
422static int rna_UDIMTile_label_length(PointerRNA *ptr)
423{
424 const ImageTile *tile = (ImageTile *)ptr->data;
425 const Image *image = (Image *)ptr->owner_id;
426
427 char label[sizeof(tile->label)];
428 return BKE_image_get_tile_label(image, tile, label, sizeof(label));
429}
430
431static void rna_UDIMTile_tile_number_set(PointerRNA *ptr, int value)
432{
434 Image *image = (Image *)ptr->owner_id;
435
436 /* Check that no other tile already has that number. */
437 ImageTile *cur_tile = BKE_image_get_tile(image, value);
438 if (cur_tile == nullptr) {
439 BKE_image_reassign_tile(image, tile, value);
440 }
441}
442
443static void rna_UDIMTile_generated_update(Main * /*bmain*/, Scene * /*scene*/, PointerRNA *ptr)
444{
445 Image *ima = (Image *)ptr->owner_id;
447
448 /* If the tile is still marked as generated, then update the tile as requested. */
449 if ((tile->gen_flag & IMA_GEN_TILE) != 0) {
452 }
453}
454
455static int rna_Image_active_tile_index_get(PointerRNA *ptr)
456{
457 Image *image = (Image *)ptr->data;
458 return image->active_tile_index;
459}
460
461static void rna_Image_active_tile_index_set(PointerRNA *ptr, int value)
462{
463 Image *image = (Image *)ptr->data;
464 int num_tiles = BLI_listbase_count(&image->tiles);
465
466 image->active_tile_index = min_ii(value, num_tiles - 1);
467}
468
469static void rna_Image_active_tile_index_range(
470 PointerRNA *ptr, int *min, int *max, int * /*softmin*/, int * /*softmax*/)
471{
472 Image *image = (Image *)ptr->data;
473 int num_tiles = BLI_listbase_count(&image->tiles);
474
475 *min = 0;
476 *max = max_ii(0, num_tiles - 1);
477}
478
479static PointerRNA rna_Image_active_tile_get(PointerRNA *ptr)
480{
481 Image *image = (Image *)ptr->data;
482 ImageTile *tile = static_cast<ImageTile *>(
483 BLI_findlink(&image->tiles, image->active_tile_index));
484
485 return rna_pointer_inherit_refine(ptr, &RNA_UDIMTile, tile);
486}
487
488static void rna_Image_active_tile_set(PointerRNA *ptr, PointerRNA value, ReportList * /*reports*/)
489{
490 Image *image = (Image *)ptr->data;
491 ImageTile *tile = (ImageTile *)value.data;
492 const int index = BLI_findindex(&image->tiles, tile);
493 if (index != -1) {
494 image->active_tile_index = index;
495 }
496}
497
498static bool rna_Image_has_data_get(PointerRNA *ptr)
499{
500 Image *image = (Image *)ptr->data;
501
502 return BKE_image_has_loaded_ibuf(image);
503}
504
505static void rna_Image_size_get(PointerRNA *ptr, int *values)
506{
507 Image *im = (Image *)ptr->data;
508 ImBuf *ibuf;
509 void *lock;
510
511 ibuf = BKE_image_acquire_ibuf(im, nullptr, &lock);
512 if (ibuf) {
513 values[0] = ibuf->x;
514 values[1] = ibuf->y;
515 }
516 else {
517 values[0] = 0;
518 values[1] = 0;
519 }
520
521 BKE_image_release_ibuf(im, ibuf, lock);
522}
523
524static void rna_Image_resolution_get(PointerRNA *ptr, float *values)
525{
526 Image *im = (Image *)ptr->data;
527 ImBuf *ibuf;
528 void *lock;
529
530 ibuf = BKE_image_acquire_ibuf(im, nullptr, &lock);
531 if (ibuf) {
532 values[0] = ibuf->ppm[0];
533 values[1] = ibuf->ppm[1];
534 }
535 else {
536 values[0] = 0;
537 values[1] = 0;
538 }
539
540 BKE_image_release_ibuf(im, ibuf, lock);
541}
542
543static void rna_Image_resolution_set(PointerRNA *ptr, const float *values)
544{
545 Image *im = (Image *)ptr->data;
546 ImBuf *ibuf;
547 void *lock;
548
549 ibuf = BKE_image_acquire_ibuf(im, nullptr, &lock);
550 if (ibuf) {
551 ibuf->ppm[0] = values[0];
552 ibuf->ppm[1] = values[1];
553 }
554
555 BKE_image_release_ibuf(im, ibuf, lock);
556}
557
558static int rna_Image_bindcode_get(PointerRNA *ptr)
559{
560 Image *ima = (Image *)ptr->data;
561 GPUTexture *tex = ima->gputexture[TEXTARGET_2D][0];
562 return (tex) ? GPU_texture_opengl_bindcode(tex) : 0;
563}
564
565static int rna_Image_depth_get(PointerRNA *ptr)
566{
567 Image *im = (Image *)ptr->data;
568 ImBuf *ibuf;
569 void *lock;
570 int planes;
571
572 ibuf = BKE_image_acquire_ibuf(im, nullptr, &lock);
573
574 if (!ibuf) {
575 planes = 0;
576 }
577 else if (ibuf->float_buffer.data) {
578 planes = ibuf->planes * 4;
579 }
580 else {
581 planes = ibuf->planes;
582 }
583
584 BKE_image_release_ibuf(im, ibuf, lock);
585
586 return planes;
587}
588
589static int rna_Image_frame_duration_get(PointerRNA *ptr)
590{
591 Image *ima = (Image *)ptr->owner_id;
592 int duration = 1;
593
594 if (!BKE_image_has_anim(ima)) {
595 /* Ensure image has been loaded into memory and frame duration is known. */
596 void *lock;
597 ImBuf *ibuf = BKE_image_acquire_ibuf(ima, nullptr, &lock);
598 BKE_image_release_ibuf(ima, ibuf, lock);
599 }
600
601 if (BKE_image_has_anim(ima)) {
602 ImBufAnim *anim = ((ImageAnim *)ima->anims.first)->anim;
603 if (anim) {
605 }
606 }
607
608 return duration;
609}
610
611static int rna_Image_pixels_get_length(const PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
612{
613 Image *ima = (Image *)ptr->owner_id;
614 ImBuf *ibuf;
615 void *lock;
616
617 ibuf = BKE_image_acquire_ibuf(ima, nullptr, &lock);
618
619 if (ibuf) {
620 length[0] = ibuf->x * ibuf->y * ibuf->channels;
621 }
622 else {
623 length[0] = 0;
624 }
625
626 BKE_image_release_ibuf(ima, ibuf, lock);
627
628 return length[0];
629}
630
631static void rna_Image_pixels_get(PointerRNA *ptr, float *values)
632{
633 Image *ima = (Image *)ptr->owner_id;
634 ImBuf *ibuf;
635 void *lock;
636 int i, size;
637
638 ibuf = BKE_image_acquire_ibuf(ima, nullptr, &lock);
639
640 if (ibuf) {
641 size = ibuf->x * ibuf->y * ibuf->channels;
642
643 if (ibuf->float_buffer.data) {
644 memcpy(values, ibuf->float_buffer.data, sizeof(float) * size);
645 }
646 else {
647 for (i = 0; i < size; i++) {
648 values[i] = ibuf->byte_buffer.data[i] * (1.0f / 255.0f);
649 }
650 }
651 }
652
653 BKE_image_release_ibuf(ima, ibuf, lock);
654}
655
656static void rna_Image_pixels_set(PointerRNA *ptr, const float *values)
657{
658 Image *ima = (Image *)ptr->owner_id;
659 ImBuf *ibuf;
660 void *lock;
661 int i, size;
662
663 ibuf = BKE_image_acquire_ibuf(ima, nullptr, &lock);
664
665 if (ibuf) {
666 size = ibuf->x * ibuf->y * ibuf->channels;
667
668 if (ibuf->float_buffer.data) {
669 memcpy(ibuf->float_buffer.data, values, sizeof(float) * size);
670 }
671 else {
672 for (i = 0; i < size; i++) {
673 ibuf->byte_buffer.data[i] = unit_float_to_uchar_clamp(values[i]);
674 }
675 }
676
677 /* NOTE: Do update from the set() because typically pixels.foreach_set() is used to update
678 * the values, and it does not invoke the update(). */
679
681 BKE_image_mark_dirty(ima, ibuf);
682 if (!G.background) {
684 }
685
688 }
689
690 BKE_image_release_ibuf(ima, ibuf, lock);
691}
692
693static int rna_Image_channels_get(PointerRNA *ptr)
694{
695 Image *im = (Image *)ptr->data;
696 ImBuf *ibuf;
697 void *lock;
698 int channels = 0;
699
700 ibuf = BKE_image_acquire_ibuf(im, nullptr, &lock);
701 if (ibuf) {
702 channels = ibuf->channels;
703 }
704
705 BKE_image_release_ibuf(im, ibuf, lock);
706
707 return channels;
708}
709
710static bool rna_Image_is_float_get(PointerRNA *ptr)
711{
712 Image *im = (Image *)ptr->data;
713 ImBuf *ibuf;
714 void *lock;
715 bool is_float = false;
716
717 ibuf = BKE_image_acquire_ibuf(im, nullptr, &lock);
718 if (ibuf) {
719 is_float = ibuf->float_buffer.data != nullptr;
720 }
721
722 BKE_image_release_ibuf(im, ibuf, lock);
723
724 return is_float;
725}
726
727static PointerRNA rna_Image_packed_file_get(PointerRNA *ptr)
728{
729 Image *ima = (Image *)ptr->owner_id;
730
731 if (BKE_image_has_packedfile(ima)) {
732 ImagePackedFile *imapf = static_cast<ImagePackedFile *>(ima->packedfiles.first);
733 return rna_pointer_inherit_refine(ptr, &RNA_PackedFile, imapf->packedfile);
734 }
735 else {
736 return PointerRNA_NULL;
737 }
738}
739
740static void rna_RenderSlot_clear(ID *id, RenderSlot *slot, ImageUser *iuser)
741{
742 Image *image = (Image *)id;
743 int index = BLI_findindex(&image->renderslots, slot);
744 BKE_image_clear_renderslot(image, iuser, index);
745
747}
748
749static PointerRNA rna_render_slots_active_get(PointerRNA *ptr)
750{
751 Image *image = (Image *)ptr->owner_id;
752 RenderSlot *render_slot = BKE_image_get_renderslot(image, image->render_slot);
753
754 return rna_pointer_inherit_refine(ptr, &RNA_RenderSlot, render_slot);
755}
756
757static void rna_render_slots_active_set(PointerRNA *ptr,
758 PointerRNA value,
759 ReportList * /*reports*/)
760{
761 Image *image = (Image *)ptr->owner_id;
762 if (value.owner_id == &image->id) {
763 RenderSlot *slot = (RenderSlot *)value.data;
764 int index = BLI_findindex(&image->renderslots, slot);
765 if (index != -1) {
766 image->render_slot = index;
768 }
769 }
770}
771
772static int rna_render_slots_active_index_get(PointerRNA *ptr)
773{
774 Image *image = (Image *)ptr->owner_id;
775 return image->render_slot;
776}
777
778static void rna_render_slots_active_index_set(PointerRNA *ptr, int value)
779{
780 Image *image = (Image *)ptr->owner_id;
781 int num_slots = BLI_listbase_count(&image->renderslots);
782 image->render_slot = value;
784 CLAMP(image->render_slot, 0, num_slots - 1);
785}
786
787static void rna_render_slots_active_index_range(
788 PointerRNA *ptr, int *min, int *max, int * /*softmin*/, int * /*softmax*/)
789{
790 Image *image = (Image *)ptr->owner_id;
791 *min = 0;
792 *max = max_ii(0, BLI_listbase_count(&image->renderslots) - 1);
793}
794
795static ImageTile *rna_UDIMTile_new(Image *image, int tile_number, const char *label)
796{
797 ImageTile *tile = BKE_image_add_tile(image, tile_number, label);
798
800
801 return tile;
802}
803
804static void rna_UDIMTile_remove(Image *image, PointerRNA *ptr)
805{
808
810}
811
812#else
813
815{
816 StructRNA *srna;
817 PropertyRNA *prop;
818
819 srna = RNA_def_struct(brna, "ImageUser", nullptr);
821 srna,
822 "Image User",
823 "Parameters defining how an Image data-block is used by another data-block");
824 RNA_def_struct_path_func(srna, "rna_ImageUser_path");
825
827
828 prop = RNA_def_property(srna, "use_auto_refresh", PROP_BOOLEAN, PROP_NONE);
829 RNA_def_property_boolean_sdna(prop, nullptr, "flag", IMA_ANIM_ALWAYS);
830 RNA_def_property_ui_text(prop, "Auto Refresh", "Always refresh image on frame changes");
831 RNA_def_property_update(prop, 0, "rna_ImageUser_relations_update");
833
834 prop = RNA_def_property(srna, "frame_current", PROP_INT, PROP_TIME);
835 RNA_def_property_int_sdna(prop, nullptr, "framenr");
838 prop, "Current Frame", "Current frame number in image sequence or movie");
839
840 /* animation */
841 prop = RNA_def_property(srna, "use_cyclic", PROP_BOOLEAN, PROP_NONE);
842 RNA_def_property_boolean_sdna(prop, nullptr, "cycl", 0);
843 RNA_def_property_ui_text(prop, "Cyclic", "Cycle the images in the movie");
844 RNA_def_property_update(prop, 0, "rna_ImageUser_update");
846
847 prop = RNA_def_property(srna, "frame_duration", PROP_INT, PROP_NONE);
848 RNA_def_property_int_sdna(prop, nullptr, "frames");
850 RNA_def_property_ui_text(prop, "Frames", "Number of images of a movie to use");
851 RNA_def_property_update(prop, 0, "rna_ImageUser_update");
853
854 prop = RNA_def_property(srna, "frame_offset", PROP_INT, PROP_NONE);
855 RNA_def_property_int_sdna(prop, nullptr, "offset");
857 prop, "Offset", "Offset the number of the frame to use in the animation");
858 RNA_def_property_update(prop, 0, "rna_ImageUser_update");
859
860 prop = RNA_def_property(srna, "frame_start", PROP_INT, PROP_TIME);
861 RNA_def_property_int_sdna(prop, nullptr, "sfra");
864 prop,
865 "Start Frame",
866 "Global starting frame of the movie/sequence, assuming first picture has a #1");
867 RNA_def_property_update(prop, 0, "rna_ImageUser_update");
869
870 prop = RNA_def_property(srna, "multilayer_layer", PROP_INT, PROP_UNSIGNED);
871 RNA_def_property_int_sdna(prop, nullptr, "layer");
872 RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* image_multi_cb */
873 RNA_def_property_ui_text(prop, "Layer", "Layer in multilayer image");
874
875 prop = RNA_def_property(srna, "multilayer_pass", PROP_INT, PROP_UNSIGNED);
876 RNA_def_property_int_sdna(prop, nullptr, "pass");
877 RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* image_multi_cb */
878 RNA_def_property_ui_text(prop, "Pass", "Pass in multilayer image");
879
880 prop = RNA_def_property(srna, "multilayer_view", PROP_INT, PROP_UNSIGNED);
881 RNA_def_property_int_sdna(prop, nullptr, "view");
882 RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* image_multi_cb */
883 RNA_def_property_ui_text(prop, "View", "View in multilayer image");
884
885 prop = RNA_def_property(srna, "tile", PROP_INT, PROP_UNSIGNED);
886 RNA_def_property_int_sdna(prop, nullptr, "tile");
888 RNA_def_property_ui_text(prop, "Tile", "Tile in tiled image");
889
891}
892
893/* image.packed_files */
895{
896 StructRNA *srna;
897 PropertyRNA *prop;
898
899 srna = RNA_def_struct(brna, "ImagePackedFile", nullptr);
900 RNA_def_struct_sdna(srna, "ImagePackedFile");
901
902 prop = RNA_def_property(srna, "packed_file", PROP_POINTER, PROP_NONE);
903 RNA_def_property_pointer_sdna(prop, nullptr, "packedfile");
904 RNA_def_property_ui_text(prop, "Packed File", "");
906
907 prop = RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
908 RNA_def_property_string_sdna(prop, nullptr, "filepath");
910
911 prop = RNA_def_property(srna, "view", PROP_INT, PROP_NONE);
912 RNA_def_property_int_sdna(prop, nullptr, "view");
913 RNA_def_property_ui_text(prop, "View Index", "");
915
916 prop = RNA_def_property(srna, "tile_number", PROP_INT, PROP_NONE);
917 RNA_def_property_int_sdna(prop, nullptr, "tile_number");
918 RNA_def_property_ui_text(prop, "Tile Number", "");
920
922}
923
925{
926 StructRNA *srna;
927 PropertyRNA *prop, *parm;
928 FunctionRNA *func;
929
930 srna = RNA_def_struct(brna, "RenderSlot", nullptr);
931 RNA_def_struct_ui_text(srna, "Render Slot", "Parameters defining the render slot");
932
933 prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
934 RNA_def_property_string_sdna(prop, nullptr, "name");
935 RNA_def_property_ui_text(prop, "Name", "Render slot name");
937
938 func = RNA_def_function(srna, "clear", "rna_RenderSlot_clear");
940 RNA_def_function_ui_description(func, "Clear the render slot");
941 parm = RNA_def_pointer(func, "iuser", "ImageUser", "ImageUser", "");
943}
944
946{
947 StructRNA *srna;
948 FunctionRNA *func;
949 PropertyRNA *prop, *parm;
950
951 RNA_def_property_srna(cprop, "RenderSlots");
952 srna = RNA_def_struct(brna, "RenderSlots", nullptr);
953 RNA_def_struct_sdna(srna, "Image");
954 RNA_def_struct_ui_text(srna, "Render Layers", "Collection of render layers");
955
956 prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
957 RNA_def_property_int_sdna(prop, nullptr, "render_slot");
959 "rna_render_slots_active_index_get",
960 "rna_render_slots_active_index_set",
961 "rna_render_slots_active_index_range");
962 RNA_def_property_ui_text(prop, "Active", "Active render slot of the image");
964
965 prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
966 RNA_def_property_struct_type(prop, "RenderSlot");
968 prop, "rna_render_slots_active_get", "rna_render_slots_active_set", nullptr, nullptr);
970 RNA_def_property_ui_text(prop, "Active", "Active render slot of the image");
972
973 func = RNA_def_function(srna, "new", "BKE_image_add_renderslot");
974 RNA_def_function_ui_description(func, "Add a render slot to the image");
975 parm = RNA_def_string(func, "name", nullptr, 0, "Name", "New name for the render slot");
976 parm = RNA_def_pointer(func, "result", "RenderSlot", "", "Newly created render layer");
977 RNA_def_function_return(func, parm);
978}
979
981{
982 StructRNA *srna;
983 PropertyRNA *prop;
984
985 srna = RNA_def_struct(brna, "UDIMTile", nullptr);
986 RNA_def_struct_sdna(srna, "ImageTile");
987 RNA_def_struct_ui_text(srna, "UDIM Tile", "Properties of the UDIM tile");
988
989 prop = RNA_def_property(srna, "label", PROP_STRING, PROP_NONE);
990 RNA_def_property_string_sdna(prop, nullptr, "label");
991 RNA_def_property_ui_text(prop, "Label", "Tile label");
993 prop, "rna_UDIMTile_label_get", "rna_UDIMTile_label_length", nullptr);
995
996 prop = RNA_def_property(srna, "number", PROP_INT, PROP_NONE);
997 RNA_def_property_int_sdna(prop, nullptr, "tile_number");
998 RNA_def_property_ui_text(prop, "Number", "Number of the position that this tile covers");
999 RNA_def_property_int_funcs(prop, nullptr, "rna_UDIMTile_tile_number_set", nullptr);
1001
1002 prop = RNA_def_int_vector(
1003 srna,
1004 "size",
1005 2,
1006 nullptr,
1007 0,
1008 0,
1009 "Size",
1010 "Width and height of the tile buffer in pixels, zero when image data can't be loaded",
1011 0,
1012 0);
1014 RNA_def_property_int_funcs(prop, "rna_UDIMTile_size_get", nullptr, nullptr);
1016
1017 prop = RNA_def_property(srna, "channels", PROP_INT, PROP_UNSIGNED);
1018 RNA_def_property_int_funcs(prop, "rna_UDIMTile_channels_get", nullptr, nullptr);
1019 RNA_def_property_ui_text(prop, "Channels", "Number of channels in the tile pixels buffer");
1021
1022 /* Generated tile information. */
1023 prop = RNA_def_property(srna, "generated_type", PROP_ENUM, PROP_NONE);
1024 RNA_def_property_enum_sdna(prop, nullptr, "gen_type");
1026 RNA_def_property_ui_text(prop, "Generated Type", "Generated image type");
1027 RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_UDIMTile_generated_update");
1029
1030 prop = RNA_def_property(srna, "generated_width", PROP_INT, PROP_PIXEL);
1031 RNA_def_property_int_sdna(prop, nullptr, "gen_x");
1033 RNA_def_property_range(prop, 1, 65536);
1034 RNA_def_property_ui_text(prop, "Generated Width", "Generated image width");
1035 RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_UDIMTile_generated_update");
1037
1038 prop = RNA_def_property(srna, "generated_height", PROP_INT, PROP_PIXEL);
1039 RNA_def_property_int_sdna(prop, nullptr, "gen_y");
1041 RNA_def_property_range(prop, 1, 65536);
1042 RNA_def_property_ui_text(prop, "Generated Height", "Generated image height");
1043 RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_UDIMTile_generated_update");
1045
1046 prop = RNA_def_property(srna, "use_generated_float", PROP_BOOLEAN, PROP_NONE);
1047 RNA_def_property_boolean_sdna(prop, nullptr, "gen_flag", IMA_GEN_FLOAT);
1048 RNA_def_property_ui_text(prop, "Float Buffer", "Generate floating-point buffer");
1049 RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_UDIMTile_generated_update");
1051
1052 prop = RNA_def_property(srna, "is_generated_tile", PROP_BOOLEAN, PROP_NONE);
1053 RNA_def_property_boolean_sdna(prop, nullptr, "gen_flag", IMA_GEN_TILE);
1054 RNA_def_property_ui_text(prop, "Is Generated Tile", "Is this image tile generated");
1056
1057 prop = RNA_def_property(srna, "generated_color", PROP_FLOAT, PROP_COLOR_GAMMA);
1058 RNA_def_property_float_sdna(prop, nullptr, "gen_color");
1059 RNA_def_property_array(prop, 4);
1060 RNA_def_property_ui_text(prop, "Color", "Fill color for the generated image");
1061 RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_UDIMTile_generated_update");
1063}
1064
1066{
1067 StructRNA *srna;
1068 PropertyRNA *prop;
1069
1070 FunctionRNA *func;
1071 PropertyRNA *parm;
1072
1073 RNA_def_property_srna(cprop, "UDIMTiles");
1074 srna = RNA_def_struct(brna, "UDIMTiles", nullptr);
1075 RNA_def_struct_sdna(srna, "Image");
1076 RNA_def_struct_ui_text(srna, "UDIM Tiles", "Collection of UDIM tiles");
1077
1078 prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED);
1079 RNA_def_property_int_sdna(prop, nullptr, "active_tile_index");
1081 "rna_Image_active_tile_index_get",
1082 "rna_Image_active_tile_index_set",
1083 "rna_Image_active_tile_index_range");
1084 RNA_def_property_ui_text(prop, "Active Tile Index", "Active index in tiles array");
1085
1086 prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
1087 RNA_def_property_struct_type(prop, "UDIMTile");
1089 prop, "rna_Image_active_tile_get", "rna_Image_active_tile_set", nullptr, nullptr);
1091 RNA_def_property_ui_text(prop, "Active Image Tile", "Active Image Tile");
1092
1093 func = RNA_def_function(srna, "new", "rna_UDIMTile_new");
1094 RNA_def_function_ui_description(func, "Add a tile to the image");
1095 parm = RNA_def_int(
1096 func, "tile_number", 1, 1, INT_MAX, "", "Number of the newly created tile", 1, 100);
1098 parm = RNA_def_string(func, "label", nullptr, 0, "", "Optional label for the tile");
1099 parm = RNA_def_pointer(func, "result", "UDIMTile", "", "Newly created image tile");
1100 RNA_def_function_return(func, parm);
1101
1102 func = RNA_def_function(srna, "get", "BKE_image_get_tile");
1103 RNA_def_function_ui_description(func, "Get a tile based on its tile number");
1104 parm = RNA_def_int(func, "tile_number", 0, 0, INT_MAX, "", "Number of the tile", 0, 100);
1106 parm = RNA_def_pointer(func, "result", "UDIMTile", "", "The tile");
1107 RNA_def_function_return(func, parm);
1108
1109 func = RNA_def_function(srna, "remove", "rna_UDIMTile_remove");
1110 RNA_def_function_ui_description(func, "Remove an image tile");
1111 parm = RNA_def_pointer(func, "tile", "UDIMTile", "", "Image tile to remove");
1114}
1115
1116static void rna_def_image(BlenderRNA *brna)
1117{
1118 StructRNA *srna;
1119 PropertyRNA *prop;
1120 static const EnumPropertyItem prop_type_items[] = {
1121 {IMA_TYPE_IMAGE, "IMAGE", 0, "Image", ""},
1122 {IMA_TYPE_MULTILAYER, "MULTILAYER", 0, "Multilayer", ""},
1123 {IMA_TYPE_UV_TEST, "UV_TEST", 0, "UV Test", ""},
1124 {IMA_TYPE_R_RESULT, "RENDER_RESULT", 0, "Render Result", ""},
1125 {IMA_TYPE_COMPOSITE, "COMPOSITING", 0, "Compositing", ""},
1126 {0, nullptr, 0, nullptr, nullptr},
1127 };
1128 static const EnumPropertyItem alpha_mode_items[] = {
1130 "STRAIGHT",
1131 0,
1132 "Straight",
1133 "Store RGB and alpha channels separately with alpha acting as a mask, also known as "
1134 "unassociated alpha. Commonly used by image editing applications and file formats like "
1135 "PNG."},
1137 "PREMUL",
1138 0,
1139 "Premultiplied",
1140 "Store RGB channels with alpha multiplied in, also known as associated alpha. The natural "
1141 "format for renders and used by file formats like OpenEXR."},
1143 "CHANNEL_PACKED",
1144 0,
1145 "Channel Packed",
1146 "Different images are packed in the RGB and alpha channels, and they should not "
1147 "affect each other. Channel packing is commonly used by game engines to save memory."},
1149 "NONE",
1150 0,
1151 "None",
1152 "Ignore alpha channel from the file and make image fully opaque"},
1153 {0, nullptr, 0, nullptr, nullptr},
1154 };
1155
1156 srna = RNA_def_struct(brna, "Image", "ID");
1158 srna, "Image", "Image data-block referencing an external or packed image");
1159 RNA_def_struct_ui_icon(srna, ICON_IMAGE_DATA);
1160
1161 prop = RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
1163 RNA_def_property_string_sdna(prop, nullptr, "filepath");
1164 RNA_def_property_ui_text(prop, "File Name", "Image/Movie file name");
1165 RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_Image_reload_update");
1166
1167 /* eek. this is horrible but needed so we can save to a new name without blanking the data :( */
1168 prop = RNA_def_property(srna, "filepath_raw", PROP_STRING, PROP_FILEPATH);
1169 RNA_def_property_string_sdna(prop, nullptr, "filepath");
1170 RNA_def_property_ui_text(prop, "File Name", "Image/Movie file name (without data refreshing)");
1171
1172 prop = RNA_def_property(srna, "file_format", PROP_ENUM, PROP_NONE);
1175 prop, "rna_Image_file_format_get", "rna_Image_file_format_set", nullptr);
1176 RNA_def_property_ui_text(prop, "File Format", "Format used for re-saving this file");
1177
1178 prop = RNA_def_property(srna, "source", PROP_ENUM, PROP_NONE);
1181 RNA_def_property_enum_funcs(prop, nullptr, "rna_Image_source_set", "rna_Image_source_itemf");
1182 RNA_def_property_ui_text(prop, "Source", "Where the image comes from");
1184
1185 prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
1186 RNA_def_property_enum_items(prop, prop_type_items);
1188 RNA_def_property_ui_text(prop, "Type", "How to generate the image");
1190
1191 prop = RNA_def_property(srna, "packed_file", PROP_POINTER, PROP_NONE);
1192 RNA_def_property_struct_type(prop, "PackedFile");
1193 RNA_def_property_pointer_sdna(prop, nullptr, "packedfile");
1194 RNA_def_property_pointer_funcs(prop, "rna_Image_packed_file_get", nullptr, nullptr, nullptr);
1195 RNA_def_property_ui_text(prop, "Packed File", "First packed file of the image");
1196
1197 prop = RNA_def_property(srna, "packed_files", PROP_COLLECTION, PROP_NONE);
1198 RNA_def_property_collection_sdna(prop, nullptr, "packedfiles", nullptr);
1199 RNA_def_property_struct_type(prop, "ImagePackedFile");
1201 RNA_def_property_ui_text(prop, "Packed Files", "Collection of packed images");
1202
1203 prop = RNA_def_property(srna, "use_view_as_render", PROP_BOOLEAN, PROP_NONE);
1205 RNA_def_property_boolean_sdna(prop, nullptr, "flag", IMA_VIEW_AS_RENDER);
1207 prop,
1208 "View as Render",
1209 "Apply render part of display transformation when displaying this image on the screen");
1211
1212 prop = RNA_def_property(srna, "use_deinterlace", PROP_BOOLEAN, PROP_NONE);
1214 RNA_def_property_boolean_sdna(prop, nullptr, "flag", IMA_DEINTERLACE);
1215 RNA_def_property_ui_text(prop, "Deinterlace", "Deinterlace movie file on load");
1216 RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_Image_reload_update");
1217
1218 prop = RNA_def_property(srna, "use_multiview", PROP_BOOLEAN, PROP_NONE);
1220 RNA_def_property_boolean_sdna(prop, nullptr, "flag", IMA_USE_VIEWS);
1221 RNA_def_property_ui_text(prop, "Use Multi-View", "Use Multiple Views (when available)");
1222 RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_Image_views_format_update");
1223
1224 prop = RNA_def_property(srna, "is_stereo_3d", PROP_BOOLEAN, PROP_NONE);
1226 RNA_def_property_boolean_funcs(prop, "rna_Image_is_stereo_3d_get", nullptr);
1227 RNA_def_property_ui_text(prop, "Stereo 3D", "Image has left and right views");
1229
1230 prop = RNA_def_property(srna, "is_multiview", PROP_BOOLEAN, PROP_NONE);
1232 RNA_def_property_boolean_funcs(prop, "rna_Image_is_multiview_get", nullptr);
1233 RNA_def_property_ui_text(prop, "Multiple Views", "Image has more than one view");
1235
1236 prop = RNA_def_property(srna, "is_dirty", PROP_BOOLEAN, PROP_NONE);
1238 RNA_def_property_boolean_funcs(prop, "rna_Image_dirty_get", nullptr);
1240 RNA_def_property_ui_text(prop, "Dirty", "Image has changed and is not saved");
1241
1242 /* generated image (image_generated_change_cb) */
1243 prop = RNA_def_property(srna, "generated_type", PROP_ENUM, PROP_NONE);
1244 RNA_def_property_enum_sdna(prop, nullptr, "gen_type");
1246 RNA_def_property_ui_text(prop, "Generated Type", "Generated image type");
1248 prop, "rna_Image_generated_type_get", "rna_Image_generated_type_set", nullptr);
1249 RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_Image_generated_update");
1251
1252 prop = RNA_def_property(srna, "generated_width", PROP_INT, PROP_PIXEL);
1253 RNA_def_property_int_sdna(prop, nullptr, "gen_x");
1255 RNA_def_property_range(prop, 1, 65536);
1256 RNA_def_property_ui_text(prop, "Generated Width", "Generated image width");
1258 prop, "rna_Image_generated_width_get", "rna_Image_generated_width_set", nullptr);
1259 RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_Image_generated_update");
1261
1262 prop = RNA_def_property(srna, "generated_height", PROP_INT, PROP_PIXEL);
1263 RNA_def_property_int_sdna(prop, nullptr, "gen_y");
1265 RNA_def_property_range(prop, 1, 65536);
1266 RNA_def_property_ui_text(prop, "Generated Height", "Generated image height");
1268 prop, "rna_Image_generated_height_get", "rna_Image_generated_height_set", nullptr);
1269 RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_Image_generated_update");
1271
1272 prop = RNA_def_property(srna, "use_generated_float", PROP_BOOLEAN, PROP_NONE);
1273 RNA_def_property_boolean_sdna(prop, nullptr, "gen_flag", IMA_GEN_FLOAT);
1274 RNA_def_property_ui_text(prop, "Float Buffer", "Generate floating-point buffer");
1276 prop, "rna_Image_generated_float_get", "rna_Image_generated_float_set");
1277 RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_Image_generated_update");
1279
1280 prop = RNA_def_property(srna, "generated_color", PROP_FLOAT, PROP_COLOR_GAMMA);
1281 RNA_def_property_float_sdna(prop, nullptr, "gen_color");
1282 RNA_def_property_array(prop, 4);
1283 RNA_def_property_ui_text(prop, "Color", "Fill color for the generated image");
1285 prop, "rna_Image_generated_color_get", "rna_Image_generated_color_set", nullptr);
1286 RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_Image_generated_update");
1288
1289 prop = RNA_def_property(srna, "display_aspect", PROP_FLOAT, PROP_XYZ);
1291 RNA_def_property_float_sdna(prop, nullptr, "aspx");
1292 RNA_def_property_array(prop, 2);
1293 RNA_def_property_range(prop, 0.1f, FLT_MAX);
1294 RNA_def_property_ui_range(prop, 0.1f, 5000.0f, 1, 2);
1296 prop, "Display Aspect", "Display Aspect for this image, does not affect rendering");
1298
1299 prop = RNA_def_property(srna, "bindcode", PROP_INT, PROP_UNSIGNED);
1300 RNA_def_property_int_funcs(prop, "rna_Image_bindcode_get", nullptr, nullptr);
1302 RNA_def_property_ui_text(prop, "Bindcode", "OpenGL bindcode");
1304
1305 prop = RNA_def_property(srna, "render_slots", PROP_COLLECTION, PROP_NONE);
1306 RNA_def_property_struct_type(prop, "RenderSlot");
1307 RNA_def_property_collection_sdna(prop, nullptr, "renderslots", nullptr);
1308 RNA_def_property_ui_text(prop, "Render Slots", "Render slots of the image");
1309 rna_def_render_slots(brna, prop);
1310
1311 prop = RNA_def_property(srna, "tiles", PROP_COLLECTION, PROP_NONE);
1312 RNA_def_property_struct_type(prop, "UDIMTile");
1313 RNA_def_property_collection_sdna(prop, nullptr, "tiles", nullptr);
1314 RNA_def_property_ui_text(prop, "Image Tiles", "Tiles of the image");
1315 rna_def_udim_tiles(brna, prop);
1316
1317 prop = RNA_def_property(srna, "has_data", PROP_BOOLEAN, PROP_NONE);
1318 RNA_def_property_boolean_funcs(prop, "rna_Image_has_data_get", nullptr);
1320 RNA_def_property_ui_text(prop, "Has Data", "True if the image data is loaded into memory");
1321
1322 prop = RNA_def_property(srna, "depth", PROP_INT, PROP_UNSIGNED);
1323 RNA_def_property_int_funcs(prop, "rna_Image_depth_get", nullptr, nullptr);
1324 RNA_def_property_ui_text(prop, "Depth", "Image bit depth");
1326
1327 prop = RNA_def_int_vector(
1328 srna,
1329 "size",
1330 2,
1331 nullptr,
1332 0,
1333 0,
1334 "Size",
1335 "Width and height of the image buffer in pixels, zero when image data can't be loaded",
1336 0,
1337 0);
1339 RNA_def_property_int_funcs(prop, "rna_Image_size_get", nullptr, nullptr);
1341
1342 prop = RNA_def_float_vector(srna,
1343 "resolution",
1344 2,
1345 nullptr,
1346 0,
1347 0,
1348 "Resolution",
1349 "X/Y pixels per meter, for the image buffer",
1350 0,
1351 0);
1354 prop, "rna_Image_resolution_get", "rna_Image_resolution_set", nullptr);
1355
1356 prop = RNA_def_property(srna, "frame_duration", PROP_INT, PROP_UNSIGNED);
1357 RNA_def_property_int_funcs(prop, "rna_Image_frame_duration_get", nullptr, nullptr);
1359 prop, "Duration", "Duration (in frames) of the image (1 when not a video/sequence)");
1361
1362 /* NOTE: About pixels/channels/is_float:
1363 * These properties describe how the image is stored internally (inside of ImBuf),
1364 * not how it was saved to disk or how it'll be saved on disk.
1365 */
1366 prop = RNA_def_property(srna, "pixels", PROP_FLOAT, PROP_NONE);
1368 RNA_def_property_multi_array(prop, 1, nullptr);
1369 RNA_def_property_ui_text(prop, "Pixels", "Image buffer pixels in floating-point values");
1370 RNA_def_property_dynamic_array_funcs(prop, "rna_Image_pixels_get_length");
1371 RNA_def_property_float_funcs(prop, "rna_Image_pixels_get", "rna_Image_pixels_set", nullptr);
1372
1373 prop = RNA_def_property(srna, "channels", PROP_INT, PROP_UNSIGNED);
1374 RNA_def_property_int_funcs(prop, "rna_Image_channels_get", nullptr, nullptr);
1375 RNA_def_property_ui_text(prop, "Channels", "Number of channels in pixels buffer");
1377
1378 prop = RNA_def_property(srna, "is_float", PROP_BOOLEAN, PROP_NONE);
1379 RNA_def_property_boolean_funcs(prop, "rna_Image_is_float_get", nullptr);
1382 prop, "Is Float", "True if this image is stored in floating-point buffer");
1383
1384 prop = RNA_def_property(srna, "colorspace_settings", PROP_POINTER, PROP_NONE);
1385 RNA_def_property_pointer_sdna(prop, nullptr, "colorspace_settings");
1386 RNA_def_property_struct_type(prop, "ColorManagedInputColorspaceSettings");
1387 RNA_def_property_ui_text(prop, "Color Space Settings", "Input color space settings");
1388
1389 prop = RNA_def_property(srna, "alpha_mode", PROP_ENUM, PROP_NONE);
1391 RNA_def_property_enum_items(prop, alpha_mode_items);
1393 "Alpha Mode",
1394 "Representation of alpha in the image file, to convert to and from "
1395 "when saving and loading the image");
1396 RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_Image_alpha_mode_update");
1397
1398 prop = RNA_def_property(srna, "use_half_precision", PROP_BOOLEAN, PROP_NONE);
1401 "Half Float Precision",
1402 "Use 16 bits per channel to lower the memory usage during rendering");
1403 RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_Image_gpu_texture_update");
1404
1405 prop = RNA_def_property(srna, "seam_margin", PROP_INT, PROP_NONE);
1407 prop,
1408 "Seam Margin",
1409 "Margin to take into account when fixing UV seams during painting. Higher "
1410 "number would improve seam-fixes for mipmaps, but decreases performance.");
1411 RNA_def_property_ui_range(prop, 1, 100, 1, 1);
1412
1413 /* multiview */
1414 prop = RNA_def_property(srna, "views_format", PROP_ENUM, PROP_NONE);
1416 RNA_def_property_enum_sdna(prop, nullptr, "views_format");
1418 RNA_def_property_ui_text(prop, "Views Format", "Mode to load image views");
1419 RNA_def_property_update(prop, NC_IMAGE | ND_DISPLAY, "rna_Image_views_format_update");
1420
1421 prop = RNA_def_property(srna, "stereo_3d_format", PROP_POINTER, PROP_NONE);
1422 RNA_def_property_pointer_sdna(prop, nullptr, "stereo3d_format");
1424 RNA_def_property_struct_type(prop, "Stereo3dFormat");
1425 RNA_def_property_ui_text(prop, "Stereo 3D Format", "Settings for stereo 3d");
1426
1427 RNA_api_image(srna);
1428}
1429
1431{
1432 rna_def_render_slot(brna);
1433 rna_def_udim_tile(brna);
1434 rna_def_image(brna);
1435 rna_def_imageuser(brna);
1437}
1438
1439#endif
#define G_MAIN
RenderSlot * BKE_image_get_renderslot(Image *ima, int index)
ImBuf * BKE_image_acquire_ibuf(Image *ima, ImageUser *iuser, void **r_lock)
void BKE_image_user_frame_calc(Image *ima, ImageUser *iuser, int cfra)
void BKE_image_mark_dirty(Image *image, ImBuf *ibuf)
bool BKE_image_fill_tile(Image *ima, ImageTile *tile)
void BKE_image_release_ibuf(Image *ima, ImBuf *ibuf, void *lock)
bool BKE_image_is_dirty(Image *image)
#define IMA_SIGNAL_COLORMANAGE
Definition BKE_image.hh:143
int BKE_image_get_tile_label(const Image *ima, const ImageTile *tile, char *label, int label_maxncpy)
bool BKE_image_has_anim(Image *image)
#define IMA_SIGNAL_FREE
Definition BKE_image.hh:138
void BKE_imageuser_default(ImageUser *iuser)
void BKE_image_free_gputextures(Image *ima)
Definition image_gpu.cc:556
#define IMA_SIGNAL_SRC_CHANGE
Definition BKE_image.hh:140
bool BKE_image_is_stereo(const Image *ima)
bool BKE_image_is_multiview(const Image *ima)
#define IMA_SIGNAL_RELOAD
Definition BKE_image.hh:137
bool BKE_image_has_packedfile(const Image *image)
void BKE_image_signal(Main *bmain, Image *ima, ImageUser *iuser, int signal)
void BKE_image_reassign_tile(Image *ima, ImageTile *tile, int new_tile_number)
bool BKE_image_clear_renderslot(Image *ima, ImageUser *iuser, int slot)
ImageTile * BKE_image_add_tile(Image *ima, int tile_number, const char *label)
void BKE_image_file_format_set(Image *image, int ftype, const ImbFormatOptions *options)
bool BKE_image_remove_tile(Image *ima, ImageTile *tile)
void BKE_image_partial_update_mark_full_update(Image *image)
Mark the whole image to be updated.
bool BKE_image_has_loaded_ibuf(Image *image)
char BKE_ftype_to_imtype(int ftype, const ImbFormatOptions *options)
int BKE_imtype_to_ftype(char imtype, ImbFormatOptions *r_options)
bool BKE_imtype_is_movie(char imtype)
bool BKE_id_is_in_global_main(ID *id)
Definition lib_id.cc:2433
void BKE_ntree_update_tag_image_user_changed(bNodeTree *ntree, ImageUser *iuser)
#define BLI_assert(a)
Definition BLI_assert.h:50
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
MINLINE void copy_v4_v4(float r[4], const float a[4])
unsigned int uint
#define CLAMP(a, b, c)
#define BLT_I18NCONTEXT_ID_IMAGE
void DEG_id_tag_update(ID *id, unsigned int flags)
void DEG_relations_tag_update(Main *bmain)
@ ID_RECALC_SOURCE
Definition DNA_ID.h:1110
@ ID_RECALC_EDITORS
Definition DNA_ID.h:1078
@ ID_CA
@ ID_TE
@ ID_NT
@ ID_SCR
@ ID_OB
@ IMA_GEN_TILE
@ IMA_GEN_FLOAT
@ IMA_ANIM_ALWAYS
@ IMA_SRC_FILE
@ IMA_SRC_MOVIE
@ IMA_SRC_GENERATED
@ IMA_SRC_VIEWER
@ IMA_SRC_TILED
@ IMA_SRC_SEQUENCE
@ IMA_TYPE_MULTILAYER
@ IMA_TYPE_UV_TEST
@ IMA_TYPE_R_RESULT
@ IMA_TYPE_COMPOSITE
@ IMA_TYPE_IMAGE
@ IMA_DEINTERLACE
@ IMA_HIGH_BITDEPTH
@ IMA_USE_VIEWS
@ IMA_VIEW_AS_RENDER
@ IMA_ALPHA_IGNORE
@ IMA_ALPHA_STRAIGHT
@ IMA_ALPHA_PREMUL
@ IMA_ALPHA_CHANNEL_PACKED
@ IMA_GENTYPE_GRID_COLOR
@ IMA_GENTYPE_GRID
@ IMA_GENTYPE_BLANK
@ TEXTARGET_2D
#define MINAFRAME
#define MAXFRAMEF
#define MINAFRAMEF
#define MAXFRAME
@ SPACE_IMAGE
void ED_node_tree_propagate_change(const bContext *C, Main *bmain, bNodeTree *ntree)
Definition node_edit.cc:492
int GPU_texture_opengl_bindcode(const GPUTexture *texture)
int IMB_anim_get_duration(ImBufAnim *anim, IMB_Timecode_Type tc)
@ IMB_FTYPE_NONE
@ IMB_TC_RECORD_RUN
Contains defines and structs used throughout the imbuf module.
@ IB_MIPMAP_INVALID
@ IB_DISPLAY_BUFFER_INVALID
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Invert a producing a negative Combine Generate a color from its and blue channels(Deprecated)") DefNode(ShaderNode
#define RNA_MAX_ARRAY_DIMENSION
Definition RNA_define.hh:26
ParameterFlag
Definition RNA_types.hh:396
@ PARM_RNAPTR
Definition RNA_types.hh:399
@ PARM_REQUIRED
Definition RNA_types.hh:397
@ FUNC_USE_SELF_ID
Definition RNA_types.hh:667
@ PROP_FLOAT
Definition RNA_types.hh:67
@ PROP_BOOLEAN
Definition RNA_types.hh:65
@ PROP_ENUM
Definition RNA_types.hh:69
@ PROP_INT
Definition RNA_types.hh:66
@ PROP_STRING
Definition RNA_types.hh:68
@ PROP_POINTER
Definition RNA_types.hh:70
@ PROP_COLLECTION
Definition RNA_types.hh:71
@ PROPOVERRIDE_OVERRIDABLE_LIBRARY
Definition RNA_types.hh:355
PropertyFlag
Definition RNA_types.hh:201
@ PROP_THICK_WRAP
Definition RNA_types.hh:312
@ PROP_DYNAMIC
Definition RNA_types.hh:317
@ PROP_ANIMATABLE
Definition RNA_types.hh:220
@ PROP_PROPORTIONAL
Definition RNA_types.hh:250
@ PROP_EDITABLE
Definition RNA_types.hh:207
@ PROP_NEVER_NULL
Definition RNA_types.hh:266
@ PROP_TIME
Definition RNA_types.hh:156
@ PROP_XYZ
Definition RNA_types.hh:172
@ PROP_PIXEL
Definition RNA_types.hh:151
@ PROP_NONE
Definition RNA_types.hh:136
@ PROP_COLOR_GAMMA
Definition RNA_types.hh:175
@ PROP_UNSIGNED
Definition RNA_types.hh:152
@ PROP_FILEPATH
Definition RNA_types.hh:139
constexpr PointerRNA PointerRNA_NULL
Definition RNA_types.hh:45
#define ND_DRAW
Definition WM_types.hh:428
#define ND_DISPLAY
Definition WM_types.hh:458
#define NA_EDITED
Definition WM_types.hh:550
#define NC_IMAGE
Definition WM_types.hh:351
volatile int lock
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
CCL_NAMESPACE_BEGIN struct Options options
const char * label
int len
#define GS(x)
Definition iris.cc:202
ccl_gpu_kernel_postfix ccl_global KernelWorkTile const int num_tiles
ccl_global const KernelWorkTile * tile
#define unit_float_to_uchar_clamp(val)
#define G(x, y, z)
PointerRNA rna_pointer_inherit_refine(const PointerRNA *ptr, StructRNA *type, void *data)
void RNA_def_struct_name_property(StructRNA *srna, PropertyRNA *prop)
PropertyRNA * RNA_def_string(StructOrFunctionRNA *cont_, const char *identifier, const char *default_value, const int maxlen, const char *ui_name, const char *ui_description)
void RNA_def_property_pointer_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_define_lib_overridable(const bool make_overridable)
void RNA_def_struct_path_func(StructRNA *srna, const char *path)
void RNA_def_property_boolean_sdna(PropertyRNA *prop, const char *structname, const char *propname, int64_t bit)
void RNA_def_parameter_clear_flags(PropertyRNA *prop, PropertyFlag flag_property, ParameterFlag flag_parameter)
void RNA_def_property_string_funcs(PropertyRNA *prop, const char *get, const char *length, const char *set)
void RNA_def_function_return(FunctionRNA *func, PropertyRNA *ret)
void RNA_def_property_float_funcs(PropertyRNA *prop, const char *get, const char *set, const char *range)
void RNA_def_property_ui_text(PropertyRNA *prop, const char *name, const char *description)
void RNA_def_property_string_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_property_srna(PropertyRNA *prop, const char *type)
void RNA_def_struct_ui_text(StructRNA *srna, const char *name, const char *description)
PropertyRNA * RNA_def_float_vector(StructOrFunctionRNA *cont_, const char *identifier, const int len, const float *default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
void RNA_def_property_boolean_funcs(PropertyRNA *prop, const char *get, const char *set)
void RNA_def_property_dynamic_array_funcs(PropertyRNA *prop, const char *getlength)
void RNA_def_property_multi_array(PropertyRNA *prop, int dimension, const int length[])
PropertyRNA * RNA_def_int_vector(StructOrFunctionRNA *cont_, const char *identifier, const int len, const int *default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
void RNA_def_property_enum_items(PropertyRNA *prop, const EnumPropertyItem *item)
void RNA_def_struct_sdna(StructRNA *srna, const char *structname)
FunctionRNA * RNA_def_function(StructRNA *srna, const char *identifier, const char *call)
void RNA_def_property_array(PropertyRNA *prop, int length)
void RNA_def_property_range(PropertyRNA *prop, double min, double max)
PropertyRNA * RNA_def_pointer(StructOrFunctionRNA *cont_, const char *identifier, const char *type, const char *ui_name, const char *ui_description)
void RNA_def_property_struct_type(PropertyRNA *prop, const char *type)
void RNA_def_property_collection_sdna(PropertyRNA *prop, const char *structname, const char *propname, const char *lengthpropname)
void RNA_def_function_ui_description(FunctionRNA *func, const char *description)
void RNA_def_property_update(PropertyRNA *prop, int noteflag, const char *func)
PropertyRNA * RNA_def_property(StructOrFunctionRNA *cont_, const char *identifier, int type, int subtype)
void RNA_def_property_enum_funcs(PropertyRNA *prop, const char *get, const char *set, const char *item)
StructRNA * RNA_def_struct(BlenderRNA *brna, const char *identifier, const char *from)
void RNA_enum_item_end(EnumPropertyItem **items, int *totitem)
void RNA_def_function_flag(FunctionRNA *func, int flag)
void RNA_def_property_clear_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_property_pointer_funcs(PropertyRNA *prop, const char *get, const char *set, const char *type_fn, const char *poll)
void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_def_property_int_funcs(PropertyRNA *prop, const char *get, const char *set, const char *range)
void RNA_def_struct_ui_icon(StructRNA *srna, int icon)
void RNA_def_property_translation_context(PropertyRNA *prop, const char *context)
void RNA_def_property_flag(PropertyRNA *prop, PropertyFlag flag)
void RNA_def_property_subtype(PropertyRNA *prop, PropertySubType subtype)
void RNA_def_property_float_sdna(PropertyRNA *prop, const char *structname, const char *propname)
void RNA_enum_items_add_value(EnumPropertyItem **items, int *totitem, const EnumPropertyItem *item, int value)
void RNA_def_property_ui_range(PropertyRNA *prop, double min, double max, double step, int precision)
void RNA_def_property_int_sdna(PropertyRNA *prop, const char *structname, const char *propname)
PropertyRNA * RNA_def_int(StructOrFunctionRNA *cont_, const char *identifier, const int default_value, const int hardmin, const int hardmax, const char *ui_name, const char *ui_description, const int softmin, const int softmax)
void RNA_def_property_boolean_negative_sdna(PropertyRNA *prop, const char *structname, const char *propname, int64_t booleanbit)
void RNA_def_property_override_flag(PropertyRNA *prop, PropertyOverrideFlag flag)
void RNA_def_parameter_flags(PropertyRNA *prop, PropertyFlag flag_property, ParameterFlag flag_parameter)
void RNA_def_image(BlenderRNA *brna)
static void rna_def_image(BlenderRNA *brna)
static void rna_def_render_slot(BlenderRNA *brna)
Definition rna_image.cc:924
static void rna_def_render_slots(BlenderRNA *brna, PropertyRNA *cprop)
Definition rna_image.cc:945
static const EnumPropertyItem image_source_items[]
Definition rna_image.cc:45
static void rna_def_image_packed_files(BlenderRNA *brna)
Definition rna_image.cc:894
static void rna_def_udim_tile(BlenderRNA *brna)
Definition rna_image.cc:980
static void rna_def_udim_tiles(BlenderRNA *brna, PropertyRNA *cprop)
static void rna_def_imageuser(BlenderRNA *brna)
Definition rna_image.cc:814
const EnumPropertyItem rna_enum_image_generated_type_items[]
Definition rna_image.cc:34
void RNA_api_image(StructRNA *srna)
void RNA_api_image_packed_file(StructRNA *srna)
std::optional< std::string > rna_CameraBackgroundImage_image_or_movieclip_user_path(const PointerRNA *ptr)
std::optional< std::string > rna_Node_ImageUser_path(const PointerRNA *ptr)
const EnumPropertyItem rna_enum_image_type_items[]
Definition rna_scene.cc:367
const EnumPropertyItem rna_enum_views_format_items[]
Definition rna_scene.cc:486
#define min(a, b)
Definition sort.c:32
#define FLT_MAX
Definition stdcycles.h:14
Definition DNA_ID.h:413
char name[66]
Definition DNA_ID.h:425
ImBufFloatBuffer float_buffer
ImBufByteBuffer byte_buffer
unsigned char planes
enum eImbFileType ftype
double ppm[2]
struct PackedFile * packedfile
float gen_color[4]
struct Scene * scene
struct ListBase packedfiles
ListBase anims
struct GPUTexture * gputexture[3][2]
short source
void * first
ID * owner_id
Definition RNA_types.hh:40
void * data
Definition RNA_types.hh:42
struct ImageUser iuser
void * BKE_image_get_tile
Definition stubs.c:36
void WM_main_add_notifier(uint type, void *reference)
PointerRNA * ptr
Definition wm_files.cc:4126