57 lines
		
	
	
		
			No EOL
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			No EOL
		
	
	
		
			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;
 | 
						|
	
 | 
						|
} |