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
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
154
155void
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
179void
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
209void
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
239void
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
263void
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 {
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
304void
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
338void
340{
342 {
343 controller->getScene()->makeCameraViewAll(camera, viewer->getViewportRegion());
344 }
345}
346
347void
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
359void
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
371void
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
383void
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
395void
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
407void
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
419void
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 {
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
479void
481{
482 // The event needs to be accepted here
483 event->accept();
484}
485
486void
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
500void
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}
A Operation to create a new object in the scene and the WorkingMemory.
static const int UNDOABLE
A flag to save the executed operations to the history.
Definition Controller.h:80
static const int EXECUTE_ON_WM
A Flag to execute operations on the WorkingMemory.
Definition Controller.h:66
static const int EXECUTE_ON_SCENE
A flag to execute operations on the Scene.
Definition Controller.h:73
A operation to deselect a object.
A operation to rotate and translate a object.
A operation to select a object.
void dragEnterEvent(QDragEnterEvent *event) override
Reimplements the function Qt::QWidget:dragEnterEvent();.
ScenegraphWidget(const controller::ControllerPtr control, QWidget *parent=0)
Constructor.
~ScenegraphWidget() override
Destructor.
void dropEvent(QDropEvent *de) override
Reimplements the function Qt::QWidget:dropEvent().
void dragMoveEvent(QDragMoveEvent *de) override
Reimplements the function Qt::QWidget:dragMoveEvent();.
This file is part of ArmarX.
std::shared_ptr< Controller > ControllerPtr
std::shared_ptr< AddOperation > AddOperationPtr
std::shared_ptr< Operation > OperationPtr
boost::intrusive_ptr< SceneObject > SceneObjectPtr