#include <metal_stdlib>

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

float compute_value_f1_f1_(thread float* const limit, thread float* const thirty_two) {
  float x_104 = 0.0f;
  float x_104_phi = 0.0f;
  int x_107_phi = 0;
  x_104_phi = -0.5f;
  x_107_phi = 1;
  while (true) {
    float x_126 = 0.0f;
    float x_125 = 0.0f;
    int x_108 = 0;
    float x_105_phi = 0.0f;
    x_104 = x_104_phi;
    int const x_107 = x_107_phi;
    if ((x_107 < 800)) {
    } else {
      break;
    }
    float x_124 = 0.0f;
    float x_125_phi = 0.0f;
    if (((x_107 % 32) == 0)) {
      x_126 = (x_104 + 0.400000006f);
      x_105_phi = x_126;
    } else {
      float const x_118 = *(thirty_two);
      x_125_phi = x_104;
      if ((fmod(float(x_107), rint(x_118)) <= 0.01f)) {
        x_124 = (x_104 + 100.0f);
        x_125_phi = x_124;
      }
      x_125 = x_125_phi;
      x_105_phi = x_125;
    }
    float x_105 = 0.0f;
    x_105 = x_105_phi;
    float const x_128 = *(limit);
    if ((float(x_107) >= x_128)) {
      return x_105;
    }
    {
      x_108 = as_type<int>((as_type<uint>(x_107) + as_type<uint>(1)));
      x_104_phi = x_105;
      x_107_phi = x_108;
    }
  }
  return x_104;
}

void main_1(constant buf0& x_10, constant buf1& x_16, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float3 c = 0.0f;
  float param = 0.0f;
  float param_1 = 0.0f;
  float param_2 = 0.0f;
  float param_3 = 0.0f;
  float3 x_54 = 0.0f;
  int x_74_phi = 0;
  c = float3(7.0f, 8.0f, 9.0f);
  float const x_56 = x_10.resolution.x;
  float const x_58 = rint((x_56 * 0.125f));
  float const x_60 = (*(tint_symbol_5)).x;
  param = x_60;
  param_1 = x_58;
  float const x_61 = compute_value_f1_f1_(&(param), &(param_1));
  c.x = x_61;
  float const x_64 = (*(tint_symbol_5)).y;
  param_2 = x_64;
  param_3 = x_58;
  float const x_65 = compute_value_f1_f1_(&(param_2), &(param_3));
  c.y = x_65;
  float const x_67 = c.x;
  float3 const x_68 = c;
  x_54 = x_68;
  float const x_70 = x_54.y;
  c.z = (x_67 + x_70);
  x_74_phi = 0;
  while (true) {
    int x_75 = 0;
    int const x_74 = x_74_phi;
    if ((x_74 < 3)) {
    } else {
      break;
    }
    int const x_80_save = x_74;
    float const x_81 = c[x_80_save];
    if ((x_81 >= 1.0f)) {
      float const x_86 = x_16.injectionSwitch.x;
      float const x_88 = x_16.injectionSwitch.y;
      if ((x_86 > x_88)) {
        discard_fragment();
      }
      float const x_92 = c[x_80_save];
      float const x_93 = c[x_80_save];
      c[x_80_save] = (x_92 * x_93);
    }
    {
      x_75 = as_type<int>((as_type<uint>(x_74) + as_type<uint>(1)));
      x_74_phi = x_75;
    }
  }
  float3 const x_95 = c;
  float3 const x_97 = normalize(fabs(x_95));
  *(tint_symbol_6) = float4(x_97.x, x_97.y, x_97.z, 1.0f);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_10 [[buffer(0)]], constant buf1& x_16 [[buffer(1)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_10, x_16, &(tint_symbol_7), &(tint_symbol_8));
  main_out const tint_symbol_3 = {.x_GLF_color_1=tint_symbol_8};
  tint_symbol_2 const tint_symbol_4 = {.x_GLF_color_1=tint_symbol_3.x_GLF_color_1};
  return tint_symbol_4;
}

