struct Scene {
  vEyePosition : vec4<f32>,
};

struct Material {
  vDiffuseColor : vec4<f32>,
  vAmbientColor : vec3<f32>,
  dummy: f32,
  vEmissiveColor : vec3<f32>,
  dummy2: f32,
};

struct Mesh {
  visibility : f32,
};

var<private> fClipDistance3 : f32;

var<private> fClipDistance4 : f32;

@group(0) @binding(0) var<uniform> x_29 : Scene;

@group(0) @binding(1) var<uniform> x_49 : Material;

@group(0) @binding(2) var<uniform> x_137 : Mesh;

var<private> glFragColor : vec4<f32>;

fn main_1() {
  var viewDirectionW : vec3<f32>;
  var baseColor : vec4<f32>;
  var diffuseColor : vec3<f32>;
  var alpha : f32;
  var normalW : vec3<f32>;
  var uvOffset : vec2<f32>;
  var baseAmbientColor : vec3<f32>;
  var glossiness : f32;
  var diffuseBase : vec3<f32>;
  var shadow : f32;
  var refractionColor : vec4<f32>;
  var reflectionColor : vec4<f32>;
  var emissiveColor : vec3<f32>;
  var finalDiffuse : vec3<f32>;
  var finalSpecular : vec3<f32>;
  var color : vec4<f32>;
  let x_9 : f32 = fClipDistance3;
  if ((x_9 > 0.0)) {
    discard;
  }
  let x_17 : f32 = fClipDistance4;
  if ((x_17 > 0.0)) {
    discard;
  }
  let x_34 : vec4<f32> = x_29.vEyePosition;
  let x_38 : vec3<f32> = vec3<f32>(0., 0., 0.);
  viewDirectionW = normalize((vec3<f32>(x_34.x, x_34.y, x_34.z) - x_38));
  baseColor = vec4<f32>(1.0, 1.0, 1.0, 1.0);
  let x_52 : vec4<f32> = x_49.vDiffuseColor;
  diffuseColor = vec3<f32>(x_52.x, x_52.y, x_52.z);
  let x_60 : f32 = x_49.vDiffuseColor.w;
  alpha = x_60;
  let x_62 : vec3<f32> = vec3<f32>(0., 0., 0.);
  let x_64 : vec3<f32> = vec3<f32>(0., 0., 0.);
  normalW = normalize(-(cross(dpdx(x_62), dpdy(x_64))));
  uvOffset = vec2<f32>(0.0, 0.0);
  let x_74 : vec4<f32> = vec4<f32>(0., 0., 0., 0.);
  let x_76 : vec4<f32> = baseColor;
  let x_78 : vec3<f32> = (vec3<f32>(x_76.x, x_76.y, x_76.z) * vec3<f32>(x_74.x, x_74.y, x_74.z));
  let x_79 : vec4<f32> = baseColor;
  baseColor = vec4<f32>(x_78.x, x_78.y, x_78.z, x_79.w);
  baseAmbientColor = vec3<f32>(1.0, 1.0, 1.0);
  glossiness = 0.0;
  diffuseBase = vec3<f32>(0.0, 0.0, 0.0);
  shadow = 1.0;
  refractionColor = vec4<f32>(0.0, 0.0, 0.0, 1.0);
  reflectionColor = vec4<f32>(0.0, 0.0, 0.0, 1.0);
  let x_94 : vec3<f32> = x_49.vEmissiveColor;
  emissiveColor = x_94;
  let x_96 : vec3<f32> = diffuseBase;
  let x_97 : vec3<f32> = diffuseColor;
  let x_99 : vec3<f32> = emissiveColor;
  let x_103 : vec3<f32> = x_49.vAmbientColor;
  let x_108 : vec4<f32> = baseColor;
  finalDiffuse = (clamp((((x_96 * x_97) + x_99) + x_103), vec3<f32>(0.0, 0.0, 0.0), vec3<f32>(1.0, 1.0, 1.0)) * vec3<f32>(x_108.x, x_108.y, x_108.z));
  finalSpecular = vec3<f32>(0.0, 0.0, 0.0);
  let x_113 : vec3<f32> = finalDiffuse;
  let x_114 : vec3<f32> = baseAmbientColor;
  let x_116 : vec3<f32> = finalSpecular;
  let x_118 : vec4<f32> = reflectionColor;
  let x_121 : vec4<f32> = refractionColor;
  let x_123 : vec3<f32> = ((((x_113 * x_114) + x_116) + vec3<f32>(x_118.x, x_118.y, x_118.z)) + vec3<f32>(x_121.x, x_121.y, x_121.z));
  let x_124 : f32 = alpha;
  color = vec4<f32>(x_123.x, x_123.y, x_123.z, x_124);
  let x_129 : vec4<f32> = color;
  let x_132 : vec3<f32> = max(vec3<f32>(x_129.x, x_129.y, x_129.z), vec3<f32>(0.0, 0.0, 0.0));
  let x_133 : vec4<f32> = color;
  color = vec4<f32>(x_132.x, x_132.y, x_132.z, x_133.w);
  let x_140 : f32 = x_137.visibility;
  let x_142 : f32 = color.w;
  color.w = (x_142 * x_140);
  let x_147 : vec4<f32> = color;
  glFragColor = x_147;
  return;
}

struct main_out {
  @location(0)
  glFragColor_1 : vec4<f32>,
};

@stage(fragment)
fn main(@location(2) fClipDistance3_param : f32, @location(3) fClipDistance4_param : f32) -> main_out {
  fClipDistance3 = fClipDistance3_param;
  fClipDistance4 = fClipDistance4_param;
  main_1();
  return main_out(glFragColor);
}
