summaryrefslogtreecommitdiffstats
path: root/editorlib
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2016-09-07 13:44:53 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2016-09-07 12:25:33 +0000
commit25acd5501d40bc49618b1443c7951d36946a0d21 (patch)
tree315053ebe0ac70e2e2aff2a996740253cdd8b320 /editorlib
parent43490e8f91d1b7945d5954478a3c912a282cd668 (diff)
Add local axes visualization for currently selected object
Change-Id: Ib6e66c94630e662e5e2affedd17fc929643b72b9 Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Diffstat (limited to 'editorlib')
-rw-r--r--editorlib/meshes/arrow.obj136
-rw-r--r--editorlib/qml.qrc1
-rw-r--r--editorlib/src/editorscene.cpp68
-rw-r--r--editorlib/src/editorscene.h6
-rw-r--r--editorlib/src/editorutils.cpp29
-rw-r--r--editorlib/src/editorutils.h4
6 files changed, 238 insertions, 6 deletions
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 @@
<RCC>
<qresource prefix="/qt3deditorlib">
+ <file>meshes/arrow.obj</file>
<file>meshes/camera.obj</file>
<file>meshes/defaultmesh.obj</file>
<file>meshes/spotlight.obj</file>
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<Qt3DCore::QEntity *>(child);
+ if (childEntity)
+ childEntity->setEnabled(enable);
+ }
+ m_helperArrows->setEnabled(enable);
+}
+
EditorSceneItem *EditorScene::itemByName(const QString &name)
{
const QList<EditorSceneItem *> 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 <Qt3DCore/QEntity>
@@ -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);