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 surf based on Mandelbulber3D. Formula proposed by Kali, with features added by 10 * DarkBeam 11 * @reference 12 * http://www.fractalforums.com/mandelbulb-3d/custom-formulas-and-transforms-release-t17106/ 13 */ 14 15 #include "all_fractal_definitions.h" 16 cFractalAmazingSurfKlein()17cFractalAmazingSurfKlein::cFractalAmazingSurfKlein() : cAbstractFractal() 18 { 19 nameInComboBox = "Amazing Surf - Klein"; 20 internalName = "amazing_surf_klein"; 21 internalID = fractal::amazingSurfKlein; 22 DEType = analyticDEType; 23 DEFunctionType = linearDEFunction; 24 cpixelAddition = cpixelDisabledByDefault; 25 defaultBailout = 100.0; 26 DEAnalyticFunction = analyticFunctionLinear; 27 coloringFunction = coloringFunctionDefault; 28 } 29 FormulaCode(CVector4 & z,const sFractal * fractal,sExtendedAux & aux)30void cFractalAmazingSurfKlein::FormulaCode(CVector4 &z, const sFractal *fractal, sExtendedAux &aux) 31 { 32 // sphere inversion 33 if (fractal->transformCommon.sphereInversionEnabledFalse 34 && aux.i >= fractal->transformCommon.startIterationsX 35 && aux.i < fractal->transformCommon.stopIterations1) 36 { 37 z += fractal->transformCommon.offset000; 38 double rr = z.Dot(z); 39 z *= fractal->transformCommon.scaleG1 / rr; 40 aux.DE *= (fractal->transformCommon.scaleG1 / rr); 41 z += fractal->transformCommon.additionConstant000 - fractal->transformCommon.offset000; 42 z *= fractal->transformCommon.scaleA1; 43 aux.DE *= fractal->transformCommon.scaleA1; 44 } 45 46 if (aux.i < fractal->transformCommon.int8X) 47 { 48 CVector4 oldZ = z; 49 z.x = fabs(z.x + fractal->transformCommon.additionConstant111.x) 50 - fabs(z.x - fractal->transformCommon.additionConstant111.x) - z.x; 51 z.y = fabs(z.y + fractal->transformCommon.additionConstant111.y) 52 - fabs(z.y - fractal->transformCommon.additionConstant111.y) - z.y; 53 54 if (fractal->transformCommon.functionEnabledSwFalse) 55 { 56 double tt = z.x; 57 z.x = z.y; 58 z.y = tt; 59 } 60 61 if (fractal->transformCommon.functionEnabledJFalse) 62 { 63 z.z = fabs(z.z + fractal->transformCommon.additionConstant111.z) 64 - fabs(z.z - fractal->transformCommon.additionConstant111.z) - z.z; 65 } 66 if (fractal->transformCommon.functionEnabledCz) 67 { 68 double tt = z.y; 69 z.y = z.z; 70 z.z = tt; 71 } 72 CVector4 zCol = z; 73 74 double rr = z.Dot(z); 75 double MinRR = fractal->transformCommon.minR0; 76 double dividend = rr < MinRR ? MinRR : min(rr, 1.0); 77 78 // scale 79 double useScale = 1.0; 80 useScale = (aux.actualScaleA + fractal->transformCommon.scale1) / dividend; 81 z *= useScale; 82 aux.DE = aux.DE * fabs(useScale) + fractal->analyticDE.offset1; 83 if (fractal->transformCommon.functionEnabledKFalse) 84 { 85 // update actualScaleA for next iteration 86 double vary = fractal->transformCommon.scaleVary0 87 * (fabs(aux.actualScaleA) - fractal->transformCommon.scaleC1); 88 aux.actualScaleA -= vary; 89 } 90 91 if (fractal->transformCommon.rotation2EnabledFalse) 92 { 93 z = fractal->transformCommon.rotationMatrix.RotateVector(z); 94 } 95 96 z += fractal->transformCommon.additionConstantA000; 97 98 if (fractal->foldColor.auxColorEnabledFalse) 99 { 100 double colorAdd = 0.0; 101 if (zCol.x != oldZ.x) 102 colorAdd += fractal->foldColor.difs0000.x 103 * (fabs(zCol.x) - fractal->transformCommon.additionConstant111.x); 104 if (zCol.y != oldZ.y) 105 colorAdd += fractal->foldColor.difs0000.y 106 * (fabs(zCol.y) - fractal->transformCommon.additionConstant111.y); 107 if (zCol.z != oldZ.z) 108 colorAdd += fractal->foldColor.difs0000.z 109 * (fabs(zCol.z) - fractal->transformCommon.additionConstant111.z); 110 colorAdd += fractal->foldColor.difs0000.w * useScale; 111 aux.color += colorAdd; 112 } 113 } 114 else 115 { 116 if (fractal->transformCommon.functionEnabled) 117 { 118 z = fabs(z + fractal->transformCommon.offset110) 119 - fabs(z - fractal->transformCommon.offset110) - z; 120 121 z *= fractal->transformCommon.scale2; 122 aux.DE *= fractal->transformCommon.scale2; 123 124 z += fractal->transformCommon.offsetA000; 125 } 126 } 127 } 128