summaryrefslogtreecommitdiff
path: root/src/gl/shaders/header.vert
diff options
context:
space:
mode:
Diffstat (limited to 'src/gl/shaders/header.vert')
-rw-r--r--src/gl/shaders/header.vert128
1 files changed, 128 insertions, 0 deletions
diff --git a/src/gl/shaders/header.vert b/src/gl/shaders/header.vert
new file mode 100644
index 0000000..bb9881f
--- /dev/null
+++ b/src/gl/shaders/header.vert
@@ -0,0 +1,128 @@
+
+//#define DIRECTIONALS
+//#define POINTLIGHTS
+//#define SPOTLIGHTS
+
+#define ATTRIB_POS 0
+#define ATTRIB_NORMAL 1
+#define ATTRIB_COLOR 2
+#define ATTRIB_WEIGHTS 3
+#define ATTRIB_INDICES 4
+#define ATTRIB_TEXCOORDS0 5
+#define ATTRIB_TEXCOORDS1 6
+
+
+VSIN(ATTRIB_NORMAL) vec3 in_normal;
+VSIN(ATTRIB_COLOR) vec4 in_color;
+VSIN(ATTRIB_WEIGHTS) vec4 in_weights;
+VSIN(ATTRIB_INDICES) vec4 in_indices;
+VSIN(ATTRIB_TEXCOORDS0) vec2 in_tex0;
+VSIN(ATTRIB_TEXCOORDS1) vec2 in_tex1;
+
+
+#ifdef USE_UBOS
+layout(std140) uniform State
+{
+ vec2 u_alphaRef;
+ vec4 u_fogData;
+ vec4 u_fogColor;
+};
+#else
+uniform vec4 u_alphaRef;
+uniform vec4 u_fogData;
+uniform vec4 u_fogColor;
+#endif
+
+#define u_fogStart (u_fogData.x)
+#define u_fogEnd (u_fogData.y)
+#define u_fogRange (u_fogData.z)
+#define u_fogDisable (u_fogData.w)
+
+#ifdef USE_UBOS
+layout(std140) uniform Scene
+{
+ mat4 u_proj;
+ mat4 u_view;
+};
+#else
+uniform mat4 u_proj;
+uniform mat4 u_view;
+#endif
+
+#define MAX_LIGHTS 8
+
+#ifdef USE_UBOS
+layout(std140) uniform Object
+{
+ mat4 u_world;
+ vec4 u_ambLight;
+ vec4 u_lightParams[MAX_LIGHTS]; // type, radius, minusCosAngle, hardSpot
+ vec4 u_lightPosition[MAX_LIGHTS];
+ vec4 u_lightDirection[MAX_LIGHTS];
+ vec4 u_lightColor[MAX_LIGHTS];
+};
+#else
+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];
+#endif
+
+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)
+
+vec3 DoDynamicLight(vec3 V, vec3 N)
+{
+ 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;
+#ifdef DIRECTIONALS
+ 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
+#endif
+#ifdef POINTLIGHTS
+ 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
+#endif
+#ifdef SPOTLIGHTS
+ 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;
+ }else
+#endif
+ ;
+ }
+ return color;
+}
+
+float DoFog(float w)
+{
+ return clamp((w - u_fogEnd)*u_fogRange, u_fogDisable, 1.0);
+}