#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ float2 resolution;
};
struct main_out {
  float4 x_GLF_color_1;
};
struct tint_symbol_1 {
  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_3, thread float4* const tint_symbol_4) {
  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_3);
  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_4) = float4(1.0f, 0.0f, 0.0f, 1.0f);
  } else {
    *(tint_symbol_4) = float4(0.0f, 0.0f, 0.0f, 1.0f);
  }
  return;
}

main_out tint_symbol_inner(constant buf0& x_24, float4 gl_FragCoord_param, thread float4* const tint_symbol_5, thread float4* const tint_symbol_6) {
  *(tint_symbol_5) = gl_FragCoord_param;
  main_1(x_24, tint_symbol_5, tint_symbol_6);
  main_out const tint_symbol_2 = {.x_GLF_color_1=*(tint_symbol_6)};
  return tint_symbol_2;
}

fragment tint_symbol_1 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;
  main_out const inner_result = tint_symbol_inner(x_24, gl_FragCoord_param, &(tint_symbol_7), &(tint_symbol_8));
  tint_symbol_1 wrapper_result = {};
  wrapper_result.x_GLF_color_1 = inner_result.x_GLF_color_1;
  return wrapper_result;
}

