struct LeftOver {
  time : f32;
  [[size(12)]]
  padding : u32;
  worldViewProjection : mat4x4<f32>;
  outputSize : vec2<f32>;
  stageSize : vec2<f32>;
  spriteMapSize : vec2<f32>;
  stageScale : f32;
  spriteCount : f32;
  colorMul : vec3<f32>;
};

[[group(2), binding(9)]] var<uniform> x_20 : LeftOver;

[[group(2), binding(3)]] var frameMapTexture : texture_2d<f32>;

[[group(2), binding(2)]] var frameMapSampler : sampler;

var<private> tUV : vec2<f32>;

[[group(2), binding(5)]] var tileMapsTexture0 : texture_2d<f32>;

[[group(2), binding(4)]] var tileMapsSampler : sampler;

[[group(2), binding(6)]] var tileMapsTexture1 : texture_2d<f32>;

[[group(2), binding(8)]] var animationMapTexture : texture_2d<f32>;

[[group(2), binding(7)]] var animationMapSampler : sampler;

var<private> mt : f32;

[[group(2), binding(1)]] var spriteSheetTexture : texture_2d<f32>;

[[group(2), binding(0)]] var spriteSheetSampler : sampler;

var<private> glFragColor : vec4<f32>;

var<private> tileID_1 : vec2<f32>;

var<private> levelUnits : vec2<f32>;

var<private> stageUnits_1 : vec2<f32>;

var<private> vPosition : vec3<f32>;

var<private> vUV : vec2<f32>;

fn getFrameData_f1_(frameID : ptr<function, f32>) -> mat4x4<f32> {
  var fX : f32;
  let x_15 : f32 = *(frameID);
  let x_25 : f32 = x_20.spriteCount;
  fX = (x_15 / x_25);
  let x_37 : f32 = fX;
  let x_40 : vec4<f32> = textureSampleBias(frameMapTexture, frameMapSampler, vec2<f32>(x_37, 0.0), 0.0);
  let x_44 : f32 = fX;
  let x_47 : vec4<f32> = textureSampleBias(frameMapTexture, frameMapSampler, vec2<f32>(x_44, 0.25), 0.0);
  let x_51 : f32 = fX;
  let x_54 : vec4<f32> = textureSampleBias(frameMapTexture, frameMapSampler, vec2<f32>(x_51, 0.5), 0.0);
  return mat4x4<f32>(vec4<f32>(x_40.x, x_40.y, x_40.z, x_40.w), vec4<f32>(x_47.x, x_47.y, x_47.z, x_47.w), vec4<f32>(x_54.x, x_54.y, x_54.z, x_54.w), vec4<f32>(vec4<f32>(0.0, 0.0, 0.0, 0.0).x, vec4<f32>(0.0, 0.0, 0.0, 0.0).y, vec4<f32>(0.0, 0.0, 0.0, 0.0).z, vec4<f32>(0.0, 0.0, 0.0, 0.0).w));
}

fn main_1() {
  var color : vec4<f32>;
  var tileUV : vec2<f32>;
  var tileID : vec2<f32>;
  var sheetUnits : vec2<f32>;
  var spriteUnits : f32;
  var stageUnits : vec2<f32>;
  var i : i32;
  var frameID_1 : f32;
  var animationData : vec4<f32>;
  var f : f32;
  var frameData : mat4x4<f32>;
  var param : f32;
  var frameSize : vec2<f32>;
  var offset_1 : vec2<f32>;
  var ratio : vec2<f32>;
  var nc : vec4<f32>;
  var alpha : f32;
  var mixed : vec3<f32>;
  color = vec4<f32>(0.0, 0.0, 0.0, 0.0);
  let x_86 : vec2<f32> = tUV;
  tileUV = fract(x_86);
  let x_91 : f32 = tileUV.y;
  tileUV.y = (1.0 - x_91);
  let x_95 : vec2<f32> = tUV;
  tileID = floor(x_95);
  let x_101 : vec2<f32> = x_20.spriteMapSize;
  sheetUnits = (vec2<f32>(1.0, 1.0) / x_101);
  let x_106 : f32 = x_20.spriteCount;
  spriteUnits = (1.0 / x_106);
  let x_111 : vec2<f32> = x_20.stageSize;
  stageUnits = (vec2<f32>(1.0, 1.0) / x_111);
  i = 0;
  loop {
    let x_122 : i32 = i;
    if ((x_122 < 2)) {
    } else {
      break;
    }
    let x_126 : i32 = i;
    switch(x_126) {
      case 1: {
        let x_150 : vec2<f32> = tileID;
        let x_154 : vec2<f32> = x_20.stageSize;
        let x_156 : vec4<f32> = textureSampleBias(tileMapsTexture1, tileMapsSampler, ((x_150 + vec2<f32>(0.5, 0.5)) / x_154), 0.0);
        frameID_1 = x_156.x;
      }
      case 0: {
        let x_136 : vec2<f32> = tileID;
        let x_140 : vec2<f32> = x_20.stageSize;
        let x_142 : vec4<f32> = textureSampleBias(tileMapsTexture0, tileMapsSampler, ((x_136 + vec2<f32>(0.5, 0.5)) / x_140), 0.0);
        frameID_1 = x_142.x;
      }
      default: {
      }
    }
    let x_166 : f32 = frameID_1;
    let x_169 : f32 = x_20.spriteCount;
    let x_172 : vec4<f32> = textureSampleBias(animationMapTexture, animationMapSampler, vec2<f32>(((x_166 + 0.5) / x_169), 0.0), 0.0);
    animationData = x_172;
    let x_174 : f32 = animationData.y;
    if ((x_174 > 0.0)) {
      let x_181 : f32 = x_20.time;
      let x_184 : f32 = animationData.z;
      mt = ((x_181 * x_184) % 1.0);
      f = 0.0;
      loop {
        let x_193 : f32 = f;
        if ((x_193 < 8.0)) {
        } else {
          break;
        }
        let x_197 : f32 = animationData.y;
        let x_198 : f32 = mt;
        if ((x_197 > x_198)) {
          let x_203 : f32 = animationData.x;
          frameID_1 = x_203;
          break;
        }
        let x_208 : f32 = frameID_1;
        let x_211 : f32 = x_20.spriteCount;
        let x_214 : f32 = f;
        let x_217 : vec4<f32> = textureSampleBias(animationMapTexture, animationMapSampler, vec2<f32>(((x_208 + 0.5) / x_211), (0.125 * x_214)), 0.0);
        animationData = x_217;

        continuing {
          let x_218 : f32 = f;
          f = (x_218 + 1.0);
        }
      }
    }
    let x_222 : f32 = frameID_1;
    param = (x_222 + 0.5);
    let x_225 : mat4x4<f32> = getFrameData_f1_(&(param));
    frameData = x_225;
    let x_228 : vec4<f32> = frameData[0];
    let x_231 : vec2<f32> = x_20.spriteMapSize;
    frameSize = (vec2<f32>(x_228.w, x_228.z) / x_231);
    let x_235 : vec4<f32> = frameData[0];
    let x_237 : vec2<f32> = sheetUnits;
    offset_1 = (vec2<f32>(x_235.x, x_235.y) * x_237);
    let x_241 : vec4<f32> = frameData[2];
    let x_244 : vec4<f32> = frameData[0];
    ratio = (vec2<f32>(x_241.x, x_241.y) / vec2<f32>(x_244.w, x_244.z));
    let x_248 : f32 = frameData[2].z;
    if ((x_248 == 1.0)) {
      let x_252 : vec2<f32> = tileUV;
      tileUV = vec2<f32>(x_252.y, x_252.x);
    }
    let x_254 : i32 = i;
    if ((x_254 == 0)) {
      let x_263 : vec2<f32> = tileUV;
      let x_264 : vec2<f32> = frameSize;
      let x_266 : vec2<f32> = offset_1;
      let x_268 : vec4<f32> = textureSample(spriteSheetTexture, spriteSheetSampler, ((x_263 * x_264) + x_266));
      color = x_268;
    } else {
      let x_274 : vec2<f32> = tileUV;
      let x_275 : vec2<f32> = frameSize;
      let x_277 : vec2<f32> = offset_1;
      let x_279 : vec4<f32> = textureSample(spriteSheetTexture, spriteSheetSampler, ((x_274 * x_275) + x_277));
      nc = x_279;
      let x_283 : f32 = color.w;
      let x_285 : f32 = nc.w;
      alpha = min((x_283 + x_285), 1.0);
      let x_290 : vec4<f32> = color;
      let x_292 : vec4<f32> = nc;
      let x_295 : f32 = nc.w;
      mixed = mix(vec3<f32>(x_290.x, x_290.y, x_290.z), vec3<f32>(x_292.x, x_292.y, x_292.z), vec3<f32>(x_295, x_295, x_295));
      let x_298 : vec3<f32> = mixed;
      let x_299 : f32 = alpha;
      color = vec4<f32>(x_298.x, x_298.y, x_298.z, x_299);
    }

    continuing {
      let x_304 : i32 = i;
      i = (x_304 + 1);
    }
  }
  let x_310 : vec3<f32> = x_20.colorMul;
  let x_311 : vec4<f32> = color;
  let x_313 : vec3<f32> = (vec3<f32>(x_311.x, x_311.y, x_311.z) * x_310);
  let x_314 : vec4<f32> = color;
  color = vec4<f32>(x_313.x, x_313.y, x_313.z, x_314.w);
  let x_318 : vec4<f32> = color;
  glFragColor = x_318;
  return;
}

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

[[stage(fragment)]]
fn main([[location(2)]] tUV_param : vec2<f32>, [[location(5)]] tileID_1_param : vec2<f32>, [[location(4)]] levelUnits_param : vec2<f32>, [[location(3)]] stageUnits_1_param : vec2<f32>, [[location(0)]] vPosition_param : vec3<f32>, [[location(1)]] vUV_param : vec2<f32>) -> main_out {
  tUV = tUV_param;
  tileID_1 = tileID_1_param;
  levelUnits = levelUnits_param;
  stageUnits_1 = stageUnits_1_param;
  vPosition = vPosition_param;
  vUV = vUV_param;
  main_1();
  return main_out(glFragColor);
}
