From b8b6af0dbb6c077daf2ef4f26f773e2af58846f3 Mon Sep 17 00:00:00 2001 From: Janne Koskinen Date: Thu, 29 Jul 2021 13:11:53 +0300 Subject: [PATCH] Add 3D editor Gizmo for Quick3DParticles Adds an icon for Particle System Component making the component visible in the editor allowing picking. Task-number: QDS-4784 Change-Id: Ie6cffa9cfe3bb6a693372d7a7b4341e17f89911f Reviewed-by: Miikka Heikkinen Reviewed-by: Mahmoud Badri Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- .../qtcreator/qml/qmlpuppet/editor3d_qt6.qrc | 3 + .../images/editor_particlesystem.png | Bin 0 -> 1785 bytes .../images/editor_particlesystem@2x.png | Bin 0 -> 3970 bytes .../qmlpuppet/mockfiles/qt6/EditView3D.qml | 75 ++++++++++++++++++ .../mockfiles/qt6/ParticleSystemGizmo.qml | 32 ++++++++ .../qml2puppet/instances/instances.pri | 4 + .../qt5informationnodeinstanceserver.cpp | 32 ++++++++ src/tools/qml2puppet/CMakeLists.txt | 8 ++ src/tools/qml2puppet/qml2puppet.qbs | 4 + 9 files changed, 158 insertions(+) create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/editor_particlesystem.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/editor_particlesystem@2x.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/qt6/ParticleSystemGizmo.qml diff --git a/share/qtcreator/qml/qmlpuppet/editor3d_qt6.qrc b/share/qtcreator/qml/qmlpuppet/editor3d_qt6.qrc index c89e2806f6c..065f9e32cf3 100644 --- a/share/qtcreator/qml/qmlpuppet/editor3d_qt6.qrc +++ b/share/qtcreator/qml/qmlpuppet/editor3d_qt6.qrc @@ -7,6 +7,8 @@ mockfiles/meshes/axishelper.mesh mockfiles/images/editor_camera.png mockfiles/images/editor_camera@2x.png + mockfiles/images/editor_particlesystem.png + mockfiles/images/editor_particlesystem@2x.png mockfiles/images/area.png mockfiles/images/area@2x.png mockfiles/images/directional.png @@ -33,6 +35,7 @@ mockfiles/qt6/LightGizmo.qml mockfiles/qt6/LightIconGizmo.qml mockfiles/qt6/LightModel.qml + mockfiles/qt6/ParticleSystemGizmo.qml mockfiles/qt6/Line3D.qml mockfiles/qt6/MaterialNodeView.qml mockfiles/qt6/ModelNode2DImageView.qml diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/editor_particlesystem.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/editor_particlesystem.png new file mode 100644 index 0000000000000000000000000000000000000000..55d35bc58421d78b7368ce1c04bd50c16dfc1ad3 GIT binary patch literal 1785 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4rT@hhJ-tuTNxM_R|WWlxH2#>Ffua!`0?ZC z&!4}3{la9RiIc>In}$^vL=YDV*Zbqgk6*ujL6jjg;B1H#8i~w>8-*;0pG}e$tcu}+ z$f1hgQv9+N-7B^-FfjC#1o;IsFtD(&aBy(&@bCx-h=_@C@83?sAy>D=;#<2 z7?_w?SXkKDI5@btczF2u1O$YHghWKd#3ZDoWaJbSl$2Cd)YQ~BG&DE2x3_n9_xDep zJbn7?+4JWwUc7wy^3|)?uiw0R`}W(_7JzJLGm1e~ zFWBqZpu(86<$mtuM7A^LyI5azUD$7)epq?MvIrx;wjF#kYNtAdcjTO$;ri!#=Y~zI zS=6RAH=j1F6UtsRL)*?^>WyReWh*a;ti5|$-FZ^(*2#`b`2#}}o}F9QvFg?D%=s;~ zQ9DoW-)btnv0Fj#{qL2lZdKiSzkRQ%%#0cNE2bTL5L0xnz%AsTb>7OdV>)i%4t2M! z^7#4fWW0%l^}*d)F;~}`Fg$wk&XmEW z=Fj;>tGYVamRc{4yP~y7-*Q9rd0~ZR&DU+O-I=&))rxigDK#}oA`Ty_UUPZQyK^l; zkFDXwj%xv-v9C+bZoInIc<)la2ao>rkgZ#*mbE{)E-HBO*N)FOR0SMlI@a3x=v|Fk zrM2kn^TQS;+f_G7@A0%0daHc)VdjMA^M9Y**d7`=17}^1AslgOD7f-is6PT@o{vO=?PB>A>^GM#7l*PACIbMIo&~a|6!j7kpbI$oF9KOhW z@?P%LXRfQe&-`L>`<9}7`pDzW*8&b7JHTU;xzg+7?i0E)yQFJoyh>PCqwLhla^q%s z<>Hl#R!#l+Z$_wF&zska&o>(PZq-ZfIVw4;a@%#0t?iqBT|cvcz2QT6QmQN@Lj^O>{9>DZH~;I^moJY$UAE%Y!Og3cU(P5MVVDsi6dE{jt>W#o zHG4zXY;&2rqyPOgA+tt?3DxPLYkskK{4aZb_Q8)kr)PQItgQMPq9!+qsbjvYeOE`_ z90rDE+n?-WFXI(=Sz4wk+@9U~`s>Q7&%bH~r`lU_8r)way_u~`$me%QOH`7r^wh=f z^HyY(PEinR-mcl?@Md1la=~B8v-}wDIUP*jrl6#)u>1O#W$D}0zpj)&CdJak^6R+A zv+pk3`X|IslYV~IGrhjnEKTXn`Vxxlz+W$*H3n93I5948%|7is0vn|zT(B}yl}HcM}9Fp3R1{YKfu#ya^A9_B{28$ zqt$|TNk{H*K3+WK4d=->I}Y_te095}c#H0#LjpI&-`~rBD^lKdG-+kX$|>4Uiz;o! zuVyF5p1*K+u1$?asm0`zOU^3KK3!pUB<4SJ$ZWqU$9f+;VPIfj@O1TaS?83{1OV^6 BIZ*%r literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/editor_particlesystem@2x.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/editor_particlesystem@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e66db81479c2de59443eecce9976a89f31b3c347 GIT binary patch literal 3970 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 +#endif + #ifdef IMPORT_QUICK3D_ASSETS #include #endif @@ -618,6 +622,11 @@ void Qt5InformationNodeInstanceServer::handleNode3DDestroyed(QObject *obj) } else if (qobject_cast(obj)) { QMetaObject::invokeMethod(m_editView3DData.rootItem, "releaseLightGizmo", Q_ARG(QVariant, objectToVariant(obj))); +#ifdef QUICK3D_PARTICLES_MODULE + } else if (qobject_cast(obj)) { + QMetaObject::invokeMethod(m_editView3DData.rootItem, "releaseParticleSystemGizmo", + Q_ARG(QVariant, objectToVariant(obj))); +#endif } removeNode3D(obj); #else @@ -720,6 +729,12 @@ void Qt5InformationNodeInstanceServer::resolveSceneRoots() QMetaObject::invokeMethod(m_editView3DData.rootItem, "updateLightGizmoScene", Q_ARG(QVariant, objectToVariant(newRoot)), Q_ARG(QVariant, objectToVariant(node))); +#ifdef QUICK3D_PARTICLES_MODULE + } else if (qobject_cast(node)) { + QMetaObject::invokeMethod(m_editView3DData.rootItem, "updateParticleSystemGizmoScene", + Q_ARG(QVariant, objectToVariant(newRoot)), + Q_ARG(QVariant, objectToVariant(node))); +#endif } } ++it; @@ -1231,12 +1246,16 @@ void Qt5InformationNodeInstanceServer::createCameraAndLightGizmos( { QHash cameras; QHash lights; + QHash particleSystems; for (const ServerNodeInstance &instance : instanceList) { if (instance.isSubclassOf("QQuick3DCamera")) cameras[find3DSceneRoot(instance)] << instance.internalObject(); else if (instance.isSubclassOf("QQuick3DAbstractLight")) lights[find3DSceneRoot(instance)] << instance.internalObject(); + else if (instance.isSubclassOf("QQuick3DParticleSystem")) + particleSystems[find3DSceneRoot(instance)] << instance.internalObject(); + } auto cameraIt = cameras.constBegin(); @@ -1259,6 +1278,16 @@ void Qt5InformationNodeInstanceServer::createCameraAndLightGizmos( } ++lightIt; } + auto particleIt = particleSystems.constBegin(); + while (particleIt != particleSystems.constEnd()) { + const auto particleObjs = particleIt.value(); + for (auto &obj : particleObjs) { + QMetaObject::invokeMethod(m_editView3DData.rootItem, "addParticleSystemGizmo", + Q_ARG(QVariant, objectToVariant(particleIt.key())), + Q_ARG(QVariant, objectToVariant(obj))); + } + ++particleIt; + } } void Qt5InformationNodeInstanceServer::add3DViewPorts(const QList &instanceList) @@ -1740,6 +1769,9 @@ void Qt5InformationNodeInstanceServer::changeSelection(const ChangeSelectionComm #ifdef QUICK3D_MODULE if (qobject_cast(object) || qobject_cast(object) +#ifdef QUICK3D_PARTICLES_MODULE + || qobject_cast(object) +#endif || qobject_cast(object)) { return true; } diff --git a/src/tools/qml2puppet/CMakeLists.txt b/src/tools/qml2puppet/CMakeLists.txt index 3dbb875ce41..924e3a838c1 100644 --- a/src/tools/qml2puppet/CMakeLists.txt +++ b/src/tools/qml2puppet/CMakeLists.txt @@ -160,6 +160,14 @@ extend_qtc_executable(qml2puppet DEFINES IMPORT_QUICK3D_ASSETS ) +find_package(Qt5 5.15.0 COMPONENTS Quick3DParticles QUIET) +extend_qtc_executable(qml2puppet + CONDITION TARGET Qt5::Quick3DParticles + FEATURE_INFO "Qt Quick 3D particles" + DEPENDS Qt5::Quick3DParticles Qt5::Quick3DParticlesPrivate + DEFINES QUICK3D_PARTICLES_MODULE +) + extend_qtc_executable(qml2puppet CONDITION Qt5_VERSION VERSION_GREATER_EQUAL 6.0.0 diff --git a/src/tools/qml2puppet/qml2puppet.qbs b/src/tools/qml2puppet/qml2puppet.qbs index c2b57579563..7eff7ba02b7 100644 --- a/src/tools/qml2puppet/qml2puppet.qbs +++ b/src/tools/qml2puppet/qml2puppet.qbs @@ -18,11 +18,15 @@ QtcTool { Depends { name: "Qt.quick3d-private"; required: false } property bool useQuick3d: Utilities.versionCompare(Qt.core.version, "5.15") >= 0 && Qt["quick3d-private"].present + property bool useParticle3d: Utilities.versionCompare(Qt.core.version, "6.2") >= 0 + && Qt["quick3dparticles-private"].present cpp.defines: { var defines = base.filter(function(d) { return d != "QT_CREATOR"; }); if (useQuick3d) defines.push("QUICK3D_MODULE"); + if (useParticle3d) + defines.push("QUICK3D_PARTICLES_MODULE"); return defines; } Properties {