From 25acd5501d40bc49618b1443c7951d36946a0d21 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 7 Sep 2016 13:44:53 +0300 Subject: Add local axes visualization for currently selected object MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ib6e66c94630e662e5e2affedd17fc929643b72b9 Reviewed-by: Tomi Korpipää --- editorlib/meshes/arrow.obj | 136 ++++++++++++++++++++++++++++++++++++++++++ editorlib/qml.qrc | 1 + editorlib/src/editorscene.cpp | 68 +++++++++++++++++++-- editorlib/src/editorscene.h | 6 +- editorlib/src/editorutils.cpp | 29 +++++++++ editorlib/src/editorutils.h | 4 ++ 6 files changed, 238 insertions(+), 6 deletions(-) create mode 100644 editorlib/meshes/arrow.obj (limited to 'editorlib') diff --git a/editorlib/meshes/arrow.obj b/editorlib/meshes/arrow.obj new file mode 100644 index 0000000..e9952c9 --- /dev/null +++ b/editorlib/meshes/arrow.obj @@ -0,0 +1,136 @@ +# Blender v2.71 (sub 0) OBJ File: 'arrow.blend' +# www.blender.org +o Cone +v 0.000000 0.935140 -0.006571 +v 0.000000 -0.001695 -0.006571 +v 0.001282 0.935140 -0.006445 +v 0.001282 -0.001695 -0.006445 +v 0.002515 0.935140 -0.006071 +v 0.002515 -0.001695 -0.006071 +v 0.003651 0.935140 -0.005464 +v 0.003651 -0.001695 -0.005464 +v 0.004647 0.935140 -0.004647 +v 0.004647 -0.001695 -0.004647 +v 0.005464 0.935140 -0.003651 +v 0.005464 -0.001695 -0.003651 +v 0.006071 0.935140 -0.002515 +v 0.006071 -0.001695 -0.002515 +v 0.006445 0.935140 -0.001282 +v 0.006445 -0.001695 -0.001282 +v 0.006571 0.935140 -0.000000 +v 0.006571 -0.001695 -0.000000 +v 0.006445 0.935140 0.001282 +v 0.006445 -0.001695 0.001282 +v 0.006071 0.935140 0.002515 +v 0.006071 -0.001695 0.002515 +v 0.005464 0.935140 0.003651 +v 0.005464 -0.001695 0.003651 +v 0.004647 0.935140 0.004647 +v 0.004647 -0.001695 0.004647 +v 0.003651 0.935140 0.005464 +v 0.003651 -0.001695 0.005464 +v 0.002515 0.935140 0.006071 +v 0.002515 -0.001695 0.006071 +v 0.001282 0.935140 0.006445 +v 0.001282 -0.001695 0.006445 +v -0.000000 0.935140 0.006571 +v -0.000000 -0.001695 0.006571 +v -0.001282 0.935140 0.006445 +v -0.001282 -0.001695 0.006445 +v -0.002515 0.935140 0.006071 +v -0.002515 -0.001695 0.006071 +v -0.003651 0.935140 0.005464 +v -0.003651 -0.001695 0.005464 +v -0.004647 0.935140 0.004647 +v -0.004647 -0.001695 0.004647 +v -0.005464 0.935140 0.003651 +v -0.005464 -0.001695 0.003651 +v -0.006071 0.935140 0.002515 +v -0.006071 -0.001695 0.002515 +v -0.006445 0.935140 0.001282 +v -0.006445 -0.001695 0.001282 +v -0.006571 0.935140 -0.000000 +v -0.006571 -0.001695 -0.000000 +v -0.006445 0.935140 -0.001282 +v -0.006445 -0.001695 -0.001282 +v -0.006071 0.935140 -0.002515 +v -0.006071 -0.001695 -0.002515 +v -0.005464 0.935140 -0.003651 +v -0.005464 -0.001695 -0.003651 +v -0.004647 0.935140 -0.004647 +v -0.004647 -0.001695 -0.004647 +v -0.003651 0.935140 -0.005464 +v -0.003651 -0.001695 -0.005464 +v -0.002515 0.935140 -0.006071 +v -0.002515 -0.001695 -0.006071 +v -0.001282 0.935140 -0.006445 +v -0.001282 -0.001695 -0.006445 +v 0.000000 0.912601 -0.035823 +v 0.013709 0.912601 -0.033096 +v 0.025331 0.912601 -0.025331 +v 0.033096 0.912601 -0.013709 +v 0.035823 0.912601 -0.000000 +v 0.000000 0.998305 0.000000 +v 0.033096 0.912601 0.013709 +v 0.025331 0.912601 0.025331 +v 0.013709 0.912601 0.033096 +v -0.000000 0.912601 0.035823 +v -0.013709 0.912601 0.033096 +v -0.025331 0.912601 0.025331 +v -0.033096 0.912601 0.013709 +v -0.035823 0.912601 -0.000000 +v -0.033096 0.912601 -0.013709 +v -0.025331 0.912601 -0.025331 +v -0.013709 0.912601 -0.033096 +s off +f 1 2 4 3 +f 3 4 6 5 +f 5 6 8 7 +f 7 8 10 9 +f 9 10 12 11 +f 11 12 14 13 +f 13 14 16 15 +f 15 16 18 17 +f 17 18 20 19 +f 19 20 22 21 +f 21 22 24 23 +f 23 24 26 25 +f 25 26 28 27 +f 27 28 30 29 +f 29 30 32 31 +f 31 32 34 33 +f 33 34 36 35 +f 35 36 38 37 +f 37 38 40 39 +f 39 40 42 41 +f 41 42 44 43 +f 43 44 46 45 +f 45 46 48 47 +f 47 48 50 49 +f 49 50 52 51 +f 51 52 54 53 +f 53 54 56 55 +f 55 56 58 57 +f 57 58 60 59 +f 59 60 62 61 +f 4 2 64 62 60 58 56 54 52 50 48 46 44 42 40 38 36 34 32 30 28 26 24 22 20 18 16 14 12 10 8 6 +f 63 64 2 1 +f 61 62 64 63 +f 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 +f 67 66 70 +f 70 65 81 +f 80 70 81 +f 79 70 80 +f 78 70 79 +f 77 70 78 +f 76 70 77 +f 65 66 67 68 69 71 72 73 74 75 76 77 78 79 80 81 +f 75 70 76 +f 75 74 70 +f 74 73 70 +f 73 72 70 +f 72 71 70 +f 71 69 70 +f 69 68 70 +f 68 67 70 +f 70 66 65 diff --git a/editorlib/qml.qrc b/editorlib/qml.qrc index 9d5dc89..0e94144 100644 --- a/editorlib/qml.qrc +++ b/editorlib/qml.qrc @@ -1,5 +1,6 @@ + meshes/arrow.obj meshes/camera.obj meshes/defaultmesh.obj meshes/spotlight.obj diff --git a/editorlib/src/editorscene.cpp b/editorlib/src/editorscene.cpp index db42f72..57d200d 100644 --- a/editorlib/src/editorscene.cpp +++ b/editorlib/src/editorscene.cpp @@ -88,6 +88,9 @@ static const int dragCornerHandleCount = 8; // One handle for each selection box static const QColor selectionBoxColor("#43adee"); static const QColor cameraFrustumColor("#c22555"); static const QColor helperPlaneColor("#585a5c"); +static const QColor helperArrowColorX("red"); +static const QColor helperArrowColorY("green"); +static const QColor helperArrowColorZ("blue"); EditorScene::EditorScene(QObject *parent) : QObject(parent) @@ -109,6 +112,8 @@ EditorScene::EditorScene(QObject *parent) , m_undoHandler(new UndoHandler(this)) , m_helperPlane(nullptr) , m_helperPlaneTransform(nullptr) + , m_helperArrows(nullptr) + , m_helperArrowsTransform(nullptr) , m_meshCenterIndicatorLine(nullptr) , m_meshCenterIndicatorLineTransform(nullptr) , m_qtTranslator(new QTranslator(this)) @@ -883,6 +888,17 @@ void EditorScene::doUpdateGroupSelectionBoxes() m_groupBoxUpdatePending = false; } +void EditorScene::enableHelperArrows(bool enable) +{ + // TODO: Remove this function once disabling parent properly hides the children + Q_FOREACH (QObject *child, m_helperArrows->children()) { + Qt3DCore::QEntity *childEntity = qobject_cast(child); + if (childEntity) + childEntity->setEnabled(enable); + } + m_helperArrows->setEnabled(enable); +} + EditorSceneItem *EditorScene::itemByName(const QString &name) { const QList items = m_sceneItems.values(); @@ -942,8 +958,9 @@ void EditorScene::updateVisibleSceneCameraMatrix(const EditorScene::CameraData & m_activeSceneCameraFrustumData.viewCenterTransform->setTranslation( cameraData.cameraEntity->viewCenter()); - resizeCameraViewCenterEntity(); + resizeConstantScreenSizeEntities(); } + } void EditorScene::connectDragHandles(EditorSceneItem *item, bool enable) @@ -1757,6 +1774,9 @@ void EditorScene::createRootEntity() // Helper plane createHelperPlane(); + // Helper arrows + createHelperArrows(); + // The drag handles translation is same as the selection box + a specified distance // depending on the scale of the box. m_dragHandlesTransform = new Qt3DCore::QTransform(); @@ -1845,6 +1865,25 @@ void EditorScene::createHelperPlane() m_helperPlane->setParent(m_rootEntity); } +void EditorScene::createHelperArrows() +{ + m_helperArrows = new Qt3DCore::QEntity(); + m_helperArrows->setObjectName(QStringLiteral("__internal helper arrows")); + + QMatrix4x4 matrix; + EditorUtils::createArrowEntity(helperArrowColorY, m_helperArrows, matrix); + matrix.rotate(90.0f, QVector3D(1.0f, 0.0f, 0.0f)); + EditorUtils::createArrowEntity(helperArrowColorZ, m_helperArrows, matrix); + matrix = QMatrix(); + matrix.rotate(-90.0f, QVector3D(0.0f, 0.0f, 1.0f)); + EditorUtils::createArrowEntity(helperArrowColorX, m_helperArrows, matrix); + + m_helperArrowsTransform = new Qt3DCore::QTransform(); + m_helperArrows->addComponent(m_helperArrowsTransform); + m_helperArrows->setParent(m_rootEntity); + enableHelperArrows(false); +} + void EditorScene::setFrameGraphCamera(Qt3DCore::QEntity *cameraEntity) { if (m_renderer) { @@ -1903,6 +1942,7 @@ void EditorScene::setSelection(Qt3DCore::QEntity *entity) emit selectionChanged(m_selectedEntity); } m_dragHandlesTransform->setEnabled(item->isSelectionBoxShowing()); + enableHelperArrows(item->isSelectionBoxShowing()); if (item->itemType() == EditorSceneItem::Camera) { // Disable scale handles for cameras @@ -1953,6 +1993,7 @@ void EditorScene::setSelection(Qt3DCore::QEntity *entity) handleSelectionTransformChange(); } else { m_dragHandlesTransform->setEnabled(false); + enableHelperArrows(false); if (m_selectedEntity != m_sceneEntity) setSelection(m_sceneEntity); } @@ -2002,6 +2043,7 @@ void EditorScene::addEntityToMultiSelection(const QString &name) if (m_selectedEntity != m_sceneEntity) { m_selectedEntityNameList.append(m_selectedEntity->objectName()); m_dragHandlesTransform->setEnabled(false); + enableHelperArrows(false); handleSelectionTransformChange(); clearSingleSelection(); } else { @@ -2194,8 +2236,6 @@ void EditorScene::handleSelectionTransformChange() QVector3D cornerHandlePositions[dragCornerHandleCount]; bool showCenterHandle = false; - resizeCameraViewCenterEntity(); - if (item) { Qt3DRender::QCamera *camera = frameGraphCamera(); @@ -2297,7 +2337,17 @@ void EditorScene::handleSelectionTransformChange() m_dragHandlesTransform->translation()); m_meshCenterIndicatorLineTransform->setScale(meshCenter.length()); } + + // Move the helper arrows to the center of the entity + if (showCenterHandle) { + m_helperArrowsTransform->setMatrix(m_dragHandlesTransform->matrix() + * m_dragHandleTranslateTransform->matrix()); + } else { + m_helperArrowsTransform->setMatrix(m_dragHandlesTransform->matrix()); + } } + resizeConstantScreenSizeEntities(); + m_meshCenterIndicatorLine->setEnabled(showCenterHandle && m_dragHandlesTransform->isEnabled()); // Signal UI to reposition drag handles @@ -2452,15 +2502,23 @@ QVector3D EditorScene::projectVectorOnCameraPlane(const QVector3D &vector) const return projectionVector; } -void EditorScene::resizeCameraViewCenterEntity() +// Rescales various entities that need to be constant size on the screen +void EditorScene::resizeConstantScreenSizeEntities() { if (frameGraphCamera()) { - // Rescale the camera viewcenter entity according to distance, as it is draggable + // Camera viewcenter const float vcEntityAngle = 0.0045f; QVector3D vcPos = m_activeSceneCameraFrustumData.viewCenterTransform->translation(); float distanceToVc = (vcPos - frameGraphCamera()->position()).length(); float vcScale = vcEntityAngle * distanceToVc; m_activeSceneCameraFrustumData.viewCenterTransform->setScale(vcScale * 2.0f); + + // Helper arrows + const float arrowsEntityAngle = 0.03f; + QVector3D arrowsPos = m_helperArrowsTransform->translation(); + float distanceToArrows = (arrowsPos - frameGraphCamera()->position()).length(); + float arrowsScale = arrowsEntityAngle * distanceToArrows; + m_helperArrowsTransform->setScale(arrowsScale * 2.0f); } } diff --git a/editorlib/src/editorscene.h b/editorlib/src/editorscene.h index 728dbb1..c7c750c 100644 --- a/editorlib/src/editorscene.h +++ b/editorlib/src/editorscene.h @@ -357,6 +357,7 @@ private: void setupDefaultScene(); void createRootEntity(); void createHelperPlane(); + void createHelperArrows(); void setFrameGraphCamera(Qt3DCore::QEntity *cameraEntity); Qt3DRender::QCamera *frameGraphCamera() const; void enableVisibleCameras(bool enable); @@ -379,7 +380,7 @@ private: bool handleMouseMove(QMouseEvent *event); QVector3D helperPlaneNormal() const; QVector3D projectVectorOnCameraPlane(const QVector3D &vector) const; - void resizeCameraViewCenterEntity(); + void resizeConstantScreenSizeEntities(); bool isPropertyLocked(const QString &propertyName, QObject *obj); void cancelDrag(); void setSceneEntity(Qt3DCore::QEntity *newSceneEntity = nullptr); @@ -391,6 +392,7 @@ private: EditorSceneItem *itemByName(const QString &name); void clearSingleSelection(); Q_INVOKABLE void doUpdateGroupSelectionBoxes(); + void enableHelperArrows(bool enable); private: Qt3DCore::QEntity *m_rootEntity; @@ -427,6 +429,8 @@ private: UndoHandler *m_undoHandler; Qt3DCore::QEntity *m_helperPlane; Qt3DCore::QTransform *m_helperPlaneTransform; + Qt3DCore::QEntity *m_helperArrows; + Qt3DCore::QTransform *m_helperArrowsTransform; Qt3DRender::QMaterial *m_selectionBoxMaterial; Qt3DRender::QGeometryRenderer *m_selectionBoxMesh; diff --git a/editorlib/src/editorutils.cpp b/editorlib/src/editorutils.cpp index cd1abe2..482dc55 100644 --- a/editorlib/src/editorutils.cpp +++ b/editorlib/src/editorutils.cpp @@ -28,6 +28,7 @@ #include "editorutils.h" #include "editorsceneitemmodel.h" #include "editorsceneitem.h" +#include "ontopeffect.h" #include "qdummyobjectpicker.h" #include @@ -786,6 +787,34 @@ Qt3DRender::QGeometryRenderer *EditorUtils::createMeshForInsertableType(Insertab return mesh; } +// Creates a single arrow +Qt3DRender::QGeometryRenderer *EditorUtils::createArrowMesh() +{ + Qt3DRender::QMesh *customMesh = new Qt3DRender::QMesh(); + customMesh->setSource(QUrl(QStringLiteral("qrc:/qt3deditorlib/meshes/arrow.obj"))); + return customMesh; +} + +void EditorUtils::createArrowEntity(const QColor &color, + Qt3DCore::QEntity *parent, + const QMatrix4x4 &matrix) +{ + Qt3DCore::QEntity *arrow = new Qt3DCore::QEntity(parent); + + Qt3DRender::QGeometryRenderer *mesh = EditorUtils::createArrowMesh(); + + Qt3DRender::QMaterial *material = new Qt3DRender::QMaterial(); + material->setEffect(new OnTopEffect()); + material->addParameter(new Qt3DRender::QParameter(QStringLiteral("handleColor"), color)); + + Qt3DCore::QTransform *transform = new Qt3DCore::QTransform(); + transform->setMatrix(matrix); + + arrow->addComponent(mesh); + arrow->addComponent(material); + arrow->addComponent(transform); +} + void EditorUtils::addPositionAttributeToGeometry(Qt3DRender::QGeometry *geometry, Qt3DRender::QBuffer *buffer, int count) { diff --git a/editorlib/src/editorutils.h b/editorlib/src/editorutils.h index d0d53f7..03ba56f 100644 --- a/editorlib/src/editorutils.h +++ b/editorlib/src/editorutils.h @@ -120,6 +120,10 @@ public: static Qt3DRender::QGeometryRenderer *createCameraViewCenterMesh(float size); static Qt3DRender::QGeometryRenderer *createLightMesh(ComponentTypes type); static Qt3DRender::QGeometryRenderer *createMeshForInsertableType(InsertableEntities type); + static Qt3DRender::QGeometryRenderer *createArrowMesh(); + static void createArrowEntity(const QColor &color, + Qt3DCore::QEntity *parent, + const QMatrix4x4 &matrix); static void addPositionAttributeToGeometry(Qt3DRender::QGeometry *geometry, Qt3DRender::QBuffer *buffer, int count); -- cgit v1.2.3