QmlDesigner: Center on selection box when fit tool is used in 3D Edit

Instead of centering edit camera on selected object, center it on
the selection box, which includes child objects.

Change-Id: I7315a4bcfffc74e72a2b21d0a04fc99ee9f4f3c3
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Miikka Heikkinen
2019-11-22 16:53:36 +02:00
parent e0af519d1a
commit 6ee83b4c19
5 changed files with 31 additions and 8 deletions

View File

@@ -206,6 +206,7 @@ Window {
}
SelectionBox {
id: selectionBox
view3D: editView
targetNode: viewWindow.selectedNode
}
@@ -378,8 +379,10 @@ Window {
togglable: false
onSelectedChanged: {
if (selected)
cameraControl.fitObject(viewWindow.selectedNode, editView.camera.rotation);
if (selected) {
var targetNode = viewWindow.selectedNode ? selectionBox.model : null;
cameraControl.fitObject(targetNode, editView.camera.rotation);
}
}
}
}
@@ -391,7 +394,7 @@ Window {
width: 100
height: width
editCameraCtrl: cameraControl
selectedNode : viewWindow.selectedNode
selectedNode : viewWindow.selectedNode ? selectionBox.model : null
}
Column {

View File

@@ -32,6 +32,7 @@ Node {
property View3D view3D
property Node targetNode: null
property alias model: selectionBoxModel
SelectionBoxGeometry {
id: selectionBoxGeometry

View File

@@ -26,6 +26,8 @@
#ifdef QUICK3D_MODULE
#include "selectionboxgeometry.h"
#include <QtQuick3D/private/qquick3dorthographiccamera_p.h>
#include <QtQuick3D/private/qquick3dperspectivecamera_p.h>
#include <QtQuick3D/private/qquick3dobject_p_p.h>
@@ -154,8 +156,15 @@ QVector4D GeneralHelper::fitObjectToCamera(QQuick3DCamera *camera, float default
if (window) {
auto context = QSSGRenderContextInterface::getRenderContextInterface(quintptr(window));
if (!context.isNull()) {
auto bufferManager = context->bufferManager();
QSSGBounds3 bounds = renderModel->getModelBounds(bufferManager);
QSSGBounds3 bounds;
auto geometry = qobject_cast<SelectionBoxGeometry *>(modelNode->geometry());
if (geometry) {
bounds = geometry->bounds();
} else {
auto bufferManager = context->bufferManager();
bounds = renderModel->getModelBounds(bufferManager);
}
QVector3D center = bounds.center();
const QVector3D e = bounds.extents();
const QVector3D s = targetObject->sceneScale();
@@ -164,8 +173,8 @@ QVector4D GeneralHelper::fitObjectToCamera(QQuick3DCamera *camera, float default
maxExtent *= maxScale;
// Adjust lookAt to look directly at the center of the object bounds
QMatrix4x4 m = targetObject->sceneTransform();
lookAt = m.map(center);
lookAt = renderModel->globalTransform.map(center);
lookAt.setZ(-lookAt.z()); // Render node transforms have inverted z
}
}
}

View File

@@ -31,7 +31,6 @@
#include <QtQuick3DRuntimeRender/private/qssgrendermodel_p.h>
#include <QtQuick3DRuntimeRender/private/qssgrendercontextcore_p.h>
#include <QtQuick3DRuntimeRender/private/qssgrenderbuffermanager_p.h>
#include <QtQuick3DUtils/private/qssgbounds3_p.h>
#include <QtQuick3D/private/qquick3dmodel_p.h>
#include <QtQuick3D/private/qquick3dobject_p_p.h>
#include <QtQuick/qquickwindow.h>
@@ -74,6 +73,11 @@ bool QmlDesigner::Internal::SelectionBoxGeometry::isEmpty() const
return m_isEmpty;
}
QSSGBounds3 SelectionBoxGeometry::bounds() const
{
return m_bounds;
}
void SelectionBoxGeometry::setTargetNode(QQuick3DNode *targetNode)
{
if (m_targetNode == targetNode)
@@ -166,6 +170,8 @@ QSSGRenderGraphObject *SelectionBoxGeometry::updateSpatialNode(QSSGRenderGraphOb
geometry->setPrimitiveType(QSSGRenderGeometry::Lines);
geometry->setBounds(minBounds, maxBounds);
m_bounds = QSSGBounds3(minBounds, maxBounds);
bool empty = minBounds.isNull() && maxBounds.isNull();
if (m_isEmpty != empty) {
m_isEmpty = empty;

View File

@@ -30,6 +30,7 @@
#include <QtQuick3D/private/qquick3dnode_p.h>
#include <QtQuick3D/private/qquick3dgeometry_p.h>
#include <QtQuick3D/private/qquick3dviewport_p.h>
#include <QtQuick3DUtils/private/qssgbounds3_p.h>
namespace QmlDesigner {
namespace Internal {
@@ -51,6 +52,8 @@ public:
QQuick3DViewport *view3D() const;
bool isEmpty() const;
QSSGBounds3 bounds() const;
public Q_SLOTS:
void setTargetNode(QQuick3DNode *targetNode);
void setRootNode(QQuick3DNode *rootNode);
@@ -76,6 +79,7 @@ private:
QQuick3DNode *m_rootNode = nullptr;
bool m_isEmpty = true;
QVector<QMetaObject::Connection> m_connections;
QSSGBounds3 m_bounds;
};
}