03d93abc1a
There is a risk that we try to preserve a loop variable through multiple iterations, even though the dominating block is inside a loop. Fix this by analyzing if a block starts off by writing to a variable. In that case, there cannot be any preservation going on. If we don't, pretend the loop header is reading the variable, which moves the variable to an appropriate scope.
55 lines
1.1 KiB
GLSL
55 lines
1.1 KiB
GLSL
#include <metal_stdlib>
|
|
#include <simd/simd.h>
|
|
|
|
using namespace metal;
|
|
|
|
struct Light
|
|
{
|
|
packed_float3 Position;
|
|
float Radius;
|
|
float4 Color;
|
|
};
|
|
|
|
struct UBO
|
|
{
|
|
float4x4 uMVP;
|
|
Light lights[4];
|
|
};
|
|
|
|
struct Light_1
|
|
{
|
|
float3 Position;
|
|
float Radius;
|
|
float4 Color;
|
|
};
|
|
|
|
struct main0_out
|
|
{
|
|
float4 vColor [[user(locn0)]];
|
|
float4 gl_Position [[position]];
|
|
};
|
|
|
|
struct main0_in
|
|
{
|
|
float4 aVertex [[attribute(0)]];
|
|
float3 aNormal [[attribute(1)]];
|
|
};
|
|
|
|
vertex main0_out main0(main0_in in [[stage_in]], constant UBO& _21 [[buffer(0)]])
|
|
{
|
|
main0_out out = {};
|
|
out.gl_Position = _21.uMVP * in.aVertex;
|
|
out.vColor = float4(0.0);
|
|
Light_1 light;
|
|
for (int i = 0; i < 4; i++)
|
|
{
|
|
light.Position = float3(_21.lights[i].Position);
|
|
light.Radius = _21.lights[i].Radius;
|
|
light.Color = _21.lights[i].Color;
|
|
float3 L = in.aVertex.xyz - light.Position;
|
|
out.vColor += ((_21.lights[i].Color * fast::clamp(1.0 - (length(L) / light.Radius), 0.0, 1.0)) * dot(in.aNormal, normalize(L)));
|
|
}
|
|
return out;
|
|
}
|
|
|