#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 = (x_164 + 1);
          x_164_phi = x_165;
        }
      }
      {
        x_154 = (x_153 + 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;
}

