#include <metal_stdlib>

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

void main_1(constant buf0& x_9, constant buf1& x_6, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float3 c = 0.0f;
  float x_54 = 0.0f;
  float x_58 = 0.0f;
  float x_59 = 0.0f;
  float x_91 = 0.0f;
  float x_92 = 0.0f;
  float x_135 = 0.0f;
  float x_136 = 0.0f;
  float x_58_phi = 0.0f;
  int x_61_phi = 0;
  float x_91_phi = 0.0f;
  float x_92_phi = 0.0f;
  bool x_93_phi = false;
  float x_95_phi = 0.0f;
  float x_139_phi = 0.0f;
  int x_146_phi = 0;
  c = float3(7.0f, 8.0f, 9.0f);
  float const x_50 = x_9.resolution.x;
  float const x_52 = rint((x_50 * 0.125f));
  x_54 = (*(tint_symbol_5)).x;
  switch(0u) {
    default: {
      x_58_phi = -0.5f;
      x_61_phi = 1;
      while (true) {
        float x_71 = 0.0f;
        float x_79 = 0.0f;
        int x_62 = 0;
        float x_59_phi = 0.0f;
        x_58 = x_58_phi;
        int const x_61 = x_61_phi;
        x_91_phi = 0.0f;
        x_92_phi = x_58;
        x_93_phi = false;
        if ((x_61 < 800)) {
        } else {
          break;
        }
        float x_78 = 0.0f;
        float x_79_phi = 0.0f;
        if (((x_61 % 32) == 0)) {
          x_71 = (x_58 + 0.400000006f);
          x_59_phi = x_71;
        } else {
          x_79_phi = x_58;
          if ((fmod(float(x_61), rint(x_52)) <= 0.01f)) {
            x_78 = (x_58 + 100.0f);
            x_79_phi = x_78;
          }
          x_79 = x_79_phi;
          float const x_81 = x_6.injectionSwitch.x;
          float const x_83 = x_6.injectionSwitch.y;
          if ((x_81 > x_83)) {
            discard_fragment();
          }
          x_59_phi = x_79;
        }
        x_59 = x_59_phi;
        if ((float(x_61) >= x_54)) {
          x_91_phi = x_59;
          x_92_phi = x_59;
          x_93_phi = true;
          break;
        }
        {
          x_62 = (x_61 + 1);
          x_58_phi = x_59;
          x_61_phi = x_62;
        }
      }
      x_91 = x_91_phi;
      x_92 = x_92_phi;
      bool const x_93 = x_93_phi;
      x_95_phi = x_91;
      if (x_93) {
        break;
      }
      x_95_phi = x_92;
      break;
    }
  }
  float x_98 = 0.0f;
  float x_102 = 0.0f;
  float x_103 = 0.0f;
  float x_102_phi = 0.0f;
  int x_105_phi = 0;
  float x_135_phi = 0.0f;
  float x_136_phi = 0.0f;
  bool x_137_phi = false;
  float const x_95 = x_95_phi;
  c.x = x_95;
  x_98 = (*(tint_symbol_5)).y;
  switch(0u) {
    default: {
      x_102_phi = -0.5f;
      x_105_phi = 1;
      while (true) {
        float x_115 = 0.0f;
        float x_123 = 0.0f;
        int x_106 = 0;
        float x_103_phi = 0.0f;
        x_102 = x_102_phi;
        int const x_105 = x_105_phi;
        x_135_phi = 0.0f;
        x_136_phi = x_102;
        x_137_phi = false;
        if ((x_105 < 800)) {
        } else {
          break;
        }
        float x_122 = 0.0f;
        float x_123_phi = 0.0f;
        if (((x_105 % 32) == 0)) {
          x_115 = (x_102 + 0.400000006f);
          x_103_phi = x_115;
        } else {
          x_123_phi = x_102;
          if ((fmod(float(x_105), rint(x_52)) <= 0.01f)) {
            x_122 = (x_102 + 100.0f);
            x_123_phi = x_122;
          }
          x_123 = x_123_phi;
          float const x_125 = x_6.injectionSwitch.x;
          float const x_127 = x_6.injectionSwitch.y;
          if ((x_125 > x_127)) {
            discard_fragment();
          }
          x_103_phi = x_123;
        }
        x_103 = x_103_phi;
        if ((float(x_105) >= x_98)) {
          x_135_phi = x_103;
          x_136_phi = x_103;
          x_137_phi = true;
          break;
        }
        {
          x_106 = (x_105 + 1);
          x_102_phi = x_103;
          x_105_phi = x_106;
        }
      }
      x_135 = x_135_phi;
      x_136 = x_136_phi;
      bool const x_137 = x_137_phi;
      x_139_phi = x_135;
      if (x_137) {
        break;
      }
      x_139_phi = x_136;
      break;
    }
  }
  float const x_139 = x_139_phi;
  c.y = x_139;
  float const x_141 = c.x;
  float const x_142 = c.y;
  c.z = (x_141 + x_142);
  x_146_phi = 0;
  while (true) {
    int x_147 = 0;
    int const x_146 = x_146_phi;
    if ((x_146 < 3)) {
    } else {
      break;
    }
    int const x_152_save = x_146;
    float const x_153 = c[x_152_save];
    if ((x_153 >= 1.0f)) {
      float const x_157 = c[x_152_save];
      float const x_158 = c[x_152_save];
      c[x_152_save] = (x_157 * x_158);
      float const x_161 = x_6.injectionSwitch.x;
      float const x_163 = x_6.injectionSwitch.y;
      if ((x_161 > x_163)) {
        discard_fragment();
      }
    }
    {
      x_147 = (x_146 + 1);
      x_146_phi = x_147;
    }
  }
  float3 const x_167 = c;
  float3 const x_169 = normalize(fabs(x_167));
  *(tint_symbol_6) = float4(x_169.x, x_169.y, x_169.z, 1.0f);
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_9 [[buffer(0)]], constant buf1& x_6 [[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_9, x_6, &(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;
}

