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  * TransfDEControlsIteration
10  *
11  */
12 
13 #include "all_fractal_definitions.h"
14 
cFractalTransfDEControls()15 cFractalTransfDEControls::cFractalTransfDEControls() : cAbstractFractal()
16 {
17 	nameInComboBox = "T>DE Controls";
18 	internalName = "transf_de_controls";
19 	internalID = fractal::transfDEControls;
20 	DEType = analyticDEType;
21 	DEFunctionType = customDEFunction;
22 	cpixelAddition = cpixelDisabledByDefault;
23 	defaultBailout = 100.0;
24 	DEAnalyticFunction = analyticFunctionCustomDE;
25 	coloringFunction = coloringFunctionDefault;
26 }
27 
FormulaCode(CVector4 & z,const sFractal * fractal,sExtendedAux & aux)28 void cFractalTransfDEControls::FormulaCode(CVector4 &z, const sFractal *fractal, sExtendedAux &aux)
29 {
30 	double colorAdd = 0.0;
31 	double rd = 0.0;
32 	CVector4 tZ;
33 	// distance functions
34 	switch (fractal->combo4.combo4)
35 	{
36 		case multi_combo4_type1:
37 		default: rd = aux.DE0; break;
38 		case multi_combo4_type2:
39 			tZ = fabs(z);
40 			rd = max(tZ.x, max(tZ.y, tZ.z)); // infnorm
41 			break;
42 		case multi_combo4_type3:
43 			tZ = z * z;
44 			rd = max(sqrt(tZ.x + tZ.y), max(sqrt(tZ.y + tZ.z), sqrt(tZ.z + tZ.x)));
45 			break;
46 		case multi_combo4_type4:
47 			rd = z.Length(); // eucli norm
48 			break;
49 	}
50 	// tweaks
51 	rd += fractal->transformCommon.offset0;
52 	aux.DE += fractal->analyticDE.offset0;
53 
54 	// out distance functions
55 	if (fractal->transformCommon.functionEnabledAy)
56 	{
57 		rd = rd / aux.DE; // same as an uncondtional aux.dist
58 	}
59 	if (fractal->transformCommon.functionEnabledBFalse)
60 	{
61 		double rxy = sqrt(z.x * z.x + z.y * z.y);
62 		double pkD = max(rxy -fractal->transformCommon.offsetA1, fabs(rxy * z.z) / rd);
63 		rd = pkD / aux.DE;
64 	}
65 	if (fractal->transformCommon.functionEnabledCFalse)
66 	{
67 		rd = 0.5 * rd * log(rd) / aux.DE;
68 	}
69 
70 	if (fractal->transformCommon.functionEnabledMFalse)
71 	{
72 		double mixA;
73 		double mixB;
74 		double rxy;
75 		switch (fractal->combo3.combo3)
76 		{
77 			case multi_combo3_type1:
78 			default:
79 				mixA = rd;
80 				mixB = 0.5 * rd * log(rd);
81 				break;
82 			case multi_combo3_type2:
83 				rxy = sqrt(z.x * z.x + z.y * z.y);
84 				mixA = max(rxy - fractal->transformCommon.offsetA1, fabs(rxy * z.z) / rd);
85 				mixB = rd;
86 				break;
87 			case multi_combo3_type3:
88 				mixA = 0.5 * rd * log(rd);
89 				rxy = sqrt(z.x * z.x + z.y * z.y);
90 				mixB = max(rxy - fractal->transformCommon.offsetA1, fabs(rxy * z.z) / rd);
91 				break;
92 		}
93 		rd = (mixA + (mixB - mixA) * fractal->transformCommon.scale1) / aux.DE;
94 	}
95 	double colorDist = aux.dist;
96 	if (!fractal->transformCommon.functionEnabledFalse)
97 	{
98 		aux.colorHybrid = rd; // aux.colorHybrid temp
99 	}
100 	else
101 	{
102 		int tempC = fractal->transformCommon.int3X;
103 		if (aux.i < tempC || rd < aux.colorHybrid)
104 		{
105 			aux.colorHybrid = rd;
106 		}
107 	}
108 	aux.dist = aux.colorHybrid;
109 
110 	// aux.color
111 	if (fractal->foldColor.auxColorEnabled)
112 	{
113 		if (fractal->foldColor.auxColorEnabledFalse)
114 		{
115 			colorAdd += fractal->foldColor.difs0000.x * fabs(z.x * z.y); // fabs(zc.x * zc.y)
116 			colorAdd += fractal->foldColor.difs0000.y * max(z.x, z.y);	 // max(z.x, z.y);
117 			colorAdd += fractal->foldColor.difs0000.z * (z.x * z.x + z.y * z.y);
118 			// colorAdd += fractal->foldColor.difs0000.w * fabs(zc.x * zc.y);
119 		}
120 		colorAdd += fractal->foldColor.difs1;
121 		if (fractal->foldColor.auxColorEnabledA)
122 		{
123 			if (colorDist != aux.dist) aux.color += colorAdd;
124 		}
125 		else
126 			aux.color += colorAdd;
127 	}
128 }
129