struct buf0 {
  resolution : vec2<f32>;
};

var<private> gl_FragCoord : vec4<f32>;

[[group(0), binding(0)]] var<uniform> x_24 : buf0;

var<private> x_GLF_color : vec4<f32>;

fn cross2d_vf2_vf2_(a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>) -> f32 {
  let x_76 : f32 = (*(a)).x;
  let x_78 : f32 = (*(b)).y;
  let x_81 : f32 = (*(b)).x;
  let x_83 : f32 = (*(a)).y;
  return ((x_76 * x_78) - (x_81 * x_83));
}

fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a_1 : ptr<function, vec2<f32>>, b_1 : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
  var pab : f32;
  var param : vec2<f32>;
  var param_1 : vec2<f32>;
  var pbc : f32;
  var param_2 : vec2<f32>;
  var param_3 : vec2<f32>;
  var pca : f32;
  var param_4 : vec2<f32>;
  var param_5 : vec2<f32>;
  var x_145 : bool;
  var x_185 : bool;
  var x_146_phi : bool;
  var x_186_phi : bool;
  let x_88 : f32 = (*(p)).x;
  let x_90 : f32 = (*(a_1)).x;
  let x_93 : f32 = (*(p)).y;
  let x_95 : f32 = (*(a_1)).y;
  let x_99 : f32 = (*(b_1)).x;
  let x_101 : f32 = (*(a_1)).x;
  let x_104 : f32 = (*(b_1)).y;
  let x_106 : f32 = (*(a_1)).y;
  param = vec2<f32>((x_88 - x_90), (x_93 - x_95));
  param_1 = vec2<f32>((x_99 - x_101), (x_104 - x_106));
  let x_109 : f32 = cross2d_vf2_vf2_(&(param), &(param_1));
  pab = x_109;
  let x_111 : f32 = (*(p)).x;
  let x_113 : f32 = (*(b_1)).x;
  let x_116 : f32 = (*(p)).y;
  let x_118 : f32 = (*(b_1)).y;
  let x_122 : f32 = (*(c)).x;
  let x_124 : f32 = (*(b_1)).x;
  let x_127 : f32 = (*(c)).y;
  let x_129 : f32 = (*(b_1)).y;
  param_2 = vec2<f32>((x_111 - x_113), (x_116 - x_118));
  param_3 = vec2<f32>((x_122 - x_124), (x_127 - x_129));
  let x_132 : f32 = cross2d_vf2_vf2_(&(param_2), &(param_3));
  pbc = x_132;
  let x_133 : f32 = pab;
  let x_135 : f32 = pbc;
  let x_137 : bool = ((x_133 < 0.0) && (x_135 < 0.0));
  x_146_phi = x_137;
  if (!(x_137)) {
    let x_141 : f32 = pab;
    let x_143 : f32 = pbc;
    x_145 = ((x_141 >= 0.0) && (x_143 >= 0.0));
    x_146_phi = x_145;
  }
  let x_146 : bool = x_146_phi;
  if (!(x_146)) {
    return 0;
  }
  let x_151 : f32 = (*(p)).x;
  let x_153 : f32 = (*(c)).x;
  let x_156 : f32 = (*(p)).y;
  let x_158 : f32 = (*(c)).y;
  let x_162 : f32 = (*(a_1)).x;
  let x_164 : f32 = (*(c)).x;
  let x_167 : f32 = (*(a_1)).y;
  let x_169 : f32 = (*(c)).y;
  param_4 = vec2<f32>((x_151 - x_153), (x_156 - x_158));
  param_5 = vec2<f32>((x_162 - x_164), (x_167 - x_169));
  let x_172 : f32 = cross2d_vf2_vf2_(&(param_4), &(param_5));
  pca = x_172;
  let x_173 : f32 = pab;
  let x_175 : f32 = pca;
  let x_177 : bool = ((x_173 < 0.0) && (x_175 < 0.0));
  x_186_phi = x_177;
  if (!(x_177)) {
    let x_181 : f32 = pab;
    let x_183 : f32 = pca;
    x_185 = ((x_181 >= 0.0) && (x_183 >= 0.0));
    x_186_phi = x_185;
  }
  let x_186 : bool = x_186_phi;
  if (!(x_186)) {
    return 0;
  }
  return 1;
}

fn main_1() {
  var pos : vec2<f32>;
  var param_6 : vec2<f32>;
  var param_7 : vec2<f32>;
  var param_8 : vec2<f32>;
  var param_9 : vec2<f32>;
  let x_63 : vec4<f32> = gl_FragCoord;
  let x_66 : vec2<f32> = x_24.resolution;
  pos = (vec2<f32>(x_63.x, x_63.y) / x_66);
  let x_68 : vec2<f32> = pos;
  param_6 = x_68;
  param_7 = vec2<f32>(0.699999988, 0.300000012);
  param_8 = vec2<f32>(0.5, 0.899999976);
  param_9 = vec2<f32>(0.100000001, 0.400000006);
  let x_69 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
  if ((x_69 == 1)) {
    x_GLF_color = vec4<f32>(1.0, 0.0, 0.0, 1.0);
  } else {
    x_GLF_color = vec4<f32>(0.0, 0.0, 0.0, 1.0);
  }
  return;
}

struct main_out {
  [[location(0)]]
  x_GLF_color_1 : vec4<f32>;
};

[[stage(fragment)]]
fn main([[builtin(position)]] gl_FragCoord_param : vec4<f32>) -> main_out {
  gl_FragCoord = gl_FragCoord_param;
  main_1();
  return main_out(x_GLF_color);
}
