#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float2 resolution;
};
struct buf1 {
  /* 0x0000 */ float2 injectionSwitch;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 x_GLF_color_1 [[color(0)]];
};

float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
  float result = 0.0f;
  int i = 0;
  result = -0.5f;
  i = 1;
  while (true) {
    int const x_125 = i;
    if ((x_125 < 800)) {
    } else {
      break;
    }
    int const x_128 = i;
    if (((x_128 % 32) == 0)) {
      float const x_134 = result;
      result = (x_134 + 0.400000006f);
    } else {
      int const x_136 = i;
      float const x_138 = *(thirty_two);
      if (((float(x_136) - (rint(x_138) * floor((float(x_136) / rint(x_138))))) <= 0.01f)) {
        float const x_144 = result;
        result = (x_144 + 100.0f);
      }
    }
    int const x_146 = i;
    float const x_148 = *(limit);
    if ((float(x_146) >= x_148)) {
      float const x_152 = result;
      return x_152;
    }
    {
      int const x_153 = i;
      i = as_type<int>((as_type<uint>(x_153) + as_type<uint>(1)));
    }
  }
  float const x_155 = result;
  return x_155;
}

void main_1(constant buf0& x_13, constant buf1& x_20, thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  float3 c = 0.0f;
  float thirty_two_1 = 0.0f;
  float param = 0.0f;
  float param_1 = 0.0f;
  float param_2 = 0.0f;
  float param_3 = 0.0f;
  int i_1 = 0;
  float3 x_58 = 0.0f;
  c = float3(7.0f, 8.0f, 9.0f);
  float const x_60 = x_13.resolution.x;
  thirty_two_1 = rint((x_60 / 8.0f));
  float const x_64 = (*(tint_symbol_3)).x;
  param = x_64;
  float const x_65 = thirty_two_1;
  param_1 = x_65;
  float const x_66 = compute_value_f1_f1_(&(param), &(param_1));
  c.x = x_66;
  float const x_69 = (*(tint_symbol_3)).y;
  param_2 = x_69;
  float const x_70 = thirty_two_1;
  param_3 = x_70;
  float const x_71 = compute_value_f1_f1_(&(param_2), &(param_3));
  c.y = x_71;
  float const x_74 = c.x;
  float const x_76 = c.y;
  c.z = (x_74 + x_76);
  i_1 = 0;
  while (true) {
    int const x_83 = i_1;
    if ((x_83 < 3)) {
    } else {
      break;
    }
    int const x_86 = i_1;
    float const x_88 = c[x_86];
    if ((x_88 >= 1.0f)) {
      int const x_92 = i_1;
      int const x_93 = i_1;
      float const x_95 = c[x_93];
      int const x_96 = i_1;
      float const x_98 = c[x_96];
      c[x_92] = (x_95 * x_98);
    }
    {
      int const x_101 = i_1;
      i_1 = as_type<int>((as_type<uint>(x_101) + as_type<uint>(1)));
    }
  }
  float const x_104 = x_20.injectionSwitch.x;
  float const x_106 = x_20.injectionSwitch.y;
  if ((x_104 < x_106)) {
    float3 const x_111 = c;
    x_58 = fabs(x_111);
  } else {
    float3 const x_113 = c;
    x_58 = x_113;
  }
  float3 const x_114 = x_58;
  float3 const x_115 = normalize(x_114);
  *(tint_symbol_4) = float4(x_115.x, x_115.y, x_115.z, 1.0f);
  return;
}

main_out tint_symbol_inner(constant buf0& x_13, constant buf1& x_20, float4 gl_FragCoord_param, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  *(tint_symbol_5) = gl_FragCoord_param;
  main_1(x_13, x_20, tint_symbol_5, tint_symbol_6);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_6)};
  return tint_symbol_2;
}

fragment tint_symbol_1 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_13 [[buffer(0)]], constant buf1& x_20 [[buffer(1)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  main_out const inner_result = tint_symbol_inner(x_13, x_20, gl_FragCoord_param, &(tint_symbol_7), &(tint_symbol_8));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

