/** * Mandelbulber v2, a 3D fractal generator _%}}i*<. ______ * Copyright (C) 2020 Mandelbulber Team _>]|=||i=i<, / ____/ __ __ * \><||i|=>>%) / / __/ /___/ /_ * This file is part of Mandelbulber. )<=i=]=|=i<> / /__ /_ __/_ __/ * The project is licensed under GPLv3, -<>>=|><|||` \____/ /_/ /_/ * see also COPYING file in this folder. ~+{i%+++ * * amazing surf Mod4 based on Mandelbulber3D. Formula proposed by Kali, with features added by * DarkBeam * This formula has a c.x c.y SWAP * @reference * http://www.fractalforums.com/mandelbulb-3d/custom-formulas-and-transforms-release-t17106/ */ #include "all_fractal_definitions.h" cFractalAmazingSurfMod4::cFractalAmazingSurfMod4() : cAbstractFractal() { nameInComboBox = "Amazing Surf - Mod 4"; internalName = "amazing_surf_mod4"; internalID = fractal::amazingSurfMod4; DEType = analyticDEType; DEFunctionType = linearDEFunction; cpixelAddition = cpixelEnabledByDefault; defaultBailout = 100.0; DEAnalyticFunction = analyticFunctionLinear; coloringFunction = coloringFunctionDefault; } void cFractalAmazingSurfMod4::FormulaCode(CVector4 &z, const sFractal *fractal, sExtendedAux &aux) { CVector4 c = aux.const_c; double colorAdd = 0.0; // sphere inversion if (fractal->transformCommon.sphereInversionEnabledFalse && aux.i >= fractal->transformCommon.startIterationsX && aux.i < fractal->transformCommon.stopIterations1) { z += fractal->transformCommon.offset000; double rr = z.Dot(z); z *= fractal->transformCommon.scaleG1 / rr; aux.DE *= (fractal->transformCommon.scaleG1 / rr); z += fractal->transformCommon.additionConstant000 - fractal->transformCommon.offset000; z *= fractal->transformCommon.scaleA1; aux.DE *= fractal->transformCommon.scaleA1; } CVector4 oldZ = z; z.x = fabs(z.x + fractal->transformCommon.additionConstant111.x) - fabs(z.x - fractal->transformCommon.additionConstant111.x) - z.x; z.y = fabs(z.y + fractal->transformCommon.additionConstant111.y) - fabs(z.y - fractal->transformCommon.additionConstant111.y) - z.y; if (fractal->transformCommon.functionEnabledJFalse) z.z = fabs(z.z + fractal->transformCommon.additionConstant111.z) - fabs(z.z - fractal->transformCommon.additionConstant111.z) - z.z; CVector4 zCol = z; z += fractal->transformCommon.offsetA000; double rr = z.Dot(z); double rrCol = rr; double MinRR = fractal->transformCommon.minR2p25; double dividend = rr < MinRR ? MinRR : min(rr, 1.0); // scale double useScale = 1.0; useScale = (aux.actualScaleA + fractal->transformCommon.scale2) / dividend; z *= useScale; aux.DE = aux.DE * fabs(useScale) + fractal->analyticDE.offset1; if (fractal->transformCommon.functionEnabledKFalse) { // update actualScaleA for next iteration double vary = fractal->transformCommon.scaleVary0 * (fabs(aux.actualScaleA) - fractal->transformCommon.scaleC1); aux.actualScaleA -= vary; } if (fractal->transformCommon.rotation2EnabledFalse) { z = fractal->transformCommon.rotationMatrix.RotateVector(z); } if (fractal->transformCommon.addCpixelEnabledFalse) z += CVector4(c.y, c.x, c.z, c.w) * fractal->transformCommon.constantMultiplier111; z += fractal->transformCommon.additionConstantA000; z = fractal->transformCommon.rotationMatrix2.RotateVector(z); if (fractal->foldColor.auxColorEnabledFalse) { if (zCol.x != oldZ.x) colorAdd += fractal->mandelbox.color.factor.x * (fabs(zCol.x) - fractal->transformCommon.additionConstant111.x); if (zCol.y != oldZ.y) colorAdd += fractal->mandelbox.color.factor.y * (fabs(zCol.y) - fractal->transformCommon.additionConstant111.y); if (zCol.z != oldZ.z) colorAdd += fractal->mandelbox.color.factor.z * (fabs(zCol.z) - fractal->transformCommon.additionConstant111.z); if (rrCol > fractal->transformCommon.minR2p25) colorAdd += fractal->mandelbox.color.factorSp2 * (rrCol - fractal->transformCommon.minR2p25) / 100.0; aux.color += colorAdd; } }