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 * poly fold sym multi DarkBeam's version 10 * @reference 11 * DarkBeam (luca) http://www.fractalforums.com/mandelbulber/ 12 * _polyfold_sym-and-polyfoldsymifs-in-mandelbulber-2/msg98162/#msg98162 13 14 * This file has been autogenerated by tools/populateUiInformation.php 15 * from the file "fractal_transf_poly_fold_sym_multi.cpp" in the folder formula/definition 16 * D O N O T E D I T T H I S F I L E ! 17 */ 18 19REAL4 TransfPolyFoldSymMultiIteration(REAL4 z, __constant sFractalCl *fractal, sExtendedAuxCl *aux) 20{ 21 REAL4 oldZ = z; 22 // pre abs 23 if (fractal->transformCommon.functionEnabledxFalse) z.x = fabs(z.x); 24 if (fractal->transformCommon.functionEnabledyFalse) z.y = fabs(z.y); 25 if (fractal->transformCommon.functionEnabledzFalse) z.z = fabs(z.z); 26 27 int order = fractal->transformCommon.int6; 28 REAL div2PI = (REAL)order / M_PI_2x_F; 29 REAL temp = 0.0f; 30 REAL sAng = 0.0f; 31 REAL cAng = 0.0f; 32 REAL angle = 0.0f; 33 int sector; 34 if (fractal->transformCommon.functionEnabledCx) 35 { 36 bool cy = false; 37 if (!fractal->transformCommon.functionEnabledAxFalse) 38 sector = (int)(-div2PI * atan(z.x / z.y)); 39 else 40 sector = (int)(-div2PI * atan2(z.x, z.y)); 41 if (sector & 1) cy = true; 42 angle = (REAL)(sector / div2PI); 43 temp = z.x; 44 sAng = native_sin(angle); 45 cAng = native_cos(angle); 46 z.x = z.x * cAng - z.y * sAng; 47 z.y = temp * sAng + z.y * cAng; 48 if (cy == true) z.y = -z.y; 49 /*if (fractal->transformCommon.functionEnabledFalse) 50 { 51 if ((order&1) && (sector == 0)) z.y = fabs(z.y); // more continuous? 52 else if (cy == true) z.y = -z.y; 53 } 54 else if (cy == true) z.y = -z.y;*/ 55 } 56 if (fractal->transformCommon.functionEnabledCyFalse) 57 { 58 bool cz = false; 59 if (!fractal->transformCommon.functionEnabledAyFalse) 60 sector = (int)(-div2PI * atan(z.y / z.z)); 61 else 62 sector = (int)(-div2PI * atan2(z.y, z.z)); 63 if (sector & 1) cz = true; 64 angle = (REAL)(sector / div2PI); 65 temp = z.y; 66 sAng = native_sin(angle); 67 cAng = native_cos(angle); 68 z.y = z.y * cAng - z.z * sAng; 69 z.z = temp * sAng + z.z * cAng; 70 if (cz == true) z.z = -z.z; 71 } 72 if (fractal->transformCommon.functionEnabledCzFalse) 73 { 74 bool cx = false; 75 if (!fractal->transformCommon.functionEnabledAzFalse) 76 sector = (int)(-div2PI * atan(z.z / z.x)); 77 else 78 sector = (int)(-div2PI * atan2(z.z, z.x)); 79 if (sector & 1) cx = true; 80 angle = (REAL)(sector / div2PI); 81 temp = z.z; 82 sAng = native_sin(angle); 83 cAng = native_cos(angle); 84 z.z = z.z * cAng - z.x * sAng; 85 z.x = temp * sAng + z.x * cAng; 86 if (cx == true) z.x = -z.x; 87 } 88 89 z += fractal->transformCommon.additionConstant000; 90 91 if (fractal->analyticDE.enabled) 92 { 93 if (!fractal->analyticDE.enabledFalse) 94 aux->DE = aux->DE * fractal->analyticDE.scale1 + fractal->analyticDE.offset0; 95 else 96 { 97 REAL avgScale = length(z) / length(oldZ); 98 aux->DE = aux->DE * avgScale * fractal->analyticDE.scale1 + fractal->analyticDE.offset0; 99 } 100 } 101 return z; 102}