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