Developer Documentation
Loading...
Searching...
No Matches
SplatCloudRenderingControlPlugin.cc
1//================================================================
2//
3/*===========================================================================*\
4* *
5* OpenFlipper *
6 * Copyright (c) 2001-2015, RWTH-Aachen University *
7 * Department of Computer Graphics and Multimedia *
8 * All rights reserved. *
9 * www.openflipper.org *
10 * *
11 *---------------------------------------------------------------------------*
12 * This file is part of OpenFlipper. *
13 *---------------------------------------------------------------------------*
14 * *
15 * Redistribution and use in source and binary forms, with or without *
16 * modification, are permitted provided that the following conditions *
17 * are met: *
18 * *
19 * 1. Redistributions of source code must retain the above copyright notice, *
20 * this list of conditions and the following disclaimer. *
21 * *
22 * 2. Redistributions in binary form must reproduce the above copyright *
23 * notice, this list of conditions and the following disclaimer in the *
24 * documentation and/or other materials provided with the distribution. *
25 * *
26 * 3. Neither the name of the copyright holder nor the names of its *
27 * contributors may be used to endorse or promote products derived from *
28 * this software without specific prior written permission. *
29 * *
30 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
31 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
32 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
33 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
34 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
35 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
36 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
37 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
38 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
39 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
40 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
41* *
42\*===========================================================================*/
43
44
45//================================================================
46//
47// CLASS SplatCloudRenderingControlPlugin - IMPLEMENTATION
48//
49//================================================================
50
51
52//== INCLUDES ====================================================
53
54
55#include "SplatCloudRenderingControlPlugin.hh"
56
58
60
62
63#include <QHBoxLayout>
64#include <QPushButton>
65#include <QRadioButton>
66#include <QLabel>
67#include <QMenu>
68#include <QTabWidget>
69
70
71
72//== IMPLEMENTATION ==============================================
73
74
75SplatCloudRenderingControlPlugin::SplatCloudRenderingControlPlugin() :
76 toolboxPointsizeScale_ ( 0 ),
77 toolboxDefaultColorR_ ( 0 ),
78 toolboxDefaultColorG_ ( 0 ),
79 toolboxDefaultColorB_ ( 0 ),
80 toolboxDefaultNormalX_ ( 0 ),
81 toolboxDefaultNormalY_ ( 0 ),
82 toolboxDefaultNormalZ_ ( 0 ),
83 toolboxDefaultPointsize_( 0 ),
84 contextScaleAction_ ( nullptr ),
85 contextCullingAction_ ( nullptr ),
86 contextDefaultsAction_ ( nullptr ),
87 contextReloadShadersAction_( nullptr ),
88 contextRebuildVBOAction_ ( nullptr ),
89 toolboxIcon_ ( nullptr ),
90 contextScaleWidget_ ( nullptr ),
91 contextScaleWidgetPointsizeScale_( nullptr ),
92 contextDefaultsWidget_ ( nullptr ),
93 contextDefaultsWidgetDefaultColorR_ ( nullptr ),
94 contextDefaultsWidgetDefaultColorG_ ( nullptr ),
95 contextDefaultsWidgetDefaultColorB_ ( nullptr ),
96 contextDefaultsWidgetDefaultNormalX_ ( nullptr ),
97 contextDefaultsWidgetDefaultNormalY_ ( nullptr ),
98 contextDefaultsWidgetDefaultNormalZ_ ( nullptr ),
99 contextDefaultsWidgetDefaultPointsize_( nullptr )
100{
101}
102
103SplatCloudRenderingControlPlugin::~SplatCloudRenderingControlPlugin() {
104 delete toolboxIcon_;
105}
106
107//----------------------------------------------------------------
108
109
110void SplatCloudRenderingControlPlugin::initializePlugin()
111{
112 // --------------------------------
113 // -------- create toolbox --------
114 // --------------------------------
115
116 // ---- options tab ----
117
118 // pointsize scale
119 toolboxPointsizeScale_ = new QDoubleSpinBox();
120 toolboxPointsizeScale_->setRange( 0.0, 100.0 );
121 toolboxPointsizeScale_->setDecimals( 4 );
122 toolboxPointsizeScale_->setSingleStep( 0.1 );
123 toolboxPointsizeScale_->setValue( 1.0 );
124 toolboxPointsizeScale_->setToolTip( "The scaling factor of the pointsizes used during the rendering of objects" );
125
126 // pointsize scale layout
127 QHBoxLayout *toolboxPointsizeScaleLayout = new QHBoxLayout();
128 toolboxPointsizeScaleLayout->setSpacing( 6 );
129 toolboxPointsizeScaleLayout->addWidget( new QLabel( "Pointsize Scaling Factor:" ) );
130 toolboxPointsizeScaleLayout->addWidget( toolboxPointsizeScale_ );
131
132 // buttons
133 QPushButton *toolboxEnableBackfaceCullingButton = new QPushButton ( "Enable Backface Culling" );
134 QPushButton *toolboxDisableBackfaceCullingButton = new QPushButton ( "Disable Backface Culling" );
135 QPushButton *toolboxReloadShadersButton = new QPushButton ( "Reload Shaders" );
136 QPushButton *toolboxRebuildVBOsButton = new QPushButton ( "Rebuild VBOs" );
137 QRadioButton *toolboxPointSizeButton = new QRadioButton( "Use gl_PointSize" );
138 QRadioButton *toolboxGeometryShaderButton = new QRadioButton( "Use Geometry Shader" );
139 toolboxEnableBackfaceCullingButton->setToolTip ( "Enable the culling of backfaces" );
140 toolboxDisableBackfaceCullingButton->setToolTip( "Disable the culling of backfaces" );
141 toolboxReloadShadersButton->setToolTip ( "Reload all shader files" );
142 toolboxRebuildVBOsButton->setToolTip ( "Rebuild all vertex-buffer-objects" );
143 toolboxPointSizeButton->setToolTip ( "Set gl_PointSize in vertex shader" );
144 toolboxGeometryShaderButton->setToolTip ( "Create quads in geometry shader" );
145
146 toolboxPointSizeButton->setChecked(true);
147
148 // buttonsA layout
149 QHBoxLayout *toolboxButtonsALayout = new QHBoxLayout();
150 toolboxButtonsALayout->setSpacing( 6 );
151 toolboxButtonsALayout->addWidget( toolboxEnableBackfaceCullingButton );
152 toolboxButtonsALayout->addWidget( toolboxDisableBackfaceCullingButton );
153
154 // separator frame
155 QFrame *toolboxSeparatorFrame = new QFrame();
156 toolboxSeparatorFrame->setFrameShape( QFrame::HLine );
157 toolboxSeparatorFrame->setFrameShadow( QFrame::Sunken );
158
159 // buttonsB layout
160 QHBoxLayout *toolboxButtonsBLayout = new QHBoxLayout();
161 toolboxButtonsBLayout->setSpacing( 6 );
162 toolboxButtonsBLayout->addWidget( toolboxReloadShadersButton );
163 toolboxButtonsBLayout->addWidget( toolboxRebuildVBOsButton );
164
165 // separator frame
166 QFrame *toolboxSeparatorFrameBC = new QFrame();
167 toolboxSeparatorFrameBC->setFrameShape(QFrame::HLine);
168 toolboxSeparatorFrameBC->setFrameShadow(QFrame::Sunken);
169
170 // buttonsC layout
171 QHBoxLayout *toolboxButtonsCLayout = new QHBoxLayout();
172 toolboxButtonsCLayout->setSpacing(6);
173 toolboxButtonsCLayout->addWidget(toolboxPointSizeButton);
174 toolboxButtonsCLayout->addWidget(toolboxGeometryShaderButton);
175
176 // options layout
177 QVBoxLayout *toolboxOptionsLayout = new QVBoxLayout();
178 toolboxOptionsLayout->setAlignment( Qt::AlignTop );
179 toolboxOptionsLayout->setSpacing( 6 );
180 toolboxOptionsLayout->addItem ( toolboxPointsizeScaleLayout );
181 toolboxOptionsLayout->addItem ( toolboxButtonsALayout );
182 toolboxOptionsLayout->addItem ( new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding ) );
183 toolboxOptionsLayout->addWidget( toolboxSeparatorFrame );
184 toolboxOptionsLayout->addItem ( toolboxButtonsBLayout );
185 toolboxOptionsLayout->addItem ( new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding ) );
186 toolboxOptionsLayout->addWidget( toolboxSeparatorFrameBC );
187 toolboxOptionsLayout->addItem ( toolboxButtonsCLayout );
188
189 // options widget
190 QWidget *toolboxOptionsWidget = new QWidget();
191 toolboxOptionsWidget->setLayout( toolboxOptionsLayout );
192 toolboxOptionsWidget->setToolTip( "Rendering options" );
193
194 // ---- defaults tab ----
195
196 // default color
197 toolboxDefaultColorR_ = new QSpinBox();
198 toolboxDefaultColorG_ = new QSpinBox();
199 toolboxDefaultColorB_ = new QSpinBox();
200 toolboxDefaultColorR_->setRange( 0, 255 );
201 toolboxDefaultColorG_->setRange( 0, 255 );
202 toolboxDefaultColorB_->setRange( 0, 255 );
203 toolboxDefaultColorR_->setSingleStep( 1 );
204 toolboxDefaultColorG_->setSingleStep( 1 );
205 toolboxDefaultColorB_->setSingleStep( 1 );
206 toolboxDefaultColorR_->setValue( 255 );
207 toolboxDefaultColorG_->setValue( 255 );
208 toolboxDefaultColorB_->setValue( 255 );
209 toolboxDefaultColorR_->setToolTip( "The default red-component of the color used when an object has no colors" );
210 toolboxDefaultColorG_->setToolTip( "The default green-component of the color used when an object has no colors" );
211 toolboxDefaultColorB_->setToolTip( "The default blue-component of the color used when an object has no colors" );
212
213 // default normal
214 toolboxDefaultNormalX_ = new QDoubleSpinBox();
215 toolboxDefaultNormalY_ = new QDoubleSpinBox();
216 toolboxDefaultNormalZ_ = new QDoubleSpinBox();
217 toolboxDefaultNormalX_->setRange( -1.0, 1.0 );
218 toolboxDefaultNormalY_->setRange( -1.0, 1.0 );
219 toolboxDefaultNormalZ_->setRange( -1.0, 1.0 );
220 toolboxDefaultNormalX_->setDecimals( 2 );
221 toolboxDefaultNormalY_->setDecimals( 2 );
222 toolboxDefaultNormalZ_->setDecimals( 2 );
223 toolboxDefaultNormalX_->setSingleStep( 0.1 );
224 toolboxDefaultNormalY_->setSingleStep( 0.1 );
225 toolboxDefaultNormalZ_->setSingleStep( 0.1 );
226 toolboxDefaultNormalX_->setValue( 0.0 );
227 toolboxDefaultNormalY_->setValue( 0.0 );
228 toolboxDefaultNormalZ_->setValue( 1.0 );
229 toolboxDefaultNormalX_->setToolTip( "The default x-component of the normal used when an object has no normals" );
230 toolboxDefaultNormalY_->setToolTip( "The default y-component of the normal used when an object has no normals" );
231 toolboxDefaultNormalZ_->setToolTip( "The default z-component of the normal used when an object has no normals" );
232
233 // default pointsize
234 toolboxDefaultPointsize_ = new QDoubleSpinBox();
235 toolboxDefaultPointsize_->setRange( 0.0, 1000.0 );
236 toolboxDefaultPointsize_->setDecimals( 3 );
237 toolboxDefaultPointsize_->setSingleStep( 0.01 );
238 toolboxDefaultPointsize_->setValue( 0.1 );
239 toolboxDefaultPointsize_->setToolTip( "The default pointsize used when an object has no pointsizes" );
240
241 // default color layout
242 QHBoxLayout *toolboxDefaultColorLayout = new QHBoxLayout();
243 toolboxDefaultColorLayout->setSpacing( 6 );
244 toolboxDefaultColorLayout->addWidget( toolboxDefaultColorR_ );
245 toolboxDefaultColorLayout->addWidget( toolboxDefaultColorG_ );
246 toolboxDefaultColorLayout->addWidget( toolboxDefaultColorB_ );
247
248 // default normal layout
249 QHBoxLayout *toolboxDefaultNormalLayout = new QHBoxLayout();
250 toolboxDefaultNormalLayout->setSpacing( 6 );
251 toolboxDefaultNormalLayout->addWidget( toolboxDefaultNormalX_ );
252 toolboxDefaultNormalLayout->addWidget( toolboxDefaultNormalY_ );
253 toolboxDefaultNormalLayout->addWidget( toolboxDefaultNormalZ_ );
254
255 // default pointsize layout
256 QHBoxLayout *toolboxDefaultPointsizeLayout = new QHBoxLayout();
257 toolboxDefaultPointsizeLayout->setSpacing( 6 );
258 toolboxDefaultPointsizeLayout->addWidget( toolboxDefaultPointsize_ );
259
260 // default options layout
261 QGridLayout *toolboxDefaultsLayout = new QGridLayout();
262 toolboxDefaultsLayout->setSpacing( 6 );
263 toolboxDefaultsLayout->addWidget( new QLabel( "Default Color:" ), 0, 0 );
264 toolboxDefaultsLayout->addWidget( new QLabel( "Default Normal:" ), 1, 0 );
265 toolboxDefaultsLayout->addWidget( new QLabel( "Default Pointsize:" ), 2, 0 );
266 toolboxDefaultsLayout->addItem ( toolboxDefaultColorLayout, 0, 1 );
267 toolboxDefaultsLayout->addItem ( toolboxDefaultNormalLayout, 1, 1 );
268 toolboxDefaultsLayout->addItem ( toolboxDefaultPointsizeLayout, 2, 1 );
269
270 // defaults widget
271 QWidget *toolboxDefaultsWidget = new QWidget();
272 toolboxDefaultsWidget->setLayout( toolboxDefaultsLayout );
273 toolboxDefaultsWidget->setToolTip( "Default values" );
274
275 // ----
276
277 // tab widget
278 QTabWidget *toolboxTabWidget = new QTabWidget();
279 toolboxTabWidget->addTab( toolboxOptionsWidget, "Options" );
280 toolboxTabWidget->addTab( toolboxDefaultsWidget, "Defaults" );
281
282 // toolbox layout
283 QVBoxLayout *toolboxLayout = new QVBoxLayout();
284 toolboxLayout->setSpacing( 6 );
285 toolboxLayout->addWidget( toolboxTabWidget );
286
287 // toolbox
288 QWidget *toolbox = new QWidget();
289 toolbox->setLayout( toolboxLayout );
290
291 // toolbox icon
292 toolboxIcon_ = new QIcon( OpenFlipper::Options::iconDirStr() + OpenFlipper::Options::dirSeparator() + "SplatCloudRenderingControl.png" );
293
294 // ----
295
296 // connect events to slots
297 connect( toolboxPointsizeScale_, SIGNAL( valueChanged(double) ), this, SLOT( slotToolboxPointsizeScaleValueChanged() ) );
298 connect( toolboxDefaultColorR_, SIGNAL( valueChanged(int) ), this, SLOT( slotToolboxDefaultColorValueChanged() ) );
299 connect( toolboxDefaultColorG_, SIGNAL( valueChanged(int) ), this, SLOT( slotToolboxDefaultColorValueChanged() ) );
300 connect( toolboxDefaultColorB_, SIGNAL( valueChanged(int) ), this, SLOT( slotToolboxDefaultColorValueChanged() ) );
301 connect( toolboxDefaultNormalX_, SIGNAL( valueChanged(double) ), this, SLOT( slotToolboxDefaultNormalValueChanged() ) );
302 connect( toolboxDefaultNormalY_, SIGNAL( valueChanged(double) ), this, SLOT( slotToolboxDefaultNormalValueChanged() ) );
303 connect( toolboxDefaultNormalZ_, SIGNAL( valueChanged(double) ), this, SLOT( slotToolboxDefaultNormalValueChanged() ) );
304 connect( toolboxDefaultPointsize_, SIGNAL( valueChanged(double) ), this, SLOT( slotToolboxDefaultPointsizeValueChanged() ) );
305
306 connect( toolboxEnableBackfaceCullingButton, SIGNAL( clicked() ), this, SLOT( slotToolboxEnableBackfaceCullingButtonClicked() ) );
307 connect( toolboxDisableBackfaceCullingButton, SIGNAL( clicked() ), this, SLOT( slotToolboxDisableBackfaceCullingButtonClicked() ) );
308 connect( toolboxReloadShadersButton, SIGNAL( clicked() ), this, SLOT( slotToolboxReloadShadersButtonClicked() ) );
309 connect( toolboxRebuildVBOsButton, SIGNAL( clicked() ), this, SLOT( slotToolboxRebuildVBOsButtonClicked() ) );
310 connect( toolboxPointSizeButton, SIGNAL( toggled(bool) ), this, SLOT( slotToolboxPointSizeButtonClicked() ) );
311 connect( toolboxGeometryShaderButton, SIGNAL( toggled(bool) ), this, SLOT( slotToolboxGeometryShaderButtonClicked() ) );
312
313 // emit signal to add the new toolbox
314 emit addToolbox( tr("SplatCloud Rendering Control") , toolbox , toolboxIcon_ );
315
316 // -------------------------------------
317 // -------- create context menu --------
318 // -------------------------------------
319
320 // actions
321 contextScaleAction_ = new QAction( tr( "Pointsize Scaling Factor..."), this );
322 contextCullingAction_ = new QAction( tr( "Backface Culling" ), this );
323 contextDefaultsAction_ = new QAction( tr( "Defaults..." ), this );
324 contextReloadShadersAction_ = new QAction( tr( "Reload Shaders" ), this );
325 contextRebuildVBOAction_ = new QAction( tr( "Rebuild VBO" ), this );
326 contextCullingAction_->setCheckable( true );
327
328 // context menu
329 QMenu *contextMenu = new QMenu( "SplatCloud Rendering Control" );
330 contextMenu->setIcon( QIcon( OpenFlipper::Options::iconDirStr() + OpenFlipper::Options::dirSeparator() + "SplatCloudRenderingControl.png" ) );
331 contextMenu->addAction( contextScaleAction_ );
332 contextMenu->addAction( contextCullingAction_ );
333 contextMenu->addSeparator();
334 contextMenu->addAction( contextDefaultsAction_ );
335 contextMenu->addSeparator();
336 contextMenu->addAction( contextReloadShadersAction_ );
337 contextMenu->addAction( contextRebuildVBOAction_ );
338
339 // ----
340
341 // connect events to slots
342 connect( contextScaleAction_, SIGNAL( triggered() ), this, SLOT( slotContextScaleActionTriggered() ) );
343 connect( contextCullingAction_, SIGNAL( triggered() ), this, SLOT( slotContextCullingActionTriggered() ) );
344 connect( contextDefaultsAction_, SIGNAL( triggered() ), this, SLOT( slotContextDefaultsActionTriggered() ) );
345 connect( contextReloadShadersAction_, SIGNAL( triggered() ), this, SLOT( slotContextReloadShadersActionTriggered() ) );
346 connect( contextRebuildVBOAction_, SIGNAL( triggered() ), this, SLOT( slotContextRebuildVBOActionTriggered() ) );
347
348 // emit signal to add the new context menu
349 emit addContextMenuItem( contextMenu->menuAction(), DATA_SPLATCLOUD, CONTEXTOBJECTMENU );
350
351 // --------------------------------------------------
352 // -------- create context menu scale widget --------
353 // --------------------------------------------------
354
355 // pointsize scale
356 contextScaleWidgetPointsizeScale_ = new QDoubleSpinBox();
357 contextScaleWidgetPointsizeScale_->setRange( 0.0, 100.0 );
358 contextScaleWidgetPointsizeScale_->setDecimals( 4 );
359 contextScaleWidgetPointsizeScale_->setSingleStep( 0.1 );
360 contextScaleWidgetPointsizeScale_->setToolTip( "The scaling factor of the pointsizes used during the rendering of the picked object" );
361
362 // pointsize scale layout
363 QHBoxLayout *contextScaleWidgetPointsizeScaleLayout = new QHBoxLayout();
364 contextScaleWidgetPointsizeScaleLayout->setSpacing( 6 );
365 contextScaleWidgetPointsizeScaleLayout->addWidget( new QLabel( "Pointsize Scaling Factor:" ) );
366 contextScaleWidgetPointsizeScaleLayout->addWidget( contextScaleWidgetPointsizeScale_ );
367
368 // widget layout
369 QVBoxLayout *contextScaleWidgetLayout = new QVBoxLayout();
370 contextScaleWidgetLayout->setAlignment( Qt::AlignTop );
371 contextScaleWidgetLayout->setSpacing( 6 );
372 contextScaleWidgetLayout->addItem( contextScaleWidgetPointsizeScaleLayout );
373
374 // widget
375 contextScaleWidget_ = new QWidget();
376 contextScaleWidget_->setWindowTitle( "Pointsize Scaling Factor" );
377 contextScaleWidget_->setLayout( contextScaleWidgetLayout );
378
379 // ----
380
381 // connect events to slots
382 connect( contextScaleWidgetPointsizeScale_, SIGNAL( valueChanged(double) ), this, SLOT( slotContextScaleWidgetPointsizeScaleValueChanged() ) );
383
384 // -----------------------------------------------------
385 // -------- create context menu defaults widget --------
386 // -----------------------------------------------------
387
388 // default color
389 contextDefaultsWidgetDefaultColorR_ = new QSpinBox();
390 contextDefaultsWidgetDefaultColorG_ = new QSpinBox();
391 contextDefaultsWidgetDefaultColorB_ = new QSpinBox();
392 contextDefaultsWidgetDefaultColorR_->setRange( 0, 255 );
393 contextDefaultsWidgetDefaultColorG_->setRange( 0, 255 );
394 contextDefaultsWidgetDefaultColorB_->setRange( 0, 255 );
395 contextDefaultsWidgetDefaultColorR_->setSingleStep( 1 );
396 contextDefaultsWidgetDefaultColorG_->setSingleStep( 1 );
397 contextDefaultsWidgetDefaultColorB_->setSingleStep( 1 );
398 contextDefaultsWidgetDefaultColorR_->setToolTip( "The default red-component of the color used when the picked object has no colors" );
399 contextDefaultsWidgetDefaultColorG_->setToolTip( "The default green-component of the color used when the picked object has no colors" );
400 contextDefaultsWidgetDefaultColorB_->setToolTip( "The default blue-component of the color used when the picked object has no colors" );
401
402 // default normal
403 contextDefaultsWidgetDefaultNormalX_ = new QDoubleSpinBox();
404 contextDefaultsWidgetDefaultNormalY_ = new QDoubleSpinBox();
405 contextDefaultsWidgetDefaultNormalZ_ = new QDoubleSpinBox();
406 contextDefaultsWidgetDefaultNormalX_->setRange( -1.0, 1.0 );
407 contextDefaultsWidgetDefaultNormalY_->setRange( -1.0, 1.0 );
408 contextDefaultsWidgetDefaultNormalZ_->setRange( -1.0, 1.0 );
409 contextDefaultsWidgetDefaultNormalX_->setDecimals( 2 );
410 contextDefaultsWidgetDefaultNormalY_->setDecimals( 2 );
411 contextDefaultsWidgetDefaultNormalZ_->setDecimals( 2 );
412 contextDefaultsWidgetDefaultNormalX_->setSingleStep( 0.1 );
413 contextDefaultsWidgetDefaultNormalY_->setSingleStep( 0.1 );
414 contextDefaultsWidgetDefaultNormalZ_->setSingleStep( 0.1 );
415 contextDefaultsWidgetDefaultNormalX_->setToolTip( "The default x-component of the normal used when the picked object has no normals" );
416 contextDefaultsWidgetDefaultNormalY_->setToolTip( "The default y-component of the normal used when the picked object has no normals" );
417 contextDefaultsWidgetDefaultNormalZ_->setToolTip( "The default z-component of the normal used when the picked object has no normals" );
418
419 // default pointsize
420 contextDefaultsWidgetDefaultPointsize_ = new QDoubleSpinBox();
421 contextDefaultsWidgetDefaultPointsize_->setRange( 0.0, 1000.0 );
422 contextDefaultsWidgetDefaultPointsize_->setDecimals( 3 );
423 contextDefaultsWidgetDefaultPointsize_->setSingleStep( 0.01 );
424 contextDefaultsWidgetDefaultPointsize_->setToolTip( "The default pointsize used when the picked object has no pointsizes" );
425
426 // default color layout
427 QHBoxLayout *contextDefaultsWidgetDefaultColorLayout = new QHBoxLayout();
428 contextDefaultsWidgetDefaultColorLayout->setSpacing( 6 );
429 contextDefaultsWidgetDefaultColorLayout->addWidget( contextDefaultsWidgetDefaultColorR_ );
430 contextDefaultsWidgetDefaultColorLayout->addWidget( contextDefaultsWidgetDefaultColorG_ );
431 contextDefaultsWidgetDefaultColorLayout->addWidget( contextDefaultsWidgetDefaultColorB_ );
432
433 // default normal layout
434 QHBoxLayout *contextDefaultsWidgetDefaultNormalLayout = new QHBoxLayout();
435 contextDefaultsWidgetDefaultNormalLayout->setSpacing( 6 );
436 contextDefaultsWidgetDefaultNormalLayout->addWidget( contextDefaultsWidgetDefaultNormalX_ );
437 contextDefaultsWidgetDefaultNormalLayout->addWidget( contextDefaultsWidgetDefaultNormalY_ );
438 contextDefaultsWidgetDefaultNormalLayout->addWidget( contextDefaultsWidgetDefaultNormalZ_ );
439
440 // default pointsize layout
441 QHBoxLayout *contextDefaultsWidgetDefaultPointsizeLayout = new QHBoxLayout();
442 contextDefaultsWidgetDefaultPointsizeLayout->setSpacing( 6 );
443 contextDefaultsWidgetDefaultPointsizeLayout->addWidget( contextDefaultsWidgetDefaultPointsize_ );
444
445 // default options layout
446 QGridLayout *contextDefaultsWidgetDefaultOptionsLayout = new QGridLayout();
447 contextDefaultsWidgetDefaultOptionsLayout->setSpacing( 6 );
448 contextDefaultsWidgetDefaultOptionsLayout->addWidget( new QLabel( "Default Color:" ), 0, 0 );
449 contextDefaultsWidgetDefaultOptionsLayout->addWidget( new QLabel( "Default Normal:" ), 1, 0 );
450 contextDefaultsWidgetDefaultOptionsLayout->addWidget( new QLabel( "Default Pointsize:" ), 2, 0 );
451 contextDefaultsWidgetDefaultOptionsLayout->addItem ( contextDefaultsWidgetDefaultColorLayout, 0, 1 );
452 contextDefaultsWidgetDefaultOptionsLayout->addItem ( contextDefaultsWidgetDefaultNormalLayout, 1, 1 );
453 contextDefaultsWidgetDefaultOptionsLayout->addItem ( contextDefaultsWidgetDefaultPointsizeLayout, 2, 1 );
454
455 // widget layout
456 QVBoxLayout *contextDefaultsWidgetLayout = new QVBoxLayout();
457 contextDefaultsWidgetLayout->setAlignment( Qt::AlignTop );
458 contextDefaultsWidgetLayout->setSpacing( 6 );
459 contextDefaultsWidgetLayout->addItem( contextDefaultsWidgetDefaultOptionsLayout );
460
461 // widget
462 contextDefaultsWidget_ = new QWidget();
463 contextDefaultsWidget_->setWindowTitle( "Defaults" );
464 contextDefaultsWidget_->setLayout( contextDefaultsWidgetLayout );
465
466 // ----
467
468 // connect events to slots
469 connect( contextDefaultsWidgetDefaultColorR_, SIGNAL( valueChanged(int) ), this, SLOT( slotContextDefaultsWidgetDefaultColorValueChanged() ) );
470 connect( contextDefaultsWidgetDefaultColorG_, SIGNAL( valueChanged(int) ), this, SLOT( slotContextDefaultsWidgetDefaultColorValueChanged() ) );
471 connect( contextDefaultsWidgetDefaultColorB_, SIGNAL( valueChanged(int) ), this, SLOT( slotContextDefaultsWidgetDefaultColorValueChanged() ) );
472 connect( contextDefaultsWidgetDefaultNormalX_, SIGNAL( valueChanged(double) ), this, SLOT( slotContextDefaultsWidgetDefaultNormalValueChanged() ) );
473 connect( contextDefaultsWidgetDefaultNormalY_, SIGNAL( valueChanged(double) ), this, SLOT( slotContextDefaultsWidgetDefaultNormalValueChanged() ) );
474 connect( contextDefaultsWidgetDefaultNormalZ_, SIGNAL( valueChanged(double) ), this, SLOT( slotContextDefaultsWidgetDefaultNormalValueChanged() ) );
475 connect( contextDefaultsWidgetDefaultPointsize_, SIGNAL( valueChanged(double) ), this, SLOT( slotContextDefaultsWidgetDefaultPointsizeValueChanged() ) );
476
477 // ----------------------------------
478 // -------- create view mode --------
479 // ----------------------------------
480
481 // toolboxes
482 QStringList viewModeToolboxes;
483 viewModeToolboxes += "Data Control";
484 viewModeToolboxes += "Selections";
485 viewModeToolboxes += "SplatCloud Estimator";
486 viewModeToolboxes += "SplatCloud Rendering Control";
487
488 // toolbars
489 QStringList viewModeToolbars;
490 viewModeToolbars += "Main Toolbar";
491 viewModeToolbars += "Viewer Toolbar";
492 viewModeToolbars += "Color Toolbar";
493 viewModeToolbars += "Viewing Directions";
494 viewModeToolbars += "Selection Base";
495 viewModeToolbars += "Backup Toolbar";
496
497 // context menus
498 QStringList viewModeContextMenus;
499 viewModeContextMenus += "DataControl->Material Properties";
500 viewModeContextMenus += "DataControl->Object";
501 viewModeContextMenus += "SplatCloudEstimatorPlugin->SplatCloud Estimator";
502 viewModeContextMenus += "SplatCloudRenderingControlPlugin->SplatCloud Rendering Control";
503 viewModeContextMenus += "ViewControl->Visualization";
504 viewModeContextMenus += "Backup->&Redo";
505 viewModeContextMenus += "Backup->&Undo";
506
507 // emit signals to add new viewmode
508 emit defineViewModeToolboxes ( "SplatCloud", viewModeToolboxes );
509 emit defineViewModeToolbars ( "SplatCloud", viewModeToolbars );
510 emit defineViewModeContextMenus( "SplatCloud", viewModeContextMenus );
511 emit defineViewModeIcon ( "SplatCloud", "SplatCloudType.png" );
512}
513
514
515//----------------------------------------------------------------
516
517
518void SplatCloudRenderingControlPlugin::addedEmptyObject( int _objectId )
519{
520 if( _objectId == -1 )
521 return;
522
523 // get object by id
524 BaseObjectData *object;
525 if( !PluginFunctions::getObject( _objectId, object ) )
526 return;
527
528 // get splatcloud-object
530
531 // if object is a SplatCloud...
532 if( splatCloudObject )
533 {
534 // set current rendering options
536 splatCloudObject->setPointsizeScale ( toolboxPointsizeScale_->value() );
537
538 // set default values
540 if( splatCloudNode )
541 {
542 splatCloudNode->setDefaultColor ( SplatCloudNode::Color ( toolboxDefaultColorR_-> value(),
543 toolboxDefaultColorG_-> value(),
544 toolboxDefaultColorB_-> value() ) );
545 splatCloudNode->setDefaultNormal ( SplatCloudNode::Normal ( toolboxDefaultNormalX_-> value(),
546 toolboxDefaultNormalY_-> value(),
547 toolboxDefaultNormalZ_-> value() ) );
548 splatCloudNode->setDefaultPointsize( SplatCloudNode::Pointsize( toolboxDefaultPointsize_->value() ) );
549 }
550 }
551}
552
553
554//----------------------------------------------------------------
555
556
557void SplatCloudRenderingControlPlugin::slotUpdateContextMenu( int _objectId )
558{
559 if( _objectId == -1 )
560 return;
561
562 // get object by id
563 BaseObjectData *object;
564 if( !PluginFunctions::getObject( _objectId, object ) )
565 return;
566
567 // get splatcloud-object
569
570 // if object is a SplatCloud...
571 if( splatCloudObject )
572 {
573 // update context menu value
574 contextCullingAction_->setChecked( splatCloudObject->isBackfaceCullingEnabled() );
575 }
576}
577
578
579//----------------------------------------------------------------
580
581
582void SplatCloudRenderingControlPlugin::slotToolboxPointsizeScaleValueChanged()
583{
584 // get toolbox option value
585 double scale = toolboxPointsizeScale_->value();
586
587 // for all splatcloud-objects...
589 for( ; objIter != PluginFunctions::objectsEnd(); ++objIter )
590 {
591 // get splatcloud-object
593
594 // apply update
596 }
597}
598
599
600//----------------------------------------------------------------
601
602
603void SplatCloudRenderingControlPlugin::slotToolboxDefaultColorValueChanged()
604{
605 // for all splatcloud-objects...
607 for( ; objIter != PluginFunctions::objectsEnd(); ++objIter )
608 {
609 // get scenegraph splatcloud-node
611
612 // apply update (set default color)
613 splatCloudNode->setDefaultColor( SplatCloudNode::Color( toolboxDefaultColorR_->value(),
614 toolboxDefaultColorG_->value(),
615 toolboxDefaultColorB_->value() ) );
616 }
617}
618
619
620//----------------------------------------------------------------
621
622
623void SplatCloudRenderingControlPlugin::slotToolboxDefaultNormalValueChanged()
624{
625 // for all splatcloud-objects...
627 for( ; objIter != PluginFunctions::objectsEnd(); ++objIter )
628 {
629 // get scenegraph splatcloud-node
631
632 // apply update (set default normal)
633 splatCloudNode->setDefaultNormal( SplatCloudNode::Normal( toolboxDefaultNormalX_->value(),
634 toolboxDefaultNormalY_->value(),
635 toolboxDefaultNormalZ_->value() ) );
636 }
637}
638
639
640//----------------------------------------------------------------
641
642
643void SplatCloudRenderingControlPlugin::slotToolboxDefaultPointsizeValueChanged()
644{
645 // for all splatcloud-objects...
647 for( ; objIter != PluginFunctions::objectsEnd(); ++objIter )
648 {
649 // get scenegraph splatcloud-node
651
652 // apply update (set default pointsize)
653 splatCloudNode->setDefaultPointsize( SplatCloudNode::Pointsize( toolboxDefaultPointsize_->value() ) );
654
655 // emit signal that object has to be updated
656 emit updatedObject( objIter->id(), UPDATE_ALL );
657 }
658}
659
660
661//----------------------------------------------------------------
662
663
664void SplatCloudRenderingControlPlugin::slotToolboxEnableBackfaceCullingButtonClicked()
665{
666 // for all splatcloud-objects...
668 for( ; objIter != PluginFunctions::objectsEnd(); ++objIter )
669 {
670 // get splatcloud-object
672
673 // apply update
675 }
676}
677
678
679//----------------------------------------------------------------
680
681
682void SplatCloudRenderingControlPlugin::slotToolboxDisableBackfaceCullingButtonClicked()
683{
684 // for all splatcloud-objects...
686 for( ; objIter != PluginFunctions::objectsEnd(); ++objIter )
687 {
688 // get splatcloud-object
690
691 // apply update
693 }
694}
695
696
697//----------------------------------------------------------------
698
699
700void SplatCloudRenderingControlPlugin::slotToolboxReloadShadersButtonClicked()
701{
702 // for all splatcloud-objects...
704 for( ; objIter != PluginFunctions::objectsEnd(); ++objIter )
705 {
706 // get scenegraph splatcloud-object
708
709 // apply update (reload standard and picking shaders and re-set uniforms)
712 splatCloudObject->enableBackfaceCulling( splatCloudObject->isBackfaceCullingEnabled() );
713 }
714}
715
716
717//----------------------------------------------------------------
718
719
720void SplatCloudRenderingControlPlugin::slotToolboxRebuildVBOsButtonClicked()
721{
722 // for all splatcloud-objects...
724 for( ; objIter != PluginFunctions::objectsEnd(); ++objIter )
725 {
726 // get scenegraph splatcloud-node
728
729 // rebuild the vertex-buffer-object the next time the node is drawn (or picked)
730 splatCloudNode->modifiedAll();
731
732 // emit signal that object has to be updated
733 emit updatedObject( objIter->id(), UPDATE_ALL );
734 }
735}
736
737//----------------------------------------------------------------
738
739
740void SplatCloudRenderingControlPlugin::slotToolboxPointSizeButtonClicked()
741{
742 // for all splatcloud-objects...
744 for (; objIter != PluginFunctions::objectsEnd(); ++objIter)
745 {
746 // get splatcloud-object
748
749 // apply update
751 }
752}
753
754//----------------------------------------------------------------
755
756
757void SplatCloudRenderingControlPlugin::slotToolboxGeometryShaderButtonClicked()
758{
759 // for all splatcloud-objects...
761 for (; objIter != PluginFunctions::objectsEnd(); ++objIter)
762 {
763 // get splatcloud-object
765
766 // apply update
768 }
769}
770
771
772//----------------------------------------------------------------
773
774
775void SplatCloudRenderingControlPlugin::slotContextScaleActionTriggered()
776{
777 // get picked object by id
778 int objectId = contextScaleAction_->data().toInt();
779 if( objectId == -1 )
780 return;
781 //
782 BaseObjectData *object;
783 if( ! PluginFunctions::getObject( objectId, object ) )
784 return;
785
786 // get splatcloud-object
788
789 // if object is a SplatCloud...
790 if( splatCloudObject )
791 {
792 // get value from SplatCloud
793 double ps = splatCloudObject->pointsizeScale();
794
795 // update widget option value
796 contextScaleWidgetPointsizeScale_->setValue( ps );
797
798 // move widget to position of context menu entry
799 contextScaleWidget_->move( contextScaleAction_->associatedWidgets()[0]->mapToGlobal( QPoint() ) );
800
801 // show widget
802 contextScaleWidget_->show();
803 }
804}
805
806
807//----------------------------------------------------------------
808
809
810void SplatCloudRenderingControlPlugin::slotContextScaleWidgetPointsizeScaleValueChanged()
811{
812 // get picked object by id
813 int objectId = contextScaleAction_->data().toInt();
814 if( objectId == -1 )
815 return;
816 //
817 BaseObjectData *object;
818 if( ! PluginFunctions::getObject( objectId, object ) )
819 return;
820
821 // get splatcloud-object
823
824 // if object is a SplatCloud...
825 if( splatCloudObject )
826 {
827 // get widget option value
828 double scale = contextScaleWidgetPointsizeScale_->value();
829
830 // apply update (set pointsize scale)
832 }
833}
834
835
836//----------------------------------------------------------------
837
838
839void SplatCloudRenderingControlPlugin::slotContextDefaultsActionTriggered()
840{
841 // get picked object by id
842 int objectId = contextDefaultsAction_->data().toInt();
843 if( objectId == -1 )
844 return;
845 //
846 BaseObjectData *object;
847 if( ! PluginFunctions::getObject( objectId, object ) )
848 return;
849
850 // get splatcloud-node
852
853 // if object is a SplatCloud...
854 if( splatCloudNode )
855 {
856 // get values from SplatCloud
857 int cr = splatCloudNode->defaultColor()[0];
858 int cg = splatCloudNode->defaultColor()[1];
859 int cb = splatCloudNode->defaultColor()[2];
860 double nx = splatCloudNode->defaultNormal()[0];
861 double ny = splatCloudNode->defaultNormal()[1];
862 double nz = splatCloudNode->defaultNormal()[2];
863 double ps = splatCloudNode->defaultPointsize();
864
865 // update widget option values
866 contextDefaultsWidgetDefaultColorR_-> setValue( cr );
867 contextDefaultsWidgetDefaultColorG_-> setValue( cg );
868 contextDefaultsWidgetDefaultColorB_-> setValue( cb );
869 contextDefaultsWidgetDefaultNormalX_-> setValue( nx );
870 contextDefaultsWidgetDefaultNormalY_-> setValue( ny );
871 contextDefaultsWidgetDefaultNormalZ_-> setValue( nz );
872 contextDefaultsWidgetDefaultPointsize_->setValue( ps );
873
874 // move defaults widget to position of context menu entry
875 contextDefaultsWidget_->move( contextDefaultsAction_->associatedWidgets()[0]->mapToGlobal( QPoint() ) );
876
877 // show widget
878 contextDefaultsWidget_->show();
879 }
880}
881
882
883//----------------------------------------------------------------
884
885
886void SplatCloudRenderingControlPlugin::slotContextDefaultsWidgetDefaultColorValueChanged()
887{
888 // get picked object by id
889 int objectId = contextDefaultsAction_->data().toInt();
890 if( objectId == -1 )
891 return;
892 //
893 BaseObjectData *object;
894 if( ! PluginFunctions::getObject( objectId, object ) )
895 return;
896
897 // get splatcloud-node
899
900 // if object is a SplatCloud...
901 if( splatCloudNode )
902 {
903 // apply update (set default color)
904 splatCloudNode->setDefaultColor( SplatCloudNode::Color( contextDefaultsWidgetDefaultColorR_->value(),
905 contextDefaultsWidgetDefaultColorG_->value(),
906 contextDefaultsWidgetDefaultColorB_->value() ) );
907
908 // emit signal that the object has to be updated
909 emit updatedObject( object->id(), UPDATE_ALL );
910 }
911}
912
913
914//----------------------------------------------------------------
915
916
917void SplatCloudRenderingControlPlugin::slotContextDefaultsWidgetDefaultNormalValueChanged()
918{
919 // get picked object by id
920 int objectId = contextDefaultsAction_->data().toInt();
921 if( objectId == -1 )
922 return;
923 //
924 BaseObjectData *object;
925 if( ! PluginFunctions::getObject( objectId, object ) )
926 return;
927
928 // get splatcloud-node
930
931 // if object is a SplatCloud...
932 if( splatCloudNode )
933 {
934 // apply update (set default normal)
935 splatCloudNode->setDefaultNormal( SplatCloudNode::Normal( contextDefaultsWidgetDefaultNormalX_->value(),
936 contextDefaultsWidgetDefaultNormalY_->value(),
937 contextDefaultsWidgetDefaultNormalZ_->value() ) );
938
939 // emit signal that the object has to be updated
940 emit updatedObject( object->id(), UPDATE_ALL );
941 }
942}
943
944
945//----------------------------------------------------------------
946
947
948void SplatCloudRenderingControlPlugin::slotContextDefaultsWidgetDefaultPointsizeValueChanged()
949{
950 // get picked object by id
951 int objectId = contextDefaultsAction_->data().toInt();
952 if( objectId == -1 )
953 return;
954 //
955 BaseObjectData *object;
956 if( ! PluginFunctions::getObject( objectId, object ) )
957 return;
958
959 // get splatcloud-node
961
962 // if object is a SplatCloud...
963 if( splatCloudNode )
964 {
965 // apply update (set default pointsize)
966 splatCloudNode->setDefaultPointsize( SplatCloudNode::Pointsize( contextDefaultsWidgetDefaultPointsize_->value() ) );
967
968 // emit signal that the object has to be updated
969 emit updatedObject( object->id(), UPDATE_ALL );
970 }
971}
972
973
974//----------------------------------------------------------------
975
976
977void SplatCloudRenderingControlPlugin::slotContextCullingActionTriggered()
978{
979 // get picked object by id
980 int objectId = contextCullingAction_->data().toInt();
981 if( objectId == -1 )
982 return;
983 //
984 BaseObjectData *object;
985 if( ! PluginFunctions::getObject( objectId, object ) )
986 return;
987
988 // get splatcloud-object
990
991 // if object is a SplatCloud...
992 if( splatCloudObject )
993 {
994 // get context menu option value
995 bool enable = contextCullingAction_->isChecked();
996
997 // apply update
999
1000 // emit signal that the object has to be updated
1001 emit updatedObject( object->id(), UPDATE_ALL );
1002 }
1003}
1004
1005
1006//----------------------------------------------------------------
1007
1008
1009void SplatCloudRenderingControlPlugin::slotContextReloadShadersActionTriggered()
1010{
1011 // get picked object by id
1012 int objectId = contextReloadShadersAction_->data().toInt();
1013 if( objectId == -1 )
1014 return;
1015 //
1016 BaseObjectData *object;
1017 if( ! PluginFunctions::getObject( objectId, object ) )
1018 return;
1019
1020 // get splatcloud-object
1022
1023 // if object is a SplatCloud...
1024 if( splatCloudObject )
1025 {
1026 // apply update (reload standard and picking shaders and re-set uniforms)
1029 splatCloudObject->enableBackfaceCulling( splatCloudObject->isBackfaceCullingEnabled() );
1030
1031 // emit signal that object has to be updated
1032 emit updatedObject( object->id(), UPDATE_ALL );
1033 }
1034}
1035
1036
1037//----------------------------------------------------------------
1038
1039
1040void SplatCloudRenderingControlPlugin::slotContextRebuildVBOActionTriggered()
1041{
1042 // get picked object by id
1043 int objectId = contextRebuildVBOAction_->data().toInt();
1044 if( objectId == -1 )
1045 return;
1046 //
1047 BaseObjectData *object;
1048 if( ! PluginFunctions::getObject( objectId, object ) )
1049 return;
1050
1051 // get splatcloud-node
1053
1054 // if object is a SplatCloud...
1055 if( splatCloudNode )
1056 {
1057 // rebuild the vertex-buffer-object the next time the node is drawn (or picked)
1058 splatCloudNode->modifiedAll();
1059
1060 // emit signal that object has to be updated
1061 emit updatedObject( object->id(), UPDATE_ALL );
1062 }
1063}
1064
1065
1066//================================================================
1067
1068
1069
1070
@ CONTEXTOBJECTMENU
The Menu will be shown when an object was picked.
#define DATA_SPLATCLOUD
Definition SplatCloud.hh:59
int id() const
SplatCloudNode * splatCloudNode()
Get SplatCloud's scenegraph Node.
void enableGeometryShaderQuads(bool _enable)
Enable or disable quad extrusion in geometry shader (shader pipeline)
void enableBackfaceCulling(bool _enable)
Enable or disable backface culling for all Shaders.
void setPointsizeScale(float _scale)
Set the scaling factor for pointsizes for all Shaders.
void reloadShaders()
Reload standard and picking Shaders from file.
const UpdateType UPDATE_ALL(UpdateTypeSet(1))
Identifier for all updates.
SplatCloudObject * splatCloudObject(BaseObjectData *_object)
Cast an SplatCloudObject to a SplatCloudObject if possible.
DLLEXPORT ObjectIterator objectsEnd()
Return Iterator to Object End.
bool getObject(const int _identifier, BaseObject *&_object)
Get the object which has the given identifier.
SplatCloudNode * splatCloudNode(BaseObjectData *_object)
Get a SplatCloudNode from an object.
const QStringList ALL_OBJECTS
Iterable object range.