//pref
Ambient|float|0.0|0.5|1
Diffuse|float|0.0|0.7|1
Specular|float|0.0|0.2|1
Shininess|float|1|60|120
Explode|float|0.0|0.02|0.2
//Disk|bool|false
Experimental shader: Exploded view. Copyright 2018 Chris Rorden, BSD2clause.|note
//vert
#version 330
layout(location = 0) in vec3 Vert;
layout(location = 3) in vec3 Norm;
layout(location = 6) in vec4 Clr;
out vec3 vN, vL, vV;
out vec4 vPmvp, vClr, vP;
uniform mat4 ModelViewProjectionMatrix;
uniform mat4 ModelViewMatrix;
uniform mat3 NormalMatrix;
uniform vec3 LightPos = vec3(0.0, 20.0, 30.0); //LR, -DU+, -FN+
void main() {
    vN = normalize((NormalMatrix * Norm));
    vP = vec4(Vert, 1.0);
    gl_Position = ModelViewProjectionMatrix * vec4(Vert, 1.0);
    vPmvp = gl_Position;
    vL = normalize(LightPos);
    vV = -vec3(ModelViewMatrix*vec4(Vert,1.0));
    vClr = Clr;
}
//geom
#version 330

uniform float Explode;
in vec3 vL[3];   //[3] because this makes a triangle
in vec3 vN[3];
in vec3 vV[3];
in vec4 vP[3];
in vec4 vPmvp[3];
in vec4 vClr[3];
layout (triangles) in;
layout (triangle_strip, max_vertices = 3) out;

out vec3 gE, gL, gN, gV;
out vec4 gP, gClr;

void main(void) {
	vec3 P0 = vPmvp[0].xyz;
	vec3 P1 = vPmvp[1].xyz;
	vec3 P2 = vPmvp[2].xyz;
	vec3 V0 = P0 - P1;
	vec3 V1 = P2 - P1;
	vec3 N = cross(V0, V1);
	N = normalize(N);
	//N = mix( normalize(N), N, float(length(N) > 0.0001));
	for(int i=0; i < 3; i++) {
		gl_Position = vPmvp[i]+(vec4(N,0.0) * Explode);
		gL = vL[i];
		gN = vN[i];
		gV = vV[i];
		gP = vP[i];
		gClr = vClr[i];
    	if (i == 0)
    		gE = vec3(1.0, 0.0, 0.0);
    	else if (i == 1)
    		gE = vec3(0.0, 1.0, 0.0);
    	else
    		gE = vec3(0.0, 0.0, 1.0);
		EmitVertex();
	}
	EndPrimitive();
}
//frag
#version 330
uniform float Ambient, Diffuse, Specular, Shininess, WireColor, WireWidth;
//uniform bool Disk = false;
uniform vec4 ClipPlane;
in vec3 gE, gL, gN, gV;
in vec4 gP, gClr;
out vec4 color;
void main() {
	if ((ClipPlane[0] < 1.5) && (dot( ClipPlane, gP) > 0.0)) discard;
	//if (Disk) if (length(gE) > 0.69)  discard;
	vec3 l = normalize(gL);
	vec3 n = normalize(gN);
	vec3 h = normalize(l+normalize(gV));
	vec3 a = gClr.rgb;
	vec3 d = a * Diffuse;
	a *= Ambient;
	float diff = dot(n,l);
	float spec = pow(max(0.0,dot(n,h)), Shininess);
	vec3 backcolor = Ambient*vec3(0.1+0.1+0.1) + d*abs(diff);
	float backface = step(0.00, n.z);
	vec4 face = vec4(mix(backcolor.rgb, a + d*diff + spec*Specular,  backface), 1.0);
	color = face;
}
