[Bf-blender-cvs] [39aa0062605] soc-2021-uv-editor-improvements: UV: Replace default grid with subdividing grid

Siddhartha Jejurkar noreply at git.blender.org
Wed Jun 30 08:33:26 CEST 2021


Commit: 39aa0062605635be64d5422e54fad2a4ec08d708
Author: Siddhartha Jejurkar
Date:   Wed Jun 30 11:55:18 2021 +0530
Branches: soc-2021-uv-editor-improvements
https://developer.blender.org/rB39aa0062605635be64d5422e54fad2a4ec08d708

UV: Replace default grid with subdividing grid

Replaces the default static grid with a dynamically subdividing grid.
This means that zooming in the UV editor will add more divisions to
the grid and vice versa when zooming out.

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

M	source/blender/draw/engines/overlay/overlay_grid.c
M	source/blender/draw/engines/overlay/overlay_private.h
M	source/blender/draw/engines/overlay/shaders/grid_frag.glsl

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

diff --git a/source/blender/draw/engines/overlay/overlay_grid.c b/source/blender/draw/engines/overlay/overlay_grid.c
index bd092062e9c..ab2dcb160b0 100644
--- a/source/blender/draw/engines/overlay/overlay_grid.c
+++ b/source/blender/draw/engines/overlay/overlay_grid.c
@@ -23,6 +23,7 @@
 #include "DRW_render.h"
 
 #include "DNA_camera_types.h"
+#include "DNA_screen_types.h"
 
 #include "DEG_depsgraph_query.h"
 
@@ -46,6 +47,7 @@ enum {
   GRID_BACK = (1 << 9),
   GRID_CAMERA = (1 << 10),
   PLANE_IMAGE = (1 << 11),
+  DYNAMIC_GRID = (1 << 12),
 };
 
 void OVERLAY_grid_init(OVERLAY_Data *vedata)
@@ -61,18 +63,38 @@ void OVERLAY_grid_init(OVERLAY_Data *vedata)
 
   if (pd->space_type == SPACE_IMAGE) {
     SpaceImage *sima = (SpaceImage *)draw_ctx->space_data;
+    View2D v2d = draw_ctx->region->v2d;
+
     shd->grid_flag = ED_space_image_has_buffer(sima) ? 0 : PLANE_IMAGE | SHOW_GRID;
     shd->grid_distance = 1.0f;
     copy_v3_fl3(
         shd->grid_size, (float)sima->tile_grid_shape[0], (float)sima->tile_grid_shape[1], 1.0f);
-    for (int step = 0; step < 8; step++) {
-      if (sima->flag & SI_DYNAMIC_GRID) {
+
+    /* For a NxN grid */
+    int N = 4;
+    float xzoom = (v2d.cur.xmax - v2d.cur.xmin) / ((float)(v2d.mask.xmax - v2d.mask.xmin));
+    float yzoom = (v2d.cur.ymax - v2d.cur.ymin) / ((float)(v2d.mask.ymax - v2d.mask.ymin));
+    /* Calculating average of xzoom and yzoom for accuracy. Using only xzoom or yzoom would have
+     * been sufficient */
+    shd->zoom_factor = (xzoom + yzoom) / 2.0f;
+    /* grid begins to appear when the length of one grid unit is at least
+     * (N^2) pixels in the UV/Image editor */
+    shd->zoom_factor *= (N * N);
+
+    printf("xzoom = %f\n", xzoom);
+    printf("zoom Factor = %f\n\n", shd->zoom_factor);
+
+    if (sima->flag & SI_DYNAMIC_GRID) {
+      shd->grid_flag |= DYNAMIC_GRID;
+      for (int step = 0; step < 8; step++) {
         /* Temporary fix : dynamic_grid_size is not using the default value (=1) assignd in RNA */
         sima->dynamic_grid_size = (sima->dynamic_grid_size == 0) ? 1 : sima->dynamic_grid_size;
         shd->grid_steps[step] = powf(1, step) * (1.0f / ((float)sima->dynamic_grid_size));
       }
-      else {
-        shd->grid_steps[step] = powf(4, step) * (1.0f / 16.0f);
+    }
+    else {
+      for (int step = 0; step < 8; step++) {
+        shd->grid_steps[step] = powf(N, step) * (1.0f / (powf(N, 8)));
       }
     }
     return;
@@ -245,6 +267,7 @@ void OVERLAY_grid_cache_init(OVERLAY_Data *vedata)
 
   grp = DRW_shgroup_create(sh, psl->grid_ps);
   DRW_shgroup_uniform_int(grp, "gridFlag", &shd->grid_flag, 1);
+  DRW_shgroup_uniform_float_copy(grp, "zoomFactor", shd->zoom_factor);
   DRW_shgroup_uniform_vec3(grp, "planeAxes", shd->grid_axes, 1);
   DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
   DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index a48b46a61fc..8c5c8613585 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -142,6 +142,7 @@ typedef struct OVERLAY_ShadingData {
   float grid_steps[8];
   float inv_viewport_size[2];
   float grid_line_size;
+  float zoom_factor; /* Length per pixel in the UV editor viewport */
   int grid_flag;
   int zpos_flag;
   int zneg_flag;
diff --git a/source/blender/draw/engines/overlay/shaders/grid_frag.glsl b/source/blender/draw/engines/overlay/shaders/grid_frag.glsl
index 3220adbff36..81e3f341a4f 100644
--- a/source/blender/draw/engines/overlay/shaders/grid_frag.glsl
+++ b/source/blender/draw/engines/overlay/shaders/grid_frag.glsl
@@ -15,6 +15,7 @@ uniform float lineKernel = 0.0;
 uniform sampler2D depthBuffer;
 
 uniform int gridFlag;
+uniform float zoomFactor;
 
 #define STEPS_LEN 8
 uniform float gridSteps[STEPS_LEN] = float[](0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0, 10000.0);
@@ -28,6 +29,8 @@ uniform float gridSteps[STEPS_LEN] = float[](0.001, 0.01, 0.1, 1.0, 10.0, 100.0,
 #define PLANE_YZ (1 << 6)
 #define GRID_BACK (1 << 9)    /* grid is behind objects */
 #define GRID_CAMERA (1 << 10) /* In camera view */
+#define PLANE_IMAGE (1 << 11) /* For UV/Image Image editor */
+#define DYNAMIC_GRID (1 << 12) /* Dynamic grid is used in the UV/Image Editor */
 
 #define M_1_SQRTPI 0.5641895835477563 /* 1/sqrt(pi) */
 
@@ -122,9 +125,17 @@ void main()
      * would be more accurate, but not really necessary. */
     float grid_res = dot(dFdxPos, screenVecs[0].xyz);
 
-    /* The gride begins to appear when it comprises 4 pixels */
+    /* The grid begins to appear when it comprises 4 pixels */
     grid_res *= 4;
 
+    /* For UV/Image editor use zoomFactor */
+    if((gridFlag & PLANE_IMAGE) != 0 && (gridFlag & DYNAMIC_GRID) == 0)
+    {/* grid begins to appear when the length of one grid unit is at least
+      * (N^2) pixels in the UV/Image editor.
+      * Value of N defined in overlay_grid.c */
+      grid_res = zoomFactor;
+    }
+
     /* from biggest to smallest */
     vec4 scale;
 #if 0



More information about the Bf-blender-cvs mailing list