diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-03-25 04:46:23 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-03-25 21:11:01 +0300 |
commit | 0495e689e60c313e039b09468307dcbab2a7ae1c (patch) | |
tree | 6fbac1eb94633bd3e76aca6c4bb78845161f362c /source/blender/draw/modes/shaders/object_grid_vert.glsl | |
parent | d2c94c78736e84c1318859c8e902b3ee622fd6f0 (diff) |
New Grid : Feature parity with old grid.
Removed infinite details and went for decreasing details with the distance instead (like the axis aligned ortho view auto sized grid).
Separate drawing of the Z axis into 2 pass (using shading group) to render ordered transparency with the main grid pass.
Diffstat (limited to 'source/blender/draw/modes/shaders/object_grid_vert.glsl')
-rw-r--r-- | source/blender/draw/modes/shaders/object_grid_vert.glsl | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/source/blender/draw/modes/shaders/object_grid_vert.glsl b/source/blender/draw/modes/shaders/object_grid_vert.glsl index 3c6f0a3bd25..5127bd81474 100644 --- a/source/blender/draw/modes/shaders/object_grid_vert.glsl +++ b/source/blender/draw/modes/shaders/object_grid_vert.glsl @@ -3,6 +3,22 @@ * Clément Foucault */ uniform mat4 ViewProjectionOffsetMatrix; +uniform mat4 ProjectionMatrix; +uniform vec3 cameraPos; +uniform vec4 gridSettings; + +#define gridDistance gridSettings.x +#define gridResolution gridSettings.y +#define gridScale gridSettings.z +#define gridSubdiv gridSettings.w + +uniform int gridFlag; + +#define PLANE_XY (1 << 4) +#define PLANE_XZ (1 << 5) +#define PLANE_YZ (1 << 6) +#define CLIP_Z_POS (1 << 7) +#define CLIP_Z_NEG (1 << 8) in vec3 pos; @@ -10,7 +26,41 @@ out vec3 wPos; void main() { - vec3 realPos = pos * 1e3; + vec3 vert_pos, proj_camera_pos; + + /* Project camera pos to the needed plane */ + if ((gridFlag & PLANE_XY) > 0) { + vert_pos = vec3(pos.x, pos.y, 0.0); + proj_camera_pos = vec3(cameraPos.x, cameraPos.y, 0.0); + } + else if ((gridFlag & PLANE_XZ) > 0) { + vert_pos = vec3(pos.x, 0.0, pos.y); + proj_camera_pos = vec3(cameraPos.x, 0.0, cameraPos.z); + } + else { + vert_pos = vec3(0.0, pos.x, pos.y); + proj_camera_pos = vec3(0.0, cameraPos.y, cameraPos.z); + } + + /* if persp */ + if (ProjectionMatrix[3][3] == 0.0) { + vert_pos *= gridDistance * 2.0; + } + else { + float viewdist = 1.0f / min(abs(ProjectionMatrix[0][0]), abs(ProjectionMatrix[1][1])); + vert_pos *= viewdist * gridDistance * 2.0; + } + + vec3 realPos = proj_camera_pos + vert_pos; + + /* Used for additional Z axis */ + if ((gridFlag & CLIP_Z_POS) > 0) { + realPos.z = max(realPos.z, 0.0); + } + else if ((gridFlag & CLIP_Z_NEG) > 0) { + realPos.z = min(realPos.z, 0.0); + } + gl_Position = ViewProjectionOffsetMatrix * vec4(realPos, 1.0); wPos = realPos; } |