Developer Documentation
Loading...
Searching...
No Matches
LightWidget.cc
1/*===========================================================================*\
2* *
3* OpenFlipper *
4 * Copyright (c) 2001-2015, RWTH-Aachen University *
5 * Department of Computer Graphics and Multimedia *
6 * All rights reserved. *
7 * www.openflipper.org *
8 * *
9 *---------------------------------------------------------------------------*
10 * This file is part of OpenFlipper. *
11 *---------------------------------------------------------------------------*
12 * *
13 * Redistribution and use in source and binary forms, with or without *
14 * modification, are permitted provided that the following conditions *
15 * are met: *
16 * *
17 * 1. Redistributions of source code must retain the above copyright notice, *
18 * this list of conditions and the following disclaimer. *
19 * *
20 * 2. Redistributions in binary form must reproduce the above copyright *
21 * notice, this list of conditions and the following disclaimer in the *
22 * documentation and/or other materials provided with the distribution. *
23 * *
24 * 3. Neither the name of the copyright holder nor the names of its *
25 * contributors may be used to endorse or promote products derived from *
26 * this software without specific prior written permission. *
27 * *
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39* *
40\*===========================================================================*/
41
42
43
44#include "LightWidget.hh"
45
46LightWidget::LightWidget( ACG::SceneGraph::BaseNode* _node, QWidget *parent)
47 : QDialog(parent),
48 object_(0),
49 light_(0),
50 updatingWidgets_(false)
51{
52 setupUi(this);
53
54 node_ = dynamic_cast< ACG::SceneGraph::LightNode* >(_node);
55
56 if ( ! node_ ) {
57 std::cerr << "LightWidget could not cast given node to LightNode!" << std::endl;
58 return;
59 }
60
61 connect(directional,SIGNAL(clicked()),this,SLOT(directionalToggled()));
62
63 connect(fixedPosition ,SIGNAL(clicked()),this,SLOT(fixedPositionChanged()));
64
65 connect(xpos,SIGNAL(editingFinished()),this,SLOT(directionalToggled()));
66 connect(ypos,SIGNAL(editingFinished()),this,SLOT(directionalToggled()));
67 connect(zpos,SIGNAL(editingFinished()),this,SLOT(directionalToggled()));
68
69 connect(xdir,SIGNAL(editingFinished()),this,SLOT(directionalToggled()));
70 connect(ydir,SIGNAL(editingFinished()),this,SLOT(directionalToggled()));
71 connect(zdir,SIGNAL(editingFinished()),this,SLOT(directionalToggled()));
72
73 connect(spotx,SIGNAL(editingFinished()),this,SLOT(spotChanged()));
74 connect(spoty,SIGNAL(editingFinished()),this,SLOT(spotChanged()));
75 connect(spotz,SIGNAL(editingFinished()),this,SLOT(spotChanged()));
76
77 connect(angle,SIGNAL(editingFinished()),this,SLOT(spotChanged()));
78 connect(exponent,SIGNAL(editingFinished()),this,SLOT(spotChanged()));
79
80 brightness->setTracking(true);
81 connect(brightness, SIGNAL(valueChanged(int)), this, SLOT(brightnessChanged(int)));
82
83 connect(ambientR,SIGNAL(editingFinished()),this,SLOT(ambientChanged()));
84 connect(ambientG,SIGNAL(editingFinished()),this,SLOT(ambientChanged()));
85 connect(ambientB,SIGNAL(editingFinished()),this,SLOT(ambientChanged()));
86 connect(ambientA,SIGNAL(editingFinished()),this,SLOT(ambientChanged()));
87
88 connect(diffuseR,SIGNAL(editingFinished()),this,SLOT(diffuseChanged()));
89 connect(diffuseG,SIGNAL(editingFinished()),this,SLOT(diffuseChanged()));
90 connect(diffuseB,SIGNAL(editingFinished()),this,SLOT(diffuseChanged()));
91 connect(diffuseA,SIGNAL(editingFinished()),this,SLOT(diffuseChanged()));
92
93 connect(specularR,SIGNAL(editingFinished()),this,SLOT(specularChanged()));
94 connect(specularG,SIGNAL(editingFinished()),this,SLOT(specularChanged()));
95 connect(specularB,SIGNAL(editingFinished()),this,SLOT(specularChanged()));
96 connect(specularA,SIGNAL(editingFinished()),this,SLOT(specularChanged()));
97
98 connect(radius,SIGNAL(editingFinished()),this,SLOT(radiusChanged()));
99}
100
101void LightWidget::showEvent ( QShowEvent * /*event*/ )
102{
103 if ( !getObject() )
104 return;
105
106 // Block updates
107 updatingWidgets_ = true;
108
109 directional->setChecked( light_->directional() );
110
111 // Switch to right tab
112 if ( directional->isChecked() )
113 stackedWidget->setCurrentIndex(1);
114 else
115 stackedWidget->setCurrentIndex(0);
116
117 xdir->setText(QString::number(light_->direction()[0]));
118 ydir->setText(QString::number(light_->direction()[1]));
119 zdir->setText(QString::number(light_->direction()[2]));
120
121 xpos->setText(QString::number(light_->position()[0]));
122 ypos->setText(QString::number(light_->position()[1]));
123 zpos->setText(QString::number(light_->position()[2]));
124
125 fixedPosition->setChecked( light_->fixedPosition() );
126
127 spotx->setText(QString::number(light_->spotDirection()[0]));
128 spoty->setText(QString::number(light_->spotDirection()[1]));
129 spotz->setText(QString::number(light_->spotDirection()[2]));
130
131 angle->setText(QString::number(light_->spotCutoff()));
132 exponent->setText(QString::number(light_->spotExponent()));
133
134 ambientR->setText(QString::number(light_->ambientColor()[0]));
135 ambientG->setText(QString::number(light_->ambientColor()[1]));
136 ambientB->setText(QString::number(light_->ambientColor()[2]));
137 ambientA->setText(QString::number(light_->ambientColor()[3]));
138
139 diffuseR->setText(QString::number(light_->diffuseColor()[0]));
140 diffuseG->setText(QString::number(light_->diffuseColor()[1]));
141 diffuseB->setText(QString::number(light_->diffuseColor()[2]));
142 diffuseA->setText(QString::number(light_->diffuseColor()[3]));
143
144 specularR->setText(QString::number(light_->specularColor()[0]));
145 specularG->setText(QString::number(light_->specularColor()[1]));
146 specularB->setText(QString::number(light_->specularColor()[2]));
147 specularA->setText(QString::number(light_->specularColor()[3]));
148
149 brightness->setSliderPosition((int)(light_->brightness()*100));
150
151 radius->setText(QString::number(light_->radius()));
152
153 // Allow updates
154 updatingWidgets_ = false;
155
156}
157
158
160
161 // Block if we currently update the widgets or if we dont get the object
162 if (updatingWidgets_ || !getObject() )
163 return;
164
165 // Switch to right tab
166 if ( directional->isChecked() )
167 stackedWidget->setCurrentIndex(1);
168 else
169 stackedWidget->setCurrentIndex(0);
170
171 if ( directional->isChecked() )
172 light_->direction( ACG::Vec3d( xdir->text().toDouble() ,ydir->text().toDouble() ,zdir->text().toDouble() ));
173 else
174 light_->position( ACG::Vec3d( xpos->text().toDouble() ,ypos->text().toDouble() ,zpos->text().toDouble() ));
175
176 updated();
177
178}
179
181
182 // Block if we currently update the widgets or if we dont get the object
183 if (updatingWidgets_ || !getObject() )
184 return;
185
186 light_->fixedPosition( fixedPosition->isChecked() );
187
188 updated();
189}
190
192
193 // Block if we currently update the widgets or if we dont get the object
194 if (updatingWidgets_ || !getObject() )
195 return;
196
197 light_->ambientColor(ACG::Vec4f(ambientR->text().toDouble(),
198 ambientG->text().toDouble(),
199 ambientB->text().toDouble(),
200 ambientA->text().toDouble()));
201 updated();
202}
203
204void LightWidget::diffuseChanged() {
205
206 // Block if we currently update the widgets or if we dont get the object
207 if (updatingWidgets_ || !getObject() )
208 return;
209
210 light_->diffuseColor(ACG::Vec4f(diffuseR->text().toDouble(),
211 diffuseG->text().toDouble(),
212 diffuseB->text().toDouble(),
213 diffuseA->text().toDouble()));
214 updated();
215}
216
217void LightWidget::specularChanged() {
218
219 // Block if we currently update the widgets or if we dont get the object
220 if (updatingWidgets_ || !getObject() )
221 return;
222
223 light_->specularColor(ACG::Vec4f(specularR->text().toDouble(),
224 specularG->text().toDouble(),
225 specularB->text().toDouble(),
226 specularA->text().toDouble()));
227 updated();
228}
229
231
232 // Block if we currently update the widgets or if we dont get the object
233 if (updatingWidgets_ || !getObject() )
234 return;
235
236 float pos = _newValue;
237 pos /= 100.0f;
238
239 light_->brightness(pos);
240
241 updated();
242}
243
245
246 // Block if we currently update the widgets or if we dont get the object
247 if (updatingWidgets_ || !getObject() )
248 return;
249
250 light_->radius(radius->text().toDouble());
251
252 updated();
253}
254
256 // Block if we currently update the widgets or if we dont get the object
257 if (updatingWidgets_ || !getObject() )
258 return;
259
260 light_->spotDirection( ACG::Vec3d( spotx->text().toDouble() ,spoty->text().toDouble() ,spotz->text().toDouble() ));
261 light_->spotCutoff(angle->text().toDouble());
262
263 light_->spotExponent(exponent->text().toDouble());
264
265 updated();
266}
267
269
270 if ( !object_ ) {
272 if ( o_it->hasNode(node_) ) {
273 object_ = PluginFunctions::lightObject(*o_it);
274 light_ = PluginFunctions::lightSource(object_);
275 return true;
276 }
277 }
278
279 std::cerr << " Object not found! " << std::endl;
280
281 // Not Found!
282 return false;
283 }
284
285 return true;
286}
287
289
290 // Update the object
291 object_->update();
292
293 // Force a redraw
294 node_->setDirty();
295
296}
#define DATA_LIGHT
Definition Light.hh:58
void setDirty(bool _dirty=true)
mark node for redrawn
Definition BaseNode.hh:275
void fixedPosition(bool _state)
make LightSource fixed or moveable with ModelViewMatrix
Definition LightNode.cc:172
Vec3d direction() const
Get direction of the light source.
Definition LightNode.cc:123
float radius() const
Get light source radius.
Definition LightNode.hh:206
void specularColor(Vec4f _color)
set Specular color for LightSource
Definition LightNode.cc:160
void diffuseColor(Vec4f _color)
set Diffuse color for LightSource
Definition LightNode.cc:154
void position(Vec3d _pos)
Set position for LightSource.
Definition LightNode.cc:108
void ambientColor(Vec4f _color)
set Ambient color for LightSource
Definition LightNode.cc:148
bool directional() const
Check if the light source is a directional light source.
Definition LightNode.cc:127
void spotDirection(Vec3d _pos)
Set spot direction.
Definition LightNode.cc:141
virtual void update(UpdateType _type=UPDATE_ALL)
Update the Light Object.
void fixedPositionChanged()
The fixed position checkbox.
virtual void showEvent(QShowEvent *event)
Initialize contents of widget before showing it.
void spotChanged()
Spot direction changed.
void brightnessChanged(int _newValue)
Brightness value has changed.
void directionalToggled()
The directional checkbox changed -> update object.
void radiusChanged()
Light radius has changed.
bool getObject()
Initializes the internal object. Returns true if successfull.
void ambientChanged()
Color values have changed.
void updated()
Called when the object has been updated.
LightObject * lightObject(BaseObjectData *_object)
Cast an BaseObject to a LightObject if possible.
DLLEXPORT ObjectIterator objectsEnd()
Return Iterator to Object End.
LightSource * lightSource(BaseObjectData *_object)
Get the lightSource in this Object.
const QStringList ALL_OBJECTS
Iterable object range.