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 * amazing ifs based on Mandelbulber3D. 10 * @reference 11 * http://www.fractalforums.com/mandelbulb-3d/custom-formulas-and-transforms-release-t17106/ 12 */ 13 14 #include "all_fractal_definitions.h" 15 cFractalTransfDIFSAmazingIfs()16cFractalTransfDIFSAmazingIfs::cFractalTransfDIFSAmazingIfs() : cAbstractFractal() 17 { 18 nameInComboBox = "T>DIFS Amazing IFS"; 19 internalName = "transf_difs_amazing_ifs"; 20 internalID = fractal::transfDIFSAmazingIfs; 21 DEType = analyticDEType; 22 DEFunctionType = customDEFunction; 23 cpixelAddition = cpixelDisabledByDefault; 24 defaultBailout = 100.0; 25 DEAnalyticFunction = analyticFunctionLinear; 26 coloringFunction = coloringFunctionDefault; 27 } 28 FormulaCode(CVector4 & z,const sFractal * fractal,sExtendedAux & aux)29void cFractalTransfDIFSAmazingIfs::FormulaCode(CVector4 &z, const sFractal *fractal, sExtendedAux &aux) 30 { 31 if (fractal->transformCommon.functionEnabledAFalse) 32 { 33 if (fractal->transformCommon.functionEnabledAxFalse) z.x = fabs(z.x); 34 if (fractal->transformCommon.functionEnabledAyFalse) z.y = fabs(z.y); 35 if (fractal->transformCommon.functionEnabledAzFalse) z.z = fabs(z.z); 36 } 37 38 z += fractal->transformCommon.offsetA000; 39 40 CVector4 oldZ = z; 41 z.x = fabs(z.x + fractal->transformCommon.additionConstant0555.x) 42 - fabs(z.x - fractal->transformCommon.additionConstant0555.x) - z.x; 43 z.y = fabs(z.y + fractal->transformCommon.additionConstant0555.y) 44 - fabs(z.y - fractal->transformCommon.additionConstant0555.y) - z.y; 45 if (fractal->transformCommon.functionEnabledJFalse) 46 z.z = fabs(z.z + fractal->transformCommon.additionConstant0555.z) 47 - fabs(z.z - fractal->transformCommon.additionConstant0555.z) - z.z; 48 CVector4 zCol = z; 49 50 double rr = z.Dot(z); 51 double rrCol = rr; 52 double RR = fractal->transformCommon.minR2p25; 53 if (rr < RR) 54 { 55 RR = 1.0 / RR; 56 z *= RR; 57 aux.DE *= RR; 58 } 59 else if (rr < 1.0) 60 { 61 RR = 1.0 / rr; 62 z *= RR; 63 aux.DE *= RR; 64 } 65 66 // scale 67 if (fractal->transformCommon.functionEnabledSFalse) 68 { 69 z *= fractal->transformCommon.scale015; 70 aux.DE = aux.DE * fabs(fractal->transformCommon.scale015) + fractal->analyticDE.offset0; 71 } 72 73 z = fractal->transformCommon.rotationMatrix2.RotateVector(z); 74 75 if (fractal->transformCommon.functionEnabledRFalse) 76 { 77 double temp = 0.0; 78 if (fractal->transformCommon.angleDegC != 0.0) 79 { 80 temp = z.x; 81 z.x = z.x * fractal->transformCommon.cosC - z.y * fractal->transformCommon.sinC; 82 z.y = temp * fractal->transformCommon.sinC + z.y * fractal->transformCommon.cosC; 83 } 84 if (fractal->transformCommon.angleDegB != 0.0) 85 { 86 temp = z.z; 87 z.z = z.z * fractal->transformCommon.cosB - z.x * fractal->transformCommon.sinB; 88 z.x = temp * fractal->transformCommon.sinB + z.x * fractal->transformCommon.cosB; 89 } 90 if (fractal->transformCommon.angleDegA != 0.0) 91 { 92 temp = z.y; 93 z.y = z.y * fractal->transformCommon.cosA - z.z * fractal->transformCommon.sinA; 94 z.z = temp * fractal->transformCommon.sinA + z.z * fractal->transformCommon.cosA; 95 } 96 } 97 98 // DE 99 double colorDist = aux.dist; // for color 100 aux.DE0 = z.Length() / aux.DE; 101 if (!fractal->analyticDE.enabledFalse) aux.DE0 = min(aux.dist, aux.DE0); 102 aux.dist = aux.DE0; 103 104 // aux.color 105 if (fractal->foldColor.auxColorEnabled) 106 { 107 double colorAdd = 0.0; 108 if (fractal->foldColor.auxColorEnabledA) 109 if (colorDist != aux.dist) colorAdd += fractal->foldColor.difs1; 110 111 if (fractal->foldColor.auxColorEnabledFalse) 112 { 113 if (zCol.x != oldZ.x) 114 colorAdd += fractal->foldColor.difs0000.x 115 * (fabs(zCol.x) - fractal->transformCommon.additionConstant111.x); 116 if (zCol.y != oldZ.y) 117 colorAdd += fractal->foldColor.difs0000.y 118 * (fabs(zCol.y) - fractal->transformCommon.additionConstant111.y); 119 if (zCol.z != oldZ.z) 120 colorAdd += fractal->foldColor.difs0000.z 121 * (fabs(zCol.z) - fractal->transformCommon.additionConstant111.z); 122 if (rrCol > fractal->transformCommon.minR2p25) 123 colorAdd += 124 fractal->foldColor.difs0000.w * (rrCol - fractal->transformCommon.minR2p25) / 100.0; 125 } 126 aux.color += colorAdd; 127 } 128 } 129