#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)]];
};

int pointInTriangle_vf2_vf2_vf2_vf2_(thread float2* const p, thread float2* const a, thread float2* const b, thread float2* const c) {
  float x_66 = 0.0f;
  float x_67 = 0.0f;
  float x_68 = 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_135 = false;
  bool x_172 = false;
  bool x_136_phi = false;
  bool x_173_phi = false;
  float const x_70 = (*(p)).x;
  float const x_72 = (*(a)).x;
  float const x_75 = (*(p)).y;
  float const x_77 = (*(a)).y;
  float const x_81 = (*(b)).x;
  float const x_82 = (*(a)).x;
  float const x_85 = (*(b)).y;
  float const x_86 = (*(a)).y;
  param = float2((x_70 - x_72), (x_75 - x_77));
  param_1 = float2((x_81 - x_82), (x_85 - x_86));
  float const x_90 = param.x;
  float const x_92 = param_1.y;
  float const x_95 = param_1.x;
  float const x_97 = param.y;
  float const x_99 = ((x_90 * x_92) - (x_95 * x_97));
  x_68 = x_99;
  float const x_100 = (*(p)).x;
  float const x_101 = (*(b)).x;
  float const x_103 = (*(p)).y;
  float const x_104 = (*(b)).y;
  float const x_108 = (*(c)).x;
  float const x_109 = (*(b)).x;
  float const x_112 = (*(c)).y;
  float const x_113 = (*(b)).y;
  param_2 = float2((x_100 - x_101), (x_103 - x_104));
  param_3 = float2((x_108 - x_109), (x_112 - x_113));
  float const x_117 = param_2.x;
  float const x_119 = param_3.y;
  float const x_122 = param_3.x;
  float const x_124 = param_2.y;
  float const x_126 = ((x_117 * x_119) - (x_122 * x_124));
  x_67 = x_126;
  bool const x_127 = (x_99 < 0.0f);
  bool const x_129 = (x_127 & (x_126 < 0.0f));
  x_136_phi = x_129;
  if (!(x_129)) {
    x_135 = ((x_99 >= 0.0f) & (x_126 >= 0.0f));
    x_136_phi = x_135;
  }
  bool const x_136 = x_136_phi;
  if (!(x_136)) {
    return 0;
  }
  float const x_140 = (*(p)).x;
  float const x_141 = (*(c)).x;
  float const x_143 = (*(p)).y;
  float const x_144 = (*(c)).y;
  float const x_147 = (*(a)).x;
  float const x_148 = (*(c)).x;
  float const x_150 = (*(a)).y;
  float const x_151 = (*(c)).y;
  param_4 = float2((x_140 - x_141), (x_143 - x_144));
  param_5 = float2((x_147 - x_148), (x_150 - x_151));
  float const x_155 = param_4.x;
  float const x_157 = param_5.y;
  float const x_160 = param_5.x;
  float const x_162 = param_4.y;
  float const x_164 = ((x_155 * x_157) - (x_160 * x_162));
  x_66 = x_164;
  bool const x_166 = (x_127 & (x_164 < 0.0f));
  x_173_phi = x_166;
  if (!(x_166)) {
    x_172 = ((x_99 >= 0.0f) & (x_164 >= 0.0f));
    x_173_phi = x_172;
  }
  bool const x_173 = x_173_phi;
  if (!(x_173)) {
    return 0;
  }
  return 1;
}

void main_1(constant buf0& x_17, thread float4* const tint_symbol_3, thread float4* const tint_symbol_4) {
  float2 param_6 = 0.0f;
  float2 param_7 = 0.0f;
  float2 param_8 = 0.0f;
  float2 param_9 = 0.0f;
  float4 const x_55 = *(tint_symbol_3);
  float2 const x_58 = x_17.resolution;
  param_6 = (float2(x_55.x, x_55.y) / x_58);
  param_7 = float2(0.699999988f, 0.300000012f);
  param_8 = float2(0.5f, 0.899999976f);
  param_9 = float2(0.100000001f, 0.400000006f);
  int const x_60 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
  if ((x_60 == 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_17, 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_17, 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_17 [[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_17, 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;
}

