Commit: 5c62468e4b393218a915ebc317138e09ad2d0e71
Author: Lukas Stockner
Date:   Sun Jun 10 23:23:12 2018 +0200
Branches: temp-udim-images
https://developer.blender.org/rB5c62468e4b393218a915ebc317138e09ad2d0e71

Support UDIMs in Image Space operators

===================================================================

M       source/blender/editors/include/ED_image.h
M       source/blender/editors/space_image/image_draw.c
M       source/blender/editors/space_image/image_edit.c
M       source/blender/editors/space_image/image_ops.c
M       source/blender/editors/space_image/space_image.c
M       source/blender/makesdna/DNA_color_types.h
M       source/blender/makesrna/intern/rna_space.c

===================================================================

diff --git a/source/blender/editors/include/ED_image.h 
b/source/blender/editors/include/ED_image.h
index ce12c2fcd7a..ae2d416ccc7 100644
--- a/source/blender/editors/include/ED_image.h
+++ b/source/blender/editors/include/ED_image.h
@@ -48,7 +48,7 @@ struct Mask  *ED_space_image_get_mask(struct SpaceImage 
*sima);
 void          ED_space_image_set_mask(struct bContext *C, struct SpaceImage 
*sima, struct Mask *mask);
 
 bool ED_space_image_color_sample(struct SpaceImage *sima, struct ARegion *ar, 
int mval[2], float r_col[3]);
-struct ImBuf *ED_space_image_acquire_buffer(struct SpaceImage *sima, void 
**r_lock);
+struct ImBuf *ED_space_image_acquire_buffer(struct SpaceImage *sima, void 
**r_lock, int tile);
 void ED_space_image_release_buffer(struct SpaceImage *sima, struct ImBuf 
*ibuf, void *lock);
 bool ED_space_image_has_buffer(struct SpaceImage *sima);
 
diff --git a/source/blender/editors/space_image/image_draw.c 
b/source/blender/editors/space_image/image_draw.c
index bd008e4b392..28dc108a4d8 100644
--- a/source/blender/editors/space_image/image_draw.c
+++ b/source/blender/editors/space_image/image_draw.c
@@ -585,9 +585,13 @@ void draw_image_sample_line(SpaceImage *sima)
                immUniformArray4fv("colors", (float *)(float[][4]){{1.0f, 1.0f, 
1.0f, 1.0f}, {0.0f, 0.0f, 0.0f, 1.0f}}, 2);
                immUniform1f("dash_width", 2.0f);
 
+               float co[2][2];
+               add_v2_v2v2(co[0], hist->co[0], hist->draw_offset);
+               add_v2_v2v2(co[1], hist->co[1], hist->draw_offset);
+
                immBegin(GWN_PRIM_LINES, 2);
-               immVertex2fv(shdr_dashed_pos, hist->co[0]);
-               immVertex2fv(shdr_dashed_pos, hist->co[1]);
+               immVertex2fv(shdr_dashed_pos, co[0]);
+               immVertex2fv(shdr_dashed_pos, co[1]);
                immEnd();
 
                immUnbindProgram();
@@ -766,7 +770,7 @@ void draw_image_main(const bContext *C, ARegion *ar)
                        BKE_image_multiview_index(ima, &sima->iuser);
        }
 
-       ibuf = ED_space_image_acquire_buffer(sima, &lock);
+       ibuf = ED_space_image_acquire_buffer(sima, &lock, 0);
 
        /* draw the image or grid */
        if (ibuf == NULL) {
@@ -795,9 +799,7 @@ void draw_image_main(const bContext *C, ARegion *ar)
 
        if (ima && ima->source == IMA_SRC_UDIM) {
                for (int t = 1; t < ima->num_tiles; t++) {
-                       sima->iuser.tile = t;
-
-                       ibuf = ED_space_image_acquire_buffer(sima, &lock);
+                       ibuf = ED_space_image_acquire_buffer(sima, &lock, t);
                        if (ibuf) {
                                int x_pos = t%10;
                                int y_pos = t/10;
@@ -805,7 +807,6 @@ void draw_image_main(const bContext *C, ARegion *ar)
                        }
                        ED_space_image_release_buffer(sima, ibuf, lock);
                }
-               sima->iuser.tile = 0;
                draw_image_udim_grid(ar, sima, zoomx, zoomy, false);
        }
 
diff --git a/source/blender/editors/space_image/image_edit.c 
b/source/blender/editors/space_image/image_edit.c
index 0911bea3be4..1d4397361be 100644
--- a/source/blender/editors/space_image/image_edit.c
+++ b/source/blender/editors/space_image/image_edit.c
@@ -104,7 +104,7 @@ void ED_space_image_set_mask(bContext *C, SpaceImage *sima, 
Mask *mask)
        }
 }
 
-ImBuf *ED_space_image_acquire_buffer(SpaceImage *sima, void **r_lock)
+ImBuf *ED_space_image_acquire_buffer(SpaceImage *sima, void **r_lock, int tile)
 {
        ImBuf *ibuf;
 
@@ -114,7 +114,9 @@ ImBuf *ED_space_image_acquire_buffer(SpaceImage *sima, void 
**r_lock)
                        return BIF_render_spare_imbuf();
                else
 #endif
+               sima->iuser.tile = tile;
                ibuf = BKE_image_acquire_ibuf(sima->image, &sima->iuser, 
r_lock);
+               sima->iuser.tile = 0;
 
                if (ibuf) {
                        if (ibuf->rect || ibuf->rect_float)
@@ -141,7 +143,7 @@ bool ED_space_image_has_buffer(SpaceImage *sima)
        void *lock;
        bool has_buffer;
 
-       ibuf = ED_space_image_acquire_buffer(sima, &lock);
+       ibuf = ED_space_image_acquire_buffer(sima, &lock, 0);
        has_buffer = (ibuf != NULL);
        ED_space_image_release_buffer(sima, ibuf, lock);
 
@@ -154,7 +156,8 @@ void ED_space_image_get_size(SpaceImage *sima, int *width, 
int *height)
        ImBuf *ibuf;
        void *lock;
 
-       ibuf = ED_space_image_acquire_buffer(sima, &lock);
+       /* TODO(lukas): Support UDIMs with different sizes */
+       ibuf = ED_space_image_acquire_buffer(sima, &lock, 0);
 
        if (ibuf && ibuf->x > 0 && ibuf->y > 0) {
                *width = ibuf->x;
diff --git a/source/blender/editors/space_image/image_ops.c 
b/source/blender/editors/space_image/image_ops.c
index e1a4dcfe7ab..735d8f74444 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -226,7 +226,8 @@ static int space_image_file_exists_poll(bContext *C)
                bool ret = false;
                char name[FILE_MAX];
 
-               ibuf = ED_space_image_acquire_buffer(sima, &lock);
+               /* TODO(lukas): Saving UDIMs */
+               ibuf = ED_space_image_acquire_buffer(sima, &lock, 0);
                if (ibuf) {
                        BLI_strncpy(name, ibuf->name, FILE_MAX);
                        BLI_path_abs(name, BKE_main_blendfile_path(bmain));
@@ -1695,7 +1696,8 @@ static int save_image_options_init(Main *bmain, 
SaveImageOptions *simopts, Space
                                    const bool guess_path, const bool 
save_as_render)
 {
        void *lock;
-       ImBuf *ibuf = ED_space_image_acquire_buffer(sima, &lock);
+       /* TODO(lukas): Saving UDIMs */
+       ImBuf *ibuf = ED_space_image_acquire_buffer(sima, &lock, 0);
 
        if (ibuf) {
                Image *ima = sima->image;
@@ -1880,7 +1882,8 @@ static bool save_image_doit(bContext *C, SpaceImage 
*sima, wmOperator *op, SaveI
 {
        Image *ima = ED_space_image(sima);
        void *lock;
-       ImBuf *ibuf = ED_space_image_acquire_buffer(sima, &lock);
+       /* TODO(lukas): Saving UDIMs */
+       ImBuf *ibuf = ED_space_image_acquire_buffer(sima, &lock, 0);
        Scene *scene;
        RenderResult *rr = NULL;
        bool ok = false;
@@ -2979,12 +2982,34 @@ static void image_sample_draw(const bContext *C, 
ARegion *ar, void *arg_info)
        }
 }
 
+static int image_get_position(SpaceImage *sima, ARegion *ar, const int 
mval[2], float *fx, float *fy)
+{
+       UI_view2d_region_to_view(&ar->v2d, mval[0], mval[1], fx, fy);
+
+       /* If the image has tiles, shift the positions accordingly. */
+
+       Image *image = ED_space_image(sima);
+       if (!image || image->source != IMA_SRC_UDIM) {
+               return 0;
+       }
+
+       /* Determine the tile in which the sample lies. */
+       int ix = (int) *fx, iy = max_ii(0, (int) *fy);
+       CLAMP(ix, 0, 9);
+
+       *fx -= ix;
+       *fy -= iy;
+       return 10*iy + ix;
+}
+
 /* Returns color in linear space, matching ED_space_node_color_sample(). */
 bool ED_space_image_color_sample(SpaceImage *sima, ARegion *ar, int mval[2], 
float r_col[3])
 {
-       void *lock;
-       ImBuf *ibuf = ED_space_image_acquire_buffer(sima, &lock);
        float fx, fy;
+       int tile = image_get_position(sima, ar, mval, &fx, &fy);
+
+       void *lock;
+       ImBuf *ibuf = ED_space_image_acquire_buffer(sima, &lock, tile);
        bool ret = false;
 
        if (ibuf == NULL) {
@@ -2992,8 +3017,6 @@ bool ED_space_image_color_sample(SpaceImage *sima, 
ARegion *ar, int mval[2], flo
                return false;
        }
 
-       UI_view2d_region_to_view(&ar->v2d, mval[0], mval[1], &fx, &fy);
-
        if (fx >= 0.0f && fy >= 0.0f && fx < 1.0f && fy < 1.0f) {
                const float *fp;
                unsigned char *cp;
@@ -3023,10 +3046,14 @@ static void image_sample_apply(bContext *C, wmOperator 
*op, const wmEvent *event
 {
        SpaceImage *sima = CTX_wm_space_image(C);
        ARegion *ar = CTX_wm_region(C);
+       Image *image = ED_space_image(sima);
+
+       float fx, fy;
+       int tile = image_get_position(sima, ar, event->mval, &fx, &fy);
+
        void *lock;
-       ImBuf *ibuf = ED_space_image_acquire_buffer(sima, &lock);
+       ImBuf *ibuf = ED_space_image_acquire_buffer(sima, &lock, tile);
        ImageSampleInfo *info = op->customdata;
-       float fx, fy;
        Scene *scene = CTX_data_scene(C);
        CurveMapping *curve_mapping = scene->view_settings.curve_mapping;
 
@@ -3036,13 +3063,10 @@ static void image_sample_apply(bContext *C, wmOperator 
*op, const wmEvent *event
                return;
        }
 
-       UI_view2d_region_to_view(&ar->v2d, event->mval[0], event->mval[1], &fx, 
&fy);
-
        if (fx >= 0.0f && fy >= 0.0f && fx < 1.0f && fy < 1.0f) {
                const float *fp;
                unsigned char *cp;
                int x = (int)(fx * ibuf->x), y = (int)(fy * ibuf->y);
-               Image *image = ED_space_image(sima);
 
                CLAMP(x, 0, ibuf->x - 1);
                CLAMP(y, 0, ibuf->y - 1);
@@ -3250,12 +3274,29 @@ static int image_sample_line_exec(bContext *C, 
wmOperator *op)
        int x_end = RNA_int_get(op->ptr, "xend");
        int y_end = RNA_int_get(op->ptr, "yend");
 
+       float x1f, y1f, x2f, y2f;
+       UI_view2d_region_to_view(&ar->v2d, x_start, y_start, &x1f, &y1f);
+       UI_view2d_region_to_view(&ar->v2d, x_end, y_end, &x2f, &y2f);
+
+       /* If the image has tiles, shift the positions accordingly. */
+       Image *image = ED_space_image(sima);
+       int tile = 0, ix = 0, iy = 0;
+       if (image && image->source == IMA_SRC_UDIM) {
+               ix = (int) x1f;
+               iy = (int) y1f;
+               CLAMP(ix, 0, 9);
+
+               x1f -= ix;
+               x2f -= ix;
+               y1f -= iy;
+               y2f -= iy;
+               tile = 10*iy + ix;
+       }
+
        void *lock;
-       ImBuf *ibuf = ED_space_image_acquire_buffer(sima, &lock);
+       ImBuf *ibuf = ED_space_image_acquire_buffer(sima, &lock, tile);
        Histogram *hist = &sima->sample_line_hist;
 
-       float x1f, y1f, x2f, y2f;
-
        if (ibuf == NULL) {
                ED_space_image_release_buffer(sima, ibuf, lock);
                return OPERATOR_CANCELLED;
@@ -3266,13 +3307,12 @@ static int image_sample_line_exec(bContext *C, 
wmOperator *op)
                return OPERATOR_CANCELLED;
        }
 
-       UI_view2d_region_to_view(&ar->v2d, x_start, y_start, &x1f, &y1f);
-       UI_view2d_region_to_view(&ar->v2d, x_end, y_end, &x2f, &y2f);
-
        hist->co[0][0] = x1f;
        hist->co[0][1] = y1f;
        hist->co[1][0] = x2f;
        hist->co[1][1] = y2f;
+       hist->draw_offset[0] = ix;
+       hist->draw_offset[1] = iy;
 
        /* enable line drawing */
        hist->flag |= HISTO_FLAG_SAMPLELINE;
diff --git a/source/blender/editors/space_image/space_image.c 
b/source/blender/editors/space_image/space_image.c
index c143ebbcd67..5450f305a87 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -926,7 +926,8 @@ static void image_tools_region_draw(const bContext *C, 
ARegion *ar)
        SpaceImage *sima = CTX_wm_space_image(C);
        Scene *scene = CTX_data_scene(C);
        void *lock;
-       ImBuf *ibuf = ED_space_image_acquire_buffer(sima, &lock);
+       /* TODO(lukas): Support tiles in scopes? */
+       ImBuf *ibuf = ED_space_image_acquire_buffer(sima, &lock, 0);
        /* XXX performance regression if name of scopes category changes! */
        PanelCategoryStack *category = UI_panel_category_active_find(ar, 
"Scopes");
 
diff --git a/source/blender/m

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to