diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-03-27 15:01:25 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-03-27 15:01:47 +0300 |
commit | b33693cb44e8a1bde1933d2a516b3ed54c8021ea (patch) | |
tree | 7d62eb5b5a2a19ce1690984887b0989bd41f8a53 | |
parent | deda6a43fc710f30ceb9e3b30d1f8d79180fe8d1 (diff) |
New Grid: small modification
Fix wrong coord picked when display only one axis.
Small optimizations here and there.
-rw-r--r-- | source/blender/draw/modes/object_mode.c | 8 | ||||
-rw-r--r-- | source/blender/draw/modes/shaders/object_grid_frag.glsl | 32 | ||||
-rw-r--r-- | source/blender/draw/modes/shaders/object_grid_vert.glsl | 2 |
3 files changed, 20 insertions, 22 deletions
diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index cfea5b030f6..5be50cfa5cd 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -167,7 +167,7 @@ static struct { struct GPUShader *outline_fade_sh; struct GPUShader *grid_sh; float camera_pos[3]; - float grid_settings[4]; + float grid_settings[5]; float grid_mat[4][4]; int grid_flag; int zpos_flag; @@ -322,7 +322,7 @@ static void OBJECT_engine_init(void *vedata) mul_m4_v4(viewinvmat, zvec); /* z axis : chose the most facing plane */ - if (fabsf(zvec[0]) > fabsf(zvec[1])) { + if (fabsf(zvec[0]) < fabsf(zvec[1])) { e_data.zpos_flag |= (PLANE_XZ | SHOW_AXIS_X); } else { @@ -344,7 +344,7 @@ static void OBJECT_engine_init(void *vedata) } } else { - e_data.zneg_flag = e_data.zpos_flag = 0; + e_data.zneg_flag = e_data.zpos_flag = CLIP_ZNEG | CLIP_ZPOS; } winmat[3][2] -= offs; @@ -354,6 +354,7 @@ static void OBJECT_engine_init(void *vedata) e_data.grid_settings[1] = grid_res; /* gridResolution */ e_data.grid_settings[2] = grid_scale; /* gridScale */ e_data.grid_settings[3] = v3d->gridsubdiv; /* gridSubdiv */ + e_data.grid_settings[4] = (v3d->gridsubdiv > 1) ? 1.0f / log(v3d->gridsubdiv) : 0.0; /* 1/log(gridSubdiv) */ } } @@ -509,6 +510,7 @@ static void OBJECT_cache_init(void *vedata) DRW_shgroup_uniform_mat4(grp, "ViewProjectionOffsetMatrix", (float *)e_data.grid_mat); DRW_shgroup_uniform_vec3(grp, "cameraPos", e_data.camera_pos, 1); DRW_shgroup_uniform_vec4(grp, "gridSettings", e_data.grid_settings, 1); + DRW_shgroup_uniform_float(grp, "gridOneOverLogSubdiv", &e_data.grid_settings[4], 1); DRW_shgroup_uniform_block(grp, "globalsBlock", globals_ubo, 0); DRW_shgroup_call_add(grp, quad, NULL); diff --git a/source/blender/draw/modes/shaders/object_grid_frag.glsl b/source/blender/draw/modes/shaders/object_grid_frag.glsl index 8b890ea8692..0c5a1175052 100644 --- a/source/blender/draw/modes/shaders/object_grid_frag.glsl +++ b/source/blender/draw/modes/shaders/object_grid_frag.glsl @@ -9,6 +9,7 @@ out vec4 FragColor; uniform mat4 ProjectionMatrix; uniform vec3 cameraPos; uniform vec4 gridSettings; +uniform float gridOneOverLogSubdiv; #define gridDistance gridSettings.x #define gridResolution gridSettings.y @@ -56,26 +57,21 @@ void main() { vec3 fwidthCos = fwidth(wPos); - float fade, grid_res; + float dist, fade; /* if persp */ if (ProjectionMatrix[3][3] == 0.0) { - float dist = distance(cameraPos, wPos); - float dist_norm = dist / (2.0 * gridDistance); - grid_res = log(dist * gridResolution) / log(gridSubdiv); + dist = distance(cameraPos, wPos); fade = 1.0 - smoothstep(0.0, gridDistance, dist - gridDistance); } else { - float dist = abs(gl_FragCoord.z * 2.0 - 1.0); - grid_res = log(gridResolution) / log(gridSubdiv); + dist = abs(gl_FragCoord.z * 2.0 - 1.0); fade = 1.0 - smoothstep(0.0, 0.5, dist - 0.5); - } - - /* fix division by 0 (log(1) = 0) */ - if (gridSubdiv == 1.0) { - grid_res = 0.0; + dist = 1.0; /* avoid branch after */ } if ((gridFlag & GRID) > 0) { + float grid_res = log(dist * gridResolution) * gridOneOverLogSubdiv; + float blend = fract(-max(grid_res, 0.0)); float lvl = floor(grid_res); @@ -98,27 +94,27 @@ void main() if ((gridFlag & AXIS_X) > 0) { float xAxis; - if ((gridFlag & AXIS_Y) > 0) { - xAxis = axis(wPos.y, fwidthCos.y, 0.1); + if ((gridFlag & PLANE_XZ) > 0) { + xAxis = axis(wPos.z, fwidthCos.z, 0.1); } else { - xAxis = axis(wPos.z, fwidthCos.z, 0.1); + xAxis = axis(wPos.y, fwidthCos.y, 0.1); } FragColor = mix(FragColor, colorGridAxisX, xAxis); } if ((gridFlag & AXIS_Y) > 0) { float yAxis; - if ((gridFlag & AXIS_X) > 0) { - yAxis = axis(wPos.x, fwidthCos.x, 0.1); + if ((gridFlag & PLANE_YZ) > 0) { + yAxis = axis(wPos.z, fwidthCos.z, 0.1); } else { - yAxis = axis(wPos.z, fwidthCos.z, 0.1); + yAxis = axis(wPos.x, fwidthCos.x, 0.1); } FragColor = mix(FragColor, colorGridAxisY, yAxis); } if ((gridFlag & AXIS_Z) > 0) { float zAxis; - if ((gridFlag & AXIS_Y) > 0) { + if ((gridFlag & PLANE_YZ) > 0) { zAxis = axis(wPos.y, fwidthCos.y, 0.1); } else { diff --git a/source/blender/draw/modes/shaders/object_grid_vert.glsl b/source/blender/draw/modes/shaders/object_grid_vert.glsl index 5127bd81474..2da8e45c560 100644 --- a/source/blender/draw/modes/shaders/object_grid_vert.glsl +++ b/source/blender/draw/modes/shaders/object_grid_vert.glsl @@ -57,7 +57,7 @@ void main() if ((gridFlag & CLIP_Z_POS) > 0) { realPos.z = max(realPos.z, 0.0); } - else if ((gridFlag & CLIP_Z_NEG) > 0) { + if ((gridFlag & CLIP_Z_NEG) > 0) { realPos.z = min(realPos.z, 0.0); } |