forked from Mirrorlandia_minetest/minetest
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
This commit is contained in:
parent
49bda7f98d
commit
e2fc8f7dda
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user