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:
authorClément Foucault <foucault.clem@gmail.com>2017-09-22 03:42:57 +0300
committerClément Foucault <foucault.clem@gmail.com>2017-09-22 03:44:40 +0300
commit1a4a1447b728082939e7b0f033602f27c0269937 (patch)
tree9060d9ff3762a5bd9709dca267c458c8fd8222d9 /source/blender/draw/modes/shaders
parent406427bd4eac038491e69156a1b344d21a5289fd (diff)
Edit Mesh Mode: Add a facing falloff effect
This let the user keep track of the shape by fading the center of the object. An Opacity parameter is yet to be added.
Diffstat (limited to 'source/blender/draw/modes/shaders')
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_frag.glsl7
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_vert.glsl17
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl7
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl10
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl10
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl16
6 files changed, 67 insertions, 0 deletions
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_frag.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_frag.glsl
index 9b3fe6286e8..6dcbc097468 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_frag.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_frag.glsl
@@ -1,5 +1,8 @@
flat in int isSelected;
+#ifdef VERTEX_FACING
+in float facing;
+#endif
out vec4 FragColor;
@@ -9,4 +12,8 @@ void main()
FragColor = colorFaceDot;
else
FragColor = colorWireEdit;
+
+#ifdef VERTEX_FACING
+ FragColor.a *= 1.0 - abs(facing) * 0.4;
+#endif
}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_vert.glsl
index 3e6f0ead04c..b27a4bba4ca 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_vert.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_vert.glsl
@@ -6,6 +6,16 @@ in vec4 norAndFlag;
flat out int isSelected;
+#ifdef VERTEX_FACING
+uniform mat4 ProjectionMatrix;
+uniform mat4 ModelViewMatrix;
+uniform mat3 NormalMatrix;
+uniform vec3 eye;
+
+in vec3 vnor;
+out float facing;
+#endif
+
void main()
{
gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
@@ -13,4 +23,11 @@ void main()
gl_Position.z -= 0.0002;
gl_PointSize = sizeFaceDot;
isSelected = int(norAndFlag.w);
+#ifdef VERTEX_FACING
+ vec3 view_normal = normalize(NormalMatrix * norAndFlag.xyz);
+ vec3 view_vec = (ProjectionMatrix[3][3] == 0.0)
+ ? normalize((ModelViewMatrix * vec4(pos, 1.0)).xyz)
+ : vec3(0.0, 0.0, 1.0);
+ facing = dot(view_vec, view_normal);
+#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
index 8ae7a9e3ab5..d7f96695d0e 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl
@@ -15,6 +15,9 @@ flat in int clipCase;
#ifdef VERTEX_SELECTION
in vec3 vertexColor;
#endif
+#ifdef VERTEX_FACING
+in float facing;
+#endif
/* We use a vec4[2] interface to pass edge data
* (without fragmenting memory accesses)
@@ -198,6 +201,10 @@ void main()
}
#endif
+#ifdef VERTEX_FACING
+ FragColor.a *= 1.0 - abs(facing) * 0.4;
+#endif
+
/* don't write depth if not opaque */
if (FragColor.a == 0.0) discard;
}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl
index 5e3ecd59cb4..7d71e1540d5 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl
@@ -14,6 +14,9 @@ uniform vec2 viewportSize;
in vec4 vPos[];
in vec4 pPos[];
in ivec4 vData[];
+#ifdef VERTEX_FACING
+in float vFacing[];
+#endif
/* these are the same for all vertices
* and does not need interpolation */
@@ -25,6 +28,9 @@ flat out int clipCase;
#ifdef VERTEX_SELECTION
out vec3 vertexColor;
#endif
+#ifdef VERTEX_FACING
+out float facing;
+#endif
/* See fragment shader */
noperspective out vec4 eData1;
@@ -79,6 +85,10 @@ void doVertex(int v, vec4 pos)
vertexColor = getVertexColor(v);
#endif
+#ifdef VERTEX_FACING
+ facing = vFacing[v];
+#endif
+
gl_Position = pos;
EmitVertex();
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl
index afd1e5a74a8..f83402e3869 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl
@@ -29,6 +29,9 @@ uniform vec2 viewportSize;
in vec4 vPos[];
in vec4 pPos[];
in ivec4 vData[];
+#ifdef VERTEX_FACING
+in float vFacing[];
+#endif
/* these are the same for all vertices
* and does not need interpolation */
@@ -40,6 +43,9 @@ flat out int clipCase;
#ifdef VERTEX_SELECTION
out vec3 vertexColor;
#endif
+#ifdef VERTEX_FACING
+out float facing;
+#endif
/* See fragment shader */
noperspective out vec4 eData1;
@@ -103,6 +109,10 @@ void doVertex(int v, vec4 pos)
vertexColor = getVertexColor(v);
#endif
+#ifdef VERTEX_FACING
+ facing = vFacing[v];
+#endif
+
gl_Position = pos;
EmitVertex();
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl
index 5bc9a8bef85..6da9b0a0e86 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl
@@ -15,9 +15,25 @@ out vec4 vPos;
out vec4 pPos;
out ivec4 vData;
+#ifdef VERTEX_FACING
+uniform mat4 ProjectionMatrix;
+uniform mat3 NormalMatrix;
+uniform vec3 eye;
+
+in vec3 vnor;
+out float vFacing;
+#endif
+
void main()
{
vPos = ModelViewMatrix * vec4(pos, 1.0);
pPos = ModelViewProjectionMatrix * vec4(pos, 1.0);
vData = data;
+#ifdef VERTEX_FACING
+ vec3 view_normal = normalize(NormalMatrix * vnor);
+ vec3 view_vec = (ProjectionMatrix[3][3] == 0.0)
+ ? normalize(vPos.xyz)
+ : vec3(0.0, 0.0, 1.0);
+ vFacing = dot(view_vec, view_normal);
+#endif
}