1/**
2 * Mandelbulber v2, a 3D fractal generator  _%}}i*<.        ____                _______
3 * Copyright (C) 2021 Mandelbulber Team   _>]|=||i=i<,     / __ \___  ___ ___  / ___/ /
4 *                                        \><||i|=>>%)    / /_/ / _ \/ -_) _ \/ /__/ /__
5 * This file is part of Mandelbulber.     )<=i=]=|=i<>    \____/ .__/\__/_//_/\___/____/
6 * The project is licensed under GPLv3,   -<>>=|><|||`        /_/
7 * see also COPYING file in this folder.    ~+{i%+++
8 *
9 * DifsPrismIteration  fragmentarium code, mdifs by knighty (jan 2012)
10 * and http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm
11
12 * This file has been autogenerated by tools/populateUiInformation.php
13 * from the file "fractal_difs_prism.cpp" in the folder formula/definition
14 * D O    N O T    E D I T    T H I S    F I L E !
15 */
16
17REAL4 DIFSPrismIteration(REAL4 z, __constant sFractalCl *fractal, sExtendedAuxCl *aux)
18{
19	REAL colorAdd = 0.0f;
20	REAL4 oldZ = z;
21	REAL4 boxFold = fractal->transformCommon.additionConstantA111;
22
23	// abs z
24	if (fractal->transformCommon.functionEnabledAx
25			&& aux->i >= fractal->transformCommon.startIterationsX
26			&& aux->i < fractal->transformCommon.stopIterationsX)
27		z.x = fabs(z.x);
28	if (fractal->transformCommon.functionEnabledAy
29			&& aux->i >= fractal->transformCommon.startIterationsY
30			&& aux->i < fractal->transformCommon.stopIterationsY)
31		z.y = fabs(z.y);
32	if (fractal->transformCommon.functionEnabledAzFalse
33			&& aux->i >= fractal->transformCommon.startIterationsZ
34			&& aux->i < fractal->transformCommon.stopIterationsZ)
35		z.z = fabs(z.z);
36	// folds
37	if (fractal->transformCommon.functionEnabledFalse)
38	{
39		// xy box fold
40		if (fractal->transformCommon.functionEnabledAFalse
41				&& aux->i >= fractal->transformCommon.startIterationsA
42				&& aux->i < fractal->transformCommon.stopIterationsA)
43		{
44			z.x -= boxFold.x;
45			z.y -= boxFold.y;
46		}
47		// xyz box fold
48		if (fractal->transformCommon.functionEnabledBFalse
49				&& aux->i >= fractal->transformCommon.startIterationsB
50				&& aux->i < fractal->transformCommon.stopIterationsB)
51			z -= boxFold;
52		// polyfold
53		if (fractal->transformCommon.functionEnabledPFalse
54				&& aux->i >= fractal->transformCommon.startIterationsP
55				&& aux->i < fractal->transformCommon.stopIterationsP)
56		{
57			z.x = fabs(z.x);
58			REAL psi = M_PI_F / fractal->transformCommon.int6;
59			psi = fabs(fmod(atan2(z.y, z.x) + psi, 2.0f * psi) - psi);
60			REAL len = native_sqrt(z.x * z.x + z.y * z.y);
61			z.x = native_cos(psi) * len;
62			z.y = native_sin(psi) * len;
63		}
64		// diag fold1
65		if (fractal->transformCommon.functionEnabledCxFalse
66				&& aux->i >= fractal->transformCommon.startIterationsCx
67				&& aux->i < fractal->transformCommon.stopIterationsCx)
68			if (z.x > z.y)
69			{
70				REAL temp = z.x;
71				z.x = z.y;
72				z.y = temp;
73			}
74		// abs offsets
75		if (fractal->transformCommon.functionEnabledCFalse
76				&& aux->i >= fractal->transformCommon.startIterationsC
77				&& aux->i < fractal->transformCommon.stopIterationsC)
78		{
79			REAL xOffset = fractal->transformCommon.offsetC0;
80			if (z.x < xOffset) z.x = fabs(z.x - xOffset) + xOffset;
81		}
82		if (fractal->transformCommon.functionEnabledDFalse
83				&& aux->i >= fractal->transformCommon.startIterationsD
84				&& aux->i < fractal->transformCommon.stopIterationsD)
85		{
86			REAL yOffset = fractal->transformCommon.offsetD0;
87			if (z.y < yOffset) z.y = fabs(z.y - yOffset) + yOffset;
88		}
89		// diag fold2
90		if (fractal->transformCommon.functionEnabledCyFalse
91				&& aux->i >= fractal->transformCommon.startIterationsCy
92				&& aux->i < fractal->transformCommon.stopIterationsCy)
93			if (z.x > z.y)
94			{
95				REAL temp = z.x;
96				z.x = z.y;
97				z.y = temp;
98			}
99	}
100
101	// reverse offset part 1
102	if (aux->i >= fractal->transformCommon.startIterationsE
103			&& aux->i < fractal->transformCommon.stopIterationsE)
104		z.x -= fractal->transformCommon.offsetE2;
105
106	if (aux->i >= fractal->transformCommon.startIterationsF
107			&& aux->i < fractal->transformCommon.stopIterationsF)
108		z.y -= fractal->transformCommon.offsetF2;
109
110	// scale
111	REAL useScale = 1.0f;
112	if (aux->i >= fractal->transformCommon.startIterationsS
113			&& aux->i < fractal->transformCommon.stopIterationsS)
114	{
115		useScale = aux->actualScaleA + fractal->transformCommon.scale2;
116		z *= useScale;
117		aux->DE = aux->DE * fabs(useScale) + 1.0f;
118		// scale vary
119		if (fractal->transformCommon.functionEnabledKFalse
120				&& aux->i >= fractal->transformCommon.startIterationsK
121				&& aux->i < fractal->transformCommon.stopIterationsK)
122		{
123			// update actualScaleA for next iteration
124			REAL vary = fractal->transformCommon.scaleVary0
125									* (fabs(aux->actualScaleA) - fractal->transformCommon.scaleC1);
126			aux->actualScaleA -= vary;
127		}
128	}
129
130	// reverse offset part 2
131	if (aux->i >= fractal->transformCommon.startIterationsE
132			&& aux->i < fractal->transformCommon.stopIterationsE)
133		z.x += fractal->transformCommon.offsetE2;
134
135	if (aux->i >= fractal->transformCommon.startIterationsF
136			&& aux->i < fractal->transformCommon.stopIterationsF)
137		z.y += fractal->transformCommon.offsetF2;
138
139	// offset
140	z += fractal->transformCommon.offset001;
141
142	// rotation
143	if (fractal->transformCommon.functionEnabledRFalse
144			&& aux->i >= fractal->transformCommon.startIterationsR
145			&& aux->i < fractal->transformCommon.stopIterationsR)
146	{
147		z = Matrix33MulFloat4(fractal->transformCommon.rotationMatrix, z);
148	}
149
150	// DE
151	REAL colorDist = aux->dist;
152	REAL4 zc = oldZ;
153
154	if (aux->i >= fractal->transformCommon.startIterations
155			&& aux->i < fractal->transformCommon.stopIterations)
156	{
157		REAL tp;
158		REAL len = fractal->transformCommon.offset1;
159		REAL face = fractal->transformCommon.offset05;
160
161		// swap axis
162		if (fractal->transformCommon.functionEnabledSwFalse)
163		{
164			REAL temp = zc.x;
165			zc.x = zc.z;
166			zc.z = temp;
167		}
168
169		REAL4 absZ = fabs(zc);
170
171		if (fractal->transformCommon.functionEnabledMFalse
172				&& aux->i >= fractal->transformCommon.startIterationsM
173				&& aux->i < fractal->transformCommon.stopIterationsM)
174		{
175			tp = absZ.z;
176			if (fractal->transformCommon.functionEnabledBxFalse) tp *= tp;
177
178			zc.y += tp * fractal->transformCommon.scale0;
179		}
180
181		if (fractal->transformCommon.functionEnabledNFalse
182				&& aux->i >= fractal->transformCommon.startIterationsN
183				&& aux->i < fractal->transformCommon.stopIterationsN)
184		{
185			tp = absZ.z;
186			if (fractal->transformCommon.functionEnabledByFalse) tp *= tp;
187			len += tp * fractal->transformCommon.scaleA0;
188		}
189
190		if (fractal->transformCommon.functionEnabledOFalse
191				&& aux->i >= fractal->transformCommon.startIterationsO
192				&& aux->i < fractal->transformCommon.stopIterationsO)
193		{
194			tp = absZ.z;
195			if (fractal->transformCommon.functionEnabledBzFalse) tp *= tp;
196			face += tp * fractal->transformCommon.scaleB0;
197		}
198
199		REAL priD = max(fabs(zc.x) - len, max(fabs(zc.y) * SQRT_3_4_F + zc.z * 0.5f, -zc.z) - face);
200
201		aux->dist = min(aux->dist, priD / aux->DE);
202	}
203
204	// aux->color
205	if (fractal->foldColor.auxColorEnabled)
206	{
207		if (fractal->foldColor.auxColorEnabledFalse)
208		{
209			colorAdd += fractal->foldColor.difs0000.x * fabs(z.x * z.y);
210			colorAdd += fractal->foldColor.difs0000.y * max(z.x, z.y);
211		}
212		colorAdd += fractal->foldColor.difs1;
213		if (fractal->foldColor.auxColorEnabledA)
214		{
215			if (colorDist != aux->dist) aux->color += colorAdd;
216		}
217		else
218			aux->color += colorAdd;
219	}
220	return z;
221}