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 * Modified Mandelbox (ABox) formula 10 * This formula contains aux.color and aux.actualScaleA 11 12 * This file has been autogenerated by tools/populateUiInformation.php 13 * from the file "fractal_fold_box_mod1.cpp" in the folder formula/definition 14 * D O N O T E D I T T H I S F I L E ! 15 */ 16 17REAL4 FoldBoxMod1Iteration(REAL4 z, __constant sFractalCl *fractal, sExtendedAuxCl *aux) 18{ 19 REAL colorAdd = 0.0f; 20 if (aux->i >= fractal->transformCommon.startIterations 21 && aux->i < fractal->transformCommon.stopIterations) 22 { 23 REAL4 tempA = (REAL4){0.0f, 0.0f, 0.0f, 0.0f}; 24 REAL4 tempB = (REAL4){0.0f, 0.0f, 0.0f, 0.0f}; 25 26 REAL4 oldZ = z; 27 if (fractal->transformCommon.functionEnabledx) 28 tempA.x = fabs(z.x + fractal->transformCommon.additionConstant111.x); 29 if (fractal->transformCommon.functionEnabledAx) 30 tempB.x = fabs(z.x - fractal->transformCommon.additionConstantA111.x); 31 z.x = tempA.x - tempB.x - (z.x * fractal->transformCommon.scale3D111.x); 32 33 if (fractal->transformCommon.functionEnabledy) 34 tempA.y = fabs(z.y + fractal->transformCommon.additionConstant111.y); 35 if (fractal->transformCommon.functionEnabledAy) 36 tempB.y = fabs(z.y - fractal->transformCommon.additionConstantA111.y); 37 z.y = tempA.y - tempB.y - (z.y * fractal->transformCommon.scale3D111.y); 38 39 if (fractal->transformCommon.functionEnabledz) 40 tempA.z = fabs(z.z + fractal->transformCommon.additionConstant111.z); 41 if (fractal->transformCommon.functionEnabledAz) 42 tempB.z = fabs(z.z - fractal->transformCommon.additionConstantA111.z); 43 z.z = tempA.z - tempB.z - (z.z * fractal->transformCommon.scale3D111.z); 44 if (z.x != oldZ.x) colorAdd += fractal->mandelbox.color.factor.x; 45 if (z.y != oldZ.y) colorAdd += fractal->mandelbox.color.factor.y; 46 if (z.z != oldZ.z) colorAdd += fractal->mandelbox.color.factor.z; 47 } 48 49 if (fractal->transformCommon.functionEnabledFalse 50 && aux->i >= fractal->transformCommon.startIterationsA 51 && aux->i < fractal->transformCommon.stopIterationsA) // box fold 52 { 53 if (fabs(z.x) > fractal->mandelbox.foldingLimit) 54 { 55 z.x = sign(z.x) * fractal->mandelbox.foldingValue - z.x; 56 colorAdd += fractal->mandelbox.color.factor.x; 57 } 58 if (fabs(z.y) > fractal->mandelbox.foldingLimit) 59 { 60 z.y = sign(z.y) * fractal->mandelbox.foldingValue - z.y; 61 colorAdd += fractal->mandelbox.color.factor.y; 62 } 63 REAL zLimit = fractal->mandelbox.foldingLimit * fractal->transformCommon.scale1; 64 REAL zValue = fractal->mandelbox.foldingValue * fractal->transformCommon.scale1; 65 if (fabs(z.z) > zLimit) 66 { 67 z.z = sign(z.z) * zValue - z.z; 68 colorAdd += fractal->mandelbox.color.factor.z; 69 } 70 } 71 72 if (aux->i >= fractal->transformCommon.startIterationsB 73 && aux->i < fractal->transformCommon.stopIterationsB) // spherical fold 74 { 75 REAL r2 = dot(z, z); 76 // if (r2 < 1e-21f && r2 > -1e-21f) 77 // r2 = (r2 > 0) ? 1e-21f : -1e-21f; 78 if (r2 < fractal->mandelbox.mR2) 79 { 80 z *= fractal->mandelbox.mboxFactor1; 81 aux->DE *= fractal->mandelbox.mboxFactor1; 82 colorAdd += fractal->mandelbox.color.factorSp1; 83 } 84 else if (r2 < fractal->mandelbox.fR2) 85 { 86 REAL tglad_factor2 = fractal->mandelbox.fR2 / r2; 87 z *= tglad_factor2; 88 aux->DE *= tglad_factor2; 89 colorAdd += fractal->mandelbox.color.factorSp2; 90 } 91 } 92 93 // scale 94 if (fractal->transformCommon.functionEnabledXFalse 95 && aux->i >= fractal->transformCommon.startIterationsD 96 && aux->i < fractal->transformCommon.stopIterationsD) 97 { 98 REAL useScale = aux->actualScaleA + fractal->mandelbox.scale; 99 z *= useScale; 100 aux->DE = aux->DE * fabs(useScale) + 1.0f; 101 102 // update actualScale for next iteration 103 REAL vary = fractal->transformCommon.scaleVary0 104 * (fabs(aux->actualScaleA) - fractal->transformCommon.scaleB1); 105 if (fractal->transformCommon.functionEnabledMFalse) 106 aux->actualScaleA = -vary; 107 else 108 aux->actualScaleA = aux->actualScaleA - vary; 109 } 110 else 111 { 112 z *= fractal->mandelbox.scale; 113 aux->DE = aux->DE * fabs(fractal->mandelbox.scale) + 1.0f; 114 } 115 if (fractal->mandelbox.mainRotationEnabled && aux->i >= fractal->transformCommon.startIterationsC 116 && aux->i < fractal->transformCommon.stopIterationsC) 117 z = Matrix33MulFloat4(fractal->mandelbox.mainRot, z); 118 119 // color updated v2.14 120 if (fractal->foldColor.auxColorEnabled) 121 { 122 aux->color += colorAdd; 123 } 124 return z; 125}