#version 310 es
precision mediump float;

layout(location = 0) out vec2 texcoords_1;
struct Uniforms {
  vec2 u_scale;
  vec2 u_offset;
};

layout(binding = 0) uniform Uniforms_1 {
  vec2 u_scale;
  vec2 u_offset;
} uniforms;

struct VertexOutputs {
  vec2 texcoords;
  vec4 position;
};

VertexOutputs vs_main(uint VertexIndex) {
  vec2 texcoord[3] = vec2[3](vec2(-0.5f, 0.0f), vec2(1.5f, 0.0f), vec2(0.5f, 2.0f));
  VertexOutputs tint_symbol = VertexOutputs(vec2(0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f));
  tint_symbol.position = vec4(((texcoord[VertexIndex] * 2.0f) - vec2(1.0f, 1.0f)), 0.0f, 1.0f);
  bool flipY = (uniforms.u_scale.y < 0.0f);
  if (flipY) {
    tint_symbol.texcoords = ((((texcoord[VertexIndex] * uniforms.u_scale) + uniforms.u_offset) * vec2(1.0f, -1.0f)) + vec2(0.0f, 1.0f));
  } else {
    tint_symbol.texcoords = ((((texcoord[VertexIndex] * vec2(1.0f, -1.0f)) + vec2(0.0f, 1.0f)) * uniforms.u_scale) + uniforms.u_offset);
  }
  return tint_symbol;
}

void main() {
  VertexOutputs inner_result = vs_main(uint(gl_VertexID));
  texcoords_1 = inner_result.texcoords;
  gl_Position = inner_result.position;
  gl_Position.y = -(gl_Position.y);
  gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
  return;
}
#version 310 es
precision mediump float;

layout(location = 0) in vec2 texcoord_1;
layout(location = 0) out vec4 value;
struct Uniforms {
  vec2 u_scale;
  vec2 u_offset;
};

struct VertexOutputs {
  vec2 texcoords;
  vec4 position;
};

uniform highp sampler2D myTexture_mySampler;

vec4 fs_main(vec2 texcoord) {
  vec2 clampedTexcoord = clamp(texcoord, vec2(0.0f, 0.0f), vec2(1.0f, 1.0f));
  if (!(all(equal(clampedTexcoord, texcoord)))) {
    discard;
  }
  vec4 srcColor = texture(myTexture_mySampler, texcoord);
  return srcColor;
}

void main() {
  vec4 inner_result = fs_main(texcoord_1);
  value = inner_result;
  return;
}
