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

edit_mesh_overlay_geom_edge.glsl « shaders « modes « draw « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: e8987b59c45f116f1110b59a5f6572af50a4d37c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130

/* Solid Wirefram implementation
 * Mike Erwin, Clément Foucault */

layout(lines) in;
layout(triangle_strip, max_vertices=4) out;

uniform mat4 ProjectionMatrix;
uniform mat4 ViewProjectionMatrixInverse;
uniform vec2 viewportSize;

#ifdef USE_WORLD_CLIP_PLANES
uniform int  WorldClipPlanesLen;
#endif

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 */
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

/* See fragment shader */
flat out vec2 ssPos[3];

/* Some bugged AMD drivers need these global variables. See T55961 */
#ifdef VERTEX_SELECTION
vec3 vertex_color[3];
#endif

#ifdef VERTEX_FACING
float v_facing[3];
#endif

/* project to screen space */
vec2 proj(vec4 pos)
{
	return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize;
}

void doVertex(int v, vec4 pos)
{
#ifdef VERTEX_SELECTION
	vertexColor = vertex_color[v];
#endif

#ifdef VERTEX_FACING
	facing = v_facing[v];
#endif

	gl_Position = pos;

#ifdef USE_WORLD_CLIP_PLANES
	for (int i = 0; i < WorldClipPlanesLen; i++) {
		gl_ClipDistance[i] = gl_in[v].gl_ClipDistance[i];
	}
#endif

	EmitVertex();
}

void main()
{
	/* Face */
	faceColor = vec4(0.0);

	/* Proj Vertex */
	vec2 pos[2] = vec2[2](proj(pPos[0]), proj(pPos[1]));

	/* little optimization use a vec4 to vectorize
	 * following operations */
	vec4 dirs1, dirs2;

	/* Edge normalized vector */
	dirs1.xy = normalize(pos[1] - pos[0]);

	/* perpendicular to dir */
	dirs1.zw = vec2(-dirs1.y, dirs1.x);

	/* Make it view independent */
	dirs1 *= sizeEdgeFix / viewportSize.xyxy;

	dirs2 = dirs1;

	/* Perspective */
	if (ProjectionMatrix[3][3] == 0.0) {
		dirs1 *= pPos[0].w;
		dirs2 *= pPos[1].w;
	}

#ifdef VERTEX_SELECTION
	vertex_color[0] = EDIT_MESH_vertex_color(vData[0].x).rgb;
	vertex_color[1] = EDIT_MESH_vertex_color(vData[1].x).rgb;
#endif

#ifdef VERTEX_FACING
	/* Weird but some buggy AMD drivers need this. */
	v_facing[0] = vFacing[0];
	v_facing[1] = vFacing[1];
#endif

	/* Edge / Vert data */
	ssPos[0] = ssPos[2] = pos[0];
	ssPos[1] = pos[1];
	flag[0] = flag[2] = (vData[0].x << 8);
	flag[1] = (vData[1].x << 8);
	doVertex(0, pPos[0] + vec4( dirs1.zw, 0.0, 0.0));
	doVertex(0, pPos[0] + vec4(-dirs1.zw, 0.0, 0.0));

	flag[2] |= vData[0].y;
	edgesCrease[2] = vData[0].z / 255.0;
	edgesBweight[2] = vData[0].w / 255.0;

	doVertex(1, pPos[1] + vec4( dirs2.zw, 0.0, 0.0));
	doVertex(1, pPos[1] + vec4(-dirs2.zw, 0.0, 0.0));

	EndPrimitive();
}