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 * Pseudo Kleinian, Knighty - Theli-at's Pseudo Kleinian (Scale 1 JuliaBox + Something 10 * @reference https://github.com/Syntopia/Fragmentarium/blob/master/ 11 * Fragmentarium-Source/Examples/Knighty%20Collection/PseudoKleinian.frag 12 * rec fold from darkbeam 13 */ 14 15 #include "all_fractal_definitions.h" 16 cFractalPseudoKleinianMod4()17cFractalPseudoKleinianMod4::cFractalPseudoKleinianMod4() : cAbstractFractal() 18 { 19 nameInComboBox = "Pseudo Kleinian - Mod 4"; 20 internalName = "pseudo_kleinian_mod4"; 21 internalID = fractal::pseudoKleinianMod4; 22 DEType = analyticDEType; 23 DEFunctionType = pseudoKleinianDEFunction; 24 cpixelAddition = cpixelDisabledByDefault; 25 defaultBailout = 100.0; 26 DEAnalyticFunction = analyticFunctionPseudoKleinian; 27 coloringFunction = coloringFunctionDefault; 28 } 29 FormulaCode(CVector4 & z,const sFractal * fractal,sExtendedAux & aux)30void cFractalPseudoKleinianMod4::FormulaCode( 31 CVector4 &z, const sFractal *fractal, sExtendedAux &aux) 32 { 33 double colorAdd = 0.0; 34 35 // sphere inversion 36 if (fractal->transformCommon.sphereInversionEnabledFalse 37 && aux.i >= fractal->transformCommon.startIterationsX 38 && aux.i < fractal->transformCommon.stopIterations1) 39 { 40 z += fractal->transformCommon.offset000; 41 double rr = z.Dot(z); 42 z *= fractal->transformCommon.scaleG1 / rr; 43 aux.DE *= (fractal->transformCommon.scaleG1 / rr); 44 z += fractal->transformCommon.additionConstantP000 - fractal->transformCommon.offset000; 45 z *= fractal->transformCommon.scaleA1; 46 aux.DE *= fractal->transformCommon.scaleA1; 47 } 48 49 // box offset 50 if (aux.i >= fractal->transformCommon.startIterationsM 51 && aux.i < fractal->transformCommon.stopIterationsM) 52 { 53 z.x -= fractal->transformCommon.constantMultiplier000.x * sign(z.x); 54 z.y -= fractal->transformCommon.constantMultiplier000.y * sign(z.y); 55 z.z -= fractal->transformCommon.constantMultiplier000.z * sign(z.z); 56 } 57 58 // Pseudo kleinian 59 double k = 0.0; 60 z = fabs(z + fractal->transformCommon.additionConstant0777) 61 - fabs(z - fractal->transformCommon.additionConstant0777) - z; 62 63 k = max(fractal->transformCommon.minR05 / z.Dot(z), 1.0); 64 z *= k; 65 aux.DE *= k + fractal->analyticDE.tweak005; 66 67 z += fractal->transformCommon.additionConstant000; 68 69 if (fractal->transformCommon.functionEnabledGFalse 70 && aux.i >= fractal->transformCommon.startIterationsG 71 && aux.i < fractal->transformCommon.stopIterationsG) 72 { 73 z.x += aux.pos_neg * fractal->transformCommon.additionConstantA000.x; 74 z.y += aux.pos_neg * fractal->transformCommon.additionConstantA000.y; 75 z.z += aux.pos_neg * fractal->transformCommon.additionConstantA000.z; 76 aux.pos_neg *= fractal->transformCommon.scaleNeg1; 77 } 78 79 if (fractal->transformCommon.functionEnabledFFalse 80 && aux.i >= fractal->transformCommon.startIterationsF 81 && aux.i < fractal->transformCommon.stopIterationsF) 82 { 83 z = fabs(z + fractal->transformCommon.offsetA000) 84 - fabs(z - fractal->transformCommon.offsetA000) - z; 85 } 86 if (fractal->transformCommon.functionEnabledNFalse 87 && aux.i >= fractal->transformCommon.startIterationsN 88 && aux.i < fractal->transformCommon.stopIterationsN) 89 { 90 double foldX = fractal->transformCommon.offset1; 91 double foldY = fractal->transformCommon.offsetA1; 92 93 double t; 94 z.x = fabs(z.x); 95 z.y = fabs(z.y); 96 if (fractal->transformCommon.functionEnabledAFalse) 97 { 98 t = z.x; 99 z.x = z.y; 100 z.y = t; 101 } 102 t = z.x; 103 z.x = z.x + z.y - fractal->transformCommon.offset0; 104 z.y = t - z.y - fractal->transformCommon.offsetA0; 105 if (fractal->transformCommon.functionEnabledBxFalse 106 && aux.i >= fractal->transformCommon.startIterationsO 107 && aux.i < fractal->transformCommon.stopIterationsO) 108 z.x = -fabs(z.x); 109 if (fractal->transformCommon.functionEnabledBx 110 && aux.i >= fractal->transformCommon.startIterationsP 111 && aux.i < fractal->transformCommon.stopIterationsP) 112 z.y = -fabs(z.y); 113 114 t = z.x; 115 z.x = z.x + z.y; 116 z.y = t - z.y; 117 z.x *= 0.5; 118 z.y *= 0.5; 119 if (fractal->transformCommon.functionEnabledAx 120 && aux.i >= fractal->transformCommon.startIterationsR 121 && aux.i < fractal->transformCommon.stopIterationsR) 122 z.x = foldX - fabs(z.x + foldX); 123 if (fractal->transformCommon.functionEnabledAxFalse 124 && aux.i >= fractal->transformCommon.startIterationsRV 125 && aux.i < fractal->transformCommon.stopIterationsRV) 126 z.y = foldY - fabs(z.y + foldY); 127 } 128 129 if (fractal->transformCommon.functionEnabledxFalse) z.x = -z.x; 130 if (fractal->transformCommon.functionEnabledyFalse) z.y = -z.y; 131 if (fractal->transformCommon.functionEnabledzFalse) z.z = -z.z; 132 133 aux.pseudoKleinianDE = fractal->analyticDE.scale1; // pK DE 134 // color 135 if (fractal->foldColor.auxColorEnabledFalse) 136 { 137 colorAdd += fractal->foldColor.difs0000.x * fabs(z.x); 138 colorAdd += fractal->foldColor.difs0000.y * fabs(z.y); 139 colorAdd += fractal->foldColor.difs0000.z * fabs(z.z); 140 colorAdd += fractal->foldColor.difs0000.w * k; 141 142 aux.color += colorAdd; 143 } 144 } 145