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_render.h"
21 
ControlRender(ParametersRender * param)22 ControlRender::ControlRender(ParametersRender* param)
23   :Control()
24   ,parameters(param)
25 {
26   wireframe=new QCheckBox("Wireframe");
27   layout()->addWidget(wireframe);
28   wireframe->setChecked(parameters->wireframe);
29   wireframe->setToolTip("Selects wireframe OpenGL rendering");
30   connect(
31 	  wireframe,SIGNAL(stateChanged(int)),
32 	  this,SLOT(setWireframe(int))
33 	  );
34 
35   joystick_mouse=new QCheckBox("Joystick mouse-Y (fly mode)");
36   layout()->addWidget(joystick_mouse);
37   joystick_mouse->setChecked(parameters->joystick_mouse);
38   joystick_mouse->setToolTip("Mouse y-axis functions as joystick in fly mode:\nmouse moved down/pulled-back pitches up.");
39   connect(
40 	  joystick_mouse,SIGNAL(stateChanged(int)),
41 	  this,SLOT(setJoystickMouse(int))
42 	  );
43 
44   display_list=new QCheckBox("Display list");
45   layout()->addWidget(display_list);
46   display_list->setChecked(parameters->display_list);
47   display_list->setToolTip("Use OpenGL display lists; CAUTION: unstable on many platforms");
48   connect(
49 	  display_list,SIGNAL(stateChanged(int)),
50 	  this,SLOT(setDisplayList(int))
51 	  );
52 
53   background_colour_low_button=new QPushButton(build_icon_of_colour(parameters->background_colour_low),"Background colour (low altitude)");
54   layout()->addWidget(background_colour_low_button);
55   background_colour_low_button->setToolTip("Colour used in display area when the camera is low.");
56   connect(background_colour_low_button,SIGNAL(clicked()),
57 	  this,SLOT(pickBackgroundColourLow())
58 	  );
59 
60   background_colour_high_button=new QPushButton(build_icon_of_colour(parameters->background_colour_high),"Background colour (high altitude)");
61   layout()->addWidget(background_colour_high_button);
62   background_colour_high_button->setToolTip("Colour used in display area when the camera is high.");
63   connect(background_colour_high_button,SIGNAL(clicked()),
64 	  this,SLOT(pickBackgroundColourHigh())
65 	  );
66 
67   QGroupBox* ambient_box=new QGroupBox("Ambient");
68   layout()->addWidget(ambient_box);
69   ambient_box->setLayout(new QHBoxLayout());
70 
71   ambient_box->layout()->addWidget(new QLabel("0.0"));
72 
73   ambient=new QSlider(Qt::Horizontal);
74   ambient_box->layout()->addWidget(ambient);
75   ambient->setMinimum(0);
76   ambient->setValue(10);   //! \todo Should be obtained from somewhere ?
77   ambient->setMaximum(100);
78   ambient->setTickInterval(10);
79   ambient->setTickPosition(QSlider::TicksBothSides);
80   ambient->setTracking(true);
81 
82   ambient_box->layout()->addWidget(new QLabel("1.0"));
83 
84   connect(
85 	  ambient,SIGNAL(valueChanged(int)),
86 	  this,SLOT(setAmbient(int))
87 	  );
88 
89   QGroupBox* illumination_box=new QGroupBox("Illumination azimuth/elevation");
90   layout()->addWidget(illumination_box);
91   illumination_box->setLayout(new QHBoxLayout());  // TODO: Need a grid here, not an hbox
92 
93   illumination_box->layout()->addWidget(new QLabel("-180"));
94 
95   illumination_azimuth=new QSlider(Qt::Horizontal);
96   illumination_box->layout()->addWidget(illumination_azimuth);
97   illumination_azimuth->setMinimum(-180);
98   illumination_azimuth->setValue(static_cast<int>(parameters->illumination_azimuth*180/M_PI));
99   illumination_azimuth->setMaximum(180);
100   illumination_azimuth->setTickInterval(10);
101   illumination_azimuth->setTickPosition(QSlider::TicksBothSides);
102   illumination_azimuth->setTracking(true);
103 
104   illumination_box->layout()->addWidget(new QLabel("180"));
105 
106   illumination_box->layout()->addWidget(new QLabel("-90"));
107 
108   illumination_elevation=new QSlider(Qt::Horizontal);
109   illumination_box->layout()->addWidget(illumination_elevation);
110   illumination_elevation->setMinimum(-90);
111   illumination_elevation->setValue(static_cast<int>(parameters->illumination_elevation*180/M_PI));
112   illumination_elevation->setMaximum(90);
113   illumination_elevation->setTickInterval(10);
114   illumination_elevation->setTickPosition(QSlider::TicksBothSides);
115   illumination_elevation->setTracking(true);
116 
117   illumination_box->layout()->addWidget(new QLabel("90"));
118 
119   connect(
120 	  illumination_azimuth,SIGNAL(valueChanged(int)),
121 	  this,SLOT(setIlluminationAzimuth(int))
122 	  );
123   connect(
124 	  illumination_elevation,SIGNAL(valueChanged(int)),
125 	  this,SLOT(setIlluminationElevation(int))
126 	  );
127 
128   QWidget*const padding=new QWidget();
129   layout()->addWidget(padding);
130   padding->setSizePolicy(QSizePolicy(QSizePolicy::Preferred,QSizePolicy::Expanding));  // Expanding vertically
131 }
132 
~ControlRender()133 ControlRender::~ControlRender()
134 {}
135 
setWireframe(int v)136 void ControlRender::setWireframe(int v)
137 {
138   parameters->wireframe=(v==2);
139 }
140 
setDisplayList(int v)141 void ControlRender::setDisplayList(int v)
142 {
143   parameters->display_list=(v==2);
144 }
145 
setJoystickMouse(int v)146 void ControlRender::setJoystickMouse(int v)
147 {
148   parameters->joystick_mouse=(v==2);
149 }
150 
setAmbient(int v)151 void ControlRender::setAmbient(int v)
152 {
153   parameters->ambient=v/100.0f;
154 }
155 
setIlluminationAzimuth(int v)156 void ControlRender::setIlluminationAzimuth(int v)
157 {
158   parameters->illumination_azimuth=v*M_PI/180;
159 }
160 
setIlluminationElevation(int v)161 void ControlRender::setIlluminationElevation(int v)
162 {
163   parameters->illumination_elevation=v*M_PI/180;
164 }
165 
pickBackgroundColourLow()166 void ControlRender::pickBackgroundColourLow()
167 {
168   emit pickColour(background_colour_low_button,parameters->background_colour_low);
169 }
170 
pickBackgroundColourHigh()171 void ControlRender::pickBackgroundColourHigh()
172 {
173   emit pickColour(background_colour_high_button,parameters->background_colour_high);
174 }
175