#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_76 = (*(a)).x;
  float const x_78 = (*(b)).y;
  float const x_81 = (*(b)).x;
  float const x_83 = (*(a)).y;
  return ((x_76 * x_78) - (x_81 * x_83));
}

int pointInTriangle_vf2_vf2_vf2_vf2_(thread float2* const p, thread float2* const a_1, thread float2* const b_1, thread float2* const c) {
  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_137 = false;
  bool x_169 = false;
  bool x_138_phi = false;
  bool x_170_phi = false;
  float const x_88 = (*(p)).x;
  float const x_90 = (*(a_1)).x;
  float const x_93 = (*(p)).y;
  float const x_95 = (*(a_1)).y;
  float const x_99 = (*(b_1)).x;
  float const x_100 = (*(a_1)).x;
  float const x_103 = (*(b_1)).y;
  float const x_104 = (*(a_1)).y;
  param = float2((x_88 - x_90), (x_93 - x_95));
  param_1 = float2((x_99 - x_100), (x_103 - x_104));
  float const x_107 = cross2d_vf2_vf2_(&(param), &(param_1));
  pab = x_107;
  float const x_108 = (*(p)).x;
  float const x_109 = (*(b_1)).x;
  float const x_111 = (*(p)).y;
  float const x_112 = (*(b_1)).y;
  float const x_116 = (*(c)).x;
  float const x_117 = (*(b_1)).x;
  float const x_120 = (*(c)).y;
  float const x_121 = (*(b_1)).y;
  param_2 = float2((x_108 - x_109), (x_111 - x_112));
  param_3 = float2((x_116 - x_117), (x_120 - x_121));
  float const x_124 = cross2d_vf2_vf2_(&(param_2), &(param_3));
  pbc = x_124;
  float const x_125 = pab;
  float const x_127 = pbc;
  bool const x_129 = ((x_125 < 0.0f) && (x_127 < 0.0f));
  x_138_phi = x_129;
  if (!(x_129)) {
    float const x_133 = pab;
    float const x_135 = pbc;
    x_137 = ((x_133 >= 0.0f) && (x_135 >= 0.0f));
    x_138_phi = x_137;
  }
  bool const x_138 = x_138_phi;
  if (!(x_138)) {
    return 0;
  }
  float const x_142 = (*(p)).x;
  float const x_143 = (*(c)).x;
  float const x_145 = (*(p)).y;
  float const x_146 = (*(c)).y;
  float const x_149 = (*(a_1)).x;
  float const x_150 = (*(c)).x;
  float const x_152 = (*(a_1)).y;
  float const x_153 = (*(c)).y;
  param_4 = float2((x_142 - x_143), (x_145 - x_146));
  param_5 = float2((x_149 - x_150), (x_152 - x_153));
  float const x_156 = cross2d_vf2_vf2_(&(param_4), &(param_5));
  pca = x_156;
  float const x_157 = pab;
  float const x_159 = pca;
  bool const x_161 = ((x_157 < 0.0f) && (x_159 < 0.0f));
  x_170_phi = x_161;
  if (!(x_161)) {
    float const x_165 = pab;
    float const x_167 = pca;
    x_169 = ((x_165 >= 0.0f) && (x_167 >= 0.0f));
    x_170_phi = x_169;
  }
  bool const x_170 = x_170_phi;
  if (!(x_170)) {
    return 0;
  }
  return 1;
}

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_63 = *(tint_symbol_3);
  float2 const x_66 = x_24.resolution;
  pos = (float2(x_63.x, x_63.y) / x_66);
  float2 const x_68 = pos;
  param_6 = x_68;
  param_7 = float2(0.699999988f, 0.300000012f);
  param_8 = float2(0.5f, 0.899999976f);
  param_9 = float2(0.100000001f, 0.400000006f);
  int const x_69 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
  if ((x_69 == 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;
}

