Commit: 89c0dc4ebdb8e07865c780664159cc0fb12e0653
Author: Lukas Stockner
Date:   Sun Jun 10 23:14:07 2018 +0200
Branches: temp-udim-images
https://developer.blender.org/rB89c0dc4ebdb8e07865c780664159cc0fb12e0653

Implement basic UDIM grid drawing

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

M       source/blender/blenfont/BLF_api.h
M       source/blender/blenfont/intern/blf.c
M       source/blender/editors/include/ED_screen.h
M       source/blender/editors/screen/area.c
M       source/blender/editors/space_clip/clip_draw.c
M       source/blender/editors/space_image/image_draw.c

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

diff --git a/source/blender/blenfont/BLF_api.h 
b/source/blender/blenfont/BLF_api.h
index 90c0016d0ed..f7a88ee4a11 100644
--- a/source/blender/blenfont/BLF_api.h
+++ b/source/blender/blenfont/BLF_api.h
@@ -74,6 +74,7 @@ void BLF_size(int fontid, int size, int dpi);
 void BLF_color4ubv(int fontid, const unsigned char rgba[4]);
 void BLF_color3ubv(int fontid, const unsigned char rgb[3]);
 void BLF_color3ubv_alpha(int fontid, const unsigned char rgb[3], unsigned char 
alpha);
+void BLF_color4ub(int fontid, unsigned char r, unsigned char g, unsigned char 
b, unsigned char alpha);
 void BLF_color3ub(int fontid, unsigned char r, unsigned char g, unsigned char 
b);
 void BLF_color4f(int fontid, float r, float g, float b, float a);
 void BLF_color4fv(int fontid, const float rgba[4]);
diff --git a/source/blender/blenfont/intern/blf.c 
b/source/blender/blenfont/intern/blf.c
index 5dd692d3855..1b397ee70eb 100644
--- a/source/blender/blenfont/intern/blf.c
+++ b/source/blender/blenfont/intern/blf.c
@@ -513,6 +513,18 @@ void BLF_color3ub(int fontid, unsigned char r, unsigned 
char g, unsigned char b)
        }
 }
 
+void BLF_color4ub(int fontid, unsigned char r, unsigned char g, unsigned char 
b, unsigned char alpha)
+{
+       FontBLF *font = blf_get(fontid);
+
+       if (font) {
+               font->color[0] = r;
+               font->color[1] = g;
+               font->color[2] = b;
+               font->color[3] = alpha;
+       }
+}
+
 void BLF_color4fv(int fontid, const float rgba[4])
 {
        FontBLF *font = blf_get(fontid);
diff --git a/source/blender/editors/include/ED_screen.h 
b/source/blender/editors/include/ED_screen.h
index cd1fb1f91d8..397feb07f03 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -91,7 +91,7 @@ void    ED_region_visibility_change_update(struct bContext 
*C, struct ARegion *a
 void    ED_region_info_draw(struct ARegion *ar, const char *text, float 
fill_color[4], const bool full_redraw);
 void    ED_region_info_draw_multiline(ARegion *ar, const char *text_array[], 
float fill_color[4], const bool full_redraw);
 void    ED_region_image_metadata_draw(int x, int y, struct ImBuf *ibuf, const 
rctf *frame, float zoomx, float zoomy);
-void    ED_region_grid_draw(struct ARegion *ar, float zoomx, float zoomy);
+void    ED_region_grid_draw(struct ARegion *ar, float zoomx, float zoomy, 
float x0, float y0);
 float  ED_region_blend_alpha(struct ARegion *ar);
 void   ED_region_visible_rect(struct ARegion *ar, struct rcti *rect);
 bool    ED_region_is_overlap(int spacetype, int regiontype);
diff --git a/source/blender/editors/screen/area.c 
b/source/blender/editors/screen/area.c
index b4d932d3272..c0b9db1c369 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -2561,15 +2561,15 @@ void ED_region_image_metadata_draw(int x, int y, ImBuf 
*ibuf, const rctf *frame,
        gpuPopMatrix();
 }
 
-void ED_region_grid_draw(ARegion *ar, float zoomx, float zoomy)
+void ED_region_grid_draw(ARegion *ar, float zoomx, float zoomy, float x0, 
float y0)
 {
        float gridsize, gridstep = 1.0f / 32.0f;
        float fac, blendfac;
        int x1, y1, x2, y2;
 
-       /* the image is located inside (0, 0), (1, 1) as set by view2d */
-       UI_view2d_view_to_region(&ar->v2d, 0.0f, 0.0f, &x1, &y1);
-       UI_view2d_view_to_region(&ar->v2d, 1.0f, 1.0f, &x2, &y2);
+       /* the image is located inside (x0, y0), (x0+1, y0+1) as set by view2d 
*/
+       UI_view2d_view_to_region(&ar->v2d, x0,      y0,      &x1, &y1);
+       UI_view2d_view_to_region(&ar->v2d, x0+1.0f, y0+1.0f, &x2, &y2);
 
        Gwn_VertFormat *format = immVertexFormat();
        unsigned int pos = GWN_vertformat_attr_add(format, "pos", GWN_COMP_F32, 
2, GWN_FETCH_FLOAT);
diff --git a/source/blender/editors/space_clip/clip_draw.c 
b/source/blender/editors/space_clip/clip_draw.c
index 5962bfe33f3..77d71b83a97 100644
--- a/source/blender/editors/space_clip/clip_draw.c
+++ b/source/blender/editors/space_clip/clip_draw.c
@@ -1789,7 +1789,7 @@ void clip_draw_main(const bContext *C, SpaceClip *sc, 
ARegion *ar)
 
        /* if no clip, nothing to do */
        if (!clip) {
-               ED_region_grid_draw(ar, zoomx, zoomy);
+               ED_region_grid_draw(ar, zoomx, zoomy, 0.0f, 0.0f);
                return;
        }
 
@@ -1835,7 +1835,7 @@ void clip_draw_main(const bContext *C, SpaceClip *sc, 
ARegion *ar)
                draw_movieclip_muted(ar, width, height, zoomx, zoomy);
        }
        else {
-               ED_region_grid_draw(ar, zoomx, zoomy);
+               ED_region_grid_draw(ar, zoomx, zoomy, 0.0f, 0.0f);
        }
 
        if (width && height) {
diff --git a/source/blender/editors/space_image/image_draw.c 
b/source/blender/editors/space_image/image_draw.c
index c5b9e236030..bd008e4b392 100644
--- a/source/blender/editors/space_image/image_draw.c
+++ b/source/blender/editors/space_image/image_draw.c
@@ -632,6 +632,81 @@ static void draw_image_paint_helpers(const bContext *C, 
ARegion *ar, Scene *scen
        }
 }
 
+static bool draw_image_udim_grid(ARegion *ar, SpaceImage *sima, float zoomx, 
float zoomy, bool draw_tilegrids)
+{
+    Image *ima = ED_space_image(sima);
+
+       int num_col = max_ii(ima->num_tiles, 10);
+       int num_row = 1 + (ima->num_tiles / 10);
+
+    const int xmin = MAX2(floor(ar->v2d.cur.xmin), 0);
+    const int ymin = MAX2(floor(ar->v2d.cur.ymin), 0);
+    const int xmax = MIN2(ceil(ar->v2d.cur.xmax), num_col);
+    const int ymax = MIN2(ceil(ar->v2d.cur.ymax), num_row);
+
+    float stepx = BLI_rcti_size_x(&ar->v2d.mask) / 
BLI_rctf_size_x(&ar->v2d.cur);
+    float stepy = BLI_rcti_size_y(&ar->v2d.mask) / 
BLI_rctf_size_y(&ar->v2d.cur);
+
+    float x1, y1;
+    UI_view2d_view_to_region_fl(&ar->v2d, 0.0f, 0.0f, &x1, &y1);
+
+    if (draw_tilegrids) {
+        for (int y = ymin; y < ymax; y++) {
+            for (int x = xmin; x < xmax; x++) {
+                ED_region_grid_draw(ar, zoomx, zoomy, x, y);
+            }
+        }
+    }
+
+       Gwn_VertFormat *format = immVertexFormat();
+       unsigned int pos = GWN_vertformat_attr_add(format, "pos", GWN_COMP_F32, 
2, GWN_FETCH_FLOAT);
+       unsigned color = GWN_vertformat_attr_add(format, "color", GWN_COMP_F32, 
3, GWN_FETCH_FLOAT);
+
+       immBindBuiltinProgram(GPU_SHADER_2D_FLAT_COLOR);
+       immBegin(GWN_PRIM_LINES, 4 * (xmax - xmin + 1) + 4 * (ymax - ymin + 1));
+       float theme_color[3];
+       UI_GetThemeColorShade3fv(TH_BACK, 20.0f, theme_color);
+
+    for (int x = xmin; x <= xmax; x++) {
+               immAttrib3fv(color, theme_color);
+               immVertex2f(pos, x1 + x*stepx, y1 + ymin*stepy);
+               immAttrib3fv(color, theme_color);
+               immVertex2f(pos, x1 + x*stepx, y1 + ymax*stepy);
+    }
+    for (int y = ymin; y <= ymax; y++) {
+               immAttrib3fv(color, theme_color);
+               immVertex2f(pos, x1 + xmin*stepx, y1 + y*stepy);
+               immAttrib3fv(color, theme_color);
+               immVertex2f(pos, x1 + xmax*stepx, y1 + y*stepy);
+    }
+
+       immEnd();
+       immUnbindProgram();
+
+       glEnable(GL_BLEND);
+       glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, 
GL_ONE_MINUS_SRC_ALPHA);
+    BLF_size(blf_mono_font, 25 * U.pixelsize, U.dpi);
+
+    char id[256];
+    for (int y = ymin; y < ymax; y++) {
+        for (int x = xmin; x < xmax; x++) {
+            BLI_snprintf(id, sizeof(id), "%d", 1001 + y*10 + x);
+            int textwidth = BLF_width(blf_mono_font, id, sizeof(id)) + 10;
+            float opacity;
+            if (textwidth < 0.5f*(stepx - 10)) opacity = 1.0f;
+            else if (textwidth < (stepx - 10)) opacity = 2.0f - 
2.0f*(textwidth / (stepx - 10));
+            else opacity = 0.0f;
+                       BLF_color4ub(blf_mono_font, 220, 220, 220, 150*opacity);
+            BLF_position(blf_mono_font, (int) (x1 + x*stepx + 10), (int) (y1 + 
y*stepy + 10), 0);
+            BLF_draw_ascii(blf_mono_font, id, sizeof(id));
+        }
+    }
+
+       glDisable(GL_BLEND);
+
+    return true;
+}
+
 /* draw main image region */
 
 void draw_image_main(const bContext *C, ARegion *ar)
@@ -695,7 +770,12 @@ void draw_image_main(const bContext *C, ARegion *ar)
 
        /* draw the image or grid */
        if (ibuf == NULL) {
-               ED_region_grid_draw(ar, zoomx, zoomy);
+               if (ima && ima->source == IMA_SRC_UDIM) {
+                       draw_image_udim_grid(ar, sima, zoomx, zoomy, true);
+               }
+               else {
+                       ED_region_grid_draw(ar, zoomx, zoomy, 0.0f, 0.0f);
+               }
        }
        else {
                draw_image_buffer(C, sima, ar, scene, ibuf, 0.0f, 0.0f, zoomx, 
zoomy);
@@ -726,6 +806,7 @@ 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);
        }
 
        /* paint helpers */

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

Reply via email to