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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl')
-rw-r--r--source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl97
1 files changed, 97 insertions, 0 deletions
diff --git a/source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl b/source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl
new file mode 100644
index 00000000000..8759ef80888
--- /dev/null
+++ b/source/blender/draw/engines/overlay/shaders/edit_mesh_vert.glsl
@@ -0,0 +1,97 @@
+
+uniform sampler2D depthTex;
+uniform float alpha = 1.0;
+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;
+#ifdef EDGE
+out vec4 finalColorOuter;
+#endif
+#ifdef USE_GEOM_SHADER
+out int selectOveride;
+#endif
+
+bool test_occlusion()
+{
+ vec3 ndc = (gl_Position.xyz / gl_Position.w) * 0.5 + 0.5;
+ return ndc.z > texture(depthTex, ndc.xy).r;
+}
+
+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;
+ }
+
+ bool occluded = test_occlusion();
+
+#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);
+
+ bool occluded = false; /* Done in fragment shader */
+
+#elif defined(FACE)
+ finalColor = EDIT_MESH_face_color(m_data.x);
+ bool occluded = true;
+
+#elif defined(FACEDOT)
+ finalColor = EDIT_MESH_facedot_color(norAndFlag.w);
+
+ /* Bias Facedot Z position in clipspace. */
+ gl_Position.z -= 0.00035;
+ gl_PointSize = sizeFaceDot;
+
+ bool occluded = test_occlusion();
+
+#endif
+
+ finalColor.a *= (occluded) ? alpha : 1.0;
+
+#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
+}