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