#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)]];
};

int pointInTriangle_vf2_vf2_vf2_vf2_(constant buf1& x_11, thread float2* const p, thread float2* const a, thread float2* const b, thread float2* const c, thread float4* const tint_symbol_5) {
  float x_78 = 0.0f;
  float x_79 = 0.0f;
  float x_80 = 0.0f;
  float2 param = 0.0f;
  float2 param_1 = 0.0f;
  float2 param_2 = 0.0f;
  float2 param_3 = 0.0f;
  float2 param_4 = 0.0f;
  float2 param_5 = 0.0f;
  bool x_147 = false;
  bool x_203 = false;
  bool x_148_phi = false;
  bool x_204_phi = false;
  float const x_82 = (*(p)).x;
  float const x_84 = (*(a)).x;
  float const x_87 = (*(p)).y;
  float const x_89 = (*(a)).y;
  float const x_93 = (*(b)).x;
  float const x_94 = (*(a)).x;
  float const x_97 = (*(b)).y;
  float const x_98 = (*(a)).y;
  param = float2((x_82 - x_84), (x_87 - x_89));
  param_1 = float2((x_93 - x_94), (x_97 - x_98));
  float const x_102 = param.x;
  float const x_104 = param_1.y;
  float const x_107 = param_1.x;
  float const x_109 = param.y;
  float const x_111 = ((x_102 * x_104) - (x_107 * x_109));
  x_80 = x_111;
  float const x_112 = (*(p)).x;
  float const x_113 = (*(b)).x;
  float const x_115 = (*(p)).y;
  float const x_116 = (*(b)).y;
  float const x_120 = (*(c)).x;
  float const x_121 = (*(b)).x;
  float const x_124 = (*(c)).y;
  float const x_125 = (*(b)).y;
  param_2 = float2((x_112 - x_113), (x_115 - x_116));
  param_3 = float2((x_120 - x_121), (x_124 - x_125));
  float const x_129 = param_2.x;
  float const x_131 = param_3.y;
  float const x_134 = param_3.x;
  float const x_136 = param_2.y;
  float const x_138 = ((x_129 * x_131) - (x_134 * x_136));
  x_79 = x_138;
  bool const x_139 = (x_111 < 0.0f);
  bool const x_141 = (x_139 && (x_138 < 0.0f));
  x_148_phi = x_141;
  if (!(x_141)) {
    x_147 = ((x_111 >= 0.0f) && (x_138 >= 0.0f));
    x_148_phi = x_147;
  }
  int x_153_phi = 0;
  bool const x_148 = x_148_phi;
  if (!(x_148)) {
    x_153_phi = 0;
    while (true) {
      int x_154 = 0;
      int x_164_phi = 0;
      int const x_153 = x_153_phi;
      float const x_159 = x_11.injectionSwitch.y;
      int const x_160 = int(x_159);
      if ((x_153 < x_160)) {
      } else {
        break;
      }
      *(tint_symbol_5) = float4(1.0f, 1.0f, 1.0f, 1.0f);
      x_164_phi = 0;
      while (true) {
        int x_165 = 0;
        int const x_164 = x_164_phi;
        if ((x_164 < x_160)) {
        } else {
          break;
        }
        *(tint_symbol_5) = float4(1.0f, 1.0f, 1.0f, 1.0f);
        {
          x_165 = as_type<int>((as_type<uint>(x_164) + as_type<uint>(1)));
          x_164_phi = x_165;
        }
      }
      {
        x_154 = as_type<int>((as_type<uint>(x_153) + as_type<uint>(1)));
        x_153_phi = x_154;
      }
    }
    return 0;
  }
  float const x_171 = (*(p)).x;
  float const x_172 = (*(c)).x;
  float const x_174 = (*(p)).y;
  float const x_175 = (*(c)).y;
  float const x_178 = (*(a)).x;
  float const x_179 = (*(c)).x;
  float const x_181 = (*(a)).y;
  float const x_182 = (*(c)).y;
  param_4 = float2((x_171 - x_172), (x_174 - x_175));
  param_5 = float2((x_178 - x_179), (x_181 - x_182));
  float const x_186 = param_4.x;
  float const x_188 = param_5.y;
  float const x_191 = param_5.x;
  float const x_193 = param_4.y;
  float const x_195 = ((x_186 * x_188) - (x_191 * x_193));
  x_78 = x_195;
  bool const x_197 = (x_139 && (x_195 < 0.0f));
  x_204_phi = x_197;
  if (!(x_197)) {
    x_203 = ((x_111 >= 0.0f) && (x_195 >= 0.0f));
    x_204_phi = x_203;
  }
  bool const x_204 = x_204_phi;
  if (!(x_204)) {
    return 0;
  }
  return 1;
}

void main_1(constant buf0& x_19, constant buf1& x_11, thread float4* const tint_symbol_6, thread float4* const tint_symbol_7) {
  float2 param_6 = 0.0f;
  float2 param_7 = 0.0f;
  float2 param_8 = 0.0f;
  float2 param_9 = 0.0f;
  float4 const x_60 = *(tint_symbol_6);
  float2 const x_63 = x_19.resolution;
  param_6 = (float2(x_60.x, x_60.y) / x_63);
  param_7 = float2(0.699999988f, 0.300000012f);
  param_8 = float2(0.5f, 0.899999976f);
  param_9 = float2(0.100000001f, 0.400000006f);
  int const x_65 = pointInTriangle_vf2_vf2_vf2_vf2_(x_11, &(param_6), &(param_7), &(param_8), &(param_9), tint_symbol_7);
  if ((x_65 == 1)) {
    float const x_71 = x_11.injectionSwitch.y;
    float const x_73 = x_11.injectionSwitch.x;
    if ((x_71 >= x_73)) {
      *(tint_symbol_7) = float4(1.0f, 0.0f, 0.0f, 1.0f);
    }
  } else {
    *(tint_symbol_7) = float4(0.0f, 0.0f, 0.0f, 1.0f);
  }
  return;
}

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

