1 /**************************************************************************/
2 /* Copyright 2009 Tim Day */
3 /* */
4 /* This file is part of Fracplanet */
5 /* */
6 /* Fracplanet is free software: you can redistribute it and/or modify */
7 /* it under the terms of the GNU General Public License as published by */
8 /* the Free Software Foundation, either version 3 of the License, or */
9 /* (at your option) any later version. */
10 /* */
11 /* Fracplanet is distributed in the hope that it will be useful, */
12 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
13 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
14 /* GNU General Public License for more details. */
15 /* */
16 /* You should have received a copy of the GNU General Public License */
17 /* along with Fracplanet. If not, see <http://www.gnu.org/licenses/>. */
18 /**************************************************************************/
19
20 #include "control_terrain.h"
21
22 #include "fracplanet_main.h"
23 #include "spinbox.h"
24
25 /*! Lots of tedious code to instantiate controls and wire things up.
26 */
ControlTerrain(FracplanetMain * tgt,ParametersTerrain * param_terrain,ParametersCloud * param_cloud)27 ControlTerrain::ControlTerrain(FracplanetMain* tgt,ParametersTerrain* param_terrain,ParametersCloud* param_cloud)
28 :Control()
29 ,parameters_terrain(param_terrain)
30 ,parameters_cloud(param_cloud)
31 ,regenerate_target(tgt)
32 {
33 QTabWidget* tabs=new QTabWidget(); // Top level tab widget
34 layout()->addWidget(tabs);
35 tabs->setMinimumWidth(512);
36
37 QTabWidget* tab_terrain=new QTabWidget(this);
38 tabs->addTab(tab_terrain,"Terrain");
39
40 QWidget*const tab_terrain_basics=new QWidget();
41 tab_terrain->addTab(tab_terrain_basics,"Basics");
42
43 QWidget*const tab_terrain_subdivision=new QWidget();
44 tab_terrain->addTab(tab_terrain_subdivision,"Subdivision");
45
46 QWidget*const tab_terrain_noise=new QWidget();
47 tab_terrain->addTab(tab_terrain_noise,"Noise");
48
49 QWidget*const tab_snow=new QWidget();
50 tabs->addTab(tab_snow,"Snow");
51
52 QWidget*const tab_rivers=new QWidget();
53 tabs->addTab(tab_rivers,"Rivers");
54
55 QWidget*const tab_colours=new QWidget();
56 tabs->addTab(tab_colours,"Colours");
57
58 QWidget* tab_clouds=new QWidget();
59 tabs->addTab(tab_clouds,"Clouds");
60
61 QGridLayout*const grid_terrain_basics=new QGridLayout();
62 tab_terrain_basics->setLayout(grid_terrain_basics);
63 QGridLayout*const grid_terrain_subdivision=new QGridLayout();
64 tab_terrain_subdivision->setLayout(grid_terrain_subdivision);
65 QGridLayout*const grid_terrain_noise=new QGridLayout();
66 tab_terrain_noise->setLayout(grid_terrain_noise);
67
68 grid_terrain_basics->addWidget(new QLabel("Generate:"),0,0);
69
70 QComboBox* object_type_combo_box=new QComboBox();
71 grid_terrain_basics->addWidget(object_type_combo_box,0,1);
72 object_type_combo_box->insertItem(ParametersObject::ObjectTypePlanet,"Planet");
73 object_type_combo_box->insertItem(ParametersObject::ObjectTypeFlatHexagon,"Hexagonal Area");
74 object_type_combo_box->insertItem(ParametersObject::ObjectTypeFlatTriangle,"Triangular Area");
75 object_type_combo_box->insertItem(ParametersObject::ObjectTypeFlatSquare,"Square Area");
76
77 object_type_combo_box->setCurrentIndex(parameters_terrain->object_type);
78
79 connect(
80 object_type_combo_box,SIGNAL(activated(int)),
81 this,SLOT(setObjectType(int))
82 );
83
84 base_height_label=new QLabel("Base land height (%):");
85 grid_terrain_basics->addWidget(base_height_label,1,0);
86 base_height_spinbox=new SpinBox(-100,100,10);
87 grid_terrain_basics->addWidget(base_height_spinbox,1,1);
88 base_height_spinbox->setValue((uint)(100.0*parameters_terrain->base_height));
89 connect(
90 base_height_spinbox,SIGNAL(valueChanged(int)),
91 this,SLOT(setBaseHeight(int))
92 );
93 base_height_spinbox->setToolTip("The initial height of land relative to sea-level");
94
95 terrain_seed_label=new QLabel("Terrain random seed:");
96 grid_terrain_basics->addWidget(terrain_seed_label,2,0);
97 terrain_seed_spinbox=new SpinBox(0xffffffff,0x7fffffff,1);
98 grid_terrain_basics->addWidget(terrain_seed_spinbox,2,1);
99 terrain_seed_spinbox->setValue(parameters_terrain->seed);
100 connect(
101 terrain_seed_spinbox,SIGNAL(valueChanged(int)),
102 this,SLOT(setTerrainSeed(int))
103 );
104 terrain_seed_spinbox->setToolTip("The random seed for subdivision and noise.");
105
106 subdivisions_label=new QLabel("Subdivisions:");
107 grid_terrain_subdivision->addWidget(subdivisions_label,0,0);
108 subdivisions_spinbox=new SpinBox(0,16,1);
109 grid_terrain_subdivision->addWidget(subdivisions_spinbox,0,1);
110 subdivisions_spinbox->setValue(parameters_terrain->subdivisions);
111 connect(
112 subdivisions_spinbox,SIGNAL(valueChanged(int)),
113 this,SLOT(setTerrainSubdivisions(int))
114 );
115 subdivisions_spinbox->setToolTip("The number of times the initial structure will be subdivided.\nWARNING: EACH STEP QUADRUPLES THE MEMORY REQUIREMENT!");
116
117 subdivisions_unperturbed_label=new QLabel("Unperturbed subdivisions:");
118 grid_terrain_subdivision->addWidget(subdivisions_unperturbed_label,1,0);
119 subdivisions_unperturbed_spinbox=new SpinBox(0,16,1);
120 grid_terrain_subdivision->addWidget(subdivisions_unperturbed_spinbox,1,1);
121 subdivisions_unperturbed_spinbox->setValue(parameters_terrain->subdivisions_unperturbed);
122 connect(
123 subdivisions_unperturbed_spinbox,SIGNAL(valueChanged(int)),
124 this,SLOT(setSubdivisionsUnperturbed(int))
125 );
126 subdivisions_unperturbed_spinbox->setToolTip("The number of subdivisions which will be performed without perturbing vertices");
127
128 variation_vertical_label=new QLabel("Vertical perturbation :");
129 grid_terrain_subdivision->addWidget(variation_vertical_label,2,0);
130 variation_vertical_spinbox=new SpinBox(0,50,1);
131 grid_terrain_subdivision->addWidget(variation_vertical_spinbox,2,1);
132 variation_vertical_spinbox->setValue((int)(100*parameters_terrain->variation.z));
133 connect(
134 variation_vertical_spinbox,SIGNAL(valueChanged(int)),
135 this,SLOT(setVariationVertical(int))
136 );
137 variation_vertical_spinbox->setToolTip("The magnitude of random height perturbations");
138
139 variation_horizontal_label=new QLabel("Horizontal perturbation:");
140 grid_terrain_subdivision->addWidget(variation_horizontal_label,3,0);
141 variation_horizontal_spinbox=new SpinBox(0,25,1);
142 grid_terrain_subdivision->addWidget(variation_horizontal_spinbox,3,1);
143 variation_horizontal_spinbox->setValue((int)(100*parameters_terrain->variation.x));
144 connect(
145 variation_horizontal_spinbox,SIGNAL(valueChanged(int)),
146 this,SLOT(setVariationHorizontal(int))
147 );
148 variation_horizontal_spinbox->setToolTip("The magnitude of random horizontal perturbations");
149
150 noise_terms_label=new QLabel("Noise terms");
151 grid_terrain_noise->addWidget(noise_terms_label,0,0);
152 noise_terms_spinbox=new SpinBox(0,10,1);
153 grid_terrain_noise->addWidget(noise_terms_spinbox,0,1);
154 noise_terms_spinbox->setValue(parameters_terrain->noise.terms);
155 connect(
156 noise_terms_spinbox,SIGNAL(valueChanged(int)),
157 this,SLOT(setNoiseTerms(int))
158 );
159 noise_terms_spinbox->setToolTip("Number of terms in added Perlin noise");
160
161 noise_frequency_label=new QLabel("Noise frequency");
162 grid_terrain_noise->addWidget(noise_frequency_label,1,0);
163 noise_frequency_spinbox=new SpinBox(0,10000,10);
164 grid_terrain_noise->addWidget(noise_frequency_spinbox,1,1);
165 noise_frequency_spinbox->setValue(static_cast<int>(100*parameters_terrain->noise.frequency));
166 connect(
167 noise_frequency_spinbox,SIGNAL(valueChanged(int)),
168 this,SLOT(setNoiseFrequency(int))
169 );
170 noise_frequency_spinbox->setToolTip("Frequency for Perlin noise 1st term");
171
172 noise_amplitude_label=new QLabel("Noise amplitude");
173 grid_terrain_noise->addWidget(noise_amplitude_label,2,0);
174 noise_amplitude_spinbox=new SpinBox(0,100,1);
175 grid_terrain_noise->addWidget(noise_amplitude_spinbox,2,1);
176 noise_amplitude_spinbox->setValue(static_cast<int>(100*parameters_terrain->noise.amplitude));
177 connect(
178 noise_amplitude_spinbox,SIGNAL(valueChanged(int)),
179 this,SLOT(setNoiseAmplitude(int))
180 );
181 noise_amplitude_spinbox->setToolTip("Amplitude for Perlin noise 1st term");
182
183 noise_amplitude_decay_label=new QLabel("Noise amplitude decay rate");
184 grid_terrain_noise->addWidget(noise_amplitude_decay_label,3,0);
185 noise_amplitude_decay_spinbox=new SpinBox(0,100,10);
186 grid_terrain_noise->addWidget(noise_amplitude_decay_spinbox,3,1);
187 noise_amplitude_decay_spinbox->setValue(static_cast<int>(100*parameters_terrain->noise.amplitude_decay));
188 connect(
189 noise_amplitude_decay_spinbox,SIGNAL(valueChanged(int)),
190 this,SLOT(setNoiseAmplitudeDecay(int))
191 );
192 noise_amplitude_decay_spinbox->setToolTip("Amplitude decay rate for subsequent Perlin noise terms\n(subsequent terms are this percentage amplitude of the previous term)");
193
194 power_law_label=new QLabel("Power law:");
195 grid_terrain_basics->addWidget(power_law_label,3,0);
196 power_law_spinbox=new SpinBox(1,10000,10);
197 grid_terrain_basics->addWidget(power_law_spinbox,3,1);
198 power_law_spinbox->setValue((int)(100*parameters_terrain->power_law));
199 connect(
200 power_law_spinbox,SIGNAL(valueChanged(int)),
201 this,SLOT(setPowerLaw(int))
202 );
203 power_law_spinbox->setToolTip("The power-law to be applied to elevations.");
204
205 QGridLayout*const grid_snow=new QGridLayout();
206 tab_snow->setLayout(grid_snow);
207
208 snowline_equator_label=new QLabel("Snowline at equator");
209 grid_snow->addWidget(snowline_equator_label,0,0);
210 snowline_equator_spinbox=new SpinBox(-100,200,10);
211 grid_snow->addWidget(snowline_equator_spinbox,0,1);
212 snowline_equator_spinbox->setValue((int)(100*parameters_terrain->snowline_equator));
213 connect(
214 snowline_equator_spinbox,SIGNAL(valueChanged(int)),
215 this,SLOT(setSnowlineEquator(int))
216 );
217 snowline_equator_spinbox->setToolTip("Snowline on the equator (as a % of the maximum height)");
218
219 snowline_pole_label=new QLabel("Snowline at pole");
220 grid_snow->addWidget(snowline_pole_label,1,0);
221 snowline_pole_spinbox=new SpinBox(-100,200,10);
222 grid_snow->addWidget(snowline_pole_spinbox,1,1);
223 snowline_pole_spinbox->setValue((int)(100*parameters_terrain->snowline_pole));
224 connect(
225 snowline_pole_spinbox,SIGNAL(valueChanged(int)),
226 this,SLOT(setSnowlinePole(int))
227 );
228 snowline_pole_spinbox->setToolTip("Snowline at the poles (as a % of the maximum height)");
229
230 snowline_power_law_label=new QLabel("Snowline power law");
231 grid_snow->addWidget(snowline_power_law_label,2,0);
232 snowline_power_law_spinbox=new SpinBox(1,1000,10);
233 grid_snow->addWidget(snowline_power_law_spinbox,2,1);
234 snowline_power_law_spinbox->setValue((int)(100*parameters_terrain->snowline_power_law));
235 connect(
236 snowline_power_law_spinbox,SIGNAL(valueChanged(int)),
237 this,SLOT(setSnowlinePowerLaw(int))
238 );
239 snowline_power_law_spinbox->setToolTip("Power law applied to snowline elevation.");
240
241 snowline_slope_effect_label=new QLabel("Snowline slope suppression");
242 grid_snow->addWidget(snowline_slope_effect_label,3,0);
243 snowline_slope_effect_spinbox=new SpinBox(0,10000,5);
244 grid_snow->addWidget(snowline_slope_effect_spinbox,3,1);
245 snowline_slope_effect_spinbox->setValue((int)(100*parameters_terrain->snowline_slope_effect));
246 connect(
247 snowline_slope_effect_spinbox,SIGNAL(valueChanged(int)),
248 this,SLOT(setSnowlineSlopeEffect(int))
249 );
250 snowline_slope_effect_spinbox->setToolTip("Snow suppression on slopes.");
251
252 snowline_glacier_effect_label=new QLabel("Snowline glacier effect");
253 grid_snow->addWidget(snowline_glacier_effect_label,4,0);
254 snowline_glacier_effect_spinbox=new SpinBox(-1000,1000,5);
255 grid_snow->addWidget(snowline_glacier_effect_spinbox,4,1);
256 snowline_glacier_effect_spinbox->setValue((int)(100*parameters_terrain->snowline_glacier_effect));
257 connect(
258 snowline_glacier_effect_spinbox,SIGNAL(valueChanged(int)),
259 this,SLOT(setSnowlineGlacierEffect(int))
260 );
261 snowline_glacier_effect_spinbox->setToolTip("Converts rivers to glaciers.");
262
263 QGridLayout*const grid_rivers=new QGridLayout();
264 tab_rivers->setLayout(grid_rivers);
265
266 rivers_label=new QLabel("Rivers:");
267 grid_rivers->addWidget(rivers_label,0,0);
268 rivers_spinbox=new SpinBox(0,1000000,100);
269 grid_rivers->addWidget(rivers_spinbox,0,1);
270 rivers_spinbox->setValue(parameters_terrain->rivers);
271 connect(
272 rivers_spinbox,SIGNAL(valueChanged(int)),
273 this,SLOT(setRivers(int))
274 );
275 rivers_spinbox->setToolTip("The number of rivers to be attempted to be generated");
276
277 rivers_seed_label=new QLabel("Rivers seed:");
278 grid_rivers->addWidget(rivers_seed_label,1,0);
279 rivers_seed_spinbox=new SpinBox(0xffffffff,0x7fffffff,1);
280 grid_rivers->addWidget(rivers_seed_spinbox,1,1);
281 rivers_seed_spinbox->setValue(parameters_terrain->rivers_seed);
282 connect(
283 rivers_seed_spinbox,SIGNAL(valueChanged(int)),
284 this,SLOT(setRiversSeed(int))
285 );
286 rivers_seed_spinbox->setToolTip("The random seed for river generation.");
287
288 lake_becomes_sea_label=new QLabel("Lake becomes sea:");
289 grid_rivers->addWidget(lake_becomes_sea_label,2,0);
290 lake_becomes_sea_spinbox=new SpinBox(1,100,1);
291 grid_rivers->addWidget(lake_becomes_sea_spinbox,2,1);
292 lake_becomes_sea_spinbox->setValue((uint)(100.0*parameters_terrain->lake_becomes_sea));
293 connect(
294 lake_becomes_sea_spinbox,SIGNAL(valueChanged(int)),
295 this,SLOT(setLakeBecomesSea(int))
296 );
297 lake_becomes_sea_spinbox->setToolTip("The percentage of planetary surface which must be covered by a lake for it to be considered a sea");
298
299 QGridLayout*const grid_colours=new QGridLayout();
300 tab_colours->setLayout(grid_colours);
301
302 colour_ocean_button=new QPushButton(build_icon_of_colour(parameters_terrain->colour_ocean),"Ocean");
303 grid_colours->addWidget(colour_ocean_button,0,0);
304 connect(
305 colour_ocean_button,SIGNAL(clicked()),
306 this,SLOT(pickColourOcean())
307 );
308 colour_shoreline_button=new QPushButton(build_icon_of_colour(parameters_terrain->colour_shoreline),"Shore");
309 grid_colours->addWidget(colour_shoreline_button,0,1);
310 connect(
311 colour_shoreline_button,SIGNAL(clicked()),
312 this,SLOT(pickColourShoreline())
313 );
314 colour_river_button=new QPushButton(build_icon_of_colour(parameters_terrain->colour_river),"River");
315 grid_colours->addWidget(colour_river_button,1,0);
316 connect(
317 colour_river_button,SIGNAL(clicked()),
318 this,SLOT(pickColourRiver())
319 );
320 colour_low_button=new QPushButton(build_icon_of_colour(parameters_terrain->colour_low),"Low");
321 grid_colours->addWidget(colour_low_button,1,1);
322 connect(
323 colour_low_button,SIGNAL(clicked()),
324 this,SLOT(pickColourLow())
325 );
326 colour_snow_button=new QPushButton(build_icon_of_colour(parameters_terrain->colour_snow),"Snow");
327 grid_colours->addWidget(colour_snow_button,2,0);
328 connect(
329 colour_snow_button,SIGNAL(clicked()),
330 this,SLOT(pickColourSnow())
331 );
332 colour_high_button=new QPushButton(build_icon_of_colour(parameters_terrain->colour_high),"High");
333 grid_colours->addWidget(colour_high_button,2,1);
334 connect(
335 colour_high_button,SIGNAL(clicked()),
336 this,SLOT(pickColourHigh())
337 );
338
339 grid_colours->addWidget(new QLabel("Oceans & rivers emissive"),3,0);
340 oceans_and_rivers_emissive_spinbox=new SpinBox(0,100,10);
341 grid_colours->addWidget(oceans_and_rivers_emissive_spinbox,3,1);
342 oceans_and_rivers_emissive_spinbox->setValue((uint)(100.0*parameters_terrain->oceans_and_rivers_emissive));
343 connect(
344 oceans_and_rivers_emissive_spinbox,SIGNAL(valueChanged(int)),
345 this,SLOT(setOceansAndRiversEmissive(int))
346 );
347 oceans_and_rivers_emissive_spinbox->setToolTip("Percentage of ocean and river colour which is emissive");
348
349 tab_clouds->setLayout(new QVBoxLayout());
350
351 QCheckBox*const clouds_checkbox=new QCheckBox("Clouds enabled");
352 tab_clouds->layout()->addWidget(clouds_checkbox);
353
354 clouds_checkbox->setToolTip("Switch on cloud generation");
355 clouds_checkbox->setChecked(parameters_cloud->enabled);
356 connect(
357 clouds_checkbox,SIGNAL(toggled(bool)),
358 this,SLOT(setCloudsEnabled(bool))
359 );
360
361 QWidget*const clouds_widget=new QWidget();
362 tab_clouds->layout()->addWidget(clouds_widget);
363 QGridLayout*const grid_clouds=new QGridLayout();
364 clouds_widget->setLayout(grid_clouds);
365
366 clouds_subdivisions_unlock_checkbox=new QCheckBox("Subdivisions ");
367 grid_clouds->addWidget(clouds_subdivisions_unlock_checkbox,1,0);
368 clouds_subdivisions_unlock_checkbox->setChecked(false);
369 clouds_subdivisions_unlock_checkbox->setToolTip("Enable explicit control of cloud subdivisons.\nWhen disabled, the cloud mesh will be subdivided by the same amount as the terrain");
370 connect(clouds_subdivisions_unlock_checkbox,SIGNAL(toggled(bool)),
371 this,SLOT(setCloudsSubdivisionsUnlocked(bool))
372 );
373
374 clouds_subdivisions_spinbox=new SpinBox(0,16,1);
375 grid_clouds->addWidget(clouds_subdivisions_spinbox,1,1);
376 clouds_subdivisions_spinbox->setValue(parameters_cloud->subdivisions);
377 connect(
378 clouds_subdivisions_spinbox,SIGNAL(valueChanged(int)),
379 this,SLOT(setCloudSubdivisions(int))
380 );
381 clouds_subdivisions_spinbox->setToolTip("The number of times the initial structure will be subdivided.\nWARNING: EACH STEP QUADRUPLES THE MEMORY REQUIREMENT!");
382 clouds_subdivisions_spinbox->setEnabled(clouds_subdivisions_unlock_checkbox->isChecked());
383 connect(
384 clouds_subdivisions_unlock_checkbox,SIGNAL(toggled(bool)),
385 clouds_subdivisions_spinbox,SLOT(setEnabled(bool))
386 );
387 setCloudsSubdivisionsUnlocked(clouds_subdivisions_unlock_checkbox->isChecked());
388
389 clouds_seed_label=new QLabel("Clouds seed:");
390 grid_clouds->addWidget(clouds_seed_label,2,0);
391 clouds_seed_spinbox=new SpinBox(0xffffffff,0x7fffffff,1);
392 grid_clouds->addWidget(clouds_seed_spinbox,2,1);
393 clouds_seed_spinbox->setValue(parameters_cloud->seed);
394 clouds_seed_spinbox->setToolTip("Random seed for cloud generation");
395
396 grid_clouds->addWidget(new QLabel("Cloud height"),3,0);
397 QSpinBox*const clouds_height_spinbox=new SpinBox(1,100,1);
398 grid_clouds->addWidget(clouds_height_spinbox,3,1);
399 clouds_height_spinbox->setValue(static_cast<int>(parameters_cloud->cloudbase*100.0f));
400 clouds_height_spinbox->setToolTip("Altitude of cloud layer");
401 connect(
402 clouds_height_spinbox,SIGNAL(valueChanged(int)),
403 this,SLOT(setCloudbase(int))
404 );
405
406 grid_clouds->addWidget(new QLabel("Weather systems"),4,0);
407 QSpinBox*const clouds_weather_systems_spinbox=new SpinBox(0,1000,10);
408 grid_clouds->addWidget(clouds_weather_systems_spinbox,4,1);
409 clouds_weather_systems_spinbox->setValue(parameters_cloud->weather_systems);
410 clouds_weather_systems_spinbox->setToolTip("Number of cyclonic features in clouds");
411 connect(
412 clouds_weather_systems_spinbox,SIGNAL(valueChanged(int)),
413 this,SLOT(setWeatherSystems(int))
414 );
415
416 colour_cloud_button=new QPushButton(build_icon_of_colour(parameters_cloud->colour),"Cloud colour");
417 grid_clouds->addWidget(colour_cloud_button,5,0,1,2);
418 connect(
419 colour_cloud_button,SIGNAL(clicked()),
420 this,SLOT(pickColourCloud())
421 );
422
423 // Wiring to disable all cloud controls
424 clouds_widget->setEnabled(parameters_cloud->enabled);
425 connect(
426 clouds_checkbox,SIGNAL(toggled(bool)),
427 clouds_widget,SLOT(setEnabled(bool))
428 );
429
430 QWidget*const regenerate_widget=new QWidget();
431 layout()->addWidget(regenerate_widget);
432 QGridLayout*const regenerate_grid=new QGridLayout();
433 regenerate_widget->setLayout(regenerate_grid);
434
435 regenerate_button=new QPushButton("Generate");
436 regenerate_grid->addWidget(regenerate_button,0,0,1,3);
437 connect(
438 regenerate_button,SIGNAL(clicked()),
439 regenerate_target,SLOT(regenerate())
440 );
441
442 regenerate_with_new_terrain_seed_button=new QPushButton("...new terrain seed");
443 regenerate_grid->addWidget(regenerate_with_new_terrain_seed_button,1,0);
444 connect(
445 regenerate_with_new_terrain_seed_button,SIGNAL(clicked()),
446 this,SLOT(regenerate_with_new_terrain_seed())
447 );
448
449 regenerate_with_new_rivers_seed_button=new QPushButton("...new rivers seed");
450 regenerate_grid->addWidget(regenerate_with_new_rivers_seed_button,1,1);
451 connect(
452 regenerate_with_new_rivers_seed_button,SIGNAL(clicked()),
453 this,SLOT(regenerate_with_new_rivers_seed())
454 );
455
456 regenerate_with_new_clouds_seed_button=new QPushButton("...new clouds seed");
457 regenerate_grid->addWidget(regenerate_with_new_clouds_seed_button,1,2);
458 connect(
459 regenerate_with_new_clouds_seed_button,SIGNAL(clicked()),
460 this,SLOT(regenerate_with_new_clouds_seed())
461 );
462 regenerate_with_new_clouds_seed_button->setEnabled(parameters_cloud->enabled);
463 connect(
464 clouds_checkbox,SIGNAL(toggled(bool)),
465 regenerate_with_new_clouds_seed_button,SLOT(setEnabled(bool))
466 );
467 }
468
regenerate_with_new_terrain_seed()469 void ControlTerrain::regenerate_with_new_terrain_seed()
470 {
471 parameters_terrain->seed++;
472 terrain_seed_spinbox->setValue(parameters_terrain->seed);
473
474 regenerate_target->regenerate();
475 }
476
regenerate_with_new_rivers_seed()477 void ControlTerrain::regenerate_with_new_rivers_seed()
478 {
479 parameters_terrain->rivers_seed++;
480 rivers_seed_spinbox->setValue(parameters_terrain->rivers_seed);
481
482 regenerate_target->regenerate();
483 }
484
regenerate_with_new_clouds_seed()485 void ControlTerrain::regenerate_with_new_clouds_seed()
486 {
487 parameters_cloud->seed++;
488 clouds_seed_spinbox->setValue(parameters_cloud->seed);
489
490 regenerate_target->regenerate();
491 }
492
493