Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/draw/intern/draw_cache.c43
-rw-r--r--source/blender/draw/intern/draw_cache.h1
-rw-r--r--source/blender/draw/modes/object_mode.c8
-rw-r--r--source/blender/draw/modes/shaders/object_grid_frag.glsl10
4 files changed, 53 insertions, 9 deletions
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index 412ad72207e..03c3e1ff16e 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -53,6 +53,7 @@ static struct DRWShapeCache {
GPUBatch *drw_fullscreen_quad;
GPUBatch *drw_fullscreen_quad_texcoord;
GPUBatch *drw_quad;
+ GPUBatch *drw_grid;
GPUBatch *drw_sphere;
GPUBatch *drw_screenspace_circle;
GPUBatch *drw_plain_axes;
@@ -322,6 +323,48 @@ GPUBatch *DRW_cache_quad_get(void)
return SHC.drw_quad;
}
+/* Grid */
+GPUBatch *DRW_cache_grid_get(void)
+{
+ if (!SHC.drw_grid) {
+ /* Position Only 2D format */
+ static GPUVertFormat format = { 0 };
+ static struct { uint pos; } attr_id;
+ if (format.attr_len == 0) {
+ attr_id.pos = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+ }
+
+ GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format);
+ GPU_vertbuf_data_alloc(vbo, 8 * 8 * 2 * 3);
+
+ uint v_idx = 0;
+ for (int i = 0; i < 8; ++i) {
+ for (int j = 0; j < 8; ++j) {
+ float pos0[2] = {(float)i / 8.0f, (float)j / 8.0f};
+ float pos1[2] = {(float)(i+1) / 8.0f, (float)j / 8.0f};
+ float pos2[2] = {(float)i / 8.0f, (float)(j+1) / 8.0f};
+ float pos3[2] = {(float)(i+1) / 8.0f, (float)(j+1) / 8.0f};
+
+ madd_v2_v2v2fl(pos0, (float[2]){-1.0f, -1.0f}, pos0, 2.0f);
+ madd_v2_v2v2fl(pos1, (float[2]){-1.0f, -1.0f}, pos1, 2.0f);
+ madd_v2_v2v2fl(pos2, (float[2]){-1.0f, -1.0f}, pos2, 2.0f);
+ madd_v2_v2v2fl(pos3, (float[2]){-1.0f, -1.0f}, pos3, 2.0f);
+
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, pos0);
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, pos1);
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, pos2);
+
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, pos2);
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, pos1);
+ GPU_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, pos3);
+ }
+ }
+
+ SHC.drw_grid = GPU_batch_create_ex(GPU_PRIM_TRIS, vbo, NULL, GPU_BATCH_OWNS_VBO);
+ }
+ return SHC.drw_grid;
+}
+
/* Sphere */
GPUBatch *DRW_cache_sphere_get(void)
{
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index eb75c685ec0..08c93010700 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -39,6 +39,7 @@ void DRW_shape_cache_reset(void);
struct GPUBatch *DRW_cache_cursor_get(bool crosshair_lines);
/* Common Shapes */
+struct GPUBatch *DRW_cache_grid_get(void);
struct GPUBatch *DRW_cache_fullscreen_quad_get(void);
struct GPUBatch *DRW_cache_quad_get(void);
struct GPUBatch *DRW_cache_cube_get(void);
diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c
index 934b9ada99f..3ae0bec77b2 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -1042,7 +1042,7 @@ static void OBJECT_cache_init(void *vedata)
DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND;
psl->grid = DRW_pass_create("Infinite Grid Pass", state);
- struct GPUBatch *quad = DRW_cache_fullscreen_quad_get();
+ struct GPUBatch *geom = DRW_cache_grid_get();
static float mat[4][4];
unit_m4(mat);
@@ -1058,7 +1058,7 @@ static void OBJECT_cache_init(void *vedata)
DRW_shgroup_uniform_block(grp, "globalsBlock", globals_ubo);
DRW_shgroup_uniform_vec2(grp, "viewportSize", DRW_viewport_size_get(), 1);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
- DRW_shgroup_call_add(grp, quad, mat);
+ DRW_shgroup_call_add(grp, geom, mat);
grp = DRW_shgroup_create(e_data.grid_sh, psl->grid);
DRW_shgroup_uniform_int(grp, "gridFlag", &e_data.grid_flag, 1);
@@ -1066,7 +1066,7 @@ static void OBJECT_cache_init(void *vedata)
DRW_shgroup_uniform_vec3(grp, "planeAxes", e_data.grid_axes, 1);
DRW_shgroup_uniform_block(grp, "globalsBlock", globals_ubo);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
- DRW_shgroup_call_add(grp, quad, mat);
+ DRW_shgroup_call_add(grp, geom, mat);
grp = DRW_shgroup_create(e_data.grid_sh, psl->grid);
DRW_shgroup_uniform_int(grp, "gridFlag", &e_data.zpos_flag, 1);
@@ -1074,7 +1074,7 @@ static void OBJECT_cache_init(void *vedata)
DRW_shgroup_uniform_vec3(grp, "planeAxes", e_data.zplane_axes, 1);
DRW_shgroup_uniform_block(grp, "globalsBlock", globals_ubo);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth);
- DRW_shgroup_call_add(grp, quad, mat);
+ DRW_shgroup_call_add(grp, geom, mat);
}
for (int i = 0; i < 2; ++i) {
diff --git a/source/blender/draw/modes/shaders/object_grid_frag.glsl b/source/blender/draw/modes/shaders/object_grid_frag.glsl
index 82780e0cddc..06369e80c8d 100644
--- a/source/blender/draw/modes/shaders/object_grid_frag.glsl
+++ b/source/blender/draw/modes/shaders/object_grid_frag.glsl
@@ -1,6 +1,6 @@
/* Infinite grid
- * Clément Foucault */
+ * Author: Clément Foucault */
out vec4 FragColor;
@@ -209,6 +209,9 @@ void main()
}
}
+ /* Add a small bias so the grid will always
+ * be on top of a mesh with the same depth. */
+ float grid_depth = gl_FragCoord.z - 6e-8 - fwidth(gl_FragCoord.z);
float scene_depth = texture(depthBuffer, sPos).r;
if ((gridFlag & GRID_BACK) != 0) {
fade *= (scene_depth == 1.0) ? 1.0 : 0.0;
@@ -217,12 +220,9 @@ void main()
/* Manual, non hard, depth test:
* Progressively fade the grid below occluders
* (avoids poping visuals due to depth buffer precision) */
- /* Add a small bias so the grid will always
- * be on top of a mesh with the same depth. */
- float grid_depth = gl_FragCoord.z - 1e-8;
/* Harder settings tend to flicker more,
* but have less "see through" appearance. */
- const float test_hardness = 1e4;
+ const float test_hardness = 1e7;
fade *= 1.0 - clamp((grid_depth - scene_depth) * test_hardness, 0.0, 1.0);
}