diff options
author | Ines Almeida <britalmeida@gmail.com> | 2018-10-13 20:49:26 +0300 |
---|---|---|
committer | Ines Almeida <britalmeida@gmail.com> | 2018-10-13 20:49:26 +0300 |
commit | ab62b7e971ab446c8c286fac305a846f83161e50 (patch) | |
tree | 7fd5a67b9653e2e10efee94374e812e76da86a05 /source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl | |
parent | cc8424e73324b772621045c1856f9a8869faa859 (diff) | |
parent | dd6bf3f84a9137affbcd8ba0fc957c32b8c0aff7 (diff) |
Merge branch 'origin/blender2.8' into temp-ui-layout-2.8temp-ui-layout-2.8
Diffstat (limited to 'source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl')
-rw-r--r-- | source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl | 89 |
1 files changed, 77 insertions, 12 deletions
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 7cab2a5035f..8715ab69181 100644 --- a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl +++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl @@ -2,38 +2,103 @@ /* Solid Wirefram implementation * Mike Erwin, Clément Foucault */ -/* This shader follows the principles of - * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */ - +uniform mat3 NormalMatrix; +uniform mat4 ProjectionMatrix; uniform mat4 ModelViewMatrix; uniform mat4 ModelViewProjectionMatrix; uniform ivec4 dataMask = ivec4(0xFF); +uniform float ofs = 1e-5; + +uniform isamplerBuffer dataBuffer; + in vec3 pos; +#ifdef VERTEX_FACING +in vec3 vnor; +#endif + +#ifdef EDGE_FIX in ivec4 data; out vec4 vPos; out vec4 pPos; out ivec4 vData; - -#ifdef VERTEX_FACING -uniform mat4 ProjectionMatrix; -uniform mat3 NormalMatrix; - -in vec3 vnor; +# ifdef VERTEX_FACING out float vFacing; -#endif +# endif void main() { vPos = ModelViewMatrix * vec4(pos, 1.0); pPos = ModelViewProjectionMatrix * vec4(pos, 1.0); + pPos.z -= ofs; vData = data & dataMask; -#ifdef VERTEX_FACING +# 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 +# endif } + +#else /* EDGE_FIX */ + +flat out vec3 edgesCrease; +flat out vec3 edgesBweight; +flat out vec4 faceColor; +flat out ivec3 flag; +# ifdef VERTEX_SELECTION +out vec3 vertexColor; +# endif +# ifdef VERTEX_FACING +out float facing; +# endif + +out vec3 barycentric; + +void main() +{ + gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); + gl_Position.z -= ofs; + + int v_0 = (gl_VertexID / 3) * 3; + int vidx = gl_VertexID % 3; + barycentric = vec3(0.0); + barycentric[vidx] = 1.0; + + /* Edge */ + ivec4 vData[3], data = ivec4(0); + ivec3 eflag; + for (int v = 0; v < 3; ++v) { + data = texelFetch(dataBuffer, v_0 + v); + vData[v] = data & dataMask; + flag[v] = eflag[v] = vData[v].y | (vData[v].x << 8); + edgesCrease[v] = vData[v].z / 255.0; + edgesBweight[v] = vData[v].w / 255.0; + } + + /* Face */ + if ((vData[0].x & FACE_ACTIVE) != 0) + faceColor = colorFaceSelect; + else if ((vData[0].x & FACE_SELECTED) != 0) + faceColor = colorFaceSelect; + else if ((vData[0].x & FACE_FREESTYLE) != 0) + faceColor = colorFaceFreestyle; + else + faceColor = colorFace; + +# ifdef VERTEX_SELECTION + vertexColor = EDIT_MESH_vertex_color(vData[vidx].x).rgb; +# endif +# ifdef VERTEX_FACING + vec4 vPos = ModelViewMatrix * vec4(pos, 1.0); + vec3 view_normal = normalize(NormalMatrix * vnor); + vec3 view_vec = (ProjectionMatrix[3][3] == 0.0) + ? normalize(vPos.xyz) + : vec3(0.0, 0.0, 1.0); + facing = dot(view_vec, view_normal); +# endif +} + +#endif
\ No newline at end of file |