[Bf-blender-cvs] [b7328397aa7] temp-gpu-image-engine: Fix border for tiled images.

Jeroen Bakker noreply at git.blender.org
Mon Dec 6 15:40:51 CET 2021


Commit: b7328397aa74da38686f0774b76aa6d058909c0e
Author: Jeroen Bakker
Date:   Mon Dec 6 15:39:22 2021 +0100
Branches: temp-gpu-image-engine
https://developer.blender.org/rBb7328397aa74da38686f0774b76aa6d058909c0e

Fix border for tiled images.

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

M	source/blender/draw/engines/image/image_drawing_mode_screen_space.hh
M	source/blender/draw/engines/image/image_private.hh
M	source/blender/draw/engines/image/shaders/engine_image_frag.glsl

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

diff --git a/source/blender/draw/engines/image/image_drawing_mode_screen_space.hh b/source/blender/draw/engines/image/image_drawing_mode_screen_space.hh
index 64e44bc6f11..3dcf271b07a 100644
--- a/source/blender/draw/engines/image/image_drawing_mode_screen_space.hh
+++ b/source/blender/draw/engines/image/image_drawing_mode_screen_space.hh
@@ -255,6 +255,7 @@ class ScreenSpaceDrawingMode : public AbstractDrawingMode {
     DRW_shgroup_uniform_vec4_copy(shgrp, "shuffle", sh_params.shuffle);
     DRW_shgroup_uniform_int_copy(shgrp, "drawFlags", sh_params.flags);
     DRW_shgroup_uniform_bool_copy(shgrp, "imgPremultiplied", sh_params.use_premul_alpha);
+    DRW_shgroup_uniform_vec2_copy(shgrp, "maxUv", pd->screen_space.max_uv);
     float image_mat[4][4];
     unit_m4(image_mat);
     for (int i = 0; i < SCREEN_SPACE_DRAWING_MODE_TEXTURE_LEN; i++) {
@@ -612,6 +613,15 @@ class ScreenSpaceDrawingMode : public AbstractDrawingMode {
       partial_update_allocate(pd, image);
     }
 
+    copy_v2_fl2(pd->screen_space.max_uv, 1.0f, 1.0);
+    LISTBASE_FOREACH (ImageTile *, image_tile, &image->tiles) {
+      ImageTileAccessor image_tile_accessor(image_tile);
+      pd->screen_space.max_uv[0] = max_ii(pd->screen_space.max_uv[0],
+                                          image_tile_accessor.get_tile_x_offset() + 1);
+      pd->screen_space.max_uv[1] = max_ii(pd->screen_space.max_uv[1],
+                                          image_tile_accessor.get_tile_y_offset() + 1);
+    }
+
     // Step: Find out which screen space textures are needed to draw on the screen. Remove the
     // screen space textures that aren't needed.
     const ARegion *region = draw_ctx->region;
diff --git a/source/blender/draw/engines/image/image_private.hh b/source/blender/draw/engines/image/image_private.hh
index c95e063fc69..78c29d673ad 100644
--- a/source/blender/draw/engines/image/image_private.hh
+++ b/source/blender/draw/engines/image/image_private.hh
@@ -95,6 +95,7 @@ struct IMAGE_PrivateData {
      * set in the space.
      */
     bool do_tile_drawing : 1;
+
   } flags;
 
   /* Data used in screen space drawing mode. */
@@ -104,6 +105,12 @@ struct IMAGE_PrivateData {
     struct PartialUpdateUser *partial_update_user;
     const struct Image *partial_update_image;
     IMAGE_ScreenSpaceTextureInfo texture_infos[SCREEN_SPACE_DRAWING_MODE_TEXTURE_LEN];
+
+    /**
+     * \brief Maximum uv's that are on the border of the image.
+     *
+     * Larger UV coordinates would be drawn as a border. */
+    float max_uv[2];
   } screen_space;
 };
 
diff --git a/source/blender/draw/engines/image/shaders/engine_image_frag.glsl b/source/blender/draw/engines/image/shaders/engine_image_frag.glsl
index c48ad42016e..7cfab8dbff3 100644
--- a/source/blender/draw/engines/image/shaders/engine_image_frag.glsl
+++ b/source/blender/draw/engines/image/shaders/engine_image_frag.glsl
@@ -15,6 +15,9 @@ uniform vec2 farNearDistances;
 uniform vec4 color;
 uniform vec4 shuffle;
 
+/* Maximum UV range. UV coordinates beyond would draw a border. */
+uniform vec2 maxUv;
+
 #define FAR_DISTANCE farNearDistances.x
 #define NEAR_DISTANCE farNearDistances.y
 
@@ -28,7 +31,8 @@ out vec4 fragColor;
 
 bool is_border(vec2 uv)
 {
-  return (uv.x < 0.0 || uv.y < 0.0 || uv.x > 1.0 || uv.y > 1.0);
+  // TODO: should use bvec to reduce branching?
+  return (uv.x < 0.0 || uv.y < 0.0 || uv.x > maxUv.x || uv.y > maxUv.y);
 }
 
 void main()



More information about the Bf-blender-cvs mailing list