struct buf1 {
  injectionSwitch : vec2<f32>;
};

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

@group(0) @binding(1) var<uniform> x_11 : buf1;

var<private> x_GLF_color : vec4<f32>;

var<private> gl_FragCoord : vec4<f32>;

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

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_78 : f32;
  var x_79 : f32;
  var x_80 : 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_147 : bool;
  var x_203 : bool;
  var x_148_phi : bool;
  var x_204_phi : bool;
  let x_82 : f32 = (*(p)).x;
  let x_84 : f32 = (*(a)).x;
  let x_87 : f32 = (*(p)).y;
  let x_89 : f32 = (*(a)).y;
  let x_93 : f32 = (*(b)).x;
  let x_94 : f32 = (*(a)).x;
  let x_97 : f32 = (*(b)).y;
  let x_98 : f32 = (*(a)).y;
  param = vec2<f32>((x_82 - x_84), (x_87 - x_89));
  param_1 = vec2<f32>((x_93 - x_94), (x_97 - x_98));
  let x_102 : f32 = param.x;
  let x_104 : f32 = param_1.y;
  let x_107 : f32 = param_1.x;
  let x_109 : f32 = param.y;
  let x_111 : f32 = ((x_102 * x_104) - (x_107 * x_109));
  x_80 = x_111;
  let x_112 : f32 = (*(p)).x;
  let x_113 : f32 = (*(b)).x;
  let x_115 : f32 = (*(p)).y;
  let x_116 : f32 = (*(b)).y;
  let x_120 : f32 = (*(c)).x;
  let x_121 : f32 = (*(b)).x;
  let x_124 : f32 = (*(c)).y;
  let x_125 : f32 = (*(b)).y;
  param_2 = vec2<f32>((x_112 - x_113), (x_115 - x_116));
  param_3 = vec2<f32>((x_120 - x_121), (x_124 - x_125));
  let x_129 : f32 = param_2.x;
  let x_131 : f32 = param_3.y;
  let x_134 : f32 = param_3.x;
  let x_136 : f32 = param_2.y;
  let x_138 : f32 = ((x_129 * x_131) - (x_134 * x_136));
  x_79 = x_138;
  let x_139 : bool = (x_111 < 0.0);
  let x_141 : bool = (x_139 & (x_138 < 0.0));
  x_148_phi = x_141;
  if (!(x_141)) {
    x_147 = ((x_111 >= 0.0) & (x_138 >= 0.0));
    x_148_phi = x_147;
  }
  var x_153_phi : i32;
  let x_148 : bool = x_148_phi;
  if (!(x_148)) {
    x_153_phi = 0;
    loop {
      var x_154 : i32;
      var x_164_phi : i32;
      let x_153 : i32 = x_153_phi;
      let x_159 : f32 = x_11.injectionSwitch.y;
      let x_160 : i32 = i32(x_159);
      if ((x_153 < x_160)) {
      } else {
        break;
      }
      x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);
      x_164_phi = 0;
      loop {
        var x_165 : i32;
        let x_164 : i32 = x_164_phi;
        if ((x_164 < x_160)) {
        } else {
          break;
        }
        x_GLF_color = vec4<f32>(1.0, 1.0, 1.0, 1.0);

        continuing {
          x_165 = (x_164 + 1);
          x_164_phi = x_165;
        }
      }

      continuing {
        x_154 = (x_153 + 1);
        x_153_phi = x_154;
      }
    }
    return 0;
  }
  let x_171 : f32 = (*(p)).x;
  let x_172 : f32 = (*(c)).x;
  let x_174 : f32 = (*(p)).y;
  let x_175 : f32 = (*(c)).y;
  let x_178 : f32 = (*(a)).x;
  let x_179 : f32 = (*(c)).x;
  let x_181 : f32 = (*(a)).y;
  let x_182 : f32 = (*(c)).y;
  param_4 = vec2<f32>((x_171 - x_172), (x_174 - x_175));
  param_5 = vec2<f32>((x_178 - x_179), (x_181 - x_182));
  let x_186 : f32 = param_4.x;
  let x_188 : f32 = param_5.y;
  let x_191 : f32 = param_5.x;
  let x_193 : f32 = param_4.y;
  let x_195 : f32 = ((x_186 * x_188) - (x_191 * x_193));
  x_78 = x_195;
  let x_197 : bool = (x_139 & (x_195 < 0.0));
  x_204_phi = x_197;
  if (!(x_197)) {
    x_203 = ((x_111 >= 0.0) & (x_195 >= 0.0));
    x_204_phi = x_203;
  }
  let x_204 : bool = x_204_phi;
  if (!(x_204)) {
    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_60 : vec4<f32> = gl_FragCoord;
  let x_63 : vec2<f32> = x_19.resolution;
  param_6 = (vec2<f32>(x_60.x, x_60.y) / x_63);
  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_65 : i32 = pointInTriangle_vf2_vf2_vf2_vf2_(&(param_6), &(param_7), &(param_8), &(param_9));
  if ((x_65 == 1)) {
    let x_71 : f32 = x_11.injectionSwitch.y;
    let x_73 : f32 = x_11.injectionSwitch.x;
    if ((x_71 >= x_73)) {
      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);
}
