This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl

103 lines
2.2 KiB
GLSL

/* Solid Wirefram implementation
* Mike Erwin, Clément Foucault */
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 pPos;
out ivec4 vData;
# ifdef VERTEX_FACING
out float vFacing;
# endif
void main()
{
pPos = ModelViewProjectionMatrix * vec4(pos, 1.0);
pPos.z -= ofs;
vData = data & dataMask;
# 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);
vFacing = dot(view_vec, view_normal);
# 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