Skip to content

Commit e2fc8f7

Browse files
committedOct 24, 2015
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
1 parent 49bda7f commit e2fc8f7

File tree

2 files changed

+62
-54
lines changed

2 files changed

+62
-54
lines changed
 

‎src/mapgen_fractal.cpp

+45-39
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2828
#include "content_sao.h"
2929
#include "nodedef.h"
3030
#include "voxelalgorithms.h"
31-
//#include "profiler.h" // For TimeTaker
31+
#include "profiler.h" // For TimeTaker
3232
#include "settings.h" // For g_settings
3333
#include "emerge.h"
3434
#include "dungeongen.h"
@@ -67,14 +67,15 @@ MapgenFractal::MapgenFractal(int mapgenid, MapgenParams *params, EmergeManager *
6767
MapgenFractalParams *sp = (MapgenFractalParams *)params->sparams;
6868
this->spflags = sp->spflags;
6969

70-
this->iterations = sp->iterations;
71-
this->scale = sp->scale;
70+
this->m_iterations = sp->m_iterations;
71+
this->m_scale = sp->m_scale;
72+
this->m_offset = sp->m_offset;
73+
this->m_slice_w = sp->m_slice_w;
7274

73-
this->moffset = sp->moffset;
74-
this->mslice_w = sp->mslice_w;
75-
76-
this->joffset = sp->joffset;
77-
this->jslice_w = sp->jslice_w;
75+
this->j_iterations = sp->j_iterations;
76+
this->j_scale = sp->j_scale;
77+
this->j_offset = sp->j_offset;
78+
this->j_slice_w = sp->j_slice_w;
7879
this->julia_x = sp->julia_x;
7980
this->julia_y = sp->julia_y;
8081
this->julia_z = sp->julia_z;
@@ -143,14 +144,15 @@ MapgenFractalParams::MapgenFractalParams()
143144
{
144145
spflags = 0;
145146

146-
iterations = 9;
147-
scale = v3f(1024.0, 256.0, 1024.0);
148-
149-
moffset = v3f(1.75, 0.0, 0.0); // Mandelbrot set only
150-
mslice_w = 0.0;
147+
m_iterations = 9; // Mandelbrot set only
148+
m_scale = v3f(1024.0, 256.0, 1024.0);
149+
m_offset = v3f(1.75, 0.0, 0.0);
150+
m_slice_w = 0.0;
151151

152-
joffset = v3f(0.0, 1.0, 0.0); // Julia set only
153-
jslice_w = 0.0;
152+
j_iterations = 9; // Julia set only
153+
j_scale = v3f(2048.0, 512.0, 2048.0);
154+
j_offset = v3f(0.0, 1.0, 0.0);
155+
j_slice_w = 0.0;
154156
julia_x = 0.33;
155157
julia_y = 0.33;
156158
julia_z = 0.33;
@@ -166,14 +168,15 @@ void MapgenFractalParams::readParams(const Settings *settings)
166168
{
167169
settings->getFlagStrNoEx("mgfractal_spflags", spflags, flagdesc_mapgen_fractal);
168170

169-
settings->getU16NoEx("mgfractal_iterations", iterations);
170-
settings->getV3FNoEx("mgfractal_scale", scale);
171-
172-
settings->getV3FNoEx("mgfractal_moffset", moffset);
173-
settings->getFloatNoEx("mgfractal_mslice_w", mslice_w);
171+
settings->getU16NoEx("mgfractal_m_iterations", m_iterations);
172+
settings->getV3FNoEx("mgfractal_m_scale", m_scale);
173+
settings->getV3FNoEx("mgfractal_m_offset", m_offset);
174+
settings->getFloatNoEx("mgfractal_m_slice_w", m_slice_w);
174175

175-
settings->getV3FNoEx("mgfractal_joffset", joffset);
176-
settings->getFloatNoEx("mgfractal_jslice_w", jslice_w);
176+
settings->getU16NoEx("mgfractal_j_iterations", j_iterations);
177+
settings->getV3FNoEx("mgfractal_j_scale", j_scale);
178+
settings->getV3FNoEx("mgfractal_j_offset", j_offset);
179+
settings->getFloatNoEx("mgfractal_j_slice_w", j_slice_w);
177180
settings->getFloatNoEx("mgfractal_julia_x", julia_x);
178181
settings->getFloatNoEx("mgfractal_julia_y", julia_y);
179182
settings->getFloatNoEx("mgfractal_julia_z", julia_z);
@@ -189,14 +192,15 @@ void MapgenFractalParams::writeParams(Settings *settings) const
189192
{
190193
settings->setFlagStr("mgfractal_spflags", spflags, flagdesc_mapgen_fractal, U32_MAX);
191194

192-
settings->setU16("mgfractal_iterations", iterations);
193-
settings->setV3F("mgfractal_scale", scale);
195+
settings->setU16("mgfractal_m_iterations", m_iterations);
196+
settings->setV3F("mgfractal_m_scale", m_scale);
197+
settings->setV3F("mgfractal_m_offset", m_offset);
198+
settings->setFloat("mgfractal_m_slice_w", m_slice_w);
194199

195-
settings->setV3F("mgfractal_moffset", moffset);
196-
settings->setFloat("mgfractal_mslice_w", mslice_w);
197-
198-
settings->setV3F("mgfractal_joffset", joffset);
199-
settings->setFloat("mgfractal_jslice_w", jslice_w);
200+
settings->setU16("mgfractal_j_iterations", j_iterations);
201+
settings->setV3F("mgfractal_j_scale", j_scale);
202+
settings->setV3F("mgfractal_j_offset", j_offset);
203+
settings->setFloat("mgfractal_j_slice_w", j_slice_w);
200204
settings->setFloat("mgfractal_julia_x", julia_x);
201205
settings->setFloat("mgfractal_julia_y", julia_y);
202206
settings->setFloat("mgfractal_julia_z", julia_z);
@@ -240,7 +244,7 @@ void MapgenFractal::makeChunk(BlockMakeData *data)
240244
this->generating = true;
241245
this->vm = data->vmanip;
242246
this->ndef = data->nodedef;
243-
//TimeTaker t("makeChunk");
247+
TimeTaker t("makeChunk");
244248

245249
v3s16 blockpos_min = data->blockpos_min;
246250
v3s16 blockpos_max = data->blockpos_max;
@@ -322,7 +326,7 @@ void MapgenFractal::makeChunk(BlockMakeData *data)
322326
// Sprinkle some dust on top after everything else was generated
323327
dustTopNodes();
324328

325-
//printf("makeChunk: %dms\n", t.stop());
329+
printf("makeChunk: %dms\n", t.stop());
326330

327331
updateLiquid(&data->transforming_liquid, full_node_min, full_node_max);
328332

@@ -376,21 +380,23 @@ bool MapgenFractal::getFractalAtPoint(s16 x, s16 y, s16 z)
376380
cy = julia_y;
377381
cz = julia_z;
378382
cw = julia_w;
379-
ox = (float)x / scale.X - joffset.X;
380-
oy = (float)y / scale.Y - joffset.Y;
381-
oz = (float)z / scale.Z - joffset.Z;
382-
ow = jslice_w;
383+
ox = (float)x / j_scale.X - j_offset.X;
384+
oy = (float)y / j_scale.Y - j_offset.Y;
385+
oz = (float)z / j_scale.Z - j_offset.Z;
386+
ow = j_slice_w;
383387
} else { // Mandelbrot set
384-
cx = (float)x / scale.X - moffset.X;
385-
cy = (float)y / scale.Y - moffset.Y;
386-
cz = (float)z / scale.Z - moffset.Z;
387-
cw = mslice_w;
388+
cx = (float)x / m_scale.X - m_offset.X;
389+
cy = (float)y / m_scale.Y - m_offset.Y;
390+
cz = (float)z / m_scale.Z - m_offset.Z;
391+
cw = m_slice_w;
388392
ox = 0.0f;
389393
oy = 0.0f;
390394
oz = 0.0f;
391395
ow = 0.0f;
392396
}
393397

398+
u16 iterations = spflags & MGFRACTAL_JULIA ? j_iterations : m_iterations;
399+
394400
for (u16 iter = 0; iter < iterations; iter++) {
395401
// 4D "Roundy" Mandelbrot set
396402
float nx = ox * ox - oy * oy - oz * oz - ow * ow + cx;

‎src/mapgen_fractal.h

+17-15
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,15 @@ extern FlagDesc flagdesc_mapgen_fractal[];
3636
struct MapgenFractalParams : public MapgenSpecificParams {
3737
u32 spflags;
3838

39-
u16 iterations;
40-
v3f scale;
41-
42-
v3f moffset;
43-
float mslice_w;
44-
45-
v3f joffset;
46-
float jslice_w;
39+
u16 m_iterations;
40+
v3f m_scale;
41+
v3f m_offset;
42+
float m_slice_w;
43+
44+
u16 j_iterations;
45+
v3f j_scale;
46+
v3f j_offset;
47+
float j_slice_w;
4748
float julia_x;
4849
float julia_y;
4950
float julia_z;
@@ -74,14 +75,15 @@ class MapgenFractal : public Mapgen {
7475
v3s16 full_node_min;
7576
v3s16 full_node_max;
7677

77-
u16 iterations;
78-
v3f scale;
79-
80-
v3f moffset;
81-
float mslice_w;
78+
u16 m_iterations;
79+
v3f m_scale;
80+
v3f m_offset;
81+
float m_slice_w;
8282

83-
v3f joffset;
84-
float jslice_w;
83+
u16 j_iterations;
84+
v3f j_scale;
85+
v3f j_offset;
86+
float j_slice_w;
8587
float julia_x;
8688
float julia_y;
8789
float julia_z;

0 commit comments

Comments
 (0)
Please sign in to comment.