1#version 150 core
2precision highp int;
3precision highp float;
4
5struct Light
6{
7	vec3 position;
8	vec3 ambient;
9	vec3 diffuse;
10	vec3 specular;
11	vec4 lightModel;
12};
13
14struct MaterialColor
15{
16	vec4 ambient;
17	vec4 diffuse;
18	vec4 specular;
19	vec3 emission;
20	float shininess;
21};
22
23in vec3 iPosition;
24in vec3 iNormal;
25in vec2 iUv;
26in vec4 iColor;
27
28uniform mat4 uCurrentProjectionMatrix;
29uniform mat4 uCurrentModelViewMatrix;
30uniform mat4 uCurrentTextureMatrix;
31
32uniform bool uIsLight;
33uniform Light uLight;
34uniform MaterialColor uMaterial;
35uniform int uMaterialFlags;
36
37out vec4 oViewPos;
38out vec2 oUv;
39out vec4 oColor;
40out vec4 oLightResult;
41
42vec4 getLightResult()
43{
44	vec3 normal = normalize(mat3(transpose(inverse(uCurrentModelViewMatrix))) * vec3(iNormal.x, iNormal.y, -iNormal.z));
45	float nDotVP = max(0.0, dot(normal, normalize(vec3(uLight.position))));
46	float nDotHV = max(0.0, dot(normal, normalize(vec3(oViewPos.xyz + uLight.position))));
47	float pf = nDotVP == 0.0 ? 0.0 : pow(nDotHV, uMaterial.shininess);
48
49	vec4 ambient = vec4(uLight.ambient, 1.0);
50	vec4 diffuse = vec4(uLight.diffuse, 1.0) * nDotVP;
51	vec4 specular = vec4(uLight.specular, 1.0) * pf;
52
53	vec4 sceneColor = (uMaterialFlags & 1) != 0 ? vec4(uMaterial.emission, 1.0) + uMaterial.ambient * uLight.lightModel : uLight.lightModel;
54	vec4 finalColor = sceneColor + ambient * uMaterial.ambient + diffuse * uMaterial.specular + specular * uMaterial.specular;
55	return clamp(finalColor, 0.0, 1.0);
56}
57
58void main()
59{
60	oViewPos = uCurrentModelViewMatrix * vec4(vec3(iPosition.x, iPosition.y, -iPosition.z), 1.0);
61	gl_Position = uCurrentProjectionMatrix * oViewPos;
62
63	oUv = (uCurrentTextureMatrix * vec4(iUv, 1.0, 1.0)).xy;
64	oColor = iColor;
65	oLightResult = uIsLight && (uMaterialFlags & 4) == 0 ? getLightResult() : uMaterial.ambient;
66}
67