Skip to content

Commit

Permalink
Mgfractal: Independent iterations and scale parameters
Browse files Browse the repository at this point in the history
Complete set of parameters for each of mandelbrot and julia sets
The julia set structure often needs different iterations and scale
  • Loading branch information
paramat committed Oct 24, 2015
1 parent 49bda7f commit e2fc8f7
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 54 deletions.
84 changes: 45 additions & 39 deletions src/mapgen_fractal.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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;
Expand Down
32 changes: 17 additions & 15 deletions src/mapgen_fractal.h
Expand Up @@ -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;
Expand Down Expand Up @@ -74,14 +75,15 @@ class MapgenFractal : public Mapgen {
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;
Expand Down

0 comments on commit e2fc8f7

Please sign in to comment.