diff --git a/TODO b/TODO index 764d177..f400dad 100644 --- a/TODO +++ b/TODO @@ -21,8 +21,8 @@ Technology Preview 2 : => Covering texture height should inpact terrain height. => Add texture shadowing. - Clouds should keep distance to ground. -- Waves noise should not change layers offsets each time a setting is changed (layers are reconstructed currently). - Fix rendering when inside a cloud layer, with other upper or lower layers. +- Make fileNew work again (call auto presets and randomize all noise offsets). - Improve cloud rendering precision (and beware of precision discontinuity when rendering clouds in front of ground (shorter distance)). Technlogy Preview 3 : diff --git a/gui_qt/dialognoise.cpp b/gui_qt/dialognoise.cpp index 1932ec1..333bf4e 100644 --- a/gui_qt/dialognoise.cpp +++ b/gui_qt/dialognoise.cpp @@ -283,10 +283,8 @@ void DialogNoise::addLevel() level.amplitude = 0.1; level.wavelength = 0.1; - level.xoffset = 0.0; - level.yoffset = 0.0; - level.zoffset = 0.0; - noiseAddLevel(_current, level); + + noiseAddLevel(_current, level, 1); revertToCurrent(); @@ -340,7 +338,7 @@ void DialogNoise::levelChanged(int row) void DialogNoise::heightChanged(int value) { _current_level_params.amplitude = ((double)value) / 1000.0; - noiseSetLevel(_current, _current_level, _current_level_params); + noiseSetLevel(_current, _current_level, _current_level_params, 1); previewLevel->redraw(); previewTotal->redraw(); } @@ -348,7 +346,7 @@ void DialogNoise::heightChanged(int value) void DialogNoise::scalingChanged(int value) { _current_level_params.wavelength = ((double)value) / 1000.0; - noiseSetLevel(_current, _current_level, _current_level_params); + noiseSetLevel(_current, _current_level, _current_level_params, 1); previewLevel->redraw(); previewTotal->redraw(); } diff --git a/lib_paysages/noise.c b/lib_paysages/noise.c index 86a60e4..78aa073 100644 --- a/lib_paysages/noise.c +++ b/lib_paysages/noise.c @@ -80,6 +80,7 @@ NoiseGenerator* noiseCreateGenerator() result->level_count = 0; result->height_offset = 0.0; + noiseRandomizeOffsets(result); noiseValidate(result); return result; @@ -215,6 +216,17 @@ void noiseValidate(NoiseGenerator* generator) } } +void noiseRandomizeOffsets(NoiseGenerator* generator) +{ + int i; + for (i = 0; i < MAX_LEVEL_COUNT; i++) + { + result->levels[i].xoffset = toolsRandom(); + result->levels[i].yoffset = toolsRandom(); + result->levels[i].zoffset = toolsRandom(); + } +} + NoiseFunction noiseGetFunction(NoiseGenerator* generator) { return generator->function; @@ -256,10 +268,19 @@ void noiseClearLevels(NoiseGenerator* generator) noiseValidate(generator); } -void noiseAddLevel(NoiseGenerator* generator, NoiseLevel level) +void noiseAddLevel(NoiseGenerator* generator, NoiseLevel level, int protect_offsets) { if (generator->level_count < MAX_LEVEL_COUNT) { + NoiseLevel baselevel = generator->levels[generator->level_count]; + + if (protect_offsets) + { + level.xoffset = baselevel.xoffset; + level.yoffset = baselevel.yoffset; + level.zoffset = baselevel.zoffset; + } + generator->levels[generator->level_count] = level; generator->level_count++; noiseValidate(generator); @@ -273,26 +294,17 @@ void noiseAddLevelSimple(NoiseGenerator* generator, double scaling, double minva level.wavelength = scaling; level.minvalue = minvalue; level.amplitude = maxvalue - minvalue; - level.xoffset = toolsRandom(); - level.yoffset = toolsRandom(); - level.zoffset = toolsRandom(); - noiseAddLevel(generator, level); + noiseAddLevel(generator, level, 1); } -void noiseAddLevels(NoiseGenerator* generator, int level_count, NoiseLevel start_level, double scaling_factor, double amplitude_factor, double center_factor, int randomize_offset) +void noiseAddLevels(NoiseGenerator* generator, int level_count, NoiseLevel start_level, double scaling_factor, double amplitude_factor, double center_factor) { int i; for (i = 0; i < level_count; i++) { - if (randomize_offset) - { - start_level.xoffset = toolsRandom(); - start_level.yoffset = toolsRandom(); - start_level.zoffset = toolsRandom(); - } - noiseAddLevel(generator, start_level); + noiseAddLevel(generator, start_level, 1); start_level.minvalue += start_level.amplitude * (1.0 - amplitude_factor) * center_factor; start_level.wavelength *= scaling_factor; start_level.amplitude *= amplitude_factor; @@ -306,7 +318,7 @@ void noiseAddLevelsSimple(NoiseGenerator* generator, int level_count, double sca level.wavelength = scaling; level.minvalue = minvalue; level.amplitude = maxvalue - minvalue; - noiseAddLevels(generator, level_count, level, 0.5, 0.5, 0.5, 1); + noiseAddLevels(generator, level_count, level, 0.5, 0.5, 0.5); } void noiseRemoveLevel(NoiseGenerator* generator, int level) @@ -335,27 +347,33 @@ int noiseGetLevel(NoiseGenerator* generator, int level, NoiseLevel* params) } } -void noiseSetLevel(NoiseGenerator* generator, int level, NoiseLevel params) +void noiseSetLevel(NoiseGenerator* generator, int index, NoiseLevel level, int protect_offsets) { - if (level >= 0 && level < generator->level_count) + if (index >= 0 && index < generator->level_count) { - generator->levels[level] = params; + NoiseLevel baselevel = generator->levels[index]; + + if (protect_offsets) + { + level.xoffset = baselevel.xoffset; + level.yoffset = baselevel.yoffset; + level.zoffset = baselevel.zoffset; + } + + generator->levels[index] = level; noiseValidate(generator); } } -void noiseSetLevelSimple(NoiseGenerator* generator, int level, double scaling, double minvalue, double maxvalue) +void noiseSetLevelSimple(NoiseGenerator* generator, int index, double scaling, double minvalue, double maxvalue) { - NoiseLevel params; + NoiseLevel level; - params.wavelength = scaling; - params.minvalue = minvalue; - params.amplitude = maxvalue - minvalue; - params.xoffset = toolsRandom(); - params.yoffset = toolsRandom(); - params.zoffset = toolsRandom(); + level.wavelength = scaling; + level.minvalue = minvalue; + level.amplitude = maxvalue - minvalue; - noiseSetLevel(generator, level, params); + noiseSetLevel(generator, index, level, 1); } void noiseNormalizeAmplitude(NoiseGenerator* generator, double minvalue, double maxvalue, int adjust_scaling) diff --git a/lib_paysages/noise.h b/lib_paysages/noise.h index 10e0e59..d511ed1 100644 --- a/lib_paysages/noise.h +++ b/lib_paysages/noise.h @@ -44,6 +44,7 @@ void noiseSaveGenerator(PackStream* stream, NoiseGenerator* generator); void noiseLoadGenerator(PackStream* stream, NoiseGenerator* generator); void noiseCopy(NoiseGenerator* source, NoiseGenerator* destination); void noiseValidate(NoiseGenerator* generator); +void noiseRandomizeOffsets(NoiseGenerator* generator); NoiseFunction noiseGetFunction(NoiseGenerator* generator); void noiseSetFunction(NoiseGenerator* generator, NoiseFunction* function); void noiseSetFunctionParams(NoiseGenerator* generator, NoiseFunctionAlgorithm algorithm, double ridge_factor, double curve_factor); @@ -51,14 +52,14 @@ void noiseForceValue(NoiseGenerator* generator, double value); void noiseGetRange(NoiseGenerator* generator, double* minvalue, double* maxvalue); int noiseGetLevelCount(NoiseGenerator* generator); void noiseClearLevels(NoiseGenerator* generator); -void noiseAddLevel(NoiseGenerator* generator, NoiseLevel level); +void noiseAddLevel(NoiseGenerator* generator, NoiseLevel level, int protect_offsets); void noiseAddLevelSimple(NoiseGenerator* generator, double scaling, double minvalue, double maxvalue); -void noiseAddLevels(NoiseGenerator* generator, int level_count, NoiseLevel start_level, double scaling_factor, double amplitude_factor, double center_factor, int randomize_offset); +void noiseAddLevels(NoiseGenerator* generator, int level_count, NoiseLevel start_level, double scaling_factor, double amplitude_factor, double center_factor); void noiseAddLevelsSimple(NoiseGenerator* generator, int level_count, double scaling, double minvalue, double maxvalue); void noiseRemoveLevel(NoiseGenerator* generator, int level); int noiseGetLevel(NoiseGenerator* generator, int level, NoiseLevel* params); -void noiseSetLevel(NoiseGenerator* generator, int level, NoiseLevel params); -void noiseSetLevelSimple(NoiseGenerator* generator, int level, double scaling, double minvalue, double maxvalue); +void noiseSetLevel(NoiseGenerator* generator, int index, NoiseLevel level, int protect_offsets); +void noiseSetLevelSimple(NoiseGenerator* generator, int index, double scaling, double minvalue, double maxvalue); void noiseNormalizeAmplitude(NoiseGenerator* generator, double minvalue, double maxvalue, int adjust_scaling); double noiseGet1DLevel(NoiseGenerator* generator, int level, double x); double noiseGet1DTotal(NoiseGenerator* generator, double x);