2020-05-13 20:48:14 +02:00
|
|
|
// State
|
|
|
|
uniform float u_fogStart;
|
|
|
|
uniform float u_fogEnd;
|
|
|
|
uniform float u_fogRange;
|
|
|
|
uniform float u_fogDisable;
|
|
|
|
//uniform vec4 u_fogColor;
|
|
|
|
|
|
|
|
// Scene
|
|
|
|
uniform mat4 u_proj;
|
|
|
|
uniform mat4 u_view;
|
|
|
|
|
|
|
|
#define MAX_LIGHTS 8
|
|
|
|
|
|
|
|
// Object
|
2020-05-14 00:07:34 +02:00
|
|
|
uniform mat4 u_world;
|
|
|
|
uniform vec4 u_ambLight;
|
|
|
|
uniform vec4 u_lightParams[MAX_LIGHTS]; // type, radius, minusCosAngle, hardSpot
|
|
|
|
uniform vec4 u_lightPosition[MAX_LIGHTS];
|
|
|
|
uniform vec4 u_lightDirection[MAX_LIGHTS];
|
|
|
|
uniform vec4 u_lightColor[MAX_LIGHTS];
|
2020-05-13 20:48:14 +02:00
|
|
|
|
|
|
|
uniform vec4 u_matColor;
|
|
|
|
uniform vec4 u_surfProps; // amb, spec, diff, extra
|
|
|
|
|
|
|
|
#define surfAmbient (u_surfProps.x)
|
|
|
|
#define surfSpecular (u_surfProps.y)
|
|
|
|
#define surfDiffuse (u_surfProps.z)
|
|
|
|
|
2020-05-14 00:07:34 +02:00
|
|
|
vec3 DoDynamicLight(vec3 V, vec3 N)
|
2020-05-13 20:48:14 +02:00
|
|
|
{
|
2020-05-14 00:07:34 +02:00
|
|
|
vec3 color = vec3(0.0, 0.0, 0.0);
|
|
|
|
for(int i = 0; i < MAX_LIGHTS; i++){
|
|
|
|
if(u_lightParams[i].x == 0.0)
|
|
|
|
break;
|
|
|
|
if(u_lightParams[i].x == 1.0){
|
|
|
|
// direct
|
|
|
|
float l = max(0.0, dot(N, -u_lightDirection[i].xyz));
|
|
|
|
color += l*u_lightColor[i].rgb;
|
|
|
|
/*
|
|
|
|
}else if(u_lightParams[i].x == 2.0){
|
|
|
|
// point
|
|
|
|
vec3 dir = V - u_lightPosition[i].xyz;
|
|
|
|
float dist = length(dir);
|
|
|
|
float atten = max(0.0, (1.0 - dist/u_lightParams[i].y));
|
|
|
|
float l = max(0.0, dot(N, -normalize(dir)));
|
|
|
|
color += l*u_lightColor[i].rgb*atten;
|
|
|
|
}else if(u_lightParams[i].x == 3.0){
|
|
|
|
// spot
|
|
|
|
vec3 dir = V - u_lightPosition[i].xyz;
|
|
|
|
float dist = length(dir);
|
|
|
|
float atten = max(0.0, (1.0 - dist/u_lightParams[i].y));
|
|
|
|
dir /= dist;
|
|
|
|
float l = max(0.0, dot(N, -dir));
|
|
|
|
float pcos = dot(dir, u_lightDirection[i].xyz); // cos to point
|
|
|
|
float ccos = -u_lightParams[i].z;
|
|
|
|
float falloff = (pcos-ccos)/(1.0-ccos);
|
|
|
|
if(falloff < 0.0) // outside of cone
|
|
|
|
l = 0.0;
|
|
|
|
l *= max(falloff, u_lightParams[i].w);
|
|
|
|
return l*u_lightColor[i].rgb*atten;
|
|
|
|
*/
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return color;
|
2020-05-13 20:48:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
float DoFog(float w)
|
|
|
|
{
|
|
|
|
return clamp((w - u_fogEnd)*u_fogRange, u_fogDisable, 1.0);
|
|
|
|
}
|