57 lines
1.3 KiB
Text
57 lines
1.3 KiB
Text
|
shader_type canvas_item;
|
||
|
|
||
|
|
||
|
group_uniforms segments;
|
||
|
uniform float segments: hint_range(2.0, 48.0, 1.0) = 6.0;
|
||
|
uniform bool segmentReflect = true;
|
||
|
group_uniforms;
|
||
|
group_uniforms polar;
|
||
|
uniform vec2 polarOffset = vec2(0.5, 0.5);
|
||
|
uniform float polarAngle: hint_range(0.0, 360.0) = 0.0;
|
||
|
group_uniforms;
|
||
|
group_uniforms source;
|
||
|
uniform vec2 sourceOffset = vec2(0.5, 0.5);
|
||
|
uniform float sourceScale = 2.0;
|
||
|
uniform float sourceAngle: hint_range(0.0, 360.0) = 0.0;
|
||
|
group_uniforms;
|
||
|
|
||
|
|
||
|
vec2 simpleRotate(vec2 uv, float rotation) {
|
||
|
return vec2(
|
||
|
cos(rotation) * uv.x + sin(rotation) * uv.y,
|
||
|
cos(rotation) * uv.y - sin(rotation) * uv.x
|
||
|
);
|
||
|
}
|
||
|
|
||
|
|
||
|
vec2 kaleid(vec2 uv, float addAngle, vec2 origin, float segCount, bool doReflect) {
|
||
|
|
||
|
uv -= origin;
|
||
|
float radius = sqrt(dot(uv, uv));
|
||
|
float angle = atan(uv.y, uv.x) + addAngle;
|
||
|
|
||
|
float segmentAngle = TAU / segCount;
|
||
|
angle -= segmentAngle * floor(angle / segmentAngle);
|
||
|
|
||
|
if (doReflect) {
|
||
|
angle = min(angle, segmentAngle - angle);
|
||
|
}
|
||
|
|
||
|
return vec2(cos(angle), sin(angle)) * radius;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
void fragment() {
|
||
|
|
||
|
vec2 newUV = kaleid(UV, radians(polarAngle), polarOffset, segments, segmentReflect);
|
||
|
|
||
|
newUV = simpleRotate(newUV, radians(sourceAngle));
|
||
|
newUV += sourceOffset;
|
||
|
newUV *= sourceScale;
|
||
|
|
||
|
vec4 finalColor = texture(TEXTURE, fract(newUV * sourceScale - sourceOffset));
|
||
|
|
||
|
COLOR = finalColor;
|
||
|
|
||
|
}
|