1/** 2 * Mandelbulber v2, a 3D fractal generator _%}}i*<. ____ _______ 3 * Copyright (C) 2021 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 * DifsPrismIteration fragmentarium code, mdifs by knighty (jan 2012) 10 * and http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm 11 12 * This file has been autogenerated by tools/populateUiInformation.php 13 * from the file "fractal_difs_prism.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 DIFSPrismIteration(REAL4 z, __constant sFractalCl *fractal, sExtendedAuxCl *aux) 18{ 19 REAL colorAdd = 0.0f; 20 REAL4 oldZ = z; 21 REAL4 boxFold = fractal->transformCommon.additionConstantA111; 22 23 // abs z 24 if (fractal->transformCommon.functionEnabledAx 25 && aux->i >= fractal->transformCommon.startIterationsX 26 && aux->i < fractal->transformCommon.stopIterationsX) 27 z.x = fabs(z.x); 28 if (fractal->transformCommon.functionEnabledAy 29 && aux->i >= fractal->transformCommon.startIterationsY 30 && aux->i < fractal->transformCommon.stopIterationsY) 31 z.y = fabs(z.y); 32 if (fractal->transformCommon.functionEnabledAzFalse 33 && aux->i >= fractal->transformCommon.startIterationsZ 34 && aux->i < fractal->transformCommon.stopIterationsZ) 35 z.z = fabs(z.z); 36 // folds 37 if (fractal->transformCommon.functionEnabledFalse) 38 { 39 // xy box fold 40 if (fractal->transformCommon.functionEnabledAFalse 41 && aux->i >= fractal->transformCommon.startIterationsA 42 && aux->i < fractal->transformCommon.stopIterationsA) 43 { 44 z.x -= boxFold.x; 45 z.y -= boxFold.y; 46 } 47 // xyz box fold 48 if (fractal->transformCommon.functionEnabledBFalse 49 && aux->i >= fractal->transformCommon.startIterationsB 50 && aux->i < fractal->transformCommon.stopIterationsB) 51 z -= boxFold; 52 // polyfold 53 if (fractal->transformCommon.functionEnabledPFalse 54 && aux->i >= fractal->transformCommon.startIterationsP 55 && aux->i < fractal->transformCommon.stopIterationsP) 56 { 57 z.x = fabs(z.x); 58 REAL psi = M_PI_F / fractal->transformCommon.int6; 59 psi = fabs(fmod(atan2(z.y, z.x) + psi, 2.0f * psi) - psi); 60 REAL len = native_sqrt(z.x * z.x + z.y * z.y); 61 z.x = native_cos(psi) * len; 62 z.y = native_sin(psi) * len; 63 } 64 // diag fold1 65 if (fractal->transformCommon.functionEnabledCxFalse 66 && aux->i >= fractal->transformCommon.startIterationsCx 67 && aux->i < fractal->transformCommon.stopIterationsCx) 68 if (z.x > z.y) 69 { 70 REAL temp = z.x; 71 z.x = z.y; 72 z.y = temp; 73 } 74 // abs offsets 75 if (fractal->transformCommon.functionEnabledCFalse 76 && aux->i >= fractal->transformCommon.startIterationsC 77 && aux->i < fractal->transformCommon.stopIterationsC) 78 { 79 REAL xOffset = fractal->transformCommon.offsetC0; 80 if (z.x < xOffset) z.x = fabs(z.x - xOffset) + xOffset; 81 } 82 if (fractal->transformCommon.functionEnabledDFalse 83 && aux->i >= fractal->transformCommon.startIterationsD 84 && aux->i < fractal->transformCommon.stopIterationsD) 85 { 86 REAL yOffset = fractal->transformCommon.offsetD0; 87 if (z.y < yOffset) z.y = fabs(z.y - yOffset) + yOffset; 88 } 89 // diag fold2 90 if (fractal->transformCommon.functionEnabledCyFalse 91 && aux->i >= fractal->transformCommon.startIterationsCy 92 && aux->i < fractal->transformCommon.stopIterationsCy) 93 if (z.x > z.y) 94 { 95 REAL temp = z.x; 96 z.x = z.y; 97 z.y = temp; 98 } 99 } 100 101 // reverse offset part 1 102 if (aux->i >= fractal->transformCommon.startIterationsE 103 && aux->i < fractal->transformCommon.stopIterationsE) 104 z.x -= fractal->transformCommon.offsetE2; 105 106 if (aux->i >= fractal->transformCommon.startIterationsF 107 && aux->i < fractal->transformCommon.stopIterationsF) 108 z.y -= fractal->transformCommon.offsetF2; 109 110 // scale 111 REAL useScale = 1.0f; 112 if (aux->i >= fractal->transformCommon.startIterationsS 113 && aux->i < fractal->transformCommon.stopIterationsS) 114 { 115 useScale = aux->actualScaleA + fractal->transformCommon.scale2; 116 z *= useScale; 117 aux->DE = aux->DE * fabs(useScale) + 1.0f; 118 // scale vary 119 if (fractal->transformCommon.functionEnabledKFalse 120 && aux->i >= fractal->transformCommon.startIterationsK 121 && aux->i < fractal->transformCommon.stopIterationsK) 122 { 123 // update actualScaleA for next iteration 124 REAL vary = fractal->transformCommon.scaleVary0 125 * (fabs(aux->actualScaleA) - fractal->transformCommon.scaleC1); 126 aux->actualScaleA -= vary; 127 } 128 } 129 130 // reverse offset part 2 131 if (aux->i >= fractal->transformCommon.startIterationsE 132 && aux->i < fractal->transformCommon.stopIterationsE) 133 z.x += fractal->transformCommon.offsetE2; 134 135 if (aux->i >= fractal->transformCommon.startIterationsF 136 && aux->i < fractal->transformCommon.stopIterationsF) 137 z.y += fractal->transformCommon.offsetF2; 138 139 // offset 140 z += fractal->transformCommon.offset001; 141 142 // rotation 143 if (fractal->transformCommon.functionEnabledRFalse 144 && aux->i >= fractal->transformCommon.startIterationsR 145 && aux->i < fractal->transformCommon.stopIterationsR) 146 { 147 z = Matrix33MulFloat4(fractal->transformCommon.rotationMatrix, z); 148 } 149 150 // DE 151 REAL colorDist = aux->dist; 152 REAL4 zc = oldZ; 153 154 if (aux->i >= fractal->transformCommon.startIterations 155 && aux->i < fractal->transformCommon.stopIterations) 156 { 157 REAL tp; 158 REAL len = fractal->transformCommon.offset1; 159 REAL face = fractal->transformCommon.offset05; 160 161 // swap axis 162 if (fractal->transformCommon.functionEnabledSwFalse) 163 { 164 REAL temp = zc.x; 165 zc.x = zc.z; 166 zc.z = temp; 167 } 168 169 REAL4 absZ = fabs(zc); 170 171 if (fractal->transformCommon.functionEnabledMFalse 172 && aux->i >= fractal->transformCommon.startIterationsM 173 && aux->i < fractal->transformCommon.stopIterationsM) 174 { 175 tp = absZ.z; 176 if (fractal->transformCommon.functionEnabledBxFalse) tp *= tp; 177 178 zc.y += tp * fractal->transformCommon.scale0; 179 } 180 181 if (fractal->transformCommon.functionEnabledNFalse 182 && aux->i >= fractal->transformCommon.startIterationsN 183 && aux->i < fractal->transformCommon.stopIterationsN) 184 { 185 tp = absZ.z; 186 if (fractal->transformCommon.functionEnabledByFalse) tp *= tp; 187 len += tp * fractal->transformCommon.scaleA0; 188 } 189 190 if (fractal->transformCommon.functionEnabledOFalse 191 && aux->i >= fractal->transformCommon.startIterationsO 192 && aux->i < fractal->transformCommon.stopIterationsO) 193 { 194 tp = absZ.z; 195 if (fractal->transformCommon.functionEnabledBzFalse) tp *= tp; 196 face += tp * fractal->transformCommon.scaleB0; 197 } 198 199 REAL priD = max(fabs(zc.x) - len, max(fabs(zc.y) * SQRT_3_4_F + zc.z * 0.5f, -zc.z) - face); 200 201 aux->dist = min(aux->dist, priD / aux->DE); 202 } 203 204 // aux->color 205 if (fractal->foldColor.auxColorEnabled) 206 { 207 if (fractal->foldColor.auxColorEnabledFalse) 208 { 209 colorAdd += fractal->foldColor.difs0000.x * fabs(z.x * z.y); 210 colorAdd += fractal->foldColor.difs0000.y * max(z.x, z.y); 211 } 212 colorAdd += fractal->foldColor.difs1; 213 if (fractal->foldColor.auxColorEnabledA) 214 { 215 if (colorDist != aux->dist) aux->color += colorAdd; 216 } 217 else 218 aux->color += colorAdd; 219 } 220 return z; 221}