// Dumped generated WGSL
struct lightingInfo {
  diffuse : vec3<f32>;
  specular : vec3<f32>;
};

struct LeftOver {
  u_World : mat4x4<f32>;
  u_ViewProjection : mat4x4<f32>;
  u_bumpStrength : f32;
  [[size(12)]]
  padding : u32;
  u_cameraPosition : vec3<f32>;
  u_parallaxScale : f32;
  textureInfoName : f32;
  [[size(4)]]
  padding_1 : u32;
  tangentSpaceParameter0 : vec2<f32>;
};

struct Light0 {
  vLightData : vec4<f32>;
  vLightDiffuse : vec4<f32>;
  vLightSpecular : vec4<f32>;
  vLightGround : vec3<f32>;
  [[size(4)]]
  padding_2 : u32;
  shadowsInfo : vec4<f32>;
  depthValues : vec2<f32>;
};

var<private> u_Float : f32;

var<private> u_Color : vec3<f32>;

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

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

var<private> vMainuv : vec2<f32>;

[[group(2), binding(6)]] var<uniform> x_269 : LeftOver;

var<private> v_output1 : vec4<f32>;

var<private> gl_FrontFacing : bool;

var<private> v_uv : vec2<f32>;

var<private> v_output2 : vec4<f32>;

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

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

[[group(0), binding(5)]] var<uniform> light0 : Light0;

var<private> glFragColor : vec4<f32>;

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

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

fn cotangent_frame_vf3_vf3_vf2_vf2_(normal_1 : ptr<function, vec3<f32>>, p : ptr<function, vec3<f32>>, uv : ptr<function, vec2<f32>>, tangentSpaceParams : ptr<function, vec2<f32>>) -> mat3x3<f32> {
  var dp1 : vec3<f32>;
  var dp2 : vec3<f32>;
  var duv1 : vec2<f32>;
  var duv2 : vec2<f32>;
  var dp2perp : vec3<f32>;
  var dp1perp : vec3<f32>;
  var tangent : vec3<f32>;
  var bitangent : vec3<f32>;
  var invmax : f32;
  let x_133 : vec3<f32> = *(p);
  dp1 = dpdx(x_133);
  let x_136 : vec3<f32> = *(p);
  dp2 = dpdy(x_136);
  let x_139 : vec2<f32> = *(uv);
  duv1 = dpdx(x_139);
  let x_142 : vec2<f32> = *(uv);
  duv2 = dpdy(x_142);
  let x_145 : vec3<f32> = dp2;
  let x_146 : vec3<f32> = *(normal_1);
  dp2perp = cross(x_145, x_146);
  let x_149 : vec3<f32> = *(normal_1);
  let x_150 : vec3<f32> = dp1;
  dp1perp = cross(x_149, x_150);
  let x_153 : vec3<f32> = dp2perp;
  let x_155 : f32 = duv1.x;
  let x_157 : vec3<f32> = dp1perp;
  let x_159 : f32 = duv2.x;
  tangent = ((x_153 * x_155) + (x_157 * x_159));
  let x_163 : vec3<f32> = dp2perp;
  let x_165 : f32 = duv1.y;
  let x_167 : vec3<f32> = dp1perp;
  let x_169 : f32 = duv2.y;
  bitangent = ((x_163 * x_165) + (x_167 * x_169));
  let x_173 : f32 = (*(tangentSpaceParams)).x;
  let x_174 : vec3<f32> = tangent;
  tangent = (x_174 * x_173);
  let x_177 : f32 = (*(tangentSpaceParams)).y;
  let x_178 : vec3<f32> = bitangent;
  bitangent = (x_178 * x_177);
  let x_181 : vec3<f32> = tangent;
  let x_182 : vec3<f32> = tangent;
  let x_184 : vec3<f32> = bitangent;
  let x_185 : vec3<f32> = bitangent;
  invmax = inverseSqrt(max(dot(x_181, x_182), dot(x_184, x_185)));
  let x_189 : vec3<f32> = tangent;
  let x_190 : f32 = invmax;
  let x_191 : vec3<f32> = (x_189 * x_190);
  let x_192 : vec3<f32> = bitangent;
  let x_193 : f32 = invmax;
  let x_194 : vec3<f32> = (x_192 * x_193);
  let x_195 : vec3<f32> = *(normal_1);
  return mat3x3<f32>(vec3<f32>(x_191.x, x_191.y, x_191.z), vec3<f32>(x_194.x, x_194.y, x_194.z), vec3<f32>(x_195.x, x_195.y, x_195.z));
}

fn transposeMat3_mf33_(inMatrix : ptr<function, mat3x3<f32>>) -> mat3x3<f32> {
  var i0 : vec3<f32>;
  var i1 : vec3<f32>;
  var i2 : vec3<f32>;
  var outMatrix : mat3x3<f32>;
  let x_60 : vec3<f32> = (*(inMatrix))[0];
  i0 = x_60;
  let x_64 : vec3<f32> = (*(inMatrix))[1];
  i1 = x_64;
  let x_68 : vec3<f32> = (*(inMatrix))[2];
  i2 = x_68;
  let x_73 : f32 = i0.x;
  let x_75 : f32 = i1.x;
  let x_77 : f32 = i2.x;
  let x_78 : vec3<f32> = vec3<f32>(x_73, x_75, x_77);
  let x_81 : f32 = i0.y;
  let x_83 : f32 = i1.y;
  let x_85 : f32 = i2.y;
  let x_86 : vec3<f32> = vec3<f32>(x_81, x_83, x_85);
  let x_89 : f32 = i0.z;
  let x_91 : f32 = i1.z;
  let x_93 : f32 = i2.z;
  let x_94 : vec3<f32> = vec3<f32>(x_89, x_91, x_93);
  outMatrix = mat3x3<f32>(vec3<f32>(x_78.x, x_78.y, x_78.z), vec3<f32>(x_86.x, x_86.y, x_86.z), vec3<f32>(x_94.x, x_94.y, x_94.z));
  let x_110 : mat3x3<f32> = outMatrix;
  return x_110;
}

fn perturbNormalBase_mf33_vf3_f1_(cotangentFrame : ptr<function, mat3x3<f32>>, normal : ptr<function, vec3<f32>>, scale : ptr<function, f32>) -> vec3<f32> {
  let x_113 : mat3x3<f32> = *(cotangentFrame);
  let x_114 : vec3<f32> = *(normal);
  return normalize((x_113 * x_114));
}

fn perturbNormal_mf33_vf3_f1_(cotangentFrame_1 : ptr<function, mat3x3<f32>>, textureSample : ptr<function, vec3<f32>>, scale_1 : ptr<function, f32>) -> vec3<f32> {
  var param : mat3x3<f32>;
  var param_1 : vec3<f32>;
  var param_2 : f32;
  let x_119 : vec3<f32> = *(textureSample);
  let x_125 : mat3x3<f32> = *(cotangentFrame_1);
  param = x_125;
  param_1 = ((x_119 * 2.0) - vec3<f32>(1.0, 1.0, 1.0));
  let x_128 : f32 = *(scale_1);
  param_2 = x_128;
  let x_129 : vec3<f32> = perturbNormalBase_mf33_vf3_f1_(&(param), &(param_1), &(param_2));
  return x_129;
}

fn computeHemisphericLighting_vf3_vf3_vf4_vf3_vf3_vf3_f1_(viewDirectionW : ptr<function, vec3<f32>>, vNormal : ptr<function, vec3<f32>>, lightData : ptr<function, vec4<f32>>, diffuseColor : ptr<function, vec3<f32>>, specularColor : ptr<function, vec3<f32>>, groundColor : ptr<function, vec3<f32>>, glossiness : ptr<function, f32>) -> lightingInfo {
  var ndl : f32;
  var result : lightingInfo;
  var angleW : vec3<f32>;
  var specComp : f32;
  let x_212 : vec3<f32> = *(vNormal);
  let x_213 : vec4<f32> = *(lightData);
  ndl = ((dot(x_212, vec3<f32>(x_213.x, x_213.y, x_213.z)) * 0.5) + 0.5);
  let x_220 : vec3<f32> = *(groundColor);
  let x_221 : vec3<f32> = *(diffuseColor);
  let x_222 : f32 = ndl;
  result.diffuse = mix(x_220, x_221, vec3<f32>(x_222, x_222, x_222));
  let x_227 : vec3<f32> = *(viewDirectionW);
  let x_228 : vec4<f32> = *(lightData);
  angleW = normalize((x_227 + vec3<f32>(x_228.x, x_228.y, x_228.z)));
  let x_233 : vec3<f32> = *(vNormal);
  let x_234 : vec3<f32> = angleW;
  specComp = max(0.0, dot(x_233, x_234));
  let x_237 : f32 = specComp;
  let x_238 : f32 = *(glossiness);
  specComp = pow(x_237, max(1.0, x_238));
  let x_241 : f32 = specComp;
  let x_242 : vec3<f32> = *(specularColor);
  result.specular = (x_242 * x_241);
  let x_245 : lightingInfo = result;
  return x_245;
}

fn main_1() {
  var tempTextureRead : vec4<f32>;
  var rgb : vec3<f32>;
  var output5 : vec3<f32>;
  var output4 : vec4<f32>;
  var uvOffset : vec2<f32>;
  var normalScale : f32;
  var TBNUV : vec2<f32>;
  var x_299 : vec2<f32>;
  var TBN : mat3x3<f32>;
  var param_3 : vec3<f32>;
  var param_4 : vec3<f32>;
  var param_5 : vec2<f32>;
  var param_6 : vec2<f32>;
  var invTBN : mat3x3<f32>;
  var param_7 : mat3x3<f32>;
  var parallaxLimit : f32;
  var vOffsetDir : vec2<f32>;
  var vMaxOffset : vec2<f32>;
  var numSamples : f32;
  var stepSize : f32;
  var currRayHeight : f32;
  var vCurrOffset : vec2<f32>;
  var vLastOffset : vec2<f32>;
  var lastSampledHeight : f32;
  var currSampledHeight : f32;
  var i : i32;
  var delta1 : f32;
  var delta2 : f32;
  var ratio : f32;
  var parallaxOcclusion_0 : vec2<f32>;
  var param_8 : mat3x3<f32>;
  var param_9 : vec3<f32>;
  var param_10 : f32;
  var output6 : vec2<f32>;
  var tempTextureRead1 : vec4<f32>;
  var rgb1 : vec3<f32>;
  var viewDirectionW_1 : vec3<f32>;
  var shadow : f32;
  var glossiness_1 : f32;
  var diffuseBase : vec3<f32>;
  var specularBase : vec3<f32>;
  var normalW : vec3<f32>;
  var info : lightingInfo;
  var param_11 : vec3<f32>;
  var param_12 : vec3<f32>;
  var param_13 : vec4<f32>;
  var param_14 : vec3<f32>;
  var param_15 : vec3<f32>;
  var param_16 : vec3<f32>;
  var param_17 : f32;
  var diffuseOutput : vec3<f32>;
  var specularOutput : vec3<f32>;
  var output3 : vec3<f32>;
  u_Float = 100.0;
  u_Color = vec3<f32>(0.5, 0.5, 0.5);
  let x_261 : vec2<f32> = vMainuv;
  let x_262 : vec4<f32> = textureSample(TextureSamplerTexture, TextureSamplerSampler, x_261);
  tempTextureRead = x_262;
  let x_264 : vec4<f32> = tempTextureRead;
  let x_273 : f32 = x_269.textureInfoName;
  rgb = (vec3<f32>(x_264.x, x_264.y, x_264.z) * x_273);
  let x_279 : vec3<f32> = x_269.u_cameraPosition;
  let x_282 : vec4<f32> = v_output1;
  output5 = normalize((x_279 - vec3<f32>(x_282.x, x_282.y, x_282.z)));
  output4 = vec4<f32>(0.0, 0.0, 0.0, 0.0);
  uvOffset = vec2<f32>(0.0, 0.0);
  let x_292 : f32 = x_269.u_bumpStrength;
  normalScale = (1.0 / x_292);
  let x_298 : bool = gl_FrontFacing;
  if (x_298) {
    let x_303 : vec2<f32> = v_uv;
    x_299 = x_303;
  } else {
    let x_305 : vec2<f32> = v_uv;
    x_299 = -(x_305);
  }
  let x_307 : vec2<f32> = x_299;
  TBNUV = x_307;
  let x_310 : vec4<f32> = v_output2;
  let x_312 : f32 = normalScale;
  param_3 = (vec3<f32>(x_310.x, x_310.y, x_310.z) * x_312);
  let x_317 : vec4<f32> = v_output1;
  param_4 = vec3<f32>(x_317.x, x_317.y, x_317.z);
  let x_320 : vec2<f32> = TBNUV;
  param_5 = x_320;
  let x_324 : vec2<f32> = x_269.tangentSpaceParameter0;
  param_6 = x_324;
  let x_325 : mat3x3<f32> = cotangent_frame_vf3_vf3_vf2_vf2_(&(param_3), &(param_4), &(param_5), &(param_6));
  TBN = x_325;
  let x_328 : mat3x3<f32> = TBN;
  param_7 = x_328;
  let x_329 : mat3x3<f32> = transposeMat3_mf33_(&(param_7));
  invTBN = x_329;
  let x_331 : mat3x3<f32> = invTBN;
  let x_332 : vec3<f32> = output5;
  let x_334 : vec3<f32> = (x_331 * -(x_332));
  let x_337 : mat3x3<f32> = invTBN;
  let x_338 : vec3<f32> = output5;
  parallaxLimit = (length(vec2<f32>(x_334.x, x_334.y)) / ((x_337 * -(x_338))).z);
  let x_345 : f32 = x_269.u_parallaxScale;
  let x_346 : f32 = parallaxLimit;
  parallaxLimit = (x_346 * x_345);
  let x_349 : mat3x3<f32> = invTBN;
  let x_350 : vec3<f32> = output5;
  let x_352 : vec3<f32> = (x_349 * -(x_350));
  vOffsetDir = normalize(vec2<f32>(x_352.x, x_352.y));
  let x_356 : vec2<f32> = vOffsetDir;
  let x_357 : f32 = parallaxLimit;
  vMaxOffset = (x_356 * x_357);
  let x_361 : mat3x3<f32> = invTBN;
  let x_362 : vec3<f32> = output5;
  let x_365 : mat3x3<f32> = invTBN;
  let x_366 : vec4<f32> = v_output2;
  numSamples = (15.0 + (dot((x_361 * -(x_362)), (x_365 * vec3<f32>(x_366.x, x_366.y, x_366.z))) * -11.0));
  let x_374 : f32 = numSamples;
  stepSize = (1.0 / x_374);
  currRayHeight = 1.0;
  vCurrOffset = vec2<f32>(0.0, 0.0);
  vLastOffset = vec2<f32>(0.0, 0.0);
  lastSampledHeight = 1.0;
  currSampledHeight = 1.0;
  i = 0;
  loop {
    let x_388 : i32 = i;
    if ((x_388 < 15)) {
    } else {
      break;
    }
    let x_394 : vec2<f32> = v_uv;
    let x_395 : vec2<f32> = vCurrOffset;
    let x_397 : vec4<f32> = textureSample(TextureSamplerTexture, TextureSamplerSampler, (x_394 + x_395));
    currSampledHeight = x_397.w;
    let x_400 : f32 = currSampledHeight;
    let x_401 : f32 = currRayHeight;
    if ((x_400 > x_401)) {
      let x_406 : f32 = currSampledHeight;
      let x_407 : f32 = currRayHeight;
      delta1 = (x_406 - x_407);
      let x_410 : f32 = currRayHeight;
      let x_411 : f32 = stepSize;
      let x_413 : f32 = lastSampledHeight;
      delta2 = ((x_410 + x_411) - x_413);
      let x_416 : f32 = delta1;
      let x_417 : f32 = delta1;
      let x_418 : f32 = delta2;
      ratio = (x_416 / (x_417 + x_418));
      let x_421 : f32 = ratio;
      let x_422 : vec2<f32> = vLastOffset;
      let x_424 : f32 = ratio;
      let x_426 : vec2<f32> = vCurrOffset;
      vCurrOffset = ((x_422 * x_421) + (x_426 * (1.0 - x_424)));
      break;
    } else {
      let x_431 : f32 = stepSize;
      let x_432 : f32 = currRayHeight;
      currRayHeight = (x_432 - x_431);
      let x_434 : vec2<f32> = vCurrOffset;
      vLastOffset = x_434;
      let x_435 : f32 = stepSize;
      let x_436 : vec2<f32> = vMaxOffset;
      let x_438 : vec2<f32> = vCurrOffset;
      vCurrOffset = (x_438 + (x_436 * x_435));
      let x_440 : f32 = currSampledHeight;
      lastSampledHeight = x_440;
    }

    continuing {
      let x_441 : i32 = i;
      i = (x_441 + 1);
    }
  }
  let x_444 : vec2<f32> = vCurrOffset;
  parallaxOcclusion_0 = x_444;
  let x_445 : vec2<f32> = parallaxOcclusion_0;
  uvOffset = x_445;
  let x_449 : vec2<f32> = v_uv;
  let x_450 : vec2<f32> = uvOffset;
  let x_452 : vec4<f32> = textureSample(TextureSamplerTexture, TextureSamplerSampler, (x_449 + x_450));
  let x_454 : f32 = x_269.u_bumpStrength;
  let x_457 : mat3x3<f32> = TBN;
  param_8 = x_457;
  param_9 = vec3<f32>(x_452.x, x_452.y, x_452.z);
  param_10 = (1.0 / x_454);
  let x_461 : vec3<f32> = perturbNormal_mf33_vf3_f1_(&(param_8), &(param_9), &(param_10));
  let x_462 : vec4<f32> = output4;
  output4 = vec4<f32>(x_461.x, x_461.y, x_461.z, x_462.w);
  let x_465 : vec2<f32> = v_uv;
  let x_466 : vec2<f32> = uvOffset;
  output6 = (x_465 + x_466);
  let x_474 : vec2<f32> = output6;
  let x_475 : vec4<f32> = textureSample(TextureSampler1Texture, TextureSampler1Sampler, x_474);
  tempTextureRead1 = x_475;
  let x_477 : vec4<f32> = tempTextureRead1;
  rgb1 = vec3<f32>(x_477.x, x_477.y, x_477.z);
  let x_481 : vec3<f32> = x_269.u_cameraPosition;
  let x_482 : vec4<f32> = v_output1;
  viewDirectionW_1 = normalize((x_481 - vec3<f32>(x_482.x, x_482.y, x_482.z)));
  shadow = 1.0;
  let x_488 : f32 = u_Float;
  glossiness_1 = (1.0 * x_488);
  diffuseBase = vec3<f32>(0.0, 0.0, 0.0);
  specularBase = vec3<f32>(0.0, 0.0, 0.0);
  let x_494 : vec4<f32> = output4;
  normalW = vec3<f32>(x_494.x, x_494.y, x_494.z);
  let x_501 : vec3<f32> = viewDirectionW_1;
  param_11 = x_501;
  let x_503 : vec3<f32> = normalW;
  param_12 = x_503;
  let x_507 : vec4<f32> = light0.vLightData;
  param_13 = x_507;
  let x_510 : vec4<f32> = light0.vLightDiffuse;
  param_14 = vec3<f32>(x_510.x, x_510.y, x_510.z);
  let x_514 : vec4<f32> = light0.vLightSpecular;
  param_15 = vec3<f32>(x_514.x, x_514.y, x_514.z);
  let x_518 : vec3<f32> = light0.vLightGround;
  param_16 = x_518;
  let x_520 : f32 = glossiness_1;
  param_17 = x_520;
  let x_521 : lightingInfo = computeHemisphericLighting_vf3_vf3_vf4_vf3_vf3_vf3_f1_(&(param_11), &(param_12), &(param_13), &(param_14), &(param_15), &(param_16), &(param_17));
  info = x_521;
  shadow = 1.0;
  let x_523 : vec3<f32> = info.diffuse;
  let x_524 : f32 = shadow;
  let x_526 : vec3<f32> = diffuseBase;
  diffuseBase = (x_526 + (x_523 * x_524));
  let x_529 : vec3<f32> = info.specular;
  let x_530 : f32 = shadow;
  let x_532 : vec3<f32> = specularBase;
  specularBase = (x_532 + (x_529 * x_530));
  let x_535 : vec3<f32> = diffuseBase;
  let x_536 : vec3<f32> = rgb1;
  diffuseOutput = (x_535 * x_536);
  let x_539 : vec3<f32> = specularBase;
  let x_540 : vec3<f32> = u_Color;
  specularOutput = (x_539 * x_540);
  let x_543 : vec3<f32> = diffuseOutput;
  let x_544 : vec3<f32> = specularOutput;
  output3 = (x_543 + x_544);
  let x_548 : vec3<f32> = output3;
  glFragColor = vec4<f32>(x_548.x, x_548.y, x_548.z, 1.0);
  return;
}

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

[[stage(fragment)]]
fn main([[location(1)]] vMainuv_param : vec2<f32>, [[location(0)]] v_output1_param : vec4<f32>, [[builtin(front_facing)]] gl_FrontFacing_param : bool, [[location(3)]] v_uv_param : vec2<f32>, [[location(2)]] v_output2_param : vec4<f32>) -> main_out {
  vMainuv = vMainuv_param;
  v_output1 = v_output1_param;
  gl_FrontFacing = gl_FrontFacing_param;
  v_uv = v_uv_param;
  v_output2 = v_output2_param;
  main_1();
  return main_out(glFragColor);
}