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 * based on darkbeams _PartlyJuiliaRoff transform from Mandelbulb3D.
10 */
11
12 #include "all_fractal_definitions.h"
13
cFractalTransfAddConstantMod3()14 cFractalTransfAddConstantMod3::cFractalTransfAddConstantMod3() : cAbstractFractal()
15 {
16 nameInComboBox = "T>Add Constant Mod3";
17 internalName = "transf_add_constant_mod3";
18 internalID = fractal::transfAddConstantMod3;
19 DEType = analyticDEType;
20 DEFunctionType = withoutDEFunction;
21 cpixelAddition = cpixelDisabledByDefault;
22 defaultBailout = 100.0;
23 DEAnalyticFunction = analyticFunctionNone;
24 coloringFunction = coloringFunctionDefault;
25 }
26
FormulaCode(CVector4 & z,const sFractal * fractal,sExtendedAux & aux)27 void cFractalTransfAddConstantMod3::FormulaCode(
28 CVector4 &z, const sFractal *fractal, sExtendedAux &aux)
29 {
30 CVector4 signs = CVector4(1.0, 1.0, 1.0, 1.0);
31 signs.x *= sign(aux.const_c.x);
32 signs.y *= sign(aux.const_c.y);
33 signs.z *= sign(aux.const_c.z);
34
35 CVector4 offset = fractal->transformCommon.additionConstantA000;
36 if (fractal->transformCommon.functionEnabledDFalse) offset *= signs;
37
38 CVector4 t;
39 if (!fractal->transformCommon.functionEnabledBFalse) t = aux.const_c - offset;
40 else t = z - offset;
41
42 double r;
43 if (!fractal->transformCommon.functionEnabledAFalse) r = t.Length();
44 else r = t.Dot(t);
45
46 CVector4 offset1 = fractal->transformCommon.offset000;
47 if (fractal->transformCommon.functionEnabledCFalse) offset1 *= signs;
48
49 double m = (1.0 - fractal->transformCommon.radius1 / r) * fractal->transformCommon.scale1;
50
51 if (r > fractal->transformCommon.radius1)
52 {
53 offset1 = offset1 + t * m;
54 z += offset1;
55 }
56
57 if (fractal->transformCommon.functionEnabledPFalse
58 && aux.i >= fractal->transformCommon.startIterationsP
59 && aux.i < fractal->transformCommon.stopIterationsP)
60 {
61 if (fractal->transformCommon.functionEnabledAx) z.x = fabs(z.x);
62 if (fractal->transformCommon.functionEnabledAy) z.y = fabs(z.y);
63 if (fractal->transformCommon.functionEnabledAz) z.z = fabs(z.z);
64 }
65 }
66