-
Notifications
You must be signed in to change notification settings - Fork 0
/
shader0.frag
168 lines (137 loc) · 4.18 KB
/
shader0.frag
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*******************************************************************
Fragment
Pre-pass Shader : Pass fragment data to main shader
*******************************************************************/
#version 420 compatibility
// Input from vs
smooth in vec3 n;
smooth in vec3 v;
smooth in vec3 original_v;
// Output fragments
layout(location = 0) out vec4 o_depthSelectedF;
layout(location = 1) out vec4 o_depthSelected;
layout(location = 2) out vec4 o_depthSQ;
layout(location = 3) out vec4 o_selectedColours;
// Uniforms
uniform vec2 frameBufSize;
uniform bool selected = false;
uniform bool iselem = false;
// Superquad data
uniform vec3 pos1 = vec3(0, 0, 0);
uniform vec3 pos2 = vec3(0, 0, 0);
uniform vec3 norm1 = vec3(0, 0, 0);
uniform vec3 norm2 = vec3(0, 0, 0);
uniform vec3 scale = vec3(0, 0, 0);
uniform vec3 right = vec3(0, 0, 0);
uniform vec3 up = vec3(0, 0, 0);
uniform vec3 forward = vec3(0, 0, 0);
uniform float angle = 0.0;
uniform float tilt = 0.0;
uniform float phi = 0.0;
uniform float theta = 0.0;
uniform float thickness = 0.4;
uniform bool toroid = false;
uniform bool cutter = true;
uniform int elemssize;
//------------------------------------------------
vec3 PackFloat8bitRGB(float val) {
vec3 pack = vec3(1.0, 255.0, 65025.0) * val;
pack = fract(pack);
pack -= vec3(pack.yz / 255.0, 0.0);
return pack;
}
//------------------------------------------------
float UnpackFloat8bitRGB(vec3 pack) {
return dot(pack, vec3(1.0, 1.0 / 255.0, 1.0 / 65025.0));
}
//------------ Linearize Depth ------------------------
float LinearizeDepth(float depth)
{
float n = 1.0; // camera z near
float f = 100.0; // camera z far
//float n = 0.1; // camera z near
//float f = 1000.0; // camera z far
float z = depth;
return (2.0 * n) / (f + n - z * (f - n));
}
mat3 rotationMatrix(float angle, vec3 axis)
{
axis = normalize(axis);
float s = sin(angle);
float c = cos(angle);
float oc = 1.0 - c;
return mat3(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s,
oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s,
oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c);
}
//------------ Draw Superquad (discard) -----------------
void superquad()
{
float dist = distance(pos1, pos2);
vec3 poss = original_v - (pos1 + pos2) / 2.0;
/*vec3 p1 = (pos1 + pos2)/2.0 + 0.1 * scale.y * right;
vec3 p2 = (pos1 + pos2)/2.0 - 0.1 * scale.y * right;
if (selected && dot((original_v-p1), right) < 0.0 && dot((original_v-p2), right) > 0.0)
return;
*/
// Rotation matrix
//vec3 right = normalize(pos2 - pos1);
//vec3 forward = normalize((norm1 + norm2) / 2.0);
//vec3 up = normalize(cross(forward, right));
//vec3 up = normalize((norm1 + norm2) / 2.0);
///vec3 forward = normalize(cross(right, up));
mat3 rotMat = mat3(right, up, forward);
mat3 spinMat = rotationMatrix(-angle,up);
float val = 0;
/* if (toroid)
{
float alpha = 1.0 / thickness;
vec3 newscale = scale / (alpha + 1.0);
poss = inverse(rotMat) *( poss) / (newscale * 0.5);
float tval = pow((pow(abs(poss.z), 2.0/theta) + pow(abs(poss.x), 2.0/theta)), theta/2.0);
val = pow(abs(tval - alpha), 2.0/phi) + pow(abs(poss.y), 2.0/phi) - 1.0;
} */
if (cutter)
{
poss = inverse(spinMat) * poss;
poss = inverse(rotMat) * poss;
poss = poss / (scale * 0.5);
//poss = inverse(rotMat) *( poss) / (scale * 0.5);
val = pow((pow(abs(poss.z), 2.0/theta) + pow(abs(poss.x), 2.0/theta)), theta/phi) + pow(abs(poss.y),2.0/phi) - 1.0;
if (selected) // if selected
{
if (val < 0 && elemssize > 0)
{
discard;
}
}
}
}
// **************** Main function *************************
void main()
{
vec3 newN = n;
if (!gl_FrontFacing)
newN = -newN;
//float d = gl_FragCoord.z;
vec3 d = PackFloat8bitRGB(gl_FragCoord.z);
superquad();
if (selected)
{
o_depthSelectedF = vec4(vec3(1), 1);
o_selectedColours = gl_Color;
if (gl_FrontFacing)
{
o_depthSelectedF = vec4(d, 1);
}
else
o_depthSelected = vec4(d, 1);
}
if (iselem && cutter)
{
if (gl_FrontFacing)
discard;
else
o_depthSQ = vec4(d, 1);
}
}