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 /*! \file
21   \brief Interface for class ControlTerrain.
22 */
23 
24 #ifndef _control_terrain_h_
25 #define _control_terrain_h_
26 
27 #include "common.h"
28 #include "control.h"
29 #include "parameters_terrain.h"
30 #include "parameters_cloud.h"
31 #include "qtcommon.h"
32 
33 class FracplanetMain;
34 
35 //! Encapsulates controls for setting terrain generation parameters
36 /*! \todo: Way too much stuff in this classes .h file. Shift it to the .cpp!
37  */
38 class ControlTerrain : public Control
39 {
40  private:
41 
42   Q_OBJECT;
43 
44  public:
45 
46   ControlTerrain(FracplanetMain* tgt,ParametersTerrain* param_terrain,ParametersCloud* param_cloud);
47 
~ControlTerrain()48   ~ControlTerrain()
49     {}
50 
51   public slots:
52 
setObjectType(int id)53   void setObjectType(int id)
54     {
55       parameters_terrain->object_type=static_cast<ParametersObject::ObjectType>(id);
56       parameters_cloud->object_type=static_cast<ParametersObject::ObjectType>(id);
57     }
setTerrainSeed(int v)58   void setTerrainSeed(int v)
59     {
60       parameters_terrain->seed=v;
61     }
setTerrainSubdivisions(int v)62   void setTerrainSubdivisions(int v)
63     {
64       parameters_terrain->subdivisions=v;
65     }
setCloudSubdivisions(int v)66   void setCloudSubdivisions(int v)
67     {
68       parameters_cloud->subdivisions=v;
69     }
setSubdivisionsUnperturbed(int v)70   void setSubdivisionsUnperturbed(int v)
71     {
72       parameters_terrain->subdivisions_unperturbed=v;
73     }
setVariationVertical(int v)74   void setVariationVertical(int v)
75     {
76       parameters_terrain->variation.z=v/100.0;
77     }
setVariationHorizontal(int v)78   void setVariationHorizontal(int v)
79     {
80       parameters_terrain->variation.x=v/100.0;
81       parameters_terrain->variation.y=v/100.0;
82     }
setNoiseTerms(int v)83   void setNoiseTerms(int v)
84     {
85       parameters_terrain->noise.terms=v;
86     }
setNoiseFrequency(int v)87   void setNoiseFrequency(int v)
88     {
89       parameters_terrain->noise.frequency=v/100.0;
90     }
setNoiseAmplitude(int v)91   void setNoiseAmplitude(int v)
92     {
93       parameters_terrain->noise.amplitude=v/100.0;
94     }
setNoiseAmplitudeDecay(int v)95   void setNoiseAmplitudeDecay(int v)
96     {
97       parameters_terrain->noise.amplitude_decay=v/100.0;
98     }
setBaseHeight(int v)99   void setBaseHeight(int v)
100     {
101       parameters_terrain->base_height=v/100.0;
102     }
setPowerLaw(int v)103   void setPowerLaw(int v)
104     {
105       parameters_terrain->power_law=v/100.0;
106     }
setSnowlineEquator(int v)107   void setSnowlineEquator(int v)
108     {
109       parameters_terrain->snowline_equator=v/100.0;
110     }
setSnowlinePole(int v)111   void setSnowlinePole(int v)
112     {
113       parameters_terrain->snowline_pole=v/100.0;
114     }
setSnowlinePowerLaw(int v)115   void setSnowlinePowerLaw(int v)
116     {
117       parameters_terrain->snowline_power_law=v/100.0;
118     }
setSnowlineSlopeEffect(int v)119   void setSnowlineSlopeEffect(int v)
120     {
121       parameters_terrain->snowline_slope_effect=v/100.0;
122     }
setSnowlineGlacierEffect(int v)123   void setSnowlineGlacierEffect(int v)
124     {
125       parameters_terrain->snowline_glacier_effect=v/100.0;
126     }
setRivers(int v)127   void setRivers(int v)
128     {
129       parameters_terrain->rivers=v;
130     }
setRiversSeed(int v)131   void setRiversSeed(int v)
132     {
133       parameters_terrain->rivers_seed=v;
134     }
setLakeBecomesSea(int v)135   void setLakeBecomesSea(int v)
136     {
137       parameters_terrain->lake_becomes_sea=v/100.0;
138     }
setOceansAndRiversEmissive(int v)139   void setOceansAndRiversEmissive(int v)
140     {
141       parameters_terrain->oceans_and_rivers_emissive=v/100.0;
142     }
pickColourOcean()143   void pickColourOcean()
144     {
145       emit pickColour(colour_ocean_button,parameters_terrain->colour_ocean);
146     }
pickColourShoreline()147   void pickColourShoreline()
148     {
149       emit pickColour(colour_shoreline_button,parameters_terrain->colour_shoreline);
150     }
pickColourLow()151   void pickColourLow()
152     {
153       emit pickColour(colour_low_button,parameters_terrain->colour_low);
154     }
pickColourRiver()155   void pickColourRiver()
156     {
157       emit pickColour(colour_river_button,parameters_terrain->colour_river);
158     }
pickColourSnow()159   void pickColourSnow()
160     {
161       emit pickColour(colour_snow_button,parameters_terrain->colour_snow);
162     }
pickColourHigh()163   void pickColourHigh()
164     {
165       emit pickColour(colour_high_button,parameters_terrain->colour_high);
166     }
pickColourCloud()167   void pickColourCloud()
168     {
169       emit pickColour(colour_cloud_button,parameters_cloud->colour);
170     }
setCloudsSubdivisionsUnlocked(bool f)171   void setCloudsSubdivisionsUnlocked(bool f)
172     {
173       if (f)
174 	{
175 	  disconnect(
176 		     subdivisions_spinbox,SIGNAL(valueChanged(int)),
177 		     clouds_subdivisions_spinbox,SLOT(setValue(int))
178 		     );
179 	}
180       else
181 	{
182 	  clouds_subdivisions_spinbox->setValue(parameters_terrain->subdivisions);
183 	  connect(
184 		  subdivisions_spinbox,SIGNAL(valueChanged(int)),
185 		  clouds_subdivisions_spinbox,SLOT(setValue(int))
186 		  );
187 
188 	}
189     }
190 
setCloudsEnabled(bool f)191   void setCloudsEnabled(bool f)
192     {
193       parameters_cloud->enabled=f;
194     }
setCloudbase(int v)195   void setCloudbase(int v)
196     {
197       parameters_cloud->cloudbase=v/100.0f;
198     }
setWeatherSystems(int v)199   void setWeatherSystems(int v)
200     {
201       parameters_cloud->weather_systems=v;
202     }
203 
204   void regenerate_with_new_terrain_seed();
205   void regenerate_with_new_rivers_seed();
206   void regenerate_with_new_clouds_seed();
207 
208  private:
209 
210   //! Pointer to the terrain parameters we control.
211   ParametersTerrain*const parameters_terrain;
212 
213   //! Pointer to the cloud parameters we control.
214   ParametersCloud*const parameters_cloud;
215 
216   //! Requests to regenerate terrain are forwarded to the top level GUI widget.
217   FracplanetMain* regenerate_target;
218 
219   QComboBox* object_type_combo_box;
220 
221   QLabel* base_height_label;
222   QSpinBox* base_height_spinbox;
223 
224   QLabel* terrain_seed_label;
225   QSpinBox* terrain_seed_spinbox;
226   QLabel* subdivisions_label;
227   QSpinBox* subdivisions_spinbox;
228   QLabel* subdivisions_unperturbed_label;
229   QSpinBox* subdivisions_unperturbed_spinbox;
230 
231   QLabel* variation_vertical_label;
232   QSpinBox* variation_vertical_spinbox;
233   QLabel* variation_horizontal_label;
234   QSpinBox* variation_horizontal_spinbox;
235 
236   QLabel* noise_terms_label;
237   QSpinBox* noise_terms_spinbox;
238   QLabel* noise_frequency_label;
239   QSpinBox* noise_frequency_spinbox;
240   QLabel* noise_amplitude_label;
241   QSpinBox* noise_amplitude_spinbox;
242   QLabel* noise_amplitude_decay_label;
243   QSpinBox* noise_amplitude_decay_spinbox;
244 
245   QLabel* power_law_label;
246   QSpinBox* power_law_spinbox;
247 
248   QLabel* snowline_equator_label;
249   QSpinBox* snowline_equator_spinbox;
250   QLabel* snowline_pole_label;
251   QSpinBox* snowline_pole_spinbox;
252   QLabel* snowline_power_law_label;
253   QSpinBox* snowline_power_law_spinbox;
254   QLabel* snowline_slope_effect_label;
255   QSpinBox* snowline_slope_effect_spinbox;
256   QLabel* snowline_glacier_effect_label;
257   QSpinBox* snowline_glacier_effect_spinbox;
258 
259   QLabel* rivers_label;
260   QSpinBox* rivers_spinbox;
261   QLabel* rivers_seed_label;
262   QSpinBox* rivers_seed_spinbox;
263   QLabel* lake_becomes_sea_label;
264   QSpinBox* lake_becomes_sea_spinbox;
265 
266   QSpinBox* oceans_and_rivers_emissive_spinbox;
267 
268   QLabel* clouds_seed_label;
269   QSpinBox* clouds_seed_spinbox;
270 
271   QLabel* colour_label;
272   QPushButton* colour_ocean_button;
273   QPushButton* colour_shoreline_button;
274   QPushButton* colour_low_button;
275   QPushButton* colour_river_button;
276   QPushButton* colour_snow_button;
277   QPushButton* colour_high_button;
278   QPushButton* colour_cloud_button;
279 
280   QCheckBox* clouds_subdivisions_unlock_checkbox;
281   QSpinBox* clouds_subdivisions_spinbox;
282 
283   QPushButton* regenerate_button;
284   QPushButton* regenerate_with_new_terrain_seed_button;
285   QPushButton* regenerate_with_new_rivers_seed_button;
286   QPushButton* regenerate_with_new_clouds_seed_button;
287 
288   QWidget* padding;
289 };
290 
291 #endif
292