#include <metal_stdlib>

using namespace metal;
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)]];
};

float cross2d_vf2_vf2_(thread float2* const a, thread float2* const b) {
  float const x_79 = (*(a)).x;
  float const x_81 = (*(b)).y;
  float const x_84 = (*(b)).x;
  float const x_86 = (*(a)).y;
  return ((x_79 * x_81) - (x_84 * x_86));
}

int pointInTriangle_vf2_vf2_vf2_vf2_(thread float2* const p, thread float2* const a_1, thread float2* const b_1, thread float2* const c) {
  bool x_90 = false;
  int x_91 = 0;
  float pab = 0.0f;
  float2 param = 0.0f;
  float2 param_1 = 0.0f;
  float pbc = 0.0f;
  float2 param_2 = 0.0f;
  float2 param_3 = 0.0f;
  float pca = 0.0f;
  float2 param_4 = 0.0f;
  float2 param_5 = 0.0f;
  bool x_140 = false;
  bool x_168 = false;
  bool x_141_phi = false;
  bool x_169_phi = false;
  int x_173_phi = 0;
  switch(0u) {
    default: {
      float const x_95 = (*(p)).x;
      float const x_97 = (*(a_1)).x;
      float const x_100 = (*(p)).y;
      float const x_102 = (*(a_1)).y;
      float const x_106 = (*(b_1)).x;
      float const x_107 = (*(a_1)).x;
      float const x_110 = (*(b_1)).y;
      float const x_111 = (*(a_1)).y;
      param = float2((x_95 - x_97), (x_100 - x_102));
      param_1 = float2((x_106 - x_107), (x_110 - x_111));
      float const x_114 = cross2d_vf2_vf2_(&(param), &(param_1));
      pab = x_114;
      float const x_115 = (*(p)).x;
      float const x_116 = (*(b_1)).x;
      float const x_118 = (*(p)).y;
      float const x_119 = (*(b_1)).y;
      float const x_123 = (*(c)).x;
      float const x_124 = (*(b_1)).x;
      float const x_127 = (*(c)).y;
      float const x_128 = (*(b_1)).y;
      param_2 = float2((x_115 - x_116), (x_118 - x_119));
      param_3 = float2((x_123 - x_124), (x_127 - x_128));
      float const x_131 = cross2d_vf2_vf2_(&(param_2), &(param_3));
      pbc = x_131;
      bool const x_134 = ((x_114 < 0.0f) & (x_131 < 0.0f));
      x_141_phi = x_134;
      if (!(x_134)) {
        x_140 = ((x_114 >= 0.0f) & (x_131 >= 0.0f));
        x_141_phi = x_140;
      }
      bool const x_141 = x_141_phi;
      if (!(x_141)) {
        x_90 = true;
        x_91 = 0;
        x_173_phi = 0;
        break;
      }
      float const x_145 = (*(p)).x;
      float const x_146 = (*(c)).x;
      float const x_148 = (*(p)).y;
      float const x_149 = (*(c)).y;
      float const x_152 = (*(a_1)).x;
      float const x_153 = (*(c)).x;
      float const x_155 = (*(a_1)).y;
      float const x_156 = (*(c)).y;
      param_4 = float2((x_145 - x_146), (x_148 - x_149));
      param_5 = float2((x_152 - x_153), (x_155 - x_156));
      float const x_159 = cross2d_vf2_vf2_(&(param_4), &(param_5));
      pca = x_159;
      bool const x_162 = ((x_114 < 0.0f) & (x_159 < 0.0f));
      x_169_phi = x_162;
      if (!(x_162)) {
        x_168 = ((x_114 >= 0.0f) & (x_159 >= 0.0f));
        x_169_phi = x_168;
      }
      bool const x_169 = x_169_phi;
      if (!(x_169)) {
        x_90 = true;
        x_91 = 0;
        x_173_phi = 0;
        break;
      }
      x_90 = true;
      x_91 = 1;
      x_173_phi = 1;
      break;
    }
  }
  int const x_173 = x_173_phi;
  return x_173;
}

void main_1(constant buf0& x_24, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  float2 pos = 0.0f;
  float2 param_6 = 0.0f;
  float2 param_7 = 0.0f;
  float2 param_8 = 0.0f;
  float2 param_9 = 0.0f;
  float4 const x_67 = *(tint_symbol_5);
  float2 const x_70 = x_24.resolution;
  float2 const x_71 = (float2(x_67.x, x_67.y) / x_70);
  pos = x_71;
  param_6 = x_71;
  param_7 = float2(0.699999988f, 0.300000012f);
  param_8 = float2(0.5f, 0.899999976f);
  param_9 = float2(0.100000001f, 0.400000006f);
  int const x_72 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
  if ((x_72 == 1)) {
    *(tint_symbol_6) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_6) = float4(0.0f, 0.0f, 0.0f, 1.0f);
  }
  return;
}

fragment tint_symbol_2 tint_symbol(float4 gl_FragCoord_param [[position]], constant buf0& x_24 [[buffer(0)]]) {
  thread float4 tint_symbol_7 = 0.0f;
  thread float4 tint_symbol_8 = 0.0f;
  tint_symbol_7 = gl_FragCoord_param;
  main_1(x_24, &(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;
}

