void set_float3(inout float3 vec, int idx, float val) {
  vec = (idx.xxx == int3(0, 1, 2)) ? val.xxx : vec;
}

cbuffer cbuffer_x_13 : register(b0, space0) {
  uint4 x_13[1];
};
static float4 gl_FragCoord = float4(0.0f, 0.0f, 0.0f, 0.0f);
static float4 x_GLF_color = float4(0.0f, 0.0f, 0.0f, 0.0f);
cbuffer cbuffer_x_20 : register(b1, space0) {
  uint4 x_20[1];
};

float compute_value_f1_f1_(inout float limit, inout float thirty_two) {
  float result = 0.0f;
  int i = 0;
  result = -0.5f;
  i = 1;
  {
    for(; (i < 800); i = (i + 1)) {
      if (((i % 32) == 0)) {
        result = (result + 0.400000006f);
      } else {
        const int x_136 = i;
        const float x_138 = thirty_two;
        if (((float(x_136) - (round(x_138) * floor((float(x_136) / round(x_138))))) <= 0.01f)) {
          result = (result + 100.0f);
        }
      }
      const int x_146 = i;
      const float x_148 = limit;
      if ((float(x_146) >= x_148)) {
        return result;
      }
    }
  }
  return result;
}

void main_1() {
  float3 c = float3(0.0f, 0.0f, 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 = float3(0.0f, 0.0f, 0.0f);
  c = float3(7.0f, 8.0f, 9.0f);
  const float x_60 = asfloat(x_13[0].x);
  thirty_two_1 = round((x_60 / 8.0f));
  const float x_64 = gl_FragCoord.x;
  param = x_64;
  param_1 = thirty_two_1;
  const float x_66 = compute_value_f1_f1_(param, param_1);
  c.x = x_66;
  const float x_69 = gl_FragCoord.y;
  param_2 = x_69;
  param_3 = thirty_two_1;
  const float x_71 = compute_value_f1_f1_(param_2, param_3);
  c.y = x_71;
  const float x_74 = c.x;
  const float x_76 = c.y;
  c.z = (x_74 + x_76);
  i_1 = 0;
  {
    for(; (i_1 < 3); i_1 = (i_1 + 1)) {
      const float x_88 = c[i_1];
      if ((x_88 >= 1.0f)) {
        const int x_92 = i_1;
        const float x_95 = c[i_1];
        const float x_98 = c[i_1];
        set_float3(c, x_92, (x_95 * x_98));
      }
    }
  }
  const float x_104 = asfloat(x_20[0].x);
  const float x_106 = asfloat(x_20[0].y);
  if ((x_104 < x_106)) {
    x_58 = abs(c);
  } else {
    x_58 = c;
  }
  const float3 x_115 = normalize(x_58);
  x_GLF_color = float4(x_115.x, x_115.y, x_115.z, 1.0f);
  return;
}

struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  float4 gl_FragCoord_param : SV_Position;
};
struct tint_symbol_2 {
  float4 x_GLF_color_1 : SV_Target0;
};

tint_symbol_2 main(tint_symbol_1 tint_symbol) {
  const float4 gl_FragCoord_param = tint_symbol.gl_FragCoord_param;
  gl_FragCoord = gl_FragCoord_param;
  main_1();
  const main_out tint_symbol_3 = {x_GLF_color};
  const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.x_GLF_color_1};
  return tint_symbol_6;
}
