1/** 2 * Mandelbulber v2, a 3D fractal generator _%}}i*<. ____ _______ 3 * Copyright (C) 2017 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 * Kaleidoscopic Iterated Function Systems (IFS) 10 * @reference 11 * http://www.fractalforums.com/ifs-iterated-function-systems/kaleidoscopic-(escape-time-ifs)/ 12 13 * This file has been autogenerated by tools/populateUiInformation.php 14 * from the file "fractal_kaleidoscopic_ifs.cpp" in the folder formula/definition 15 * D O N O T E D I T T H I S F I L E ! 16 */ 17 18REAL4 KaleidoscopicIfsIteration(REAL4 z, __constant sFractalCl *fractal, sExtendedAuxCl *aux) 19{ 20 if (fractal->IFS.absX) z.x = fabs(z.x); 21 if (fractal->IFS.absY) z.y = fabs(z.y); 22 if (fractal->IFS.absZ) z.z = fabs(z.z); 23 24 for (int i = 0; i < IFS_VECTOR_COUNT; i++) 25 { 26 if (fractal->IFS.enabled[i]) 27 { 28 z = Matrix33MulFloat4(fractal->IFS.rot[i], z); 29 REAL length = dot(z, fractal->IFS.direction[i]); 30 31 if (length < fractal->IFS.distance[i]) 32 { 33 z -= fractal->IFS.direction[i] 34 * (2.0f * (length - fractal->IFS.distance[i]) * fractal->IFS.intensity[i]); 35 } 36 } 37 } 38 39 if (fractal->IFS.rotationEnabled) 40 z = Matrix33MulFloat4(fractal->IFS.mainRot, z - fractal->IFS.offset) + fractal->IFS.offset; 41 42 if (fractal->IFS.edgeEnabled) 43 { 44 if (fractal->IFS.edge.x > 0.0f) z.x = fractal->IFS.edge.x - fabs(fractal->IFS.edge.x - z.x); 45 if (fractal->IFS.edge.y > 0.0f) z.y = fractal->IFS.edge.y - fabs(fractal->IFS.edge.y - z.y); 46 if (fractal->IFS.edge.z > 0.0f) z.z = fractal->IFS.edge.z - fabs(fractal->IFS.edge.z - z.z); 47 } 48 49 z *= fractal->IFS.scale; 50 if (fractal->IFS.mengerSpongeMode) 51 { 52 z.x -= fractal->IFS.offset.x * (fractal->IFS.scale - 1.0f); 53 z.y -= fractal->IFS.offset.y * (fractal->IFS.scale - 1.0f); 54 if (z.z > 0.5f * fractal->IFS.offset.z * (fractal->IFS.scale - 1.0f)) 55 z.z -= fractal->IFS.offset.z * (fractal->IFS.scale - 1.0f); 56 } 57 else 58 { 59 z -= fractal->IFS.offset * (fractal->IFS.scale - 1.0f); 60 } 61 aux->DE *= fabs(fractal->IFS.scale); 62 return z; 63}