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