SKIP: FAILED

#version 310 es
precision mediump float;

struct VertexInput {
  vec4 position;
  vec3 normal;
  vec4 tangent;
  vec2 texcoord;
  uvec4 joints;
  vec4 weights;
  vec4 instance0;
  vec4 instance1;
  vec4 instance2;
  vec4 instance3;
  vec4 instanceColor;
};

struct VertexOutput {
  vec4 position;
  vec3 worldPos;
  vec3 view;
  vec2 texcoord;
  vec2 texcoord2;
  vec4 color;
  vec4 instanceColor;
  vec3 normal;
  vec3 tangent;
  vec3 bitangent;
};

struct Camera {
  mat4 projection;
  mat4 inverseProjection;
  mat4 view;
  vec3 position;
  float time;
  vec2 outputSize;
  float zNear;
  float zFar;
};

layout(binding = 0) uniform Camera_1 {
  mat4 projection;
  mat4 inverseProjection;
  mat4 view;
  vec3 position;
  float time;
  vec2 outputSize;
  float zNear;
  float zFar;
} camera;

layout(binding = 1) buffer Joints_1 {
  mat4 matrices[];
} joint;
layout(binding = 2) buffer Joints_2 {
  mat4 matrices[];
} inverseBind;
mat4 getSkinMatrix(VertexInput tint_symbol) {
  mat4 joint0 = (joint.matrices[tint_symbol.joints.x] * inverseBind.matrices[tint_symbol.joints.x]);
  mat4 joint1 = (joint.matrices[tint_symbol.joints.y] * inverseBind.matrices[tint_symbol.joints.y]);
  mat4 joint2 = (joint.matrices[tint_symbol.joints.z] * inverseBind.matrices[tint_symbol.joints.z]);
  mat4 joint3 = (joint.matrices[tint_symbol.joints.w] * inverseBind.matrices[tint_symbol.joints.w]);
  mat4 skinMatrix = ((((joint0 * tint_symbol.weights.x) + (joint1 * tint_symbol.weights.y)) + (joint2 * tint_symbol.weights.z)) + (joint3 * tint_symbol.weights.w));
  return skinMatrix;
}

struct tint_symbol_3 {
  vec4 position;
  vec3 normal;
  vec4 tangent;
  vec2 texcoord;
  uvec4 joints;
  vec4 weights;
  vec4 instance0;
  vec4 instance1;
  vec4 instance2;
  vec4 instance3;
  vec4 instanceColor;
};

struct tint_symbol_4 {
  vec3 worldPos;
  vec3 view;
  vec2 texcoord;
  vec2 texcoord2;
  vec4 color;
  vec4 instanceColor;
  vec3 normal;
  vec3 tangent;
  vec3 bitangent;
  vec4 position;
};

VertexOutput vertexMain_inner(VertexInput tint_symbol) {
  VertexOutput tint_symbol_1 = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, 0.0f), vec2(0.0f, 0.0f), vec2(0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, 0.0f));
  mat4 modelMatrix = getSkinMatrix(tint_symbol);
  tint_symbol_1.normal = normalize((modelMatrix * vec4(tint_symbol.normal, 0.0f)).xyz);
  tint_symbol_1.tangent = normalize((modelMatrix * vec4(tint_symbol.tangent.xyz, 0.0f)).xyz);
  tint_symbol_1.bitangent = (cross(tint_symbol_1.normal, tint_symbol_1.tangent) * tint_symbol.tangent.w);
  tint_symbol_1.color = vec4(1.0f);
  tint_symbol_1.texcoord = tint_symbol.texcoord;
  tint_symbol_1.instanceColor = tint_symbol.instanceColor;
  vec4 modelPos = (modelMatrix * tint_symbol.position);
  tint_symbol_1.worldPos = modelPos.xyz;
  tint_symbol_1.view = (camera.position - modelPos.xyz);
  tint_symbol_1.position = ((camera.projection * camera.view) * modelPos);
  return tint_symbol_1;
}

tint_symbol_4 vertexMain(tint_symbol_3 tint_symbol_2) {
  VertexInput tint_symbol_5 = VertexInput(tint_symbol_2.position, tint_symbol_2.normal, tint_symbol_2.tangent, tint_symbol_2.texcoord, tint_symbol_2.joints, tint_symbol_2.weights, tint_symbol_2.instance0, tint_symbol_2.instance1, tint_symbol_2.instance2, tint_symbol_2.instance3, tint_symbol_2.instanceColor);
  VertexOutput inner_result = vertexMain_inner(tint_symbol_5);
  tint_symbol_4 wrapper_result = tint_symbol_4(vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, 0.0f), vec2(0.0f, 0.0f), vec2(0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result.position = inner_result.position;
  wrapper_result.worldPos = inner_result.worldPos;
  wrapper_result.view = inner_result.view;
  wrapper_result.texcoord = inner_result.texcoord;
  wrapper_result.texcoord2 = inner_result.texcoord2;
  wrapper_result.color = inner_result.color;
  wrapper_result.instanceColor = inner_result.instanceColor;
  wrapper_result.normal = inner_result.normal;
  wrapper_result.tangent = inner_result.tangent;
  wrapper_result.bitangent = inner_result.bitangent;
  return wrapper_result;
}
layout(location = 0) in vec4 position;
layout(location = 1) in vec3 normal;
layout(location = 2) in vec4 tangent;
layout(location = 3) in vec2 texcoord;
layout(location = 6) in uvec4 joints;
layout(location = 7) in vec4 weights;
layout(location = 8) in vec4 instance0;
layout(location = 9) in vec4 instance1;
layout(location = 10) in vec4 instance2;
layout(location = 11) in vec4 instance3;
layout(location = 12) in vec4 instanceColor;
layout(location = 0) out vec3 worldPos;
layout(location = 1) out vec3 view;
layout(location = 2) out vec2 texcoord;
layout(location = 3) out vec2 texcoord2;
layout(location = 4) out vec4 color;
layout(location = 5) out vec4 instanceColor;
layout(location = 6) out vec3 normal;
layout(location = 7) out vec3 tangent;
layout(location = 8) out vec3 bitangent;


void main() {
  tint_symbol_3 inputs;
  inputs.position = position;
  inputs.normal = normal;
  inputs.tangent = tangent;
  inputs.texcoord = texcoord;
  inputs.joints = joints;
  inputs.weights = weights;
  inputs.instance0 = instance0;
  inputs.instance1 = instance1;
  inputs.instance2 = instance2;
  inputs.instance3 = instance3;
  inputs.instanceColor = instanceColor;
  tint_symbol_4 outputs;
  outputs = vertexMain(inputs);
  worldPos = outputs.worldPos;
  view = outputs.view;
  texcoord = outputs.texcoord;
  texcoord2 = outputs.texcoord2;
  color = outputs.color;
  instanceColor = outputs.instanceColor;
  normal = outputs.normal;
  tangent = outputs.tangent;
  bitangent = outputs.bitangent;
  gl_Position = outputs.position;
  gl_Position.z = 2.0 * gl_Position.z - gl_Position.w;
  gl_Position.y = -gl_Position.y;
}

Error parsing GLSL shader:
ERROR: 0:140: 'texcoord' : redefinition 
ERROR: 1 compilation errors.  No code generated.



