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