| 
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -85,13 +85,13 @@ static const char fStandardShaderStr[] = | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"{\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    vec3 surfacePos = vec3(modelMatrix*vec4(fragPosition, 1));\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    vec3 surfaceToLight = l.position - surfacePos;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    float brightness = clamp(dot(n, surfaceToLight)/(length(surfaceToLight)*length(n)), 0, 1);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    float brightness = clamp(float(dot(n, surfaceToLight)/(length(surfaceToLight)*length(n))), 0.0, 1.0);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    float diff = 1.0/dot(surfaceToLight/l.radius, surfaceToLight/l.radius)*brightness*l.intensity;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    float spec = 0.0;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    if (diff > 0.0)\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    {\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"        vec3 h = normalize(-l.direction + v);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"        spec = pow(dot(n, h), 3 + glossiness)*s;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"        spec = pow(dot(n, h), 3.0 + glossiness)*s;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    }\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    return (diff*l.diffuse.rgb + spec*colSpecular.rgb);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"}\n" | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -99,23 +99,23 @@ static const char fStandardShaderStr[] = | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"vec3 CalcDirectionalLight(Light l, vec3 n, vec3 v, float s)\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"{\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    vec3 lightDir = normalize(-l.direction);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    float diff = clamp(dot(n, lightDir), 0.0, 1.0)*l.intensity;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    float diff = clamp(float(dot(n, lightDir)), 0.0, 1.0)*l.intensity;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    float spec = 0.0;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    if (diff > 0.0)\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    {\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"        vec3 h = normalize(lightDir + v);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"        spec = pow(dot(n, h), 3 + glossiness)*s;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"        spec = pow(dot(n, h), 3.0 + glossiness)*s;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    }\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    return (diff*l.intensity*l.diffuse.rgb + spec*colSpecular.rgb);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"}\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"vec3 CalcSpotLight(Light l, vec3 n, vec3 v, float s)\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"{\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    vec3 surfacePos = vec3(modelMatrix*vec4(fragPosition, 1));\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    vec3 surfacePos = vec3(modelMatrix*vec4(fragPosition, 1.0));\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    vec3 lightToSurface = normalize(surfacePos - l.position);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    vec3 lightDir = normalize(-l.direction);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    float diff = clamp(dot(n, lightDir), 0.0, 1.0)*l.intensity;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    float attenuation = clamp(dot(n, lightToSurface), 0.0, 1.0);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    float diff = clamp(float(dot(n, lightDir)), 0.0, 1.0)*l.intensity;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    float attenuation = clamp(float(dot(n, lightToSurface)), 0.0, 1.0);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    attenuation = dot(lightToSurface, -lightDir);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    float lightToSurfaceAngle = degrees(acos(attenuation));\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    if (lightToSurfaceAngle > l.coneAngle) attenuation = 0.0;\n" | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -125,37 +125,45 @@ static const char fStandardShaderStr[] = | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    if (diffAttenuation > 0.0)\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    {\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"        vec3 h = normalize(lightDir + v);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"        spec = pow(dot(n, h), 3 + glossiness)*s;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"        spec = pow(dot(n, h), 3.0 + glossiness)*s;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    }\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    return (falloff*(diffAttenuation*l.diffuse.rgb + spec*colSpecular.rgb));\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"}\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"void main()\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"{\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    mat3 normalMatrix = transpose(inverse(mat3(modelMatrix)));\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    mat3 normalMatrix = mat3(modelMatrix);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    vec3 normal = normalize(normalMatrix*fragNormal);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    vec3 n = normalize(normal);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    vec3 v = normalize(viewDir);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    vec4 texelColor = texture2D(texture0, fragTexCoord);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#elif defined(GRAPHICS_API_OPENGL_33) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    vec4 texelColor = texture(texture0, fragTexCoord);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    vec3 lighting = colAmbient.rgb;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    if (useNormal == 1)\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    {\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"        n *= texture2D(texture1, fragTexCoord).rgb;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#elif defined(GRAPHICS_API_OPENGL_33) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"        n *= texture(texture1, fragTexCoord).rgb;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"        n = normalize(n);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    }\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    float spec = 1.0;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(GRAPHICS_API_OPENGL_ES2) || defined(GRAPHICS_API_OPENGL_21) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    if (useSpecular == 1) spec *= normalize(texture2D(texture2, fragTexCoord).r);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#elif defined(GRAPHICS_API_OPENGL_33) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    if (useSpecular == 1) spec *= normalize(texture(texture2, fragTexCoord).r);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    for (int i = 0; i < lightsCount; i++)\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    {\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"        if (lights[i].enabled == 1)\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"        {\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"            switch (lights[i].type)\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"            {\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"                case 0: lighting += CalcPointLight(lights[i], n, v, spec); break;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"                case 1: lighting += CalcDirectionalLight(lights[i], n, v, spec); break;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"                case 2: lighting += CalcSpotLight(lights[i], n, v, spec); break;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"                default: break;\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"            }\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"            if(lights[i].type == 0) lighting += CalcPointLight(lights[i], n, v, spec);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"            else if(lights[i].type == 1) lighting += CalcDirectionalLight(lights[i], n, v, spec);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"            else if(lights[i].type == 2) lighting += CalcSpotLight(lights[i], n, v, spec);\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"        }\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			"    }\n" | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#if defined(GRAPHICS_API_OPENGL_33) | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
				
				 | 
			
			 | 
			
			
 |