#include "CModelShaders.hpp" #include "hecl/Backend/GLSL.hpp" namespace urde { using namespace std::literals; extern const hecl::Backend::Function ExtensionLightingFuncsGLSL[]; extern const hecl::Backend::Function ExtensionPostFuncsGLSL[]; static std::string_view LightingGLSL = "struct Light\n" "{\n" " vec4 pos;\n" " vec4 dir;\n" " vec4 color;\n" " vec4 linAtt;\n" " vec4 angAtt;\n" "};\n" "struct Fog\n" "{\n" " int mode;\n" " vec4 color;\n" " float rangeScale;\n" " float start;\n" "};\n" "\n" "UBINDING2 uniform LightingUniform\n" "{\n" " Light lights[" _XSTR(URDE_MAX_LIGHTS) "];\n" " vec4 ambient;\n" " vec4 colorReg0;\n" " vec4 colorReg1;\n" " vec4 colorReg2;\n" " vec4 mulColor;\n" " Fog fog;\n" "};\n" "\n" "vec4 LightingFunc(vec3 mvPosIn, vec3 mvNormIn)\n" "{\n" " vec4 ret = ambient;\n" " \n" " for (int i=0 ; i<" _XSTR(URDE_MAX_LIGHTS) " ; ++i)\n" " {\n" " vec3 delta = mvPosIn - lights[i].pos.xyz;\n" " float dist = length(delta);\n" " float angDot = clamp(dot(normalize(delta), lights[i].dir.xyz), 0.0, 1.0);\n" " float att = 1.0 / (lights[i].linAtt[2] * dist * dist +\n" " lights[i].linAtt[1] * dist +\n" " lights[i].linAtt[0]);\n" " float angAtt = lights[i].angAtt[2] * angDot * angDot +\n" " lights[i].angAtt[1] * angDot +\n" " lights[i].angAtt[0];\n" " ret += lights[i].color * clamp(angAtt, 0.0, 1.0) * att * clamp(dot(normalize(-delta), mvNormIn), 0.0, 1.0);\n" " }\n" " \n" " return ret;\n" "}\n"sv; static std::string_view LightingShadowGLSL = "struct Light\n" "{\n" " vec4 pos;\n" " vec4 dir;\n" " vec4 color;\n" " vec4 linAtt;\n" " vec4 angAtt;\n" "};\n" "struct Fog\n" "{\n" " int mode;\n" " vec4 color;\n" " float rangeScale;\n" " float start;\n" "};\n" "\n" "UBINDING2 uniform LightingUniform\n" "{\n" " Light lights[" _XSTR(URDE_MAX_LIGHTS) "];\n" " vec4 ambient;\n" " vec4 colorReg0;\n" " vec4 colorReg1;\n" " vec4 colorReg2;\n" " vec4 mulColor;\n" " Fog fog;\n" "};\n" "\n" "vec4 LightingShadowFunc(vec3 mvPosIn, vec3 mvNormIn)\n" "{\n" " vec2 shadowUV = vtf.extTcgs[0];\n" " shadowUV.y = 1.0 - shadowUV.y;\n" " \n" " vec4 ret = ambient;\n" " \n" " vec3 delta = mvPosIn - lights[0].pos.xyz;\n" " float dist = length(delta);\n" " float angDot = clamp(dot(normalize(delta), lights[0].dir.xyz), 0.0, 1.0);\n" " float att = 1.0 / (lights[0].linAtt[2] * dist * dist +\n" " lights[0].linAtt[1] * dist +\n" " lights[0].linAtt[0]);\n" " float angAtt = lights[0].angAtt[2] * angDot * angDot +\n" " lights[0].angAtt[1] * angDot +\n" " lights[0].angAtt[0];\n" " ret += lights[0].color * clamp(angAtt, 0.0, 1.0) * att * clamp(dot(normalize(-delta), mvNormIn), 0.0, 1.0) *\n" " texture(extTex7, shadowUV).r;\n" " \n" " for (int i=1 ; i<" _XSTR(URDE_MAX_LIGHTS) " ; ++i)\n" " {\n" " vec3 delta = mvPosIn - lights[i].pos.xyz;\n" " float dist = length(delta);\n" " float angDot = clamp(dot(normalize(delta), lights[i].dir.xyz), 0.0, 1.0);\n" " float att = 1.0 / (lights[i].linAtt[2] * dist * dist +\n" " lights[i].linAtt[1] * dist +\n" " lights[i].linAtt[0]);\n" " float angAtt = lights[i].angAtt[2] * angDot * angDot +\n" " lights[i].angAtt[1] * angDot +\n" " lights[i].angAtt[0];\n" " ret += lights[i].color * clamp(angAtt, 0.0, 1.0) * att * clamp(dot(normalize(-delta), mvNormIn), 0.0, 1.0);\n" " }\n" " \n" " return ret;\n" "}\n"sv; static std::string_view MainPostGLSL = "vec4 MainPostFunc(vec4 colorIn)\n" "{\n" " float fogZ, temp;\n" " switch (fog.mode)\n" " {\n" " case 2:\n" " fogZ = (-vtf.mvPos.z - fog.start) * fog.rangeScale;\n" " break;\n" " case 4:\n" " fogZ = 1.0 - exp2(-8.0 * (-vtf.mvPos.z - fog.start) * fog.rangeScale);\n" " break;\n" " case 5:\n" " temp = (-vtf.mvPos.z - fog.start) * fog.rangeScale;\n" " fogZ = 1.0 - exp2(-8.0 * temp * temp);\n" " break;\n" " case 6:\n" " fogZ = exp2(-8.0 * (fog.start + vtf.mvPos.z) * fog.rangeScale);\n" " break;\n" " case 7:\n" " temp = (fog.start + vtf.mvPos.z) * fog.rangeScale;\n" " fogZ = exp2(-8.0 * temp * temp);\n" " break;\n" " default:\n" " fogZ = 0.0;\n" " break;\n" " }\n" "#ifdef BLEND_DST_ONE\n" " return vec4(mix(colorIn, vec4(0.0), clamp(fogZ, 0.0, 1.0)).rgb, colorIn.a);\n" "#else\n" " return vec4(mix(colorIn, fog.color, clamp(fogZ, 0.0, 1.0)).rgb, colorIn.a);\n" "#endif\n" "}\n" "\n"sv; static std::string_view ThermalPostGLSL = "UBINDING2 uniform ThermalUniform\n" "{\n" " vec4 tmulColor;\n" " vec4 addColor;\n" "};\n" "vec4 ThermalPostFunc(vec4 colorIn)\n" "{\n" " return vec4(texture(extTex7, vtf.extTcgs[0]).rrr * tmulColor.rgb + addColor.rgb, tmulColor.a + addColor.a);\n" "}\n" "\n"sv; static std::string_view SolidPostGLSL = "UBINDING2 uniform SolidUniform\n" "{\n" " vec4 solidColor;\n" "};\n" "vec4 SolidPostFunc(vec4 colorIn)\n" "{\n" " return solidColor;\n" "}\n" "\n"sv; static std::string_view MBShadowPostGLSL = "UBINDING2 uniform MBShadowUniform\n" "{\n" " vec4 shadowUp;\n" " float shadowId;\n" "};\n" "vec4 MBShadowPostFunc(vec4 colorIn)\n" "{\n" " float idTexel = texture(extTex0, vtf.extTcgs[0]).a;\n" " float sphereTexel = texture(extTex1, vtf.extTcgs[1]).a;\n" " float fadeTexel = texture(extTex2, vtf.extTcgs[2]).a;\n" " float val = ((abs(idTexel - shadowId) < 0.001) ?\n" " (dot(vtf.mvNorm.xyz, shadowUp.xyz) * shadowUp.w) : 0.0) *\n" " sphereTexel * fadeTexel;\n" " return vec4(0.0, 0.0, 0.0, val);\n" "}\n" "\n"sv; const hecl::Backend::Function ExtensionLightingFuncsGLSL[] = { {}, {LightingGLSL, "LightingFunc"}, {}, {LightingGLSL, "LightingFunc"}, {LightingGLSL, "LightingFunc"}, {}, {}, {}, {}, {}, {}, {}, {LightingShadowGLSL, "LightingShadowFunc"}, {LightingGLSL, "LightingFunc"}, {LightingGLSL, "LightingFunc"}, {LightingGLSL, "LightingFunc"}, {LightingGLSL, "LightingFunc"}, {LightingGLSL, "LightingFunc"}, {LightingGLSL, "LightingFunc"}, {LightingGLSL, "LightingFunc"} }; const hecl::Backend::Function ExtensionPostFuncsGLSL[] = { {}, {MainPostGLSL, "MainPostFunc"}, {ThermalPostGLSL, "ThermalPostFunc"}, {MainPostGLSL, "MainPostFunc"}, {MainPostGLSL, "MainPostFunc"}, {SolidPostGLSL, "SolidPostFunc"}, {SolidPostGLSL, "SolidPostFunc"}, {SolidPostGLSL, "SolidPostFunc"}, {SolidPostGLSL, "SolidPostFunc"}, {SolidPostGLSL, "SolidPostFunc"}, {SolidPostGLSL, "SolidPostFunc"}, {MBShadowPostGLSL, "MBShadowPostFunc"}, {MainPostGLSL, "MainPostFunc"}, {MainPostGLSL, "MainPostFunc"}, {MainPostGLSL, "MainPostFunc"}, {MainPostGLSL, "MainPostFunc"}, {MainPostGLSL, "MainPostFunc"}, {MainPostGLSL, "MainPostFunc"}, {MainPostGLSL, "MainPostFunc"}, {MainPostGLSL, "MainPostFunc"}, }; }