Developer Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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 * $Revision: 12588 $ *
47 * $LastChangedBy: moebius $ *
48 * $Date: 2011-10-13 12:41:04 +0200 (Do, 13 Okt 2011) $ *
49 * *
50 \*===========================================================================*/
51 
52 
53 //================================================================
54 //
55 // CLASS SplatCloudRenderingControlPlugin - IMPLEMENTATION
56 //
57 //================================================================
58 
59 
60 //== INCLUDES ====================================================
61 
62 
63 #include "SplatCloudRenderingControlPlugin.hh"
64 
66 
68 
70 
71 
72 //== IMPLEMENTATION ==============================================
73 
74 
75 SplatCloudRenderingControlPlugin::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_ ( 0 ),
85  contextCullingAction_ ( 0 ),
86  contextDefaultsAction_ ( 0 ),
87  contextReloadShadersAction_( 0 ),
88  contextRebuildVBOAction_ ( 0 ),
89  contextScaleWidget_ ( 0 ),
90  contextScaleWidgetPointsizeScale_( 0 ),
91  contextDefaultsWidget_ ( 0 ),
92  contextDefaultsWidgetDefaultColorR_ ( 0 ),
93  contextDefaultsWidgetDefaultColorG_ ( 0 ),
94  contextDefaultsWidgetDefaultColorB_ ( 0 ),
95  contextDefaultsWidgetDefaultNormalX_ ( 0 ),
96  contextDefaultsWidgetDefaultNormalY_ ( 0 ),
97  contextDefaultsWidgetDefaultNormalZ_ ( 0 ),
98  contextDefaultsWidgetDefaultPointsize_( 0 )
99 {
100 }
101 
102 
103 //----------------------------------------------------------------
104 
105 
106 void SplatCloudRenderingControlPlugin::initializePlugin()
107 {
108  // --------------------------------
109  // -------- create toolbox --------
110  // --------------------------------
111 
112  // ---- options tab ----
113 
114  // pointsize scale
115  toolboxPointsizeScale_ = new QDoubleSpinBox();
116  toolboxPointsizeScale_->setRange( 0.0, 100.0 );
117  toolboxPointsizeScale_->setDecimals( 4 );
118  toolboxPointsizeScale_->setSingleStep( 0.1 );
119  toolboxPointsizeScale_->setValue( 1.0 );
120  toolboxPointsizeScale_->setToolTip( "The scaling factor of the pointsizes used during the rendering of objects" );
121 
122  // pointsize scale layout
123  QHBoxLayout *toolboxPointsizeScaleLayout = new QHBoxLayout();
124  toolboxPointsizeScaleLayout->setSpacing( 6 );
125  toolboxPointsizeScaleLayout->addWidget( new QLabel( "Pointsize Scaling Factor:" ) );
126  toolboxPointsizeScaleLayout->addWidget( toolboxPointsizeScale_ );
127 
128  // buttons
129  QPushButton *toolboxEnableBackfaceCullingButton = new QPushButton( "Enable Backface Culling" );
130  QPushButton *toolboxDisableBackfaceCullingButton = new QPushButton( "Disable Backface Culling" );
131  QPushButton *toolboxReloadShadersButton = new QPushButton( "Reload Shaders" );
132  QPushButton *toolboxRebuildVBOsButton = new QPushButton( "Rebuild VBOs" );
133  toolboxEnableBackfaceCullingButton->setToolTip ( "Enable the culling of backfaces" );
134  toolboxDisableBackfaceCullingButton->setToolTip( "Disable the culling of backfaces" );
135  toolboxReloadShadersButton->setToolTip ( "Reload all shader files" );
136  toolboxRebuildVBOsButton->setToolTip ( "Rebuild all vertex-buffer-objects" );
137 
138  // buttonsA layout
139  QHBoxLayout *toolboxButtonsALayout = new QHBoxLayout();
140  toolboxButtonsALayout->setSpacing( 6 );
141  toolboxButtonsALayout->addWidget( toolboxEnableBackfaceCullingButton );
142  toolboxButtonsALayout->addWidget( toolboxDisableBackfaceCullingButton );
143 
144  // separator frame
145  QFrame *toolboxSeparatorFrame = new QFrame();
146  toolboxSeparatorFrame->setFrameShape( QFrame::HLine );
147  toolboxSeparatorFrame->setFrameShadow( QFrame::Sunken );
148 
149  // buttonsB layout
150  QHBoxLayout *toolboxButtonsBLayout = new QHBoxLayout();
151  toolboxButtonsBLayout->setSpacing( 6 );
152  toolboxButtonsBLayout->addWidget( toolboxReloadShadersButton );
153  toolboxButtonsBLayout->addWidget( toolboxRebuildVBOsButton );
154 
155  // options layout
156  QVBoxLayout *toolboxOptionsLayout = new QVBoxLayout();
157  toolboxOptionsLayout->setAlignment( Qt::AlignTop );
158  toolboxOptionsLayout->setSpacing( 6 );
159  toolboxOptionsLayout->addItem ( toolboxPointsizeScaleLayout );
160  toolboxOptionsLayout->addItem ( toolboxButtonsALayout );
161  toolboxOptionsLayout->addItem ( new QSpacerItem( 0, 0, QSizePolicy::Expanding, QSizePolicy::Expanding ) );
162  toolboxOptionsLayout->addWidget( toolboxSeparatorFrame );
163  toolboxOptionsLayout->addItem ( toolboxButtonsBLayout );
164 
165  // options widget
166  QWidget *toolboxOptionsWidget = new QWidget();
167  toolboxOptionsWidget->setLayout( toolboxOptionsLayout );
168  toolboxOptionsWidget->setToolTip( "Rendering options" );
169 
170  // ---- defaults tab ----
171 
172  // default color
173  toolboxDefaultColorR_ = new QSpinBox();
174  toolboxDefaultColorG_ = new QSpinBox();
175  toolboxDefaultColorB_ = new QSpinBox();
176  toolboxDefaultColorR_->setRange( 0, 255 );
177  toolboxDefaultColorG_->setRange( 0, 255 );
178  toolboxDefaultColorB_->setRange( 0, 255 );
179  toolboxDefaultColorR_->setSingleStep( 1 );
180  toolboxDefaultColorG_->setSingleStep( 1 );
181  toolboxDefaultColorB_->setSingleStep( 1 );
182  toolboxDefaultColorR_->setValue( 255 );
183  toolboxDefaultColorG_->setValue( 255 );
184  toolboxDefaultColorB_->setValue( 255 );
185  toolboxDefaultColorR_->setToolTip( "The default red-component of the color used when an object has no colors" );
186  toolboxDefaultColorG_->setToolTip( "The default green-component of the color used when an object has no colors" );
187  toolboxDefaultColorB_->setToolTip( "The default blue-component of the color used when an object has no colors" );
188 
189  // default normal
190  toolboxDefaultNormalX_ = new QDoubleSpinBox();
191  toolboxDefaultNormalY_ = new QDoubleSpinBox();
192  toolboxDefaultNormalZ_ = new QDoubleSpinBox();
193  toolboxDefaultNormalX_->setRange( -1.0, 1.0 );
194  toolboxDefaultNormalY_->setRange( -1.0, 1.0 );
195  toolboxDefaultNormalZ_->setRange( -1.0, 1.0 );
196  toolboxDefaultNormalX_->setDecimals( 2 );
197  toolboxDefaultNormalY_->setDecimals( 2 );
198  toolboxDefaultNormalZ_->setDecimals( 2 );
199  toolboxDefaultNormalX_->setSingleStep( 0.1 );
200  toolboxDefaultNormalY_->setSingleStep( 0.1 );
201  toolboxDefaultNormalZ_->setSingleStep( 0.1 );
202  toolboxDefaultNormalX_->setValue( 0.0 );
203  toolboxDefaultNormalY_->setValue( 0.0 );
204  toolboxDefaultNormalZ_->setValue( 1.0 );
205  toolboxDefaultNormalX_->setToolTip( "The default x-component of the normal used when an object has no normals" );
206  toolboxDefaultNormalY_->setToolTip( "The default y-component of the normal used when an object has no normals" );
207  toolboxDefaultNormalZ_->setToolTip( "The default z-component of the normal used when an object has no normals" );
208 
209  // default pointsize
210  toolboxDefaultPointsize_ = new QDoubleSpinBox();
211  toolboxDefaultPointsize_->setRange( 0.0, 1000.0 );
212  toolboxDefaultPointsize_->setDecimals( 3 );
213  toolboxDefaultPointsize_->setSingleStep( 0.01 );
214  toolboxDefaultPointsize_->setValue( 0.1 );
215  toolboxDefaultPointsize_->setToolTip( "The default pointsize used when an object has no pointsizes" );
216 
217  // default color layout
218  QHBoxLayout *toolboxDefaultColorLayout = new QHBoxLayout();
219  toolboxDefaultColorLayout->setSpacing( 6 );
220  toolboxDefaultColorLayout->addWidget( toolboxDefaultColorR_ );
221  toolboxDefaultColorLayout->addWidget( toolboxDefaultColorG_ );
222  toolboxDefaultColorLayout->addWidget( toolboxDefaultColorB_ );
223 
224  // default normal layout
225  QHBoxLayout *toolboxDefaultNormalLayout = new QHBoxLayout();
226  toolboxDefaultNormalLayout->setSpacing( 6 );
227  toolboxDefaultNormalLayout->addWidget( toolboxDefaultNormalX_ );
228  toolboxDefaultNormalLayout->addWidget( toolboxDefaultNormalY_ );
229  toolboxDefaultNormalLayout->addWidget( toolboxDefaultNormalZ_ );
230 
231  // default pointsize layout
232  QHBoxLayout *toolboxDefaultPointsizeLayout = new QHBoxLayout();
233  toolboxDefaultPointsizeLayout->setSpacing( 6 );
234  toolboxDefaultPointsizeLayout->addWidget( toolboxDefaultPointsize_ );
235 
236  // default options layout
237  QGridLayout *toolboxDefaultsLayout = new QGridLayout();
238  toolboxDefaultsLayout->setSpacing( 6 );
239  toolboxDefaultsLayout->addWidget( new QLabel( "Default Color:" ), 0, 0 );
240  toolboxDefaultsLayout->addWidget( new QLabel( "Default Normal:" ), 1, 0 );
241  toolboxDefaultsLayout->addWidget( new QLabel( "Default Pointsize:" ), 2, 0 );
242  toolboxDefaultsLayout->addItem ( toolboxDefaultColorLayout, 0, 1 );
243  toolboxDefaultsLayout->addItem ( toolboxDefaultNormalLayout, 1, 1 );
244  toolboxDefaultsLayout->addItem ( toolboxDefaultPointsizeLayout, 2, 1 );
245 
246  // defaults widget
247  QWidget *toolboxDefaultsWidget = new QWidget();
248  toolboxDefaultsWidget->setLayout( toolboxDefaultsLayout );
249  toolboxDefaultsWidget->setToolTip( "Default values" );
250 
251  // ----
252 
253  // tab widget
254  QTabWidget *toolboxTabWidget = new QTabWidget();
255  toolboxTabWidget->addTab( toolboxOptionsWidget, "Options" );
256  toolboxTabWidget->addTab( toolboxDefaultsWidget, "Defaults" );
257 
258  // toolbox layout
259  QVBoxLayout *toolboxLayout = new QVBoxLayout();
260  toolboxLayout->setSpacing( 6 );
261  toolboxLayout->addWidget( toolboxTabWidget );
262 
263  // toolbox
264  QWidget *toolbox = new QWidget();
265  toolbox->setLayout( toolboxLayout );
266 
267  // toolbox icon
268  QIcon *toolboxIcon = new QIcon( OpenFlipper::Options::iconDirStr() + OpenFlipper::Options::dirSeparator() + "SplatCloudRenderingControl.png" );
269 
270  // ----
271 
272  // connect events to slots
273  connect( toolboxPointsizeScale_, SIGNAL( valueChanged(double) ), this, SLOT( slotToolboxPointsizeScaleValueChanged() ) );
274  connect( toolboxDefaultColorR_, SIGNAL( valueChanged(int) ), this, SLOT( slotToolboxDefaultColorValueChanged() ) );
275  connect( toolboxDefaultColorG_, SIGNAL( valueChanged(int) ), this, SLOT( slotToolboxDefaultColorValueChanged() ) );
276  connect( toolboxDefaultColorB_, SIGNAL( valueChanged(int) ), this, SLOT( slotToolboxDefaultColorValueChanged() ) );
277  connect( toolboxDefaultNormalX_, SIGNAL( valueChanged(double) ), this, SLOT( slotToolboxDefaultNormalValueChanged() ) );
278  connect( toolboxDefaultNormalY_, SIGNAL( valueChanged(double) ), this, SLOT( slotToolboxDefaultNormalValueChanged() ) );
279  connect( toolboxDefaultNormalZ_, SIGNAL( valueChanged(double) ), this, SLOT( slotToolboxDefaultNormalValueChanged() ) );
280  connect( toolboxDefaultPointsize_, SIGNAL( valueChanged(double) ), this, SLOT( slotToolboxDefaultPointsizeValueChanged() ) );
281 
282  connect( toolboxEnableBackfaceCullingButton, SIGNAL( clicked() ), this, SLOT( slotToolboxEnableBackfaceCullingButtonClicked() ) );
283  connect( toolboxDisableBackfaceCullingButton, SIGNAL( clicked() ), this, SLOT( slotToolboxDisableBackfaceCullingButtonClicked() ) );
284  connect( toolboxReloadShadersButton, SIGNAL( clicked() ), this, SLOT( slotToolboxReloadShadersButtonClicked() ) );
285  connect( toolboxRebuildVBOsButton, SIGNAL( clicked() ), this, SLOT( slotToolboxRebuildVBOsButtonClicked() ) );
286 
287  // emit signal to add the new toolbox
288  emit addToolbox( tr("SplatCloud Rendering Control") , toolbox , toolboxIcon );
289 
290  // -------------------------------------
291  // -------- create context menu --------
292  // -------------------------------------
293 
294  // actions
295  contextScaleAction_ = new QAction( tr( "Pointsize Scaling Factor..."), this );
296  contextCullingAction_ = new QAction( tr( "Backface Culling" ), this );
297  contextDefaultsAction_ = new QAction( tr( "Defaults..." ), this );
298  contextReloadShadersAction_ = new QAction( tr( "Reload Shaders" ), this );
299  contextRebuildVBOAction_ = new QAction( tr( "Rebuild VBO" ), this );
300  contextCullingAction_->setCheckable( true );
301 
302  // context menu
303  QMenu *contextMenu = new QMenu( "SplatCloud Rendering Control" );
304  contextMenu->setIcon( QIcon( OpenFlipper::Options::iconDirStr() + OpenFlipper::Options::dirSeparator() + "SplatCloudRenderingControl.png" ) );
305  contextMenu->addAction( contextScaleAction_ );
306  contextMenu->addAction( contextCullingAction_ );
307  contextMenu->addSeparator();
308  contextMenu->addAction( contextDefaultsAction_ );
309  contextMenu->addSeparator();
310  contextMenu->addAction( contextReloadShadersAction_ );
311  contextMenu->addAction( contextRebuildVBOAction_ );
312 
313  // ----
314 
315  // connect events to slots
316  connect( contextScaleAction_, SIGNAL( triggered() ), this, SLOT( slotContextScaleActionTriggered() ) );
317  connect( contextCullingAction_, SIGNAL( triggered() ), this, SLOT( slotContextCullingActionTriggered() ) );
318  connect( contextDefaultsAction_, SIGNAL( triggered() ), this, SLOT( slotContextDefaultsActionTriggered() ) );
319  connect( contextReloadShadersAction_, SIGNAL( triggered() ), this, SLOT( slotContextReloadShadersActionTriggered() ) );
320  connect( contextRebuildVBOAction_, SIGNAL( triggered() ), this, SLOT( slotContextRebuildVBOActionTriggered() ) );
321 
322  // emit signal to add the new context menu
323  emit addContextMenuItem( contextMenu->menuAction(), DATA_SPLATCLOUD, CONTEXTOBJECTMENU );
324 
325  // --------------------------------------------------
326  // -------- create context menu scale widget --------
327  // --------------------------------------------------
328 
329  // pointsize scale
330  contextScaleWidgetPointsizeScale_ = new QDoubleSpinBox();
331  contextScaleWidgetPointsizeScale_->setRange( 0.0, 100.0 );
332  contextScaleWidgetPointsizeScale_->setDecimals( 4 );
333  contextScaleWidgetPointsizeScale_->setSingleStep( 0.1 );
334  contextScaleWidgetPointsizeScale_->setToolTip( "The scaling factor of the pointsizes used during the rendering of the picked object" );
335 
336  // pointsize scale layout
337  QHBoxLayout *contextScaleWidgetPointsizeScaleLayout = new QHBoxLayout();
338  contextScaleWidgetPointsizeScaleLayout->setSpacing( 6 );
339  contextScaleWidgetPointsizeScaleLayout->addWidget( new QLabel( "Pointsize Scaling Factor:" ) );
340  contextScaleWidgetPointsizeScaleLayout->addWidget( contextScaleWidgetPointsizeScale_ );
341 
342  // widget layout
343  QVBoxLayout *contextScaleWidgetLayout = new QVBoxLayout();
344  contextScaleWidgetLayout->setAlignment( Qt::AlignTop );
345  contextScaleWidgetLayout->setSpacing( 6 );
346  contextScaleWidgetLayout->addItem( contextScaleWidgetPointsizeScaleLayout );
347 
348  // widget
349  contextScaleWidget_ = new QWidget();
350  contextScaleWidget_->setWindowTitle( "Pointsize Scaling Factor" );
351  contextScaleWidget_->setLayout( contextScaleWidgetLayout );
352 
353  // ----
354 
355  // connect events to slots
356  connect( contextScaleWidgetPointsizeScale_, SIGNAL( valueChanged(double) ), this, SLOT( slotContextScaleWidgetPointsizeScaleValueChanged() ) );
357 
358  // -----------------------------------------------------
359  // -------- create context menu defaults widget --------
360  // -----------------------------------------------------
361 
362  // default color
363  contextDefaultsWidgetDefaultColorR_ = new QSpinBox();
364  contextDefaultsWidgetDefaultColorG_ = new QSpinBox();
365  contextDefaultsWidgetDefaultColorB_ = new QSpinBox();
366  contextDefaultsWidgetDefaultColorR_->setRange( 0, 255 );
367  contextDefaultsWidgetDefaultColorG_->setRange( 0, 255 );
368  contextDefaultsWidgetDefaultColorB_->setRange( 0, 255 );
369  contextDefaultsWidgetDefaultColorR_->setSingleStep( 1 );
370  contextDefaultsWidgetDefaultColorG_->setSingleStep( 1 );
371  contextDefaultsWidgetDefaultColorB_->setSingleStep( 1 );
372  contextDefaultsWidgetDefaultColorR_->setToolTip( "The default red-component of the color used when the picked object has no colors" );
373  contextDefaultsWidgetDefaultColorG_->setToolTip( "The default green-component of the color used when the picked object has no colors" );
374  contextDefaultsWidgetDefaultColorB_->setToolTip( "The default blue-component of the color used when the picked object has no colors" );
375 
376  // default normal
377  contextDefaultsWidgetDefaultNormalX_ = new QDoubleSpinBox();
378  contextDefaultsWidgetDefaultNormalY_ = new QDoubleSpinBox();
379  contextDefaultsWidgetDefaultNormalZ_ = new QDoubleSpinBox();
380  contextDefaultsWidgetDefaultNormalX_->setRange( -1.0, 1.0 );
381  contextDefaultsWidgetDefaultNormalY_->setRange( -1.0, 1.0 );
382  contextDefaultsWidgetDefaultNormalZ_->setRange( -1.0, 1.0 );
383  contextDefaultsWidgetDefaultNormalX_->setDecimals( 2 );
384  contextDefaultsWidgetDefaultNormalY_->setDecimals( 2 );
385  contextDefaultsWidgetDefaultNormalZ_->setDecimals( 2 );
386  contextDefaultsWidgetDefaultNormalX_->setSingleStep( 0.1 );
387  contextDefaultsWidgetDefaultNormalY_->setSingleStep( 0.1 );
388  contextDefaultsWidgetDefaultNormalZ_->setSingleStep( 0.1 );
389  contextDefaultsWidgetDefaultNormalX_->setToolTip( "The default x-component of the normal used when the picked object has no normals" );
390  contextDefaultsWidgetDefaultNormalY_->setToolTip( "The default y-component of the normal used when the picked object has no normals" );
391  contextDefaultsWidgetDefaultNormalZ_->setToolTip( "The default z-component of the normal used when the picked object has no normals" );
392 
393  // default pointsize
394  contextDefaultsWidgetDefaultPointsize_ = new QDoubleSpinBox();
395  contextDefaultsWidgetDefaultPointsize_->setRange( 0.0, 1000.0 );
396  contextDefaultsWidgetDefaultPointsize_->setDecimals( 3 );
397  contextDefaultsWidgetDefaultPointsize_->setSingleStep( 0.01 );
398  contextDefaultsWidgetDefaultPointsize_->setToolTip( "The default pointsize used when the picked object has no pointsizes" );
399 
400  // default color layout
401  QHBoxLayout *contextDefaultsWidgetDefaultColorLayout = new QHBoxLayout();
402  contextDefaultsWidgetDefaultColorLayout->setSpacing( 6 );
403  contextDefaultsWidgetDefaultColorLayout->addWidget( contextDefaultsWidgetDefaultColorR_ );
404  contextDefaultsWidgetDefaultColorLayout->addWidget( contextDefaultsWidgetDefaultColorG_ );
405  contextDefaultsWidgetDefaultColorLayout->addWidget( contextDefaultsWidgetDefaultColorB_ );
406 
407  // default normal layout
408  QHBoxLayout *contextDefaultsWidgetDefaultNormalLayout = new QHBoxLayout();
409  contextDefaultsWidgetDefaultNormalLayout->setSpacing( 6 );
410  contextDefaultsWidgetDefaultNormalLayout->addWidget( contextDefaultsWidgetDefaultNormalX_ );
411  contextDefaultsWidgetDefaultNormalLayout->addWidget( contextDefaultsWidgetDefaultNormalY_ );
412  contextDefaultsWidgetDefaultNormalLayout->addWidget( contextDefaultsWidgetDefaultNormalZ_ );
413 
414  // default pointsize layout
415  QHBoxLayout *contextDefaultsWidgetDefaultPointsizeLayout = new QHBoxLayout();
416  contextDefaultsWidgetDefaultPointsizeLayout->setSpacing( 6 );
417  contextDefaultsWidgetDefaultPointsizeLayout->addWidget( contextDefaultsWidgetDefaultPointsize_ );
418 
419  // default options layout
420  QGridLayout *contextDefaultsWidgetDefaultOptionsLayout = new QGridLayout();
421  contextDefaultsWidgetDefaultOptionsLayout->setSpacing( 6 );
422  contextDefaultsWidgetDefaultOptionsLayout->addWidget( new QLabel( "Default Color:" ), 0, 0 );
423  contextDefaultsWidgetDefaultOptionsLayout->addWidget( new QLabel( "Default Normal:" ), 1, 0 );
424  contextDefaultsWidgetDefaultOptionsLayout->addWidget( new QLabel( "Default Pointsize:" ), 2, 0 );
425  contextDefaultsWidgetDefaultOptionsLayout->addItem ( contextDefaultsWidgetDefaultColorLayout, 0, 1 );
426  contextDefaultsWidgetDefaultOptionsLayout->addItem ( contextDefaultsWidgetDefaultNormalLayout, 1, 1 );
427  contextDefaultsWidgetDefaultOptionsLayout->addItem ( contextDefaultsWidgetDefaultPointsizeLayout, 2, 1 );
428 
429  // widget layout
430  QVBoxLayout *contextDefaultsWidgetLayout = new QVBoxLayout();
431  contextDefaultsWidgetLayout->setAlignment( Qt::AlignTop );
432  contextDefaultsWidgetLayout->setSpacing( 6 );
433  contextDefaultsWidgetLayout->addItem( contextDefaultsWidgetDefaultOptionsLayout );
434 
435  // widget
436  contextDefaultsWidget_ = new QWidget();
437  contextDefaultsWidget_->setWindowTitle( "Defaults" );
438  contextDefaultsWidget_->setLayout( contextDefaultsWidgetLayout );
439 
440  // ----
441 
442  // connect events to slots
443  connect( contextDefaultsWidgetDefaultColorR_, SIGNAL( valueChanged(int) ), this, SLOT( slotContextDefaultsWidgetDefaultColorValueChanged() ) );
444  connect( contextDefaultsWidgetDefaultColorG_, SIGNAL( valueChanged(int) ), this, SLOT( slotContextDefaultsWidgetDefaultColorValueChanged() ) );
445  connect( contextDefaultsWidgetDefaultColorB_, SIGNAL( valueChanged(int) ), this, SLOT( slotContextDefaultsWidgetDefaultColorValueChanged() ) );
446  connect( contextDefaultsWidgetDefaultNormalX_, SIGNAL( valueChanged(double) ), this, SLOT( slotContextDefaultsWidgetDefaultNormalValueChanged() ) );
447  connect( contextDefaultsWidgetDefaultNormalY_, SIGNAL( valueChanged(double) ), this, SLOT( slotContextDefaultsWidgetDefaultNormalValueChanged() ) );
448  connect( contextDefaultsWidgetDefaultNormalZ_, SIGNAL( valueChanged(double) ), this, SLOT( slotContextDefaultsWidgetDefaultNormalValueChanged() ) );
449  connect( contextDefaultsWidgetDefaultPointsize_, SIGNAL( valueChanged(double) ), this, SLOT( slotContextDefaultsWidgetDefaultPointsizeValueChanged() ) );
450 
451  // ----------------------------------
452  // -------- create view mode --------
453  // ----------------------------------
454 
455  // toolboxes
456  QStringList viewModeToolboxes;
457  viewModeToolboxes += "Data Control";
458  viewModeToolboxes += "Selections";
459  viewModeToolboxes += "SplatCloud Estimator";
460  viewModeToolboxes += "SplatCloud Rendering Control";
461 
462  // toolbars
463  QStringList viewModeToolbars;
464  viewModeToolbars += "Main Toolbar";
465  viewModeToolbars += "Viewer Toolbar";
466  viewModeToolbars += "Color Toolbar";
467  viewModeToolbars += "Viewing Directions";
468  viewModeToolbars += "Selection Base";
469  viewModeToolbars += "Backup Toolbar";
470 
471  // context menus
472  QStringList viewModeContextMenus;
473  viewModeContextMenus += "DataControl->Material Properties";
474  viewModeContextMenus += "DataControl->Object";
475  viewModeContextMenus += "SplatCloudEstimatorPlugin->SplatCloud Estimator";
476  viewModeContextMenus += "SplatCloudRenderingControlPlugin->SplatCloud Rendering Control";
477  viewModeContextMenus += "ViewControl->Visualization";
478  viewModeContextMenus += "Backup->&Redo";
479  viewModeContextMenus += "Backup->&Undo";
480 
481  // emit signals to add new viewmode
482  emit defineViewModeToolboxes ( "SplatCloud", viewModeToolboxes );
483  emit defineViewModeToolbars ( "SplatCloud", viewModeToolbars );
484  emit defineViewModeContextMenus( "SplatCloud", viewModeContextMenus );
485  emit defineViewModeIcon ( "SplatCloud", "SplatCloudType.png" );
486 }
487 
488 
489 //----------------------------------------------------------------
490 
491 
492 void SplatCloudRenderingControlPlugin::addedEmptyObject( int _objectId )
493 {
494  if( _objectId == -1 )
495  return;
496 
497  // get object by id
498  BaseObjectData *object;
499  if( !PluginFunctions::getObject( _objectId, object ) )
500  return;
501 
502  // get splatcloud-object
504 
505  // if object is a SplatCloud...
506  if( splatCloudObject )
507  {
508  // set current rendering options
509  splatCloudObject->enableBackfaceCulling( false );
510  splatCloudObject->setPointsizeScale ( toolboxPointsizeScale_->value() );
511 
512  // set default values
513  SplatCloudNode *splatCloudNode = splatCloudObject->splatCloudNode();
514  if( splatCloudNode )
515  {
516  splatCloudNode->setDefaultColor ( SplatCloudNode::Color ( toolboxDefaultColorR_-> value(),
517  toolboxDefaultColorG_-> value(),
518  toolboxDefaultColorB_-> value() ) );
519  splatCloudNode->setDefaultNormal ( SplatCloudNode::Normal ( toolboxDefaultNormalX_-> value(),
520  toolboxDefaultNormalY_-> value(),
521  toolboxDefaultNormalZ_-> value() ) );
522  splatCloudNode->setDefaultPointsize( SplatCloudNode::Pointsize( toolboxDefaultPointsize_->value() ) );
523  }
524  }
525 }
526 
527 
528 //----------------------------------------------------------------
529 
530 
531 void SplatCloudRenderingControlPlugin::slotUpdateContextMenu( int _objectId )
532 {
533  if( _objectId == -1 )
534  return;
535 
536  // get object by id
537  BaseObjectData *object;
538  if( !PluginFunctions::getObject( _objectId, object ) )
539  return;
540 
541  // get splatcloud-object
542  SplatCloudObject *splatCloudObject = PluginFunctions::splatCloudObject( object );
543 
544  // if object is a SplatCloud...
545  if( splatCloudObject )
546  {
547  // update context menu value
548  contextCullingAction_->setChecked( splatCloudObject->isBackfaceCullingEnabled() );
549  }
550 }
551 
552 
553 //----------------------------------------------------------------
554 
555 
556 void SplatCloudRenderingControlPlugin::slotToolboxPointsizeScaleValueChanged()
557 {
558  // get toolbox option value
559  double scale = toolboxPointsizeScale_->value();
560 
561  // for all splatcloud-objects...
563  for( ; objIter != PluginFunctions::objectsEnd(); ++objIter )
564  {
565  // get splatcloud-object
566  SplatCloudObject *splatCloudObject = PluginFunctions::splatCloudObject( *objIter );
567 
568  // apply update
569  splatCloudObject->setPointsizeScale( scale );
570 
571  // emit signal that the object has to be updated
572  emit updatedObject( objIter->id(), UPDATE_ALL );
573  }
574 }
575 
576 
577 //----------------------------------------------------------------
578 
579 
580 void SplatCloudRenderingControlPlugin::slotToolboxDefaultColorValueChanged()
581 {
582  // for all splatcloud-objects...
584  for( ; objIter != PluginFunctions::objectsEnd(); ++objIter )
585  {
586  // get scenegraph splatcloud-node
587  SplatCloudNode *splatCloudNode = PluginFunctions::splatCloudNode( *objIter );
588 
589  // apply update (set default color)
590  splatCloudNode->setDefaultColor( SplatCloudNode::Color( toolboxDefaultColorR_->value(),
591  toolboxDefaultColorG_->value(),
592  toolboxDefaultColorB_->value() ) );
593 
594  // emit signal that object has to be updated
595  emit updatedObject( objIter->id(), UPDATE_ALL );
596  }
597 }
598 
599 
600 //----------------------------------------------------------------
601 
602 
603 void SplatCloudRenderingControlPlugin::slotToolboxDefaultNormalValueChanged()
604 {
605  // for all splatcloud-objects...
607  for( ; objIter != PluginFunctions::objectsEnd(); ++objIter )
608  {
609  // get scenegraph splatcloud-node
610  SplatCloudNode *splatCloudNode = PluginFunctions::splatCloudNode( *objIter );
611 
612  // apply update (set default normal)
613  splatCloudNode->setDefaultNormal( SplatCloudNode::Normal( toolboxDefaultNormalX_->value(),
614  toolboxDefaultNormalY_->value(),
615  toolboxDefaultNormalZ_->value() ) );
616 
617  // emit signal that object has to be updated
618  emit updatedObject( objIter->id(), UPDATE_ALL );
619  }
620 }
621 
622 
623 //----------------------------------------------------------------
624 
625 
626 void SplatCloudRenderingControlPlugin::slotToolboxDefaultPointsizeValueChanged()
627 {
628  // for all splatcloud-objects...
630  for( ; objIter != PluginFunctions::objectsEnd(); ++objIter )
631  {
632  // get scenegraph splatcloud-node
633  SplatCloudNode *splatCloudNode = PluginFunctions::splatCloudNode( *objIter );
634 
635  // apply update (set default pointsize)
636  splatCloudNode->setDefaultPointsize( SplatCloudNode::Pointsize( toolboxDefaultPointsize_->value() ) );
637 
638  // emit signal that object has to be updated
639  emit updatedObject( objIter->id(), UPDATE_ALL );
640  }
641 }
642 
643 
644 //----------------------------------------------------------------
645 
646 
647 void SplatCloudRenderingControlPlugin::slotToolboxEnableBackfaceCullingButtonClicked()
648 {
649  // for all splatcloud-objects...
651  for( ; objIter != PluginFunctions::objectsEnd(); ++objIter )
652  {
653  // get splatcloud-object
654  SplatCloudObject *splatCloudObject = PluginFunctions::splatCloudObject( *objIter );
655 
656  // apply update
657  splatCloudObject->enableBackfaceCulling( true );
658 
659  // emit signal that the object has to be updated
660  emit updatedObject( objIter->id(), UPDATE_ALL );
661  }
662 }
663 
664 
665 //----------------------------------------------------------------
666 
667 
668 void SplatCloudRenderingControlPlugin::slotToolboxDisableBackfaceCullingButtonClicked()
669 {
670  // for all splatcloud-objects...
672  for( ; objIter != PluginFunctions::objectsEnd(); ++objIter )
673  {
674  // get splatcloud-object
675  SplatCloudObject *splatCloudObject = PluginFunctions::splatCloudObject( *objIter );
676 
677  // apply update
678  splatCloudObject->enableBackfaceCulling( false );
679 
680  // emit signal that the object has to be updated
681  emit updatedObject( objIter->id(), UPDATE_ALL );
682  }
683 }
684 
685 
686 //----------------------------------------------------------------
687 
688 
689 void SplatCloudRenderingControlPlugin::slotToolboxReloadShadersButtonClicked()
690 {
691  // for all splatcloud-objects...
693  for( ; objIter != PluginFunctions::objectsEnd(); ++objIter )
694  {
695  // get scenegraph splatcloud-object
696  SplatCloudObject *splatCloudObject = PluginFunctions::splatCloudObject( *objIter );
697 
698  // apply update (reload standard and picking shaders and re-set uniforms)
699  splatCloudObject->reloadShaders();
700  splatCloudObject->setPointsizeScale ( splatCloudObject->pointsizeScale() );
701  splatCloudObject->enableBackfaceCulling( splatCloudObject->isBackfaceCullingEnabled() );
702 
703  // emit signal that object has to be updated
704  emit updatedObject( objIter->id(), UPDATE_ALL );
705  }
706 }
707 
708 
709 //----------------------------------------------------------------
710 
711 
712 void SplatCloudRenderingControlPlugin::slotToolboxRebuildVBOsButtonClicked()
713 {
714  // for all splatcloud-objects...
716  for( ; objIter != PluginFunctions::objectsEnd(); ++objIter )
717  {
718  // get scenegraph splatcloud-node
719  SplatCloudNode *splatCloudNode = PluginFunctions::splatCloudNode( *objIter );
720 
721  // rebuild the vertex-buffer-object the next time the node is drawn (or picked)
722  splatCloudNode->modifiedAll();
723 
724  // emit signal that object has to be updated
725  emit updatedObject( objIter->id(), UPDATE_ALL );
726  }
727 }
728 
729 
730 //----------------------------------------------------------------
731 
732 
733 void SplatCloudRenderingControlPlugin::slotContextScaleActionTriggered()
734 {
735  // get picked object by id
736  int objectId = contextScaleAction_->data().toInt();
737  if( objectId == -1 )
738  return;
739  //
740  BaseObjectData *object;
741  if( ! PluginFunctions::getObject( objectId, object ) )
742  return;
743 
744  // get splatcloud-object
745  SplatCloudObject *splatCloudObject = PluginFunctions::splatCloudObject( object );
746 
747  // if object is a SplatCloud...
748  if( splatCloudObject )
749  {
750  // get value from SplatCloud
751  double ps = splatCloudObject->pointsizeScale();
752 
753  // update widget option value
754  contextScaleWidgetPointsizeScale_->setValue( ps );
755 
756  // move widget to position of context menu entry
757  contextScaleWidget_->move( contextScaleAction_->associatedWidgets()[0]->mapToGlobal( QPoint() ) );
758 
759  // show widget
760  contextScaleWidget_->show();
761  }
762 }
763 
764 
765 //----------------------------------------------------------------
766 
767 
768 void SplatCloudRenderingControlPlugin::slotContextScaleWidgetPointsizeScaleValueChanged()
769 {
770  // get picked object by id
771  int objectId = contextScaleAction_->data().toInt();
772  if( objectId == -1 )
773  return;
774  //
775  BaseObjectData *object;
776  if( ! PluginFunctions::getObject( objectId, object ) )
777  return;
778 
779  // get splatcloud-object
780  SplatCloudObject *splatCloudObject = PluginFunctions::splatCloudObject( object );
781 
782  // if object is a SplatCloud...
783  if( splatCloudObject )
784  {
785  // get widget option value
786  double scale = contextScaleWidgetPointsizeScale_->value();
787 
788  // apply update (set pointsize scale)
789  splatCloudObject->setPointsizeScale( scale );
790 
791  // emit signal that object has to be updated
792  emit updatedObject( object->id(), UPDATE_ALL );
793  }
794 }
795 
796 
797 //----------------------------------------------------------------
798 
799 
800 void SplatCloudRenderingControlPlugin::slotContextDefaultsActionTriggered()
801 {
802  // get picked object by id
803  int objectId = contextDefaultsAction_->data().toInt();
804  if( objectId == -1 )
805  return;
806  //
807  BaseObjectData *object;
808  if( ! PluginFunctions::getObject( objectId, object ) )
809  return;
810 
811  // get splatcloud-node
812  SplatCloudNode *splatCloudNode = PluginFunctions::splatCloudNode( object );
813 
814  // if object is a SplatCloud...
815  if( splatCloudNode )
816  {
817  // get values from SplatCloud
818  int cr = splatCloudNode->defaultColor()[0];
819  int cg = splatCloudNode->defaultColor()[1];
820  int cb = splatCloudNode->defaultColor()[2];
821  double nx = splatCloudNode->defaultNormal()[0];
822  double ny = splatCloudNode->defaultNormal()[1];
823  double nz = splatCloudNode->defaultNormal()[2];
824  double ps = splatCloudNode->defaultPointsize();
825 
826  // update widget option values
827  contextDefaultsWidgetDefaultColorR_-> setValue( cr );
828  contextDefaultsWidgetDefaultColorG_-> setValue( cg );
829  contextDefaultsWidgetDefaultColorB_-> setValue( cb );
830  contextDefaultsWidgetDefaultNormalX_-> setValue( nx );
831  contextDefaultsWidgetDefaultNormalY_-> setValue( ny );
832  contextDefaultsWidgetDefaultNormalZ_-> setValue( nz );
833  contextDefaultsWidgetDefaultPointsize_->setValue( ps );
834 
835  // move defaults widget to position of context menu entry
836  contextDefaultsWidget_->move( contextDefaultsAction_->associatedWidgets()[0]->mapToGlobal( QPoint() ) );
837 
838  // show widget
839  contextDefaultsWidget_->show();
840  }
841 }
842 
843 
844 //----------------------------------------------------------------
845 
846 
847 void SplatCloudRenderingControlPlugin::slotContextDefaultsWidgetDefaultColorValueChanged()
848 {
849  // get picked object by id
850  int objectId = contextDefaultsAction_->data().toInt();
851  if( objectId == -1 )
852  return;
853  //
854  BaseObjectData *object;
855  if( ! PluginFunctions::getObject( objectId, object ) )
856  return;
857 
858  // get splatcloud-node
859  SplatCloudNode *splatCloudNode = PluginFunctions::splatCloudNode( object );
860 
861  // if object is a SplatCloud...
862  if( splatCloudNode )
863  {
864  // apply update (set default color)
865  splatCloudNode->setDefaultColor( SplatCloudNode::Color( contextDefaultsWidgetDefaultColorR_->value(),
866  contextDefaultsWidgetDefaultColorG_->value(),
867  contextDefaultsWidgetDefaultColorB_->value() ) );
868 
869  // emit signal that the object has to be updated
870  emit updatedObject( object->id(), UPDATE_ALL );
871  }
872 }
873 
874 
875 //----------------------------------------------------------------
876 
877 
878 void SplatCloudRenderingControlPlugin::slotContextDefaultsWidgetDefaultNormalValueChanged()
879 {
880  // get picked object by id
881  int objectId = contextDefaultsAction_->data().toInt();
882  if( objectId == -1 )
883  return;
884  //
885  BaseObjectData *object;
886  if( ! PluginFunctions::getObject( objectId, object ) )
887  return;
888 
889  // get splatcloud-node
890  SplatCloudNode *splatCloudNode = PluginFunctions::splatCloudNode( object );
891 
892  // if object is a SplatCloud...
893  if( splatCloudNode )
894  {
895  // apply update (set default normal)
896  splatCloudNode->setDefaultNormal( SplatCloudNode::Normal( contextDefaultsWidgetDefaultNormalX_->value(),
897  contextDefaultsWidgetDefaultNormalY_->value(),
898  contextDefaultsWidgetDefaultNormalZ_->value() ) );
899 
900  // emit signal that the object has to be updated
901  emit updatedObject( object->id(), UPDATE_ALL );
902  }
903 }
904 
905 
906 //----------------------------------------------------------------
907 
908 
909 void SplatCloudRenderingControlPlugin::slotContextDefaultsWidgetDefaultPointsizeValueChanged()
910 {
911  // get picked object by id
912  int objectId = contextDefaultsAction_->data().toInt();
913  if( objectId == -1 )
914  return;
915  //
916  BaseObjectData *object;
917  if( ! PluginFunctions::getObject( objectId, object ) )
918  return;
919 
920  // get splatcloud-node
921  SplatCloudNode *splatCloudNode = PluginFunctions::splatCloudNode( object );
922 
923  // if object is a SplatCloud...
924  if( splatCloudNode )
925  {
926  // apply update (set default pointsize)
927  splatCloudNode->setDefaultPointsize( SplatCloudNode::Pointsize( contextDefaultsWidgetDefaultPointsize_->value() ) );
928 
929  // emit signal that the object has to be updated
930  emit updatedObject( object->id(), UPDATE_ALL );
931  }
932 }
933 
934 
935 //----------------------------------------------------------------
936 
937 
938 void SplatCloudRenderingControlPlugin::slotContextCullingActionTriggered()
939 {
940  // get picked object by id
941  int objectId = contextCullingAction_->data().toInt();
942  if( objectId == -1 )
943  return;
944  //
945  BaseObjectData *object;
946  if( ! PluginFunctions::getObject( objectId, object ) )
947  return;
948 
949  // get splatcloud-object
950  SplatCloudObject *splatCloudObject = PluginFunctions::splatCloudObject( object );
951 
952  // if object is a SplatCloud...
953  if( splatCloudObject )
954  {
955  // get context menu option value
956  bool enable = contextCullingAction_->isChecked();
957 
958  // apply update
959  splatCloudObject->enableBackfaceCulling( enable );
960 
961  // emit signal that the object has to be updated
962  emit updatedObject( object->id(), UPDATE_ALL );
963  }
964 }
965 
966 
967 //----------------------------------------------------------------
968 
969 
970 void SplatCloudRenderingControlPlugin::slotContextReloadShadersActionTriggered()
971 {
972  // get picked object by id
973  int objectId = contextReloadShadersAction_->data().toInt();
974  if( objectId == -1 )
975  return;
976  //
977  BaseObjectData *object;
978  if( ! PluginFunctions::getObject( objectId, object ) )
979  return;
980 
981  // get splatcloud-object
982  SplatCloudObject *splatCloudObject = PluginFunctions::splatCloudObject( object );
983 
984  // if object is a SplatCloud...
985  if( splatCloudObject )
986  {
987  // apply update (reload standard and picking shaders and re-set uniforms)
988  splatCloudObject->reloadShaders();
989  splatCloudObject->setPointsizeScale ( splatCloudObject->pointsizeScale() );
990  splatCloudObject->enableBackfaceCulling( splatCloudObject->isBackfaceCullingEnabled() );
991 
992  // emit signal that object has to be updated
993  emit updatedObject( object->id(), UPDATE_ALL );
994  }
995 }
996 
997 
998 //----------------------------------------------------------------
999 
1000 
1001 void SplatCloudRenderingControlPlugin::slotContextRebuildVBOActionTriggered()
1002 {
1003  // get picked object by id
1004  int objectId = contextRebuildVBOAction_->data().toInt();
1005  if( objectId == -1 )
1006  return;
1007  //
1008  BaseObjectData *object;
1009  if( ! PluginFunctions::getObject( objectId, object ) )
1010  return;
1011 
1012  // get splatcloud-node
1013  SplatCloudNode *splatCloudNode = PluginFunctions::splatCloudNode( object );
1014 
1015  // if object is a SplatCloud...
1016  if( splatCloudNode )
1017  {
1018  // rebuild the vertex-buffer-object the next time the node is drawn (or picked)
1019  splatCloudNode->modifiedAll();
1020 
1021  // emit signal that object has to be updated
1022  emit updatedObject( object->id(), UPDATE_ALL );
1023  }
1024 }
1025 
1026 
1027 //================================================================
1028 
1029 
1030 #if QT_VERSION < 0x050000
1031  Q_EXPORT_PLUGIN2( splatcloudrenderingcontrolplugin, SplatCloudRenderingControlPlugin );
1032 #endif
1033 
1034 
const QStringList ALL_OBJECTS
Iterable object range.
SplatCloudNode * splatCloudNode(BaseObjectData *_object)
Get a SplatCloudNode from an object.
const UpdateType UPDATE_ALL(UpdateTypeSet(1))
Identifier for all updates.
bool getObject(int _identifier, BSplineCurveObject *&_object)
SplatCloudNode * splatCloudNode()
Get SplatCloud's scenegraph Node.
void enableBackfaceCulling(bool _enable)
Enable or disable backface culling for all Shaders.
void reloadShaders()
Reload standard and picking Shaders from file.
DLLEXPORT ObjectIterator objectsEnd()
Return Iterator to Object End.
SplatCloudObject * splatCloudObject(BaseObjectData *_object)
Cast an SplatCloudObject to a SplatCloudObject if possible.
#define DATA_SPLATCLOUD
Definition: SplatCloud.hh:65
The Menu will be shown when an object was picked.
void setPointsizeScale(float _scale)
Set the scaling factor for pointsizes for all Shaders.
int id() const
Definition: BaseObject.cc:201