/** * Mandelbulber v2, a 3D fractal generator _%}}i*<. ____ _______ * Copyright (C) 2020 Mandelbulber Team _>]|=||i=i<, / __ \___ ___ ___ / ___/ / * \><||i|=>>%) / /_/ / _ \/ -_) _ \/ /__/ /__ * This file is part of Mandelbulber. )<=i=]=|=i<> \____/ .__/\__/_//_/\___/____/ * The project is licensed under GPLv3, -<>>=|><|||` /_/ * see also COPYING file in this folder. ~+{i%+++ * * poly fold sym multi DarkBeam's version * @reference * DarkBeam (luca) http://www.fractalforums.com/mandelbulber/ * _polyfold_sym-and-polyfoldsymifs-in-mandelbulber-2/msg98162/#msg98162 * This file has been autogenerated by tools/populateUiInformation.php * from the file "fractal_transf_poly_fold_sym_multi.cpp" in the folder formula/definition * D O N O T E D I T T H I S F I L E ! */ REAL4 TransfPolyFoldSymMultiIteration(REAL4 z, __constant sFractalCl *fractal, sExtendedAuxCl *aux) { REAL4 oldZ = z; // pre abs if (fractal->transformCommon.functionEnabledxFalse) z.x = fabs(z.x); if (fractal->transformCommon.functionEnabledyFalse) z.y = fabs(z.y); if (fractal->transformCommon.functionEnabledzFalse) z.z = fabs(z.z); int order = fractal->transformCommon.int6; REAL div2PI = (REAL)order / M_PI_2x_F; REAL temp = 0.0f; REAL sAng = 0.0f; REAL cAng = 0.0f; REAL angle = 0.0f; int sector; if (fractal->transformCommon.functionEnabledCx) { bool cy = false; if (!fractal->transformCommon.functionEnabledAxFalse) sector = (int)(-div2PI * atan(z.x / z.y)); else sector = (int)(-div2PI * atan2(z.x, z.y)); if (sector & 1) cy = true; angle = (REAL)(sector / div2PI); temp = z.x; sAng = native_sin(angle); cAng = native_cos(angle); z.x = z.x * cAng - z.y * sAng; z.y = temp * sAng + z.y * cAng; if (cy == true) z.y = -z.y; /*if (fractal->transformCommon.functionEnabledFalse) { if ((order&1) && (sector == 0)) z.y = fabs(z.y); // more continuous? else if (cy == true) z.y = -z.y; } else if (cy == true) z.y = -z.y;*/ } if (fractal->transformCommon.functionEnabledCyFalse) { bool cz = false; if (!fractal->transformCommon.functionEnabledAyFalse) sector = (int)(-div2PI * atan(z.y / z.z)); else sector = (int)(-div2PI * atan2(z.y, z.z)); if (sector & 1) cz = true; angle = (REAL)(sector / div2PI); temp = z.y; sAng = native_sin(angle); cAng = native_cos(angle); z.y = z.y * cAng - z.z * sAng; z.z = temp * sAng + z.z * cAng; if (cz == true) z.z = -z.z; } if (fractal->transformCommon.functionEnabledCzFalse) { bool cx = false; if (!fractal->transformCommon.functionEnabledAzFalse) sector = (int)(-div2PI * atan(z.z / z.x)); else sector = (int)(-div2PI * atan2(z.z, z.x)); if (sector & 1) cx = true; angle = (REAL)(sector / div2PI); temp = z.z; sAng = native_sin(angle); cAng = native_cos(angle); z.z = z.z * cAng - z.x * sAng; z.x = temp * sAng + z.x * cAng; if (cx == true) z.x = -z.x; } z += fractal->transformCommon.additionConstant000; if (fractal->analyticDE.enabled) { if (!fractal->analyticDE.enabledFalse) aux->DE = aux->DE * fractal->analyticDE.scale1 + fractal->analyticDE.offset0; else { REAL avgScale = length(z) / length(oldZ); aux->DE = aux->DE * avgScale * fractal->analyticDE.scale1 + fractal->analyticDE.offset0; } } return z; }