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:44: '%' :  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:44: '' : 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;
}

