mirror of
https://github.com/aap/librw.git
synced 2025-04-07 10:28:19 +01:00
114 lines
2.9 KiB
C++
114 lines
2.9 KiB
C++
const char *header_vert_src =
|
|
|
|
"#define DIRECTIONALS\n"
|
|
"//#define POINTLIGHTS\n"
|
|
"//#define SPOTLIGHTS\n"
|
|
|
|
"#ifdef USE_UBOS\n"
|
|
"layout(std140) uniform State\n"
|
|
"{\n"
|
|
" vec2 u_alphaRef;\n"
|
|
" vec4 u_fogData;\n"
|
|
" vec4 u_fogColor;\n"
|
|
"};\n"
|
|
"#else\n"
|
|
"uniform vec2 u_alphaRef;\n"
|
|
"uniform vec4 u_fogData;\n"
|
|
"uniform vec4 u_fogColor;\n"
|
|
"#endif\n"
|
|
|
|
"#define u_fogStart (u_fogData.x)\n"
|
|
"#define u_fogEnd (u_fogData.y)\n"
|
|
"#define u_fogRange (u_fogData.z)\n"
|
|
"#define u_fogDisable (u_fogData.w)\n"
|
|
|
|
"#ifdef USE_UBOS\n"
|
|
"layout(std140) uniform Scene\n"
|
|
"{\n"
|
|
" mat4 u_proj;\n"
|
|
" mat4 u_view;\n"
|
|
"};\n"
|
|
"#else\n"
|
|
"uniform mat4 u_proj;\n"
|
|
"uniform mat4 u_view;\n"
|
|
"#endif\n"
|
|
|
|
"#define MAX_LIGHTS 8\n"
|
|
|
|
"#ifdef USE_UBOS\n"
|
|
"layout(std140) uniform Object\n"
|
|
"{\n"
|
|
" mat4 u_world;\n"
|
|
" vec4 u_ambLight;\n"
|
|
" vec4 u_lightParams[MAX_LIGHTS]; // type, radius, minusCosAngle, hardSpot\n"
|
|
" vec4 u_lightPosition[MAX_LIGHTS];\n"
|
|
" vec4 u_lightDirection[MAX_LIGHTS];\n"
|
|
" vec4 u_lightColor[MAX_LIGHTS];\n"
|
|
"};\n"
|
|
"#else\n"
|
|
"uniform mat4 u_world;\n"
|
|
"uniform vec4 u_ambLight;\n"
|
|
"uniform vec4 u_lightParams[MAX_LIGHTS]; // type, radius, minusCosAngle, hardSpot\n"
|
|
"uniform vec4 u_lightPosition[MAX_LIGHTS];\n"
|
|
"uniform vec4 u_lightDirection[MAX_LIGHTS];\n"
|
|
"uniform vec4 u_lightColor[MAX_LIGHTS];\n"
|
|
"#endif\n"
|
|
|
|
"uniform vec4 u_matColor;\n"
|
|
"uniform vec4 u_surfProps; // amb, spec, diff, extra\n"
|
|
|
|
"#define surfAmbient (u_surfProps.x)\n"
|
|
"#define surfSpecular (u_surfProps.y)\n"
|
|
"#define surfDiffuse (u_surfProps.z)\n"
|
|
|
|
"vec3 DoDynamicLight(vec3 V, vec3 N)\n"
|
|
"{\n"
|
|
" vec3 color = vec3(0.0, 0.0, 0.0);\n"
|
|
" for(int i = 0; i < MAX_LIGHTS; i++){\n"
|
|
" if(u_lightParams[i].x == 0.0)\n"
|
|
" break;\n"
|
|
"#ifdef DIRECTIONALS\n"
|
|
" if(u_lightParams[i].x == 1.0){\n"
|
|
" // direct\n"
|
|
" float l = max(0.0, dot(N, -u_lightDirection[i].xyz));\n"
|
|
" color += l*u_lightColor[i].rgb;\n"
|
|
" }else\n"
|
|
"#endif\n"
|
|
"#ifdef POINTLIGHTS\n"
|
|
" if(u_lightParams[i].x == 2.0){\n"
|
|
" // point\n"
|
|
" vec3 dir = V - u_lightPosition[i].xyz;\n"
|
|
" float dist = length(dir);\n"
|
|
" float atten = max(0.0, (1.0 - dist/u_lightParams[i].y));\n"
|
|
" float l = max(0.0, dot(N, -normalize(dir)));\n"
|
|
" color += l*u_lightColor[i].rgb*atten;\n"
|
|
" }else\n"
|
|
"#endif\n"
|
|
"#ifdef SPOTLIGHTS\n"
|
|
" if(u_lightParams[i].x == 3.0){\n"
|
|
" // spot\n"
|
|
" vec3 dir = V - u_lightPosition[i].xyz;\n"
|
|
" float dist = length(dir);\n"
|
|
" float atten = max(0.0, (1.0 - dist/u_lightParams[i].y));\n"
|
|
" dir /= dist;\n"
|
|
" float l = max(0.0, dot(N, -dir));\n"
|
|
" float pcos = dot(dir, u_lightDirection[i].xyz); // cos to point\n"
|
|
" float ccos = -u_lightParams[i].z;\n"
|
|
" float falloff = (pcos-ccos)/(1.0-ccos);\n"
|
|
" if(falloff < 0.0) // outside of cone\n"
|
|
" l = 0.0;\n"
|
|
" l *= max(falloff, u_lightParams[i].w);\n"
|
|
" return l*u_lightColor[i].rgb*atten;\n"
|
|
" }else\n"
|
|
"#endif\n"
|
|
" ;\n"
|
|
" }\n"
|
|
" return color;\n"
|
|
"}\n"
|
|
|
|
"float DoFog(float w)\n"
|
|
"{\n"
|
|
" return clamp((w - u_fogEnd)*u_fogRange, u_fogDisable, 1.0);\n"
|
|
"}\n"
|
|
;
|