QmlDesigner: Add pivot point visualization line to 3D edit view

A line connecting the pivot point and object center is added to
3D edit view.

Change-Id: Ic265e9a3ab2895761cc92b94c778d68509ef36f1
Fixes: QDS-1474
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Miikka Heikkinen
2020-01-13 13:40:04 +02:00
parent fae66e781a
commit 58e2c3271e
9 changed files with 287 additions and 11 deletions

View File

@@ -208,12 +208,12 @@ Window {
highlightOnHover: true
targetNode: viewWindow.selectedNode
globalOrientation: btnLocalGlobal.toggled
visible: selectedNode && btnMove.selected
visible: viewWindow.selectedNode && btnMove.selected
view3D: overlayView
dragHelper: gizmoDragHelper
onPositionCommit: viewWindow.commitObjectProperty(selectedNode, "position")
onPositionMove: viewWindow.changeObjectProperty(selectedNode, "position")
onPositionCommit: viewWindow.commitObjectProperty(viewWindow.selectedNode, "position")
onPositionMove: viewWindow.changeObjectProperty(viewWindow.selectedNode, "position")
}
ScaleGizmo {
@@ -222,12 +222,12 @@ Window {
highlightOnHover: true
targetNode: viewWindow.selectedNode
globalOrientation: false
visible: selectedNode && btnScale.selected
visible: viewWindow.selectedNode && btnScale.selected
view3D: overlayView
dragHelper: gizmoDragHelper
onScaleCommit: viewWindow.commitObjectProperty(selectedNode, "scale")
onScaleChange: viewWindow.changeObjectProperty(selectedNode, "scale")
onScaleCommit: viewWindow.commitObjectProperty(viewWindow.selectedNode, "scale")
onScaleChange: viewWindow.changeObjectProperty(viewWindow.selectedNode, "scale")
}
RotateGizmo {
@@ -236,12 +236,12 @@ Window {
highlightOnHover: true
targetNode: viewWindow.selectedNode
globalOrientation: btnLocalGlobal.toggled
visible: selectedNode && btnRotate.selected
visible: viewWindow.selectedNode && btnRotate.selected
view3D: overlayView
dragHelper: gizmoDragHelper
onRotateCommit: viewWindow.commitObjectProperty(selectedNode, "rotation")
onRotateChange: viewWindow.changeObjectProperty(selectedNode, "rotation")
onRotateCommit: viewWindow.commitObjectProperty(viewWindow.selectedNode, "rotation")
onRotateChange: viewWindow.changeObjectProperty(viewWindow.selectedNode, "rotation")
}
AutoScaleHelper {
@@ -250,6 +250,52 @@ Window {
position: moveGizmo.scenePosition
orientation: moveGizmo.orientation
}
Line3D {
id: pivotLine
visible: viewWindow.selectedNode
name: "3D Edit View Pivot Line"
color: "#ddd600"
function flipIfNeeded(vec) {
if (viewWindow.selectedNode.orientation === Node.LeftHanded)
return vec;
else
return Qt.vector3d(vec.x, vec.y, -vec.z);
}
startPos: viewWindow.selectedNode ? flipIfNeeded(viewWindow.selectedNode.scenePosition)
: Qt.vector3d(0, 0, 0)
Connections {
target: viewWindow
onSelectedNodeChanged: {
pivotLine.endPos = pivotLine.flipIfNeeded(gizmoDragHelper.pivotScenePosition(
viewWindow.selectedNode));
}
}
Connections {
target: viewWindow.selectedNode
onSceneTransformChanged: {
pivotLine.endPos = pivotLine.flipIfNeeded(gizmoDragHelper.pivotScenePosition(
viewWindow.selectedNode));
}
}
Model {
id: pivotCap
source: "#Sphere"
scale: autoScale.getScale(Qt.vector3d(0.03, 0.03, 0.03))
position: pivotLine.startPos
materials: [
DefaultMaterial {
id: lineMat
lighting: DefaultMaterial.NoLighting
cullingMode: Material.DisableCulling
emissiveColor: pivotLine.color
}
]
}
}
}
Rectangle {

View File

@@ -0,0 +1,50 @@
/****************************************************************************
**
** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
import QtQuick 2.0
import QtQuick3D 1.0
import LineGeometry 1.0
Node {
id: pivotLine
property alias startPos: lineGeometry.startPos
property alias endPos: lineGeometry.endPos
property alias name: lineGeometry.name // Name must be unique for each line
property alias color: lineMat.emissiveColor
Model {
geometry: LineGeometry {
id: lineGeometry
}
materials: [
DefaultMaterial {
id: lineMat
lighting: DefaultMaterial.NoLighting
cullingMode: Material.DisableCulling
}
]
}
}

View File

@@ -2,10 +2,12 @@ HEADERS += $$PWD/generalhelper.h \
$$PWD/mousearea3d.h \
$$PWD/camerageometry.h \
$$PWD/gridgeometry.h \
$$PWD/selectionboxgeometry.h
$$PWD/selectionboxgeometry.h \
$$PWD/linegeometry.h
SOURCES += $$PWD/generalhelper.cpp \
$$PWD/mousearea3d.cpp \
$$PWD/camerageometry.cpp \
$$PWD/gridgeometry.cpp \
$$PWD/selectionboxgeometry.cpp
$$PWD/selectionboxgeometry.cpp \
$$PWD/linegeometry.cpp

View File

@@ -0,0 +1,102 @@
/****************************************************************************
**
** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#ifdef QUICK3D_MODULE
#include "linegeometry.h"
#include <QtQuick3DRuntimeRender/private/qssgrendergeometry_p.h>
namespace QmlDesigner {
namespace Internal {
LineGeometry::LineGeometry()
: QQuick3DGeometry()
{
}
LineGeometry::~LineGeometry()
{
}
QVector3D LineGeometry::startPos() const
{
return m_startPos;
}
QVector3D LineGeometry::endPos() const
{
return m_endPos;
}
void LineGeometry::setStartPos(const QVector3D &pos)
{
if (pos != m_startPos) {
m_startPos = pos;
emit startPosChanged();
update();
}
}
void LineGeometry::setEndPos(const QVector3D &pos)
{
if (pos != m_endPos) {
m_endPos = pos;
emit endPosChanged();
update();
}
}
QSSGRenderGraphObject *LineGeometry::updateSpatialNode(QSSGRenderGraphObject *node)
{
node = QQuick3DGeometry::updateSpatialNode(node);
QSSGRenderGeometry *geometry = static_cast<QSSGRenderGeometry *>(node);
geometry->clear();
QByteArray vertexData;
vertexData.resize(2 * 3 * 4); // 2 vertices of 3 floats each 4 bytes
float *dataPtr = reinterpret_cast<float *>(vertexData.data());
dataPtr[0] = m_startPos[0];
dataPtr[1] = m_startPos[1];
dataPtr[2] = -m_startPos[2];
dataPtr[3] = m_endPos[0];
dataPtr[4] = m_endPos[1];
dataPtr[5] = -m_endPos[2];
geometry->addAttribute(QSSGRenderGeometry::Attribute::PositionSemantic, 0,
QSSGRenderGeometry::Attribute::ComponentType::F32Type);
geometry->setStride(12);
geometry->setVertexData(vertexData);
geometry->setPrimitiveType(QSSGRenderGeometry::Lines);
geometry->setBounds(m_startPos, m_endPos);
return node;
}
}
}
#endif // QUICK3D_MODULE

View File

@@ -0,0 +1,70 @@
/****************************************************************************
**
** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#pragma once
#ifdef QUICK3D_MODULE
#include <QtQuick3D/private/qquick3dgeometry_p.h>
#include <QtGui/QVector3D>
namespace QmlDesigner {
namespace Internal {
class LineGeometry : public QQuick3DGeometry
{
Q_OBJECT
Q_PROPERTY(QVector3D startPos READ startPos WRITE setStartPos NOTIFY startPosChanged)
Q_PROPERTY(QVector3D endPos READ endPos WRITE setEndPos NOTIFY endPosChanged)
public:
LineGeometry();
~LineGeometry() override;
QVector3D startPos() const;
QVector3D endPos() const;
public Q_SLOTS:
void setStartPos(const QVector3D &pos);
void setEndPos(const QVector3D &pos);
Q_SIGNALS:
void startPosChanged();
void endPosChanged();
protected:
QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override;
private:
QVector3D m_startPos;
QVector3D m_endPos;
};
}
}
QML_DECLARE_TYPE(QmlDesigner::Internal::LineGeometry)
#endif // QUICK3D_MODULE

View File

@@ -70,6 +70,7 @@
#include "../editor3d/camerageometry.h"
#include "../editor3d/gridgeometry.h"
#include "../editor3d/selectionboxgeometry.h"
#include "../editor3d/linegeometry.h"
#include <designersupportdelegate.h>
@@ -163,6 +164,7 @@ QObject *Qt5InformationNodeInstanceServer::createEditView3D(QQmlEngine *engine)
qmlRegisterType<QmlDesigner::Internal::CameraGeometry>("CameraGeometry", 1, 0, "CameraGeometry");
qmlRegisterType<QmlDesigner::Internal::GridGeometry>("GridGeometry", 1, 0, "GridGeometry");
qmlRegisterType<QmlDesigner::Internal::SelectionBoxGeometry>("SelectionBoxGeometry", 1, 0, "SelectionBoxGeometry");
qmlRegisterType<QmlDesigner::Internal::LineGeometry>("LineGeometry", 1, 0, "LineGeometry");
#endif
QQmlComponent component(engine, QUrl("qrc:/qtquickplugin/mockfiles/EditView3D.qml"));

View File

@@ -30,6 +30,7 @@
<file>mockfiles/SelectionBox.qml</file>
<file>mockfiles/AxisHelper.qml</file>
<file>mockfiles/AxisHelperArm.qml</file>
<file>mockfiles/Line3D.qml</file>
<file>mockfiles/meshes/arrow.mesh</file>
<file>mockfiles/meshes/scalerod.mesh</file>
<file>mockfiles/meshes/ring.mesh</file>