forked from qt-creator/qt-creator
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:
@@ -208,12 +208,12 @@ Window {
|
|||||||
highlightOnHover: true
|
highlightOnHover: true
|
||||||
targetNode: viewWindow.selectedNode
|
targetNode: viewWindow.selectedNode
|
||||||
globalOrientation: btnLocalGlobal.toggled
|
globalOrientation: btnLocalGlobal.toggled
|
||||||
visible: selectedNode && btnMove.selected
|
visible: viewWindow.selectedNode && btnMove.selected
|
||||||
view3D: overlayView
|
view3D: overlayView
|
||||||
dragHelper: gizmoDragHelper
|
dragHelper: gizmoDragHelper
|
||||||
|
|
||||||
onPositionCommit: viewWindow.commitObjectProperty(selectedNode, "position")
|
onPositionCommit: viewWindow.commitObjectProperty(viewWindow.selectedNode, "position")
|
||||||
onPositionMove: viewWindow.changeObjectProperty(selectedNode, "position")
|
onPositionMove: viewWindow.changeObjectProperty(viewWindow.selectedNode, "position")
|
||||||
}
|
}
|
||||||
|
|
||||||
ScaleGizmo {
|
ScaleGizmo {
|
||||||
@@ -222,12 +222,12 @@ Window {
|
|||||||
highlightOnHover: true
|
highlightOnHover: true
|
||||||
targetNode: viewWindow.selectedNode
|
targetNode: viewWindow.selectedNode
|
||||||
globalOrientation: false
|
globalOrientation: false
|
||||||
visible: selectedNode && btnScale.selected
|
visible: viewWindow.selectedNode && btnScale.selected
|
||||||
view3D: overlayView
|
view3D: overlayView
|
||||||
dragHelper: gizmoDragHelper
|
dragHelper: gizmoDragHelper
|
||||||
|
|
||||||
onScaleCommit: viewWindow.commitObjectProperty(selectedNode, "scale")
|
onScaleCommit: viewWindow.commitObjectProperty(viewWindow.selectedNode, "scale")
|
||||||
onScaleChange: viewWindow.changeObjectProperty(selectedNode, "scale")
|
onScaleChange: viewWindow.changeObjectProperty(viewWindow.selectedNode, "scale")
|
||||||
}
|
}
|
||||||
|
|
||||||
RotateGizmo {
|
RotateGizmo {
|
||||||
@@ -236,12 +236,12 @@ Window {
|
|||||||
highlightOnHover: true
|
highlightOnHover: true
|
||||||
targetNode: viewWindow.selectedNode
|
targetNode: viewWindow.selectedNode
|
||||||
globalOrientation: btnLocalGlobal.toggled
|
globalOrientation: btnLocalGlobal.toggled
|
||||||
visible: selectedNode && btnRotate.selected
|
visible: viewWindow.selectedNode && btnRotate.selected
|
||||||
view3D: overlayView
|
view3D: overlayView
|
||||||
dragHelper: gizmoDragHelper
|
dragHelper: gizmoDragHelper
|
||||||
|
|
||||||
onRotateCommit: viewWindow.commitObjectProperty(selectedNode, "rotation")
|
onRotateCommit: viewWindow.commitObjectProperty(viewWindow.selectedNode, "rotation")
|
||||||
onRotateChange: viewWindow.changeObjectProperty(selectedNode, "rotation")
|
onRotateChange: viewWindow.changeObjectProperty(viewWindow.selectedNode, "rotation")
|
||||||
}
|
}
|
||||||
|
|
||||||
AutoScaleHelper {
|
AutoScaleHelper {
|
||||||
@@ -250,6 +250,52 @@ Window {
|
|||||||
position: moveGizmo.scenePosition
|
position: moveGizmo.scenePosition
|
||||||
orientation: moveGizmo.orientation
|
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 {
|
Rectangle {
|
||||||
|
|||||||
50
share/qtcreator/qml/qmlpuppet/mockfiles/Line3D.qml
Normal file
50
share/qtcreator/qml/qmlpuppet/mockfiles/Line3D.qml
Normal 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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,10 +2,12 @@ HEADERS += $$PWD/generalhelper.h \
|
|||||||
$$PWD/mousearea3d.h \
|
$$PWD/mousearea3d.h \
|
||||||
$$PWD/camerageometry.h \
|
$$PWD/camerageometry.h \
|
||||||
$$PWD/gridgeometry.h \
|
$$PWD/gridgeometry.h \
|
||||||
$$PWD/selectionboxgeometry.h
|
$$PWD/selectionboxgeometry.h \
|
||||||
|
$$PWD/linegeometry.h
|
||||||
|
|
||||||
SOURCES += $$PWD/generalhelper.cpp \
|
SOURCES += $$PWD/generalhelper.cpp \
|
||||||
$$PWD/mousearea3d.cpp \
|
$$PWD/mousearea3d.cpp \
|
||||||
$$PWD/camerageometry.cpp \
|
$$PWD/camerageometry.cpp \
|
||||||
$$PWD/gridgeometry.cpp \
|
$$PWD/gridgeometry.cpp \
|
||||||
$$PWD/selectionboxgeometry.cpp
|
$$PWD/selectionboxgeometry.cpp \
|
||||||
|
$$PWD/linegeometry.cpp
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -70,6 +70,7 @@
|
|||||||
#include "../editor3d/camerageometry.h"
|
#include "../editor3d/camerageometry.h"
|
||||||
#include "../editor3d/gridgeometry.h"
|
#include "../editor3d/gridgeometry.h"
|
||||||
#include "../editor3d/selectionboxgeometry.h"
|
#include "../editor3d/selectionboxgeometry.h"
|
||||||
|
#include "../editor3d/linegeometry.h"
|
||||||
|
|
||||||
#include <designersupportdelegate.h>
|
#include <designersupportdelegate.h>
|
||||||
|
|
||||||
@@ -163,6 +164,7 @@ QObject *Qt5InformationNodeInstanceServer::createEditView3D(QQmlEngine *engine)
|
|||||||
qmlRegisterType<QmlDesigner::Internal::CameraGeometry>("CameraGeometry", 1, 0, "CameraGeometry");
|
qmlRegisterType<QmlDesigner::Internal::CameraGeometry>("CameraGeometry", 1, 0, "CameraGeometry");
|
||||||
qmlRegisterType<QmlDesigner::Internal::GridGeometry>("GridGeometry", 1, 0, "GridGeometry");
|
qmlRegisterType<QmlDesigner::Internal::GridGeometry>("GridGeometry", 1, 0, "GridGeometry");
|
||||||
qmlRegisterType<QmlDesigner::Internal::SelectionBoxGeometry>("SelectionBoxGeometry", 1, 0, "SelectionBoxGeometry");
|
qmlRegisterType<QmlDesigner::Internal::SelectionBoxGeometry>("SelectionBoxGeometry", 1, 0, "SelectionBoxGeometry");
|
||||||
|
qmlRegisterType<QmlDesigner::Internal::LineGeometry>("LineGeometry", 1, 0, "LineGeometry");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QQmlComponent component(engine, QUrl("qrc:/qtquickplugin/mockfiles/EditView3D.qml"));
|
QQmlComponent component(engine, QUrl("qrc:/qtquickplugin/mockfiles/EditView3D.qml"));
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
<file>mockfiles/SelectionBox.qml</file>
|
<file>mockfiles/SelectionBox.qml</file>
|
||||||
<file>mockfiles/AxisHelper.qml</file>
|
<file>mockfiles/AxisHelper.qml</file>
|
||||||
<file>mockfiles/AxisHelperArm.qml</file>
|
<file>mockfiles/AxisHelperArm.qml</file>
|
||||||
|
<file>mockfiles/Line3D.qml</file>
|
||||||
<file>mockfiles/meshes/arrow.mesh</file>
|
<file>mockfiles/meshes/arrow.mesh</file>
|
||||||
<file>mockfiles/meshes/scalerod.mesh</file>
|
<file>mockfiles/meshes/scalerod.mesh</file>
|
||||||
<file>mockfiles/meshes/ring.mesh</file>
|
<file>mockfiles/meshes/ring.mesh</file>
|
||||||
|
|||||||
@@ -117,6 +117,7 @@ extend_qtc_executable(qml2puppet
|
|||||||
camerageometry.cpp camerageometry.h
|
camerageometry.cpp camerageometry.h
|
||||||
gridgeometry.cpp gridgeometry.h
|
gridgeometry.cpp gridgeometry.h
|
||||||
selectionboxgeometry.cpp selectionboxgeometry.h
|
selectionboxgeometry.cpp selectionboxgeometry.h
|
||||||
|
linegeometry.cpp linegeometry.h
|
||||||
)
|
)
|
||||||
|
|
||||||
extend_qtc_executable(qml2puppet
|
extend_qtc_executable(qml2puppet
|
||||||
|
|||||||
@@ -215,6 +215,8 @@ QtcTool {
|
|||||||
"editor3d/gridgeometry.h",
|
"editor3d/gridgeometry.h",
|
||||||
"editor3d/selectionboxgeometry.cpp",
|
"editor3d/selectionboxgeometry.cpp",
|
||||||
"editor3d/selectionboxgeometry.h",
|
"editor3d/selectionboxgeometry.h",
|
||||||
|
"editor3d/linegeometry.cpp",
|
||||||
|
"editor3d/linegeometry.h",
|
||||||
"qml2puppetmain.cpp",
|
"qml2puppetmain.cpp",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user