ScenegraphWidget.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * Copyright (C) 2012-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5  *
6  * ArmarX is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * ArmarX is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * @package MemoryX::gui-plugins::SceneEditor
19  * @date 2015
20  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
21  * GNU General Public License
22  */
23 
24 #include "ScenegraphWidget.h"
25 
26 #include <math.h>
27 
28 #include <vector>
29 
30 #include <QByteArray>
31 #include <QDataStream>
32 #include <QGridLayout>
33 
34 #include "../controller/AddOperation.h"
35 #include "../controller/DeselectOperation.h"
36 #include "../controller/RotateTranslateOperation.h"
37 #include "../controller/SelectOperation.h"
38 #include "OverrideAction.h"
39 #include "QMimeData"
40 #include <Inventor/actions/SoRayPickAction.h>
41 
43  QWidget(parent),
45  camera(new SoPerspectiveCamera),
46  copyBuffer(new std::vector<controller::AddOperationPtr>())
47 {
48  //setPalette(Qt::transparent);
49  //setAttribute(Qt::WA_TransparentForMouseEvents);
50  mainController = control;
51 
52  this->setContentsMargins(1, 1, 1, 1);
53 
54  QGridLayout* grid = new QGridLayout();
55  grid->setContentsMargins(0, 0, 0, 0);
56  this->setLayout(grid);
57  this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
58 
59  QWidget* view1 = new QWidget(this);
60  view1->setMinimumSize(100, 100);
61  view1->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
62  grid->addWidget(view1, 0, 0, 1, 2);
63 
64  viewer.reset(new scene3D::SceneViewer(control, view1));
65 
66  std::shared_ptr<gui::ShortcutController> shortcutController = control->getShortcutController();
67 
68  //Camera view all action
69  QPointer<QAction> cameraViewAllAction(new OverrideAction("Scene: Camera view all", this));
70  this->addAction(cameraViewAllAction);
71  connect(cameraViewAllAction, SIGNAL(triggered()), this, SLOT(cameraViewAll()));
72  shortcutController->registerAction(cameraViewAllAction->text(), cameraViewAllAction);
73 
74  //Camera view from X action
75  QPointer<QAction> cameraViewFromXAction(new OverrideAction("Scene: Camera view from X", this));
76  this->addAction(cameraViewFromXAction);
77  connect(cameraViewFromXAction, SIGNAL(triggered()), this, SLOT(cameraViewFromX()));
78  shortcutController->registerAction(cameraViewFromXAction->text(), cameraViewFromXAction);
79 
80  //Camera view from neg X action
81  QPointer<QAction> cameraViewFromNegXAction(
82  new OverrideAction("Scene: Camera view from negative X", this));
83  this->addAction(cameraViewFromNegXAction);
84  connect(cameraViewFromNegXAction, SIGNAL(triggered()), this, SLOT(cameraViewFromNegX()));
85  shortcutController->registerAction(cameraViewFromNegXAction->text(), cameraViewFromNegXAction);
86 
87  //Camera view from Y action
88  QPointer<QAction> cameraViewFromYAction(new OverrideAction("Scene: Camera view from Y", this));
89  this->addAction(cameraViewFromYAction);
90  connect(cameraViewFromYAction, SIGNAL(triggered()), this, SLOT(cameraViewFromY()));
91  shortcutController->registerAction(cameraViewFromYAction->text(), cameraViewFromYAction);
92 
93  //Camera view from neg Y action
94  QPointer<QAction> cameraViewFromNegYAction(
95  new OverrideAction("Scene: Camera view from negative Y", this));
96  this->addAction(cameraViewFromNegYAction);
97  connect(cameraViewFromNegYAction, SIGNAL(triggered()), this, SLOT(cameraViewFromNegY()));
98  shortcutController->registerAction(cameraViewFromNegYAction->text(), cameraViewFromNegYAction);
99 
100  //Camera view from Z action
101  QPointer<QAction> cameraViewFromZAction(new OverrideAction("Scene: Camera view from Z", this));
102  this->addAction(cameraViewFromZAction);
103  connect(cameraViewFromZAction, SIGNAL(triggered()), this, SLOT(cameraViewFromZ()));
104  shortcutController->registerAction(cameraViewFromZAction->text(), cameraViewFromZAction);
105 
106  //Camera view from neg Z action
107  QPointer<QAction> cameraViewFromNegZAction(
108  new OverrideAction("Scene: Camera view from negative Z", this));
109  this->addAction(cameraViewFromNegZAction);
110  connect(cameraViewFromNegZAction, SIGNAL(triggered()), this, SLOT(cameraViewFromNegZ()));
111  shortcutController->registerAction(cameraViewFromNegZAction->text(), cameraViewFromNegZAction);
112 
113  //Select all or deselect all action
114  QPointer<QAction> selectToggleAllAction(
115  new OverrideAction("Scene: Select all or deselect all", this));
116  this->addAction(selectToggleAllAction);
117  connect(selectToggleAllAction, SIGNAL(triggered()), this, SLOT(selectToggleAll()));
118  shortcutController->registerAction(selectToggleAllAction->text(), selectToggleAllAction);
119 
120  //Copy action
121  QPointer<QAction> copyAction(new OverrideAction("Scene: Copy selection", this));
122  this->addAction(copyAction);
123  connect(copyAction, SIGNAL(triggered()), this, SLOT(copy()));
124  shortcutController->registerAction(copyAction->text(), copyAction);
125 
126  //Paste action
127  QPointer<QAction> pasteAction(new OverrideAction("Scene: Paste selection", this));
128  this->addAction(pasteAction);
129  connect(pasteAction, SIGNAL(triggered()), this, SLOT(paste()));
130  shortcutController->registerAction(pasteAction->text(), pasteAction);
131 
132  //Duplicate action
133  QPointer<QAction> duplicateAction(new OverrideAction("Scene: Duplicate selection", this));
134  this->addAction(duplicateAction);
135  connect(duplicateAction, SIGNAL(triggered()), this, SLOT(duplicate()));
136  shortcutController->registerAction(duplicateAction->text(), duplicateAction);
137 
138  //Reset rotation action
139  QPointer<QAction> resetRotationAction(new OverrideAction("Scene: Reset rotation", this));
140  this->addAction(resetRotationAction);
141  connect(resetRotationAction, SIGNAL(triggered()), this, SLOT(resetRotation()));
142  shortcutController->registerAction(resetRotationAction->text(), resetRotationAction);
143 
144  //Reset translation action
145  QPointer<QAction> resetTranslationAction(new OverrideAction("Scene: Reset translation", this));
146  this->addAction(resetTranslationAction);
147  connect(resetTranslationAction, SIGNAL(triggered()), this, SLOT(resetTranslation()));
148  shortcutController->registerAction(resetTranslationAction->text(), resetTranslationAction);
149 }
150 
152 {
153 }
154 
155 void
157 {
158  viewer->setSceneGraph(mainController->getScene()->registerCamera(camera));
159 
160  //Give camera standard position
161  camera->position.setValue(SbVec3f(10, -10, 5));
162  camera->pointAt(SbVec3f(0, 0, 0), SbVec3f(0, 0, 1));
163 
164 
165  //Apply custom highlighting and make viewer redraw on selection changes
166  viewer->setGLRenderAction(new scene3D::SoGLHighlightRenderAction(
167  viewer->getViewportRegion(), mainController->getScene().get()));
168  viewer->redrawOnSelectionChange(mainController->getScene()->selectionRootNode);
169 
170  // show everything
171  viewer->show();
172 
173  setAcceptDrops(true);
174 
175  connect(mainController.get(), SIGNAL(reloadScene()), this, SLOT(cameraViewAll()));
176  connect(mainController.get(), SIGNAL(minimapClicked()), this, SLOT(cameraViewFromZ()));
177 }
178 
179 void
181 {
183  {
184  std::shared_ptr<std::vector<controller::OperationPtr>> operations(
185  new std::vector<controller::OperationPtr>());
186 
187  for (scene3D::SceneObjectPtr sceneobject :
188  controller->getScene()->sceneSelectionManager->getAllSelected())
189  {
190  controller::OperationPtr operation(
191  new controller::RotateTranslateOperation(controller->getMemoryXController(),
192  controller->getScene(),
193  sceneobject->getObjectId(),
194  sceneobject->getRotation(),
195  SbRotation(SbVec3f(0, 0, 1), 0),
196  sceneobject->getTranslation(),
197  sceneobject->getTranslation()));
198 
199  operations->push_back(operation);
200  }
201 
205  operations);
206  }
207 }
208 
209 void
211 {
213  {
214  std::shared_ptr<std::vector<controller::OperationPtr>> operations(
215  new std::vector<controller::OperationPtr>());
216 
217  for (scene3D::SceneObjectPtr sceneobject :
218  controller->getScene()->sceneSelectionManager->getAllSelected())
219  {
220  controller::OperationPtr operation(
221  new controller::RotateTranslateOperation(controller->getMemoryXController(),
222  controller->getScene(),
223  sceneobject->getObjectId(),
224  sceneobject->getRotation(),
225  sceneobject->getRotation(),
226  sceneobject->getTranslation(),
227  SbVec3f(0, 0, 0)));
228 
229  operations->push_back(operation);
230  }
231 
235  operations);
236  }
237 }
238 
239 void
241 {
243  {
244  //Clear copy buffer
245  copyBuffer->clear();
246 
247  for (scene3D::SceneObjectPtr sceneobject :
248  controller->getScene()->sceneSelectionManager->getAllSelected())
249  {
250  controller::AddOperationPtr addOperation(
251  new controller::AddOperation(controller->getMemoryXController(),
252  controller->getScene(),
253  sceneobject->getClassId(),
254  sceneobject->getCollection(),
255  sceneobject->getTranslation(),
256  sceneobject->getRotation()));
257 
258  copyBuffer->push_back(addOperation);
259  }
260  }
261 }
262 
263 void
265 {
266  if (copyBuffer->size() != 0)
267  {
269  {
270  std::shared_ptr<std::vector<controller::OperationPtr>> operations(
271  new std::vector<controller::OperationPtr>());
272 
273  // deselect all objects
274  for (scene3D::SceneObjectPtr object :
275  controller->getScene()->getSelectionManager()->getAllSelected())
276  {
277  controller::OperationPtr deselect(
278  new controller::DeselectOperation(controller->getMemoryXController(),
279  controller->getScene(),
280  object->getObjectId()));
281  operations->push_back(deselect);
282  }
283 
284  // add new objects
285  for (auto it = copyBuffer->begin(); it != copyBuffer->end(); ++it)
286  {
288  operations->push_back(add);
290  new controller::SelectOperation(controller->getMemoryXController(),
291  controller->getScene(),
292  add->getObjectId()));
293  operations->push_back(select);
294  }
295 
299  operations);
300  }
301  }
302 }
303 
304 void
306 {
308  {
309  std::shared_ptr<std::vector<controller::OperationPtr>> operations(
310  new std::vector<controller::OperationPtr>());
311 
312  for (scene3D::SceneObjectPtr object :
313  controller->getScene()->getSelectionManager()->getAllSelected())
314  {
316  controller->getMemoryXController(), controller->getScene(), object->getObjectId()));
317  operations->push_back(deselect);
319  new controller::AddOperation(controller->getMemoryXController(),
320  controller->getScene(),
321  object->getClassId(),
322  object->getCollection(),
323  object->getTranslation(),
324  object->getRotation()));
325  operations->push_back(add);
327  controller->getMemoryXController(), controller->getScene(), add->getObjectId()));
328  operations->push_back(select);
329  }
330 
334  operations);
335  }
336 }
337 
338 void
340 {
342  {
343  controller->getScene()->makeCameraViewAll(camera, viewer->getViewportRegion());
344  }
345 }
346 
347 void
349 {
350  //Make sure we are on x axis
351  camera->position.setValue(1, 0, 0);
352  //Look at scene
353  camera->pointAt(SbVec3f(0, 0, 0), SbVec3f(0, 0, 1));
354 
355  //View everything in bounding box
356  this->cameraViewAll();
357 }
358 
359 void
361 {
362  //Make sure we are on x axis
363  camera->position.setValue(-1, 0, 0);
364  //Look at scene
365  camera->pointAt(SbVec3f(0, 0, 0), SbVec3f(0, 0, 1));
366 
367  //View everything in bounding box
368  this->cameraViewAll();
369 }
370 
371 void
373 {
374  //Make sure we are on x axis
375  camera->position.setValue(0, 1, 0);
376  //Look at scene
377  camera->pointAt(SbVec3f(0, 0, 0), SbVec3f(0, 0, 1));
378 
379  //View everything in bounding box
380  this->cameraViewAll();
381 }
382 
383 void
385 {
386  //Make sure we are on x axis
387  camera->position.setValue(0, -1, 0);
388  //Look at scene
389  camera->pointAt(SbVec3f(0, 0, 0), SbVec3f(0, 0, 1));
390 
391  //View everything in bounding box
392  this->cameraViewAll();
393 }
394 
395 void
397 {
398  //Make sure we are on x axis
399  camera->position.setValue(0, 0, 1);
400  //Look at scene
401  camera->pointAt(SbVec3f(0, 0, 0), SbVec3f(0, 1, 0));
402 
403  //View everything in bounding box
404  this->cameraViewAll();
405 }
406 
407 void
409 {
410  //Make sure we are on x axis
411  camera->position.setValue(0, 0, -1);
412  //Look at scene
413  camera->pointAt(SbVec3f(0, 0, 0), SbVec3f(0, 1, 0));
414 
415  //View everything in bounding box
416  this->cameraViewAll();
417 }
418 
419 void
421 {
423  {
424  //Check if all objects are selected
425  bool allObjectsAreSelected = true;
426 
427  for (scene3D::SceneObjectPtr object :
428  controller->getScene()->getObjectManager()->getAllObjects())
429  {
430  if (!controller->getScene()->getSelectionManager()->isSelected(object))
431  {
432  allObjectsAreSelected = false;
433  break;
434  }
435  }
436 
437  //Prepare some operations
438  std::shared_ptr<std::vector<controller::OperationPtr>> operations(
439  new std::vector<controller::OperationPtr>());
440 
441  if (allObjectsAreSelected)
442  {
443  //Deselect all
444  for (scene3D::SceneObjectPtr object :
445  controller->getScene()->getSelectionManager()->getAllSelected())
446  {
447  controller::OperationPtr deselect(
448  new controller::DeselectOperation(controller->getMemoryXController(),
449  controller->getScene(),
450  object->getObjectId()));
451  operations->push_back(deselect);
452  }
453  }
454  else
455  {
456  //Select all
457  for (scene3D::SceneObjectPtr object :
458  controller->getScene()->getObjectManager()->getAllObjects())
459  {
460  if (!controller->getScene()->getSelectionManager()->isSelected(object))
461  {
463  new controller::SelectOperation(controller->getMemoryXController(),
464  controller->getScene(),
465  object->getObjectId()));
466  operations->push_back(select);
467  }
468  }
469  }
470 
471  //Execute stuff
475  operations);
476  }
477 }
478 
479 void
481 {
482  // The event needs to be accepted here
483  event->accept();
484 }
485 
486 void
488 {
489  // Set the drop action to be the proposed action.
490  if (event->source())
491  {
492  event->acceptProposedAction();
493  }
494  else
495  {
496  event->ignore();
497  }
498 }
499 
500 void
502 {
503  if (!event->mimeData()->hasFormat("application/vnd.text.list"))
504  {
505  return;
506  }
507 
509  {
510  QByteArray encodedData = event->mimeData()->data("application/vnd.text.list");
511  QDataStream stream(&encodedData, QIODevice::ReadOnly);
512 
513  std::shared_ptr<std::vector<controller::OperationPtr>> operations(
514  new std::vector<controller::OperationPtr>());
515 
516  // deselect all objects
517  for (scene3D::SceneObjectPtr object :
518  controller->getScene()->getSelectionManager()->getAllSelected())
519  {
521  controller->getMemoryXController(), controller->getScene(), object->getObjectId()));
522  operations->push_back(deselect);
523  }
524 
525  // add new objects
526  while (!stream.atEnd())
527  {
528  QString collection, objectType;
529  stream >> collection;
530  stream >> objectType;
531 
532  // get needed information
533  SoCamera* pCamera = viewer->getCamera();
534  float aspect = viewer->getViewportRegion().getViewportAspectRatio();
535  SbViewVolume vvol = pCamera->getViewVolume(aspect);
536 
537  if (aspect < 1)
538  {
539  vvol.scale(1 / aspect);
540  }
541 
542  SbPlane ground(SbVec3f(0, 0, 1), SbVec3f(0, 0, 0));
543  SbVec2s clickPoint((short)event->pos().x(), (short)(this->height() - event->pos().y()));
544  SbVec2f clickPointNormalized(1.0f * event->pos().x() / this->width(),
545  1.0f - 1.0f * event->pos().y() / this->height());
546 
547  // calculate position to insert the object
548  SbVec3f insertPosition;
549  SbLine line;
550  vvol.projectPointToLine(clickPointNormalized, line);
551  SbVec3f pointOnCameraPlane;
552  vvol.getPlane(0.0).intersect(line, pointOnCameraPlane);
553  ground.intersect(line, insertPosition);
554 
555  if (pointOnCameraPlane.getValue()[2] > 0)
556  {
557  SoRayPickAction rp(viewer->getViewportRegion());
558  rp.setPickAll(false);
559  rp.setPoint(clickPoint);
560  rp.apply(viewer->getSceneGraph());
561  SoPickedPoint* picked = rp.getPickedPoint();
562 
563  if (picked != NULL)
564  {
565  insertPosition = picked->getPoint();
566  }
567  }
568 
569  // set the standard rotation
570  SbRotation insertRotation(SbVec3f(1, 0, 0), 0);
571 
572  // create operations
574  new controller::AddOperation(controller->getMemoryXController(),
575  controller->getScene(),
576  objectType.toStdString(),
577  collection.toStdString(),
578  insertPosition,
579  insertRotation));
580  operations->push_back(add);
582  controller->getMemoryXController(), controller->getScene(), add->getObjectId()));
583  operations->push_back(select);
584  }
585 
589  operations);
590  }
591 }
scene3D::SceneViewer
Definition: SceneViewer.h:32
gui::ScenegraphWidget::dropEvent
void dropEvent(QDropEvent *de) override
Reimplements the function Qt::QWidget:dropEvent().
Definition: ScenegraphWidget.cpp:501
gui::OverrideAction
Definition: OverrideAction.h:31
gui::ScenegraphWidget::cameraViewFromX
void cameraViewFromX()
Definition: ScenegraphWidget.cpp:348
controller::Controller::EXECUTE_ON_SCENE
static const int EXECUTE_ON_SCENE
A flag to execute operations on the Scene.
Definition: Controller.h:73
gui::ScenegraphWidget::cameraViewFromY
void cameraViewFromY()
Definition: ScenegraphWidget.cpp:372
gui::ScenegraphWidget::resetTranslation
void resetTranslation()
Definition: ScenegraphWidget.cpp:210
scene3D::SoGLHighlightRenderAction
Definition: SoGLHighlightRenderAction.h:56
gui::ScenegraphWidget::cameraViewFromNegX
void cameraViewFromNegX()
Definition: ScenegraphWidget.cpp:360
gui::ScenegraphWidget::cameraViewAll
void cameraViewAll()
Definition: ScenegraphWidget.cpp:339
gui::ScenegraphWidget::dragMoveEvent
void dragMoveEvent(QDragMoveEvent *de) override
Reimplements the function Qt::QWidget:dragMoveEvent();.
Definition: ScenegraphWidget.cpp:480
ScenegraphWidget.h
gui::ScenegraphWidget::cameraViewFromNegY
void cameraViewFromNegY()
Definition: ScenegraphWidget.cpp:384
gui::ScenegraphWidget::cameraViewFromNegZ
void cameraViewFromNegZ()
Definition: ScenegraphWidget.cpp:408
gui::ScenegraphWidget::selectToggleAll
void selectToggleAll()
Definition: ScenegraphWidget.cpp:420
controller::Controller::UNDOABLE
static const int UNDOABLE
A flag to save the executed operations to the history.
Definition: Controller.h:80
controller
Definition: AddOperation.h:39
controller::ControllerPtr
std::shared_ptr< Controller > ControllerPtr
Definition: ClassDefinitions.h:41
OverrideAction.h
gui::ScenegraphWidget::paste
void paste()
Definition: ScenegraphWidget.cpp:264
gui::ScenegraphWidget::dragEnterEvent
void dragEnterEvent(QDragEnterEvent *event) override
Reimplements the function Qt::QWidget:dragEnterEvent();.
Definition: ScenegraphWidget.cpp:487
gui::ScenegraphWidget::cameraViewFromZ
void cameraViewFromZ()
Definition: ScenegraphWidget.cpp:396
gui::ScenegraphWidget::duplicate
void duplicate()
Definition: ScenegraphWidget.cpp:305
controller::DeselectOperation
A operation to deselect a object.
Definition: DeselectOperation.h:41
controller::SelectOperation
A operation to select a object.
Definition: SelectOperation.h:41
std
Definition: Application.h:66
controller::OperationPtr
std::shared_ptr< Operation > OperationPtr
Definition: ClassDefinitions.h:54
scene3D::SceneObjectPtr
boost::intrusive_ptr< SceneObject > SceneObjectPtr
Definition: PointerDefinitions.h:40
gui::ScenegraphWidget::copy
void copy()
Definition: ScenegraphWidget.cpp:240
controller::RotateTranslateOperation
A operation to rotate and translate a object.
Definition: RotateTranslateOperation.h:46
controller::Controller::EXECUTE_ON_WM
static const int EXECUTE_ON_WM
A Flag to execute operations on the WorkingMemory.
Definition: Controller.h:66
controller::AddOperationPtr
std::shared_ptr< AddOperation > AddOperationPtr
Definition: ClassDefinitions.h:32
gui::ScenegraphWidget::postDocking
void postDocking()
Definition: ScenegraphWidget.cpp:156
gui::ScenegraphWidget::~ScenegraphWidget
~ScenegraphWidget() override
Destructor.
Definition: ScenegraphWidget.cpp:151
control
This file is part of ArmarX.
gui::ScenegraphWidget::resetRotation
void resetRotation()
Definition: ScenegraphWidget.cpp:180
controller::AddOperation
A Operation to create a new object in the scene and the WorkingMemory.
Definition: AddOperation.h:46
gui::ScenegraphWidget::ScenegraphWidget
ScenegraphWidget(const controller::ControllerPtr control, QWidget *parent=0)
Constructor.
Definition: ScenegraphWidget.cpp:42