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 * DifsSphereIteration 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_sphere.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 DIFSSphereIteration(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 29 if (fractal->transformCommon.functionEnabledAy 30 && aux->i >= fractal->transformCommon.startIterationsY 31 && aux->i < fractal->transformCommon.stopIterationsY) 32 z.y = fabs(z.y); 33 34 if (fractal->transformCommon.functionEnabledAzFalse 35 && aux->i >= fractal->transformCommon.startIterationsZ 36 && aux->i < fractal->transformCommon.stopIterationsZ) 37 z.z = fabs(z.z); 38 39 if (fractal->transformCommon.functionEnabledFalse) 40 { 41 // xy box fold 42 if (fractal->transformCommon.functionEnabledAFalse 43 && aux->i >= fractal->transformCommon.startIterationsA 44 && aux->i < fractal->transformCommon.stopIterationsA) 45 { 46 z.x -= boxFold.x; 47 z.y -= boxFold.y; 48 } 49 // xyz box fold 50 if (fractal->transformCommon.functionEnabledBFalse 51 && aux->i >= fractal->transformCommon.startIterationsB 52 && aux->i < fractal->transformCommon.stopIterationsB) 53 z -= boxFold; 54 55 // polyfold 56 if (fractal->transformCommon.functionEnabledPFalse 57 && aux->i >= fractal->transformCommon.startIterationsP 58 && aux->i < fractal->transformCommon.stopIterationsP) 59 { 60 z.x = fabs(z.x); 61 REAL psi = M_PI_F / fractal->transformCommon.int6; 62 psi = fabs(fmod(atan2(z.y, z.x) + psi, 2.0f * psi) - psi); 63 REAL len = native_sqrt(z.x * z.x + z.y * z.y); 64 z.x = native_cos(psi) * len; 65 z.y = native_sin(psi) * len; 66 } 67 // diag fold1 68 if (fractal->transformCommon.functionEnabledCxFalse 69 && aux->i >= fractal->transformCommon.startIterationsCx 70 && aux->i < fractal->transformCommon.stopIterationsCx) 71 if (z.x > z.y) 72 { 73 REAL temp = z.x; 74 z.x = z.y; 75 z.y = temp; 76 } 77 // abs offsets 78 if (fractal->transformCommon.functionEnabledCFalse 79 && aux->i >= fractal->transformCommon.startIterationsC 80 && aux->i < fractal->transformCommon.stopIterationsC) 81 { 82 REAL xOffset = fractal->transformCommon.offsetC0; 83 if (z.x < xOffset) z.x = fabs(z.x - xOffset) + xOffset; 84 } 85 if (fractal->transformCommon.functionEnabledDFalse 86 && aux->i >= fractal->transformCommon.startIterationsD 87 && aux->i < fractal->transformCommon.stopIterationsD) 88 { 89 REAL yOffset = fractal->transformCommon.offsetD0; 90 if (z.y < yOffset) z.y = fabs(z.y - yOffset) + yOffset; 91 } 92 // diag fold2 93 if (fractal->transformCommon.functionEnabledCyFalse 94 && aux->i >= fractal->transformCommon.startIterationsCy 95 && aux->i < fractal->transformCommon.stopIterationsCy) 96 if (z.x > z.y) 97 { 98 REAL temp = z.x; 99 z.x = z.y; 100 z.y = temp; 101 } 102 } 103 104 // reverse offset part 1 105 if (aux->i >= fractal->transformCommon.startIterationsE 106 && aux->i < fractal->transformCommon.stopIterationsE) 107 z.x -= fractal->transformCommon.offsetE2; 108 109 if (aux->i >= fractal->transformCommon.startIterationsF 110 && aux->i < fractal->transformCommon.stopIterationsF) 111 z.y -= fractal->transformCommon.offsetF2; 112 113 // scale 114 REAL useScale = 1.0f; 115 if (aux->i >= fractal->transformCommon.startIterationsS 116 && aux->i < fractal->transformCommon.stopIterationsS) 117 { 118 useScale = aux->actualScaleA + fractal->transformCommon.scale2; 119 z *= useScale; 120 aux->DE = aux->DE * fabs(useScale) + 1.0f; 121 // scale vary 122 if (fractal->transformCommon.functionEnabledKFalse 123 && aux->i >= fractal->transformCommon.startIterationsK 124 && aux->i < fractal->transformCommon.stopIterationsK) 125 { 126 // update actualScaleA for next iteration 127 REAL vary = fractal->transformCommon.scaleVary0 128 * (fabs(aux->actualScaleA) - fractal->transformCommon.scaleC1); 129 aux->actualScaleA -= vary; 130 } 131 } 132 133 // reverse offset part 2 134 if (aux->i >= fractal->transformCommon.startIterationsE 135 && aux->i < fractal->transformCommon.stopIterationsE) 136 z.x += fractal->transformCommon.offsetE2; 137 138 if (aux->i >= fractal->transformCommon.startIterationsF 139 && aux->i < fractal->transformCommon.stopIterationsF) 140 z.y += fractal->transformCommon.offsetF2; 141 142 // offset 143 z += fractal->transformCommon.offset001; 144 145 // rotation 146 if (fractal->transformCommon.functionEnabledRFalse 147 && aux->i >= fractal->transformCommon.startIterationsR 148 && aux->i < fractal->transformCommon.stopIterationsR) 149 { 150 z = Matrix33MulFloat4(fractal->transformCommon.rotationMatrix, z); 151 } 152 153 // DE 154 REAL colorDist = aux->dist; 155 REAL4 zc = oldZ; 156 157 // sphere 158 if (aux->i >= fractal->transformCommon.startIterations 159 && aux->i < fractal->transformCommon.stopIterations) 160 { 161 REAL vecLen; 162 if (!fractal->transformCommon.functionEnabled4dFalse) 163 { 164 REAL3 vec3 = (REAL3){zc.x, zc.y, zc.z}; 165 vecLen = length(vec3); 166 } 167 else 168 vecLen = length(zc); 169 170 REAL spD = vecLen - fractal->transformCommon.offsetR1; 171 aux->dist = min(aux->dist, spD / aux->DE); 172 } 173 // torus 174 if (fractal->transformCommon.functionEnabledTFalse 175 && aux->i >= fractal->transformCommon.startIterationsT 176 && aux->i < fractal->transformCommon.stopIterationsT) 177 { 178 REAL torD; 179 180 // swap axis 181 if (fractal->transformCommon.functionEnabledSwFalse) 182 { 183 REAL temp = zc.x; 184 zc.x = zc.z; 185 zc.z = temp; 186 } 187 188 REAL T1 = native_sqrt(zc.y * zc.y + zc.x * zc.x) - fractal->transformCommon.offsetT1; 189 torD = native_sqrt(T1 * T1 + zc.z * zc.z) - fractal->transformCommon.offset05; 190 191 aux->dist = min(aux->dist, torD / aux->DE); 192 } 193 194 // aux->color 195 if (fractal->foldColor.auxColorEnabled) 196 { 197 if (fractal->foldColor.auxColorEnabledFalse) 198 { 199 colorAdd += fractal->foldColor.difs0000.x * fabs(z.x * z.y); 200 colorAdd += fractal->foldColor.difs0000.y * max(z.x, z.y); 201 } 202 colorAdd += fractal->foldColor.difs1; 203 if (fractal->foldColor.auxColorEnabledA) 204 { 205 if (colorDist != aux->dist) aux->color += colorAdd; 206 } 207 else 208 aux->color += colorAdd; 209 } 210 return z; 211}