forked from qt-creator/qt-creator
QmlDesigner: Properly update 3D edit view cameras and lights
Now edit view will create and remove cameras and light gizmos properly when cameras and lights are added or deleted. Change-Id: I858752c1410f3a40ea2adaf538c281aaee94ec58 Fixes: QDS-1267 Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io> Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
@@ -127,6 +127,15 @@ Window {
|
|||||||
|
|
||||||
function addLightGizmo(obj)
|
function addLightGizmo(obj)
|
||||||
{
|
{
|
||||||
|
// Insert into first available gizmo
|
||||||
|
for (var i = 0; i < lightGizmos.length; ++i) {
|
||||||
|
if (!lightGizmos[i].targetNode) {
|
||||||
|
lightGizmos[i].targetNode = obj;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// No free gizmos available, create a new one
|
||||||
var component = Qt.createComponent("LightGizmo.qml");
|
var component = Qt.createComponent("LightGizmo.qml");
|
||||||
if (component.status === Component.Ready) {
|
if (component.status === Component.Ready) {
|
||||||
var gizmo = component.createObject(overlayScene,
|
var gizmo = component.createObject(overlayScene,
|
||||||
@@ -140,6 +149,14 @@ Window {
|
|||||||
|
|
||||||
function addCameraGizmo(obj)
|
function addCameraGizmo(obj)
|
||||||
{
|
{
|
||||||
|
// Insert into first available gizmo
|
||||||
|
for (var i = 0; i < cameraGizmos.length; ++i) {
|
||||||
|
if (!cameraGizmos[i].targetNode) {
|
||||||
|
cameraGizmos[i].targetNode = obj;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// No free gizmos available, create a new one
|
||||||
var component = Qt.createComponent("CameraGizmo.qml");
|
var component = Qt.createComponent("CameraGizmo.qml");
|
||||||
if (component.status === Component.Ready) {
|
if (component.status === Component.Ready) {
|
||||||
var geometryName = _generalHelper.generateUniqueName("CameraGeometry");
|
var geometryName = _generalHelper.generateUniqueName("CameraGeometry");
|
||||||
|
@@ -148,7 +148,9 @@ void CameraGeometry::fillVertexData(QByteArray &vertexData, QByteArray &indexDat
|
|||||||
auto dataPtr = reinterpret_cast<float *>(vertexData.data());
|
auto dataPtr = reinterpret_cast<float *>(vertexData.data());
|
||||||
auto indexPtr = reinterpret_cast<quint16 *>(indexData.data());
|
auto indexPtr = reinterpret_cast<quint16 *>(indexData.data());
|
||||||
|
|
||||||
|
QMatrix4x4 m;
|
||||||
QSSGRenderCamera *camera = m_camera->cameraNode();
|
QSSGRenderCamera *camera = m_camera->cameraNode();
|
||||||
|
if (camera) {
|
||||||
if (qobject_cast<QQuick3DOrthographicCamera *>(m_camera)) {
|
if (qobject_cast<QQuick3DOrthographicCamera *>(m_camera)) {
|
||||||
// For some reason ortho cameras show double what projection suggests,
|
// For some reason ortho cameras show double what projection suggests,
|
||||||
// so give them doubled viewport to match visualization to actual camera view
|
// so give them doubled viewport to match visualization to actual camera view
|
||||||
@@ -157,7 +159,8 @@ void CameraGeometry::fillVertexData(QByteArray &vertexData, QByteArray &indexDat
|
|||||||
} else {
|
} else {
|
||||||
camera->calculateProjection(m_viewPortRect);
|
camera->calculateProjection(m_viewPortRect);
|
||||||
}
|
}
|
||||||
const QMatrix4x4 m = camera->projection.inverted();
|
m = camera->projection.inverted();
|
||||||
|
}
|
||||||
|
|
||||||
const QVector3D farTopLeft = m * QVector3D(1.f, -1.f, 1.f);
|
const QVector3D farTopLeft = m * QVector3D(1.f, -1.f, 1.f);
|
||||||
const QVector3D farBottomRight = m * QVector3D(-1.f, 1.f, 1.f);
|
const QVector3D farBottomRight = m * QVector3D(-1.f, 1.f, 1.f);
|
||||||
|
@@ -155,7 +155,7 @@ public slots:
|
|||||||
void emitParentChanged(QObject *child);
|
void emitParentChanged(QObject *child);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QList<ServerNodeInstance> createInstances(const QVector<InstanceContainer> &container);
|
virtual QList<ServerNodeInstance> createInstances(const QVector<InstanceContainer> &container);
|
||||||
void reparentInstances(const QVector<ReparentContainer> &containerVector);
|
void reparentInstances(const QVector<ReparentContainer> &containerVector);
|
||||||
|
|
||||||
Internal::ChildrenChangeEventFilter *childrenChangeEventFilter();
|
Internal::ChildrenChangeEventFilter *childrenChangeEventFilter();
|
||||||
|
@@ -409,6 +409,17 @@ void Qt5InformationNodeInstanceServer::modifyProperties(
|
|||||||
nodeInstanceClient()->valuesModified(createValuesModifiedCommand(properties));
|
nodeInstanceClient()->valuesModified(createValuesModifiedCommand(properties));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<ServerNodeInstance> Qt5InformationNodeInstanceServer::createInstances(
|
||||||
|
const QVector<InstanceContainer> &container)
|
||||||
|
{
|
||||||
|
const auto createdInstances = NodeInstanceServer::createInstances(container);
|
||||||
|
|
||||||
|
if (m_editView3D)
|
||||||
|
createCameraAndLightGizmos(createdInstances);
|
||||||
|
|
||||||
|
return createdInstances;
|
||||||
|
}
|
||||||
|
|
||||||
void Qt5InformationNodeInstanceServer::handleObjectPropertyChangeTimeout()
|
void Qt5InformationNodeInstanceServer::handleObjectPropertyChangeTimeout()
|
||||||
{
|
{
|
||||||
modifyVariantValue(m_changedNode, m_changedProperty,
|
modifyVariantValue(m_changedNode, m_changedProperty,
|
||||||
@@ -448,16 +459,27 @@ QObject *Qt5InformationNodeInstanceServer::findRootNodeOf3DViewport(
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Qt5InformationNodeInstanceServer::findCamerasAndLights(
|
void Qt5InformationNodeInstanceServer::createCameraAndLightGizmos(
|
||||||
const QList<ServerNodeInstance> &instanceList,
|
const QList<ServerNodeInstance> &instanceList) const
|
||||||
QObjectList &cameras, QObjectList &lights) const
|
|
||||||
{
|
{
|
||||||
|
QObjectList cameras;
|
||||||
|
QObjectList lights;
|
||||||
|
|
||||||
for (const ServerNodeInstance &instance : instanceList) {
|
for (const ServerNodeInstance &instance : instanceList) {
|
||||||
if (instance.isSubclassOf("QQuick3DCamera"))
|
if (instance.isSubclassOf("QQuick3DCamera"))
|
||||||
cameras << instance.internalObject();
|
cameras << instance.internalObject();
|
||||||
else if (instance.isSubclassOf("QQuick3DAbstractLight"))
|
else if (instance.isSubclassOf("QQuick3DAbstractLight"))
|
||||||
lights << instance.internalObject();
|
lights << instance.internalObject();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (auto &obj : qAsConst(cameras)) {
|
||||||
|
QMetaObject::invokeMethod(m_editView3D, "addCameraGizmo",
|
||||||
|
Q_ARG(QVariant, objectToVariant(obj)));
|
||||||
|
}
|
||||||
|
for (auto &obj : qAsConst(lights)) {
|
||||||
|
QMetaObject::invokeMethod(m_editView3D, "addLightGizmo",
|
||||||
|
Q_ARG(QVariant, objectToVariant(obj)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ServerNodeInstance Qt5InformationNodeInstanceServer::findViewPort(
|
ServerNodeInstance Qt5InformationNodeInstanceServer::findViewPort(
|
||||||
@@ -506,18 +528,7 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(const QList<ServerNodeIns
|
|||||||
updateViewPortRect();
|
updateViewPortRect();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create camera and light gizmos
|
createCameraAndLightGizmos(instanceList);
|
||||||
QObjectList cameras;
|
|
||||||
QObjectList lights;
|
|
||||||
findCamerasAndLights(instanceList, cameras, lights);
|
|
||||||
for (auto &obj : qAsConst(cameras)) {
|
|
||||||
QMetaObject::invokeMethod(m_editView3D, "addCameraGizmo",
|
|
||||||
Q_ARG(QVariant, objectToVariant(obj)));
|
|
||||||
}
|
|
||||||
for (auto &obj : qAsConst(lights)) {
|
|
||||||
QMetaObject::invokeMethod(m_editView3D, "addLightGizmo",
|
|
||||||
Q_ARG(QVariant, objectToVariant(obj)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -67,6 +67,7 @@ protected:
|
|||||||
bool isDirtyRecursiveForParentInstances(QQuickItem *item) const;
|
bool isDirtyRecursiveForParentInstances(QQuickItem *item) const;
|
||||||
void selectInstances(const QList<ServerNodeInstance> &instanceList);
|
void selectInstances(const QList<ServerNodeInstance> &instanceList);
|
||||||
void modifyProperties(const QVector<InstancePropertyValueTriple> &properties);
|
void modifyProperties(const QVector<InstancePropertyValueTriple> &properties);
|
||||||
|
QList<ServerNodeInstance> createInstances(const QVector<InstanceContainer> &container) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void handleObjectPropertyChangeTimeout();
|
void handleObjectPropertyChangeTimeout();
|
||||||
@@ -74,8 +75,7 @@ private:
|
|||||||
QObject *createEditView3D(QQmlEngine *engine);
|
QObject *createEditView3D(QQmlEngine *engine);
|
||||||
void setup3DEditView(const QList<ServerNodeInstance> &instanceList);
|
void setup3DEditView(const QList<ServerNodeInstance> &instanceList);
|
||||||
QObject *findRootNodeOf3DViewport(const QList<ServerNodeInstance> &instanceList) const;
|
QObject *findRootNodeOf3DViewport(const QList<ServerNodeInstance> &instanceList) const;
|
||||||
void findCamerasAndLights( const QList<ServerNodeInstance> &instanceList,
|
void createCameraAndLightGizmos(const QList<ServerNodeInstance> &instanceList) const;
|
||||||
QObjectList &cameras, QObjectList &lights) const;
|
|
||||||
ServerNodeInstance findViewPort(const QList<ServerNodeInstance> &instanceList);
|
ServerNodeInstance findViewPort(const QList<ServerNodeInstance> &instanceList);
|
||||||
QVector<InstancePropertyValueTriple> vectorToPropertyValue(const ServerNodeInstance &instance,
|
QVector<InstancePropertyValueTriple> vectorToPropertyValue(const ServerNodeInstance &instance,
|
||||||
const PropertyName &propertyName,
|
const PropertyName &propertyName,
|
||||||
|
Reference in New Issue
Block a user