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

var<private> gl_FragCoord : vec4<f32>;

@group(0) @binding(0) var<uniform> x_17 : buf0;

var<private> x_GLF_color : vec4<f32>;

fn pointInTriangle_vf2_vf2_vf2_vf2_(p : ptr<function, vec2<f32>>, a : ptr<function, vec2<f32>>, b : ptr<function, vec2<f32>>, c : ptr<function, vec2<f32>>) -> i32 {
  var x_66 : f32;
  var x_67 : f32;
  var x_68 : f32;
  var param : vec2<f32>;
  var param_1 : vec2<f32>;
  var param_2 : vec2<f32>;
  var param_3 : vec2<f32>;
  var param_4 : vec2<f32>;
  var param_5 : vec2<f32>;
  var x_135 : bool;
  var x_172 : bool;
  var x_136_phi : bool;
  var x_173_phi : bool;
  let x_70 : f32 = (*(p)).x;
  let x_72 : f32 = (*(a)).x;
  let x_75 : f32 = (*(p)).y;
  let x_77 : f32 = (*(a)).y;
  let x_81 : f32 = (*(b)).x;
  let x_82 : f32 = (*(a)).x;
  let x_85 : f32 = (*(b)).y;
  let x_86 : f32 = (*(a)).y;
  param = vec2<f32>((x_70 - x_72), (x_75 - x_77));
  param_1 = vec2<f32>((x_81 - x_82), (x_85 - x_86));
  let x_90 : f32 = param.x;
  let x_92 : f32 = param_1.y;
  let x_95 : f32 = param_1.x;
  let x_97 : f32 = param.y;
  let x_99 : f32 = ((x_90 * x_92) - (x_95 * x_97));
  x_68 = x_99;
  let x_100 : f32 = (*(p)).x;
  let x_101 : f32 = (*(b)).x;
  let x_103 : f32 = (*(p)).y;
  let x_104 : f32 = (*(b)).y;
  let x_108 : f32 = (*(c)).x;
  let x_109 : f32 = (*(b)).x;
  let x_112 : f32 = (*(c)).y;
  let x_113 : f32 = (*(b)).y;
  param_2 = vec2<f32>((x_100 - x_101), (x_103 - x_104));
  param_3 = vec2<f32>((x_108 - x_109), (x_112 - x_113));
  let x_117 : f32 = param_2.x;
  let x_119 : f32 = param_3.y;
  let x_122 : f32 = param_3.x;
  let x_124 : f32 = param_2.y;
  let x_126 : f32 = ((x_117 * x_119) - (x_122 * x_124));
  x_67 = x_126;
  let x_127 : bool = (x_99 < 0.0);
  let x_129 : bool = (x_127 & (x_126 < 0.0));
  x_136_phi = x_129;
  if (!(x_129)) {
    x_135 = ((x_99 >= 0.0) & (x_126 >= 0.0));
    x_136_phi = x_135;
  }
  let x_136 : bool = x_136_phi;
  if (!(x_136)) {
    return 0;
  }
  let x_140 : f32 = (*(p)).x;
  let x_141 : f32 = (*(c)).x;
  let x_143 : f32 = (*(p)).y;
  let x_144 : f32 = (*(c)).y;
  let x_147 : f32 = (*(a)).x;
  let x_148 : f32 = (*(c)).x;
  let x_150 : f32 = (*(a)).y;
  let x_151 : f32 = (*(c)).y;
  param_4 = vec2<f32>((x_140 - x_141), (x_143 - x_144));
  param_5 = vec2<f32>((x_147 - x_148), (x_150 - x_151));
  let x_155 : f32 = param_4.x;
  let x_157 : f32 = param_5.y;
  let x_160 : f32 = param_5.x;
  let x_162 : f32 = param_4.y;
  let x_164 : f32 = ((x_155 * x_157) - (x_160 * x_162));
  x_66 = x_164;
  let x_166 : bool = (x_127 & (x_164 < 0.0));
  x_173_phi = x_166;
  if (!(x_166)) {
    x_172 = ((x_99 >= 0.0) & (x_164 >= 0.0));
    x_173_phi = x_172;
  }
  let x_173 : bool = x_173_phi;
  if (!(x_173)) {
    return 0;
  }
  return 1;
}

fn main_1() {
  var param_6 : vec2<f32>;
  var param_7 : vec2<f32>;
  var param_8 : vec2<f32>;
  var param_9 : vec2<f32>;
  let x_55 : vec4<f32> = gl_FragCoord;
  let x_58 : vec2<f32> = x_17.resolution;
  param_6 = (vec2<f32>(x_55.x, x_55.y) / x_58);
  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_60 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
  if ((x_60 == 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);
}
