#include <metal_stdlib>

using namespace metal;

template<typename T, int N, int M>
inline vec<T, M> operator*(matrix<T, N, M> lhs, packed_vec<T, N> rhs) {
  return lhs * vec<T, N>(rhs);
}

template<typename T, int N, int M>
inline vec<T, N> operator*(packed_vec<T, M> lhs, matrix<T, N, M> rhs) {
  return vec<T, M>(lhs) * rhs;
}

struct LeftOver {
  /* 0x0000 */ float time;
  /* 0x0004 */ uint padding;
  /* 0x0008 */ int8_t tint_pad[8];
  /* 0x0010 */ float4x4 worldViewProjection;
  /* 0x0050 */ float2 outputSize;
  /* 0x0058 */ float2 stageSize;
  /* 0x0060 */ float2 spriteMapSize;
  /* 0x0068 */ float stageScale;
  /* 0x006c */ float spriteCount;
  /* 0x0070 */ packed_float3 colorMul;
  /* 0x007c */ int8_t tint_pad_1[4];
};

float4x4 getFrameData_f1_(thread float* const frameID, const constant LeftOver* const tint_symbol_5, texture2d<float, access::sample> tint_symbol_6, sampler tint_symbol_7) {
  float fX = 0.0f;
  float const x_15 = *(frameID);
  float const x_25 = (*(tint_symbol_5)).spriteCount;
  fX = (x_15 / x_25);
  float const x_37 = fX;
  float4 const x_40 = tint_symbol_6.sample(tint_symbol_7, float2(x_37, 0.0f), bias(0.0f));
  float const x_44 = fX;
  float4 const x_47 = tint_symbol_6.sample(tint_symbol_7, float2(x_44, 0.25f), bias(0.0f));
  float const x_51 = fX;
  float4 const x_54 = tint_symbol_6.sample(tint_symbol_7, float2(x_51, 0.5f), bias(0.0f));
  return float4x4(float4(x_40[0], x_40[1], x_40[2], x_40[3]), float4(x_47[0], x_47[1], x_47[2], x_47[3]), float4(x_54[0], x_54[1], x_54[2], x_54[3]), float4(float4(0.0f, 0.0f, 0.0f, 0.0f)[0], float4(0.0f, 0.0f, 0.0f, 0.0f)[1], float4(0.0f, 0.0f, 0.0f, 0.0f)[2], float4(0.0f, 0.0f, 0.0f, 0.0f)[3]));
}

void main_1(thread float2* const tint_symbol_8, const constant LeftOver* const tint_symbol_9, texture2d<float, access::sample> tint_symbol_10, sampler tint_symbol_11, texture2d<float, access::sample> tint_symbol_12, texture2d<float, access::sample> tint_symbol_13, sampler tint_symbol_14, thread float* const tint_symbol_15, texture2d<float, access::sample> tint_symbol_16, sampler tint_symbol_17, texture2d<float, access::sample> tint_symbol_18, sampler tint_symbol_19, thread float4* const tint_symbol_20) {
  float4 color = 0.0f;
  float2 tileUV = 0.0f;
  float2 tileID = 0.0f;
  float2 sheetUnits = 0.0f;
  float spriteUnits = 0.0f;
  float2 stageUnits = 0.0f;
  int i = 0;
  float frameID_1 = 0.0f;
  float4 animationData = 0.0f;
  float f = 0.0f;
  float4x4 frameData = float4x4(0.0f);
  float param = 0.0f;
  float2 frameSize = 0.0f;
  float2 offset_1 = 0.0f;
  float2 ratio = 0.0f;
  float4 nc = 0.0f;
  float alpha = 0.0f;
  float3 mixed = 0.0f;
  color = float4(0.0f, 0.0f, 0.0f, 0.0f);
  float2 const x_86 = *(tint_symbol_8);
  tileUV = fract(x_86);
  float const x_91 = tileUV[1];
  tileUV[1] = (1.0f - x_91);
  float2 const x_95 = *(tint_symbol_8);
  tileID = floor(x_95);
  float2 const x_101 = (*(tint_symbol_9)).spriteMapSize;
  sheetUnits = (float2(1.0f, 1.0f) / x_101);
  float const x_106 = (*(tint_symbol_9)).spriteCount;
  spriteUnits = (1.0f / x_106);
  float2 const x_111 = (*(tint_symbol_9)).stageSize;
  stageUnits = (float2(1.0f, 1.0f) / x_111);
  i = 0;
  while (true) {
    int const x_122 = i;
    if ((x_122 < 2)) {
    } else {
      break;
    }
    int const x_126 = i;
    switch(x_126) {
      case 1: {
        float2 const x_150 = tileID;
        float2 const x_154 = (*(tint_symbol_9)).stageSize;
        float4 const x_156 = tint_symbol_10.sample(tint_symbol_11, ((x_150 + float2(0.5f, 0.5f)) / x_154), bias(0.0f));
        frameID_1 = x_156[0];
        break;
      }
      case 0: {
        float2 const x_136 = tileID;
        float2 const x_140 = (*(tint_symbol_9)).stageSize;
        float4 const x_142 = tint_symbol_12.sample(tint_symbol_11, ((x_136 + float2(0.5f, 0.5f)) / x_140), bias(0.0f));
        frameID_1 = x_142[0];
        break;
      }
      default: {
        break;
      }
    }
    float const x_166 = frameID_1;
    float const x_169 = (*(tint_symbol_9)).spriteCount;
    float4 const x_172 = tint_symbol_13.sample(tint_symbol_14, float2(((x_166 + 0.5f) / x_169), 0.0f), bias(0.0f));
    animationData = x_172;
    float const x_174 = animationData[1];
    if ((x_174 > 0.0f)) {
      float const x_181 = (*(tint_symbol_9)).time;
      float const x_184 = animationData[2];
      *(tint_symbol_15) = fmod((x_181 * x_184), 1.0f);
      f = 0.0f;
      while (true) {
        float const x_193 = f;
        if ((x_193 < 8.0f)) {
        } else {
          break;
        }
        float const x_197 = animationData[1];
        float const x_198 = *(tint_symbol_15);
        if ((x_197 > x_198)) {
          float const x_203 = animationData[0];
          frameID_1 = x_203;
          break;
        }
        float const x_208 = frameID_1;
        float const x_211 = (*(tint_symbol_9)).spriteCount;
        float const x_214 = f;
        float4 const x_217 = tint_symbol_13.sample(tint_symbol_14, float2(((x_208 + 0.5f) / x_211), (0.125f * x_214)), bias(0.0f));
        animationData = x_217;
        {
          float const x_218 = f;
          f = (x_218 + 1.0f);
        }
      }
    }
    float const x_222 = frameID_1;
    param = (x_222 + 0.5f);
    float4x4 const x_225 = getFrameData_f1_(&(param), tint_symbol_9, tint_symbol_16, tint_symbol_17);
    frameData = x_225;
    float4 const x_228 = frameData[0];
    float2 const x_231 = (*(tint_symbol_9)).spriteMapSize;
    frameSize = (float2(x_228[3], x_228[2]) / x_231);
    float4 const x_235 = frameData[0];
    float2 const x_237 = sheetUnits;
    offset_1 = (float2(x_235[0], x_235[1]) * x_237);
    float4 const x_241 = frameData[2];
    float4 const x_244 = frameData[0];
    ratio = (float2(x_241[0], x_241[1]) / float2(x_244[3], x_244[2]));
    float const x_248 = frameData[2][2];
    if ((x_248 == 1.0f)) {
      float2 const x_252 = tileUV;
      tileUV = float2(x_252[1], x_252[0]);
    }
    int const x_254 = i;
    if ((x_254 == 0)) {
      float2 const x_263 = tileUV;
      float2 const x_264 = frameSize;
      float2 const x_266 = offset_1;
      float4 const x_268 = tint_symbol_18.sample(tint_symbol_19, ((x_263 * x_264) + x_266));
      color = x_268;
    } else {
      float2 const x_274 = tileUV;
      float2 const x_275 = frameSize;
      float2 const x_277 = offset_1;
      float4 const x_279 = tint_symbol_18.sample(tint_symbol_19, ((x_274 * x_275) + x_277));
      nc = x_279;
      float const x_283 = color[3];
      float const x_285 = nc[3];
      alpha = fmin((x_283 + x_285), 1.0f);
      float4 const x_290 = color;
      float4 const x_292 = nc;
      float const x_295 = nc[3];
      mixed = mix(float3(x_290[0], x_290[1], x_290[2]), float3(x_292[0], x_292[1], x_292[2]), float3(x_295, x_295, x_295));
      float3 const x_298 = mixed;
      float const x_299 = alpha;
      color = float4(x_298[0], x_298[1], x_298[2], x_299);
    }
    {
      int const x_304 = i;
      i = as_type<int>((as_type<uint>(x_304) + as_type<uint>(1)));
    }
  }
  float3 const x_310 = (*(tint_symbol_9)).colorMul;
  float4 const x_311 = color;
  float3 const x_313 = (float3(x_311[0], x_311[1], x_311[2]) * x_310);
  float4 const x_314 = color;
  color = float4(x_313[0], x_313[1], x_313[2], x_314[3]);
  float4 const x_318 = color;
  *(tint_symbol_20) = x_318;
  return;
}

struct main_out {
  float4 glFragColor_1;
};

struct tint_symbol_2 {
  float3 vPosition_param [[user(locn0)]];
  float2 vUV_param [[user(locn1)]];
  float2 tUV_param [[user(locn2)]];
  float2 stageUnits_1_param [[user(locn3)]];
  float2 levelUnits_param [[user(locn4)]];
  float2 tileID_1_param [[user(locn5)]];
};

struct tint_symbol_3 {
  float4 glFragColor_1 [[color(0)]];
};

main_out tint_symbol_inner(float2 tUV_param, float2 tileID_1_param, float2 levelUnits_param, float2 stageUnits_1_param, float3 vPosition_param, float2 vUV_param, thread float2* const tint_symbol_21, thread float2* const tint_symbol_22, thread float2* const tint_symbol_23, thread float2* const tint_symbol_24, thread float3* const tint_symbol_25, thread float2* const tint_symbol_26, const constant LeftOver* const tint_symbol_27, texture2d<float, access::sample> tint_symbol_28, sampler tint_symbol_29, texture2d<float, access::sample> tint_symbol_30, texture2d<float, access::sample> tint_symbol_31, sampler tint_symbol_32, thread float* const tint_symbol_33, texture2d<float, access::sample> tint_symbol_34, sampler tint_symbol_35, texture2d<float, access::sample> tint_symbol_36, sampler tint_symbol_37, thread float4* const tint_symbol_38) {
  *(tint_symbol_21) = tUV_param;
  *(tint_symbol_22) = tileID_1_param;
  *(tint_symbol_23) = levelUnits_param;
  *(tint_symbol_24) = stageUnits_1_param;
  *(tint_symbol_25) = vPosition_param;
  *(tint_symbol_26) = vUV_param;
  main_1(tint_symbol_21, tint_symbol_27, tint_symbol_28, tint_symbol_29, tint_symbol_30, tint_symbol_31, tint_symbol_32, tint_symbol_33, tint_symbol_34, tint_symbol_35, tint_symbol_36, tint_symbol_37, tint_symbol_38);
  main_out const tint_symbol_4 = {.glFragColor_1=*(tint_symbol_38)};
  return tint_symbol_4;
}

fragment tint_symbol_3 tint_symbol(const constant LeftOver* tint_symbol_45 [[buffer(0)]], texture2d<float, access::sample> tint_symbol_46 [[texture(0)]], sampler tint_symbol_47 [[sampler(0)]], texture2d<float, access::sample> tint_symbol_48 [[texture(1)]], texture2d<float, access::sample> tint_symbol_49 [[texture(2)]], sampler tint_symbol_50 [[sampler(1)]], texture2d<float, access::sample> tint_symbol_52 [[texture(3)]], sampler tint_symbol_53 [[sampler(2)]], texture2d<float, access::sample> tint_symbol_54 [[texture(4)]], sampler tint_symbol_55 [[sampler(3)]], tint_symbol_2 tint_symbol_1 [[stage_in]]) {
  thread float2 tint_symbol_39 = 0.0f;
  thread float2 tint_symbol_40 = 0.0f;
  thread float2 tint_symbol_41 = 0.0f;
  thread float2 tint_symbol_42 = 0.0f;
  thread float3 tint_symbol_43 = 0.0f;
  thread float2 tint_symbol_44 = 0.0f;
  thread float tint_symbol_51 = 0.0f;
  thread float4 tint_symbol_56 = 0.0f;
  main_out const inner_result = tint_symbol_inner(tint_symbol_1.tUV_param, tint_symbol_1.tileID_1_param, tint_symbol_1.levelUnits_param, tint_symbol_1.stageUnits_1_param, tint_symbol_1.vPosition_param, tint_symbol_1.vUV_param, &(tint_symbol_39), &(tint_symbol_40), &(tint_symbol_41), &(tint_symbol_42), &(tint_symbol_43), &(tint_symbol_44), tint_symbol_45, tint_symbol_46, tint_symbol_47, tint_symbol_48, tint_symbol_49, tint_symbol_50, &(tint_symbol_51), tint_symbol_52, tint_symbol_53, tint_symbol_54, tint_symbol_55, &(tint_symbol_56));
  tint_symbol_3 wrapper_result = {};
  wrapper_result.glFragColor_1 = inner_result.glFragColor_1;
  return wrapper_result;
}

