1#version 150
2in vec4 color;
3in vec4 fP;
4in vec3 fN;
5in float dist[6];
6uniform vec4 front_color;
7uniform vec4 back_color;
8uniform vec4 light_pos;
9uniform vec4 light_diff;
10uniform vec4 light_spec;
11uniform vec4 light_amb;
12uniform float spec_power;
13uniform int is_two_side;
14uniform bool is_selected;
15uniform bool is_clipbox_on;
16uniform float near;
17uniform float far;
18uniform float width;
19uniform float height;
20uniform bool comparing;
21uniform bool writing;
22uniform bool back_front_shading;
23uniform sampler2D sampler;
24uniform float alpha;
25out vec4 out_color;
26
27float depth(float z)
28{
29  return (2 * near) / (far + near - z * (far - near));
30}
31
32void main(void) {
33
34  if(is_clipbox_on)
35    if(dist[0]>0.0 ||
36      dist[1]>0.0 ||
37      dist[2]>0.0 ||
38      dist[3]>0.0 ||
39      dist[4]>0.0 ||
40      dist[5]>0.0)
41        discard;
42
43  float d = depth(gl_FragCoord.z);
44  float test = texture(sampler, vec2(gl_FragCoord.x/width, gl_FragCoord.y/height)).r;
45  if(comparing && d <= test)
46    discard;
47  if(writing)
48    out_color = vec4(d,d,d,1.0);
49  else
50  {
51    vec3 L = light_pos.xyz - fP.xyz;
52    vec3 V = -fP.xyz;
53    vec3 N;
54    vec4 my_color = vec4(color.xyz, 1.0);
55    if(fN ==  vec3(0.0,0.0,0.0))
56    {
57      out_color = my_color;
58      return;
59    }
60    else
61      N = normalize(fN);
62    L = normalize(L);
63    V = normalize(V);
64    vec3 R = reflect(-L, N);
65    vec4 diffuse;
66    float dot_prod = dot(N,L);
67
68    if(back_front_shading)
69    {
70      if (dot_prod > 0)
71        my_color = front_color;
72      else
73        my_color = back_color;
74    }
75    else
76    {
77      my_color = vec4(color.xyz, 1.0);
78    }
79    if(is_two_side == 1)
80      diffuse = abs(dot_prod) * light_diff * color;
81    else
82      diffuse = max(dot_prod, 0.0) * light_diff * my_color;
83
84    vec4 specular = pow(max(dot(R,V), 0.0), spec_power) * light_spec;
85    vec4 ret_color = vec4((my_color*light_amb).xyz + diffuse.xyz + specular.xyz,1);
86    if(is_selected)
87      out_color = vec4(ret_color.r+35.0/255.0, ret_color.g+35.0/255.0, ret_color.b+35.0/255.0, alpha);
88    else
89      out_color = vec4(ret_color.xyz, alpha);
90  }
91}
92