Mgfractal: Independent iterations and scale parameters
authorparamat <mat.gregory@virginmedia.com>
Fri, 23 Oct 2015 22:02:10 +0000 (23:02 +0100)
committerparamat <mat.gregory@virginmedia.com>
Sat, 24 Oct 2015 20:18:40 +0000 (21:18 +0100)
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
src/mapgen_fractal.h

index b99d3af401b0edbd39ec2afaf78e462b6f02099f..c359dc4c6cc85ef985024734d08dad06c02ee742 100644 (file)
@@ -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);
-
-       moffset = v3f(1.75, 0.0, 0.0);  // Mandelbrot set only
-       mslice_w = 0.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;
 
-       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->getV3FNoEx("mgfractal_moffset", moffset);
-       settings->getFloatNoEx("mgfractal_mslice_w", mslice_w);
+       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_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;
index b515e4c9329f2a6ad4352bbc97ccc184cf3bc8bb..8e52dafeced64594001688e57fcb02b2a5f6ef62 100644 (file)
@@ -36,14 +36,15 @@ extern FlagDesc flagdesc_mapgen_fractal[];
 struct MapgenFractalParams : public MapgenSpecificParams {
        u32 spflags;
 
-       u16 iterations;
-       v3f scale;
-
-       v3f moffset;
-       float mslice_w;
-
-       v3f joffset;
-       float jslice_w;
+       u16 m_iterations;
+       v3f m_scale;
+       v3f m_offset;
+       float m_slice_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;
-
-       v3f moffset;
-       float mslice_w;
+       u16 m_iterations;
+       v3f m_scale;
+       v3f m_offset;
+       float m_slice_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;