From 5c9d8865103013514a0ace5f7e0fecdf978acfea Mon Sep 17 00:00:00 2001 From: Nicholas Bennett Date: Tue, 11 Feb 2025 15:36:08 +0200 Subject: [PATCH] Add xrapplication project wizard Added a template wizard with the ability to enable hands, passthrough, and spatial anchors. Change-Id: I5f9864f955af3941d283fcfbbbf2949d0385c648 Reviewed-by: Eike Ziller --- .../xrapplication/AndroidManifest.xml.tpl | 34 ++++++ .../projects/xrapplication/CMakeLists.txt | 56 +++++++++ .../xrapplication/MacOSXBundleInfo.plist.in | 57 +++++++++ .../projects/xrapplication/Main.qml.tpl | 100 ++++++++++++++++ .../wizards/projects/xrapplication/icon.png | Bin 0 -> 4596 bytes .../projects/xrapplication/icon@2x.png | Bin 0 -> 5969 bytes .../wizards/projects/xrapplication/main.cpp | 15 +++ .../xrapplication/qtquickcontrols2.conf | 25 ++++ .../projects/xrapplication/wizard.json | 113 ++++++++++++++++++ 9 files changed, 400 insertions(+) create mode 100644 share/qtcreator/templates/wizards/projects/xrapplication/AndroidManifest.xml.tpl create mode 100644 share/qtcreator/templates/wizards/projects/xrapplication/CMakeLists.txt create mode 100644 share/qtcreator/templates/wizards/projects/xrapplication/MacOSXBundleInfo.plist.in create mode 100644 share/qtcreator/templates/wizards/projects/xrapplication/Main.qml.tpl create mode 100644 share/qtcreator/templates/wizards/projects/xrapplication/icon.png create mode 100644 share/qtcreator/templates/wizards/projects/xrapplication/icon@2x.png create mode 100644 share/qtcreator/templates/wizards/projects/xrapplication/main.cpp create mode 100644 share/qtcreator/templates/wizards/projects/xrapplication/qtquickcontrols2.conf create mode 100644 share/qtcreator/templates/wizards/projects/xrapplication/wizard.json diff --git a/share/qtcreator/templates/wizards/projects/xrapplication/AndroidManifest.xml.tpl b/share/qtcreator/templates/wizards/projects/xrapplication/AndroidManifest.xml.tpl new file mode 100644 index 00000000000..1e7a79098ad --- /dev/null +++ b/share/qtcreator/templates/wizards/projects/xrapplication/AndroidManifest.xml.tpl @@ -0,0 +1,34 @@ + + +@if %{Hands} + + +@endif +@if %{Anchors} + + +@endif + +@if %{Passthrough} + +@endif + + + + + + + + + + + + + + + + + + + + diff --git a/share/qtcreator/templates/wizards/projects/xrapplication/CMakeLists.txt b/share/qtcreator/templates/wizards/projects/xrapplication/CMakeLists.txt new file mode 100644 index 00000000000..aa476eb51bb --- /dev/null +++ b/share/qtcreator/templates/wizards/projects/xrapplication/CMakeLists.txt @@ -0,0 +1,56 @@ +cmake_minimum_required(VERSION 3.16) + +project(%{ProjectName} VERSION 0.1 LANGUAGES CXX) + +set(CMAKE_AUTOMOC ON) + +find_package(Qt6 COMPONENTS Core Gui Quick Quick3D Quick3DXr) + +qt_standard_project_setup(REQUIRES 6.8) +qt6_policy(SET QTP0002 NEW) + +qt_add_executable(${CMAKE_PROJECT_NAME} + MANUAL_FINALIZATION + main.cpp + android/AndroidManifest.xml +) + +qt_add_qml_module(${CMAKE_PROJECT_NAME} + URI ${CMAKE_PROJECT_NAME} + VERSION 1.0 + QML_FILES + Main.qml +) + +if (APPLE AND CMAKE_SYSTEM_NAME STREQUAL "visionOS") + set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES + MACOSX_BUNDLE_GUI_IDENTIFIER io.qt.${CMAKE_PROJECT_NAME} + MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/visionos/MacOSXBundleInfo.plist.in + ) +endif() + +target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE + Qt::Core + Qt::Gui + Qt::Quick + Qt::Quick3D + Qt::Quick3DXr +) + +if(ANDROID) + set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES + QT_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android" + QT_ANDROID_PACKAGE_NAME "org.qtproject.example.${CMAKE_PROJECT_NAME}" + QT_ANDROID_APP_NAME "${CMAKE_PROJECT_NAME}" + QT_ANDROID_TARGET_SDK_VERSION 32 + QT_ANDROID_MIN_SDK_VERSION 32 + QT_ANDROID_VERSION_NAME "1.0") +endif() + +qt_finalize_executable(${CMAKE_PROJECT_NAME}) +install(TARGETS ${CMAKE_PROJECT_NAME} + BUNDLE DESTINATION . + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) + diff --git a/share/qtcreator/templates/wizards/projects/xrapplication/MacOSXBundleInfo.plist.in b/share/qtcreator/templates/wizards/projects/xrapplication/MacOSXBundleInfo.plist.in new file mode 100644 index 00000000000..455041fde0c --- /dev/null +++ b/share/qtcreator/templates/wizards/projects/xrapplication/MacOSXBundleInfo.plist.in @@ -0,0 +1,57 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${MACOSX_BUNDLE_EXECUTABLE_NAME} + CFBundleGetInfoString + ${MACOSX_BUNDLE_INFO_STRING} + CFBundleIconFile + ${MACOSX_BUNDLE_ICON_FILE} + CFBundleIdentifier + ${MACOSX_BUNDLE_GUI_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleLongVersionString + ${MACOSX_BUNDLE_LONG_VERSION_STRING} + CFBundleName + ${MACOSX_BUNDLE_BUNDLE_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + ${MACOSX_BUNDLE_SHORT_VERSION_STRING} + CFBundleSignature + ???? + CFBundleVersion + ${MACOSX_BUNDLE_BUNDLE_VERSION} + CSResourcesFileMapped + + NSHumanReadableCopyright + ${MACOSX_BUNDLE_COPYRIGHT} + NSHandsTrackingUsageDescription + Hand tracking needed for user input + NSWorldSensingUsageDescription + World sensing needed for anchoring and scene mapping + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + + UIApplicationPreferredDefaultSceneSessionRole + CPSceneSessionRoleImmersiveSpaceApplication + UISceneConfigurations + + CPSceneSessionRoleImmersiveSpaceApplication + + + UISceneConfigurationName + ImmersiveApp + + + + + + + diff --git a/share/qtcreator/templates/wizards/projects/xrapplication/Main.qml.tpl b/share/qtcreator/templates/wizards/projects/xrapplication/Main.qml.tpl new file mode 100644 index 00000000000..f7d970d9f90 --- /dev/null +++ b/share/qtcreator/templates/wizards/projects/xrapplication/Main.qml.tpl @@ -0,0 +1,100 @@ +import QtQuick +import QtQuick3D.Helpers +import QtQuick3D +import QtQuick3D.Xr + +XrView { + id: xrView + +@if %{Passthrough} + property bool preferPassthrough: true + passthroughEnabled: passthroughSupported && preferPassthrough +@endif + + environment: SceneEnvironment { + clearColor: "skyblue" +@if %{Passthrough} + backgroundMode: xrView.passthroughEnabled ? SceneEnvironment.Transparent : SceneEnvironment.Color +@else + backgroundMode: SceneEnvironment.Color +@endif + } + + xrOrigin: theOrigin + XrOrigin { + id: theOrigin + + XrController { + controller: XrController.ControllerLeft + poseSpace: XrController.AimPose + Model { + source: "#Cube" + scale: Qt.vector3d(0.1, 0.1, 0.1) + materials: PrincipledMaterial { + lighting: DefaultMaterial.NoLighting + baseColor: "red" + } + } + } + + XrController { + controller: XrController.ControllerRight + poseSpace: XrController.AimPose + Model { + source: "#Cube" + scale: Qt.vector3d(0.1, 0.1, 0.1) + materials: PrincipledMaterial { + lighting: DefaultMaterial.NoLighting + baseColor: "green" + } + } + } + } + + DirectionalLight { + eulerRotation.x: -30 + eulerRotation.y: -70 + } + + // The scene: + Model { + y: 100 + z: -50 + source: "#Cube" + scale: Qt.vector3d(0.2, 0.2, 0.2) + materials: PrincipledMaterial { + baseColor: "green" + } + eulerRotation.x: 30 + PropertyAnimation on eulerRotation { + from: "30, 0, 0" + to: "30, 360, 0" + loops: -1 + duration: 20000 + } + } +@if %{Anchors} + // Anchors: + Repeater3D { + id: spatialAnchors + model: XrSpatialAnchorListModel { + } + delegate: Node { + id: anchorNode + required property XrSpatialAnchor anchor + required property int index + position: anchor.position + rotation: anchor.rotation + + Model { + // Visualize anchor orientation + materials: PrincipledMaterial { baseColor: "white" } + source: "#Cone" + scale: Qt.vector3d(0.2, 0.2, 0.2) + eulerRotation.x: 90 + } + visible: anchor.has2DBounds || anchor.has3DBounds + } + } +@endif +} diff --git a/share/qtcreator/templates/wizards/projects/xrapplication/icon.png b/share/qtcreator/templates/wizards/projects/xrapplication/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..edaa2e663ca3db0af0df7206ab1d0636098ce932 GIT binary patch literal 4596 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4i*LmhQHi~JPZsB$ErdiN`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsJTl1o9nL;Q0Go#JY)Tk<9UJW;c1u{w%z-F87$E$j)%-nl>5yzHTgk2PD{qHH`S-=@7d@x zJG5*D_aUSARrff1pMMrT{lfcrh3WafmCqLM;8_|RD)!8k_1e4}GedSJioV`%`#<21 z!nVaG-ADW%z18UDnH_8Id+cHV@}0ic=k(6`#&2ysZMeMR29JcX(!xc`XRlZuN(_G$ zBv9b*so~pkb#}(GM{XgfPCj+GBK*>fw{mvryya6GZQMQ?ah5OnWKucf|KGUZ7OTzI z_GZe7INqHVxV6o>qP}IS-5T4&mr9+lJ$k?0^o+&VGxqm?u>NTb$m3C}=VM^tt;h_C zD2ed(u}aR*)k{ptPfFFR$Sq(10UP^@g2d$P)DnfH)bz|eTc!8A_bVx6rr0WloBA5~ z7C5J7WO`H;r3P2|g(O#HCtIc{+1qj1R9IEy7UZUuBq~(o=HwMyRoE(l&9%xawgL(3 zD=C1Llw{i~Mfe6NIOi9oDwyb*=o#p`R%DhLDcNx;*c7FtSp~VcL5(O%NwZbTC@Cqh z($_C9FV`zK*2^zS*Eh7ZwA42+(l;{FElNq#Ew0QfNvzP#D^>;>0WrfRwK%ybv!En1 zKTiQKUR~ z>F((p0M`Kug7nPX09DSpPZRu1z{$p7$v2cC+ixfS)}Tkm>H+)T38q->lzptrC6k-S{PcS zr63vQnO9trn3tRiGO8lCKrb^h#mX|x)Y!nn(nQxh#W+pZ#LzTFH!023ST`-j$k5Q# z#K^+L(gMi{|Dw$F%)G=LWLJTVO36&IO0i5#G)y!~)lE${GS)RQHBQvEG)+s?HBC!0 zx3I9ZOf|GL1RIr-Y~_|;l$%&$tCX3Wn4YR%ke3dY00p>}V}Pfvl98SPLL?w3u_P_O zDA!iWCo`|K0wEESnVTA1k_ZY-Lvv$86C*QYLvs@&QwvKZ-C?Ok#hLkeATtdO^o-5G z+CkA`rJwKY9$ zl0twa#iOZY=uV~PrPwN!E7{ux)TX{-U|?WM@^*J&_}|`tW=po#oTa=fq{v^)5S3);_%z+z8+T`C60eQe@sd+ z^U6|4pRv{9l9v(`&SW4eaNoa5K zX%W#`)Uo13+&n(rq;0z&Jrg?e@89zDXU9L!{dxY(VIL)@IMZgP2lC95_7rIQpY*=! zu`hI~{(R#f6TI%*yy#pZoF9F_jf1b zHmfD~PDI>UebaR5%8X{cSSg(gc~h-#ayBa-N$|N+AmZ*_)8EnIA1GO!Y;rYNYHRYk z?Hjd^cq|F7?)Y|M2U~ZEEE~`5w`sNPX<#f}UMD;SS%|5pEY~I&6 zUs;0%e#=dh3wwQ|YW^HHzs$KlRv?(QBs;)bPp|A+68`}|?c-mkSm&SEyi$Dk{_847 z*A;x6RWND(^Ot^xY%5OO7uk1g=Y-|!ZGI^Wemq++k1alDpUcD6U_Ga_0>IH{an^LB{Ts5vY)Cb literal 0 HcmV?d00001 diff --git a/share/qtcreator/templates/wizards/projects/xrapplication/icon@2x.png b/share/qtcreator/templates/wizards/projects/xrapplication/icon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a426357411adc62cf0400f1936875d300a527bf0 GIT binary patch literal 5969 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 0 }", + + "options": + [ + { "key": "ProjectFile", "value": "%{ProjectDirectory}/CMakeLists.txt" }, + { "key": "MainCppFileName", "value": "%{JS: 'main.' + Util.preferredSuffix('text/x-c++src') }" }, + { "key": "TargetName", "value": "%{JS: 'app' + value('ProjectName') }" } + ], + + "pages": + [ + { + "trDisplayName": "Project Location", + "trShortTitle": "Location", + "typeId": "Project" + }, + { + "trDisplayName": "XR Features", + "trShortTitle": "Features", + "typeId": "Fields", + "data": + [ + { + "name": "Passthrough", + "trDisplayName": "Request passthrough", + "type": "CheckBox", + "trToolTip": "Request permissions for passthrough mode.", + "data": { + "checked": true + } + }, + { + "name": "Hands", + "trDisplayName": "Request hand tracking", + "type": "CheckBox", + "trToolTip": "Request permissions for hand tracking.", + "data": { + "checked": true + } + }, + { + "name": "Anchors", + "trDisplayName": "Request spatial anchors", + "type": "CheckBox", + "trToolTip": "Request permissions for anchors API.", + "data": { + "checked": true + } + } + ] + }, + { + "trDisplayName": "Kit Selection: For Apple Vision Pro, select any kit.", + "trShortTitle": "Kits", + "typeId": "Kits", + "enabled": "%{JS: !value('IsSubproject')}", + "data": { + "projectFilePath": "%{ProjectFile}" + } + }, + { + "trDisplayName": "Project Management", + "trShortTitle": "Summary", + "typeId": "Summary" + } + ], + "generators": + [ + { + "typeId": "File", + "data": + [ + { + "source": "CMakeLists.txt", + "openAsProject": true + }, + { + "source": "main.cpp", + "target": "%{MainCppFileName}" + }, + { + "source": "Main.qml.tpl", + "target": "Main.qml", + "openInEditor": true + }, + { + "source": "../git.ignore", + "target": ".gitignore", + "condition": "%{JS: !value('IsSubproject') && value('VersionControl') === 'G.Git' }" + }, + { + "source": "AndroidManifest.xml.tpl", + "target": "android/AndroidManifest.xml" + }, + { + "source": "MacOSXBundleInfo.plist.in", + "target": "visionos/MacOSXBundleInfo.plist.in" + } + ] + } + ] +}