SKIP: FAILED

#version 310 es
precision mediump float;

struct Time {
  float value;
};
struct Uniforms {
  float scale;
  float offsetX;
  float offsetY;
  float scalar;
  float scalarOffset;
};

layout(binding = 0) uniform Time_1 {
  float value;
} time;
layout(binding = 1) uniform Uniforms_1 {
  float scale;
  float offsetX;
  float offsetY;
  float scalar;
  float scalarOffset;
} uniforms;

struct VertexOutput {
  vec4 Position;
  vec4 v_color;
};
struct tint_symbol_2 {
  vec4 position;
  vec4 color;
};
struct tint_symbol_3 {
  vec4 v_color;
  vec4 Position;
};

VertexOutput vert_main_inner(vec4 position, vec4 color) {
  float fade = ((uniforms.scalarOffset + ((time.value * uniforms.scalar) / 10.0f)) % 1.0f);
  if ((fade < 0.5f)) {
    fade = (fade * 2.0f);
  } else {
    fade = ((1.0f - fade) * 2.0f);
  }
  float xpos = (position.x * uniforms.scale);
  float ypos = (position.y * uniforms.scale);
  float angle = ((3.141590118f * 2.0f) * fade);
  float xrot = ((xpos * cos(angle)) - (ypos * sin(angle)));
  float yrot = ((xpos * sin(angle)) + (ypos * cos(angle)));
  xpos = (xrot + uniforms.offsetX);
  ypos = (yrot + uniforms.offsetY);
  VertexOutput tint_symbol = VertexOutput(vec4(0.0f, 0.0f, 0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f));
  tint_symbol.v_color = (vec4(fade, (1.0f - fade), 0.0f, 1.0f) + color);
  tint_symbol.Position = vec4(xpos, ypos, 0.0f, 1.0f);
  return tint_symbol;
}

struct tint_symbol_5 {
  vec4 v_color;
};
struct tint_symbol_6 {
  vec4 value;
};

tint_symbol_3 vert_main(tint_symbol_2 tint_symbol_1) {
  VertexOutput inner_result = vert_main_inner(tint_symbol_1.position, tint_symbol_1.color);
  tint_symbol_3 wrapper_result = tint_symbol_3(vec4(0.0f, 0.0f, 0.0f, 0.0f), vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result.Position = inner_result.Position;
  wrapper_result.v_color = inner_result.v_color;
  return wrapper_result;
}
layout(location = 0) in vec4 position;
layout(location = 1) in vec4 color;
layout(location = 0) out vec4 v_color;
void main() {
  tint_symbol_2 inputs;
  inputs.position = position;
  inputs.color = color;
  tint_symbol_3 outputs;
  outputs = vert_main(inputs);
  v_color = outputs.v_color;
  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:40: '%' :  wrong operand types: no operation '%' exists that takes a left-hand operand of type ' temp mediump float' and a right operand of type ' const float' (or there is no acceptable conversion)
ERROR: 0:40: '' : compilation terminated 
ERROR: 2 compilation errors.  No code generated.



#version 310 es
precision mediump float;

struct Time {
  float value;
};
struct Uniforms {
  float scale;
  float offsetX;
  float offsetY;
  float scalar;
  float scalarOffset;
};
struct VertexOutput {
  vec4 Position;
  vec4 v_color;
};
struct tint_symbol_2 {
  vec4 position;
  vec4 color;
};
struct tint_symbol_3 {
  vec4 v_color;
  vec4 Position;
};
struct tint_symbol_5 {
  vec4 v_color;
};
struct tint_symbol_6 {
  vec4 value;
};

vec4 frag_main_inner(vec4 v_color) {
  return v_color;
}

tint_symbol_6 frag_main(tint_symbol_5 tint_symbol_4) {
  vec4 inner_result_1 = frag_main_inner(tint_symbol_4.v_color);
  tint_symbol_6 wrapper_result_1 = tint_symbol_6(vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result_1.value = inner_result_1;
  return wrapper_result_1;
}
layout(location = 0) in vec4 v_color;
layout(location = 0) out vec4 value;
void main() {
  tint_symbol_5 inputs;
  inputs.v_color = v_color;
  tint_symbol_6 outputs;
  outputs = frag_main(inputs);
  value = outputs.value;
}


