diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2019-12-02 03:40:58 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2019-12-02 15:15:52 +0300 |
commit | 9516921c05bd9fee5c94942eb8e38f47ba7e4351 (patch) | |
tree | da007fc17bc6a02f849dae2e8f76f5ab304fe4dc /source/blender/draw/modes/shaders | |
parent | 1f6c3699a836d485ed37f443cd0fcd19e978dbb6 (diff) |
Overlay Engine: Refactor & Cleanup
This is the unification of all overlays into one overlay engine as described in T65347.
I went over all the code making it more future proof with less hacks and removing old / not relevent parts.
Goals / Acheivements:
- Remove internal shader usage (only drw shaders)
- Remove viewportSize and viewportSizeInv and put them in gloabl ubo
- Fixed some drawing issues: Missing probe option and Missing Alt+B clipping of some shader
- Remove old (legacy) shaders dependancy (not using view UBO).
- Less shader variation (less compilation time at first load and less patching needed for vulkan)
- removed some geom shaders when I could
- Remove static e_data (except shaders storage where it is OK)
- Clear the way to fix some anoying limitations (dithered transparency, background image compositing etc...)
- Wireframe drawing now uses the same batching capabilities as workbench & eevee (indirect drawing).
- Reduced complexity, removed ~3000 Lines of code in draw (also removed a lot of unused shader in GPU).
- Post AA to avoid complexity and cost of MSAA.
Remaining issues:
- ~~Armature edits, overlay toggles, (... others?) are not refreshing viewport after AA is complete~~
- FXAA is not the best for wires, maybe investigate SMAA
- Maybe do something more temporally stable for AA.
- ~~Paint overlays are not working with AA.~~
- ~~infront objects are difficult to select.~~
- ~~the infront wires sometimes goes through they solid counterpart (missing clear maybe?) (toggle overlays on-off when using infront+wireframe overlay in solid shading)~~
Note: I made some decision to change slightly the appearance of some objects to simplify their drawing. Namely the empty arrows end (which is now hollow/wire) and distance points of the cameras/spots being done by lines.
Reviewed By: jbakker
Differential Revision: https://developer.blender.org/D6296
Diffstat (limited to 'source/blender/draw/modes/shaders')
85 files changed, 0 insertions, 4980 deletions
diff --git a/source/blender/draw/modes/shaders/animviz_mpath_lines_geom.glsl b/source/blender/draw/modes/shaders/animviz_mpath_lines_geom.glsl deleted file mode 100644 index b81f9f639ca..00000000000 --- a/source/blender/draw/modes/shaders/animviz_mpath_lines_geom.glsl +++ /dev/null @@ -1,42 +0,0 @@ - -layout(lines) in; -layout(triangle_strip, max_vertices = 4) out; - -uniform mat4 ProjectionMatrix; -uniform vec2 viewportSize; -uniform int lineThickness = 2; - -in vec4 finalColor_geom[]; -in vec2 ssPos[]; - -out vec4 finalColor; - -vec2 compute_dir(vec2 v0, vec2 v1) -{ - vec2 dir = normalize(v1 - v0 + 1e-8); - dir = vec2(-dir.y, dir.x); - return dir; -} - -void main(void) -{ - vec2 t; - vec2 edge_dir = compute_dir(ssPos[0], ssPos[1]) / viewportSize; - - bool is_persp = (ProjectionMatrix[3][3] == 0.0); - - finalColor = finalColor_geom[0]; - t = edge_dir * (float(lineThickness) * (is_persp ? gl_in[0].gl_Position.w : 1.0)); - gl_Position = gl_in[0].gl_Position + vec4(t, 0.0, 0.0); - EmitVertex(); - gl_Position = gl_in[0].gl_Position - vec4(t, 0.0, 0.0); - EmitVertex(); - - finalColor = finalColor_geom[1]; - t = edge_dir * (float(lineThickness) * (is_persp ? gl_in[1].gl_Position.w : 1.0)); - gl_Position = gl_in[1].gl_Position + vec4(t, 0.0, 0.0); - EmitVertex(); - gl_Position = gl_in[1].gl_Position - vec4(t, 0.0, 0.0); - EmitVertex(); - EndPrimitive(); -} diff --git a/source/blender/draw/modes/shaders/animviz_mpath_lines_vert.glsl b/source/blender/draw/modes/shaders/animviz_mpath_lines_vert.glsl deleted file mode 100644 index b4d8abfe180..00000000000 --- a/source/blender/draw/modes/shaders/animviz_mpath_lines_vert.glsl +++ /dev/null @@ -1,95 +0,0 @@ - -uniform mat4 ViewMatrix; -uniform mat4 ViewProjectionMatrix; -uniform vec2 viewportSize; - -uniform int frameCurrent; -uniform int frameStart; -uniform int frameEnd; -uniform int cacheStart; -uniform bool selected; -uniform bool useCustomColor; -uniform vec3 customColor; - -in vec3 pos; - -out vec2 ssPos; -out vec4 finalColor_geom; - -/* project to screen space */ -vec2 proj(vec4 pos) -{ - return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize; -} - -#define SET_INTENSITY(A, B, C, min, max) \ - (((1.0 - (float(C - B) / float(C - A))) * (max - min)) + min) - -void main() -{ - gl_Position = ViewProjectionMatrix * vec4(pos, 1.0); - - ssPos = proj(gl_Position); - - int frame = gl_VertexID + cacheStart; - - float intensity; /* how faint */ - - vec3 blend_base = (abs(frame - frameCurrent) == 1) ? - colorCurrentFrame.rgb : - colorBackground.rgb; /* "bleed" cframe color to ease color blending */ - - /* TODO: We might want something more consistent with custom color and standard colors. */ - if (frame < frameCurrent) { - if (useCustomColor) { - /* Custom color: previous frames color is darker than current frame */ - finalColor_geom.rgb = customColor * 0.25; - } - else { - /* black - before frameCurrent */ - if (selected) { - intensity = SET_INTENSITY(frameStart, frame, frameCurrent, 0.25, 0.75); - } - else { - intensity = SET_INTENSITY(frameStart, frame, frameCurrent, 0.68, 0.92); - } - finalColor_geom.rgb = mix(colorWire.rgb, blend_base, intensity); - } - } - else if (frame > frameCurrent) { - if (useCustomColor) { - /* Custom color: next frames color is equal to user selected color */ - finalColor_geom.rgb = customColor; - } - else { - /* blue - after frameCurrent */ - if (selected) { - intensity = SET_INTENSITY(frameCurrent, frame, frameEnd, 0.25, 0.75); - } - else { - intensity = SET_INTENSITY(frameCurrent, frame, frameEnd, 0.68, 0.92); - } - - finalColor_geom.rgb = mix(colorBonePose.rgb, blend_base, intensity); - } - } - else { - if (useCustomColor) { - /* Custom color: current frame color is slightly darker than user selected color */ - finalColor_geom.rgb = customColor * 0.5; - } - else { - /* green - on frameCurrent */ - if (selected) { - intensity = 0.5f; - } - else { - intensity = 0.99f; - } - finalColor_geom.rgb = clamp( - mix(colorCurrentFrame.rgb, colorBackground.rgb, intensity) - 0.1, 0.0, 0.1); - } - } - - finalColor_geom.a = 1.0; -} diff --git a/source/blender/draw/modes/shaders/animviz_mpath_points_vert.glsl b/source/blender/draw/modes/shaders/animviz_mpath_points_vert.glsl deleted file mode 100644 index 70267e78d9e..00000000000 --- a/source/blender/draw/modes/shaders/animviz_mpath_points_vert.glsl +++ /dev/null @@ -1,52 +0,0 @@ - -uniform mat4 ViewProjectionMatrix; - -uniform int pointSize = 2; -uniform int frameCurrent; -uniform int cacheStart; -uniform bool showKeyFrames = true; -uniform bool useCustomColor; -uniform vec3 customColor; -uniform int stepSize; - -in vec3 pos; -in int flag; - -#define MOTIONPATH_VERT_SEL (1 << 0) -#define MOTIONPATH_VERT_KEY (1 << 1) - -out vec4 finalColor; - -void main() -{ - gl_Position = ViewProjectionMatrix * vec4(pos, 1.0); - gl_PointSize = float(pointSize + 2); - - int frame = gl_VertexID + cacheStart; - finalColor = (useCustomColor) ? vec4(customColor, 1.0) : vec4(1.0); - - /* Bias to reduce z fighting with the path */ - gl_Position.z -= 1e-4; - - if (gl_VertexID % stepSize == 0) { - gl_PointSize = float(pointSize) + 4; - } - - if (showKeyFrames) { - if ((flag & MOTIONPATH_VERT_KEY) != 0) { - gl_PointSize = float(pointSize + 5); - finalColor = colorVertexSelect; - /* Bias more to get these on top of regular points */ - gl_Position.z -= 1e-4; - } - /* Draw big green dot where the current frame is. - * NOTE: this is only done when keyframes are shown, since this adds similar types of clutter - */ - if (frame == frameCurrent) { - gl_PointSize = float(pointSize + 8); - finalColor = colorCurrentFrame; - /* Bias more to get these on top of keyframes */ - gl_Position.z -= 1e-4; - } - } -} diff --git a/source/blender/draw/modes/shaders/armature_axes_vert.glsl b/source/blender/draw/modes/shaders/armature_axes_vert.glsl deleted file mode 100644 index d7ed3e9ab71..00000000000 --- a/source/blender/draw/modes/shaders/armature_axes_vert.glsl +++ /dev/null @@ -1,35 +0,0 @@ - -uniform mat4 ViewProjectionMatrix; -uniform vec3 screenVecs[3]; - -/* ---- Instantiated Attrs ---- */ -in float axis; /* position on the axis. [0.0-1.0] is X axis, [1.0-2.0] is Y, etc... */ -in vec2 screenPos; -in vec3 colorAxis; - -/* ---- Per instance Attrs ---- */ -in mat4 InstanceModelMatrix; -in vec4 color; - -flat out vec4 finalColor; - -void main() -{ - vec3 chosen_axis = InstanceModelMatrix[int(axis)].xyz; - vec3 y_axis = InstanceModelMatrix[1].xyz; - vec3 bone_loc = InstanceModelMatrix[3].xyz; - vec3 wpos = bone_loc + y_axis + chosen_axis * fract(axis); - vec3 spos = screenVecs[0].xyz * screenPos.x + screenVecs[1].xyz * screenPos.y; - /* Scale uniformly by axis length */ - spos *= length(chosen_axis); - - vec4 pos_4d = vec4(wpos + spos, 1.0); - gl_Position = ViewProjectionMatrix * pos_4d; - - finalColor.rgb = mix(colorAxis, color.rgb, color.a); - finalColor.a = 1.0; - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(pos_4d.xyz); -#endif -} diff --git a/source/blender/draw/modes/shaders/armature_dof_vert.glsl b/source/blender/draw/modes/shaders/armature_dof_vert.glsl deleted file mode 100644 index 321614835a1..00000000000 --- a/source/blender/draw/modes/shaders/armature_dof_vert.glsl +++ /dev/null @@ -1,30 +0,0 @@ - -uniform mat4 ViewProjectionMatrix; - -/* ---- Instantiated Attrs ---- */ -in vec2 pos; - -/* ---- Per instance Attrs ---- */ -/* Assumed to be in world coordinate already. */ -in mat4 InstanceModelMatrix; -in vec4 color; -in vec2 amin; -in vec2 amax; - -flat out vec4 finalColor; - -vec3 sphere_project(float ax, float az) -{ - float sine = 1.0 - ax * ax - az * az; - float q3 = sqrt(max(0.0, sine)); - - return vec3(-az * q3, 0.5 - sine, ax * q3) * 2.0; -} - -void main() -{ - vec3 final_pos = sphere_project(pos.x * abs((pos.x > 0.0) ? amax.x : amin.x), - pos.y * abs((pos.y > 0.0) ? amax.y : amin.y)); - gl_Position = ViewProjectionMatrix * (InstanceModelMatrix * vec4(final_pos, 1.0)); - finalColor = color; -} diff --git a/source/blender/draw/modes/shaders/armature_envelope_distance_frag.glsl b/source/blender/draw/modes/shaders/armature_envelope_distance_frag.glsl deleted file mode 100644 index 61aaf153e83..00000000000 --- a/source/blender/draw/modes/shaders/armature_envelope_distance_frag.glsl +++ /dev/null @@ -1,15 +0,0 @@ - -flat in vec3 finalStateColor; /* UNUSED */ -flat in vec3 finalBoneColor; /* UNUSED */ -in vec3 normalView; - -out vec4 fragColor; - -uniform vec4 color = vec4(1.0, 1.0, 1.0, 0.2); - -void main() -{ - float n = normalize(normalView).z; - n = 1.0 - clamp(-n, 0.0, 1.0); - fragColor = color * n; -} diff --git a/source/blender/draw/modes/shaders/armature_envelope_outline_vert.glsl b/source/blender/draw/modes/shaders/armature_envelope_outline_vert.glsl deleted file mode 100644 index c0bde90bf28..00000000000 --- a/source/blender/draw/modes/shaders/armature_envelope_outline_vert.glsl +++ /dev/null @@ -1,171 +0,0 @@ - -uniform mat4 ViewMatrix; -uniform mat4 ViewMatrixInverse; -uniform mat4 ViewProjectionMatrix; -uniform mat4 ProjectionMatrix; - -uniform vec2 viewportSize; -uniform float lineThickness = 2.0; - -/* ---- Instantiated Attrs ---- */ -in vec2 pos0; -in vec2 pos1; -in vec2 pos2; - -/* ---- Per instance Attrs ---- */ -/* Assumed to be in world coordinate already. */ -in vec4 headSphere; -in vec4 tailSphere; -in vec4 outlineColorSize; -in vec3 xAxis; - -flat out vec4 finalColor; - -/* project to screen space */ -vec2 proj(vec4 pos) -{ - return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize; -} - -vec2 compute_dir(vec2 v0, vec2 v1, vec2 v2) -{ - vec2 dir = normalize(v2 - v0); - dir = vec2(dir.y, -dir.x); - return dir; -} - -mat3 compute_mat(vec4 sphere, vec3 bone_vec, out float z_ofs) -{ - bool is_persp = (ProjectionMatrix[3][3] == 0.0); - vec3 cam_ray = (is_persp) ? sphere.xyz - ViewMatrixInverse[3].xyz : -ViewMatrixInverse[2].xyz; - - /* Sphere center distance from the camera (persp) in world space. */ - float cam_dist = length(cam_ray); - - /* Compute view aligned orthonormal space. */ - vec3 z_axis = cam_ray / cam_dist; - vec3 x_axis = normalize(cross(bone_vec, z_axis)); - vec3 y_axis = cross(z_axis, x_axis); - z_ofs = 0.0; - - if (is_persp) { - /* For perspective, the projected sphere radius - * can be bigger than the center disc. Compute the - * max angular size and compensate by sliding the disc - * towards the camera and scale it accordingly. */ - const float half_pi = 3.1415926 * 0.5; - float rad = sphere.w; - /* Let be : - * V the view vector origin. - * O the sphere origin. - * T the point on the target circle. - * We compute the angle between (OV) and (OT). */ - float a = half_pi - asin(rad / cam_dist); - float cos_b = cos(a); - float sin_b = sqrt(clamp(1.0 - cos_b * cos_b, 0.0, 1.0)); - - x_axis *= sin_b; - y_axis *= sin_b; - z_ofs = -rad * cos_b; - } - - return mat3(x_axis, y_axis, z_axis); -} - -struct Bone { - vec3 vec; - float sinb; -}; - -bool bone_blend_starts(vec3 p, Bone b) -{ - /* we just want to know when the head sphere starts interpolating. */ - return dot(p, b.vec) > -b.sinb; -} - -vec3 get_outline_point(vec2 pos, - vec4 sph_near, - vec4 sph_far, - mat3 mat_near, - mat3 mat_far, - float z_ofs_near, - float z_ofs_far, - Bone b) -{ - /* Compute outline position on the nearest sphere and check - * if it penetrates the capsule body. If it does, put this - * vertex on the farthest sphere. */ - vec3 wpos = mat_near * vec3(pos * sph_near.w, z_ofs_near); - if (bone_blend_starts(wpos, b)) { - wpos = sph_far.xyz + mat_far * vec3(pos * sph_far.w, z_ofs_far); - } - else { - wpos += sph_near.xyz; - } - return wpos; -} - -void main() -{ - float dst_head = distance(headSphere.xyz, ViewMatrixInverse[3].xyz); - float dst_tail = distance(tailSphere.xyz, ViewMatrixInverse[3].xyz); - // float dst_head = -dot(headSphere.xyz, ViewMatrix[2].xyz); - // float dst_tail = -dot(tailSphere.xyz, ViewMatrix[2].xyz); - - vec4 sph_near, sph_far; - if ((dst_head > dst_tail) && (ProjectionMatrix[3][3] == 0.0)) { - sph_near = tailSphere; - sph_far = headSphere; - } - else { - sph_near = headSphere; - sph_far = tailSphere; - } - - vec3 bone_vec = (sph_far.xyz - sph_near.xyz) + 1e-8; - - Bone b; - float bone_lenrcp = 1.0 / max(1e-8, sqrt(dot(bone_vec, bone_vec))); - b.sinb = (sph_far.w - sph_near.w) * bone_lenrcp * sph_near.w; - b.vec = bone_vec * bone_lenrcp; - - float z_ofs_near, z_ofs_far; - mat3 mat_near = compute_mat(sph_near, bone_vec, z_ofs_near); - mat3 mat_far = compute_mat(sph_far, bone_vec, z_ofs_far); - - vec3 wpos0 = get_outline_point( - pos0, sph_near, sph_far, mat_near, mat_far, z_ofs_near, z_ofs_far, b); - vec3 wpos1 = get_outline_point( - pos1, sph_near, sph_far, mat_near, mat_far, z_ofs_near, z_ofs_far, b); - vec3 wpos2 = get_outline_point( - pos2, sph_near, sph_far, mat_near, mat_far, z_ofs_near, z_ofs_far, b); - - vec4 pos_4d = vec4(wpos1, 1.0); -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(pos_4d.xyz); -#endif - - vec4 V = ViewMatrix * pos_4d; - float pres_fac = (ProjectionMatrix[3][3] == 0.0) ? abs(V.z) : 1.0; - - vec4 p0 = ViewProjectionMatrix * vec4(wpos0, 1.0); - vec4 p1 = ProjectionMatrix * V; - vec4 p2 = ViewProjectionMatrix * vec4(wpos2, 1.0); - - /* compute position from 3 vertex because the change in direction - * can happen very quicky and lead to very thin edges. */ - vec2 ss0 = proj(p0); - vec2 ss1 = proj(p1); - vec2 ss2 = proj(p2); - vec2 edge_dir = compute_dir(ss0, ss1, ss2); - - bool outer = ((gl_VertexID & 1) == 1); - vec2 t = outlineColorSize.w * (lineThickness / viewportSize); - t *= pres_fac; - t = (outer) ? t : vec2(0.0); - - gl_Position = p1; - gl_Position.xy += t * edge_dir; - - finalColor = vec4(outlineColorSize.rgb, 1.0); -} diff --git a/source/blender/draw/modes/shaders/armature_envelope_solid_frag.glsl b/source/blender/draw/modes/shaders/armature_envelope_solid_frag.glsl deleted file mode 100644 index 424cc92b930..00000000000 --- a/source/blender/draw/modes/shaders/armature_envelope_solid_frag.glsl +++ /dev/null @@ -1,18 +0,0 @@ - -uniform float alpha = 0.6; - -flat in vec3 finalStateColor; -flat in vec3 finalBoneColor; -in vec3 normalView; - -out vec4 fragColor; - -void main() -{ - /* Smooth lighting factor. */ - const float s = 0.2; /* [0.0-0.5] range */ - float n = normalize(normalView).z; - float fac = clamp((n * (1.0 - s)) + s, 0.0, 1.0); - fragColor.rgb = mix(finalStateColor, finalBoneColor, fac); - fragColor.a = alpha; -} diff --git a/source/blender/draw/modes/shaders/armature_envelope_solid_vert.glsl b/source/blender/draw/modes/shaders/armature_envelope_solid_vert.glsl deleted file mode 100644 index d9567bb84f4..00000000000 --- a/source/blender/draw/modes/shaders/armature_envelope_solid_vert.glsl +++ /dev/null @@ -1,59 +0,0 @@ - -uniform mat4 ViewMatrix; -uniform mat4 ViewMatrixInverse; -uniform mat4 ViewProjectionMatrix; - -/* ---- Instantiated Attrs ---- */ -in vec3 pos; - -/* ---- Per instance Attrs ---- */ -/* Assumed to be in world coordinate already. */ -in vec4 headSphere; -in vec4 tailSphere; -in vec3 xAxis; -in vec3 stateColor; -in vec3 boneColor; - -flat out vec3 finalStateColor; -flat out vec3 finalBoneColor; -out vec3 normalView; - -void main() -{ - vec3 bone_vec = tailSphere.xyz - headSphere.xyz; - float bone_len = max(1e-8, sqrt(dot(bone_vec, bone_vec))); - float bone_lenrcp = 1.0 / bone_len; -#ifdef SMOOTH_ENVELOPE - float sinb = (tailSphere.w - headSphere.w) * bone_lenrcp; -#else - const float sinb = 0.0; -#endif - - vec3 y_axis = bone_vec * bone_lenrcp; - vec3 z_axis = normalize(cross(xAxis, -y_axis)); - vec3 x_axis = cross(y_axis, z_axis); /* cannot trust xAxis to be orthogonal. */ - - vec3 sp, nor; - nor = sp = pos.xyz; - - /* In bone space */ - bool is_head = (pos.z < -sinb); - sp *= (is_head) ? headSphere.w : tailSphere.w; - sp.z += (is_head) ? 0.0 : bone_len; - - /* Convert to world space */ - mat3 bone_mat = mat3(x_axis, y_axis, z_axis); - sp = bone_mat * sp.xzy + headSphere.xyz; - nor = bone_mat * nor.xzy; - - normalView = mat3(ViewMatrix) * nor; - - finalStateColor = stateColor; - finalBoneColor = boneColor; - - vec4 pos_4d = vec4(sp, 1.0); - gl_Position = ViewProjectionMatrix * pos_4d; -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(pos_4d.xyz); -#endif -} diff --git a/source/blender/draw/modes/shaders/armature_shape_outline_geom.glsl b/source/blender/draw/modes/shaders/armature_shape_outline_geom.glsl deleted file mode 100644 index dc84b8924d1..00000000000 --- a/source/blender/draw/modes/shaders/armature_shape_outline_geom.glsl +++ /dev/null @@ -1,117 +0,0 @@ - -layout(lines_adjacency) in; -layout(triangle_strip, max_vertices = 6) out; - -in vec4 pPos[]; -in vec3 vPos[]; -in vec2 ssPos[]; -in vec2 ssNor[]; -in vec4 vColSize[]; - -flat out vec4 finalColor; -uniform vec2 viewportSize; -uniform float lineThickness = 2.0; - -vec2 compute_dir(vec2 v0, vec2 v1) -{ - vec2 dir = normalize(v1 - v0); - dir = vec2(-dir.y, dir.x); - return dir; -} - -void emit_edge(vec2 edge_dir, vec2 hidden_dir, vec2 thick, bool is_persp) -{ - float fac = dot(-hidden_dir, edge_dir); - edge_dir *= (fac < 0.0) ? -1.0 : 1.0; - - vec2 t = thick * (is_persp ? abs(vPos[1].z) : 1.0); - gl_Position = pPos[1]; -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_set_clip_distance(gl_in[1].gl_ClipDistance); -#endif - EmitVertex(); - gl_Position.xy += t * edge_dir; -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_set_clip_distance(gl_in[1].gl_ClipDistance); -#endif - EmitVertex(); - - t = thick * (is_persp ? abs(vPos[2].z) : 1.0); - gl_Position = pPos[2]; -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_set_clip_distance(gl_in[2].gl_ClipDistance); -#endif - EmitVertex(); - gl_Position.xy += t * edge_dir; -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_set_clip_distance(gl_in[2].gl_ClipDistance); -#endif - EmitVertex(); -} - -void emit_corner(const int e, vec2 thick, bool is_persp) -{ - vec2 corner_dir = ssNor[e]; - vec2 t = thick * (is_persp ? abs(vPos[e].z) : 1.0); - - gl_Position = pPos[e] + vec4(t * corner_dir, 0.0, 0.0); -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_set_clip_distance(gl_in[e].gl_ClipDistance); -#endif - EmitVertex(); -} - -void main(void) -{ - finalColor = vec4(vColSize[0].rgb, 1.0); - - bool is_persp = (ProjectionMatrix[3][3] == 0.0); - - vec3 view_vec = (is_persp) ? normalize(vPos[1]) : vec3(0.0, 0.0, -1.0); - vec3 v10 = vPos[0] - vPos[1]; - vec3 v12 = vPos[2] - vPos[1]; - vec3 v13 = vPos[3] - vPos[1]; - - vec3 n0 = cross(v12, v10); - vec3 n3 = cross(v13, v12); - - float fac0 = dot(view_vec, n0); - float fac3 = dot(view_vec, n3); - - /* If one of the face is perpendicular to the view, - * consider it and outline edge. */ - if (abs(fac0) > 1e-5 && abs(fac3) > 1e-5) { - /* If both adjacent verts are facing the camera the same way, - * then it isn't an outline edge. */ - if (sign(fac0) == sign(fac3)) { - return; - } - } - - /* Don't outline if concave edge. */ - if (dot(n0, v13) > 0.0001) { - return; - } - - vec2 thick = vColSize[0].w * (lineThickness / viewportSize); - vec2 edge_dir = compute_dir(ssPos[1], ssPos[2]); - - vec2 hidden_point; - /* Take the farthest point to compute edge direction - * (avoid problems with point behind near plane). - * If the chosen point is parallel to the edge in screen space, - * choose the other point anyway. - * This fixes some issue with cubes in orthographic views.*/ - if (vPos[0].z < vPos[3].z) { - hidden_point = (abs(fac0) > 1e-5) ? ssPos[0] : ssPos[3]; - } - else { - hidden_point = (abs(fac3) > 1e-5) ? ssPos[3] : ssPos[0]; - } - vec2 hidden_dir = normalize(hidden_point - ssPos[1]); - - emit_corner(1, thick, is_persp); - emit_edge(edge_dir, hidden_dir, thick, is_persp); - emit_corner(2, thick, is_persp); - EndPrimitive(); -} diff --git a/source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl b/source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl deleted file mode 100644 index fb2735c196c..00000000000 --- a/source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl +++ /dev/null @@ -1,47 +0,0 @@ - -uniform vec2 viewportSize; - -/* ---- Instantiated Attrs ---- */ -in vec3 pos; -in vec3 snor; - -/* ---- Per instance Attrs ---- */ -in mat4 InstanceModelMatrix; -in vec4 outlineColorSize; - -out vec4 pPos; -out vec3 vPos; -out vec2 ssPos; -out vec2 ssNor; -out vec4 vColSize; - -/* project to screen space */ -vec2 proj(vec4 pos) -{ - return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize; -} - -void main() -{ - vec4 worldPosition = InstanceModelMatrix * vec4(pos, 1.0); - vec4 viewpos = ViewMatrix * worldPosition; - - vPos = viewpos.xyz; - pPos = ProjectionMatrix * viewpos; - - /* This is slow and run per vertex, but it's still faster than - * doing it per instance on CPU and sending it on via instance attribute. */ - mat3 normal_mat = transpose(inverse(mat3(InstanceModelMatrix))); - /* TODO FIX: there is still a problem with this vector - * when the bone is scaled or in persp mode. But it's - * barelly visible at the outline corners. */ - ssNor = normalize(normal_world_to_view(normal_mat * snor).xy); - - ssPos = proj(pPos); - - vColSize = outlineColorSize; - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(worldPosition.xyz); -#endif -} diff --git a/source/blender/draw/modes/shaders/armature_shape_solid_frag.glsl b/source/blender/draw/modes/shaders/armature_shape_solid_frag.glsl deleted file mode 100644 index 39963344dd8..00000000000 --- a/source/blender/draw/modes/shaders/armature_shape_solid_frag.glsl +++ /dev/null @@ -1,11 +0,0 @@ - -uniform float alpha = 0.6; - -in vec4 finalColor; - -out vec4 fragColor; - -void main() -{ - fragColor = vec4(finalColor.rgb, alpha); -} diff --git a/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl b/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl deleted file mode 100644 index df6a9ce2d76..00000000000 --- a/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl +++ /dev/null @@ -1,36 +0,0 @@ - -/* ---- Instantiated Attrs ---- */ -in vec3 pos; -in vec3 nor; - -/* ---- Per instance Attrs ---- */ -in mat4 InstanceModelMatrix; -in vec3 boneColor; -in vec3 stateColor; - -out vec4 finalColor; - -void main() -{ - /* This is slow and run per vertex, but it's still faster than - * doing it per instance on CPU and sending it on via instance attribute. */ - mat3 normal_mat = transpose(inverse(mat3(InstanceModelMatrix))); - vec3 normal = normalize(normal_world_to_view(normal_mat * nor)); - - /* Do lighting at an angle to avoid flat shading on front facing bone. */ - const vec3 light = vec3(0.1, 0.1, 0.8); - float n = dot(normal, light); - - /* Smooth lighting factor. */ - const float s = 0.2; /* [0.0-0.5] range */ - float fac = clamp((n * (1.0 - s)) + s, 0.0, 1.0); - finalColor.rgb = mix(stateColor, boneColor, fac); - finalColor.a = 1.0; - - vec4 worldPosition = InstanceModelMatrix * vec4(pos, 1.0); - gl_Position = ViewProjectionMatrix * worldPosition; - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(worldPosition.xyz); -#endif -} diff --git a/source/blender/draw/modes/shaders/armature_sphere_outline_vert.glsl b/source/blender/draw/modes/shaders/armature_sphere_outline_vert.glsl deleted file mode 100644 index 70a7f495af9..00000000000 --- a/source/blender/draw/modes/shaders/armature_sphere_outline_vert.glsl +++ /dev/null @@ -1,107 +0,0 @@ - -uniform mat4 ViewMatrix; -uniform mat4 ProjectionMatrix; -uniform vec2 viewportSize; -uniform float lineThickness = 2.0; - -/* ---- Instantiated Attrs ---- */ -in vec2 pos0; -in vec2 pos1; - -/* ---- Per instance Attrs ---- */ -in mat4 InstanceModelMatrix; -in vec4 outlineColorSize; - -flat out vec4 finalColor; - -/* project to screen space */ -vec2 proj(vec4 pos) -{ - return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize; -} - -vec2 compute_dir(vec2 v0, vec2 v1, vec2 c) -{ - vec2 dir = normalize(v1 - v0); - dir = vec2(dir.y, -dir.x); - /* The model matrix can be scaled negativly. - * Use projected sphere center to determine - * the outline direction. */ - vec2 cv = c - v0; - dir = (dot(dir, cv) > 0.0) ? -dir : dir; - return dir; -} - -void main() -{ - mat4 model_view_matrix = ViewMatrix * InstanceModelMatrix; - mat4 sphereMatrix = inverse(model_view_matrix); - - bool is_persp = (ProjectionMatrix[3][3] == 0.0); - - /* This is the local space camera ray (not normalize). - * In perspective mode it's also the viewspace position - * of the sphere center. */ - vec3 cam_ray = (is_persp) ? model_view_matrix[3].xyz : vec3(0.0, 0.0, -1.0); - cam_ray = mat3(sphereMatrix) * cam_ray; - - /* Sphere center distance from the camera (persp) in local space. */ - float cam_dist = length(cam_ray); - - /* Compute view aligned orthonormal space. */ - vec3 z_axis = cam_ray / cam_dist; - vec3 x_axis = normalize(cross(sphereMatrix[1].xyz, z_axis)); - vec3 y_axis = cross(z_axis, x_axis); - float z_ofs = 0.0; - - if (is_persp) { - /* For perspective, the projected sphere radius - * can be bigger than the center disc. Compute the - * max angular size and compensate by sliding the disc - * towards the camera and scale it accordingly. */ - const float half_pi = 3.1415926 * 0.5; - const float rad = 0.05; - /* Let be (in local space): - * V the view vector origin. - * O the sphere origin. - * T the point on the target circle. - * We compute the angle between (OV) and (OT). */ - float a = half_pi - asin(rad / cam_dist); - float cos_b = cos(a); - float sin_b = sqrt(clamp(1.0 - cos_b * cos_b, 0.0, 1.0)); - - x_axis *= sin_b; - y_axis *= sin_b; - z_ofs = -rad * cos_b; - } - - /* Camera oriented position (but still in local space) */ - vec3 cam_pos0 = x_axis * pos0.x + y_axis * pos0.y + z_axis * z_ofs; - vec3 cam_pos1 = x_axis * pos1.x + y_axis * pos1.y + z_axis * z_ofs; - - vec4 V = model_view_matrix * vec4(cam_pos0, 1.0); - vec4 p0 = ProjectionMatrix * V; - vec4 p1 = ProjectionMatrix * (model_view_matrix * vec4(cam_pos1, 1.0)); - vec4 c = ProjectionMatrix * vec4(model_view_matrix[3].xyz, 1.0); - - vec2 ssc = proj(c); - vec2 ss0 = proj(p0); - vec2 ss1 = proj(p1); - vec2 edge_dir = compute_dir(ss0, ss1, ssc); - - bool outer = ((gl_VertexID & 1) == 1); - - vec2 t = outlineColorSize.w * (lineThickness / viewportSize); - t *= (is_persp) ? abs(V.z) : 1.0; - t = (outer) ? t : vec2(0.0); - - gl_Position = p0; - gl_Position.xy += t * edge_dir; - - finalColor = vec4(outlineColorSize.rgb, 1.0); - -#ifdef USE_WORLD_CLIP_PLANES - vec4 worldPosition = InstanceModelMatrix * vec4(cam_pos0, 1.0); - world_clip_planes_calc_clip_distance(worldPosition.xyz); -#endif -} diff --git a/source/blender/draw/modes/shaders/armature_sphere_solid_frag.glsl b/source/blender/draw/modes/shaders/armature_sphere_solid_frag.glsl deleted file mode 100644 index 93edbe940fd..00000000000 --- a/source/blender/draw/modes/shaders/armature_sphere_solid_frag.glsl +++ /dev/null @@ -1,80 +0,0 @@ - -#extension GL_ARB_conservative_depth : enable - -uniform mat4 ViewMatrixInverse; -uniform mat4 ProjectionMatrix; -uniform float alpha = 0.4; - -flat in vec3 finalStateColor; -flat in vec3 finalBoneColor; -flat in mat4 sphereMatrix; -in vec3 viewPosition; - -#ifdef GL_ARB_conservative_depth -/* Saves a lot of overdraw! */ -layout(depth_greater) out float gl_FragDepth; -#endif - -out vec4 fragColor; - -#define cameraPos ViewMatrixInverse[3].xyz - -float get_depth_from_view_z(float z) -{ - if (ProjectionMatrix[3][3] == 0.0) { - z = (-ProjectionMatrix[3][2] / z) - ProjectionMatrix[2][2]; - } - else { - z = z * ProjectionMatrix[2][2] / (1.0 - ProjectionMatrix[3][2]); - } - return z * 0.5 + 0.5; -} - -void main() -{ - const float sphere_radius = 0.05; - - bool is_perp = (ProjectionMatrix[3][3] == 0.0); - vec3 ray_ori_view = (is_perp) ? vec3(0.0) : viewPosition.xyz; - vec3 ray_dir_view = (is_perp) ? viewPosition : vec3(0.0, 0.0, -1.0); - - /* Single matrix mul without branch. */ - vec4 mul_vec = (is_perp) ? vec4(ray_dir_view, 0.0) : vec4(ray_ori_view, 1.0); - vec3 mul_res = (sphereMatrix * mul_vec).xyz; - - /* Reminder : - * sphereMatrix[3] is the view space origin in sphere space (sph_ori -> view_ori). - * sphereMatrix[2] is the view space Z axis in sphere space. */ - - /* convert to sphere local space */ - vec3 ray_ori = (is_perp) ? sphereMatrix[3].xyz : mul_res; - vec3 ray_dir = (is_perp) ? mul_res : -sphereMatrix[2].xyz; - float ray_len = length(ray_dir); - ray_dir /= ray_len; - - /* Line to sphere intersect */ - const float sphere_radius_sqr = sphere_radius * sphere_radius; - float b = dot(ray_ori, ray_dir); - float c = dot(ray_ori, ray_ori) - sphere_radius_sqr; - float h = b * b - c; - float t = -sqrt(max(0.0, h)) - b; - - /* Compute dot product for lighting */ - vec3 p = ray_dir * t + ray_ori; /* Point on sphere */ - vec3 n = normalize(p); /* Normal is just the point in sphere space, normalized. */ - vec3 l = normalize(sphereMatrix[2].xyz); /* Just the view Z axis in the sphere space. */ - - /* Smooth lighting factor. */ - const float s = 0.2; /* [0.0-0.5] range */ - float fac = clamp((dot(n, l) * (1.0 - s)) + s, 0.0, 1.0); - fragColor.rgb = mix(finalStateColor, finalBoneColor, fac); - - /* 2x2 dither pattern to smooth the lighting. */ - float dither = (0.5 + dot(vec2(ivec2(gl_FragCoord.xy) & ivec2(1)), vec2(1.0, 2.0))) * 0.25; - dither *= (1.0 / 255.0); /* Assume 8bit per color buffer. */ - - fragColor = vec4(fragColor.rgb + dither, alpha); - - t /= ray_len; - gl_FragDepth = get_depth_from_view_z(ray_dir_view.z * t + ray_ori_view.z); -} diff --git a/source/blender/draw/modes/shaders/armature_sphere_solid_vert.glsl b/source/blender/draw/modes/shaders/armature_sphere_solid_vert.glsl deleted file mode 100644 index 38a721616a0..00000000000 --- a/source/blender/draw/modes/shaders/armature_sphere_solid_vert.glsl +++ /dev/null @@ -1,88 +0,0 @@ - -uniform mat4 ViewMatrix; -uniform mat4 ProjectionMatrix; - -/* ---- Instantiated Attrs ---- */ -in vec2 pos; - -/* ---- Per instance Attrs ---- */ -in mat4 InstanceModelMatrix; -in vec3 stateColor; -in vec3 boneColor; - -flat out vec3 finalStateColor; -flat out vec3 finalBoneColor; -flat out mat4 sphereMatrix; -out vec3 viewPosition; - -/* Sphere radius */ -const float rad = 0.05; - -void main() -{ - mat4 model_view_matrix = ViewMatrix * InstanceModelMatrix; - sphereMatrix = inverse(model_view_matrix); - - bool is_persp = (ProjectionMatrix[3][3] == 0.0); - - /* This is the local space camera ray (not normalize). - * In perspective mode it's also the viewspace position - * of the sphere center. */ - vec3 cam_ray = (is_persp) ? model_view_matrix[3].xyz : vec3(0.0, 0.0, -1.0); - cam_ray = mat3(sphereMatrix) * cam_ray; - - /* Sphere center distance from the camera (persp) in local space. */ - float cam_dist = length(cam_ray); - - /* Compute view aligned orthonormal space. */ - vec3 z_axis = cam_ray / cam_dist; - vec3 x_axis = normalize(cross(sphereMatrix[1].xyz, z_axis)); - vec3 y_axis = cross(z_axis, x_axis); - - float z_ofs = -rad - 1e-8; /* offset to the front of the sphere */ - if (is_persp) { - /* For perspective, the projected sphere radius - * can be bigger than the center disc. Compute the - * max angular size and compensate by sliding the disc - * towards the camera and scale it accordingly. */ - const float half_pi = 3.1415926 * 0.5; - /* Let be (in local space): - * V the view vector origin. - * O the sphere origin. - * T the point on the target circle. - * We compute the angle between (OV) and (OT). */ - float a = half_pi - asin(rad / cam_dist); - float cos_b = cos(a); - float sin_b = sqrt(clamp(1.0 - cos_b * cos_b, 0.0, 1.0)); -#if 1 - /* Instead of choosing the biggest circle in screenspace, - * we choose the nearest with the same angular size. This - * permit us to leverage GL_ARB_conservative_depth in the - * fragment shader. */ - float minor = cam_dist - rad; - float major = cam_dist - cos_b * rad; - float fac = minor / major; - sin_b *= fac; -#else - z_ofs = -rad * cos_b; -#endif - x_axis *= sin_b; - y_axis *= sin_b; - } - - /* Camera oriented position (but still in local space) */ - vec3 cam_pos = x_axis * pos.x + y_axis * pos.y + z_axis * z_ofs; - - vec4 pos_4d = vec4(cam_pos, 1.0); - vec4 V = model_view_matrix * pos_4d; - gl_Position = ProjectionMatrix * V; - viewPosition = V.xyz; - - finalStateColor = stateColor; - finalBoneColor = boneColor; - -#ifdef USE_WORLD_CLIP_PLANES - vec4 worldPosition = InstanceModelMatrix * pos_4d; - world_clip_planes_calc_clip_distance(worldPosition.xyz); -#endif -} diff --git a/source/blender/draw/modes/shaders/armature_stick_frag.glsl b/source/blender/draw/modes/shaders/armature_stick_frag.glsl deleted file mode 100644 index ba89619e051..00000000000 --- a/source/blender/draw/modes/shaders/armature_stick_frag.glsl +++ /dev/null @@ -1,13 +0,0 @@ - -noperspective in float colorFac; -flat in vec4 finalWireColor; -flat in vec4 finalInnerColor; - -out vec4 fragColor; - -void main() -{ - float fac = smoothstep(1.0, 0.2, colorFac); - fragColor.rgb = mix(finalInnerColor.rgb, finalWireColor.rgb, fac); - fragColor.a = 1.0; -} diff --git a/source/blender/draw/modes/shaders/armature_stick_vert.glsl b/source/blender/draw/modes/shaders/armature_stick_vert.glsl deleted file mode 100644 index fd8a12fcd2c..00000000000 --- a/source/blender/draw/modes/shaders/armature_stick_vert.glsl +++ /dev/null @@ -1,97 +0,0 @@ - -uniform mat4 ProjectionMatrix; -uniform mat4 ViewProjectionMatrix; - -uniform mat4 ViewMatrix; -uniform vec2 viewportSize; - -/* ---- Instantiated Attrs ---- */ -in vec2 pos; /* bone aligned screen space */ -in uint flag; - -#define COL_WIRE 1u /* (1 << 0) */ -#define COL_HEAD 2u /* (1 << 1) */ -#define COL_TAIL 4u /* (1 << 2) */ -#define COL_BONE 8u /* (1 << 3) */ - -#define POS_HEAD 16u /* (1 << 4) */ -#define POS_TAIL 32u /* (1 << 5) */ /* UNUSED */ -#define POS_BONE 64u /* (1 << 6) */ - -/* ---- Per instance Attrs ---- */ -in vec3 boneStart; -in vec3 boneEnd; -in vec4 wireColor; /* alpha encode if we do wire. If 0.0 we dont. */ -in vec4 boneColor; /* alpha encode if we do bone. If 0.0 we dont. */ -in vec4 headColor; /* alpha encode if we do head. If 0.0 we dont. */ -in vec4 tailColor; /* alpha encode if we do tail. If 0.0 we dont. */ - -#define do_wire (wireColor.a > 0.0) -#define is_head bool(flag & POS_HEAD) -#define is_bone bool(flag & POS_BONE) - -noperspective out float colorFac; -flat out vec4 finalWireColor; -flat out vec4 finalInnerColor; - -uniform float stickSize = 5.0; /* might be dependent on DPI setting in the future. */ - -/* project to screen space */ -vec2 proj(vec4 pos) -{ - return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize; -} - -void main() -{ - finalInnerColor = ((flag & COL_HEAD) != 0u) ? headColor : tailColor; - finalInnerColor = ((flag & COL_BONE) != 0u) ? boneColor : finalInnerColor; - finalWireColor = (do_wire) ? wireColor : finalInnerColor; - /* Make the color */ - colorFac = ((flag & COL_WIRE) == 0u) ? ((flag & COL_BONE) != 0u) ? 1.0 : 2.0 : 0.0; - - vec4 boneStart_4d = vec4(boneStart, 1.0); - vec4 boneEnd_4d = vec4(boneEnd, 1.0); - vec4 v0 = ViewMatrix * boneStart_4d; - vec4 v1 = ViewMatrix * boneEnd_4d; - - /* Clip the bone to the camera origin plane (not the clip plane) - * to avoid glitches if one end is behind the camera origin (in persp). */ - float clip_dist = (ProjectionMatrix[3][3] == 0.0) ? - -1e-7 : - 1e20; /* hardcoded, -1e-8 is giving gliches. */ - vec3 bvec = v1.xyz - v0.xyz; - vec3 clip_pt = v0.xyz + bvec * ((v0.z - clip_dist) / -bvec.z); - if (v0.z > clip_dist) { - v0.xyz = clip_pt; - } - else if (v1.z > clip_dist) { - v1.xyz = clip_pt; - } - - vec4 p0 = ProjectionMatrix * v0; - vec4 p1 = ProjectionMatrix * v1; - - float h = (is_head) ? p0.w : p1.w; - - vec2 x_screen_vec = normalize(proj(p1) - proj(p0) + 1e-8); - vec2 y_screen_vec = vec2(x_screen_vec.y, -x_screen_vec.x); - - /* 2D screen aligned pos at the point */ - vec2 vpos = pos.x * x_screen_vec + pos.y * y_screen_vec; - vpos *= (ProjectionMatrix[3][3] == 0.0) ? h : 1.0; - vpos *= (do_wire) ? 1.0 : 0.5; - - if (finalInnerColor.a > 0.0) { - gl_Position = (is_head) ? p0 : p1; - gl_Position.xy += stickSize * (vpos / viewportSize); - gl_Position.z += (is_bone) ? 0.0 : 1e-6; /* Avoid Z fighting of head/tails. */ - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance((is_head ? boneStart_4d : boneEnd_4d).xyz); -#endif - } - else { - gl_Position = vec4(0.0); - } -} diff --git a/source/blender/draw/modes/shaders/common_colormanagement_lib.glsl b/source/blender/draw/modes/shaders/common_colormanagement_lib.glsl deleted file mode 100644 index 45f711296f3..00000000000 --- a/source/blender/draw/modes/shaders/common_colormanagement_lib.glsl +++ /dev/null @@ -1,30 +0,0 @@ -float linearrgb_to_srgb(float c) -{ - if (c < 0.0031308) { - return (c < 0.0) ? 0.0 : c * 12.92; - } - else { - return 1.055 * pow(c, 1.0 / 2.4) - 0.055; - } -} - -vec4 texture_read_as_linearrgb(sampler2D tex, bool premultiplied, vec2 co) -{ - /* By convention image textures return scene linear colors, but - * overlays still assume srgb. */ - vec4 color = texture(tex, co); - /* Unpremultiply if stored multiplied, since straight alpha is expected by shaders. */ - if (premultiplied && !(color.a == 0.0 || color.a == 1.0)) { - color.rgb = color.rgb / color.a; - } - return color; -} - -vec4 texture_read_as_srgb(sampler2D tex, bool premultiplied, vec2 co) -{ - vec4 color = texture_read_as_linearrgb(tex, premultiplied, co); - color.r = linearrgb_to_srgb(color.r); - color.g = linearrgb_to_srgb(color.g); - color.b = linearrgb_to_srgb(color.b); - return color; -} diff --git a/source/blender/draw/modes/shaders/common_fullscreen_vert.glsl b/source/blender/draw/modes/shaders/common_fullscreen_vert.glsl deleted file mode 100644 index 8a7fb97d98c..00000000000 --- a/source/blender/draw/modes/shaders/common_fullscreen_vert.glsl +++ /dev/null @@ -1,11 +0,0 @@ - -out vec4 uvcoordsvar; - -void main() -{ - int v = gl_VertexID % 3; - float x = -1.0 + float((v & 1) << 2); - float y = -1.0 + float((v & 2) << 1); - gl_Position = vec4(x, y, 1.0, 1.0); - uvcoordsvar = vec4((gl_Position.xy + 1.0) * 0.5, 0.0, 0.0); -} diff --git a/source/blender/draw/modes/shaders/common_fxaa_lib.glsl b/source/blender/draw/modes/shaders/common_fxaa_lib.glsl deleted file mode 100644 index 9928f350fd0..00000000000 --- a/source/blender/draw/modes/shaders/common_fxaa_lib.glsl +++ /dev/null @@ -1,884 +0,0 @@ -//---------------------------------------------------------------------------------- -// File: es3-kepler\FXAA/FXAA3_11.h -// SDK Version: v3.00 -// Email: gameworks@nvidia.com -// Site: http://developer.nvidia.com/ -// -// Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// * Neither the name of NVIDIA CORPORATION nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -//---------------------------------------------------------------------------------- - -/* BLENDER MODIFICATIONS: - * - * - (#B1#) Compute luma on the fly using BT. 709 luma function - * - (#B2#) main function instead of #include, due to lack of - * ARB_shading_language_include in 3.3 - * - (#B3#) version and extension directives - * - removed "FXAA Console" algorithm support and shader parameters - * - removed HLSL support shims - * - (#B4#) change luma sampling to compute, not use A channel - * (this also removes GATHER4_ALPHA support) - * - removed all the console shaders (only remaining algorithm is "FXAA PC - * Quality") - * - * Note that this file doesn't follow the coding style guidelines. - */ - -/*============================================================================ - FXAA QUALITY - TUNING KNOBS ------------------------------------------------------------------------------- -NOTE the other tuning knobs are now in the shader function inputs! -============================================================================*/ -#ifndef FXAA_QUALITY__PRESET -// -// Choose the quality preset. -// This needs to be compiled into the shader as it effects code. -// Best option to include multiple presets is to -// in each shader define the preset, then include this file. -// -// OPTIONS -// ----------------------------------------------------------------------- -// 10 to 15 - default medium dither (10=fastest, 15=highest quality) -// 20 to 29 - less dither, more expensive (20=fastest, 29=highest quality) -// 39 - no dither, very expensive -// -// NOTES -// ----------------------------------------------------------------------- -// 12 = slightly faster then FXAA 3.9 and higher edge quality (default) -// 13 = about same speed as FXAA 3.9 and better than 12 -// 23 = closest to FXAA 3.9 visually and performance wise -// _ = the lowest digit is directly related to performance -// _ = the highest digit is directly related to style -// -# define FXAA_QUALITY__PRESET 12 -#endif - -/*============================================================================ - - FXAA QUALITY - PRESETS - -============================================================================*/ - -/*============================================================================ - FXAA QUALITY - MEDIUM DITHER PRESETS -============================================================================*/ -#if (FXAA_QUALITY__PRESET == 10) -# define FXAA_QUALITY__PS 3 -# define FXAA_QUALITY__P0 1.5 -# define FXAA_QUALITY__P1 3.0 -# define FXAA_QUALITY__P2 12.0 -#endif -/*--------------------------------------------------------------------------*/ -#if (FXAA_QUALITY__PRESET == 11) -# define FXAA_QUALITY__PS 4 -# define FXAA_QUALITY__P0 1.0 -# define FXAA_QUALITY__P1 1.5 -# define FXAA_QUALITY__P2 3.0 -# define FXAA_QUALITY__P3 12.0 -#endif -/*--------------------------------------------------------------------------*/ -#if (FXAA_QUALITY__PRESET == 12) -# define FXAA_QUALITY__PS 5 -# define FXAA_QUALITY__P0 1.0 -# define FXAA_QUALITY__P1 1.5 -# define FXAA_QUALITY__P2 2.0 -# define FXAA_QUALITY__P3 4.0 -# define FXAA_QUALITY__P4 12.0 -#endif -/*--------------------------------------------------------------------------*/ -#if (FXAA_QUALITY__PRESET == 13) -# define FXAA_QUALITY__PS 6 -# define FXAA_QUALITY__P0 1.0 -# define FXAA_QUALITY__P1 1.5 -# define FXAA_QUALITY__P2 2.0 -# define FXAA_QUALITY__P3 2.0 -# define FXAA_QUALITY__P4 4.0 -# define FXAA_QUALITY__P5 12.0 -#endif -/*--------------------------------------------------------------------------*/ -#if (FXAA_QUALITY__PRESET == 14) -# define FXAA_QUALITY__PS 7 -# define FXAA_QUALITY__P0 1.0 -# define FXAA_QUALITY__P1 1.5 -# define FXAA_QUALITY__P2 2.0 -# define FXAA_QUALITY__P3 2.0 -# define FXAA_QUALITY__P4 2.0 -# define FXAA_QUALITY__P5 4.0 -# define FXAA_QUALITY__P6 12.0 -#endif -/*--------------------------------------------------------------------------*/ -#if (FXAA_QUALITY__PRESET == 15) -# define FXAA_QUALITY__PS 8 -# define FXAA_QUALITY__P0 1.0 -# define FXAA_QUALITY__P1 1.5 -# define FXAA_QUALITY__P2 2.0 -# define FXAA_QUALITY__P3 2.0 -# define FXAA_QUALITY__P4 2.0 -# define FXAA_QUALITY__P5 2.0 -# define FXAA_QUALITY__P6 4.0 -# define FXAA_QUALITY__P7 12.0 -#endif - -/*============================================================================ - FXAA QUALITY - LOW DITHER PRESETS -============================================================================*/ -#if (FXAA_QUALITY__PRESET == 20) -# define FXAA_QUALITY__PS 3 -# define FXAA_QUALITY__P0 1.5 -# define FXAA_QUALITY__P1 2.0 -# define FXAA_QUALITY__P2 8.0 -#endif -/*--------------------------------------------------------------------------*/ -#if (FXAA_QUALITY__PRESET == 21) -# define FXAA_QUALITY__PS 4 -# define FXAA_QUALITY__P0 1.0 -# define FXAA_QUALITY__P1 1.5 -# define FXAA_QUALITY__P2 2.0 -# define FXAA_QUALITY__P3 8.0 -#endif -/*--------------------------------------------------------------------------*/ -#if (FXAA_QUALITY__PRESET == 22) -# define FXAA_QUALITY__PS 5 -# define FXAA_QUALITY__P0 1.0 -# define FXAA_QUALITY__P1 1.5 -# define FXAA_QUALITY__P2 2.0 -# define FXAA_QUALITY__P3 2.0 -# define FXAA_QUALITY__P4 8.0 -#endif -/*--------------------------------------------------------------------------*/ -#if (FXAA_QUALITY__PRESET == 23) -# define FXAA_QUALITY__PS 6 -# define FXAA_QUALITY__P0 1.0 -# define FXAA_QUALITY__P1 1.5 -# define FXAA_QUALITY__P2 2.0 -# define FXAA_QUALITY__P3 2.0 -# define FXAA_QUALITY__P4 2.0 -# define FXAA_QUALITY__P5 8.0 -#endif -/*--------------------------------------------------------------------------*/ -#if (FXAA_QUALITY__PRESET == 24) -# define FXAA_QUALITY__PS 7 -# define FXAA_QUALITY__P0 1.0 -# define FXAA_QUALITY__P1 1.5 -# define FXAA_QUALITY__P2 2.0 -# define FXAA_QUALITY__P3 2.0 -# define FXAA_QUALITY__P4 2.0 -# define FXAA_QUALITY__P5 3.0 -# define FXAA_QUALITY__P6 8.0 -#endif -/*--------------------------------------------------------------------------*/ -#if (FXAA_QUALITY__PRESET == 25) -# define FXAA_QUALITY__PS 8 -# define FXAA_QUALITY__P0 1.0 -# define FXAA_QUALITY__P1 1.5 -# define FXAA_QUALITY__P2 2.0 -# define FXAA_QUALITY__P3 2.0 -# define FXAA_QUALITY__P4 2.0 -# define FXAA_QUALITY__P5 2.0 -# define FXAA_QUALITY__P6 4.0 -# define FXAA_QUALITY__P7 8.0 -#endif -/*--------------------------------------------------------------------------*/ -#if (FXAA_QUALITY__PRESET == 26) -# define FXAA_QUALITY__PS 9 -# define FXAA_QUALITY__P0 1.0 -# define FXAA_QUALITY__P1 1.5 -# define FXAA_QUALITY__P2 2.0 -# define FXAA_QUALITY__P3 2.0 -# define FXAA_QUALITY__P4 2.0 -# define FXAA_QUALITY__P5 2.0 -# define FXAA_QUALITY__P6 2.0 -# define FXAA_QUALITY__P7 4.0 -# define FXAA_QUALITY__P8 8.0 -#endif -/*--------------------------------------------------------------------------*/ -#if (FXAA_QUALITY__PRESET == 27) -# define FXAA_QUALITY__PS 10 -# define FXAA_QUALITY__P0 1.0 -# define FXAA_QUALITY__P1 1.5 -# define FXAA_QUALITY__P2 2.0 -# define FXAA_QUALITY__P3 2.0 -# define FXAA_QUALITY__P4 2.0 -# define FXAA_QUALITY__P5 2.0 -# define FXAA_QUALITY__P6 2.0 -# define FXAA_QUALITY__P7 2.0 -# define FXAA_QUALITY__P8 4.0 -# define FXAA_QUALITY__P9 8.0 -#endif -/*--------------------------------------------------------------------------*/ -#if (FXAA_QUALITY__PRESET == 28) -# define FXAA_QUALITY__PS 11 -# define FXAA_QUALITY__P0 1.0 -# define FXAA_QUALITY__P1 1.5 -# define FXAA_QUALITY__P2 2.0 -# define FXAA_QUALITY__P3 2.0 -# define FXAA_QUALITY__P4 2.0 -# define FXAA_QUALITY__P5 2.0 -# define FXAA_QUALITY__P6 2.0 -# define FXAA_QUALITY__P7 2.0 -# define FXAA_QUALITY__P8 2.0 -# define FXAA_QUALITY__P9 4.0 -# define FXAA_QUALITY__P10 8.0 -#endif -/*--------------------------------------------------------------------------*/ -#if (FXAA_QUALITY__PRESET == 29) -# define FXAA_QUALITY__PS 12 -# define FXAA_QUALITY__P0 1.0 -# define FXAA_QUALITY__P1 1.5 -# define FXAA_QUALITY__P2 2.0 -# define FXAA_QUALITY__P3 2.0 -# define FXAA_QUALITY__P4 2.0 -# define FXAA_QUALITY__P5 2.0 -# define FXAA_QUALITY__P6 2.0 -# define FXAA_QUALITY__P7 2.0 -# define FXAA_QUALITY__P8 2.0 -# define FXAA_QUALITY__P9 2.0 -# define FXAA_QUALITY__P10 4.0 -# define FXAA_QUALITY__P11 8.0 -#endif - -/*============================================================================ - FXAA QUALITY - EXTREME QUALITY -============================================================================*/ -#if (FXAA_QUALITY__PRESET == 39) -# define FXAA_QUALITY__PS 12 -# define FXAA_QUALITY__P0 1.0 -# define FXAA_QUALITY__P1 1.0 -# define FXAA_QUALITY__P2 1.0 -# define FXAA_QUALITY__P3 1.0 -# define FXAA_QUALITY__P4 1.0 -# define FXAA_QUALITY__P5 1.5 -# define FXAA_QUALITY__P6 2.0 -# define FXAA_QUALITY__P7 2.0 -# define FXAA_QUALITY__P8 2.0 -# define FXAA_QUALITY__P9 2.0 -# define FXAA_QUALITY__P10 4.0 -# define FXAA_QUALITY__P11 8.0 -#endif - -#define FxaaSat(x) clamp(x, 0.0, 1.0) - -#ifdef FXAA_ALPHA - -# define FxaaTexTop(t, p) textureLod(t, p, 0.0).aaaa -# define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o).aaaa -# define FxaaLuma(rgba) rgba.a - -#else - -# define FxaaTexTop(t, p) textureLod(t, p, 0.0) -# define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o) - -/* (#B1#) */ -float FxaaLuma(vec4 rgba) -{ - // note: sqrt because the sampled colors are in a linear colorspace! - // this approximates a perceptual conversion, which is good enough for the - // algorithm - return sqrt(dot(rgba.rgb, vec3(0.2126, 0.7152, 0.0722))); -} - -#endif - -/*============================================================================ - - FXAA3 QUALITY - PC - -============================================================================*/ -/*--------------------------------------------------------------------------*/ -vec4 FxaaPixelShader( - // - // Use noperspective interpolation here (turn off perspective interpolation). - // {xy} = center of pixel - vec2 pos, - // - // Input color texture. - // {rgb_} = color in linear or perceptual color space - sampler2D tex, - // - // Only used on FXAA Quality. - // This must be from a constant/uniform. - // {x_} = 1.0/screenWidthInPixels - // {_y} = 1.0/screenHeightInPixels - vec2 fxaaQualityRcpFrame, - // - // Only used on FXAA Quality. - // This used to be the FXAA_QUALITY__SUBPIX define. - // It is here now to allow easier tuning. - // Choose the amount of sub-pixel aliasing removal. - // This can effect sharpness. - // 1.00 - upper limit (softer) - // 0.75 - default amount of filtering - // 0.50 - lower limit (sharper, less sub-pixel aliasing removal) - // 0.25 - almost off - // 0.00 - completely off - float fxaaQualitySubpix, - // - // Only used on FXAA Quality. - // This used to be the FXAA_QUALITY__EDGE_THRESHOLD define. - // It is here now to allow easier tuning. - // The minimum amount of local contrast required to apply algorithm. - // 0.333 - too little (faster) - // 0.250 - low quality - // 0.166 - default - // 0.125 - high quality - // 0.063 - overkill (slower) - float fxaaQualityEdgeThreshold, - // - // Only used on FXAA Quality. - // This used to be the FXAA_QUALITY__EDGE_THRESHOLD_MIN define. - // It is here now to allow easier tuning. - // Trims the algorithm from processing darks. - // 0.0833 - upper limit (default, the start of visible unfiltered edges) - // 0.0625 - high quality (faster) - // 0.0312 - visible limit (slower) - float fxaaQualityEdgeThresholdMin) -{ - /*--------------------------------------------------------------------------*/ - vec2 posM; - posM.x = pos.x; - posM.y = pos.y; - vec4 rgbyM = FxaaTexTop(tex, posM); - float lumaM = FxaaLuma(rgbyM); // (#B4#) - float lumaS = FxaaLuma(FxaaTexOff(tex, posM, ivec2(0, 1), fxaaQualityRcpFrame.xy)); - float lumaE = FxaaLuma(FxaaTexOff(tex, posM, ivec2(1, 0), fxaaQualityRcpFrame.xy)); - float lumaN = FxaaLuma(FxaaTexOff(tex, posM, ivec2(0, -1), fxaaQualityRcpFrame.xy)); - float lumaW = FxaaLuma(FxaaTexOff(tex, posM, ivec2(-1, 0), fxaaQualityRcpFrame.xy)); - /*--------------------------------------------------------------------------*/ - float maxSM = max(lumaS, lumaM); - float minSM = min(lumaS, lumaM); - float maxESM = max(lumaE, maxSM); - float minESM = min(lumaE, minSM); - float maxWN = max(lumaN, lumaW); - float minWN = min(lumaN, lumaW); - float rangeMax = max(maxWN, maxESM); - float rangeMin = min(minWN, minESM); - float rangeMaxScaled = rangeMax * fxaaQualityEdgeThreshold; - float range = rangeMax - rangeMin; - float rangeMaxClamped = max(fxaaQualityEdgeThresholdMin, rangeMaxScaled); - bool earlyExit = range < rangeMaxClamped; - /*--------------------------------------------------------------------------*/ - if (earlyExit) { - return rgbyM; - } - /*--------------------------------------------------------------------------*/ - float lumaNW = FxaaLuma(FxaaTexOff(tex, posM, ivec2(-1, -1), fxaaQualityRcpFrame.xy)); - float lumaSE = FxaaLuma(FxaaTexOff(tex, posM, ivec2(1, 1), fxaaQualityRcpFrame.xy)); - float lumaNE = FxaaLuma(FxaaTexOff(tex, posM, ivec2(1, -1), fxaaQualityRcpFrame.xy)); - float lumaSW = FxaaLuma(FxaaTexOff(tex, posM, ivec2(-1, 1), fxaaQualityRcpFrame.xy)); - /*--------------------------------------------------------------------------*/ - float lumaNS = lumaN + lumaS; - float lumaWE = lumaW + lumaE; - float subpixRcpRange = 1.0 / range; - float subpixNSWE = lumaNS + lumaWE; - float edgeHorz1 = (-2.0 * lumaM) + lumaNS; - float edgeVert1 = (-2.0 * lumaM) + lumaWE; - /*--------------------------------------------------------------------------*/ - float lumaNESE = lumaNE + lumaSE; - float lumaNWNE = lumaNW + lumaNE; - float edgeHorz2 = (-2.0 * lumaE) + lumaNESE; - float edgeVert2 = (-2.0 * lumaN) + lumaNWNE; - /*--------------------------------------------------------------------------*/ - float lumaNWSW = lumaNW + lumaSW; - float lumaSWSE = lumaSW + lumaSE; - float edgeHorz4 = (abs(edgeHorz1) * 2.0) + abs(edgeHorz2); - float edgeVert4 = (abs(edgeVert1) * 2.0) + abs(edgeVert2); - float edgeHorz3 = (-2.0 * lumaW) + lumaNWSW; - float edgeVert3 = (-2.0 * lumaS) + lumaSWSE; - float edgeHorz = abs(edgeHorz3) + edgeHorz4; - float edgeVert = abs(edgeVert3) + edgeVert4; - /*--------------------------------------------------------------------------*/ - float subpixNWSWNESE = lumaNWSW + lumaNESE; - float lengthSign = fxaaQualityRcpFrame.x; - bool horzSpan = edgeHorz >= edgeVert; - float subpixA = subpixNSWE * 2.0 + subpixNWSWNESE; - /*--------------------------------------------------------------------------*/ - if (!horzSpan) { - lumaN = lumaW; - } - if (!horzSpan) { - lumaS = lumaE; - } - if (horzSpan) { - lengthSign = fxaaQualityRcpFrame.y; - } - float subpixB = (subpixA * (1.0 / 12.0)) - lumaM; - /*--------------------------------------------------------------------------*/ - float gradientN = lumaN - lumaM; - float gradientS = lumaS - lumaM; - float lumaNN = lumaN + lumaM; - float lumaSS = lumaS + lumaM; - bool pairN = abs(gradientN) >= abs(gradientS); - float gradient = max(abs(gradientN), abs(gradientS)); - if (pairN) { - lengthSign = -lengthSign; - } - float subpixC = FxaaSat(abs(subpixB) * subpixRcpRange); - /*--------------------------------------------------------------------------*/ - vec2 posB; - posB.x = posM.x; - posB.y = posM.y; - vec2 offNP; - offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x; - offNP.y = (horzSpan) ? 0.0 : fxaaQualityRcpFrame.y; - if (!horzSpan) { - posB.x += lengthSign * 0.5; - } - if (horzSpan) { - posB.y += lengthSign * 0.5; - } - /*--------------------------------------------------------------------------*/ - vec2 posN; - posN.x = posB.x - offNP.x * FXAA_QUALITY__P0; - posN.y = posB.y - offNP.y * FXAA_QUALITY__P0; - vec2 posP; - posP.x = posB.x + offNP.x * FXAA_QUALITY__P0; - posP.y = posB.y + offNP.y * FXAA_QUALITY__P0; - float subpixD = ((-2.0) * subpixC) + 3.0; - float lumaEndN = FxaaLuma(FxaaTexTop(tex, posN)); - float subpixE = subpixC * subpixC; - float lumaEndP = FxaaLuma(FxaaTexTop(tex, posP)); - /*--------------------------------------------------------------------------*/ - if (!pairN) { - lumaNN = lumaSS; - } - float gradientScaled = gradient * 1.0 / 4.0; - float lumaMM = lumaM - lumaNN * 0.5; - float subpixF = subpixD * subpixE; - bool lumaMLTZero = lumaMM < 0.0; - /*--------------------------------------------------------------------------*/ - lumaEndN -= lumaNN * 0.5; - lumaEndP -= lumaNN * 0.5; - bool doneN = abs(lumaEndN) >= gradientScaled; - bool doneP = abs(lumaEndP) >= gradientScaled; - if (!doneN) { - posN.x -= offNP.x * FXAA_QUALITY__P1; - } - if (!doneN) { - posN.y -= offNP.y * FXAA_QUALITY__P1; - } - bool doneNP = (!doneN) || (!doneP); - if (!doneP) { - posP.x += offNP.x * FXAA_QUALITY__P1; - } - if (!doneP) { - posP.y += offNP.y * FXAA_QUALITY__P1; - } - /*--------------------------------------------------------------------------*/ - if (doneNP) { - if (!doneN) { - lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - } - if (!doneP) { - lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - } - if (!doneN) { - lumaEndN = lumaEndN - lumaNN * 0.5; - } - if (!doneP) { - lumaEndP = lumaEndP - lumaNN * 0.5; - } - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if (!doneN) { - posN.x -= offNP.x * FXAA_QUALITY__P2; - } - if (!doneN) { - posN.y -= offNP.y * FXAA_QUALITY__P2; - } - doneNP = (!doneN) || (!doneP); - if (!doneP) { - posP.x += offNP.x * FXAA_QUALITY__P2; - } - if (!doneP) { - posP.y += offNP.y * FXAA_QUALITY__P2; - } - /*--------------------------------------------------------------------------*/ -#if (FXAA_QUALITY__PS > 3) - if (doneNP) { - if (!doneN) { - lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - } - if (!doneP) { - lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - } - if (!doneN) { - lumaEndN = lumaEndN - lumaNN * 0.5; - } - if (!doneP) { - lumaEndP = lumaEndP - lumaNN * 0.5; - } - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if (!doneN) { - posN.x -= offNP.x * FXAA_QUALITY__P3; - } - if (!doneN) { - posN.y -= offNP.y * FXAA_QUALITY__P3; - } - doneNP = (!doneN) || (!doneP); - if (!doneP) { - posP.x += offNP.x * FXAA_QUALITY__P3; - } - if (!doneP) { - posP.y += offNP.y * FXAA_QUALITY__P3; - } - /*--------------------------------------------------------------------------*/ -# if (FXAA_QUALITY__PS > 4) - if (doneNP) { - if (!doneN) { - lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - } - if (!doneP) { - lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - } - if (!doneN) { - lumaEndN = lumaEndN - lumaNN * 0.5; - } - if (!doneP) { - lumaEndP = lumaEndP - lumaNN * 0.5; - } - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if (!doneN) { - posN.x -= offNP.x * FXAA_QUALITY__P4; - } - if (!doneN) { - posN.y -= offNP.y * FXAA_QUALITY__P4; - } - doneNP = (!doneN) || (!doneP); - if (!doneP) { - posP.x += offNP.x * FXAA_QUALITY__P4; - } - if (!doneP) { - posP.y += offNP.y * FXAA_QUALITY__P4; - } - /*--------------------------------------------------------------------------*/ -# if (FXAA_QUALITY__PS > 5) - if (doneNP) { - if (!doneN) { - lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - } - if (!doneP) { - lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - } - if (!doneN) { - lumaEndN = lumaEndN - lumaNN * 0.5; - } - if (!doneP) { - lumaEndP = lumaEndP - lumaNN * 0.5; - } - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if (!doneN) { - posN.x -= offNP.x * FXAA_QUALITY__P5; - } - if (!doneN) { - posN.y -= offNP.y * FXAA_QUALITY__P5; - } - doneNP = (!doneN) || (!doneP); - if (!doneP) { - posP.x += offNP.x * FXAA_QUALITY__P5; - } - if (!doneP) { - posP.y += offNP.y * FXAA_QUALITY__P5; - } - /*--------------------------------------------------------------------------*/ -# if (FXAA_QUALITY__PS > 6) - if (doneNP) { - if (!doneN) { - lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - } - if (!doneP) { - lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - } - if (!doneN) { - lumaEndN = lumaEndN - lumaNN * 0.5; - } - if (!doneP) { - lumaEndP = lumaEndP - lumaNN * 0.5; - } - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if (!doneN) { - posN.x -= offNP.x * FXAA_QUALITY__P6; - } - if (!doneN) { - posN.y -= offNP.y * FXAA_QUALITY__P6; - } - doneNP = (!doneN) || (!doneP); - if (!doneP) { - posP.x += offNP.x * FXAA_QUALITY__P6; - } - if (!doneP) { - posP.y += offNP.y * FXAA_QUALITY__P6; - } - /*--------------------------------------------------------------------------*/ -# if (FXAA_QUALITY__PS > 7) - if (doneNP) { - if (!doneN) { - lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - } - if (!doneP) { - lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - } - if (!doneN) { - lumaEndN = lumaEndN - lumaNN * 0.5; - } - if (!doneP) { - lumaEndP = lumaEndP - lumaNN * 0.5; - } - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if (!doneN) { - posN.x -= offNP.x * FXAA_QUALITY__P7; - } - if (!doneN) { - posN.y -= offNP.y * FXAA_QUALITY__P7; - } - doneNP = (!doneN) || (!doneP); - if (!doneP) { - posP.x += offNP.x * FXAA_QUALITY__P7; - } - if (!doneP) { - posP.y += offNP.y * FXAA_QUALITY__P7; - } - /*--------------------------------------------------------------------------*/ -# if (FXAA_QUALITY__PS > 8) - if (doneNP) { - if (!doneN) { - lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - } - if (!doneP) { - lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - } - if (!doneN) { - lumaEndN = lumaEndN - lumaNN * 0.5; - } - if (!doneP) { - lumaEndP = lumaEndP - lumaNN * 0.5; - } - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if (!doneN) { - posN.x -= offNP.x * FXAA_QUALITY__P8; - } - if (!doneN) { - posN.y -= offNP.y * FXAA_QUALITY__P8; - } - doneNP = (!doneN) || (!doneP); - if (!doneP) { - posP.x += offNP.x * FXAA_QUALITY__P8; - } - if (!doneP) { - posP.y += offNP.y * FXAA_QUALITY__P8; - } - /*--------------------------------------------------------------------------*/ -# if (FXAA_QUALITY__PS > 9) - if (doneNP) { - if (!doneN) { - lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - } - if (!doneP) { - lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - } - if (!doneN) { - lumaEndN = lumaEndN - lumaNN * 0.5; - } - if (!doneP) { - lumaEndP = lumaEndP - lumaNN * 0.5; - } - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if (!doneN) { - posN.x -= offNP.x * FXAA_QUALITY__P9; - } - if (!doneN) { - posN.y -= offNP.y * FXAA_QUALITY__P9; - } - doneNP = (!doneN) || (!doneP); - if (!doneP) { - posP.x += offNP.x * FXAA_QUALITY__P9; - } - if (!doneP) { - posP.y += offNP.y * FXAA_QUALITY__P9; - } - /*--------------------------------------------------------------------------*/ -# if (FXAA_QUALITY__PS > 10) - if (doneNP) { - if (!doneN) { - lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - } - if (!doneP) { - lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - } - if (!doneN) { - lumaEndN = lumaEndN - lumaNN * 0.5; - } - if (!doneP) { - lumaEndP = lumaEndP - lumaNN * 0.5; - } - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if (!doneN) { - posN.x -= offNP.x * FXAA_QUALITY__P10; - } - if (!doneN) { - posN.y -= offNP.y * FXAA_QUALITY__P10; - } - doneNP = (!doneN) || (!doneP); - if (!doneP) { - posP.x += offNP.x * FXAA_QUALITY__P10; - } - if (!doneP) { - posP.y += offNP.y * FXAA_QUALITY__P10; - } - /*-------------------------------------------------------------------------*/ -# if (FXAA_QUALITY__PS > 11) - if (doneNP) { - if (!doneN) { - lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - } - if (!doneP) { - lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - } - if (!doneN) { - lumaEndN = lumaEndN - lumaNN * 0.5; - } - if (!doneP) { - lumaEndP = lumaEndP - lumaNN * 0.5; - } - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if (!doneN) { - posN.x -= offNP.x * FXAA_QUALITY__P11; - } - if (!doneN) { - posN.y -= offNP.y * FXAA_QUALITY__P11; - } - doneNP = (!doneN) || (!doneP); - if (!doneP) { - posP.x += offNP.x * FXAA_QUALITY__P11; - } - if (!doneP) { - posP.y += offNP.y * FXAA_QUALITY__P11; - } - /*-----------------------------------------------------------------------*/ -# if (FXAA_QUALITY__PS > 12) - if (doneNP) { - if (!doneN) { - lumaEndN = FxaaLuma(FxaaTexTop(tex, posN.xy)); - } - if (!doneP) { - lumaEndP = FxaaLuma(FxaaTexTop(tex, posP.xy)); - } - if (!doneN) { - lumaEndN = lumaEndN - lumaNN * 0.5; - } - if (!doneP) { - lumaEndP = lumaEndP - lumaNN * 0.5; - } - doneN = abs(lumaEndN) >= gradientScaled; - doneP = abs(lumaEndP) >= gradientScaled; - if (!doneN) { - posN.x -= offNP.x * FXAA_QUALITY__P12; - } - if (!doneN) { - posN.y -= offNP.y * FXAA_QUALITY__P12; - } - doneNP = (!doneN) || (!doneP); - if (!doneP) { - posP.x += offNP.x * FXAA_QUALITY__P12; - } - if (!doneP) { - posP.y += offNP.y * FXAA_QUALITY__P12; - } - /*-----------------------------------------------------------------------*/ - } -# endif - /*-------------------------------------------------------------------------*/ - } -# endif - /*--------------------------------------------------------------------------*/ - } -# endif - /*--------------------------------------------------------------------------*/ - } -# endif - /*--------------------------------------------------------------------------*/ - } -# endif - /*--------------------------------------------------------------------------*/ - } -# endif - /*--------------------------------------------------------------------------*/ - } -# endif - /*--------------------------------------------------------------------------*/ - } -# endif - /*--------------------------------------------------------------------------*/ - } -# endif - /*--------------------------------------------------------------------------*/ - } -#endif - /*--------------------------------------------------------------------------*/ - } - /*--------------------------------------------------------------------------*/ - float dstN = posM.x - posN.x; - float dstP = posP.x - posM.x; - if (!horzSpan) { - dstN = posM.y - posN.y; - } - if (!horzSpan) { - dstP = posP.y - posM.y; - } - /*--------------------------------------------------------------------------*/ - bool goodSpanN = (lumaEndN < 0.0) != lumaMLTZero; - float spanLength = (dstP + dstN); - bool goodSpanP = (lumaEndP < 0.0) != lumaMLTZero; - float spanLengthRcp = 1.0 / spanLength; - /*--------------------------------------------------------------------------*/ - bool directionN = dstN < dstP; - float dst = min(dstN, dstP); - bool goodSpan = directionN ? goodSpanN : goodSpanP; - float subpixG = subpixF * subpixF; - float pixelOffset = (dst * (-spanLengthRcp)) + 0.5; - float subpixH = subpixG * fxaaQualitySubpix; - /*--------------------------------------------------------------------------*/ - float pixelOffsetGood = goodSpan ? pixelOffset : 0.0; - float pixelOffsetSubpix = max(pixelOffsetGood, subpixH); - if (!horzSpan) { - posM.x += pixelOffsetSubpix * lengthSign; - } - if (horzSpan) { - posM.y += pixelOffsetSubpix * lengthSign; - } - return vec4(FxaaTexTop(tex, posM).xyz, lumaM); -} -/*==========================================================================*/ diff --git a/source/blender/draw/modes/shaders/common_globals_lib.glsl b/source/blender/draw/modes/shaders/common_globals_lib.glsl deleted file mode 100644 index d147b193ccf..00000000000 --- a/source/blender/draw/modes/shaders/common_globals_lib.glsl +++ /dev/null @@ -1,98 +0,0 @@ - -/* keep in sync with GlobalsUboStorage */ -layout(std140) uniform globalsBlock -{ - vec4 colorWire; - vec4 colorWireEdit; - vec4 colorActive; - vec4 colorSelect; - vec4 colorDupliSelect; - vec4 colorDupli; - vec4 colorLibrarySelect; - vec4 colorLibrary; - vec4 colorTransform; - vec4 colorLight; - vec4 colorSpeaker; - vec4 colorCamera; - vec4 colorEmpty; - vec4 colorVertex; - vec4 colorVertexSelect; - vec4 colorVertexUnreferenced; - vec4 colorVertexMissingData; - vec4 colorEditMeshActive; - vec4 colorEdgeSelect; - vec4 colorEdgeSeam; - vec4 colorEdgeSharp; - vec4 colorEdgeCrease; - vec4 colorEdgeBWeight; - vec4 colorEdgeFaceSelect; - vec4 colorEdgeFreestyle; - vec4 colorFace; - vec4 colorFaceSelect; - vec4 colorFaceFreestyle; - vec4 colorNormal; - vec4 colorVNormal; - vec4 colorLNormal; - vec4 colorFaceDot; - vec4 colorSkinRoot; - vec4 colorDeselect; - vec4 colorOutline; - vec4 colorLightNoAlpha; - - vec4 colorBackground; - vec4 colorEditMeshMiddle; - - vec4 colorHandleFree; - vec4 colorHandleAuto; - vec4 colorHandleVect; - vec4 colorHandleAlign; - vec4 colorHandleAutoclamp; - vec4 colorHandleSelFree; - vec4 colorHandleSelAuto; - vec4 colorHandleSelVect; - vec4 colorHandleSelAlign; - vec4 colorHandleSelAutoclamp; - vec4 colorNurbUline; - vec4 colorNurbVline; - vec4 colorNurbSelUline; - vec4 colorNurbSelVline; - vec4 colorActiveSpline; - - vec4 colorBonePose; - - vec4 colorCurrentFrame; - - vec4 colorGrid; - vec4 colorGridEmphasise; - vec4 colorGridAxisX; - vec4 colorGridAxisY; - vec4 colorGridAxisZ; - - float sizeLightCenter; - float sizeLightCircle; - float sizeLightCircleShadow; - float sizeVertex; - float sizeEdge; - float sizeEdgeFix; - float sizeFaceDot; - - float pad_globalsBlock; -}; - -/* data[0] (1st byte flags) */ -#define FACE_ACTIVE (1 << 0) -#define FACE_SELECTED (1 << 1) -#define FACE_FREESTYLE (1 << 2) -#define VERT_UV_SELECT (1 << 3) -#define VERT_UV_PINNED (1 << 4) -#define EDGE_UV_SELECT (1 << 5) -#define FACE_UV_ACTIVE (1 << 6) -#define FACE_UV_SELECT (1 << 7) -/* data[1] (2st byte flags) */ -#define VERT_ACTIVE (1 << 0) -#define VERT_SELECTED (1 << 1) -#define EDGE_ACTIVE (1 << 2) -#define EDGE_SELECTED (1 << 3) -#define EDGE_SEAM (1 << 4) -#define EDGE_SHARP (1 << 5) -#define EDGE_FREESTYLE (1 << 6) diff --git a/source/blender/draw/modes/shaders/common_hair_lib.glsl b/source/blender/draw/modes/shaders/common_hair_lib.glsl deleted file mode 100644 index cbcdc947bc7..00000000000 --- a/source/blender/draw/modes/shaders/common_hair_lib.glsl +++ /dev/null @@ -1,206 +0,0 @@ -/** - * Library to create hairs dynamically from control points. - * This is less bandwidth intensive than fetching the vertex attributes - * but does more ALU work per vertex. This also reduces the amount - * of data the CPU has to precompute and transfer for each update. - */ - -/** - * hairStrandsRes: Number of points per hair strand. - * 2 - no subdivision - * 3+ - 1 or more interpolated points per hair. - */ -uniform int hairStrandsRes = 8; - -/** - * hairThicknessRes : Subdiv around the hair. - * 1 - Wire Hair: Only one pixel thick, independent of view distance. - * 2 - Polystrip Hair: Correct width, flat if camera is parallel. - * 3+ - Cylinder Hair: Massive calculation but potentially perfect. Still need proper support. - */ -uniform int hairThicknessRes = 1; - -/* Hair thickness shape. */ -uniform float hairRadRoot = 0.01; -uniform float hairRadTip = 0.0; -uniform float hairRadShape = 0.5; -uniform bool hairCloseTip = true; - -uniform mat4 hairDupliMatrix; - -/* -- Per control points -- */ -uniform samplerBuffer hairPointBuffer; /* RGBA32F */ -#define point_position xyz -#define point_time w /* Position along the hair length */ - -/* -- Per strands data -- */ -uniform usamplerBuffer hairStrandBuffer; /* R32UI */ -uniform usamplerBuffer hairStrandSegBuffer; /* R16UI */ - -/* Not used, use one buffer per uv layer */ -// uniform samplerBuffer hairUVBuffer; /* RG32F */ -// uniform samplerBuffer hairColBuffer; /* RGBA16 linear color */ - -/* -- Subdivision stage -- */ -/** - * We use a transform feedback to preprocess the strands and add more subdivision to it. - * For the moment these are simple smooth interpolation but one could hope to see the full - * children particle modifiers being evaluated at this stage. - * - * If no more subdivision is needed, we can skip this step. - */ - -#ifdef HAIR_PHASE_SUBDIV -int hair_get_base_id(float local_time, int strand_segments, out float interp_time) -{ - float time_per_strand_seg = 1.0 / float(strand_segments); - - float ratio = local_time / time_per_strand_seg; - interp_time = fract(ratio); - - return int(ratio); -} - -void hair_get_interp_attrs( - out vec4 data0, out vec4 data1, out vec4 data2, out vec4 data3, out float interp_time) -{ - float local_time = float(gl_VertexID % hairStrandsRes) / float(hairStrandsRes - 1); - - int hair_id = gl_VertexID / hairStrandsRes; - int strand_offset = int(texelFetch(hairStrandBuffer, hair_id).x); - int strand_segments = int(texelFetch(hairStrandSegBuffer, hair_id).x); - - int id = hair_get_base_id(local_time, strand_segments, interp_time); - - int ofs_id = id + strand_offset; - - data0 = texelFetch(hairPointBuffer, ofs_id - 1); - data1 = texelFetch(hairPointBuffer, ofs_id); - data2 = texelFetch(hairPointBuffer, ofs_id + 1); - data3 = texelFetch(hairPointBuffer, ofs_id + 2); - - if (id <= 0) { - /* root points. Need to reconstruct previous data. */ - data0 = data1 * 2.0 - data2; - } - if (id + 1 >= strand_segments) { - /* tip points. Need to reconstruct next data. */ - data3 = data2 * 2.0 - data1; - } -} -#endif - -/* -- Drawing stage -- */ -/** - * For final drawing, the vertex index and the number of vertex per segment - */ - -#ifndef HAIR_PHASE_SUBDIV -int hair_get_strand_id(void) -{ - return gl_VertexID / (hairStrandsRes * hairThicknessRes); -} - -int hair_get_base_id(void) -{ - return gl_VertexID / hairThicknessRes; -} - -/* Copied from cycles. */ -float hair_shaperadius(float shape, float root, float tip, float time) -{ - float radius = 1.0 - time; - - if (shape < 0.0) { - radius = pow(radius, 1.0 + shape); - } - else { - radius = pow(radius, 1.0 / (1.0 - shape)); - } - - if (hairCloseTip && (time > 0.99)) { - return 0.0; - } - - return (radius * (root - tip)) + tip; -} - -# ifdef OS_MAC -in float dummy; -# endif - -void hair_get_pos_tan_binor_time(bool is_persp, - mat4 invmodel_mat, - vec3 camera_pos, - vec3 camera_z, - out vec3 wpos, - out vec3 wtan, - out vec3 wbinor, - out float time, - out float thickness, - out float thick_time) -{ - int id = hair_get_base_id(); - vec4 data = texelFetch(hairPointBuffer, id); - wpos = data.point_position; - time = data.point_time; - -# ifdef OS_MAC - /* Generate a dummy read to avoid the driver bug with shaders having no - * vertex reads on macOS (T60171) */ - wpos.y += dummy * 0.0; -# endif - - if (time == 0.0) { - /* Hair root */ - wtan = texelFetch(hairPointBuffer, id + 1).point_position - wpos; - } - else { - wtan = wpos - texelFetch(hairPointBuffer, id - 1).point_position; - } - - wpos = (hairDupliMatrix * vec4(wpos, 1.0)).xyz; - wtan = -normalize(mat3(hairDupliMatrix) * wtan); - - vec3 camera_vec = (is_persp) ? camera_pos - wpos : camera_z; - wbinor = normalize(cross(camera_vec, wtan)); - - thickness = hair_shaperadius(hairRadShape, hairRadRoot, hairRadTip, time); - - if (hairThicknessRes > 1) { - thick_time = float(gl_VertexID % hairThicknessRes) / float(hairThicknessRes - 1); - thick_time = thickness * (thick_time * 2.0 - 1.0); - - /* Take object scale into account. - * NOTE: This only works fine with uniform scaling. */ - float scale = 1.0 / length(mat3(invmodel_mat) * wbinor); - - wpos += wbinor * thick_time * scale; - } -} - -vec2 hair_get_customdata_vec2(const samplerBuffer cd_buf) -{ - int id = hair_get_strand_id(); - return texelFetch(cd_buf, id).rg; -} - -vec3 hair_get_customdata_vec3(const samplerBuffer cd_buf) -{ - int id = hair_get_strand_id(); - return texelFetch(cd_buf, id).rgb; -} - -vec4 hair_get_customdata_vec4(const samplerBuffer cd_buf) -{ - int id = hair_get_strand_id(); - return texelFetch(cd_buf, id).rgba; -} - -vec3 hair_get_strand_pos(void) -{ - int id = hair_get_strand_id() * hairStrandsRes; - return texelFetch(hairPointBuffer, id).point_position; -} - -#endif diff --git a/source/blender/draw/modes/shaders/common_hair_refine_vert.glsl b/source/blender/draw/modes/shaders/common_hair_refine_vert.glsl deleted file mode 100644 index 3f5e3f8226f..00000000000 --- a/source/blender/draw/modes/shaders/common_hair_refine_vert.glsl +++ /dev/null @@ -1,71 +0,0 @@ - -/* To be compiled with common_hair_lib.glsl */ - -out vec4 finalColor; - -vec4 get_weights_cardinal(float t) -{ - float t2 = t * t; - float t3 = t2 * t; -#if defined(CARDINAL) - float fc = 0.71; -#else /* defined(CATMULL_ROM) */ - float fc = 0.5; -#endif - - vec4 weights; - /* GLSL Optimized version of key_curve_position_weights() */ - float fct = t * fc; - float fct2 = t2 * fc; - float fct3 = t3 * fc; - weights.x = (fct2 * 2.0 - fct3) - fct; - weights.y = (t3 * 2.0 - fct3) + (-t2 * 3.0 + fct2) + 1.0; - weights.z = (-t3 * 2.0 + fct3) + (t2 * 3.0 - (2.0 * fct2)) + fct; - weights.w = fct3 - fct2; - return weights; -} - -/* TODO(fclem): This one is buggy, find why. (it's not the optimization!!) */ -vec4 get_weights_bspline(float t) -{ - float t2 = t * t; - float t3 = t2 * t; - - vec4 weights; - /* GLSL Optimized version of key_curve_position_weights() */ - weights.xz = vec2(-0.16666666, -0.5) * t3 + (0.5 * t2 + 0.5 * vec2(-t, t) + 0.16666666); - weights.y = (0.5 * t3 - t2 + 0.66666666); - weights.w = (0.16666666 * t3); - return weights; -} - -vec4 interp_data(vec4 v0, vec4 v1, vec4 v2, vec4 v3, vec4 w) -{ - return v0 * w.x + v1 * w.y + v2 * w.z + v3 * w.w; -} - -#ifdef TF_WORKAROUND -uniform int targetWidth; -uniform int targetHeight; -uniform int idOffset; -#endif - -void main(void) -{ - float interp_time; - vec4 data0, data1, data2, data3; - hair_get_interp_attrs(data0, data1, data2, data3, interp_time); - - vec4 weights = get_weights_cardinal(interp_time); - finalColor = interp_data(data0, data1, data2, data3, weights); - -#ifdef TF_WORKAROUND - int id = gl_VertexID - idOffset; - gl_Position.x = ((float(id % targetWidth) + 0.5) / float(targetWidth)) * 2.0 - 1.0; - gl_Position.y = ((float(id / targetWidth) + 0.5) / float(targetHeight)) * 2.0 - 1.0; - gl_Position.z = 0.0; - gl_Position.w = 1.0; - - gl_PointSize = 1.0; -#endif -} diff --git a/source/blender/draw/modes/shaders/common_view_lib.glsl b/source/blender/draw/modes/shaders/common_view_lib.glsl deleted file mode 100644 index 76089d1ae41..00000000000 --- a/source/blender/draw/modes/shaders/common_view_lib.glsl +++ /dev/null @@ -1,137 +0,0 @@ -#define COMMON_VIEW_LIB -#define DRW_RESOURCE_CHUNK_LEN 512 - -/* keep in sync with DRWManager.view_data */ -layout(std140) uniform viewBlock -{ - /* Same order as DRWViewportMatrixType */ - mat4 ViewProjectionMatrix; - mat4 ViewProjectionMatrixInverse; - mat4 ViewMatrix; - mat4 ViewMatrixInverse; - mat4 ProjectionMatrix; - mat4 ProjectionMatrixInverse; - - vec4 clipPlanes[6]; - - /* TODO move it elsewhere. */ - vec4 CameraTexCoFactors; -}; - -#ifdef world_clip_planes_calc_clip_distance -# undef world_clip_planes_calc_clip_distance -# define world_clip_planes_calc_clip_distance(p) \ - _world_clip_planes_calc_clip_distance(p, clipPlanes) -#endif - -uniform int resourceChunk; - -#ifdef GPU_VERTEX_SHADER -# ifdef GL_ARB_shader_draw_parameters -# define baseInstance gl_BaseInstanceARB -# else /* no ARB_shader_draw_parameters */ -uniform int baseInstance; -# endif - -# ifdef IN_PLACE_INSTANCES -/* When drawing instances of an object at the same position. */ -# define instanceId 0 -# elif defined(GPU_DEPRECATED_AMD_DRIVER) -/* A driver bug make it so that when using an attribute with GL_INT_2_10_10_10_REV as format, - * the gl_InstanceID is incremented by the 2 bit component of the attrib. - * Ignore gl_InstanceID then. */ -# define instanceId 0 -# else -# define instanceId gl_InstanceID -# endif - -# define resource_id (baseInstance + instanceId) - -/* Use this to declare and pass the value if - * the fragment shader uses the resource_id. */ -# define RESOURCE_ID_VARYING flat out int resourceIDFrag; -# define RESOURCE_ID_VARYING_GEOM flat out int resourceIDGeom; -# define PASS_RESOURCE_ID resourceIDFrag = resource_id; -# define PASS_RESOURCE_ID_GEOM resourceIDGeom = resource_id; -#endif - -/* If used in a fragment / geometry shader, we pass - * resource_id as varying. */ -#ifdef GPU_GEOMETRY_SHADER -# define RESOURCE_ID_VARYING \ - flat out int resourceIDFrag; \ - flat in int resourceIDGeom[]; - -# define resource_id resourceIDGeom -# define PASS_RESOURCE_ID(i) resourceIDFrag = resource_id[i]; -#endif - -#ifdef GPU_FRAGMENT_SHADER -flat in int resourceIDFrag; -# define resource_id resourceIDFrag -#endif - -#if !defined(GPU_INTEL) && !defined(GPU_DEPRECATED_AMD_DRIVER) && !defined(OS_MAC) -struct ObjectMatrices { - mat4 drw_modelMatrix; - mat4 drw_modelMatrixInverse; -}; - -layout(std140) uniform modelBlock -{ - ObjectMatrices drw_matrices[DRW_RESOURCE_CHUNK_LEN]; -}; - -# define ModelMatrix (drw_matrices[resource_id].drw_modelMatrix) -# define ModelMatrixInverse (drw_matrices[resource_id].drw_modelMatrixInverse) - -#else /* GPU_INTEL */ -/* Intel GPU seems to suffer performance impact when the model matrix is in UBO storage. - * So for now we just force using the legacy path. */ -/* Note that this is also a workaround of a problem on osx (amd or nvidia) - * and older amd driver on windows. */ -uniform mat4 ModelMatrix; -uniform mat4 ModelMatrixInverse; -#endif - -#define resource_handle (resourceChunk * DRW_RESOURCE_CHUNK_LEN + resource_id) - -/** Transform shortcuts. */ -/* Rule of thumb: Try to reuse world positions and normals because converting though viewspace - * will always be decomposed in at least 2 matrix operation. */ - -/** - * Some clarification: - * Usually Normal matrix is transpose(inverse(ViewMatrix * ModelMatrix)) - * - * But since it is slow to multiply matrices we decompose it. Decomposing - * inversion and transposition both invert the product order leaving us with - * the same original order: - * transpose(ViewMatrixInverse) * transpose(ModelMatrixInverse) - * - * Knowing that the view matrix is orthogonal, the transpose is also the inverse. - * Note: This is only valid because we are only using the mat3 of the ViewMatrixInverse. - * ViewMatrix * transpose(ModelMatrixInverse) - **/ -#define normal_object_to_view(n) (mat3(ViewMatrix) * (transpose(mat3(ModelMatrixInverse)) * n)) -#define normal_object_to_world(n) (transpose(mat3(ModelMatrixInverse)) * n) -#define normal_world_to_object(n) (transpose(mat3(ModelMatrix)) * n) -#define normal_world_to_view(n) (mat3(ViewMatrix) * n) - -#define point_object_to_ndc(p) (ViewProjectionMatrix * vec4((ModelMatrix * vec4(p, 1.0)).xyz, 1.0)) -#define point_object_to_view(p) ((ViewMatrix * vec4((ModelMatrix * vec4(p, 1.0)).xyz, 1.0)).xyz) -#define point_object_to_world(p) ((ModelMatrix * vec4(p, 1.0)).xyz) -#define point_view_to_ndc(p) (ProjectionMatrix * vec4(p, 1.0)) -#define point_view_to_object(p) ((ModelMatrixInverse * (ViewMatrixInverse * vec4(p, 1.0))).xyz) -#define point_view_to_world(p) ((ViewMatrixInverse * vec4(p, 1.0)).xyz) -#define point_world_to_ndc(p) (ViewProjectionMatrix * vec4(p, 1.0)) -#define point_world_to_object(p) ((ModelMatrixInverse * vec4(p, 1.0)).xyz) -#define point_world_to_view(p) ((ViewMatrix * vec4(p, 1.0)).xyz) - -/* Due to some shader compiler bug, we somewhat need to access gl_VertexID - * to make vertex shaders work. even if it's actually dead code. */ -#ifdef GPU_INTEL -# define GPU_INTEL_VERTEX_SHADER_WORKAROUND gl_Position.x = float(gl_VertexID); -#else -# define GPU_INTEL_VERTEX_SHADER_WORKAROUND -#endif diff --git a/source/blender/draw/modes/shaders/edit_curve_overlay_handle_geom.glsl b/source/blender/draw/modes/shaders/edit_curve_overlay_handle_geom.glsl deleted file mode 100644 index d5674e8f570..00000000000 --- a/source/blender/draw/modes/shaders/edit_curve_overlay_handle_geom.glsl +++ /dev/null @@ -1,115 +0,0 @@ - -/* Keep the same value of `ACTIVE_NURB` in `draw_cache_imp_curve.c` */ -#define ACTIVE_NURB 1 << 2 -#define EVEN_U_BIT 1 << 3 - -layout(lines) in; -layout(triangle_strip, max_vertices = 10) out; - -uniform vec2 viewportSize; -uniform bool showCurveHandles; - -flat in int vertFlag[]; - -out vec4 finalColor; - -void output_line(vec2 offset, vec4 color) -{ - finalColor = color; - - gl_Position = gl_in[0].gl_Position; - gl_Position.xy += offset * gl_in[0].gl_Position.w; -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_set_clip_distance(gl_in[0].gl_ClipDistance); -#endif - EmitVertex(); - - gl_Position = gl_in[1].gl_Position; - gl_Position.xy += offset * gl_in[1].gl_Position.w; -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_set_clip_distance(gl_in[1].gl_ClipDistance); -#endif - EmitVertex(); -} - -void main() -{ - vec4 v1 = gl_in[0].gl_Position; - vec4 v2 = gl_in[1].gl_Position; - - int is_active_nurb = (vertFlag[1] & ACTIVE_NURB); - int color_id = (vertFlag[1] >> 4); - - /* Don't output any edges if we don't show handles */ - if (!showCurveHandles && (color_id < 5)) { - return; - } - - bool edge_selected = (((vertFlag[1] | vertFlag[0]) & VERT_SELECTED) != 0); - - vec4 inner_color; - if (color_id == 0) { - inner_color = (edge_selected) ? colorHandleSelFree : colorHandleFree; - } - else if (color_id == 1) { - inner_color = (edge_selected) ? colorHandleSelAuto : colorHandleAuto; - } - else if (color_id == 2) { - inner_color = (edge_selected) ? colorHandleSelVect : colorHandleVect; - } - else if (color_id == 3) { - inner_color = (edge_selected) ? colorHandleSelAlign : colorHandleAlign; - } - else if (color_id == 4) { - inner_color = (edge_selected) ? colorHandleSelAutoclamp : colorHandleAutoclamp; - } - else { - bool is_selected = (((vertFlag[1] & vertFlag[0]) & VERT_SELECTED) != 0); - bool is_u_segment = (((vertFlag[1] ^ vertFlag[0]) & EVEN_U_BIT) != 0); - if (is_u_segment) { - inner_color = (is_selected) ? colorNurbSelUline : colorNurbUline; - } - else { - inner_color = (is_selected) ? colorNurbSelVline : colorNurbVline; - } - } - - vec4 outer_color = (is_active_nurb != 0) ? - mix(colorActiveSpline, - inner_color, - 0.25) /* Minimize active color bleeding on inner_color. */ - : - vec4(inner_color.rgb, 0.0); - - vec2 v1_2 = (v2.xy / v2.w - v1.xy / v1.w); - vec2 offset = sizeEdge * 4.0 / viewportSize; /* 4.0 is eyeballed */ - - if (abs(v1_2.x * viewportSize.x) < abs(v1_2.y * viewportSize.y)) { - offset.y = 0.0; - } - else { - offset.x = 0.0; - } - - /* draw the transparent border (AA). */ - if (is_active_nurb != 0) { - offset *= 0.75; /* Don't make the active "halo" appear very thick. */ - output_line(offset * 2.0, vec4(colorActiveSpline.rgb, 0.0)); - } - - /* draw the outline. */ - output_line(offset, outer_color); - - /* draw the core of the line. */ - output_line(vec2(0.0), inner_color); - - /* draw the outline. */ - output_line(-offset, outer_color); - - /* draw the transparent border (AA). */ - if (is_active_nurb != 0) { - output_line(offset * -2.0, vec4(colorActiveSpline.rgb, 0.0)); - } - - EndPrimitive(); -} diff --git a/source/blender/draw/modes/shaders/edit_curve_overlay_handle_vert.glsl b/source/blender/draw/modes/shaders/edit_curve_overlay_handle_vert.glsl deleted file mode 100644 index 590c2905be6..00000000000 --- a/source/blender/draw/modes/shaders/edit_curve_overlay_handle_vert.glsl +++ /dev/null @@ -1,19 +0,0 @@ -/* Draw Curve Handles */ - -in vec3 pos; -in int data; - -flat out int vertFlag; - -void main() -{ - GPU_INTEL_VERTEX_SHADER_WORKAROUND - - vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); - vertFlag = data; - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif -} diff --git a/source/blender/draw/modes/shaders/edit_curve_overlay_loosevert_vert.glsl b/source/blender/draw/modes/shaders/edit_curve_overlay_loosevert_vert.glsl deleted file mode 100644 index 6eec43d99be..00000000000 --- a/source/blender/draw/modes/shaders/edit_curve_overlay_loosevert_vert.glsl +++ /dev/null @@ -1,32 +0,0 @@ -/* Draw Curve Vertices */ - -uniform vec2 viewportSize; - -in vec3 pos; -in int data; - -out vec4 finalColor; - -void main() -{ - GPU_INTEL_VERTEX_SHADER_WORKAROUND - - if ((data & VERT_SELECTED) != 0) { - if ((data & VERT_ACTIVE) != 0) { - finalColor = colorEditMeshActive; - } - else { - finalColor = colorVertexSelect; - } - } - else { - finalColor = colorVertex; - } - - vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); - gl_PointSize = sizeVertex * 2.0; -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif -} diff --git a/source/blender/draw/modes/shaders/edit_curve_overlay_normals_vert.glsl b/source/blender/draw/modes/shaders/edit_curve_overlay_normals_vert.glsl deleted file mode 100644 index e1d5319ffb9..00000000000 --- a/source/blender/draw/modes/shaders/edit_curve_overlay_normals_vert.glsl +++ /dev/null @@ -1,28 +0,0 @@ -/* Draw Curve Normals */ - -uniform float normalSize; - -in vec3 pos; -in vec3 nor; -in vec3 tan; -in float rad; - -void main() -{ - GPU_INTEL_VERTEX_SHADER_WORKAROUND - - vec3 final_pos = pos; - - float flip = (gl_InstanceID != 0) ? -1.0 : 1.0; - - if (gl_VertexID % 2 == 0) { - final_pos += normalSize * rad * (flip * nor - tan); - } - - vec3 world_pos = point_object_to_world(final_pos); - gl_Position = point_world_to_ndc(world_pos); - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif -} diff --git a/source/blender/draw/modes/shaders/edit_lattice_overlay_frag.glsl b/source/blender/draw/modes/shaders/edit_lattice_overlay_frag.glsl deleted file mode 100644 index e674b802f65..00000000000 --- a/source/blender/draw/modes/shaders/edit_lattice_overlay_frag.glsl +++ /dev/null @@ -1,19 +0,0 @@ - -flat in int vertFlag; - -out vec4 FragColor; - -void main() -{ - /* TODO: vertex size */ - - if ((vertFlag & VERT_SELECTED) != 0) { - FragColor = colorVertexSelect; - } - else if ((vertFlag & VERT_ACTIVE) != 0) { - FragColor = colorEditMeshActive; - } - else { - FragColor = colorVertex; - } -} diff --git a/source/blender/draw/modes/shaders/edit_lattice_overlay_loosevert_vert.glsl b/source/blender/draw/modes/shaders/edit_lattice_overlay_loosevert_vert.glsl deleted file mode 100644 index bc1975bac81..00000000000 --- a/source/blender/draw/modes/shaders/edit_lattice_overlay_loosevert_vert.glsl +++ /dev/null @@ -1,44 +0,0 @@ -/* Draw Lattice Vertices */ - -uniform vec2 viewportSize; - -in vec3 pos; -in int data; - -/* these are the same for all vertices - * and does not need interpolation */ -flat out int vertFlag; -flat out int clipCase; - -/* See fragment shader */ -noperspective out vec4 eData1; -flat out vec4 eData2; - -/* project to screen space */ -vec2 proj(vec4 pos) -{ - return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize; -} - -void main() -{ - GPU_INTEL_VERTEX_SHADER_WORKAROUND - - clipCase = 0; - - vec3 world_pos = point_object_to_world(pos); - vec4 pPos = point_world_to_ndc(world_pos); - - /* only vertex position 0 is used */ - eData1 = eData2 = vec4(1e10); - eData2.zw = proj(pPos); - - vertFlag = data; - - gl_PointSize = sizeVertex * 2.0; - gl_Position = pPos; - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif -} diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl deleted file mode 100644 index b79bae45f23..00000000000 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl +++ /dev/null @@ -1,76 +0,0 @@ - -uniform bool selectFaces = true; -uniform bool selectEdges = true; - -vec4 EDIT_MESH_edge_color_outer(int edge_flag, int face_flag, float crease, float bweight) -{ - vec4 color = vec4(0.0); - color = ((edge_flag & EDGE_FREESTYLE) != 0) ? colorEdgeFreestyle : color; - color = ((edge_flag & EDGE_SHARP) != 0) ? colorEdgeSharp : color; - color = (crease > 0.0) ? vec4(colorEdgeCrease.rgb, crease) : color; - color = (bweight > 0.0) ? vec4(colorEdgeBWeight.rgb, bweight) : color; - color = ((edge_flag & EDGE_SEAM) != 0) ? colorEdgeSeam : color; - return color; -} - -vec4 EDIT_MESH_edge_color_inner(int edge_flag) -{ - vec4 color = colorWireEdit; - vec4 color_select = (selectEdges) ? colorEdgeSelect : mix(colorEdgeSelect, colorWireEdit, .45); - color = ((edge_flag & EDGE_SELECTED) != 0) ? color_select : color; - color = ((edge_flag & EDGE_ACTIVE) != 0) ? colorEditMeshActive : color; - - color.a = (selectEdges || (edge_flag & (EDGE_SELECTED | EDGE_ACTIVE)) != 0) ? 1.0 : 0.4; - return color; -} - -vec4 EDIT_MESH_edge_vertex_color(int vertex_flag) -{ - vec4 color = colorWireEdit; - vec4 color_select = (selectEdges) ? colorEdgeSelect : mix(colorEdgeSelect, colorWireEdit, .45); - - bool edge_selected = (vertex_flag & (VERT_ACTIVE | VERT_SELECTED)) != 0; - color = (edge_selected) ? color_select : color; - - color.a = (selectEdges || edge_selected) ? 1.0 : 0.4; - return color; -} - -vec4 EDIT_MESH_vertex_color(int vertex_flag) -{ - if ((vertex_flag & VERT_ACTIVE) != 0) { - return vec4(colorEditMeshActive.xyz, 1.0); - } - else if ((vertex_flag & VERT_SELECTED) != 0) { - return colorVertexSelect; - } - else { - return colorVertex; - } -} - -vec4 EDIT_MESH_face_color(int face_flag) -{ - vec4 color = colorFace; - vec4 color_active = mix(colorFaceSelect, colorEditMeshActive, 0.5); - color = ((face_flag & FACE_FREESTYLE) != 0) ? colorFaceFreestyle : color; - color = ((face_flag & FACE_SELECTED) != 0) ? colorFaceSelect : color; - color = ((face_flag & FACE_ACTIVE) != 0) ? color_active : color; - color.a *= ((face_flag & (FACE_FREESTYLE | FACE_SELECTED | FACE_ACTIVE)) == 0 || selectFaces) ? - 1.0 : - 0.5; - return color; -} - -vec4 EDIT_MESH_facedot_color(float facedot_flag) -{ - if (facedot_flag < 0.0f) { - return vec4(colorEditMeshActive.xyz, 1.0); - } - else if (facedot_flag > 0.0f) { - return colorFaceDot; - } - else { - return colorVertex; - } -} diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_frag.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_frag.glsl deleted file mode 100644 index a8371958ec2..00000000000 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_frag.glsl +++ /dev/null @@ -1,7 +0,0 @@ -flat in vec4 faceColor; -out vec4 FragColor; - -void main() -{ - FragColor = faceColor; -} diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl deleted file mode 100644 index df37c6fb0bc..00000000000 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl +++ /dev/null @@ -1,23 +0,0 @@ - -uniform ivec4 dataMask = ivec4(0xFF); - -in vec3 pos; -in ivec4 data; - -flat out vec4 faceColor; - -void main() -{ - GPU_INTEL_VERTEX_SHADER_WORKAROUND - - vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); - - ivec4 data_m = data & dataMask; - - faceColor = EDIT_MESH_face_color(data_m.x); - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif -} diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl deleted file mode 100644 index 7fe3cea8a42..00000000000 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl +++ /dev/null @@ -1,36 +0,0 @@ - -#define M_1_SQRTPI 0.5641895835477563 /* 1/sqrt(pi) */ - -/** - * We want to know how much a pixel is covered by a line. - * We replace the square pixel with acircle of the same area and try to find the intersection area. - * The area we search is the circular segment. https://en.wikipedia.org/wiki/Circular_segment - * The formula for the area uses inverse trig function and is quite complexe. Instead, - * we approximate it by using the smoothstep function and a 1.05 factor to the disc radius. - */ -#define DISC_RADIUS (M_1_SQRTPI * 1.05) -#define GRID_LINE_SMOOTH_START (0.5 - DISC_RADIUS) -#define GRID_LINE_SMOOTH_END (0.5 + DISC_RADIUS) - -flat in vec4 finalColorOuter_f; -in vec4 finalColor_f; -noperspective in float edgeCoord_f; - -out vec4 FragColor; - -void main() -{ - float dist = abs(edgeCoord_f) - max(sizeEdge - 0.5, 0.0); - float dist_outer = dist - max(sizeEdge, 1.0); -#ifdef USE_SMOOTH_WIRE - float mix_w = smoothstep(GRID_LINE_SMOOTH_START, GRID_LINE_SMOOTH_END, dist); - float mix_w_outer = smoothstep(GRID_LINE_SMOOTH_START, GRID_LINE_SMOOTH_END, dist_outer); -#else - float mix_w = step(0.5, dist); - float mix_w_outer = step(0.5, dist_outer); -#endif - /* Line color & alpha. */ - FragColor = mix(finalColorOuter_f, finalColor_f, 1.0 - mix_w * finalColorOuter_f.a); - /* Line edges shape. */ - FragColor.a *= 1.0 - (finalColorOuter_f.a > 0.0 ? mix_w_outer : mix_w); -} diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom.glsl deleted file mode 100644 index 047bd1dccc6..00000000000 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom.glsl +++ /dev/null @@ -1,91 +0,0 @@ - -layout(lines) in; -layout(triangle_strip, max_vertices = 4) out; - -uniform vec2 viewportSize; -uniform vec2 viewportSizeInv; - -in vec4 finalColor[2]; -in vec4 finalColorOuter[2]; -in int selectOveride[2]; - -flat out vec4 finalColorOuter_f; -out vec4 finalColor_f; -noperspective out float edgeCoord_f; - -void do_vertex(vec4 color, vec4 pos, float coord, vec2 offset) -{ - finalColor_f = color; - edgeCoord_f = coord; - gl_Position = pos; - /* Multiply offset by 2 because gl_Position range is [-1..1]. */ - gl_Position.xy += offset * 2.0 * pos.w; - /* Correct but fails due to an AMD compiler bug, see: T62792. - * Do inline instead. */ -#if 0 - world_clip_planes_set_clip_distance(gl_in[i].gl_ClipDistance); -#endif - EmitVertex(); -} - -void main() -{ - vec2 ss_pos[2]; - - /* Clip line against near plane to avoid deformed lines. */ - vec4 pos0 = gl_in[0].gl_Position; - vec4 pos1 = gl_in[1].gl_Position; - vec2 pz_ndc = vec2(pos0.z / pos0.w, pos1.z / pos1.w); - bvec2 clipped = lessThan(pz_ndc, vec2(-1.0)); - if (all(clipped)) { - /* Totally clipped. */ - return; - } - - vec4 pos01 = pos0 - pos1; - float ofs = abs((pz_ndc.y + 1.0) / (pz_ndc.x - pz_ndc.y)); - if (clipped.y) { - pos1 += pos01 * ofs; - } - else if (clipped.x) { - pos0 -= pos01 * (1.0 - ofs); - } - - ss_pos[0] = pos0.xy / pos0.w; - ss_pos[1] = pos1.xy / pos1.w; - - vec2 line = ss_pos[0] - ss_pos[1]; - line = abs(line) * viewportSize; - - finalColorOuter_f = finalColorOuter[0]; - float half_size = sizeEdge; - /* Enlarge edge for flag display. */ - half_size += (finalColorOuter_f.a > 0.0) ? max(sizeEdge, 1.0) : 0.0; - -#ifdef USE_SMOOTH_WIRE - /* Add 1 px for AA */ - half_size += 0.5; -#endif - - vec3 edge_ofs = half_size * viewportSizeInv.xyy * vec3(1.0, 1.0, 0.0); - - bool horizontal = line.x > line.y; - edge_ofs = (horizontal) ? edge_ofs.zyz : edge_ofs.xzz; - -#ifdef USE_WORLD_CLIP_PLANES - /* Due to an AMD glitch, this line was moved out of the `do_vertex` - * function (see T62792). */ - world_clip_planes_set_clip_distance(gl_in[0].gl_ClipDistance); -#endif - do_vertex(finalColor[0], pos0, half_size, edge_ofs.xy); - do_vertex(finalColor[0], pos0, -half_size, -edge_ofs.xy); - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_set_clip_distance(gl_in[1].gl_ClipDistance); -#endif - vec4 final_color = (selectOveride[0] == 0) ? finalColor[1] : finalColor[0]; - do_vertex(final_color, pos1, half_size, edge_ofs.xy); - do_vertex(final_color, pos1, -half_size, -edge_ofs.xy); - - EndPrimitive(); -} diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_ghost_clear_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_ghost_clear_vert.glsl deleted file mode 100644 index 9a53038a252..00000000000 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_ghost_clear_vert.glsl +++ /dev/null @@ -1,7 +0,0 @@ - -in vec2 pos; - -void main() -{ - gl_Position = vec4(pos, 1.0, 1.0); -} diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_mesh_analysis_frag.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_mesh_analysis_frag.glsl deleted file mode 100644 index 8d96c0e418f..00000000000 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_mesh_analysis_frag.glsl +++ /dev/null @@ -1,8 +0,0 @@ -out vec4 fragColor; - -in vec4 weightColor; - -void main() -{ - fragColor = weightColor; -} diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_mesh_analysis_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_mesh_analysis_vert.glsl deleted file mode 100644 index b89a3f407f9..00000000000 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_mesh_analysis_vert.glsl +++ /dev/null @@ -1,35 +0,0 @@ - -in vec3 pos; -in float weight; - -uniform sampler1D weightTex; - -out vec4 weightColor; - -vec3 weight_to_rgb(float t) -{ - if (t < 0.0) { - /* Minimum color, grey */ - return vec3(0.25, 0.25, 0.25); - } - else if (t > 1.0) { - /* Error color */ - return vec3(1.0, 0.0, 1.0); - } - else { - return texture(weightTex, t).rgb; - } -} - -void main() -{ - GPU_INTEL_VERTEX_SHADER_WORKAROUND - - vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); - weightColor = vec4(weight_to_rgb(weight), 1.0); - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif -} diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_mix_frag.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_mix_frag.glsl deleted file mode 100644 index a3fcfd880d3..00000000000 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_mix_frag.glsl +++ /dev/null @@ -1,22 +0,0 @@ - -out vec4 FragColor; - -uniform sampler2D wireColor; -uniform sampler2D wireDepth; -uniform sampler2D sceneDepth; -uniform float alpha; - -void main() -{ - ivec2 uv = ivec2(gl_FragCoord.xy); - float wire_depth = texelFetch(wireDepth, uv, 0).r; - float scene_depth = texelFetch(sceneDepth, uv, 0).r; - vec4 wire_color = texelFetch(wireColor, uv, 0).rgba; - - FragColor = wire_color; - - /* Modulate alpha if occluded */ - if (wire_depth > scene_depth) { - FragColor.a *= alpha; - } -} diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl deleted file mode 100644 index af0a47f1858..00000000000 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl +++ /dev/null @@ -1,79 +0,0 @@ - -uniform float faceAlphaMod; -uniform ivec4 dataMask = ivec4(0xFF); - -in ivec4 data; -in vec3 pos; -#ifndef FACEDOT -in vec3 vnor; -#else -in vec4 norAndFlag; -# define vnor norAndFlag.xyz -#endif - -out vec4 finalColor; -out vec4 finalColorOuter; -#ifdef USE_GEOM_SHADER -out int selectOveride; -#endif - -void main() -{ - GPU_INTEL_VERTEX_SHADER_WORKAROUND - - vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); - - ivec4 m_data = data & dataMask; - -#if defined(VERT) - finalColor = EDIT_MESH_vertex_color(m_data.y); - gl_PointSize = sizeVertex * 2.0; - /* Make selected and active vertex always on top. */ - if ((data.x & VERT_SELECTED) != 0) { - gl_Position.z -= 1e-7; - } - if ((data.x & VERT_ACTIVE) != 0) { - gl_Position.z -= 1e-7; - } - -#elif defined(EDGE) -# ifdef FLAT - finalColor = EDIT_MESH_edge_color_inner(m_data.y); - selectOveride = 1; -# else - finalColor = EDIT_MESH_edge_vertex_color(m_data.y); - selectOveride = (m_data.y & EDGE_SELECTED); -# endif - - float crease = float(m_data.z) / 255.0; - float bweight = float(m_data.w) / 255.0; - finalColorOuter = EDIT_MESH_edge_color_outer(m_data.y, m_data.x, crease, bweight); - -#elif defined(FACE) - finalColor = EDIT_MESH_face_color(m_data.x); - finalColor.a *= faceAlphaMod; - -#elif defined(FACEDOT) - finalColor = EDIT_MESH_facedot_color(norAndFlag.w); - /* Bias Facedot Z position in clipspace. */ - gl_Position.z -= 0.00035; - gl_PointSize = sizeFaceDot; - -#endif - -#if !defined(FACE) - /* Facing based color blend */ - vec3 vpos = point_world_to_view(world_pos); - vec3 view_normal = normalize(normal_object_to_view(vnor) + 1e-4); - vec3 view_vec = (ProjectionMatrix[3][3] == 0.0) ? normalize(vpos) : vec3(0.0, 0.0, 1.0); - float facing = dot(view_vec, view_normal); - facing = 1.0 - abs(facing) * 0.2; - - finalColor.rgb = mix(colorEditMeshMiddle.rgb, finalColor.rgb, facing); -#endif - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif -} diff --git a/source/blender/draw/modes/shaders/edit_mesh_skin_root_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_skin_root_vert.glsl deleted file mode 100644 index 5187571b27b..00000000000 --- a/source/blender/draw/modes/shaders/edit_mesh_skin_root_vert.glsl +++ /dev/null @@ -1,30 +0,0 @@ -/* Need dedicated obmat since we use instancing attribs - * (we cannot let have baseinstance mess them). */ -uniform vec4 editModelMat[4]; -uniform vec3 screen_vecs[2]; - -/* ---- Instantiated Attrs ---- */ -in vec2 pos; - -/* ---- Per instance Attrs ---- */ -in float size; -in vec3 local_pos; - -flat out vec4 finalColor; - -void main() -{ - mat4 obmat = mat4(editModelMat[0], editModelMat[1], editModelMat[2], editModelMat[3]); - /* Could be optimized... but it is only for a handful of verts so not a priority. */ - mat3 imat = inverse(mat3(obmat)); - vec3 right = normalize(imat * vec3(screen_vecs[0])); - vec3 up = normalize(imat * vec3(screen_vecs[1])); - vec3 screen_pos = (right * pos.x + up * pos.y) * size; - vec4 pos_4d = obmat * vec4(local_pos + screen_pos, 1.0); - gl_Position = ViewProjectionMatrix * pos_4d; - finalColor = colorSkinRoot; - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(pos_4d.xyz); -#endif -} diff --git a/source/blender/draw/modes/shaders/edit_normals_geom.glsl b/source/blender/draw/modes/shaders/edit_normals_geom.glsl deleted file mode 100644 index 5f43c13478d..00000000000 --- a/source/blender/draw/modes/shaders/edit_normals_geom.glsl +++ /dev/null @@ -1,18 +0,0 @@ - -layout(points) in; -layout(line_strip, max_vertices = 2) out; - -flat in vec4 v1[1]; -flat in vec4 v2[1]; - -void main() -{ - for (int v = 0; v < 2; v++) { - gl_Position = (v == 0) ? v1[0] : v2[0]; -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_set_clip_distance(gl_in[0].gl_ClipDistance); -#endif - EmitVertex(); - } - EndPrimitive(); -} diff --git a/source/blender/draw/modes/shaders/edit_normals_vert.glsl b/source/blender/draw/modes/shaders/edit_normals_vert.glsl deleted file mode 100644 index 384d13923f6..00000000000 --- a/source/blender/draw/modes/shaders/edit_normals_vert.glsl +++ /dev/null @@ -1,36 +0,0 @@ - -uniform float normalSize; - -in vec3 pos; - -#ifdef LOOP_NORMALS -in vec3 lnor; -# define nor lnor - -#elif defined(FACE_NORMALS) -in vec4 norAndFlag; -# define nor norAndFlag.xyz -#else - -in vec3 vnor; -# define nor vnor -#endif - -flat out vec4 v1; -flat out vec4 v2; - -void main() -{ - GPU_INTEL_VERTEX_SHADER_WORKAROUND - - vec3 n = normalize(normal_object_to_world(nor)); - - vec3 world_pos = point_object_to_world(pos); - - v1 = point_world_to_ndc(world_pos); - v2 = point_world_to_ndc(world_pos + n * normalSize); - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif -} diff --git a/source/blender/draw/modes/shaders/object_camera_image_frag.glsl b/source/blender/draw/modes/shaders/object_camera_image_frag.glsl deleted file mode 100644 index 7804ebdb8c9..00000000000 --- a/source/blender/draw/modes/shaders/object_camera_image_frag.glsl +++ /dev/null @@ -1,25 +0,0 @@ -in vec2 texCoord_interp; -out vec4 fragColor; - -uniform sampler2D image; -uniform float alpha; -uniform bool imagePremultiplied; - -void main() -{ -#ifdef DRW_STATE_DO_COLOR_MANAGEMENT - /* render engine has already applied the view transform. We sample the - * camera images as srgb*/ - vec4 color = texture_read_as_srgb(image, imagePremultiplied, texCoord_interp); - -#else - /* Render engine renders in linearrgb. We sample the camera images as - * linearrgb */ - vec4 color = texture_read_as_linearrgb(image, imagePremultiplied, texCoord_interp); -#endif - - color.a *= alpha; - color.rgb *= color.a; - - fragColor = color; -} diff --git a/source/blender/draw/modes/shaders/object_camera_image_vert.glsl b/source/blender/draw/modes/shaders/object_camera_image_vert.glsl deleted file mode 100644 index 61b88c013aa..00000000000 --- a/source/blender/draw/modes/shaders/object_camera_image_vert.glsl +++ /dev/null @@ -1,18 +0,0 @@ -uniform mat4 TransformMat; -uniform float flipX; -uniform float flipY; -uniform float depth; - -in vec2 texCoord; -in vec2 pos; - -out vec2 texCoord_interp; - -void main() -{ - vec4 position = TransformMat * vec4((pos - 0.5) * 2.0, 1.0, 1.0); - gl_Position = vec4(position.xy, depth, 1.0); - - vec2 uv_mul = vec2(flipX, flipY); - texCoord_interp = texCoord * uv_mul; -} diff --git a/source/blender/draw/modes/shaders/object_color_axes_vert.glsl b/source/blender/draw/modes/shaders/object_color_axes_vert.glsl deleted file mode 100644 index 239dec30c42..00000000000 --- a/source/blender/draw/modes/shaders/object_color_axes_vert.glsl +++ /dev/null @@ -1,35 +0,0 @@ - -uniform mat4 ViewProjectionMatrix; -uniform vec3 screenVecs[3]; - -/* ---- Instantiated Attrs ---- */ -in float axis; /* position on the axis. [0.0-1.0] is X axis, [1.0-2.0] is Y, etc... */ -in vec2 screenPos; -in vec3 colorAxis; - -/* ---- Per instance Attrs ---- */ -in mat4 InstanceModelMatrix; -in vec4 color; - -flat out vec4 finalColor; - -void main() -{ - float draw_size = 4.0; - vec3 chosen_axis = InstanceModelMatrix[int(axis)].xyz; - vec3 loc = InstanceModelMatrix[3].xyz; - vec3 wpos = loc + chosen_axis * fract(axis) * draw_size; - vec3 spos = screenVecs[0].xyz * screenPos.x + screenVecs[1].xyz * screenPos.y; - /* Scale uniformly by axis length */ - spos *= length(chosen_axis) * draw_size; - - vec4 pos_4d = vec4(wpos + spos, 1.0); - gl_Position = ViewProjectionMatrix * pos_4d; - - finalColor.rgb = mix(colorAxis, color.rgb, color.a); - finalColor.a = 1.0; - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(pos_4d.xyz); -#endif -} diff --git a/source/blender/draw/modes/shaders/object_empty_axes_vert.glsl b/source/blender/draw/modes/shaders/object_empty_axes_vert.glsl deleted file mode 100644 index 43c8e313fc3..00000000000 --- a/source/blender/draw/modes/shaders/object_empty_axes_vert.glsl +++ /dev/null @@ -1,35 +0,0 @@ - -uniform mat4 ViewProjectionMatrix; - -uniform vec3 screenVecs[3]; - -/* ---- Instantiated Attrs ---- */ -in float axis; /* position on the axis. [0.0-1.0] is X axis, [1.0-2.0] is Y, etc... */ -in vec2 screenPos; - -/* ---- Per instance Attrs ---- */ -in vec3 color; -in float size; -in mat4 InstanceModelMatrix; - -flat out vec4 finalColor; - -void main() -{ - float draw_size = 4.0 * size; - vec3 chosen_axis = InstanceModelMatrix[int(axis)].xyz; - vec3 loc = InstanceModelMatrix[3].xyz; - vec3 wpos = loc + chosen_axis * fract(axis) * draw_size; - vec3 spos = screenVecs[0].xyz * screenPos.x + screenVecs[1].xyz * screenPos.y; - /* Scale uniformly by axis length */ - spos *= length(chosen_axis) * draw_size; - - vec4 pos_4d = vec4(wpos + spos, 1.0); - gl_Position = ViewProjectionMatrix * pos_4d; - - finalColor = vec4(color, 1.0); - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(pos_4d.xyz); -#endif -} diff --git a/source/blender/draw/modes/shaders/object_empty_image_frag.glsl b/source/blender/draw/modes/shaders/object_empty_image_frag.glsl deleted file mode 100644 index e33aa6cdcc1..00000000000 --- a/source/blender/draw/modes/shaders/object_empty_image_frag.glsl +++ /dev/null @@ -1,53 +0,0 @@ - -flat in vec4 finalColor; - -#ifndef USE_WIRE -in vec2 texCoord_interp; -#endif - -out vec4 fragColor; - -#ifndef USE_WIRE -uniform sampler2D image; -uniform bool imagePremultiplied; -#endif - -uniform int depthMode; -uniform bool useAlphaTest; - -void main() -{ -#ifdef USE_WIRE - fragColor = finalColor; -#else - vec4 tex_col = texture_read_as_srgb(image, imagePremultiplied, texCoord_interp); - fragColor = finalColor * tex_col; - - if (useAlphaTest) { - /* Arbitrary discard anything below 5% opacity. - * Note that this could be exposed to the User. */ - if (tex_col.a < 0.05) { - discard; - } - else { - fragColor.a = 1.0; - } - } -#endif - - if (depthMode == DEPTH_BACK) { - gl_FragDepth = 0.999999; -#ifdef USE_WIRE - gl_FragDepth -= 1e-5; -#endif - } - else if (depthMode == DEPTH_FRONT) { - gl_FragDepth = 0.000001; -#ifdef USE_WIRE - gl_FragDepth -= 1e-5; -#endif - } - else if (depthMode == DEPTH_UNCHANGED) { - gl_FragDepth = gl_FragCoord.z; - } -} diff --git a/source/blender/draw/modes/shaders/object_empty_image_vert.glsl b/source/blender/draw/modes/shaders/object_empty_image_vert.glsl deleted file mode 100644 index 36e86290be7..00000000000 --- a/source/blender/draw/modes/shaders/object_empty_image_vert.glsl +++ /dev/null @@ -1,36 +0,0 @@ - -uniform vec2 aspect; -uniform float size; -uniform vec2 offset; -#ifdef USE_WIRE -uniform vec3 color; -#else -uniform vec4 objectColor; -#endif - -in vec2 texCoord; -in vec2 pos; - -flat out vec4 finalColor; - -#ifndef USE_WIRE -out vec2 texCoord_interp; -#endif - -void main() -{ - vec3 pos = vec3((pos + offset) * (size * aspect), 0.0); - vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); -#ifdef USE_WIRE - gl_Position.z -= 1e-5; - finalColor = vec4(color, 1.0); -#else - texCoord_interp = texCoord; - finalColor = objectColor; -#endif - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif -} diff --git a/source/blender/draw/modes/shaders/object_grid_frag.glsl b/source/blender/draw/modes/shaders/object_grid_frag.glsl deleted file mode 100644 index 751d839eb79..00000000000 --- a/source/blender/draw/modes/shaders/object_grid_frag.glsl +++ /dev/null @@ -1,249 +0,0 @@ - -/* Infinite grid - * Author: Clément Foucault */ - -/* We use the normalized local position to avoid precision - * loss during interpolation. */ -in vec3 local_pos; - -out vec4 FragColor; - -uniform vec3 planeAxes; -uniform vec3 screenVecs[2]; -uniform float gridDistance; -uniform float meshSize; -uniform float lineKernel = 0.0; -uniform sampler2D depthBuffer; - -#define cameraPos (ViewMatrixInverse[3].xyz) - -uniform int gridFlag; - -#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); - -#define AXIS_X (1 << 0) -#define AXIS_Y (1 << 1) -#define AXIS_Z (1 << 2) -#define GRID (1 << 3) -#define PLANE_XY (1 << 4) -#define PLANE_XZ (1 << 5) -#define PLANE_YZ (1 << 6) -#define GRID_BACK (1 << 9) /* grid is behind objects */ - -#define M_1_SQRTPI 0.5641895835477563 /* 1/sqrt(pi) */ - -/** - * We want to know how much a pixel is covered by a line. - * We replace the square pixel with acircle of the same area and try to find the intersection area. - * The area we search is the circular segment. https://en.wikipedia.org/wiki/Circular_segment - * The formula for the area uses inverse trig function and is quite complexe. Instead, - * we approximate it by using the smoothstep function and a 1.05 factor to the disc radius. - */ -#define DISC_RADIUS (M_1_SQRTPI * 1.05) -#define GRID_LINE_SMOOTH_START (0.5 - DISC_RADIUS) -#define GRID_LINE_SMOOTH_END (0.5 + DISC_RADIUS) - -float get_grid(vec2 co, vec2 fwidthCos, float grid_size) -{ - float half_size = grid_size / 2.0; - /* triangular wave pattern, amplitude is [0, half_size] */ - vec2 grid_domain = abs(mod(co + half_size, grid_size) - half_size); - /* modulate by the absolute rate of change of the coordinates - * (make lines have the same width under perspective) */ - grid_domain /= fwidthCos; - - /* collapse waves */ - float line_dist = min(grid_domain.x, grid_domain.y); - - return 1.0 - smoothstep(GRID_LINE_SMOOTH_START, GRID_LINE_SMOOTH_END, line_dist - lineKernel); -} - -vec3 get_axes(vec3 co, vec3 fwidthCos, float line_size) -{ - vec3 axes_domain = abs(co); - /* modulate by the absolute rate of change of the coordinates - * (make line have the same width under perspective) */ - axes_domain /= fwidthCos; - - return 1.0 - smoothstep(GRID_LINE_SMOOTH_START, - GRID_LINE_SMOOTH_END, - axes_domain - (line_size + lineKernel)); -} - -#define linearstep(p0, p1, v) (clamp(((v) - (p0)) / abs((p1) - (p0)), 0.0, 1.0)) - -void main() -{ - vec3 wPos = local_pos * meshSize; - vec3 dFdxPos = dFdx(wPos); - vec3 dFdyPos = dFdy(wPos); - vec3 fwidthPos = abs(dFdxPos) + abs(dFdyPos); - wPos += cameraPos * planeAxes; - - float dist, fade; - /* if persp */ - if (ProjectionMatrix[3][3] == 0.0) { - vec3 viewvec = cameraPos - wPos; - dist = length(viewvec); - viewvec /= dist; - - float angle; - if ((gridFlag & PLANE_XZ) != 0) { - angle = viewvec.y; - } - else if ((gridFlag & PLANE_YZ) != 0) { - angle = viewvec.x; - } - else { - angle = viewvec.z; - } - - angle = 1.0 - abs(angle); - angle *= angle; - fade = 1.0 - angle * angle; - fade *= 1.0 - smoothstep(0.0, gridDistance, dist - gridDistance); - } - else { - dist = abs(gl_FragCoord.z * 2.0 - 1.0); - fade = 1.0 - smoothstep(0.0, 0.5, dist - 0.5); - dist = 1.0; /* avoid branch after */ - - if ((gridFlag & PLANE_XY) != 0) { - float angle = 1.0 - abs(ViewMatrixInverse[2].z); - dist = 1.0 + angle * 2.0; - angle *= angle; - fade *= 1.0 - angle * angle; - } - } - - if ((gridFlag & GRID) != 0) { - /* Using `max(dot(dFdxPos, screenVecs[0]), dot(dFdyPos, screenVecs[1]))` - * would be more accurate, but not really necessary. */ - float grid_res = dot(dFdxPos, screenVecs[0]); - - /* The gride begins to appear when it comprises 4 pixels */ - grid_res *= 4; - - /* from biggest to smallest */ - vec4 scale; -#if 0 - int step_id = 0; - scale[0] = 0.0; - scale[1] = gridSteps[0]; - while (scale[1] < grid_res && step_id != STEPS_LEN - 1) { - scale[0] = scale[1]; - scale[1] = gridSteps[++step_id]; - } - scale[2] = gridSteps[min(step_id + 1, STEPS_LEN - 1)]; - scale[3] = gridSteps[min(step_id + 2, STEPS_LEN - 1)]; -#else - /* For more efficiency, unroll the loop above. */ - if (gridSteps[0] > grid_res) { - scale = vec4(0.0, gridSteps[0], gridSteps[1], gridSteps[2]); - } - else if (gridSteps[1] > grid_res) { - scale = vec4(gridSteps[0], gridSteps[1], gridSteps[2], gridSteps[3]); - } - else if (gridSteps[2] > grid_res) { - scale = vec4(gridSteps[1], gridSteps[2], gridSteps[3], gridSteps[4]); - } - else if (gridSteps[3] > grid_res) { - scale = vec4(gridSteps[2], gridSteps[3], gridSteps[4], gridSteps[5]); - } - else if (gridSteps[4] > grid_res) { - scale = vec4(gridSteps[3], gridSteps[4], gridSteps[5], gridSteps[6]); - } - else if (gridSteps[5] > grid_res) { - scale = vec4(gridSteps[4], gridSteps[5], gridSteps[6], gridSteps[7]); - } - else if (gridSteps[6] > grid_res) { - scale = vec4(gridSteps[5], gridSteps[6], gridSteps[7], gridSteps[7]); - } - else { - scale = vec4(gridSteps[6], gridSteps[7], gridSteps[7], gridSteps[7]); - } -#endif - float blend = 1.0 - linearstep(scale[0], scale[1], grid_res); - blend = blend * blend * blend; - - vec2 grid_pos, grid_fwidth; - if ((gridFlag & PLANE_XZ) != 0) { - grid_pos = wPos.xz; - grid_fwidth = fwidthPos.xz; - } - else if ((gridFlag & PLANE_YZ) != 0) { - grid_pos = wPos.yz; - grid_fwidth = fwidthPos.yz; - } - else { - grid_pos = wPos.xy; - grid_fwidth = fwidthPos.xy; - } - - float gridA = get_grid(grid_pos, grid_fwidth, scale[1]); - float gridB = get_grid(grid_pos, grid_fwidth, scale[2]); - float gridC = get_grid(grid_pos, grid_fwidth, scale[3]); - - FragColor = colorGrid; - FragColor.a *= gridA * blend; - FragColor = mix(FragColor, mix(colorGrid, colorGridEmphasise, blend), gridB); - FragColor = mix(FragColor, colorGridEmphasise, gridC); - } - else { - FragColor = vec4(colorGrid.rgb, 0.0); - } - - if ((gridFlag & (AXIS_X | AXIS_Y | AXIS_Z)) != 0) { - /* Setup axes 'domains' */ - vec3 axes_dist, axes_fwidth; - - if ((gridFlag & AXIS_X) != 0) { - axes_dist.x = dot(wPos.yz, planeAxes.yz); - axes_fwidth.x = dot(fwidthPos.yz, planeAxes.yz); - } - if ((gridFlag & AXIS_Y) != 0) { - axes_dist.y = dot(wPos.xz, planeAxes.xz); - axes_fwidth.y = dot(fwidthPos.xz, planeAxes.xz); - } - if ((gridFlag & AXIS_Z) != 0) { - axes_dist.z = dot(wPos.xy, planeAxes.xy); - axes_fwidth.z = dot(fwidthPos.xy, planeAxes.xy); - } - - /* Computing all axes at once using vec3 */ - vec3 axes = get_axes(axes_dist, axes_fwidth, 0.1); - - if ((gridFlag & AXIS_X) != 0) { - FragColor.a = max(FragColor.a, axes.x); - FragColor.rgb = (axes.x < 1e-8) ? FragColor.rgb : colorGridAxisX.rgb; - } - if ((gridFlag & AXIS_Y) != 0) { - FragColor.a = max(FragColor.a, axes.y); - FragColor.rgb = (axes.y < 1e-8) ? FragColor.rgb : colorGridAxisY.rgb; - } - if ((gridFlag & AXIS_Z) != 0) { - FragColor.a = max(FragColor.a, axes.z); - FragColor.rgb = (axes.z < 1e-8) ? FragColor.rgb : colorGridAxisZ.rgb; - } - } - - /* 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 = texelFetch(depthBuffer, ivec2(gl_FragCoord.xy), 0).r; - if ((gridFlag & GRID_BACK) != 0) { - fade *= (scene_depth == 1.0) ? 1.0 : 0.0; - } - else { - /* Manual, non hard, depth test: - * Progressively fade the grid below occluders - * (avoids popping visuals due to depth buffer precision) */ - /* Harder settings tend to flicker more, - * but have less "see through" appearance. */ - const float test_hardness = 1e7; - fade *= 1.0 - clamp((grid_depth - scene_depth) * test_hardness, 0.0, 1.0); - } - - FragColor.a *= fade; -} diff --git a/source/blender/draw/modes/shaders/object_grid_vert.glsl b/source/blender/draw/modes/shaders/object_grid_vert.glsl deleted file mode 100644 index 496bb011c74..00000000000 --- a/source/blender/draw/modes/shaders/object_grid_vert.glsl +++ /dev/null @@ -1,52 +0,0 @@ - -/* Infinite grid - * Clément Foucault */ - -uniform vec3 planeAxes; -uniform float meshSize; - -uniform int gridFlag; - -#define cameraPos (ViewMatrixInverse[3].xyz) - -#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; - -out vec3 local_pos; - -void main() -{ - vec3 vert_pos; - - /* Project camera pos to the needed plane */ - if ((gridFlag & PLANE_XY) != 0) { - vert_pos = vec3(pos.x, pos.y, 0.0); - } - else if ((gridFlag & PLANE_XZ) != 0) { - vert_pos = vec3(pos.x, 0.0, pos.y); - } - else { - vert_pos = vec3(0.0, pos.x, pos.y); - } - - local_pos = vert_pos; - - vec3 real_pos = cameraPos * planeAxes + vert_pos * meshSize; - - /* Used for additional Z axis */ - if ((gridFlag & CLIP_Z_POS) != 0) { - real_pos.z = clamp(real_pos.z, 0.0, 1e30); - local_pos.z = clamp(local_pos.z, 0.0, 1.0); - } - if ((gridFlag & CLIP_Z_NEG) != 0) { - real_pos.z = clamp(real_pos.z, -1e30, 0.0); - local_pos.z = clamp(local_pos.z, -1.0, 0.0); - } - - gl_Position = ViewProjectionMatrix * vec4(real_pos, 1.0); -} diff --git a/source/blender/draw/modes/shaders/object_lightprobe_grid_vert.glsl b/source/blender/draw/modes/shaders/object_lightprobe_grid_vert.glsl deleted file mode 100644 index 144024a7d5d..00000000000 --- a/source/blender/draw/modes/shaders/object_lightprobe_grid_vert.glsl +++ /dev/null @@ -1,31 +0,0 @@ - -uniform ivec3 grid_resolution; -uniform vec3 corner; -uniform vec3 increment_x; -uniform vec3 increment_y; -uniform vec3 increment_z; - -flat out int objectId; - -void main() -{ - vec3 ls_cell_location; - /* Keep in sync with update_irradiance_probe */ - ls_cell_location.z = float(gl_VertexID % grid_resolution.z); - ls_cell_location.y = float((gl_VertexID / grid_resolution.z) % grid_resolution.y); - ls_cell_location.x = float(gl_VertexID / (grid_resolution.z * grid_resolution.y)); - - vec3 ws_cell_location = corner + - (increment_x * ls_cell_location.x + increment_y * ls_cell_location.y + - increment_z * ls_cell_location.z); - - gl_Position = ViewProjectionMatrix * vec4(ws_cell_location, 1.0); - gl_PointSize = 2.0f; - - /* ID 0 is nothing (background) */ - objectId = resource_handle + 1; - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(ws_cell_location); -#endif -} diff --git a/source/blender/draw/modes/shaders/object_loose_points_frag.glsl b/source/blender/draw/modes/shaders/object_loose_points_frag.glsl deleted file mode 100644 index 5730cb2d96e..00000000000 --- a/source/blender/draw/modes/shaders/object_loose_points_frag.glsl +++ /dev/null @@ -1,19 +0,0 @@ - -uniform vec4 color; -uniform vec4 innerColor; - -out vec4 fragColor; - -void main() -{ - vec2 centered = abs(gl_PointCoord - vec2(0.5)); - float dist = max(centered.x, centered.y); - - float fac = dist * dist * 4.0; - fragColor = mix(innerColor, color, 0.45 + fac * 0.65); - - /* Make the effect more like a fresnel by offsetting - * the depth and creating mini-spheres. - * Disabled as it has performance impact. */ - // gl_FragDepth = gl_FragCoord.z + 1e-6 * fac; -} diff --git a/source/blender/draw/modes/shaders/object_mball_handles_vert.glsl b/source/blender/draw/modes/shaders/object_mball_handles_vert.glsl deleted file mode 100644 index 9414309570b..00000000000 --- a/source/blender/draw/modes/shaders/object_mball_handles_vert.glsl +++ /dev/null @@ -1,36 +0,0 @@ - -/* This shader takes a 2D shape, puts it in 3D Object space such that is stays aligned with view, - * and scales the shape according to per-instance attributes - * Note that if the stiffness is zero, it assumes the scale is directly multiplied by the radius */ - -uniform mat4 ViewProjectionMatrix; -uniform vec3 screen_vecs[2]; - -/* ---- Instantiated Attrs ---- */ -in vec2 pos; - -/* ---- Per instance Attrs ---- */ -in mat3x4 ScaleTranslationMatrix; -in float radius; -in vec3 color; - -flat out vec4 finalColor; - -void main() -{ - mat3 Scamat = mat3(ScaleTranslationMatrix); - vec4 world_pos = vec4(ScaleTranslationMatrix[0][3], - ScaleTranslationMatrix[1][3], - ScaleTranslationMatrix[2][3], - 1.0); - - vec3 screen_pos = screen_vecs[0].xyz * pos.x + screen_vecs[1].xyz * pos.y; - world_pos.xyz += Scamat * (screen_pos * radius); - - gl_Position = ViewProjectionMatrix * world_pos; - finalColor = vec4(color, 1.0); - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos.xyz); -#endif -} diff --git a/source/blender/draw/modes/shaders/object_outline_detect_frag.glsl b/source/blender/draw/modes/shaders/object_outline_detect_frag.glsl deleted file mode 100644 index 7b86d477a39..00000000000 --- a/source/blender/draw/modes/shaders/object_outline_detect_frag.glsl +++ /dev/null @@ -1,87 +0,0 @@ - -in vec4 uvcoordsvar; - -out vec4 FragColor; - -uniform usampler2D outlineId; -uniform sampler2D outlineDepth; -uniform sampler2D sceneDepth; - -uniform float alphaOcclu; -uniform vec2 viewportSize; - -void main() -{ - ivec2 texel = ivec2(gl_FragCoord.xy); - -#ifdef GPU_ARB_texture_gather - vec2 texel_size = 1.0 / vec2(textureSize(outlineId, 0).xy); - vec2 uv = ceil(gl_FragCoord.xy) * texel_size; - - /* Samples order is CW starting from top left. */ - uvec4 tmp1 = textureGather(outlineId, uv - texel_size); - uvec4 tmp2 = textureGather(outlineId, uv); - - uint ref_id = tmp1.y; - uvec4 id = uvec4(tmp1.xz, tmp2.xz); -#else - uvec4 id; - uint ref_id = texelFetch(outlineId, texel, 0).r; - id.x = texelFetchOffset(outlineId, texel, 0, ivec2(-1, 0)).r; - id.y = texelFetchOffset(outlineId, texel, 0, ivec2(0, -1)).r; - id.z = texelFetchOffset(outlineId, texel, 0, ivec2(0, 1)).r; - id.w = texelFetchOffset(outlineId, texel, 0, ivec2(1, 0)).r; -#endif - -#ifdef WIRE - /* We want only 2px outlines. */ - /* TODO optimize, don't sample if we don't need to. */ - id.xy = uvec2(ref_id); -#endif - - bool outline = any(notEqual(id, uvec4(ref_id))); - - ivec2 depth_texel = texel; - /* If texel is an outline but has no valid id ... - * replace id and depth texel by a valid one. - * This keeps the outline thickness consistent everywhere. */ - if (ref_id == 0u && outline) { - depth_texel = (id.x != 0u) ? texel + ivec2(-1, 0) : depth_texel; - depth_texel = (id.y != 0u) ? texel + ivec2(0, -1) : depth_texel; - depth_texel = (id.z != 0u) ? texel + ivec2(0, 1) : depth_texel; - depth_texel = (id.w != 0u) ? texel + ivec2(1, 0) : depth_texel; - - ref_id = (id.x != 0u) ? id.x : ref_id; - ref_id = (id.y != 0u) ? id.y : ref_id; - ref_id = (id.z != 0u) ? id.z : ref_id; - ref_id = (id.w != 0u) ? id.w : ref_id; - } - - float ref_depth = texelFetch(outlineDepth, depth_texel, 0).r; - float scene_depth = texelFetch(sceneDepth, depth_texel, 0).r; - - /* Avoid bad cases of zfighting for occlusion only. */ - const float epsilon = 3.0 / 8388608.0; - bool occluded = (ref_depth > scene_depth + epsilon); - - /* WATCH: Keep in sync with outlineId of the prepass. */ - uint color_id = ref_id >> 14u; - if (ref_id == 0u) { - FragColor = vec4(0.0); - } - else if (color_id == 1u) { - FragColor = colorSelect; - } - else if (color_id == 2u) { - FragColor = colorDupliSelect; - } - else if (color_id == 3u) { - FragColor = colorActive; - } - else { - FragColor = colorTransform; - } - - FragColor.a *= (occluded) ? alphaOcclu : 1.0; - FragColor.a = (outline) ? FragColor.a : 0.0; -} diff --git a/source/blender/draw/modes/shaders/object_outline_expand_frag.glsl b/source/blender/draw/modes/shaders/object_outline_expand_frag.glsl deleted file mode 100644 index cb9fe0e7c36..00000000000 --- a/source/blender/draw/modes/shaders/object_outline_expand_frag.glsl +++ /dev/null @@ -1,51 +0,0 @@ - -in vec4 uvcoordsvar; - -out vec4 FragColor; - -uniform sampler2D outlineColor; - -uniform float alpha; -uniform bool doExpand; - -void main() -{ - ivec2 uv = ivec2(gl_FragCoord.xy); - FragColor = texelFetch(outlineColor, uv, 0).rgba; - - vec4 color[4]; - color[0] = texelFetchOffset(outlineColor, uv, 0, ivec2(1, 0)).rgba; - color[1] = texelFetchOffset(outlineColor, uv, 0, ivec2(0, 1)).rgba; - color[2] = texelFetchOffset(outlineColor, uv, 0, ivec2(-1, 0)).rgba; - color[3] = texelFetchOffset(outlineColor, uv, 0, ivec2(0, -1)).rgba; - - vec4 values = vec4(color[0].a, color[1].a, color[2].a, color[3].a); - - vec4 tests = step(vec4(1e-6), values); /* (color.a != 0.0) */ - bvec4 btests = equal(tests, vec4(1.0)); - - if (FragColor.a != 0.0) { - return; - } - -#ifdef LARGE_OUTLINE - if (!any(btests)) { - color[0] = texelFetchOffset(outlineColor, uv, 0, ivec2(2, 0)).rgba; - color[1] = texelFetchOffset(outlineColor, uv, 0, ivec2(0, 2)).rgba; - color[2] = texelFetchOffset(outlineColor, uv, 0, ivec2(-2, 0)).rgba; - color[3] = texelFetchOffset(outlineColor, uv, 0, ivec2(0, -2)).rgba; - - values = vec4(color[0].a, color[1].a, color[2].a, color[3].a); - - tests = step(vec4(1e-6), values); /* (color.a != 0.0) */ - btests = equal(tests, vec4(1.0)); - } -#endif - - FragColor = (btests.x) ? color[0] : FragColor; - FragColor = (btests.y) ? color[1] : FragColor; - FragColor = (btests.z) ? color[2] : FragColor; - FragColor = (btests.w) ? color[3] : FragColor; - - FragColor.a *= (!doExpand) ? 0.0 : 1.0; -} diff --git a/source/blender/draw/modes/shaders/object_outline_prepass_frag.glsl b/source/blender/draw/modes/shaders/object_outline_prepass_frag.glsl deleted file mode 100644 index 5d6c4881b5b..00000000000 --- a/source/blender/draw/modes/shaders/object_outline_prepass_frag.glsl +++ /dev/null @@ -1,18 +0,0 @@ - -/* Should be 2 bits only [0..3]. */ -uniform int outlineId; - -flat in int objectId; - -/* using uint because 16bit uint can contain more ids than int. */ -out uint outId; - -/* Replace top 2 bits (of the 16bit output) by outlineId. - * This leaves 16K different IDs to create outlines between objects. - * SHIFT = (32 - (16 - 2)) */ -#define SHIFT 18u - -void main() -{ - outId = (uint(outlineId) << 14u) | ((uint(objectId) << SHIFT) >> SHIFT); -} diff --git a/source/blender/draw/modes/shaders/object_outline_prepass_geom.glsl b/source/blender/draw/modes/shaders/object_outline_prepass_geom.glsl deleted file mode 100644 index b32913dcd60..00000000000 --- a/source/blender/draw/modes/shaders/object_outline_prepass_geom.glsl +++ /dev/null @@ -1,54 +0,0 @@ - -layout(lines_adjacency) in; -layout(line_strip, max_vertices = 2) out; - -in vec3 vPos[]; -in int objectId_g[]; - -flat out int objectId; - -void vert_from_gl_in(int v) -{ - gl_Position = gl_in[v].gl_Position; - objectId = objectId_g[v]; -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_set_clip_distance(gl_in[v].gl_ClipDistance); -#endif -} - -void main() -{ - bool is_persp = (ProjectionMatrix[3][3] == 0.0); - - vec3 view_vec = (is_persp) ? normalize(vPos[1]) : vec3(0.0, 0.0, -1.0); - - vec3 v10 = vPos[0] - vPos[1]; - vec3 v12 = vPos[2] - vPos[1]; - vec3 v13 = vPos[3] - vPos[1]; - - vec3 n0 = cross(v12, v10); - vec3 n3 = cross(v13, v12); - - float fac0 = dot(view_vec, n0); - float fac3 = dot(view_vec, n3); - - /* If both adjacent verts are facing the camera the same way, - * then it isn't an outline edge. */ - if (sign(fac0) == sign(fac3)) { - return; - } - - /* Don't outline if concave edge. */ - /* That would hide a lot of non useful edge but it flickers badly. - * TODO revisit later... */ - // if (dot(n0, v13) > 0.01) - // return; - - vert_from_gl_in(1); - EmitVertex(); - - vert_from_gl_in(2); - EmitVertex(); - - EndPrimitive(); -} diff --git a/source/blender/draw/modes/shaders/object_outline_prepass_vert.glsl b/source/blender/draw/modes/shaders/object_outline_prepass_vert.glsl deleted file mode 100644 index 7740f9a4af2..00000000000 --- a/source/blender/draw/modes/shaders/object_outline_prepass_vert.glsl +++ /dev/null @@ -1,29 +0,0 @@ - -in vec3 pos; - -#ifdef USE_GEOM -out vec3 vPos; -out int objectId_g; -# define objectId objectId_g -#else - -flat out int objectId; -#endif - -void main() -{ - vec3 world_pos = point_object_to_world(pos); -#ifdef USE_GEOM - vPos = point_world_to_view(world_pos); -#endif - gl_Position = point_world_to_ndc(world_pos); - /* Small bias to always be on top of the geom. */ - gl_Position.z -= 1e-3; - - /* ID 0 is nothing (background) */ - objectId = resource_handle + 1; - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif -} diff --git a/source/blender/draw/modes/shaders/object_outline_resolve_frag.glsl b/source/blender/draw/modes/shaders/object_outline_resolve_frag.glsl deleted file mode 100644 index ba5d073a9c2..00000000000 --- a/source/blender/draw/modes/shaders/object_outline_resolve_frag.glsl +++ /dev/null @@ -1,21 +0,0 @@ - -in vec4 uvcoordsvar; - -out vec4 FragColor; - -uniform sampler2D outlineBluredColor; -uniform vec2 rcpDimensions; - -void main() -{ -#ifdef USE_FXAA - float aa_alpha = - FxaaPixelShader(uvcoordsvar.st, outlineBluredColor, rcpDimensions, 1.0, 0.166, 0.0833).r; -#endif - - FragColor = texture(outlineBluredColor, uvcoordsvar.st).rgba; - -#ifdef USE_FXAA - FragColor.a = aa_alpha; -#endif -} diff --git a/source/blender/draw/modes/shaders/object_particle_dot_frag.glsl b/source/blender/draw/modes/shaders/object_particle_dot_frag.glsl deleted file mode 100644 index d15580056b0..00000000000 --- a/source/blender/draw/modes/shaders/object_particle_dot_frag.glsl +++ /dev/null @@ -1,53 +0,0 @@ - -uniform vec3 color; -uniform vec3 outlineColor; -uniform sampler1D ramp; - -in vec4 radii; -flat in float finalVal; - -out vec4 fragColor; - -void main() -{ - float dist = length(gl_PointCoord - vec2(0.5)); - - // transparent outside of point - // --- 0 --- - // smooth transition - // --- 1 --- - // pure outline color - // --- 2 --- - // smooth transition - // --- 3 --- - // pure point color - // ... - // dist = 0 at center of point - - float midStroke = 0.5 * (radii[1] + radii[2]); - - if (dist > midStroke) { - if (finalVal < 0.0) { - fragColor.rgb = outlineColor; - } - else { - fragColor.rgb = texture(ramp, finalVal).rgb; - } - - fragColor.a = mix(1.0, 0.0, smoothstep(radii[1], radii[0], dist)); - } - else { - if (finalVal < 0.0) { - fragColor.rgb = mix(color, outlineColor, smoothstep(radii[3], radii[2], dist)); - } - else { - fragColor.rgb = texture(ramp, finalVal).rgb; - } - - fragColor.a = 1.0; - } - - if (fragColor.a == 0.0) { - discard; - } -} diff --git a/source/blender/draw/modes/shaders/object_particle_dot_vert.glsl b/source/blender/draw/modes/shaders/object_particle_dot_vert.glsl deleted file mode 100644 index f98ae9a9515..00000000000 --- a/source/blender/draw/modes/shaders/object_particle_dot_vert.glsl +++ /dev/null @@ -1,36 +0,0 @@ - -uniform float pixel_size; -uniform float size; - -in vec3 pos; -in float val; - -out vec4 radii; -flat out float finalVal; - -void main() -{ - vec3 world_pos = point_object_to_world(pos); - - float view_z = dot(ViewMatrixInverse[2].xyz, world_pos - ViewMatrixInverse[3].xyz); - - bool is_persp = (ProjectionMatrix[3][3] == 0.0); - float psize = (is_persp) ? (size / (-view_z * pixel_size)) : (size / pixel_size); - gl_Position = point_world_to_ndc(world_pos); - - gl_PointSize = psize; - - // calculate concentric radii in pixels - float radius = 0.5 * psize; - - // start at the outside and progress toward the center - radii[0] = radius; - radii[1] = radius - 1.0; - radii[2] = radius - 1.0; - radii[3] = radius - 2.0; - - // convert to PointCoord units - radii /= psize; - - finalVal = val; -} diff --git a/source/blender/draw/modes/shaders/object_particle_prim_vert.glsl b/source/blender/draw/modes/shaders/object_particle_prim_vert.glsl deleted file mode 100644 index 46aceb245f4..00000000000 --- a/source/blender/draw/modes/shaders/object_particle_prim_vert.glsl +++ /dev/null @@ -1,60 +0,0 @@ - -uniform bool screen_space; -uniform float draw_size; -uniform vec3 color; -uniform sampler1D ramp; - -/* ---- Instantiated Attrs ---- */ -in vec3 inst_pos; -in int axis; - -/* ---- Per instance Attrs ---- */ -in vec3 pos; -in vec4 rot; -in float val; - -flat out vec4 finalColor; - -vec3 rotate(vec3 vec, vec4 quat) -{ - /* The quaternion representation here stores the w component in the first index */ - return vec + 2.0 * cross(quat.yzw, cross(quat.yzw, vec) + quat.x * vec); -} - -void main() -{ - if (screen_space) { - gl_Position = ViewMatrix * (ModelMatrix * vec4(pos, 1.0)); - gl_Position.xyz += inst_pos * draw_size; - gl_Position = ProjectionMatrix * gl_Position; - } - else { - float size = draw_size; - - if (axis > -1) { - size *= 2; - } - - vec3 pos_rot = pos + rotate(inst_pos * size, rot); - gl_Position = point_object_to_ndc(pos_rot); - } - -#ifdef USE_AXIS - if (axis == 0) { - finalColor = vec4(1.0, 0.0, 0.0, 1.0); - } - else if (axis == 1) { - finalColor = vec4(0.0, 1.0, 0.0, 1.0); - } - else { - finalColor = vec4(0.0, 0.0, 1.0, 1.0); - } -#else - if (val < 0.0) { - finalColor = vec4(color, 1.0); - } - else { - finalColor = vec4(texture(ramp, val).rgb, 1.0); - } -#endif -} diff --git a/source/blender/draw/modes/shaders/overlay_face_orientation_frag.glsl b/source/blender/draw/modes/shaders/overlay_face_orientation_frag.glsl deleted file mode 100644 index 1ed35b4a421..00000000000 --- a/source/blender/draw/modes/shaders/overlay_face_orientation_frag.glsl +++ /dev/null @@ -1,9 +0,0 @@ -uniform vec3 color_towards = vec3(0.0, 0.0, 1.0); -uniform vec3 color_outwards = vec3(1.0, 0.0, 0.0); - -out vec4 fragColor; - -void main() -{ - fragColor = vec4(gl_FrontFacing ? color_towards : color_outwards, 0.7); -} diff --git a/source/blender/draw/modes/shaders/overlay_face_orientation_vert.glsl b/source/blender/draw/modes/shaders/overlay_face_orientation_vert.glsl deleted file mode 100644 index 2dd84c0a060..00000000000 --- a/source/blender/draw/modes/shaders/overlay_face_orientation_vert.glsl +++ /dev/null @@ -1,12 +0,0 @@ - -in vec3 pos; - -void main() -{ - vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif -} diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl deleted file mode 100644 index 9414d25e71e..00000000000 --- a/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl +++ /dev/null @@ -1,23 +0,0 @@ - -uniform vec3 wireColor; -uniform vec3 rimColor; - -flat in float edgeSharpness; -in float facing; - -out vec4 fragColor; - -void main() -{ - if (edgeSharpness < 0.0) { - discard; - } - - float facing_clamped = clamp(abs(facing), 0.0, 1.0); - - vec3 final_front_col = mix(rimColor, wireColor, 0.4); - vec3 final_rim_col = mix(rimColor, wireColor, 0.1); - - fragColor.rgb = mix(final_rim_col, final_front_col, facing_clamped); - fragColor.a = 1.0f; -} diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl deleted file mode 100644 index 6ae52d43a48..00000000000 --- a/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl +++ /dev/null @@ -1,60 +0,0 @@ - -/* This shader is only used for edge selection and OSX workaround for large wires. */ - -uniform float wireSize; -uniform vec2 viewportSize; -uniform vec2 viewportSizeInv; - -layout(lines) in; -layout(triangle_strip, max_vertices = 4) out; - -in float facing_g[]; -in float edgeSharpness_g[]; - -#ifndef SELECT_EDGES -out float facing; -flat out float edgeSharpness; -#endif - -void do_vertex(const int i, float coord, vec2 offset) -{ -#ifndef SELECT_EDGES - edgeSharpness = edgeSharpness_g[i]; - facing = facing_g[i]; -#endif - gl_Position = gl_in[i].gl_Position; - /* Multiply offset by 2 because gl_Position range is [-1..1]. */ - gl_Position.xy += offset * 2.0 * gl_Position.w; -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_set_clip_distance(gl_in[i].gl_ClipDistance); -#endif - EmitVertex(); -} - -void main() -{ - vec2 ss_pos[2]; - ss_pos[0] = gl_in[0].gl_Position.xy / gl_in[0].gl_Position.w; - ss_pos[1] = gl_in[1].gl_Position.xy / gl_in[1].gl_Position.w; - - vec2 line = ss_pos[0] - ss_pos[1]; - line = abs(line) * viewportSize; - - float half_size = wireSize; - - vec3 edge_ofs = half_size * viewportSizeInv.xyy * vec3(1.0, 1.0, 0.0); - - bool horizontal = line.x > line.y; - edge_ofs = (horizontal) ? edge_ofs.zyz : edge_ofs.xzz; - - if (edgeSharpness_g[0] < 0.0) { - return; - } - - do_vertex(0, half_size, edge_ofs.xy); - do_vertex(0, -half_size, -edge_ofs.xy); - do_vertex(1, half_size, edge_ofs.xy); - do_vertex(1, -half_size, -edge_ofs.xy); - - EndPrimitive(); -} diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl deleted file mode 100644 index 722f62d9b6d..00000000000 --- a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl +++ /dev/null @@ -1,42 +0,0 @@ - -uniform float wireStepParam; - -in vec3 pos; -in vec3 nor; -in float wd; /* wiredata */ - -float get_edge_sharpness(float wd) -{ -#ifndef USE_SCULPT - return ((wd == 0.0) ? -1.5 : wd) + wireStepParam; -#else - return 1.0; -#endif -} - -/* Geometry shader version */ -#if defined(SELECT_EDGES) || defined(USE_GEOM) -out float facing_g; -out float edgeSharpness_g; - -#else /* USE_GEOM */ -out float facing; -flat out float edgeSharpness; -# define facing_g facing -# define edgeSharpness_g edgeSharpness - -#endif /* SELECT_EDGES */ - -void main() -{ - vec3 wpos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(wpos); - - vec3 wnor = normalize(normal_object_to_world(nor)); - facing_g = dot(wnor, ViewMatrixInverse[2].xyz); - edgeSharpness_g = get_edge_sharpness(wd); - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(wpos); -#endif -} diff --git a/source/blender/draw/modes/shaders/paint_face_selection_vert.glsl b/source/blender/draw/modes/shaders/paint_face_selection_vert.glsl deleted file mode 100644 index 4b5191ead07..00000000000 --- a/source/blender/draw/modes/shaders/paint_face_selection_vert.glsl +++ /dev/null @@ -1,19 +0,0 @@ - -in vec3 pos; -in vec4 nor; /* select flag on the 4th component */ - -void main() -{ - vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); - - /* Don't draw faces that are selected. */ - if (nor.w > 0.0) { - gl_Position = vec4(0.0, 0.0, 0.0, 1.0); - } - else { -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif - } -} diff --git a/source/blender/draw/modes/shaders/paint_face_vert.glsl b/source/blender/draw/modes/shaders/paint_face_vert.glsl deleted file mode 100644 index af362f24a85..00000000000 --- a/source/blender/draw/modes/shaders/paint_face_vert.glsl +++ /dev/null @@ -1,11 +0,0 @@ -in vec3 pos; - -void main() -{ - vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif -} diff --git a/source/blender/draw/modes/shaders/paint_texture_frag.glsl b/source/blender/draw/modes/shaders/paint_texture_frag.glsl deleted file mode 100644 index edd7c2af001..00000000000 --- a/source/blender/draw/modes/shaders/paint_texture_frag.glsl +++ /dev/null @@ -1,25 +0,0 @@ -in vec2 masking_uv_interp; - -out vec4 fragColor; - -uniform float alpha = 1.0; - -uniform sampler2D maskingImage; -uniform bool maskingImagePremultiplied; -uniform vec3 maskingColor; -uniform bool maskingInvertStencil; - -void main() -{ - - vec4 mask = vec4( - texture_read_as_srgb(maskingImage, maskingImagePremultiplied, masking_uv_interp).rgb, 1.0); - if (maskingInvertStencil) { - mask.rgb = 1.0 - mask.rgb; - } - float mask_step = smoothstep(0, 3.0, mask.r + mask.g + mask.b); - mask.rgb *= maskingColor; - mask.a = mask_step * alpha; - - fragColor = mask; -} diff --git a/source/blender/draw/modes/shaders/paint_texture_vert.glsl b/source/blender/draw/modes/shaders/paint_texture_vert.glsl deleted file mode 100644 index ddfc2b51437..00000000000 --- a/source/blender/draw/modes/shaders/paint_texture_vert.glsl +++ /dev/null @@ -1,17 +0,0 @@ - -in vec3 pos; -in vec2 mu; /* masking uv map */ - -out vec2 masking_uv_interp; - -void main() -{ - vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); - - masking_uv_interp = mu; - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif -} diff --git a/source/blender/draw/modes/shaders/paint_vert_frag.glsl b/source/blender/draw/modes/shaders/paint_vert_frag.glsl deleted file mode 100644 index 3303dfa6173..00000000000 --- a/source/blender/draw/modes/shaders/paint_vert_frag.glsl +++ /dev/null @@ -1,17 +0,0 @@ - -flat in vec4 finalColor; -out vec4 fragColor; - -void main() -{ - vec2 centered = gl_PointCoord - vec2(0.5); - float dist_squared = dot(centered, centered); - const float rad_squared = 0.25; - - // round point with jaggy edges - if (dist_squared > rad_squared) { - discard; - } - - fragColor = finalColor; -} diff --git a/source/blender/draw/modes/shaders/paint_vertex_frag.glsl b/source/blender/draw/modes/shaders/paint_vertex_frag.glsl deleted file mode 100644 index f03e3410ec3..00000000000 --- a/source/blender/draw/modes/shaders/paint_vertex_frag.glsl +++ /dev/null @@ -1,24 +0,0 @@ - -in vec3 finalColor; - -out vec4 fragColor; -uniform float opacity = 1.0; - -vec3 linear_to_srgb_attr(vec3 c) -{ - c = max(c, vec3(0.0)); - vec3 c1 = c * 12.92; - vec3 c2 = 1.055 * pow(c, vec3(1.0 / 2.4)) - 0.055; - return mix(c1, c2, step(vec3(0.0031308), c)); -} - -void main() -{ - vec3 color = linear_to_srgb_attr(finalColor); -#ifdef DRW_STATE_BLEND_ALPHA - fragColor = vec4(color, opacity); -#else - fragColor.rgb = mix(vec3(1.0), color, opacity); - fragColor.a = 1.0; -#endif -} diff --git a/source/blender/draw/modes/shaders/paint_vertex_vert.glsl b/source/blender/draw/modes/shaders/paint_vertex_vert.glsl deleted file mode 100644 index 24033432a48..00000000000 --- a/source/blender/draw/modes/shaders/paint_vertex_vert.glsl +++ /dev/null @@ -1,25 +0,0 @@ - -in vec3 pos; -in vec3 ac; /* active color */ - -out vec3 finalColor; - -vec3 srgb_to_linear_attr(vec3 c) -{ - c = max(c, vec3(0.0)); - vec3 c1 = c * (1.0 / 12.92); - vec3 c2 = pow((c + 0.055) * (1.0 / 1.055), vec3(2.4)); - return mix(c1, c2, step(vec3(0.04045), c)); -} - -void main() -{ - vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); - - finalColor = srgb_to_linear_attr(ac); - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif -} diff --git a/source/blender/draw/modes/shaders/paint_weight_frag.glsl b/source/blender/draw/modes/shaders/paint_weight_frag.glsl deleted file mode 100644 index 76b7719be64..00000000000 --- a/source/blender/draw/modes/shaders/paint_weight_frag.glsl +++ /dev/null @@ -1,105 +0,0 @@ - -in vec2 weight_interp; /* (weight, alert) */ - -out vec4 fragColor; - -uniform float opacity = 1.0; -uniform sampler1D colorramp; - -uniform bool drawContours = false; - -float contours(float value, float steps, float width_px, float max_rel_width, float gradient) -{ - /* Minimum visible and minimum full strength line width in screen space for fade out. */ - const float min_width_px = 1.3, fade_width_px = 2.3; - /* Line is thinner towards the increase in the weight gradient by this factor. */ - const float hi_bias = 2.0; - - /* Don't draw lines at 0 or 1. */ - float rel_value = value * steps; - - if (rel_value < 0.5 || rel_value > steps - 0.5) { - return 0.0; - } - - /* Check if completely invisible due to fade out. */ - float rel_gradient = gradient * steps; - float rel_min_width = min_width_px * rel_gradient; - - if (max_rel_width <= rel_min_width) { - return 0.0; - } - - /* Main shape of the line, accounting for width bias and maximum weight space width. */ - float rel_width = width_px * rel_gradient; - - float offset = fract(rel_value + 0.5) - 0.5; - - float base_alpha = 1.0 - max(offset * hi_bias, -offset) / min(max_rel_width, rel_width); - - /* Line fadeout when too thin in screen space. */ - float rel_fade_width = fade_width_px * rel_gradient; - - float fade_alpha = (max_rel_width - rel_min_width) / (rel_fade_width - rel_min_width); - - return clamp(base_alpha, 0.0, 1.0) * clamp(fade_alpha, 0.0, 1.0); -} - -vec4 contour_grid(float weight, float weight_gradient) -{ - /* Fade away when the gradient is too low to avoid big fills and noise. */ - float flt_eps = max(1e-8, 1e-6 * weight); - - if (weight_gradient <= flt_eps) { - return vec4(0.0); - } - - /* Three levels of grid lines */ - float grid10 = contours(weight, 10.0, 5.0, 0.3, weight_gradient); - float grid100 = contours(weight, 100.0, 3.5, 0.35, weight_gradient) * 0.6; - float grid1000 = contours(weight, 1000.0, 2.5, 0.4, weight_gradient) * 0.25; - - /* White lines for 0.1 and 0.01, and black for 0.001 */ - vec4 grid = vec4(1.0) * max(grid10, grid100); - - grid.a = max(grid.a, grid1000); - - return grid * clamp((weight_gradient - flt_eps) / flt_eps, 0.0, 1.0); -} - -void main() -{ - float alert = weight_interp.y; - vec4 color; - - /* Missing vertex group alert color. Uniform in practice. */ - if (alert > 1.1) { - color = colorVertexMissingData; - } - /* Weights are available */ - else { - float weight = weight_interp.x; - vec4 weight_color = texture(colorramp, weight, 0); - - /* Contour display */ - if (drawContours) { - /* This must be executed uniformly for all fragments */ - float weight_gradient = length(vec2(dFdx(weight), dFdy(weight))); - - vec4 grid = contour_grid(weight, weight_gradient); - - weight_color = grid + weight_color * (1 - grid.a); - } - - /* Zero weight alert color. Nonlinear blend to reduce impact. */ - color = mix(weight_color, colorVertexUnreferenced, alert * alert); - } - -#ifdef DRW_STATE_BLEND_ALPHA - /* alpha blending mix */ - fragColor = vec4(color.rgb, opacity); -#else - /* mix with 1.0 -> is like opacity when using multiply blend mode */ - fragColor = vec4(mix(vec3(1.0), color.rgb, opacity), 1.0); -#endif -} diff --git a/source/blender/draw/modes/shaders/paint_weight_vert.glsl b/source/blender/draw/modes/shaders/paint_weight_vert.glsl deleted file mode 100644 index 330cc7d19f4..00000000000 --- a/source/blender/draw/modes/shaders/paint_weight_vert.glsl +++ /dev/null @@ -1,18 +0,0 @@ - -in float weight; -in vec3 pos; - -out vec2 weight_interp; /* (weight, alert) */ - -void main() -{ - vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); - - /* Separate actual weight and alerts for independent interpolation */ - weight_interp = max(vec2(weight, -weight), 0.0); - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif -} diff --git a/source/blender/draw/modes/shaders/paint_wire_frag.glsl b/source/blender/draw/modes/shaders/paint_wire_frag.glsl deleted file mode 100644 index 6c214534812..00000000000 --- a/source/blender/draw/modes/shaders/paint_wire_frag.glsl +++ /dev/null @@ -1,8 +0,0 @@ - -flat in vec4 finalColor; -out vec4 fragColor; - -void main() -{ - fragColor = finalColor; -} diff --git a/source/blender/draw/modes/shaders/paint_wire_vert.glsl b/source/blender/draw/modes/shaders/paint_wire_vert.glsl deleted file mode 100644 index 5857ffc9960..00000000000 --- a/source/blender/draw/modes/shaders/paint_wire_vert.glsl +++ /dev/null @@ -1,54 +0,0 @@ - -in vec3 pos; -in vec4 nor; /* flag stored in w */ - -flat out vec4 finalColor; - -void main() -{ -#ifdef USE_SELECT - bool is_select = (nor.w > 0.0); - bool is_hidden = (nor.w < 0.0); -#else - bool is_select = false; - bool is_hidden = false; -#endif - vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); - /* Add offset in Z to avoid zfighting and render selected wires on top. */ - /* TODO scale this bias using znear and zfar range. */ - gl_Position.z -= (is_select ? 2e-4 : 1e-4); - - if (is_hidden) { - gl_Position = vec4(-2.0, -2.0, -2.0, 1.0); - } - -#ifdef VERTEX_MODE - vec4 colSel = colorEdgeSelect; - colSel.rgb = clamp(colSel.rgb - 0.2, 0.0, 1.0); -#else - const vec4 colSel = vec4(1.0, 1.0, 1.0, 1.0); -#endif - -#ifdef USE_SELECT - finalColor = (is_select) ? colSel : colorWire; - finalColor.a = nor.w; -#else -# ifdef VERTEX_MODE - finalColor.xyz = colorWire.xyz; - finalColor.a = 1.0; -# else - /* Weight paint needs a light color to contrasts with dark weights. */ - finalColor = vec4(1, 1, 1, 0.2); -# endif -#endif - - /* Needed for Radeon (TM) RX 480 Graphics. */ -#if defined(GPU_ATI) - gl_PointSize = sizeVertex * 2.0; -#endif - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif -} diff --git a/source/blender/draw/modes/shaders/particle_strand_frag.glsl b/source/blender/draw/modes/shaders/particle_strand_frag.glsl deleted file mode 100644 index 49d843b7e0e..00000000000 --- a/source/blender/draw/modes/shaders/particle_strand_frag.glsl +++ /dev/null @@ -1,22 +0,0 @@ - -in vec4 finalColor; -#ifdef USE_POINTS -in vec2 radii; -#endif - -out vec4 fragColor; - -void main() -{ - fragColor = finalColor; - -#ifdef USE_POINTS - float dist = length(gl_PointCoord - vec2(0.5)); - - fragColor.a = mix(finalColor.a, 0.0, smoothstep(radii[1], radii[0], dist)); - - if (fragColor.a == 0.0) { - discard; - } -#endif -} diff --git a/source/blender/draw/modes/shaders/particle_strand_vert.glsl b/source/blender/draw/modes/shaders/particle_strand_vert.glsl deleted file mode 100644 index 45fadb4ed5e..00000000000 --- a/source/blender/draw/modes/shaders/particle_strand_vert.glsl +++ /dev/null @@ -1,71 +0,0 @@ - -in vec3 pos; -in float color; - -out vec4 finalColor; -#ifdef USE_POINTS -out vec2 radii; -#endif - -vec3 weight_to_rgb(float weight) -{ - vec3 r_rgb; - float blend = ((weight / 2.0) + 0.5); - - if (weight <= 0.25) { /* blue->cyan */ - r_rgb[0] = 0.0; - r_rgb[1] = blend * weight * 4.0; - r_rgb[2] = blend; - } - else if (weight <= 0.50) { /* cyan->green */ - r_rgb[0] = 0.0; - r_rgb[1] = blend; - r_rgb[2] = blend * (1.0 - ((weight - 0.25) * 4.0)); - } - else if (weight <= 0.75) { /* green->yellow */ - r_rgb[0] = blend * ((weight - 0.50) * 4.0); - r_rgb[1] = blend; - r_rgb[2] = 0.0; - } - else if (weight <= 1.0) { /* yellow->red */ - r_rgb[0] = blend; - r_rgb[1] = blend * (1.0 - ((weight - 0.75) * 4.0)); - r_rgb[2] = 0.0; - } - else { - /* exceptional value, unclamped or nan, - * avoid uninitialized memory use */ - r_rgb[0] = 1.0; - r_rgb[1] = 0.0; - r_rgb[2] = 1.0; - } - - return r_rgb; -} - -void main() -{ - vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); - -#ifdef USE_WEIGHT - finalColor = vec4(weight_to_rgb(color), 1.0); -#else - finalColor = mix(colorWire, colorEdgeSelect, color); -#endif - -#ifdef USE_POINTS - float size = sizeVertex * 2.0; - gl_PointSize = size; - - /* calculate concentric radii in pixels */ - float radius = sizeVertex; - - /* start at the outside and progress toward the center */ - radii[0] = radius; - radii[1] = radius - 1.0; - - /* convert to PointCoord units */ - radii /= size; -#endif -} diff --git a/source/blender/draw/modes/shaders/pose_selection_vert.glsl b/source/blender/draw/modes/shaders/pose_selection_vert.glsl deleted file mode 100644 index 2dd84c0a060..00000000000 --- a/source/blender/draw/modes/shaders/pose_selection_vert.glsl +++ /dev/null @@ -1,12 +0,0 @@ - -in vec3 pos; - -void main() -{ - vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); - -#ifdef USE_WORLD_CLIP_PLANES - world_clip_planes_calc_clip_distance(world_pos); -#endif -} diff --git a/source/blender/draw/modes/shaders/sculpt_mask_vert.glsl b/source/blender/draw/modes/shaders/sculpt_mask_vert.glsl deleted file mode 100644 index 7b026836690..00000000000 --- a/source/blender/draw/modes/shaders/sculpt_mask_vert.glsl +++ /dev/null @@ -1,16 +0,0 @@ - -uniform float maskOpacity; - -in vec3 pos; -in float msk; - -out vec4 finalColor; - -void main() -{ - vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); - - float mask = 1.0 - (msk * maskOpacity); - finalColor = vec4(mask, mask, mask, 1.0); -} diff --git a/source/blender/draw/modes/shaders/volume_velocity_vert.glsl b/source/blender/draw/modes/shaders/volume_velocity_vert.glsl deleted file mode 100644 index 64f88bd74fa..00000000000 --- a/source/blender/draw/modes/shaders/volume_velocity_vert.glsl +++ /dev/null @@ -1,117 +0,0 @@ - -uniform sampler3D velocityX; -uniform sampler3D velocityY; -uniform sampler3D velocityZ; -uniform float displaySize = 1.0; -uniform float slicePosition; -uniform int sliceAxis; /* -1 is no slice, 0 is X, 1 is Y, 2 is Z. */ - -/* SmokeDomainSettings.cell_size */ -uniform vec3 cellSize; -/* SmokeDomainSettings.p0 */ -uniform vec3 domainOriginOffset; -/* SmokeDomainSettings.res_min */ -uniform ivec3 adaptiveCellOffset; - -flat out vec4 finalColor; - -const vec3 corners[4] = vec3[4](vec3(0.0, 0.2, -0.5), - vec3(-0.2 * 0.866, -0.2 * 0.5, -0.5), - vec3(0.2 * 0.866, -0.2 * 0.5, -0.5), - vec3(0.0, 0.0, 0.5)); - -const int indices[12] = int[12](0, 1, 1, 2, 2, 0, 0, 3, 1, 3, 2, 3); - -/* Straight Port from BKE_defvert_weight_to_rgb() - * TODO port this to a color ramp. */ -vec3 weight_to_color(float weight) -{ - vec3 r_rgb = vec3(0.0); - float blend = ((weight / 2.0) + 0.5); - - if (weight <= 0.25) { /* blue->cyan */ - r_rgb.g = blend * weight * 4.0; - r_rgb.b = blend; - } - else if (weight <= 0.50) { /* cyan->green */ - r_rgb.g = blend; - r_rgb.b = blend * (1.0 - ((weight - 0.25) * 4.0)); - } - else if (weight <= 0.75) { /* green->yellow */ - r_rgb.r = blend * ((weight - 0.50) * 4.0); - r_rgb.g = blend; - } - else if (weight <= 1.0) { /* yellow->red */ - r_rgb.r = blend; - r_rgb.g = blend * (1.0 - ((weight - 0.75) * 4.0)); - } - else { - /* exceptional value, unclamped or nan, - * avoid uninitialized memory use */ - r_rgb = vec3(1.0, 0.0, 1.0); - } - - return r_rgb; -} - -mat3 rotation_from_vector(vec3 v) -{ - /* Add epsilon to avoid NaN. */ - vec3 N = normalize(v + 1e-8); - vec3 UpVector = abs(N.z) < 0.99999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0); - vec3 T = normalize(cross(UpVector, N)); - vec3 B = cross(N, T); - return mat3(T, B, N); -} - -void main() -{ -#ifdef USE_NEEDLE - int cell = gl_VertexID / 12; -#else - int cell = gl_VertexID / 2; -#endif - - ivec3 volume_size = textureSize(velocityX, 0); - - ivec3 cell_ofs = ivec3(0); - ivec3 cell_div = volume_size; - if (sliceAxis == 0) { - cell_ofs.x = int(slicePosition * float(volume_size.x)); - cell_div.x = 1; - } - else if (sliceAxis == 1) { - cell_ofs.y = int(slicePosition * float(volume_size.y)); - cell_div.y = 1; - } - else if (sliceAxis == 2) { - cell_ofs.z = int(slicePosition * float(volume_size.z)); - cell_div.z = 1; - } - - ivec3 cell_co; - cell_co.x = cell % cell_div.x; - cell_co.y = (cell / cell_div.x) % cell_div.y; - cell_co.z = cell / (cell_div.x * cell_div.y); - cell_co += cell_ofs; - - vec3 pos = domainOriginOffset + cellSize * (vec3(cell_co + adaptiveCellOffset) + 0.5); - - vec3 velocity; - velocity.x = texelFetch(velocityX, cell_co, 0).r; - velocity.y = texelFetch(velocityY, cell_co, 0).r; - velocity.z = texelFetch(velocityZ, cell_co, 0).r; - - finalColor = vec4(weight_to_color(length(velocity)), 1.0); - -#ifdef USE_NEEDLE - mat3 rot_mat = rotation_from_vector(velocity); - vec3 rotated_pos = rot_mat * corners[indices[gl_VertexID % 12]]; - pos += rotated_pos * length(velocity) * displaySize * cellSize; -#else - pos += ((gl_VertexID % 2) == 1) ? velocity * displaySize * cellSize : vec3(0.0); -#endif - - vec3 world_pos = point_object_to_world(pos); - gl_Position = point_world_to_ndc(world_pos); -} |