#include <metal_stdlib>

using namespace metal;
struct buf0 {
  /* 0x0000 */ packed_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;
}

