#pragma clang diagnostic ignored "-Wmissing-prototypes" #include #include using namespace metal; struct Locals { float4x4 u_proj; float4x4 u_view; float3 u_camera_pos; }; struct main0_out { float4 Target0 [[color(0)]]; }; struct main0_in { float2 p_Uv [[user(locn0)]]; float3 p_PosWorld [[user(locn1)]]; }; static inline __attribute__((always_inline)) float3 F_Schlick(thread const float3& f0, thread const float3& f90, thread const float& theta) { return f0 + ((f90 - f0) * pow(1.0 - theta, 5.0)); } fragment main0_out main0(main0_in in [[stage_in]], constant Locals& _157 [[buffer(0)]], texture2d u_Texture [[texture(0)]], sampler u_Sampler [[sampler(0)]]) { main0_out out = {}; int2 dim = int2(512); float2 diff = float2(2.0 / float(dim.x), 2.0 / float(dim.y)); float x0 = u_Texture.sample(u_Sampler, in.p_Uv, int2(-1, 0)).x; float x1 = u_Texture.sample(u_Sampler, in.p_Uv, int2(1, 0)).x; float z0 = u_Texture.sample(u_Sampler, in.p_Uv, int2(0, -1)).x; float z1 = u_Texture.sample(u_Sampler, in.p_Uv, int2(0, 1)).x; float3 na = normalize(float3(-diff.x, (x1 - x0) / 180.0, 0.0)); float3 nb = normalize(float3(0.0, (z1 - z0) / 180.0, diff.y)); float3 N = normalize(cross(na, nb)); float depth = 1.0 - pow(fast::clamp((in.p_PosWorld.y + 10.0) / 50.0, 0.0, 1.5), 1.2000000476837158203125); float3 water_albedo = mix(float3(0.0, 0.86000001430511474609375, 0.790000021457672119140625), float3(0.02999999932944774627685546875, 0.07999999821186065673828125, 0.180000007152557373046875), float3(depth)); float3 L = float3(0.98058068752288818359375, 0.19611613452434539794921875, 0.0); float3 V = normalize(_157.u_camera_pos - in.p_PosWorld); float3 H = normalize(L + V); float NdotV = fast::clamp(dot(N, V), 9.9999997473787516355514526367188e-05, 1.0); float NdotL = fast::clamp(dot(N, L), 9.9999997473787516355514526367188e-05, 1.0); float HdotV = fast::clamp(dot(H, V), 0.0, 1.0); float NdotH = fast::clamp(dot(N, H), 0.0, 1.0); float3 param = float3(0.039999999105930328369140625, 0.039999999105930328369140625, 0.070000000298023223876953125); float3 param_1 = float3(1.0); float param_2 = HdotV; float3 F = F_Schlick(param, param_1, param_2); out.Target0 = float4((water_albedo * fast::max(0.699999988079071044921875, NdotL)) * (float3(1.0) - F), 1.0); return out; }