1/**
2 * Mandelbulber v2, a 3D fractal generator  _%}}i*<.        ____                _______
3 * Copyright (C) 2020 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 * Modified Mandelbox (ABox) formula
10 * This formula contains aux.color and aux.actualScaleA
11
12 * This file has been autogenerated by tools/populateUiInformation.php
13 * from the file "fractal_fold_box_mod1.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 FoldBoxMod1Iteration(REAL4 z, __constant sFractalCl *fractal, sExtendedAuxCl *aux)
18{
19	REAL colorAdd = 0.0f;
20	if (aux->i >= fractal->transformCommon.startIterations
21			&& aux->i < fractal->transformCommon.stopIterations)
22	{
23		REAL4 tempA = (REAL4){0.0f, 0.0f, 0.0f, 0.0f};
24		REAL4 tempB = (REAL4){0.0f, 0.0f, 0.0f, 0.0f};
25
26		REAL4 oldZ = z;
27		if (fractal->transformCommon.functionEnabledx)
28			tempA.x = fabs(z.x + fractal->transformCommon.additionConstant111.x);
29		if (fractal->transformCommon.functionEnabledAx)
30			tempB.x = fabs(z.x - fractal->transformCommon.additionConstantA111.x);
31		z.x = tempA.x - tempB.x - (z.x * fractal->transformCommon.scale3D111.x);
32
33		if (fractal->transformCommon.functionEnabledy)
34			tempA.y = fabs(z.y + fractal->transformCommon.additionConstant111.y);
35		if (fractal->transformCommon.functionEnabledAy)
36			tempB.y = fabs(z.y - fractal->transformCommon.additionConstantA111.y);
37		z.y = tempA.y - tempB.y - (z.y * fractal->transformCommon.scale3D111.y);
38
39		if (fractal->transformCommon.functionEnabledz)
40			tempA.z = fabs(z.z + fractal->transformCommon.additionConstant111.z);
41		if (fractal->transformCommon.functionEnabledAz)
42			tempB.z = fabs(z.z - fractal->transformCommon.additionConstantA111.z);
43		z.z = tempA.z - tempB.z - (z.z * fractal->transformCommon.scale3D111.z);
44		if (z.x != oldZ.x) colorAdd += fractal->mandelbox.color.factor.x;
45		if (z.y != oldZ.y) colorAdd += fractal->mandelbox.color.factor.y;
46		if (z.z != oldZ.z) colorAdd += fractal->mandelbox.color.factor.z;
47	}
48
49	if (fractal->transformCommon.functionEnabledFalse
50			&& aux->i >= fractal->transformCommon.startIterationsA
51			&& aux->i < fractal->transformCommon.stopIterationsA) // box fold
52	{
53		if (fabs(z.x) > fractal->mandelbox.foldingLimit)
54		{
55			z.x = sign(z.x) * fractal->mandelbox.foldingValue - z.x;
56			colorAdd += fractal->mandelbox.color.factor.x;
57		}
58		if (fabs(z.y) > fractal->mandelbox.foldingLimit)
59		{
60			z.y = sign(z.y) * fractal->mandelbox.foldingValue - z.y;
61			colorAdd += fractal->mandelbox.color.factor.y;
62		}
63		REAL zLimit = fractal->mandelbox.foldingLimit * fractal->transformCommon.scale1;
64		REAL zValue = fractal->mandelbox.foldingValue * fractal->transformCommon.scale1;
65		if (fabs(z.z) > zLimit)
66		{
67			z.z = sign(z.z) * zValue - z.z;
68			colorAdd += fractal->mandelbox.color.factor.z;
69		}
70	}
71
72	if (aux->i >= fractal->transformCommon.startIterationsB
73			&& aux->i < fractal->transformCommon.stopIterationsB) // spherical fold
74	{
75		REAL r2 = dot(z, z);
76		// if (r2 < 1e-21f && r2 > -1e-21f)
77		//	r2 = (r2 > 0) ? 1e-21f : -1e-21f;
78		if (r2 < fractal->mandelbox.mR2)
79		{
80			z *= fractal->mandelbox.mboxFactor1;
81			aux->DE *= fractal->mandelbox.mboxFactor1;
82			colorAdd += fractal->mandelbox.color.factorSp1;
83		}
84		else if (r2 < fractal->mandelbox.fR2)
85		{
86			REAL tglad_factor2 = fractal->mandelbox.fR2 / r2;
87			z *= tglad_factor2;
88			aux->DE *= tglad_factor2;
89			colorAdd += fractal->mandelbox.color.factorSp2;
90		}
91	}
92
93	// scale
94	if (fractal->transformCommon.functionEnabledXFalse
95			&& aux->i >= fractal->transformCommon.startIterationsD
96			&& aux->i < fractal->transformCommon.stopIterationsD)
97	{
98		REAL useScale = aux->actualScaleA + fractal->mandelbox.scale;
99		z *= useScale;
100		aux->DE = aux->DE * fabs(useScale) + 1.0f;
101
102		// update actualScale for next iteration
103		REAL vary = fractal->transformCommon.scaleVary0
104								* (fabs(aux->actualScaleA) - fractal->transformCommon.scaleB1);
105		if (fractal->transformCommon.functionEnabledMFalse)
106			aux->actualScaleA = -vary;
107		else
108			aux->actualScaleA = aux->actualScaleA - vary;
109	}
110	else
111	{
112		z *= fractal->mandelbox.scale;
113		aux->DE = aux->DE * fabs(fractal->mandelbox.scale) + 1.0f;
114	}
115	if (fractal->mandelbox.mainRotationEnabled && aux->i >= fractal->transformCommon.startIterationsC
116			&& aux->i < fractal->transformCommon.stopIterationsC)
117		z = Matrix33MulFloat4(fractal->mandelbox.mainRot, z);
118
119	// color updated v2.14
120	if (fractal->foldColor.auxColorEnabled)
121	{
122		aux->color += colorAdd;
123	}
124	return z;
125}