<?xml version="1.0" encoding="utf-8"?>
<Filter>
	<CustomClasses>
		<ScriptMap name="ScriptMap01">
			<RequiredColor name="Source" display_name="Source"/>
			<Slider name="OffsetX" display_name="Offset X"/>
			<Slider name="OffsetY" display_name="Offset Y"/>
			<Slider name="Scale" display_name="Scale"/>
			<IntSlider name="InnerRepeat" display_name="Inner Repeat">
				<Range min="1" max="20"/>
			</IntSlider>
			<Checkbox name="SpiralEffect" display_name="Spiral Effect"/>
			<IntSlider name="OuterRepeat" display_name="Outer Repeat">
				<Range min="1" max="10"/>
			</IntSlider>
			<Slider name="Rotation" display_name="Rotation"/>
			<Checkbox name="ReverseOrder" display_name="Reverse Order"/>
		</ScriptMap>
	</CustomClasses>
	<Components>
		<Result id="result">
			<Source source="scriptmap01 01"/>
			<FilterType value="0"/>
			<Lighting>
				<Height value="0.20000000000000001"/>
				<Environment>
					<Source value=""/>
					<Brightness value="1"/>
					<Saturation value="1"/>
					<Rotation value="0"/>
					<RotationAxis x="0" y="0" z="0"/>
				</Environment>
				<Ambience>
					<AmbientLight red="0" green="0" blue="0"/>
					<Shadowing value="0"/>
					<CurrentOcclusionSettings>
						<RayDirections value="4"/>
						<TraceDistance value="0.20000000000000001"/>
						<RayJittering value="true"/>
						<RayBounce value="true"/>
						<AvoidStreaks value="true"/>
						<DirectSamples value="0"/>
						<ROQuality value="3"/>
					</CurrentOcclusionSettings>
					<CustomOcclusionSettings>
						<RayDirections value="16"/>
						<TraceDistance value="0.29999999999999999"/>
						<RayJittering value="true"/>
						<RayBounce value="true"/>
						<AvoidStreaks value="true"/>
						<DirectSamples value="1"/>
						<ROQuality value="10"/>
					</CustomOcclusionSettings>
					<ArtisticSettings>
						<BlackPoint value="0"/>
						<Midtones value="0.5"/>
						<WhitePoint value="1"/>
					</ArtisticSettings>
				</Ambience>
			</Lighting>
		</Result>
		<ScriptMap01 id="scriptmap01 01">
			<Script value="-- Essential math\[br]function complex_mult(ax, ay, bx, by) return ax * bx - ay * by, ax * by + ay * bx end;\[br]function complex_abs(ax, ay) return math.sqrt(ax ^ 2 + ay ^ 2) end;\[br]function complex_arg(ax, ay) return math.atan2(ay, ax) end;\[br]function complex_reciprocal(ax, ay)\[br]\[tb]local mag_sq = ax ^ 2 + ay ^ 2\[br]\[tb]return ax / mag_sq, -ay / mag_sq\[br]end;\[br]function complex_division(ax, ay, bx, by) return complex_mult(ax, ay, complex_reciprocal(bx, by)) end;\[br]function complex_log(ax, ay) return math.log(complex_abs(ax, ay)), complex_arg(ax, ay) end;\[br]function complex_exp(ax, ay) return math.exp(ax) * math.cos(ay), math.exp(ax) * math.sin(ay) end;\[br]\[br]function prepare()\[tb]\[br]\[tb]output_size_x = OUTPUT_WIDTH / SIZE\[br]\[tb]output_size_y = OUTPUT_HEIGHT / SIZE\[br]\[tb]\[br]\[tb]print(output_size_x, &quot; &quot;, output_size_y)\[br]\[tb]\[br]\[tb]levels = get_intslider_input(INNERREPEAT)\[br]\[tb]outer_repeat = get_intslider_input(OUTERREPEAT)\[br]\[tb]inner_radius = get_slider_input(SCALE)\[br]\[tb]\[br]\[tb]angle = (get_slider_input(ROTATION) * 2 - 1) * math.pi\[br]\[tb]spiral_effect = get_checkbox_input(SPIRALEFFECT)\[br]\[tb]reverse_order = get_checkbox_input(REVERSEORDER)\[br]\[tb]\[br]\[tb]shift_x = (0.5 + get_slider_input(OFFSETX) * 2 - 1) * output_size_x\[br]\[tb]shift_y = (0.5 + get_slider_input(OFFSETY) * 2 - 1) * output_size_y\[br]end;\[br]\[br]function render(zx, zy, shift_x, shift_y, r, g, b, a, aa_zone)\[br]\[tb]local dx, dy = zx + shift_x, zy + shift_y\[br]\[tb]\[br]\[tb]local r2, g2, b2, a2\[br]\[tb]if dx &lt; 0 or dy &lt; 0 or dx &gt; output_size_x or dy &gt; output_size_y then\[br]\[tb]\[tb]r2, g2, b2, a2 = 0, 0, 0, 0\[br]\[tb]else\[br]\[tb]\[tb]r2, g2, b2, a2 = get_sample_map(dx, dy, SOURCE)\[br]\[tb]end\[br]\[tb]\[br]\[tb]local scale = a2\[tb]\[br]\[tb]local result_a = a + (1 - a) * scale\[br]\[tb]if result_a ~= 0 then\[br]\[tb]\[tb]r = (r * a + (r2 - r * a) * scale) / result_a\[br]\[tb]\[tb]g = (g * a + (g2 - g * a) * scale) / result_a\[br]\[tb]\[tb]b = (b * a + (b2 - b * a) * scale) / result_a\[br]\[tb]\[tb]a = result_a\[br]\[tb]end\[br]\[tb]aa_zone = combine_aa_zones(aa_zone, 1)\[br]\[tb]\[br]\[tb]return r, g, b, a, aa_zone\[br]end\[br]\[tb]\[br]function get_sample(x, y, t)\[br]\[tb]local r, g, b, a =  0, 0, 0, 0\[br]\[tb]local aa_zone = 0\[br]\[tb]local zx, zy = x - shift_x, y - shift_y\[br]\[tb]\[br]\[tb]-- Start Droste-effect code\[tb]\[br]\[tb]local im_scale = 1\[br]\[tb]if (spiral_effect) then\[br]\[tb]\[tb]im_scale = (math.pi * 2 + math.abs(angle)) / (math.pi * 2)\[br]\[tb]\[tb]local alpha_x, alpha_y = math.atan(math.log(1/inner_radius) / math.pi / 2.0), 0.0\[br]\[tb]\[tb]if (angle &lt; 0) then\[br]\[tb]\[tb]\[tb]alpha_x = -alpha_x\[br]\[tb]\[tb]end\[br]\[tb]\[tb]\[br]\[tb]\[tb]zx, zy = complex_log(complex_division(zx, zy, inner_radius, 0.0))\[br]\[tb]\[tb]local fx, fy = math.cos(alpha_x), 0.0\[br]\[tb]\[tb]local beta_x, beta_y = complex_mult(fx, fy, complex_exp(complex_mult(alpha_x, alpha_y, 0, 1)))\[br]\[tb]\[tb]\[br]\[tb]\[tb]zx, zy = complex_division(zx, zy, beta_x, beta_y);\[br]\[tb]\[tb]zy = zy / im_scale\[br]\[tb]\[tb]zx, zy = complex_mult(inner_radius, 0.0, complex_exp(zx, zy));\[br]\[tb]end\[br]\[tb]--End Droste-effect code\[br]\[tb]\[br]\[tb]--Start drawing\[br]\[tb]rotation_scale_x, rotation_scale_y = complex_mult(1/inner_radius, 0, complex_exp(complex_mult(-angle / im_scale, 0, 0, 1)))\[br]\[tb]\[br]\[tb]local outer_interation = 1\[br]\[tb]while (outer_interation &lt; outer_repeat) do\[br]\[tb]\[tb]zx, zy = complex_division(zx, zy, rotation_scale_x, rotation_scale_y)\[br]\[tb]\[tb]outer_interation = outer_interation + 1\[br]\[tb]end\[br]\[tb]\[br]\[tb]if not reverse_order then\[br]\[tb]\[tb]local iteration = 0\[br]\[tb]\[tb]while (iteration &lt;= levels + outer_repeat - 1) do\[br]\[tb]\[tb]\[tb]r, g, b, a, aa_zone = render(zx, zy, shift_x, shift_y, r, g, b, a, aa_zone)\[br]\[tb]\[tb]\[tb]zx, zy = complex_mult(zx, zy, rotation_scale_x, rotation_scale_y)\[br]\[tb]\[tb]\[tb]iteration = iteration + 1\[br]\[tb]\[tb]end\[br]\[tb]else\[br]\[tb]\[tb]local iteration = 0\[br]\[tb]\[tb]while (iteration &lt;= levels + outer_repeat - 2) do\[br]\[tb]\[tb]\[tb]zx, zy = complex_mult(zx, zy, rotation_scale_x, rotation_scale_y)\[br]\[tb]\[tb]\[tb]iteration = iteration + 1\[br]\[tb]\[tb]end\[br]\[tb]\[tb]\[br]\[tb]\[tb]iteration = levels + outer_repeat - 1\[br]\[tb]\[tb]while (iteration &gt;= 0) do\[br]\[tb]\[tb]\[tb]r, g, b, a, aa_zone = render(zx, zy, shift_x, shift_y, r, g, b, a, aa_zone)\[br]\[tb]\[tb]\[tb]zx, zy = complex_division(zx, zy, rotation_scale_x, rotation_scale_y)\[br]\[tb]\[tb]\[tb]iteration = iteration - 1\[br]\[tb]\[tb]end\[br]\[tb]end\[br]\[tb]\[tb]\[br]\[tb]return r, g, b, a, aa_zone\[br]end;"/>
			<Settings>
				<OutputType value="2"/>
				<Discrete value="false"/>
				<HDR value="true"/>
				<Sizable value="true"/>
				<Randomizable value="false"/>
				<SafeScript value="true"/>
			</Settings>
			<Source source="image2 02"/>
			<OffsetX source="slidercontrol 01" value="0.503">
				<Minimum value="0.25"/>
				<Maximum value="0.75"/>
			</OffsetX>
			<OffsetY source="slidercontrol 02" value="0.53200000000000003">
				<Minimum value="0.25"/>
				<Maximum value="0.75"/>
			</OffsetY>
			<Scale source="slidercontrol 03" value="0.54000000000000004">
				<Minimum value="0.01"/>
				<Maximum value="0.5"/>
			</Scale>
			<InnerRepeat value="20"/>
			<SpiralEffect value="true"/>
			<OuterRepeat value="2"/>
			<Rotation source="slidercontrol 04" value="0.56999999999999995">
				<Minimum value="0"/>
				<Maximum value="1"/>
			</Rotation>
			<ReverseOrder value="false"/>
		</ScriptMap01>
		<Image2 id="image2 02">
			<ScalingMode value="0"/>
		</Image2>
		<SliderControl id="slidercontrol 01">
			<Name value-en="Offset X"/>
			<UseRemapping value="true"/>
			<Value value="0.5"/>
		</SliderControl>
		<SliderControl id="slidercontrol 02">
			<Name value-en="Offset Y"/>
			<UseRemapping value="true"/>
			<Value value="0.5"/>
		</SliderControl>
		<SliderControl id="slidercontrol 03">
			<Name value-en="Scale"/>
			<UseRemapping value="true"/>
			<Value value="0.5"/>
		</SliderControl>
		<SliderControl id="slidercontrol 04">
			<Name value-en="Rotation"/>
			<UseRemapping value="false"/>
			<Value value="0.65000000000000002"/>
		</SliderControl>
	</Components>
	<SettingsOverride>
		<Size value="1"/>
		<Variation value="0"/>
		<Seamless value="0"/>
		<ResultBlending value="0"/>
	</SettingsOverride>
	<Presets>
		<DefaultPreset>
			<Settings size_factor="1" variation="1" seamless="false" antialiasing="2" map_type="0" edges_only="true" clip_hdr_for_result="true"/>
			<Lighting>
				<Height value="0.20000000000000001"/>
				<Environment>
					<Source value=""/>
					<Brightness value="1"/>
					<Saturation value="1"/>
					<Rotation value="0"/>
					<RotationAxis x="0" y="0" z="0"/>
				</Environment>
				<Ambience>
					<AmbientLight red="0" green="0" blue="0"/>
					<Shadowing value="0"/>
					<CurrentOcclusionSettings>
						<RayDirections value="4"/>
						<TraceDistance value="0.20000000000000001"/>
						<RayJittering value="true"/>
						<RayBounce value="true"/>
						<AvoidStreaks value="true"/>
						<DirectSamples value="0"/>
						<ROQuality value="3"/>
					</CurrentOcclusionSettings>
					<CustomOcclusionSettings>
						<RayDirections value="16"/>
						<TraceDistance value="0.29999999999999999"/>
						<RayJittering value="true"/>
						<RayBounce value="true"/>
						<AvoidStreaks value="true"/>
						<DirectSamples value="1"/>
						<ROQuality value="10"/>
					</CustomOcclusionSettings>
					<ArtisticSettings>
						<BlackPoint value="0"/>
						<Midtones value="0.5"/>
						<WhitePoint value="1"/>
					</ArtisticSettings>
				</Ambience>
			</Lighting>
			<Controls>
				<SliderControl id="slidercontrol 01">
					<Value value="0.5"/>
				</SliderControl>
				<SliderControl id="slidercontrol 02">
					<Value value="0.5"/>
				</SliderControl>
				<SliderControl id="slidercontrol 03">
					<Value value="0.5"/>
				</SliderControl>
				<SliderControl id="slidercontrol 04">
					<Value value="0.65000000000000002"/>
				</SliderControl>
			</Controls>
		</DefaultPreset>
	</Presets>
	<Information author="Egret" name-en="Droste Spiral" url="" description="" keywords="" update_notes="" major_version="2" minor_version="6"/>
	<ControlsOrder>
		<Automatic value="true"/>
	</ControlsOrder>
	<FilterEditor>
		<ThumbnailSize value="1"/>
		<Canvas left="-507" top="-333" zoom_factor="0"/>
		<Viewport left="0" top="0" zoom_factor="-2"/>
		<LockPreview>
			<Locked value="true"/>
			<LockedComponent name="scriptmap01 01"/>
		</LockPreview>
		<Item id="image2 02">
			<Position left="-16" top="-304"/>
		</Item>
		<Item id="result">
			<Position left="-512" top="-144"/>
		</Item>
		<Item id="scriptmap01 01">
			<Position left="-320" top="-144"/>
		</Item>
		<Item id="slidercontrol 01">
			<Position left="208" top="-160"/>
		</Item>
		<Item id="slidercontrol 02">
			<Position left="208" top="-96"/>
		</Item>
		<Item id="slidercontrol 03">
			<Position left="208" top="0"/>
		</Item>
		<Item id="slidercontrol 04">
			<Position left="208" top="64"/>
		</Item>
	</FilterEditor>
</Filter>

