From e2fc8f7dda9316460063bc3290aaee0285c62ec9 Mon Sep 17 00:00:00 2001 From: paramat Date: Fri, 23 Oct 2015 23:02:10 +0100 Subject: [PATCH] Mgfractal: Independent iterations and scale parameters Complete set of parameters for each of mandelbrot and julia sets The julia set structure often needs different iterations and scale --- src/mapgen_fractal.cpp | 84 ++++++++++++++++++++++-------------------- src/mapgen_fractal.h | 30 ++++++++------- 2 files changed, 61 insertions(+), 53 deletions(-) diff --git a/src/mapgen_fractal.cpp b/src/mapgen_fractal.cpp index b99d3af40..c359dc4c6 100644 --- a/src/mapgen_fractal.cpp +++ b/src/mapgen_fractal.cpp @@ -28,7 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "content_sao.h" #include "nodedef.h" #include "voxelalgorithms.h" -//#include "profiler.h" // For TimeTaker +#include "profiler.h" // For TimeTaker #include "settings.h" // For g_settings #include "emerge.h" #include "dungeongen.h" @@ -67,14 +67,15 @@ MapgenFractal::MapgenFractal(int mapgenid, MapgenParams *params, EmergeManager * MapgenFractalParams *sp = (MapgenFractalParams *)params->sparams; this->spflags = sp->spflags; - this->iterations = sp->iterations; - this->scale = sp->scale; + this->m_iterations = sp->m_iterations; + this->m_scale = sp->m_scale; + this->m_offset = sp->m_offset; + this->m_slice_w = sp->m_slice_w; - this->moffset = sp->moffset; - this->mslice_w = sp->mslice_w; - - this->joffset = sp->joffset; - this->jslice_w = sp->jslice_w; + this->j_iterations = sp->j_iterations; + this->j_scale = sp->j_scale; + this->j_offset = sp->j_offset; + this->j_slice_w = sp->j_slice_w; this->julia_x = sp->julia_x; this->julia_y = sp->julia_y; this->julia_z = sp->julia_z; @@ -143,14 +144,15 @@ MapgenFractalParams::MapgenFractalParams() { spflags = 0; - iterations = 9; - scale = v3f(1024.0, 256.0, 1024.0); + m_iterations = 9; // Mandelbrot set only + m_scale = v3f(1024.0, 256.0, 1024.0); + m_offset = v3f(1.75, 0.0, 0.0); + m_slice_w = 0.0; - moffset = v3f(1.75, 0.0, 0.0); // Mandelbrot set only - mslice_w = 0.0; - - joffset = v3f(0.0, 1.0, 0.0); // Julia set only - jslice_w = 0.0; + j_iterations = 9; // Julia set only + j_scale = v3f(2048.0, 512.0, 2048.0); + j_offset = v3f(0.0, 1.0, 0.0); + j_slice_w = 0.0; julia_x = 0.33; julia_y = 0.33; julia_z = 0.33; @@ -166,14 +168,15 @@ void MapgenFractalParams::readParams(const Settings *settings) { settings->getFlagStrNoEx("mgfractal_spflags", spflags, flagdesc_mapgen_fractal); - settings->getU16NoEx("mgfractal_iterations", iterations); - settings->getV3FNoEx("mgfractal_scale", scale); + settings->getU16NoEx("mgfractal_m_iterations", m_iterations); + settings->getV3FNoEx("mgfractal_m_scale", m_scale); + settings->getV3FNoEx("mgfractal_m_offset", m_offset); + settings->getFloatNoEx("mgfractal_m_slice_w", m_slice_w); - settings->getV3FNoEx("mgfractal_moffset", moffset); - settings->getFloatNoEx("mgfractal_mslice_w", mslice_w); - - settings->getV3FNoEx("mgfractal_joffset", joffset); - settings->getFloatNoEx("mgfractal_jslice_w", jslice_w); + settings->getU16NoEx("mgfractal_j_iterations", j_iterations); + settings->getV3FNoEx("mgfractal_j_scale", j_scale); + settings->getV3FNoEx("mgfractal_j_offset", j_offset); + settings->getFloatNoEx("mgfractal_j_slice_w", j_slice_w); settings->getFloatNoEx("mgfractal_julia_x", julia_x); settings->getFloatNoEx("mgfractal_julia_y", julia_y); settings->getFloatNoEx("mgfractal_julia_z", julia_z); @@ -189,14 +192,15 @@ void MapgenFractalParams::writeParams(Settings *settings) const { settings->setFlagStr("mgfractal_spflags", spflags, flagdesc_mapgen_fractal, U32_MAX); - settings->setU16("mgfractal_iterations", iterations); - settings->setV3F("mgfractal_scale", scale); + settings->setU16("mgfractal_m_iterations", m_iterations); + settings->setV3F("mgfractal_m_scale", m_scale); + settings->setV3F("mgfractal_m_offset", m_offset); + settings->setFloat("mgfractal_m_slice_w", m_slice_w); - settings->setV3F("mgfractal_moffset", moffset); - settings->setFloat("mgfractal_mslice_w", mslice_w); - - settings->setV3F("mgfractal_joffset", joffset); - settings->setFloat("mgfractal_jslice_w", jslice_w); + settings->setU16("mgfractal_j_iterations", j_iterations); + settings->setV3F("mgfractal_j_scale", j_scale); + settings->setV3F("mgfractal_j_offset", j_offset); + settings->setFloat("mgfractal_j_slice_w", j_slice_w); settings->setFloat("mgfractal_julia_x", julia_x); settings->setFloat("mgfractal_julia_y", julia_y); settings->setFloat("mgfractal_julia_z", julia_z); @@ -240,7 +244,7 @@ void MapgenFractal::makeChunk(BlockMakeData *data) this->generating = true; this->vm = data->vmanip; this->ndef = data->nodedef; - //TimeTaker t("makeChunk"); + TimeTaker t("makeChunk"); v3s16 blockpos_min = data->blockpos_min; v3s16 blockpos_max = data->blockpos_max; @@ -322,7 +326,7 @@ void MapgenFractal::makeChunk(BlockMakeData *data) // Sprinkle some dust on top after everything else was generated dustTopNodes(); - //printf("makeChunk: %dms\n", t.stop()); + printf("makeChunk: %dms\n", t.stop()); updateLiquid(&data->transforming_liquid, full_node_min, full_node_max); @@ -376,21 +380,23 @@ bool MapgenFractal::getFractalAtPoint(s16 x, s16 y, s16 z) cy = julia_y; cz = julia_z; cw = julia_w; - ox = (float)x / scale.X - joffset.X; - oy = (float)y / scale.Y - joffset.Y; - oz = (float)z / scale.Z - joffset.Z; - ow = jslice_w; + ox = (float)x / j_scale.X - j_offset.X; + oy = (float)y / j_scale.Y - j_offset.Y; + oz = (float)z / j_scale.Z - j_offset.Z; + ow = j_slice_w; } else { // Mandelbrot set - cx = (float)x / scale.X - moffset.X; - cy = (float)y / scale.Y - moffset.Y; - cz = (float)z / scale.Z - moffset.Z; - cw = mslice_w; + cx = (float)x / m_scale.X - m_offset.X; + cy = (float)y / m_scale.Y - m_offset.Y; + cz = (float)z / m_scale.Z - m_offset.Z; + cw = m_slice_w; ox = 0.0f; oy = 0.0f; oz = 0.0f; ow = 0.0f; } + u16 iterations = spflags & MGFRACTAL_JULIA ? j_iterations : m_iterations; + for (u16 iter = 0; iter < iterations; iter++) { // 4D "Roundy" Mandelbrot set float nx = ox * ox - oy * oy - oz * oz - ow * ow + cx; diff --git a/src/mapgen_fractal.h b/src/mapgen_fractal.h index b515e4c93..8e52dafec 100644 --- a/src/mapgen_fractal.h +++ b/src/mapgen_fractal.h @@ -36,14 +36,15 @@ extern FlagDesc flagdesc_mapgen_fractal[]; struct MapgenFractalParams : public MapgenSpecificParams { u32 spflags; - u16 iterations; - v3f scale; + u16 m_iterations; + v3f m_scale; + v3f m_offset; + float m_slice_w; - v3f moffset; - float mslice_w; - - v3f joffset; - float jslice_w; + u16 j_iterations; + v3f j_scale; + v3f j_offset; + float j_slice_w; float julia_x; float julia_y; float julia_z; @@ -74,14 +75,15 @@ public: v3s16 full_node_min; v3s16 full_node_max; - u16 iterations; - v3f scale; + u16 m_iterations; + v3f m_scale; + v3f m_offset; + float m_slice_w; - v3f moffset; - float mslice_w; - - v3f joffset; - float jslice_w; + u16 j_iterations; + v3f j_scale; + v3f j_offset; + float j_slice_w; float julia_x; float julia_y; float julia_z;