{"id":1153,"date":"2026-04-09T15:47:41","date_gmt":"2026-04-09T13:47:41","guid":{"rendered":"https:\/\/www.youbiquo.eu\/geckode\/?page_id=1153"},"modified":"2026-04-09T15:49:54","modified_gmt":"2026-04-09T13:49:54","slug":"leonardoxr-sdk-documentation","status":"publish","type":"page","link":"https:\/\/www.youbiquo.eu\/geckode\/en\/leonardoxr-sdk-documentation\/","title":{"rendered":"LeonardoXR SDK Documentation"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1153\" class=\"elementor elementor-1153\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-59a1b7c e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"59a1b7c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4552b6e elementor-widget elementor-widget-heading\" data-id=\"4552b6e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">LeonardoXR SDK Documentation<\/h2>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-af25e4d e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"af25e4d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-03d1ffe e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-child\" data-id=\"03d1ffe\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2d8b463 elementor-widget__width-initial elementor-toc--minimized-on-tablet elementor-widget elementor-widget-table-of-contents\" data-id=\"2d8b463\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;headings_by_tags&quot;:[&quot;h3&quot;,&quot;h4&quot;,&quot;h5&quot;,&quot;h6&quot;],&quot;exclude_headings_by_selector&quot;:&quot;footer&quot;,&quot;marker_view&quot;:&quot;bullets&quot;,&quot;icon&quot;:{&quot;value&quot;:&quot;far fa-dot-circle&quot;,&quot;library&quot;:&quot;fa-regular&quot;,&quot;rendered_tag&quot;:&quot;&lt;svg class=\\&quot;e-font-icon-svg e-far-dot-circle\\&quot; viewBox=\\&quot;0 0 512 512\\&quot; xmlns=\\&quot;http:\\\/\\\/www.w3.org\\\/2000\\\/svg\\&quot;&gt;&lt;path d=\\&quot;M256 56c110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200-110.532 0-200-89.451-200-200 0-110.532 89.451-200 200-200m0-48C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 168c-44.183 0-80 35.817-80 80s35.817 80 80 80 80-35.817 80-80-35.817-80-80-80z\\&quot;&gt;&lt;\\\/path&gt;&lt;\\\/svg&gt;&quot;},&quot;no_headings_message&quot;:&quot;Non sono state trovate intestazioni in questa pagina.&quot;,&quot;minimize_box&quot;:&quot;yes&quot;,&quot;minimized_on&quot;:&quot;tablet&quot;,&quot;hierarchical_view&quot;:&quot;yes&quot;,&quot;min_height&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;min_height_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;min_height_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"table-of-contents.default\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-toc__header\">\n\t\t\t\t\t\t<h2 class=\"elementor-toc__header-title\">\n\t\t\t\tLeonardoXR SDK Documentation \u2014 LeonardoXR SDK\t\t\t<\/h2>\n\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-toc__toggle-button elementor-toc__toggle-button--expand\" role=\"button\" tabindex=\"0\" aria-controls=\"elementor-toc__2d8b463\" aria-expanded=\"true\" aria-label=\"Open table of contents\"><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-chevron-down\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z\"><\/path><\/svg><\/div>\n\t\t\t\t<div class=\"elementor-toc__toggle-button elementor-toc__toggle-button--collapse\" role=\"button\" tabindex=\"0\" aria-controls=\"elementor-toc__2d8b463\" aria-expanded=\"true\" aria-label=\"Close table of contents\"><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-chevron-up\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M240.971 130.524l194.343 194.343c9.373 9.373 9.373 24.569 0 33.941l-22.667 22.667c-9.357 9.357-24.522 9.375-33.901.04L224 227.495 69.255 381.516c-9.379 9.335-24.544 9.317-33.901-.04l-22.667-22.667c-9.373-9.373-9.373-24.569 0-33.941L207.03 130.525c9.372-9.373 24.568-9.373 33.941-.001z\"><\/path><\/svg><\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<div id=\"elementor-toc__2d8b463\" class=\"elementor-toc__body\">\n\t\t\t<div class=\"elementor-toc__spinner-container\">\n\t\t\t\t<svg class=\"elementor-toc__spinner eicon-animation-spin e-font-icon-svg e-eicon-loading\" aria-hidden=\"true\" viewBox=\"0 0 1000 1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M500 975V858C696 858 858 696 858 500S696 142 500 142 142 304 142 500H25C25 237 238 25 500 25S975 237 975 500 763 975 500 975Z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-110d8e7 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-child\" data-id=\"110d8e7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5538572 elementor-widget elementor-widget-text-editor\" data-id=\"5538572\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h1 id=\"youbiquo--leonardoxr-sdk--developer-documentation\" class=\"code-line code-active-line\" dir=\"auto\" data-line=\"0\">Youbiquo \u2014 LeonardoXR SDK \u2014 Developer Documentation<\/h1><table class=\"code-line\" dir=\"auto\" data-line=\"2\"><thead class=\"code-line\" dir=\"auto\" data-line=\"2\"><tr class=\"code-line\" dir=\"auto\" data-line=\"2\"><th>\u00a0<\/th><th>\u00a0<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"4\"><tr class=\"code-line\" dir=\"auto\" data-line=\"4\"><td><strong>SDK Version<\/strong><\/td><td>1.0.2<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"5\"><td><strong>Target Device<\/strong><\/td><td>Youbiquo Leonardo XR<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"6\"><td><strong>Spaces SDK<\/strong><\/td><td>Snapdragon Spaces 1.0.4<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"7\"><td><strong>Unity Version<\/strong><\/td><td>6000.0.58f2<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"8\"><td><strong>Language<\/strong><\/td><td>English<\/td><\/tr><\/tbody><\/table><hr class=\"code-line\" dir=\"auto\" data-line=\"10\" \/><h2 id=\"document-index\" class=\"code-line\" dir=\"auto\" data-line=\"12\">Document Index<\/h2><table class=\"code-line\" dir=\"auto\" data-line=\"14\"><thead class=\"code-line\" dir=\"auto\" data-line=\"14\"><tr class=\"code-line\" dir=\"auto\" data-line=\"14\"><th>#<\/th><th>Title<\/th><th>Description<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"16\"><tr class=\"code-line\" dir=\"auto\" data-line=\"16\"><td>01<\/td><td><a href=\"https:\/\/file+.vscode-resource.vscode-cdn.net\/c%3A\/Users\/Aida%20Garfami\/Downloads\/Documentation\/Documentation\/Documentation\/Documentation~\/LeonardoXR%20SDK%20Documentation_EN.md#01-getting-started\" data-href=\"#01-getting-started\">Getting Started<\/a><\/td><td>Project setup, SDK installation, URP and Play-in-Editor configuration<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"17\"><td>02<\/td><td><a href=\"https:\/\/file+.vscode-resource.vscode-cdn.net\/c%3A\/Users\/Aida%20Garfami\/Downloads\/Documentation\/Documentation\/Documentation\/Documentation~\/LeonardoXR%20SDK%20Documentation_EN.md#02-vr--mr\" data-href=\"#02-vr--mr\">VR \/ MR<\/a><\/td><td>Manual project config, Passthrough, scene setup, lifecycle compatibility<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"18\"><td>03<\/td><td><a href=\"https:\/\/file+.vscode-resource.vscode-cdn.net\/c%3A\/Users\/Aida%20Garfami\/Downloads\/Documentation\/Documentation\/Documentation\/Documentation~\/LeonardoXR%20SDK%20Documentation_EN.md#03-features\" data-href=\"#03-features\">Features<\/a><\/td><td>Snapdragon Spaces features + LeonardoXR proprietary features<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"19\"><td>04<\/td><td><a href=\"https:\/\/file+.vscode-resource.vscode-cdn.net\/c%3A\/Users\/Aida%20Garfami\/Downloads\/Documentation\/Documentation\/Documentation\/Documentation~\/LeonardoXR%20SDK%20Documentation_EN.md#04-samples-guide\" data-href=\"#04-samples-guide\">Samples Guide<\/a><\/td><td>Overview of all available samples and how to run them<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"20\"><td>05<\/td><td><a href=\"https:\/\/file+.vscode-resource.vscode-cdn.net\/c%3A\/Users\/Aida%20Garfami\/Downloads\/Documentation\/Documentation\/Documentation\/Documentation~\/LeonardoXR%20SDK%20Documentation_EN.md#05-interaction-package-guides\" data-href=\"#05-interaction-package-guides\">Interaction Package Guides<\/a><\/td><td>XRIT 3.x, XR Hands, controllers and hand tracking<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"21\"><td>06<\/td><td><a href=\"https:\/\/file+.vscode-resource.vscode-cdn.net\/c%3A\/Users\/Aida%20Garfami\/Downloads\/Documentation\/Documentation\/Documentation\/Documentation~\/LeonardoXR%20SDK%20Documentation_EN.md#06-advanced\" data-href=\"#06-advanced\">Advanced<\/a><\/td><td>Display refresh rate, performance settings, custom controllers, QNN<\/td><\/tr><\/tbody><\/table><hr class=\"code-line\" dir=\"auto\" data-line=\"23\" \/><h2 id=\"01-getting-started\" class=\"code-line\" dir=\"auto\" data-line=\"25\">01 Getting Started<\/h2><p class=\"code-line\" dir=\"auto\" data-line=\"27\"><em>Version 1.0.2 | Device: Youbiquo Leonardo XR | Base SDK: Snapdragon Spaces 1.0.4<\/em><\/p><h3 id=\"introduction\" class=\"code-line\" dir=\"auto\" data-line=\"29\">Introduction<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"31\">This guide explains how to configure a Unity project for development on Leonardo XR, the Youbiquo AR headset based on Snapdragon Spaces. The goal is to familiarise developers with the SDK configuration for building applications on Leonardo. The next guide covers how to interact with controllers and hands.<\/p><p class=\"code-line\" dir=\"auto\" data-line=\"33\">Leonardo XR runs Android 12 and follows a development workflow familiar to anyone who has previously built Android applications.<\/p><h3 id=\"required-software\" class=\"code-line\" dir=\"auto\" data-line=\"35\">Required Software<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"37\">Before starting, make sure the following software and packages are installed at the specified versions:<\/p><table class=\"code-line\" dir=\"auto\" data-line=\"39\"><thead class=\"code-line\" dir=\"auto\" data-line=\"39\"><tr class=\"code-line\" dir=\"auto\" data-line=\"39\"><th>Software \/ Package<\/th><th>Version<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"41\"><tr class=\"code-line\" dir=\"auto\" data-line=\"41\"><td>Unity Hub<\/td><td>Latest available<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"42\"><td>Unity Editor<\/td><td>6000.0.58f2<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"43\"><td>LeonardoXR SDK<\/td><td>1.0.2<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"44\"><td>Snapdragon Spaces SDK<\/td><td>1.0.4<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"45\"><td>OpenXR Plugin<\/td><td>1.15.1<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"46\"><td>AR Foundation<\/td><td>6.2.1<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"47\"><td>XR Interaction Toolkit<\/td><td>3.3.0<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"48\"><td>XR Hands<\/td><td>1.7.2<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"49\"><td>UniTask<\/td><td>2.5.10<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"50\"><td>VS Code, Visual Studio or similar IDE<\/td><td>\u2014<\/td><\/tr><\/tbody><\/table><blockquote class=\"code-line\" dir=\"auto\" data-line=\"52\"><p class=\"code-line\" dir=\"auto\" data-line=\"52\"><strong>NOTE<\/strong>\u00a0Unlike the base Snapdragon Spaces guide (which recommends v1.10.0 for Unity 2022), Unity 6 with LeonardoXR uses OpenXR 1.15.1. Do not modify this version manually \u2014 the Package Manager handles it through the SDK dependencies.<\/p><\/blockquote><h3 id=\"create-a-new-project\" class=\"code-line\" dir=\"auto\" data-line=\"54\">Create a New Project<\/h3><ol class=\"code-line\" dir=\"auto\" data-line=\"56\"><li class=\"code-line\" dir=\"auto\" data-line=\"56\">Open Unity Hub and click\u00a0<strong>New Project<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"57\">Select the\u00a0<strong>Universal 3D<\/strong>\u00a0template.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"58\">Name the project (e.g.\u00a0<code>LeonardoXR_Test<\/code>) and choose a destination folder.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"59\">Click\u00a0<strong>Create Project<\/strong>.<\/li><\/ol><p class=\"code-line\" dir=\"auto\" data-line=\"61\">After creation, Unity opens the project with a sample scene in the Hierarchy panel.<\/p><h3 id=\"switch-platform-to-android\" class=\"code-line\" dir=\"auto\" data-line=\"63\">Switch Platform to Android<\/h3><ol class=\"code-line\" dir=\"auto\" data-line=\"65\"><li class=\"code-line\" dir=\"auto\" data-line=\"65\">From the main menu select\u00a0<strong>File &gt; Build Profiles<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"66\">In the Build Profiles window select\u00a0<strong>Android<\/strong>\u00a0from the Platform list.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"67\">Click\u00a0<strong>Switch Platform<\/strong>\u00a0and wait for the process to complete.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"68\">Close the Build Profiles window.<\/li><\/ol><h3 id=\"install-snapdragon-spaces-sdk\" class=\"code-line\" dir=\"auto\" data-line=\"70\">Install Snapdragon Spaces SDK<\/h3><blockquote class=\"code-line\" dir=\"auto\" data-line=\"72\"><p class=\"code-line\" dir=\"auto\" data-line=\"72\"><strong>IMPORTANT<\/strong>\u00a0Snapdragon Spaces SDK\u00a0<strong>must be installed before<\/strong>\u00a0the LeonardoXR SDK. The LeonardoXR runtime depends on it and will not compile without it.<\/p><\/blockquote><ol class=\"code-line\" dir=\"auto\" data-line=\"74\"><li class=\"code-line\" dir=\"auto\" data-line=\"74\">Download Snapdragon Spaces SDK v1.0.4 from the Qualcomm developer portal (a developer account is required):\u00a0<a href=\"https:\/\/spaces.qualcomm.com\/developer\/vr-mr-sdk\/#downloads\" data-href=\"https:\/\/spaces.qualcomm.com\/developer\/vr-mr-sdk\/#downloads\">https:\/\/spaces.qualcomm.com\/developer\/vr-mr-sdk\/#downloads<\/a><\/li><li class=\"code-line\" dir=\"auto\" data-line=\"75\">Open the Package Manager (<strong>Window &gt; Package Manager<\/strong>).<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"76\">Click\u00a0<strong>+<\/strong>\u00a0and select\u00a0<strong>Add package from tarball\u2026<\/strong><\/li><li class=\"code-line\" dir=\"auto\" data-line=\"77\">Browse to the downloaded\u00a0<code>.tgz<\/code>\u00a0file and click\u00a0<strong>Open<\/strong>. Installation will start automatically.<\/li><\/ol><p class=\"code-line\" dir=\"auto\" data-line=\"79\">During installation, two prompts may appear:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"80\"><li class=\"code-line\" dir=\"auto\" data-line=\"80\">&#8220;Enable the new input system?&#8221; \u2192 click\u00a0<strong>Yes<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"81\">&#8220;XR Interaction Layer Mask Update Required&#8221; \u2192 for a new project, click\u00a0<strong>I Made a Backup, Go Ahead!<\/strong><\/li><\/ul><blockquote class=\"code-line\" dir=\"auto\" data-line=\"83\"><p class=\"code-line\" dir=\"auto\" data-line=\"83\"><strong>NOTE<\/strong>\u00a0The editor will restart after installation \u2014 this is expected behaviour, not a crash. For version control, copy the\u00a0<code>.tgz<\/code>\u00a0into the project&#8217;s\u00a0<code>Packages\/<\/code>\u00a0folder before adding it; the manifest will then use a relative path, which is better for source control.<\/p><\/blockquote><blockquote class=\"code-line\" dir=\"auto\" data-line=\"85\"><p class=\"code-line\" dir=\"auto\" data-line=\"85\"><strong>Unity 6.3+ \u2014 Known Spaces SDK issue:<\/strong>\u00a0After installation you may see the following compile error:<\/p><pre><code class=\"code-line\" dir=\"auto\" data-line=\"86\">BaseRuntimeFeature.InterceptEnvironmentBlendMode.cs(15,10): error CS0592:\nAttribute 'SerializeField' is not valid on this declaration type.\n<\/code><\/pre><p class=\"code-line\" dir=\"auto\" data-line=\"90\">To fix it, double-click the error in the Console to open the file, then remove the\u00a0<code>[SerializeField]<\/code>\u00a0attribute on line 15. This is a bug in Snapdragon Spaces 1.0.4 that only surfaces on Unity 6.3 and above.<\/p><\/blockquote><h3 id=\"install-leonardoxr-sdk\" class=\"code-line\" dir=\"auto\" data-line=\"92\">Install LeonardoXR SDK<\/h3><ol class=\"code-line\" dir=\"auto\" data-line=\"94\"><li class=\"code-line\" dir=\"auto\" data-line=\"94\">Download LeonardoXR SDK v1.0.2 from the Youbiquo Developer area.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"95\">Open the Package Manager (<strong>Window &gt; Package Manager<\/strong>).<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"96\">Click\u00a0<strong>+<\/strong>\u00a0and select\u00a0<strong>Add package from tarball\u2026<\/strong><\/li><li class=\"code-line\" dir=\"auto\" data-line=\"97\">Browse to the LeonardoXR SDK\u00a0<code>.tgz<\/code>\u00a0file and click\u00a0<strong>Open<\/strong>.<\/li><\/ol><p class=\"code-line\" dir=\"auto\" data-line=\"99\">The SDK will be installed together with its dependencies:\u00a0<strong>OpenXR Plugin 1.15.1<\/strong>,\u00a0<strong>AR Foundation 6.2.1<\/strong>,\u00a0<strong>XR Interaction Toolkit 3.3.0<\/strong>, and\u00a0<strong>XR Hands 1.7.2<\/strong>\u00a0\u2014 no manual installation of these packages is required.<\/p><h3 id=\"leonardoxr-sdk-manager\" class=\"code-line\" dir=\"auto\" data-line=\"101\">LeonardoXR SDK Manager<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"103\">After the LeonardoXR SDK is installed, a\u00a0<strong>LeonardoXR SDK Manager<\/strong>\u00a0window opens automatically. If it does not appear, open it from\u00a0<strong>LeonardoXR &gt; SDK Manager<\/strong>\u00a0in the menu bar.<\/p><p class=\"code-line\" dir=\"auto\" data-line=\"105\">The window has two tabs:<\/p><p class=\"code-line\" dir=\"auto\" data-line=\"107\"><strong>Setup tab<\/strong>\u00a0\u2014 displays the status of the two packages that cannot be resolved automatically:<\/p><table class=\"code-line\" dir=\"auto\" data-line=\"109\"><thead class=\"code-line\" dir=\"auto\" data-line=\"109\"><tr class=\"code-line\" dir=\"auto\" data-line=\"109\"><th>Package<\/th><th>Status<\/th><th>Action<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"111\"><tr class=\"code-line\" dir=\"auto\" data-line=\"111\"><td>Snapdragon Spaces SDK 1.0.4<\/td><td>\u2713 \/ \u2717<\/td><td><strong>Browse\u2026<\/strong>\u00a0\u2014 opens a file picker to select the\u00a0<code>.tgz<\/code>\u00a0and installs it via Package Manager<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"112\"><td>UniTask 2.5.10<\/td><td>\u2713 \/ \u2717<\/td><td><strong>Install<\/strong>\u00a0\u2014 installs UniTask directly from the official Cysharp Git repository<\/td><\/tr><\/tbody><\/table><p class=\"code-line\" dir=\"auto\" data-line=\"114\">Once both packages show \u2713, the setup is complete. Use the\u00a0<strong>\u21ba Refresh<\/strong>\u00a0button at any time to re-check the current state.<\/p><p class=\"code-line\" dir=\"auto\" data-line=\"116\"><strong>About tab<\/strong>\u00a0\u2014 displays version information for the SDK, device, and Unity Editor.<\/p><h3 id=\"configure-xr-plugin-management-and-openxr\" class=\"code-line\" dir=\"auto\" data-line=\"118\">Configure XR Plugin Management and OpenXR<\/h3><h4 id=\"open-project-settings\" class=\"code-line\" dir=\"auto\" data-line=\"120\">Open Project Settings<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"122\">Go to\u00a0<strong>Edit &gt; Project Settings<\/strong>\u00a0and select\u00a0<strong>XR Plug-in Management<\/strong>\u00a0in the left sidebar.<\/p><h4 id=\"enable-openxr-and-snapdragon-spaces\" class=\"code-line\" dir=\"auto\" data-line=\"124\">Enable OpenXR and Snapdragon Spaces<\/h4><ol class=\"code-line\" dir=\"auto\" data-line=\"126\"><li class=\"code-line\" dir=\"auto\" data-line=\"126\">Click the\u00a0<strong>Android<\/strong>\u00a0tab (top right of the window).<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"127\">Under\u00a0<strong>Plug-in Providers<\/strong>, ensure both are checked:\u00a0<strong>OpenXR<\/strong>\u00a0and\u00a0<strong>Snapdragon Spaces feature group<\/strong>.<\/li><\/ol><h4 id=\"configure-openxr-features\" class=\"code-line\" dir=\"auto\" data-line=\"129\">Configure OpenXR Features<\/h4><ol class=\"code-line\" dir=\"auto\" data-line=\"131\"><li class=\"code-line\" dir=\"auto\" data-line=\"131\">Click\u00a0<strong>OpenXR<\/strong>\u00a0in the left sidebar.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"132\">In the Snapdragon Spaces feature list, enable only\u00a0<strong>Base Runtime<\/strong>\u00a0and disable all others. Advanced features (Hit Testing, Plane Detection, etc.) can be enabled later as needed.<\/li><\/ol><blockquote class=\"code-line\" dir=\"auto\" data-line=\"134\"><p class=\"code-line\" dir=\"auto\" data-line=\"134\"><strong>NOTE<\/strong>\u00a0For Hand Tracking to work correctly on LeonardoXR, the\u00a0<strong>Hand Tracking Subsystem<\/strong>\u00a0option must be enabled in the\u00a0<strong>All Features<\/strong>\u00a0section of OpenXR.<\/p><\/blockquote><h4 id=\"add-leonardoxr-feature-group\" class=\"code-line\" dir=\"auto\" data-line=\"136\">Add LeonardoXR Feature Group<\/h4><ol class=\"code-line\" dir=\"auto\" data-line=\"138\"><li class=\"code-line\" dir=\"auto\" data-line=\"138\">Return to\u00a0<strong>XR Plug-in Management &gt; Android<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"139\">In the Plug-in Providers list, also check\u00a0<strong>LeonardoXR feature group<\/strong>.<\/li><\/ol><h4 id=\"run-project-validation\" class=\"code-line\" dir=\"auto\" data-line=\"141\">Run Project Validation<\/h4><ol class=\"code-line\" dir=\"auto\" data-line=\"143\"><li class=\"code-line\" dir=\"auto\" data-line=\"143\">In the Project Settings sidebar click\u00a0<strong>Project Validation<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"144\">The window shows a list of configuration errors to fix.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"145\">Click\u00a0<strong>Fix All<\/strong>\u00a0to resolve them automatically.<\/li><\/ol><blockquote class=\"code-line\" dir=\"auto\" data-line=\"147\"><p class=\"code-line\" dir=\"auto\" data-line=\"147\"><strong>NOTE<\/strong>\u00a0Some fixes may require an editor restart. Re-run validation after restarting to confirm all errors are resolved.<\/p><\/blockquote><h3 id=\"import-samples\" class=\"code-line\" dir=\"auto\" data-line=\"149\">Import Samples<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"151\">Before creating your own scenes it is useful to import the samples included in each package. For each package: open\u00a0<strong>Window &gt; Package Manager<\/strong>, select\u00a0<strong>In Project<\/strong>, select the package, expand the\u00a0<strong>Samples<\/strong>\u00a0section and click\u00a0<strong>Import<\/strong>.<\/p><table class=\"code-line\" dir=\"auto\" data-line=\"153\"><thead class=\"code-line\" dir=\"auto\" data-line=\"153\"><tr class=\"code-line\" dir=\"auto\" data-line=\"153\"><th>Package<\/th><th>Samples<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"155\"><tr class=\"code-line\" dir=\"auto\" data-line=\"155\"><td>XR Hands<\/td><td>Gestures, Hand Visualizer<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"156\"><td>XR Interaction Toolkit<\/td><td>Starter Assets, Hand Interaction Demo<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"157\"><td>Snapdragon Spaces<\/td><td>Core Samples<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"158\"><td>LeonardoXR<\/td><td>Core Samples, Documentation<\/td><\/tr><\/tbody><\/table><p class=\"code-line\" dir=\"auto\" data-line=\"160\">After importing all samples, add scenes to the build via\u00a0<strong>Window &gt; XR &gt; Snapdragon Spaces &gt; Add Scenes to Build Settings<\/strong>.<\/p><h3 id=\"configure-urp\" class=\"code-line\" dir=\"auto\" data-line=\"162\">Configure URP<\/h3><h4 id=\"graphics-and-quality-settings\" class=\"code-line\" dir=\"auto\" data-line=\"164\">Graphics and Quality Settings<\/h4><ol class=\"code-line\" dir=\"auto\" data-line=\"166\"><li class=\"code-line\" dir=\"auto\" data-line=\"166\">Open\u00a0<strong>Edit &gt; Project Settings &gt; Graphics<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"167\">Under\u00a0<strong>Default Render Pipeline<\/strong>, click the circle and select\u00a0<code>Mobile_RPAsset<\/code>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"168\">Go to\u00a0<strong>Project Settings &gt; Quality<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"169\">In the Levels section, ensure\u00a0<strong>Mobile<\/strong>\u00a0has a green checkbox in the Android column. If not, click the\u00a0<strong>Default<\/strong>\u00a0triangle under Android and select\u00a0<strong>Mobile<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"170\">Close Project Settings.<\/li><\/ol><h4 id=\"configure-urp-assets\" class=\"code-line\" dir=\"auto\" data-line=\"172\">Configure URP Assets<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"174\">In\u00a0<code>Assets\/Settings<\/code>, select\u00a0<code>Mobile_Renderer<\/code>\u00a0and apply:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"175\"><li class=\"code-line\" dir=\"auto\" data-line=\"175\"><strong>Rendering \u2192 Depth Priming Mode<\/strong>: set to\u00a0<code>Disabled<\/code><\/li><li class=\"code-line\" dir=\"auto\" data-line=\"176\"><strong>Shadows \u2192 Transparent Receive Shadows<\/strong>: uncheck<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"177\"><strong>Post-processing \u2192 Enabled<\/strong>: uncheck<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"178\"><strong>Renderer Feature \u2192 SSAO<\/strong>: ensure it is disabled or removed<\/li><\/ul><p class=\"code-line\" dir=\"auto\" data-line=\"180\">In\u00a0<code>Assets\/Settings<\/code>, select\u00a0<code>Mobile_RPAsset<\/code>\u00a0and apply:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"181\"><li class=\"code-line\" dir=\"auto\" data-line=\"181\"><strong>HDR<\/strong>: disable<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"182\"><strong>Anti Aliasing (MSAA)<\/strong>: set to\u00a0<code>4x<\/code><\/li><\/ul><h3 id=\"play-in-editor-configuration\" class=\"code-line\" dir=\"auto\" data-line=\"184\">Play In Editor Configuration<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"186\">This section describes how to configure the project for Play-In-Editor development, reducing the need to deploy to the device on every change.<\/p><h4 id=\"openxr-project-settings\" class=\"code-line\" dir=\"auto\" data-line=\"188\">OpenXR Project Settings<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"190\">Go to\u00a0<strong>Edit &gt; Project Settings &gt; XR Plug-in Management<\/strong>\u00a0and select the\u00a0<strong>Windows, Mac, Linux<\/strong>\u00a0tab.<\/p><p class=\"code-line\" dir=\"auto\" data-line=\"192\"><strong>Initialize XR On Startup<\/strong>\u00a0\u2014 the value must match the Android tab setting:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"193\"><li class=\"code-line\" dir=\"auto\" data-line=\"193\">Without Dual Render Fusion \u2192 must be\u00a0<strong>enabled<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"194\">With Dual Render Fusion \u2192 must be\u00a0<strong>disabled<\/strong>.<\/li><\/ul><blockquote class=\"code-line\" dir=\"auto\" data-line=\"196\"><p class=\"code-line\" dir=\"auto\" data-line=\"196\"><strong>NOTE<\/strong>\u00a0Enable\u00a0<strong>XR Simulation<\/strong>\u00a0on the Windows\/Mac\/Linux tab to use AR Foundation simulation environments. Note that QR Code Tracking has no simulation subsystem equivalent.<\/p><\/blockquote><h4 id=\"enable-base-runtime-feature-for-windowsmaclinux\" class=\"code-line\" dir=\"auto\" data-line=\"198\">Enable Base Runtime Feature for Windows\/Mac\/Linux<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"200\">Go to\u00a0<strong>Edit &gt; Project Settings &gt; XR Plug-in Management &gt; OpenXR<\/strong>\u00a0(Windows, Mac, Linux tab) and enable the\u00a0<strong>Base Runtime<\/strong>\u00a0feature.<\/p><h4 id=\"scene-configuration--spaces-xr-simulator\" class=\"code-line\" dir=\"auto\" data-line=\"202\">Scene Configuration \u2014 Spaces XR Simulator<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"204\">Add the\u00a0<strong>Spaces XR Simulator<\/strong>\u00a0component to a root GameObject in the scene. The component persists across scene loads (<code>DontDestroyOnLoad<\/code>) and only one instance can exist at a time.<\/p><table class=\"code-line\" dir=\"auto\" data-line=\"206\"><thead class=\"code-line\" dir=\"auto\" data-line=\"206\"><tr class=\"code-line\" dir=\"auto\" data-line=\"206\"><th>Property<\/th><th>Description<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"208\"><tr class=\"code-line\" dir=\"auto\" data-line=\"208\"><td>Start Connected<\/td><td>Simulates glasses active and connected (Dual Render Fusion only).<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"209\"><td>Invert Sim Camera Display<\/td><td>Swaps phone and glasses displays in the editor (Dual Render Fusion only).<\/td><\/tr><\/tbody><\/table><h4 id=\"dual-render-fusion-editor-shortcuts\" class=\"code-line\" dir=\"auto\" data-line=\"211\">Dual Render Fusion Editor Shortcuts<\/h4><table class=\"code-line\" dir=\"auto\" data-line=\"213\"><thead class=\"code-line\" dir=\"auto\" data-line=\"213\"><tr class=\"code-line\" dir=\"auto\" data-line=\"213\"><th>Event<\/th><th>Shortcut<\/th><th>Menu Path<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"215\"><tr class=\"code-line\" dir=\"auto\" data-line=\"215\"><td>Connect Glasses<\/td><td>Alt-Shift-C<\/td><td>Window &gt; XR &gt; Snapdragon Spaces &gt; DRF &gt; Simulation &gt; Connect Glasses<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"216\"><td>Disconnect Glasses<\/td><td>Alt-Shift-D<\/td><td>Window &gt; XR &gt; Snapdragon Spaces &gt; DRF &gt; Simulation &gt; Disconnect Glasses<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"217\"><td>Glasses Active<\/td><td>Alt-Shift-G<\/td><td>Window &gt; XR &gt; Snapdragon Spaces &gt; DRF &gt; Simulation &gt; Glasses Active<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"218\"><td>Glasses Idle<\/td><td>Alt-Shift-H<\/td><td>Window &gt; XR &gt; Snapdragon Spaces &gt; DRF &gt; Simulation &gt; Glasses Idle<\/td><\/tr><\/tbody><\/table><blockquote class=\"code-line\" dir=\"auto\" data-line=\"220\"><p class=\"code-line\" dir=\"auto\" data-line=\"220\"><strong>NOTE<\/strong>\u00a0All final behaviour must always be verified on the physical device, not only in the editor.<\/p><\/blockquote><hr class=\"code-line\" dir=\"auto\" data-line=\"222\" \/><h2 id=\"02-vr--mr\" class=\"code-line\" dir=\"auto\" data-line=\"224\">02 VR \/ MR<\/h2><p class=\"code-line\" dir=\"auto\" data-line=\"226\"><em>Version 1.0.2 | Device: Youbiquo Leonardo XR | Base SDK: Snapdragon Spaces 1.0.4<\/em><\/p><h3 id=\"manual-project-configuration\" class=\"code-line\" dir=\"auto\" data-line=\"228\">Manual Project Configuration<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"230\">It is recommended to use the Configuration Tool for initial project setup (see Getting Started). This guide describes the equivalent manual steps for developers who prefer direct control over settings.<\/p><h4 id=\"edit-project-settings\" class=\"code-line\" dir=\"auto\" data-line=\"232\">Edit Project Settings<\/h4><ol class=\"code-line\" dir=\"auto\" data-line=\"234\"><li class=\"code-line\" dir=\"auto\" data-line=\"234\">Go to\u00a0<strong>Edit &gt; Project Settings &gt; XR Plug-in Management<\/strong>\u00a0and open the\u00a0<strong>Android<\/strong>\u00a0tab.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"235\">Enable the\u00a0<strong>OpenXR<\/strong>\u00a0plug-in and the\u00a0<strong>Snapdragon Spaces<\/strong>\u00a0feature group.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"236\">Click the red exclamation mark next to OpenXR to open\u00a0<strong>OpenXR Project Validation<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"237\">Click\u00a0<strong>Fix<\/strong>\u00a0next to each item.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"238\">Apply the &#8220;Enable both Input Systems&#8221; setting last, as it requires an editor restart.<\/li><\/ol><h4 id=\"enable-spaces-features\" class=\"code-line\" dir=\"auto\" data-line=\"240\">Enable Spaces Features<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"242\">Enable the features that must be active at runtime in OpenXR Settings. Each feature corresponds to an AR Foundation Manager and an XR Subsystem:<\/p><table class=\"code-line\" dir=\"auto\" data-line=\"244\"><thead class=\"code-line\" dir=\"auto\" data-line=\"244\"><tr class=\"code-line\" dir=\"auto\" data-line=\"244\"><th>Feature<\/th><th>AR Foundation Manager<\/th><th>XR Subsystem<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"246\"><tr class=\"code-line\" dir=\"auto\" data-line=\"246\"><td>Base Runtime<\/td><td>AR Session<\/td><td>XRSessionSubsystem<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"247\"><td>Camera Frame Access<\/td><td>AR Camera Manager<\/td><td>XRCameraSubsystem<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"248\"><td>Hit Testing<\/td><td>AR Raycast Manager<\/td><td>XRRaycastSubsystem<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"249\"><td>Image Tracking<\/td><td>AR Tracked Image Manager<\/td><td>XRImageTrackingSubsystem<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"250\"><td>Plane Detection<\/td><td>AR Plane Manager<\/td><td>XRPlaneSubsystem<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"251\"><td>Spatial Anchors<\/td><td>AR Anchor Manager<\/td><td>XRAnchorSubsystem<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"252\"><td>Spatial Meshing<\/td><td>AR Mesh Manager<\/td><td>XRMeshSubsystem<\/td><\/tr><\/tbody><\/table><h4 id=\"add-feature-usage-data-to-the-android-manifest\" class=\"code-line\" dir=\"auto\" data-line=\"254\">Add Feature Usage Data to the Android Manifest<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"256\">Go to\u00a0<strong>Edit &gt; Project Settings &gt; Snapdragon Spaces Launcher Settings<\/strong>\u00a0to declare features required or supported by the application for: Hand Tracking, Eye Tracking, Passthrough, Controllers and Room Scale.<\/p><blockquote class=\"code-line\" dir=\"auto\" data-line=\"258\"><p class=\"code-line\" dir=\"auto\" data-line=\"258\"><strong>NOTE<\/strong>\u00a0By default all\u00a0<code>uses-feature<\/code>\u00a0values are set to\u00a0<code>true<\/code>. Set unused features to\u00a0<code>false<\/code>\u00a0to avoid false requirements in the manifest.<\/p><\/blockquote><h3 id=\"passthrough-setup\" class=\"code-line\" dir=\"auto\" data-line=\"260\">Passthrough Setup<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"262\">Passthrough allows the physical environment to be displayed as an image overlay on VR devices. On LeonardoXR it is available on compatible devices.<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"264\"><li class=\"code-line\" dir=\"auto\" data-line=\"264\">Activated via the\u00a0<strong>Extend Content<\/strong>\u00a0panel in the in-app UI (visible only on Passthrough-compatible devices).<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"265\">Can also be toggled with the\u00a0<strong>X<\/strong>\u00a0and\u00a0<strong>A<\/strong>\u00a0buttons on the controller.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"266\">The enable function is\u00a0<code>OnPassthroughToggle()<\/code>\u00a0in\u00a0<code>MainMenuSampleController<\/code>, which sets\u00a0<code>PassthroughToggle<\/code>\u00a0on\u00a0<code>BaseRuntimeFeature<\/code>.<\/li><\/ul><blockquote class=\"code-line\" dir=\"auto\" data-line=\"268\"><p class=\"code-line\" dir=\"auto\" data-line=\"268\"><strong>CAUTION<\/strong>\u00a0The session camera must have the\u00a0<strong>Alpha channel<\/strong>\u00a0of the Background set to\u00a0<code>0<\/code>\u00a0for Passthrough to work correctly. A warning is automatically logged if settings are incorrect.<\/p><\/blockquote><p class=\"code-line\" dir=\"auto\" data-line=\"270\">The\u00a0<code>OnSpacesAppSpaceChange<\/code>\u00a0delegate in\u00a0<code>BaseRuntimeFeature<\/code>\u00a0notifies when the device performs a recenter (activated by holding the menu button for 2 seconds on the VRX).<\/p><h3 id=\"scene-setup\" class=\"code-line\" dir=\"auto\" data-line=\"272\">Scene Setup<\/h3><blockquote class=\"code-line\" dir=\"auto\" data-line=\"274\"><p class=\"code-line\" dir=\"auto\" data-line=\"274\"><strong>NOTE<\/strong>\u00a0This guide assumes prior knowledge of AR Foundation and OpenXR. Refer to the official AR Foundation and OpenXR documentation for foundational concepts.<\/p><\/blockquote><h4 id=\"minimum-scene-hierarchy\" class=\"code-line\" dir=\"auto\" data-line=\"276\">Minimum Scene Hierarchy<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"278\">The following objects are required to enable positional head tracking on LeonardoXR:<\/p><pre><code class=\"code-line\" dir=\"auto\" data-line=\"280\">AR Session\nXR Origin\n  \u2514\u2500\u2500 Camera Offset\n        \u2514\u2500\u2500 Main Camera (tagged as \"MainCamera\")\n<\/code><\/pre><p class=\"code-line\" dir=\"auto\" data-line=\"287\">Create them by right-clicking in the Hierarchy and selecting\u00a0<strong>XR &gt; AR Session<\/strong>\u00a0or\u00a0<strong>XR &gt; XR Origin<\/strong>.<\/p><blockquote class=\"code-line\" dir=\"auto\" data-line=\"289\"><p class=\"code-line\" dir=\"auto\" data-line=\"289\"><strong>NOTE<\/strong>\u00a0Disable the\u00a0<strong>AR Camera Manager<\/strong>\u00a0component if you are not retrieving RGB frames from the camera, to avoid lifecycle issues. Also disable\u00a0<strong>AR Camera Background<\/strong>\u00a0\u2014 it is not supported and will be automatically disabled at runtime.<\/p><\/blockquote><h3 id=\"application-lifecycle--older-runtime-compatibility\" class=\"code-line\" dir=\"auto\" data-line=\"291\">Application Lifecycle \u2014 Older Runtime Compatibility<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"293\">The Older Runtime Compatibility library prevents the application from launching when the SDK is incompatible with the OpenXR runtime installed on the device. Two entries are added to the Android manifest at startup:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"295\"><li class=\"code-line\" dir=\"auto\" data-line=\"295\"><code>targetAPI<\/code>\u00a0\u2014 matches the OpenXR runtime version included in the SDK.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"296\"><code>minAPI<\/code>\u00a0\u2014 the minimum runtime version each feature supports.<\/li><\/ul><blockquote class=\"code-line\" dir=\"auto\" data-line=\"298\"><p class=\"code-line\" dir=\"auto\" data-line=\"298\"><strong>NOTE<\/strong>\u00a0As of Snapdragon Spaces 1.0.4, the\u00a0<code>minAPI<\/code>\u00a0for all features is\u00a0<code>0.22.0<\/code>.<\/p><\/blockquote><table class=\"code-line\" dir=\"auto\" data-line=\"300\"><thead class=\"code-line\" dir=\"auto\" data-line=\"300\"><tr class=\"code-line\" dir=\"auto\" data-line=\"300\"><th>Result<\/th><th>Description<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"302\"><tr class=\"code-line\" dir=\"auto\" data-line=\"302\"><td>Success<\/td><td>No incompatibilities detected.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"303\"><td>Error Runtime Failure<\/td><td>OpenXR runtime error.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"304\"><td>Error Validation Failure<\/td><td>Older Runtime Compatibility validation error.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"305\"><td>Error Uninitialized<\/td><td>System Error due to missing initialization.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"306\"><td>Error Runtime Too Old For Application<\/td><td>Installed runtime is too old for the SDK.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"307\"><td>Error Application Too Old For Runtime<\/td><td>SDK is too old for the installed runtime.<\/td><\/tr><\/tbody><\/table><h3 id=\"known-issues--vrmr-on-leonardoxr\" class=\"code-line\" dir=\"auto\" data-line=\"309\">Known Issues \u2014 VR\/MR on LeonardoXR<\/h3><blockquote class=\"code-line\" dir=\"auto\" data-line=\"311\"><p class=\"code-line\" dir=\"auto\" data-line=\"311\"><strong>NOTE<\/strong>\u00a0For issues not listed here, refer to the general known issues for the Snapdragon Spaces platform.<\/p><\/blockquote><h4 id=\"gradle-build-issue\" class=\"code-line\" dir=\"auto\" data-line=\"313\">Gradle Build Issue<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"315\">Adding a custom controller archive can cause Gradle caching errors. Deleting the\u00a0<code>Temp\/gradleOut<\/code>\u00a0folder generally resolves the issue.<\/p><h4 id=\"ar-foundation-issues\" class=\"code-line\" dir=\"auto\" data-line=\"317\">AR Foundation Issues<\/h4><ul class=\"code-line\" dir=\"auto\" data-line=\"319\"><li class=\"code-line\" dir=\"auto\" data-line=\"319\"><strong>AR Raycast Hit returns wrong Trackable ID<\/strong>\u00a0\u2014\u00a0<code>ARRaycastHit.trackableId<\/code>\u00a0always returns\u00a0<code>0-0<\/code>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"320\"><strong>Plane Detection stalled<\/strong>\u00a0\u2014 Mesh triangulation enters an infinite loop in AR Foundation 6.2.1.<\/li><\/ul><h4 id=\"xrit-issues\" class=\"code-line\" dir=\"auto\" data-line=\"322\">XRIT Issues<\/h4><ul class=\"code-line\" dir=\"auto\" data-line=\"324\"><li class=\"code-line\" dir=\"auto\" data-line=\"324\"><strong>AR Raycast Manager added automatically<\/strong>\u00a0\u2014 XRIT 3.x adds an AR Raycast Manager when an XR Raycast Interactor is present, enabling Spatial Meshing regardless of the\u00a0<code>EnableARRaycasting<\/code>\u00a0flag. This may reduce performance.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"325\"><strong>Unsupported AR Mesh Manager properties<\/strong>\u00a0\u2014 Using unsupported properties generates runtime warnings.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"326\"><strong>AR Camera Manager \/ AR Camera Background Issues<\/strong>\u00a0\u2014 Moving between scenes with AR Camera Manager enabled can cause freezes. Disable AR Camera Background to avoid rendering issues.<\/li><\/ul><h4 id=\"play-in-editor-known-issues\" class=\"code-line\" dir=\"auto\" data-line=\"328\">Play In Editor Known Issues<\/h4><ul class=\"code-line\" dir=\"auto\" data-line=\"330\"><li class=\"code-line\" dir=\"auto\" data-line=\"330\"><strong>Memory Leak in Camera Access Simulation<\/strong>\u00a0\u2014 Resolved in AR Foundation 6.0+.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"331\"><strong>AR Mesh Manager crash without Normals<\/strong>\u00a0\u2014 Update AR Foundation or enable normals.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"332\"><strong>QR Code Tracking not loaded in Simulation<\/strong>\u00a0\u2014 No simulation subsystem exists; bypass subsystem checks in editor builds.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"333\"><strong>ScriptableSingleton Warning<\/strong>\u00a0\u2014 Resolved in AR Foundation 5.1.2+.<\/li><\/ul><hr class=\"code-line\" dir=\"auto\" data-line=\"335\" \/><h2 id=\"03-features\" class=\"code-line\" dir=\"auto\" data-line=\"337\">03 Features<\/h2><p class=\"code-line\" dir=\"auto\" data-line=\"339\"><em>Version 1.0.2 | Device: Youbiquo Leonardo XR | Base SDK: Snapdragon Spaces 1.0.4<\/em><\/p><p class=\"code-line\" dir=\"auto\" data-line=\"341\">This page documents the features available in the LeonardoXR SDK, organised in two sections:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"343\"><li class=\"code-line\" dir=\"auto\" data-line=\"343\"><strong>Snapdragon Spaces Features<\/strong>\u00a0\u2014 AR\/XR functionality provided by the Snapdragon Spaces platform, accessible through AR Foundation.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"344\"><strong>LeonardoXR Features<\/strong>\u00a0\u2014 proprietary features specific to Leonardo XR.<\/li><\/ul><hr class=\"code-line\" dir=\"auto\" data-line=\"346\" \/><h3 id=\"snapdragon-spaces-features\" class=\"code-line\" dir=\"auto\" data-line=\"348\">Snapdragon Spaces Features<\/h3><h4 id=\"local-anchors\" class=\"code-line\" dir=\"auto\" data-line=\"350\">Local Anchors<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"352\"><strong>How to Enable<\/strong><\/p><p class=\"code-line\" dir=\"auto\" data-line=\"354\">Go to\u00a0<strong>Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Spatial Anchors<\/strong>\u00a0and enable the feature.<\/p><p class=\"code-line\" dir=\"auto\" data-line=\"356\"><strong>Spaces Anchor Store<\/strong><\/p><blockquote class=\"code-line\" dir=\"auto\" data-line=\"358\"><p class=\"code-line\" dir=\"auto\" data-line=\"358\"><strong>NOTE<\/strong>\u00a0Look around the environment to generate a better tracking map and reduce save\/load times. Saving multiple anchors simultaneously blocks the main thread \u2014 use the callback to save subsequent anchors sequentially.<\/p><\/blockquote><pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"360\"><span class=\"hljs-keyword\">namespace<\/span> <span class=\"hljs-title\">Qualcomm.Snapdragon.Spaces<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">SpacesAnchorStore<\/span>\n    {\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">ClearStore<\/span>()<\/span>;\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">SaveAnchor<\/span>(<span class=\"hljs-params\">ARAnchor anchor, <span class=\"hljs-built_in\">string<\/span> anchorName, Action&lt;<span class=\"hljs-built_in\">bool<\/span>&gt; onSavedCallback = <span class=\"hljs-literal\">null<\/span><\/span>)<\/span>;\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">SaveAnchorWithResult<\/span>(<span class=\"hljs-params\">ARAnchor anchor, <span class=\"hljs-built_in\">string<\/span> anchorName, Action&lt;SaveAnchorResult&gt; callback = <span class=\"hljs-literal\">null<\/span><\/span>)<\/span>;\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">DeleteSavedAnchor<\/span>(<span class=\"hljs-params\"><span class=\"hljs-built_in\">string<\/span> anchorName<\/span>)<\/span>;\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">LoadSavedAnchor<\/span>(<span class=\"hljs-params\"><span class=\"hljs-built_in\">string<\/span> anchorName, Action&lt;<span class=\"hljs-built_in\">bool<\/span>&gt; onLoadedCallback = <span class=\"hljs-literal\">null<\/span><\/span>)<\/span>;\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">LoadAllSavedAnchors<\/span>(<span class=\"hljs-params\">Action&lt;<span class=\"hljs-built_in\">bool<\/span>&gt; onLoadedCallback = <span class=\"hljs-literal\">null<\/span><\/span>)<\/span>;\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-built_in\">string<\/span>[] <span class=\"hljs-title\">GetSavedAnchorNames<\/span>()<\/span>;\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-built_in\">string<\/span> <span class=\"hljs-title\">GetSavedAnchorNameFromARAnchor<\/span>(<span class=\"hljs-params\">ARAnchor anchor<\/span>)<\/span>;\n    }\n}\n<\/code><\/pre><p class=\"code-line\" dir=\"auto\" data-line=\"377\"><strong>API Reference<\/strong><\/p><table class=\"code-line\" dir=\"auto\" data-line=\"379\"><thead class=\"code-line\" dir=\"auto\" data-line=\"379\"><tr class=\"code-line\" dir=\"auto\" data-line=\"379\"><th>Method<\/th><th>Description<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"381\"><tr class=\"code-line\" dir=\"auto\" data-line=\"381\"><td><code>ClearStore()<\/code><\/td><td>Clears the local anchor storage.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"382\"><td><code>SaveAnchor(...)<\/code><\/td><td>Saves an ARAnchor by name or generated hash; optional callback on completion.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"383\"><td><code>SaveAnchorWithResult(...)<\/code><\/td><td>Like SaveAnchor but returns a\u00a0<code>SaveAnchorResult<\/code>\u00a0enum.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"384\"><td><code>DeleteSavedAnchor(name)<\/code><\/td><td>Deletes a saved anchor by name.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"385\"><td><code>LoadSavedAnchor(name, ...)<\/code><\/td><td>Loads an anchor from storage and attempts to localise it; fires\u00a0<code>anchorsChanged.added<\/code>.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"386\"><td><code>LoadAllSavedAnchors(...)<\/code><\/td><td>Loads all stored anchors.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"387\"><td><code>GetSavedAnchorNames()<\/code><\/td><td>Returns all saved anchor names.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"388\"><td><code>GetSavedAnchorNameFromARAnchor(anchor)<\/code><\/td><td>Returns the name of a saved anchor from a tracked ARAnchor, or empty string if not saved.<\/td><\/tr><\/tbody><\/table><p class=\"code-line\" dir=\"auto\" data-line=\"390\"><strong>SaveAnchorResult Values<\/strong><\/p><table class=\"code-line\" dir=\"auto\" data-line=\"392\"><thead class=\"code-line\" dir=\"auto\" data-line=\"392\"><tr class=\"code-line\" dir=\"auto\" data-line=\"392\"><th>Value<\/th><th>Meaning<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"394\"><tr class=\"code-line\" dir=\"auto\" data-line=\"394\"><td><code>PENDING<\/code><\/td><td>Anchor is awaiting save.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"395\"><td><code>SAVED<\/code><\/td><td>Successfully saved.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"396\"><td><code>FAILURE_RUNTIME_ERROR<\/code><\/td><td>Runtime error.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"397\"><td><code>FAILURE_STORE_NOT_LOADED<\/code><\/td><td>Anchor Store failed to load.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"398\"><td><code>FAILURE_INSUFFICIENT_QUALITY<\/code><\/td><td>Environment map quality is insufficient.<\/td><\/tr><\/tbody><\/table><hr class=\"code-line\" dir=\"auto\" data-line=\"400\" \/><h4 id=\"hit-testing\" class=\"code-line\" dir=\"auto\" data-line=\"402\">Hit Testing<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"404\">Enable via\u00a0<strong>Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Hit Testing<\/strong>.<\/p><p class=\"code-line\" dir=\"auto\" data-line=\"406\">Uses the\u00a0<strong>AR Raycast Manager<\/strong>\u00a0from AR Foundation (<code>XRRaycastSubsystem<\/code>). Supports continuous hit testing against real-world planes and meshes. The system casts a ray from the camera (or a specified point) and returns intersections with detected surfaces. Each hit contains position, normal and surface type (plane or mesh).<\/p><pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"408\">List&lt;ARRaycastHit&gt; hits = <span class=\"hljs-keyword\">new<\/span> List&lt;ARRaycastHit&gt;();\n<span class=\"hljs-keyword\">if<\/span> (raycastManager.Raycast(screenCenter, hits, TrackableType.PlaneWithinPolygon))\n{\n    Pose hitPose = hits[<span class=\"hljs-number\">0<\/span>].pose;\n    <span class=\"hljs-comment\">\/\/ Place AR content at hitPose.position<\/span>\n}\n<\/code><\/pre><blockquote class=\"code-line\" dir=\"auto\" data-line=\"417\"><p class=\"code-line\" dir=\"auto\" data-line=\"417\"><strong>CAUTION<\/strong>\u00a0<code>ARRaycastHit.trackableId<\/code>\u00a0always returns\u00a0<code>0-0<\/code>. (Known Issue)<\/p><\/blockquote><hr class=\"code-line\" dir=\"auto\" data-line=\"419\" \/><h4 id=\"image-tracking\" class=\"code-line\" dir=\"auto\" data-line=\"421\">Image Tracking<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"423\">Enable via\u00a0<strong>Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Image Tracking<\/strong>. Uses the\u00a0<strong>AR Tracked Image Manager<\/strong>\u00a0(<code>XRImageTrackingSubsystem<\/code>). Supports static and mutable (runtime) reference image libraries.<\/p><pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"425\"><span class=\"hljs-comment\">\/\/ Mutable library example<\/span>\n<span class=\"hljs-keyword\">var<\/span> library = trackedImageManager.CreateRuntimeLibrary() <span class=\"hljs-keyword\">as<\/span> MutableRuntimeReferenceImageLibrary;\n<span class=\"hljs-keyword\">await<\/span> library.ScheduleAddImageWithValidationJob(texture, <span class=\"hljs-string\">\"image-name\"<\/span>, <span class=\"hljs-number\">0.1f<\/span>); <span class=\"hljs-comment\">\/\/ 0.1f = physical width in metres<\/span>\ntrackedImageManager.referenceLibrary = library;\n<\/code><\/pre><hr class=\"code-line\" dir=\"auto\" data-line=\"432\" \/><h4 id=\"plane-detection\" class=\"code-line\" dir=\"auto\" data-line=\"434\">Plane Detection<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"436\">Enable via\u00a0<strong>Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Plane Detection<\/strong>. Uses the\u00a0<strong>AR Plane Manager<\/strong>\u00a0(<code>XRPlaneSubsystem<\/code>).\u00a0<em>Use Scene Understanding Backend<\/em>\u00a0is enabled by default.<\/p><pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"438\">arPlaneManager.requestedDetectionMode = PlaneDetectionMode.Horizontal | PlaneDetectionMode.Vertical;\n<\/code><\/pre><blockquote class=\"code-line\" dir=\"auto\" data-line=\"442\"><p class=\"code-line\" dir=\"auto\" data-line=\"442\"><strong>CAUTION<\/strong>\u00a0Plane Detection enters an infinite mesh triangulation loop in AR Foundation 6.0. In Unity 6 + OpenXR 1.15.1, Plane Detection does not work in Dual Render Fusion apps.<\/p><\/blockquote><hr class=\"code-line\" dir=\"auto\" data-line=\"444\" \/><h4 id=\"camera-frame-access\" class=\"code-line\" dir=\"auto\" data-line=\"446\">Camera Frame Access<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"448\">Enable via\u00a0<strong>Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Camera Frame Access<\/strong>. Uses the\u00a0<strong>AR Camera Manager<\/strong>\u00a0(<code>XRCameraSubsystem<\/code>). Key capabilities:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"450\"><li class=\"code-line\" dir=\"auto\" data-line=\"450\">Raw camera frame access in YUV (Y&#8217;UV420sp) and YUYV \/ YUY2 formats.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"451\"><code>XRCpuImage.GetPlane(int)<\/code>\u00a0for CPU-side image access.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"452\"><code>XRCpuImage.ConvertAsync<\/code>\u00a0for asynchronous conversion.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"453\">GPU-accelerated RGB frame access for AiO devices (via OpenGL).<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"454\">Sensor extrinsics \/ pose retrieval via\u00a0<code>InputBindings<\/code>.<\/li><\/ul><blockquote class=\"code-line\" dir=\"auto\" data-line=\"456\"><p class=\"code-line\" dir=\"auto\" data-line=\"456\"><strong>NOTE<\/strong>\u00a0Enable\u00a0<strong>Allow &#8216;unsafe&#8217; Code<\/strong>\u00a0in\u00a0<strong>Player Settings &gt; Android &gt; Other Settings &gt; Script Compilation<\/strong>\u00a0when using the Camera Frame Access sample. Disable AR Camera Background to avoid rendering issues.<\/p><\/blockquote><pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"458\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">OnCameraFrameReceived<\/span>(<span class=\"hljs-params\">ARCameraFrameEventArgs args<\/span>)<\/span>\n{\n    <span class=\"hljs-keyword\">if<\/span> (cameraManager.TryAcquireLatestCpuImage(<span class=\"hljs-keyword\">out<\/span> XRCpuImage image))\n    {\n        <span class=\"hljs-keyword\">using<\/span> (image)\n        {\n            XRCpuImage.Plane yPlane = image.GetPlane(<span class=\"hljs-number\">0<\/span>); <span class=\"hljs-comment\">\/\/ Luminance plane<\/span>\n            <span class=\"hljs-comment\">\/\/ yPlane.data contains the raw data<\/span>\n        }\n    }\n}\n<\/code><\/pre><hr class=\"code-line\" dir=\"auto\" data-line=\"472\" \/><h4 id=\"spatial-meshing\" class=\"code-line\" dir=\"auto\" data-line=\"474\">Spatial Meshing<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"476\">Enable via\u00a0<strong>Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Spatial Meshing<\/strong>. Uses the\u00a0<strong>AR Mesh Manager<\/strong>\u00a0(<code>XRMeshSubsystem<\/code>). The optional\u00a0<code>SpacesARMeshManagerConfig<\/code>\u00a0component controls mesh characteristics and camera height offsets for\u00a0<code>TrackingOriginMode.Floor<\/code>.<\/p><hr class=\"code-line\" dir=\"auto\" data-line=\"478\" \/><h4 id=\"qr-code-tracking\" class=\"code-line\" dir=\"auto\" data-line=\"480\">QR Code Tracking<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"482\">Enable via\u00a0<strong>Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; QR Code Tracking<\/strong>. Uses the custom\u00a0<code>SpacesQrCodeManager<\/code>\u00a0component. Supports multiple tracking modes to control algorithm update frequency.<\/p><pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"484\"><span class=\"hljs-comment\">\/\/ Editor build workaround (no simulation subsystem for QR Code Tracking)<\/span>\n<span class=\"hljs-function\"><span class=\"hljs-built_in\">bool<\/span> <span class=\"hljs-title\">CheckSubsystem<\/span>()<\/span>\n{\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">if<\/span> UNITY_EDITOR<\/span>\n    <span class=\"hljs-keyword\">return<\/span> arQrCodeManager.subsystem?.running ?? <span class=\"hljs-literal\">false<\/span>;\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">else<\/span><\/span>\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">true<\/span>;\n<span class=\"hljs-meta\">#<span class=\"hljs-keyword\">endif<\/span><\/span>\n}\n<\/code><\/pre><hr class=\"code-line\" dir=\"auto\" data-line=\"496\" \/><h4 id=\"hand-tracking\" class=\"code-line\" dir=\"auto\" data-line=\"498\">Hand Tracking<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"500\">Enable via\u00a0<strong>Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Hand Tracking<\/strong>. Hand Tracking is provided by the QCHT (Qualcomm Hand Tracking) plugin packages. LeonardoXR uses the Unity XR Hands package (v1.7.2) as the data access layer for joint data, integrated with QCHT extensions.<\/p><blockquote class=\"code-line\" dir=\"auto\" data-line=\"502\"><p class=\"code-line\" dir=\"auto\" data-line=\"502\"><strong>NOTE<\/strong>\u00a0For Hand Tracking to work correctly on LeonardoXR, the\u00a0<strong>Hand Tracking Subsystem<\/strong>\u00a0option must be active in\u00a0<strong>All Features<\/strong>\u00a0of OpenXR.<\/p><\/blockquote><p class=\"code-line\" dir=\"auto\" data-line=\"504\">For full Hand Tracking integration with XR Interaction Toolkit, see the\u00a0<a href=\"https:\/\/file+.vscode-resource.vscode-cdn.net\/c%3A\/Users\/Aida%20Garfami\/Downloads\/Documentation\/Documentation\/Documentation\/Documentation~\/LeonardoXR%20SDK%20Documentation_EN.md#05-interaction-package-guides\" data-href=\"#05-interaction-package-guides\">Interaction Package Guides<\/a>\u00a0document.<\/p><hr class=\"code-line\" dir=\"auto\" data-line=\"506\" \/><h4 id=\"foveated-rendering\" class=\"code-line\" dir=\"auto\" data-line=\"508\">Foveated Rendering<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"510\">Enable via\u00a0<strong>Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Foveated Rendering<\/strong>. Reduces GPU load by rendering the visual field periphery at lower resolution. Foveation settings persist after application pause and resume.<\/p><table class=\"code-line\" dir=\"auto\" data-line=\"512\"><thead class=\"code-line\" dir=\"auto\" data-line=\"512\"><tr class=\"code-line\" dir=\"auto\" data-line=\"512\"><th>Level<\/th><th>Description<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"514\"><tr class=\"code-line\" dir=\"auto\" data-line=\"514\"><td>None<\/td><td>No reduction.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"515\"><td>Low<\/td><td>Light reduction, imperceptible to most users.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"516\"><td>Medium<\/td><td>Good quality\/performance trade-off.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"517\"><td>High<\/td><td>Maximum reduction; recommended only for heavily 3D content scenes.<\/td><\/tr><\/tbody><\/table><hr class=\"code-line\" dir=\"auto\" data-line=\"519\" \/><h3 id=\"leonardoxr-features\" class=\"code-line\" dir=\"auto\" data-line=\"521\">LeonardoXR Features<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"523\">The following features are specific to Leonardo XR and are not part of the base Snapdragon Spaces platform. Enable them via\u00a0<strong>Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; LeonardoXR feature group<\/strong>.<\/p><h4 id=\"dual-camera-access\" class=\"code-line\" dir=\"auto\" data-line=\"525\">Dual Camera Access<\/h4><blockquote class=\"code-line\" dir=\"auto\" data-line=\"527\"><p class=\"code-line\" dir=\"auto\" data-line=\"527\"><strong>DOCUMENTATION IN PROGRESS<\/strong>\u00a0This feature provides synchronised access to frames from both Leonardo XR cameras. Detailed API documentation, configuration and samples will be available in a future release.<\/p><\/blockquote><h4 id=\"qnn-inference-plugin\" class=\"code-line\" dir=\"auto\" data-line=\"529\">QNN Inference Plugin<\/h4><blockquote class=\"code-line\" dir=\"auto\" data-line=\"531\"><p class=\"code-line\" dir=\"auto\" data-line=\"531\"><strong>DOCUMENTATION IN PROGRESS<\/strong>\u00a0This feature exposes Leonardo XR hardware neural inference capabilities via the Qualcomm Neural Network (QNN) runtime, enabling AI\/ML models to run directly on the device NPU. Detailed API documentation, model conversion workflow and samples will be available in a future release.<\/p><\/blockquote><h4 id=\"intercept-openxr-function\" class=\"code-line\" dir=\"auto\" data-line=\"533\">Intercept OpenXR Function<\/h4><blockquote class=\"code-line\" dir=\"auto\" data-line=\"535\"><p class=\"code-line\" dir=\"auto\" data-line=\"535\"><strong>DOCUMENTATION IN PROGRESS<\/strong>\u00a0This advanced feature provides a mechanism to intercept and override low-level OpenXR functions. It is intended for specialised use cases requiring direct control over the OpenXR layer. Detailed documentation will be available in a future release.<\/p><\/blockquote><hr class=\"code-line\" dir=\"auto\" data-line=\"537\" \/><h2 id=\"04-samples-guide\" class=\"code-line\" dir=\"auto\" data-line=\"539\">04 Samples Guide<\/h2><p class=\"code-line\" dir=\"auto\" data-line=\"541\"><em>Version 1.0.2 | Device: Youbiquo Leonardo XR | Base SDK: Snapdragon Spaces 1.0.4<\/em><\/p><p class=\"code-line\" dir=\"auto\" data-line=\"543\">Samples are organised in two sections:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"545\"><li class=\"code-line\" dir=\"auto\" data-line=\"545\"><strong>LeonardoXR Samples<\/strong>\u00a0\u2014 samples specific to Leonardo XR proprietary features.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"546\"><strong>Snapdragon Spaces Core Samples<\/strong>\u00a0\u2014 samples provided by Qualcomm for base AR\/XR features.<\/li><\/ul><h3 id=\"importing-samples\" class=\"code-line\" dir=\"auto\" data-line=\"548\">Importing Samples<\/h3><h4 id=\"snapdragon-spaces-core-samples\" class=\"code-line\" dir=\"auto\" data-line=\"550\">Snapdragon Spaces Core Samples<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"552\">The Core Samples package is importable from\u00a0<strong>Window &gt; Package Manager &gt; Snapdragon Spaces &gt; Core Samples<\/strong>. After import, add all scenes to the build via\u00a0<strong>Window &gt; XR &gt; Snapdragon Spaces &gt; Add Scenes to Build Settings<\/strong>.<\/p><h4 id=\"leonardoxr-core-samples\" class=\"code-line\" dir=\"auto\" data-line=\"554\">LeonardoXR Core Samples<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"556\">The LeonardoXR Core Samples package is importable from\u00a0<strong>Window &gt; Package Manager &gt; LeonardoXR &gt; Core Samples<\/strong>. After import, scenes are available in\u00a0<code>Samples\/LeonardoXR\/[version]\/Core Samples\/Scenes\/<\/code>.<\/p><hr class=\"code-line\" dir=\"auto\" data-line=\"558\" \/><h3 id=\"leonardoxr-samples\" class=\"code-line\" dir=\"auto\" data-line=\"560\">LeonardoXR Samples<\/h3><h4 id=\"dual-camera-access-sample\" class=\"code-line\" dir=\"auto\" data-line=\"562\">Dual Camera Access Sample<\/h4><blockquote class=\"code-line\" dir=\"auto\" data-line=\"564\"><p class=\"code-line\" dir=\"auto\" data-line=\"564\"><strong>DOCUMENTATION IN PROGRESS<\/strong>\u00a0This sample will demonstrate how to access synchronised frames from both Leonardo XR cameras via the Dual Camera Access feature.<\/p><\/blockquote><ul class=\"code-line\" dir=\"auto\" data-line=\"566\"><li class=\"code-line\" dir=\"auto\" data-line=\"566\"><strong>Scene<\/strong>:\u00a0<code>Samples\/LeonardoXR\/...\/Core Samples\/Scenes\/DualCameraAccess<\/code><\/li><li class=\"code-line\" dir=\"auto\" data-line=\"567\"><strong>Prerequisites<\/strong>: Dual Camera Access enabled in LeonardoXR feature group.<\/li><\/ul><div class=\"code-line\" dir=\"auto\" data-line=\"569\">\u00a0<\/div><h4 id=\"intercept-openxr-function-sample\" class=\"code-line\" dir=\"auto\" data-line=\"576\">Intercept OpenXR Function Sample<\/h4><blockquote class=\"code-line\" dir=\"auto\" data-line=\"578\"><p class=\"code-line\" dir=\"auto\" data-line=\"578\"><strong>DOCUMENTATION IN PROGRESS<\/strong>\u00a0This sample will demonstrate how to intercept low-level OpenXR functions via the InterceptOpenXRFunction feature.<\/p><\/blockquote><ul class=\"code-line\" dir=\"auto\" data-line=\"580\"><li class=\"code-line\" dir=\"auto\" data-line=\"580\"><strong>Scene<\/strong>:\u00a0<code>Samples\/LeonardoXR\/...\/Core Samples\/Scenes\/InterceptOpenXRFunction<\/code><\/li><li class=\"code-line\" dir=\"auto\" data-line=\"581\"><strong>Prerequisites<\/strong>: Intercept OpenXR Function enabled in LeonardoXR feature group.<\/li><\/ul><hr class=\"code-line\" dir=\"auto\" data-line=\"583\" \/><h3 id=\"snapdragon-spaces-core-samples-1\" class=\"code-line\" dir=\"auto\" data-line=\"585\">Snapdragon Spaces Core Samples<\/h3><h4 id=\"local-anchors-sample\" class=\"code-line\" dir=\"auto\" data-line=\"587\">Local Anchors Sample<\/h4><ul class=\"code-line\" dir=\"auto\" data-line=\"589\"><li class=\"code-line\" dir=\"auto\" data-line=\"589\"><strong>Scene<\/strong>:\u00a0<code>Samples\/Snapdragon Spaces\/...\/Core Samples\/Scenes\/Anchor<\/code><\/li><\/ul><p class=\"code-line\" dir=\"auto\" data-line=\"591\">Demonstrates creating and destroying local anchors to precisely track a point in the real world. Requires the\u00a0<strong>Spatial Anchors<\/strong>\u00a0feature enabled in OpenXR.<\/p><p class=\"code-line\" dir=\"auto\" data-line=\"593\"><strong>How it Works<\/strong><\/p><p class=\"code-line\" dir=\"auto\" data-line=\"595\">A transparent positioning gizmo floats 1 metre in front of the camera. When\u00a0<em>Place anchor on surfaces<\/em>\u00a0is enabled, a ray is projected forward each frame. When a surface is hit, the gizmo turns yellow. Touching the touchpad or using the gaze interactor creates an\u00a0<code>ARAnchor<\/code>\u00a0with a tracking gizmo.<\/p><pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"597\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">OnAnchorsChanged<\/span>(<span class=\"hljs-params\">ARAnchorsChangedEventArgs args<\/span>)<\/span>\n{\n    <span class=\"hljs-keyword\">foreach<\/span> (<span class=\"hljs-keyword\">var<\/span> anchor <span class=\"hljs-keyword\">in<\/span> args.updated)\n    {\n        Destroy(anchor.transform.GetChild(<span class=\"hljs-number\">0<\/span>).gameObject);\n        <span class=\"hljs-keyword\">var<\/span> newGizmo = Instantiate(\n            anchor.trackingState == TrackingState.None\n                ? GizmoUntrackedAnchor\n                : GizmoTrackedAnchor);\n        newGizmo.transform.SetParent(anchor.transform, <span class=\"hljs-literal\">false<\/span>);\n    }\n}\n<\/code><\/pre><p class=\"code-line\" dir=\"auto\" data-line=\"612\"><strong>Saving, Deleting and Loading Anchors<\/strong><\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"614\"><li class=\"code-line\" dir=\"auto\" data-line=\"614\">Enable\u00a0<em>Save new anchors to local store<\/em>\u00a0to persist each new anchor.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"615\">White cube on gizmo = anchor saved and tracked; red cube = not tracked.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"616\"><strong>Load All Saved Anchors<\/strong>\u00a0\u2014 loads and attempts to localise all stored anchors.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"617\"><strong>Clear Store<\/strong>\u00a0\u2014 deletes all stored anchors (does not destroy already-loaded anchors).<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"618\"><strong>Destroy All Anchors<\/strong>\u00a0\u2014 destroys all active anchor GameObjects (with a short delay).<\/li><\/ul><h4 id=\"hand-tracking-sample\" class=\"code-line\" dir=\"auto\" data-line=\"620\">Hand Tracking Sample<\/h4><ul class=\"code-line\" dir=\"auto\" data-line=\"622\"><li class=\"code-line\" dir=\"auto\" data-line=\"622\"><strong>Scene<\/strong>:\u00a0<code>Samples\/...\/Core Samples\/Scenes\/HandTracking<\/code><\/li><\/ul><p class=\"code-line\" dir=\"auto\" data-line=\"624\">Demonstrates hand joint visualisation and gesture recognition via the QCHT interaction package. Requires Hand Tracking and QCHT \/ XR Hands packages.<\/p><h4 id=\"hit-testing-sample\" class=\"code-line\" dir=\"auto\" data-line=\"626\">Hit Testing Sample<\/h4><ul class=\"code-line\" dir=\"auto\" data-line=\"628\"><li class=\"code-line\" dir=\"auto\" data-line=\"628\"><strong>Scene<\/strong>:\u00a0<code>Samples\/...\/Core Samples\/Scenes\/HitTesting<\/code><\/li><\/ul><p class=\"code-line\" dir=\"auto\" data-line=\"630\">Demonstrates continuous hit testing via raycast against real-world planes and meshes using\u00a0<code>ARRaycastManager<\/code>. Shows how to place virtual objects on detected surfaces.<\/p><h4 id=\"image-tracking-sample\" class=\"code-line\" dir=\"auto\" data-line=\"632\">Image Tracking Sample<\/h4><ul class=\"code-line\" dir=\"auto\" data-line=\"634\"><li class=\"code-line\" dir=\"auto\" data-line=\"634\"><strong>Scene<\/strong>:\u00a0<code>Samples\/...\/Core Samples\/Scenes\/ImageTracking<\/code><\/li><\/ul><p class=\"code-line\" dir=\"auto\" data-line=\"636\">Demonstrates tracking of printed reference images and virtual content overlay. Supports static and mutable image libraries.<\/p><h4 id=\"plane-detection-sample\" class=\"code-line\" dir=\"auto\" data-line=\"638\">Plane Detection Sample<\/h4><ul class=\"code-line\" dir=\"auto\" data-line=\"640\"><li class=\"code-line\" dir=\"auto\" data-line=\"640\"><strong>Scene<\/strong>:\u00a0<code>Samples\/...\/Core Samples\/Scenes\/PlaneDetection<\/code><\/li><\/ul><p class=\"code-line\" dir=\"auto\" data-line=\"642\">Demonstrates detection and visualisation of horizontal and vertical planes via\u00a0<code>ARPlaneManager<\/code>. Supports detection modes and optional convex hull planes.<\/p><h4 id=\"camera-frame-access-sample\" class=\"code-line\" dir=\"auto\" data-line=\"644\">Camera Frame Access Sample<\/h4><ul class=\"code-line\" dir=\"auto\" data-line=\"646\"><li class=\"code-line\" dir=\"auto\" data-line=\"646\"><strong>Scene<\/strong>:\u00a0<code>Samples\/...\/Core Samples\/Scenes\/CameraFrameAccess<\/code><\/li><\/ul><p class=\"code-line\" dir=\"auto\" data-line=\"648\">Demonstrates retrieval of raw camera frames (YUV \/ YUYV) using\u00a0<code>ARCameraManager<\/code>. Includes sensor extrinsics, camera count query and GPU-accelerated frame access. Requires\u00a0<strong>Allow &#8216;unsafe&#8217; Code<\/strong>\u00a0in Player Settings.<\/p><h4 id=\"spatial-meshing-sample\" class=\"code-line\" dir=\"auto\" data-line=\"650\">Spatial Meshing Sample<\/h4><ul class=\"code-line\" dir=\"auto\" data-line=\"652\"><li class=\"code-line\" dir=\"auto\" data-line=\"652\"><strong>Scene<\/strong>:\u00a0<code>Samples\/...\/Core Samples\/Scenes\/SpatialMeshing<\/code><\/li><\/ul><p class=\"code-line\" dir=\"auto\" data-line=\"654\">Demonstrates real-time environment meshing using\u00a0<code>ARMeshManager<\/code>. Includes an opacity slider and the optional\u00a0<code>SpacesARMeshManagerConfig<\/code>\u00a0component.<\/p><h4 id=\"qr-code-tracking-sample\" class=\"code-line\" dir=\"auto\" data-line=\"656\">QR Code Tracking Sample<\/h4><ul class=\"code-line\" dir=\"auto\" data-line=\"658\"><li class=\"code-line\" dir=\"auto\" data-line=\"658\"><strong>Scene<\/strong>:\u00a0<code>Samples\/...\/Core Samples\/Scenes\/QRCodeTracking<\/code><\/li><\/ul><p class=\"code-line\" dir=\"auto\" data-line=\"660\">Demonstrates QR code scanning and tracking via\u00a0<code>SpacesQrCodeManager<\/code>. Multiple tracking modes available.<\/p><h4 id=\"xr-interaction-toolkit-sample\" class=\"code-line\" dir=\"auto\" data-line=\"662\">XR Interaction Toolkit Sample<\/h4><ul class=\"code-line\" dir=\"auto\" data-line=\"664\"><li class=\"code-line\" dir=\"auto\" data-line=\"664\"><strong>Scene<\/strong>:\u00a0<code>Samples\/...\/Core Samples\/Scenes\/XRInteractionToolkit<\/code><\/li><\/ul><p class=\"code-line\" dir=\"auto\" data-line=\"666\">Demonstrates standard XRIT interactions (ray interactors, direct interactors, teleportation) in a Snapdragon Spaces project. Compatible with the LeonardoXR configuration.<\/p><h4 id=\"composition-layer-components\" class=\"code-line\" dir=\"auto\" data-line=\"668\">Composition Layer Components<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"670\">The\u00a0<strong>Spaces Composition Layer<\/strong>\u00a0renders textures directly to the HMD, bypassing post-processing steps. Supported geometry types are Quad, Cylinder, Sphere and Cube. Useful for high-sharpness UI or elements that must maintain quality regardless of scene effects.<\/p><h4 id=\"additional-samples\" class=\"code-line\" dir=\"auto\" data-line=\"672\">Additional Samples<\/h4><table class=\"code-line\" dir=\"auto\" data-line=\"674\"><thead class=\"code-line\" dir=\"auto\" data-line=\"674\"><tr class=\"code-line\" dir=\"auto\" data-line=\"674\"><th>Sample<\/th><th>Description<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"676\"><tr class=\"code-line\" dir=\"auto\" data-line=\"676\"><td>Display Refresh Rate<\/td><td>Query and runtime setting of display refresh rate via the\u00a0<code>XR_EXT_display_refresh_rate<\/code>\u00a0extension.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"677\"><td>Performance Settings<\/td><td>Setting CPU\/GPU performance levels via the\u00a0<code>XR_EXT_performance_settings<\/code>\u00a0extension.<\/td><\/tr><\/tbody><\/table><hr class=\"code-line\" dir=\"auto\" data-line=\"679\" \/><h2 id=\"05-interaction-package-guides\" class=\"code-line\" dir=\"auto\" data-line=\"681\">05 Interaction Package Guides<\/h2><p class=\"code-line\" dir=\"auto\" data-line=\"683\"><em>Version 1.0.2 | Device: Youbiquo Leonardo XR | Base SDK: Snapdragon Spaces 1.0.4<\/em><\/p><p class=\"code-line\" dir=\"auto\" data-line=\"685\">This guide describes how to configure the interaction layer for LeonardoXR applications using standard Unity packages:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"687\"><li class=\"code-line\" dir=\"auto\" data-line=\"687\"><strong>XR Interaction Toolkit (XRIT) 3.3.0<\/strong>\u00a0\u2014 high-level interaction system for controllers, ray interactors and direct interactors.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"688\"><strong>XR Hands 1.7.2<\/strong>\u00a0\u2014 access to hand joint data and gesture recognition.<\/li><\/ul><h3 id=\"dependencies-and-versions\" class=\"code-line\" dir=\"auto\" data-line=\"690\">Dependencies and Versions<\/h3><table class=\"code-line\" dir=\"auto\" data-line=\"692\"><thead class=\"code-line\" dir=\"auto\" data-line=\"692\"><tr class=\"code-line\" dir=\"auto\" data-line=\"692\"><th>Package<\/th><th>Version<\/th><th>Source<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"694\"><tr class=\"code-line\" dir=\"auto\" data-line=\"694\"><td>XR Interaction Toolkit<\/td><td>3.3.0<\/td><td>Unity Registry<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"695\"><td>XR Hands<\/td><td>1.7.2<\/td><td>Unity Registry<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"696\"><td>AR Foundation<\/td><td>6.2.1<\/td><td>Unity Registry<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"697\"><td>Snapdragon Spaces SDK<\/td><td>1.0.4<\/td><td>Tarball (Qualcomm)<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"698\"><td>LeonardoXR SDK<\/td><td>1.0.2<\/td><td>Tarball (Youbiquo)<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"699\"><td>UniTask<\/td><td>2.5.10<\/td><td>Unity Registry<\/td><\/tr><\/tbody><\/table><blockquote class=\"code-line\" dir=\"auto\" data-line=\"701\"><p class=\"code-line\" dir=\"auto\" data-line=\"701\"><strong>NOTE<\/strong>\u00a0All dependencies must be installed as described in the Getting Started guide before proceeding with interaction configuration.<\/p><\/blockquote><hr class=\"code-line\" dir=\"auto\" data-line=\"703\" \/><h3 id=\"1-xr-interaction-toolkit-configuration\" class=\"code-line\" dir=\"auto\" data-line=\"705\">1. XR Interaction Toolkit Configuration<\/h3><h4 id=\"installation\" class=\"code-line\" dir=\"auto\" data-line=\"707\">Installation<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"709\">Install via\u00a0<strong>Window &gt; Package Manager &gt; Unity Registry &gt; XR Interaction Toolkit &gt; Install<\/strong>\u00a0(version 3.3.0). If prompted &#8220;Enable the new input system?&#8221;, click\u00a0<strong>Yes<\/strong>. If prompted &#8220;XR Interaction Layer Mask Update Required&#8221;, click\u00a0<strong>I Made a Backup, Go Ahead!<\/strong>\u00a0(for new projects) or\u00a0<strong>No Thanks<\/strong>\u00a0if no previous XRIT version was present.<\/p><h4 id=\"import-starter-assets\" class=\"code-line\" dir=\"auto\" data-line=\"711\">Import Starter Assets<\/h4><ol class=\"code-line\" dir=\"auto\" data-line=\"713\"><li class=\"code-line\" dir=\"auto\" data-line=\"713\">Open\u00a0<strong>Window &gt; Package Manager<\/strong>, select\u00a0<strong>In Project<\/strong>\u00a0then\u00a0<strong>XR Interaction Toolkit<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"714\">Under\u00a0<strong>Samples<\/strong>, click\u00a0<strong>Import<\/strong>\u00a0on\u00a0<strong>Starter Assets<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"715\">Also click\u00a0<strong>Import<\/strong>\u00a0on\u00a0<strong>Hand Interaction Demo<\/strong>\u00a0(required for hand tracking samples).<\/li><\/ol><p class=\"code-line\" dir=\"auto\" data-line=\"717\">The Starter Assets include:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"718\"><li class=\"code-line\" dir=\"auto\" data-line=\"718\">Pre-configured Input Action Asset for XR controllers and hands.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"719\">Reference prefabs for XR Origin with Ray Interactor and Direct Interactor.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"720\">Base materials and shaders for interaction visual feedback.<\/li><\/ul><h4 id=\"configure-input-actions\" class=\"code-line\" dir=\"auto\" data-line=\"722\">Configure Input Actions<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"724\">After import, an\u00a0<code>XRI Default Input Actions<\/code>\u00a0asset is added to\u00a0<code>Assets\/Samples\/XR Interaction Toolkit\/[version]\/Starter Assets\/<\/code>. This asset is pre-configured for standard controller profiles (including the Companion Controller via Microsoft MMRC Profile) and for hands.<\/p><p class=\"code-line\" dir=\"auto\" data-line=\"726\">To associate the asset with the system: go to\u00a0<strong>Edit &gt; Project Settings &gt; XR Plug-in Management &gt; Input System<\/strong>\u00a0and ensure\u00a0<strong>Active Input Handling<\/strong>\u00a0is set to\u00a0<code>Both<\/code>\u00a0or\u00a0<code>Input System Package (New)<\/code>.<\/p><hr class=\"code-line\" dir=\"auto\" data-line=\"728\" \/><h3 id=\"2-scene-configuration--xr-origin\" class=\"code-line\" dir=\"auto\" data-line=\"730\">2. Scene Configuration \u2014 XR Origin<\/h3><h4 id=\"base-scene-hierarchy\" class=\"code-line\" dir=\"auto\" data-line=\"732\">Base Scene Hierarchy<\/h4><pre><code class=\"code-line\" dir=\"auto\" data-line=\"734\">AR Session\nXR Origin (Action-based)\n  \u2514\u2500\u2500 Camera Offset\n        \u251c\u2500\u2500 Main Camera (tagged \"MainCamera\")\n        \u251c\u2500\u2500 LeftHand Controller\n        \u2502     \u251c\u2500\u2500 XR Ray Interactor (left)\n        \u2502     \u2514\u2500\u2500 XR Direct Interactor (left)\n        \u2514\u2500\u2500 RightHand Controller\n              \u251c\u2500\u2500 XR Ray Interactor (right)\n              \u2514\u2500\u2500 XR Direct Interactor (right)\n<\/code><\/pre><p class=\"code-line\" dir=\"auto\" data-line=\"747\">Create the base structure by selecting\u00a0<strong>GameObject &gt; XR &gt; XR Origin (Action-based)<\/strong>.<\/p><blockquote class=\"code-line\" dir=\"auto\" data-line=\"749\"><p class=\"code-line\" dir=\"auto\" data-line=\"749\"><strong>NOTE<\/strong>\u00a0Disable\u00a0<strong>AR Camera Background<\/strong>\u00a0\u2014 not supported on LeonardoXR and automatically disabled at runtime. Also disable\u00a0<strong>AR Camera Manager<\/strong>\u00a0if not retrieving RGB frames from the camera.<\/p><\/blockquote><h4 id=\"input-action-manager\" class=\"code-line\" dir=\"auto\" data-line=\"751\">Input Action Manager<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"753\">Add the\u00a0<strong>Input Action Manager<\/strong>\u00a0component to the XR Origin (or a persistent GameObject). In the\u00a0<strong>Action Assets<\/strong>\u00a0field, assign:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"755\"><li class=\"code-line\" dir=\"auto\" data-line=\"755\"><code>XR Input Actions<\/code>\u00a0(from\u00a0<code>Samples\/LeonardoXR SDK\/[version]\/Core Samples\/Shared Assets<\/code>).<\/li><\/ul><hr class=\"code-line\" dir=\"auto\" data-line=\"757\" \/><h3 id=\"3-xr-hands-configuration\" class=\"code-line\" dir=\"auto\" data-line=\"759\">3. XR Hands Configuration<\/h3><h4 id=\"installation-1\" class=\"code-line\" dir=\"auto\" data-line=\"761\">Installation<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"763\">Install via\u00a0<strong>Window &gt; Package Manager &gt; Unity Registry &gt; XR Hands &gt; Install<\/strong>\u00a0(version 1.7.2).<\/p><h4 id=\"import-hand-samples\" class=\"code-line\" dir=\"auto\" data-line=\"765\">Import Hand Samples<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"767\">Open\u00a0<strong>Window &gt; Package Manager &gt; In Project &gt; XR Hands &gt; Samples<\/strong>\u00a0and import:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"768\"><li class=\"code-line\" dir=\"auto\" data-line=\"768\"><strong>Gestures<\/strong>\u00a0\u2014 gesture recognition system.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"769\"><strong>Hand Visualizer<\/strong>\u00a0\u2014 hand mesh visualisation.<\/li><\/ul><h4 id=\"enable-hand-tracking-subsystem\" class=\"code-line\" dir=\"auto\" data-line=\"771\">Enable Hand Tracking Subsystem<\/h4><ol class=\"code-line\" dir=\"auto\" data-line=\"773\"><li class=\"code-line\" dir=\"auto\" data-line=\"773\">Go to\u00a0<strong>Edit &gt; Project Settings &gt; XR Plug-in Management &gt; OpenXR<\/strong>\u00a0(Android tab).<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"774\">Under\u00a0<strong>All Features<\/strong>, enable\u00a0<strong>Hand Tracking Subsystem<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"775\">Also enable\u00a0<strong>Hand Tracking<\/strong>\u00a0in the Snapdragon Spaces feature group.<\/li><\/ol><blockquote class=\"code-line\" dir=\"auto\" data-line=\"777\"><p class=\"code-line\" dir=\"auto\" data-line=\"777\"><strong>NOTE<\/strong>\u00a0The Hand Tracking Subsystem must be enabled in\u00a0<strong>All Features<\/strong>\u00a0\u2014 not just in the Snapdragon Spaces section \u2014 to work correctly on LeonardoXR.<\/p><\/blockquote><h4 id=\"hand-data-access-via-xr-hands-api\" class=\"code-line\" dir=\"auto\" data-line=\"779\">Hand Data Access via XR Hands API<\/h4><pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"781\"><span class=\"hljs-keyword\">using<\/span> UnityEngine.XR.Hands;\n\nXRHandSubsystem handSubsystem = XRHandSubsystemUtility.GetSubsystem();\n<span class=\"hljs-keyword\">if<\/span> (handSubsystem != <span class=\"hljs-literal\">null<\/span>)\n{\n    XRHand leftHand = handSubsystem.leftHand;\n    <span class=\"hljs-keyword\">if<\/span> (leftHand.isTracked)\n    {\n        <span class=\"hljs-keyword\">if<\/span> (leftHand.GetJoint(XRHandJointID.IndexTip).TryGetPose(<span class=\"hljs-keyword\">out<\/span> Pose indexTipPose))\n        {\n            <span class=\"hljs-comment\">\/\/ indexTipPose.position = position of left index fingertip<\/span>\n        }\n    }\n}\n<\/code><\/pre><h4 id=\"gesture-recognition\" class=\"code-line\" dir=\"auto\" data-line=\"798\">Gesture Recognition<\/h4><pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"800\">[<span class=\"hljs-meta\">SerializeField<\/span>] XRHandGestures gestures;\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">OnEnable<\/span>()<\/span>\n{\n    gestures.gesturePerformed += OnGesturePerformed;\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">OnGesturePerformed<\/span>(<span class=\"hljs-params\">XRHandGesture gesture, Handedness handedness<\/span>)<\/span>\n{\n    Debug.Log(<span class=\"hljs-string\">$\"Gesture: <span class=\"hljs-subst\">{gesture.gestureName}<\/span> performed with <span class=\"hljs-subst\">{handedness}<\/span>\"<\/span>);\n}\n<\/code><\/pre><hr class=\"code-line\" dir=\"auto\" data-line=\"814\" \/><h3 id=\"4-configuring-interactables\" class=\"code-line\" dir=\"auto\" data-line=\"816\">4. Configuring Interactables<\/h3><h4 id=\"adding-an-interactable-to-an-object\" class=\"code-line\" dir=\"auto\" data-line=\"818\">Adding an Interactable to an Object<\/h4><ol class=\"code-line\" dir=\"auto\" data-line=\"820\"><li class=\"code-line\" dir=\"auto\" data-line=\"820\">Add a\u00a0<strong>Collider<\/strong>\u00a0to the object (e.g. Box Collider).<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"821\">Add\u00a0<strong>XR Grab Interactable<\/strong>\u00a0for grabbable objects, or\u00a0<strong>XR Simple Interactable<\/strong>\u00a0for objects that receive events without being moved.<\/li><\/ol><pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"823\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyButton<\/span> : <span class=\"hljs-title\">MonoBehaviour<\/span>\n{\n    [<span class=\"hljs-meta\">SerializeField<\/span>] XRSimpleInteractable interactable;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">OnEnable<\/span>()<\/span>\n    {\n        interactable.selectEntered.AddListener(OnSelected);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">OnSelected<\/span>(<span class=\"hljs-params\">SelectEnterEventArgs args<\/span>)<\/span>\n    {\n        Debug.Log(<span class=\"hljs-string\">\"Selected by: \"<\/span> + args.interactorObject);\n    }\n}\n<\/code><\/pre><h4 id=\"interaction-layer-mask\" class=\"code-line\" dir=\"auto\" data-line=\"840\">Interaction Layer Mask<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"842\">XRIT 3.x uses\u00a0<strong>Interaction Layer Masks<\/strong>\u00a0to filter which interactors can interact with which interactables:<\/p><pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"844\">interactable.interactionLayers = InteractionLayerMask.GetMask(<span class=\"hljs-string\">\"Default\"<\/span>, <span class=\"hljs-string\">\"UI\"<\/span>);\n<\/code><\/pre><hr class=\"code-line\" dir=\"auto\" data-line=\"848\" \/><h3 id=\"5-ui-canvas-and-interaction\" class=\"code-line\" dir=\"auto\" data-line=\"850\">5. UI Canvas and Interaction<\/h3><h4 id=\"world-space-canvas\" class=\"code-line\" dir=\"auto\" data-line=\"852\">World Space Canvas<\/h4><ol class=\"code-line\" dir=\"auto\" data-line=\"854\"><li class=\"code-line\" dir=\"auto\" data-line=\"854\">Create a\u00a0<strong>Canvas<\/strong>\u00a0and set\u00a0<strong>Render Mode<\/strong>\u00a0to\u00a0<strong>World Space<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"855\">Add the\u00a0<strong>Tracked Device Graphic Raycaster<\/strong>\u00a0component to the Canvas (replaces the standard Graphic Raycaster).<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"856\">Add\u00a0<strong>XR UI Input Module<\/strong>\u00a0to the EventSystem GameObject in the scene (replaces the default Input System UI Input Module).<\/li><\/ol><h4 id=\"recommended-canvas-settings\" class=\"code-line\" dir=\"auto\" data-line=\"858\">Recommended Canvas Settings<\/h4><table class=\"code-line\" dir=\"auto\" data-line=\"860\"><thead class=\"code-line\" dir=\"auto\" data-line=\"860\"><tr class=\"code-line\" dir=\"auto\" data-line=\"860\"><th>Parameter<\/th><th>Recommended Value<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"862\"><tr class=\"code-line\" dir=\"auto\" data-line=\"862\"><td>Render Mode<\/td><td>World Space<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"863\"><td>Dynamic Pixels Per Unit<\/td><td>1<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"864\"><td>Reference Pixels Per Unit<\/td><td>100<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"865\"><td>Scale<\/td><td>0.001 (for a ~1m canvas = 1000 pixel units)<\/td><\/tr><\/tbody><\/table><hr class=\"code-line\" dir=\"auto\" data-line=\"867\" \/><h3 id=\"6-combining-controller-and-hand-tracking\" class=\"code-line\" dir=\"auto\" data-line=\"869\">6. Combining Controller and Hand Tracking<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"871\">On LeonardoXR it is not possible to simultaneously use headset Controllers and full Hand Tracking (with raycast from both hands) due to conflicts between OpenXR profiles.<\/p><h4 id=\"option-a--controller-only-companion-controller\" class=\"code-line\" dir=\"auto\" data-line=\"873\">Option A \u2014 Controller Only (Companion Controller)<\/h4><ul class=\"code-line\" dir=\"auto\" data-line=\"875\"><li class=\"code-line\" dir=\"auto\" data-line=\"875\">Add\u00a0<strong>Microsoft MMRC Profile<\/strong>\u00a0to enabled profiles.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"876\">Do not add Hand Interaction Profile.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"877\">The Companion Controller handles pointing; hands can be used as colliders but not as raycast interactors.<\/li><\/ul><h4 id=\"option-b--hands-only-dual-hand-mode\" class=\"code-line\" dir=\"auto\" data-line=\"879\">Option B \u2014 Hands Only (Dual Hand Mode)<\/h4><ul class=\"code-line\" dir=\"auto\" data-line=\"881\"><li class=\"code-line\" dir=\"auto\" data-line=\"881\">Add\u00a0<strong>Hand Interaction Profile<\/strong>\u00a0to enabled profiles.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"882\">Do not add Microsoft MMRC Profile.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"883\">Remove the Device Pointer Prefab from the Controller.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"884\">Both hands tracked as full interactors; no phone input.<\/li><\/ul><h4 id=\"option-c--controller--one-hand\" class=\"code-line\" dir=\"auto\" data-line=\"886\">Option C \u2014 Controller + One Hand<\/h4><ul class=\"code-line\" dir=\"auto\" data-line=\"888\"><li class=\"code-line\" dir=\"auto\" data-line=\"888\">Add\u00a0<strong>Microsoft MMRC Profile<\/strong>\u00a0to enabled profiles.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"889\">Keep only the Right Hand Controller active in the XR Origin.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"890\">The left hand can still function as a collider and poke interaction trigger, but not as a ray interactor.<\/li><\/ul><hr class=\"code-line\" dir=\"auto\" data-line=\"892\" \/><h3 id=\"7-unitask--asynchronous-operations\" class=\"code-line\" dir=\"auto\" data-line=\"894\">7. UniTask \u2014 Asynchronous Operations<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"896\">UniTask 2.5.10 is included as a dependency for high-performance async operations (asset loading, waiting for subsystems, etc.) without GC allocations.<\/p><pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"898\"><span class=\"hljs-keyword\">using<\/span> Cysharp.Threading.Tasks;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">HandSubsystemWaiter<\/span> : <span class=\"hljs-title\">MonoBehaviour<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">async<\/span> UniTaskVoid <span class=\"hljs-title\">Start<\/span>()<\/span>\n    {\n        <span class=\"hljs-comment\">\/\/ Wait until the XR Hands subsystem is ready<\/span>\n        <span class=\"hljs-keyword\">await<\/span> UniTask.WaitUntil(() =&gt;\n            XRHandSubsystemUtility.GetSubsystem()?.running ?? <span class=\"hljs-literal\">false<\/span>);\n        Debug.Log(<span class=\"hljs-string\">\"XR Hands subsystem ready.\"<\/span>);\n    }\n}\n<\/code><\/pre><p class=\"code-line\" dir=\"auto\" data-line=\"913\">UniTask is used internally by the LeonardoXR SDK for asynchronous operations. It is recommended to use it in application code as well for consistency with the SDK lifecycle.<\/p><h3 id=\"openxr-interaction-profile-reference\" class=\"code-line\" dir=\"auto\" data-line=\"915\">OpenXR Interaction Profile Reference<\/h3><table class=\"code-line\" dir=\"auto\" data-line=\"917\"><thead class=\"code-line\" dir=\"auto\" data-line=\"917\"><tr class=\"code-line\" dir=\"auto\" data-line=\"917\"><th>Profile<\/th><th>Use<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"919\"><tr class=\"code-line\" dir=\"auto\" data-line=\"919\"><td>Microsoft Mixed Reality Motion Controller Profile<\/td><td>Physical controllers interaction profile<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"920\"><td>Hand Interaction Profile<\/td><td>Hand tracking with poke\/pinch interactor<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"921\"><td>LeonardoXR Hand Interaction Profile<\/td><td>Hand tracking with poke\/pinch interactor<\/td><\/tr><\/tbody><\/table><blockquote class=\"code-line\" dir=\"auto\" data-line=\"923\"><p class=\"code-line\" dir=\"auto\" data-line=\"923\"><strong>NOTE<\/strong>\u00a0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA<\/p><\/blockquote><hr class=\"code-line\" dir=\"auto\" data-line=\"925\" \/><h2 id=\"06-advanced\" class=\"code-line\" dir=\"auto\" data-line=\"927\">06 Advanced<\/h2><p class=\"code-line\" dir=\"auto\" data-line=\"929\"><em>Version 1.0.2 | Device: Youbiquo Leonardo XR | Base SDK: Snapdragon Spaces 1.0.4<\/em><\/p><p class=\"code-line\" dir=\"auto\" data-line=\"931\">This section covers advanced configurations and features available on LeonardoXR, divided into general Snapdragon Spaces platform functionality and LeonardoXR proprietary advanced features.<\/p><hr class=\"code-line\" dir=\"auto\" data-line=\"933\" \/><h3 id=\"advanced--snapdragon-spaces\" class=\"code-line\" dir=\"auto\" data-line=\"935\">Advanced \u2014 Snapdragon Spaces<\/h3><h4 id=\"adding-a-new-interaction-profile\" class=\"code-line\" dir=\"auto\" data-line=\"937\">Adding a New Interaction Profile<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"939\">To use an interaction profile not included in the Snapdragon Spaces plugin:<\/p><ol class=\"code-line\" dir=\"auto\" data-line=\"941\"><li class=\"code-line\" dir=\"auto\" data-line=\"941\">Go to\u00a0<strong>Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Interaction Profiles<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"942\">Add the desired profile by clicking the\u00a0<strong>+<\/strong>\u00a0button.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"943\">Configure the corresponding Input Actions in the Input System Asset.<\/li><\/ol><h4 id=\"custom-controller\" class=\"code-line\" dir=\"auto\" data-line=\"945\">Custom Controller<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"947\">Describes how to build a custom Android controller archive (<code>.aar<\/code>) using the Custom Controller Package \u2014 the Android Studio project included in the developer package.<\/p><p class=\"code-line\" dir=\"auto\" data-line=\"949\"><strong>Process Overview<\/strong><\/p><ol class=\"code-line\" dir=\"auto\" data-line=\"951\"><li class=\"code-line\" dir=\"auto\" data-line=\"951\">Open the Android Studio project included in the Snapdragon Spaces developer package.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"952\">Modify the companion Activity as needed (layout, buttons, additional axes).<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"953\">Build the project to obtain a\u00a0<code>.aar<\/code>\u00a0file.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"954\">Import the\u00a0<code>.aar<\/code>\u00a0into the Unity project as a native Android plugin (in\u00a0<code>Assets\/Plugins\/Android<\/code>).<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"955\">Configure the Android manifest to declare the new Activity.<\/li><\/ol><blockquote class=\"code-line\" dir=\"auto\" data-line=\"957\"><p class=\"code-line\" dir=\"auto\" data-line=\"957\"><strong>NOTE<\/strong>\u00a0Adding a custom controller archive can cause Gradle caching errors. If build errors occur, delete the\u00a0<code>Temp\/gradleOut<\/code>\u00a0folder and rebuild.<\/p><\/blockquote><h4 id=\"display-refresh-rate\" class=\"code-line\" dir=\"auto\" data-line=\"959\">Display Refresh Rate<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"961\">The\u00a0<code>XR_EXT_display_refresh_rate<\/code>\u00a0extension allows querying and setting the display refresh rate at runtime.<\/p><p class=\"code-line\" dir=\"auto\" data-line=\"963\"><strong>Query Current Refresh Rate<\/strong><\/p><pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"965\"><span class=\"hljs-keyword\">using<\/span> Qualcomm.Snapdragon.Spaces;\n\nBaseRuntimeFeature baseRuntime = OpenXRSettings.Instance.GetFeature&lt;BaseRuntimeFeature&gt;();\n<span class=\"hljs-built_in\">float<\/span> currentHz = baseRuntime.GetDisplayRefreshRate();\nDebug.Log(<span class=\"hljs-string\">$\"Current refresh rate: <span class=\"hljs-subst\">{currentHz}<\/span> Hz\"<\/span>);\n<\/code><\/pre><p class=\"code-line\" dir=\"auto\" data-line=\"973\"><strong>Get Supported Refresh Rates<\/strong><\/p><pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"975\"><span class=\"hljs-built_in\">float<\/span>[] supportedRates = baseRuntime.GetSupportedDisplayRefreshRates();\n<span class=\"hljs-keyword\">foreach<\/span> (<span class=\"hljs-built_in\">float<\/span> rate <span class=\"hljs-keyword\">in<\/span> supportedRates)\n    Debug.Log(<span class=\"hljs-string\">$\"Supported: <span class=\"hljs-subst\">{rate}<\/span> Hz\"<\/span>);\n<\/code><\/pre><p class=\"code-line\" dir=\"auto\" data-line=\"981\"><strong>Set Refresh Rate<\/strong><\/p><pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"983\">baseRuntime.RequestDisplayRefreshRate(<span class=\"hljs-number\">90.0f<\/span>);\n<\/code><\/pre><blockquote class=\"code-line\" dir=\"auto\" data-line=\"987\"><p class=\"code-line\" dir=\"auto\" data-line=\"987\"><strong>NOTE<\/strong>\u00a0The requested refresh rate must be among those returned by\u00a0<code>GetSupportedDisplayRefreshRates()<\/code>. Unsupported values are ignored.<\/p><\/blockquote><h4 id=\"advanced-android-thread-performance\" class=\"code-line\" dir=\"auto\" data-line=\"989\">Advanced Android Thread Performance<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"991\">The\u00a0<code>SpacesThreadUtility<\/code>\u00a0component improves thread scheduling priority on Android, producing more consistent frame timing.<\/p><p class=\"code-line\" dir=\"auto\" data-line=\"993\"><strong>Setup<\/strong><\/p><p class=\"code-line\" dir=\"auto\" data-line=\"995\">Add the\u00a0<code>SpacesThreadUtility<\/code>\u00a0component to a persistent GameObject in the scene (e.g. the same GameObject hosting the AR Session or XR Origin). No configuration is required \u2014 it activates automatically on initialisation and acts on the main Unity threads.<\/p><p class=\"code-line\" dir=\"auto\" data-line=\"997\"><strong>When to Use<\/strong><\/p><p class=\"code-line\" dir=\"auto\" data-line=\"999\">Recommended for all LeonardoXR applications that exhibit framerate jitter or frame timing variability, especially in scenes with heavy rendering or many active AR subsystems.<\/p><h4 id=\"performance-settings\" class=\"code-line\" dir=\"auto\" data-line=\"1001\">Performance Settings<\/h4><p class=\"code-line\" dir=\"auto\" data-line=\"1003\">The OpenXR extension\u00a0<code>XR_EXT_performance_settings<\/code>\u00a0exposes performance level hints for CPU and GPU via a new method on\u00a0<code>BaseRuntimeFeature<\/code>.<\/p><table class=\"code-line\" dir=\"auto\" data-line=\"1005\"><thead class=\"code-line\" dir=\"auto\" data-line=\"1005\"><tr class=\"code-line\" dir=\"auto\" data-line=\"1005\"><th>Level<\/th><th>Description<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"1007\"><tr class=\"code-line\" dir=\"auto\" data-line=\"1007\"><td>PowerSavings<\/td><td>Reduces CPU\/GPU clocks to the minimum necessary. Useful for simple scenes or static UI.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"1008\"><td>SustainedLow<\/td><td>Sustained performance at a low level.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"1009\"><td>SustainedHigh<\/td><td>Sustained high-level performance. Recommended for most AR apps.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"1010\"><td>Boost<\/td><td>Maximum performance for short periods (not sustainably maintained).<\/td><\/tr><\/tbody><\/table><pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"1012\"><span class=\"hljs-keyword\">using<\/span> Qualcomm.Snapdragon.Spaces;\n<span class=\"hljs-keyword\">using<\/span> UnityEngine.XR.OpenXR;\n\nBaseRuntimeFeature baseRuntime = OpenXRSettings.Instance.GetFeature&lt;BaseRuntimeFeature&gt;();\nbaseRuntime.SetPerformanceLevel(PerformanceDomain.Cpu, PerformanceLevel.SustainedHigh);\nbaseRuntime.SetPerformanceLevel(PerformanceDomain.Gpu, PerformanceLevel.SustainedHigh);\n<\/code><\/pre><blockquote class=\"code-line\" dir=\"auto\" data-line=\"1021\"><p class=\"code-line\" dir=\"auto\" data-line=\"1021\"><strong>NOTE<\/strong>\u00a0The\u00a0<code>Boost<\/code>\u00a0level consumes significantly more power and may cause thermal throttling if sustained. Use it only for brief critical operations (e.g. loading a heavy scene).<\/p><\/blockquote><hr class=\"code-line\" dir=\"auto\" data-line=\"1023\" \/><h3 id=\"advanced--leonardoxr\" class=\"code-line\" dir=\"auto\" data-line=\"1025\">Advanced \u2014 LeonardoXR<\/h3><h4 id=\"qnn-inference-plugin--advanced-guide\" class=\"code-line\" dir=\"auto\" data-line=\"1027\">QNN Inference Plugin \u2014 Advanced Guide<\/h4><blockquote class=\"code-line\" dir=\"auto\" data-line=\"1029\"><p class=\"code-line\" dir=\"auto\" data-line=\"1029\"><strong>DOCUMENTATION IN PROGRESS<\/strong>\u00a0This section will cover advanced usage of the QNN (Qualcomm Neural Network) Inference Plugin on Leonardo XR, including:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"1030\"><li class=\"code-line\" dir=\"auto\" data-line=\"1030\">Model preparation and conversion (ONNX \u2192 QNN format).<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"1031\">Loading models at runtime via plugin APIs.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"1032\">Running inference on the NPU with input\/output tensor management.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"1033\">Memory management and throughput optimisation.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"1034\">Debug and performance profiling of inference.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"1035\">Use cases: object detection, pose estimation, real-time segmentation.<\/li><\/ul><p class=\"code-line\" dir=\"auto\" data-line=\"1037\">Detailed documentation will be available in a future release.<\/p><\/blockquote><h4 id=\"intercept-openxr-function--advanced-guide\" class=\"code-line\" dir=\"auto\" data-line=\"1039\">Intercept OpenXR Function \u2014 Advanced Guide<\/h4><blockquote class=\"code-line\" dir=\"auto\" data-line=\"1041\"><p class=\"code-line\" dir=\"auto\" data-line=\"1041\"><strong>DOCUMENTATION IN PROGRESS<\/strong>\u00a0This section will cover advanced usage of the Intercept OpenXR Function mechanism on Leonardo XR, including:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"1042\"><li class=\"code-line\" dir=\"auto\" data-line=\"1042\">Architecture of the OpenXR interception layer.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"1043\">Registering custom handlers for specific OpenXR functions.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"1044\">Use cases: rendering pipeline override, custom data injection into the XR layer, low-level OpenXR debugging.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"1045\">Safety and stability considerations.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"1046\">Interaction with other LeonardoXR SDK components.<\/li><\/ul><p class=\"code-line\" dir=\"auto\" data-line=\"1048\">This feature is intended for developers with direct experience of low-level OpenXR APIs. Detailed documentation will be available in a future release.<\/p><\/blockquote>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>LeonardoXR SDK Documentation LeonardoXR SDK Documentation \u2014 LeonardoXR SDK Youbiquo \u2014 LeonardoXR SDK \u2014 Developer Documentation \u00a0 \u00a0 SDK Version 1.0.2 Target Device Youbiquo Leonardo XR Spaces SDK Snapdragon Spaces 1.0.4 Unity Version 6000.0.58f2 Language English Document Index # Title Description 01 Getting Started Project setup, SDK installation, URP and Play-in-Editor configuration 02 VR \/ MR Manual project config, Passthrough, scene setup, lifecycle compatibility 03 Features Snapdragon Spaces features + LeonardoXR proprietary features 04 Samples Guide Overview of all available samples and how to run them 05 Interaction Package Guides XRIT 3.x, XR Hands, controllers and hand tracking 06 Advanced Display refresh rate, performance settings, custom controllers, QNN 01 Getting Started Version 1.0.2 | Device: Youbiquo Leonardo XR | Base SDK: Snapdragon Spaces 1.0.4 Introduction This guide explains how to configure a Unity project for development on Leonardo XR, the Youbiquo AR headset based on Snapdragon Spaces. The goal is to familiarise developers with the SDK configuration for building applications on Leonardo. The next guide covers how to interact with controllers and hands. Leonardo XR runs Android 12 and follows a development workflow familiar to anyone who has previously built Android applications. Required Software Before starting, make sure the following software and packages are installed at the specified versions: Software \/ Package Version Unity Hub Latest available Unity Editor 6000.0.58f2 LeonardoXR SDK 1.0.2 Snapdragon Spaces SDK 1.0.4 OpenXR Plugin 1.15.1 AR Foundation 6.2.1 XR Interaction Toolkit 3.3.0 XR Hands 1.7.2 UniTask 2.5.10 VS Code, Visual Studio or similar IDE \u2014 NOTE\u00a0Unlike the base Snapdragon Spaces guide (which recommends v1.10.0 for Unity 2022), Unity 6 with LeonardoXR uses OpenXR 1.15.1. Do not modify this version manually \u2014 the Package Manager handles it through the SDK dependencies. Create a New Project Open Unity Hub and click\u00a0New Project. Select the\u00a0Universal 3D\u00a0template. Name the project (e.g.\u00a0LeonardoXR_Test) and choose a destination folder. Click\u00a0Create Project. After creation, Unity opens the project with a sample scene in the Hierarchy panel. Switch Platform to Android From the main menu select\u00a0File &gt; Build Profiles. In the Build Profiles window select\u00a0Android\u00a0from the Platform list. Click\u00a0Switch Platform\u00a0and wait for the process to complete. Close the Build Profiles window. Install Snapdragon Spaces SDK IMPORTANT\u00a0Snapdragon Spaces SDK\u00a0must be installed before\u00a0the LeonardoXR SDK. The LeonardoXR runtime depends on it and will not compile without it. Download Snapdragon Spaces SDK v1.0.4 from the Qualcomm developer portal (a developer account is required):\u00a0https:\/\/spaces.qualcomm.com\/developer\/vr-mr-sdk\/#downloads Open the Package Manager (Window &gt; Package Manager). Click\u00a0+\u00a0and select\u00a0Add package from tarball\u2026 Browse to the downloaded\u00a0.tgz\u00a0file and click\u00a0Open. Installation will start automatically. During installation, two prompts may appear: &#8220;Enable the new input system?&#8221; \u2192 click\u00a0Yes. &#8220;XR Interaction Layer Mask Update Required&#8221; \u2192 for a new project, click\u00a0I Made a Backup, Go Ahead! NOTE\u00a0The editor will restart after installation \u2014 this is expected behaviour, not a crash. For version control, copy the\u00a0.tgz\u00a0into the project&#8217;s\u00a0Packages\/\u00a0folder before adding it; the manifest will then use a relative path, which is better for source control. Unity 6.3+ \u2014 Known Spaces SDK issue:\u00a0After installation you may see the following compile error: BaseRuntimeFeature.InterceptEnvironmentBlendMode.cs(15,10): error CS0592: Attribute &#8216;SerializeField&#8217; is not valid on this declaration type. To fix it, double-click the error in the Console to open the file, then remove the\u00a0[SerializeField]\u00a0attribute on line 15. This is a bug in Snapdragon Spaces 1.0.4 that only surfaces on Unity 6.3 and above. Install LeonardoXR SDK Download LeonardoXR SDK v1.0.2 from the Youbiquo Developer area. Open the Package Manager (Window &gt; Package Manager). Click\u00a0+\u00a0and select\u00a0Add package from tarball\u2026 Browse to the LeonardoXR SDK\u00a0.tgz\u00a0file and click\u00a0Open. The SDK will be installed together with its dependencies:\u00a0OpenXR Plugin 1.15.1,\u00a0AR Foundation 6.2.1,\u00a0XR Interaction Toolkit 3.3.0, and\u00a0XR Hands 1.7.2\u00a0\u2014 no manual installation of these packages is required. LeonardoXR SDK Manager After the LeonardoXR SDK is installed, a\u00a0LeonardoXR SDK Manager\u00a0window opens automatically. If it does not appear, open it from\u00a0LeonardoXR &gt; SDK Manager\u00a0in the menu bar. The window has two tabs: Setup tab\u00a0\u2014 displays the status of the two packages that cannot be resolved automatically: Package Status Action Snapdragon Spaces SDK 1.0.4 \u2713 \/ \u2717 Browse\u2026\u00a0\u2014 opens a file picker to select the\u00a0.tgz\u00a0and installs it via Package Manager UniTask 2.5.10 \u2713 \/ \u2717 Install\u00a0\u2014 installs UniTask directly from the official Cysharp Git repository Once both packages show \u2713, the setup is complete. Use the\u00a0\u21ba Refresh\u00a0button at any time to re-check the current state. About tab\u00a0\u2014 displays version information for the SDK, device, and Unity Editor. Configure XR Plugin Management and OpenXR Open Project Settings Go to\u00a0Edit &gt; Project Settings\u00a0and select\u00a0XR Plug-in Management\u00a0in the left sidebar. Enable OpenXR and Snapdragon Spaces Click the\u00a0Android\u00a0tab (top right of the window). Under\u00a0Plug-in Providers, ensure both are checked:\u00a0OpenXR\u00a0and\u00a0Snapdragon Spaces feature group. Configure OpenXR Features Click\u00a0OpenXR\u00a0in the left sidebar. In the Snapdragon Spaces feature list, enable only\u00a0Base Runtime\u00a0and disable all others. Advanced features (Hit Testing, Plane Detection, etc.) can be enabled later as needed. NOTE\u00a0For Hand Tracking to work correctly on LeonardoXR, the\u00a0Hand Tracking Subsystem\u00a0option must be enabled in the\u00a0All Features\u00a0section of OpenXR. Add LeonardoXR Feature Group Return to\u00a0XR Plug-in Management &gt; Android. In the Plug-in Providers list, also check\u00a0LeonardoXR feature group. Run Project Validation In the Project Settings sidebar click\u00a0Project Validation. The window shows a list of configuration errors to fix. Click\u00a0Fix All\u00a0to resolve them automatically. NOTE\u00a0Some fixes may require an editor restart. Re-run validation after restarting to confirm all errors are resolved. Import Samples Before creating your own scenes it is useful to import the samples included in each package. For each package: open\u00a0Window &gt; Package Manager, select\u00a0In Project, select the package, expand the\u00a0Samples\u00a0section and click\u00a0Import. Package Samples XR Hands Gestures, Hand Visualizer XR Interaction Toolkit Starter Assets, Hand Interaction Demo Snapdragon Spaces Core Samples LeonardoXR Core Samples, Documentation After importing all samples, add scenes to the build via\u00a0Window &gt; XR &gt; Snapdragon Spaces &gt; Add Scenes to Build Settings. Configure URP Graphics and Quality Settings Open\u00a0Edit &gt; Project Settings &gt; Graphics. Under\u00a0Default Render Pipeline, click the circle and select\u00a0Mobile_RPAsset. Go to\u00a0Project Settings &gt; Quality. In the Levels section, ensure\u00a0Mobile\u00a0has a green checkbox in the Android column. If not, click the\u00a0Default\u00a0triangle under Android<\/p>\n","protected":false},"author":11,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1153","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>LeonardoXR SDK Documentation - Geckode!<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.youbiquo.eu\/geckode\/en\/leonardoxr-sdk-documentation\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"LeonardoXR SDK Documentation - Geckode!\" \/>\n<meta property=\"og:description\" content=\"LeonardoXR SDK Documentation LeonardoXR SDK Documentation \u2014 LeonardoXR SDK Youbiquo \u2014 LeonardoXR SDK \u2014 Developer Documentation \u00a0 \u00a0 SDK Version 1.0.2 Target Device Youbiquo Leonardo XR Spaces SDK Snapdragon Spaces 1.0.4 Unity Version 6000.0.58f2 Language English Document Index # Title Description 01 Getting Started Project setup, SDK installation, URP and Play-in-Editor configuration 02 VR \/ MR Manual project config, Passthrough, scene setup, lifecycle compatibility 03 Features Snapdragon Spaces features + LeonardoXR proprietary features 04 Samples Guide Overview of all available samples and how to run them 05 Interaction Package Guides XRIT 3.x, XR Hands, controllers and hand tracking 06 Advanced Display refresh rate, performance settings, custom controllers, QNN 01 Getting Started Version 1.0.2 | Device: Youbiquo Leonardo XR | Base SDK: Snapdragon Spaces 1.0.4 Introduction This guide explains how to configure a Unity project for development on Leonardo XR, the Youbiquo AR headset based on Snapdragon Spaces. The goal is to familiarise developers with the SDK configuration for building applications on Leonardo. The next guide covers how to interact with controllers and hands. Leonardo XR runs Android 12 and follows a development workflow familiar to anyone who has previously built Android applications. Required Software Before starting, make sure the following software and packages are installed at the specified versions: Software \/ Package Version Unity Hub Latest available Unity Editor 6000.0.58f2 LeonardoXR SDK 1.0.2 Snapdragon Spaces SDK 1.0.4 OpenXR Plugin 1.15.1 AR Foundation 6.2.1 XR Interaction Toolkit 3.3.0 XR Hands 1.7.2 UniTask 2.5.10 VS Code, Visual Studio or similar IDE \u2014 NOTE\u00a0Unlike the base Snapdragon Spaces guide (which recommends v1.10.0 for Unity 2022), Unity 6 with LeonardoXR uses OpenXR 1.15.1. Do not modify this version manually \u2014 the Package Manager handles it through the SDK dependencies. Create a New Project Open Unity Hub and click\u00a0New Project. Select the\u00a0Universal 3D\u00a0template. Name the project (e.g.\u00a0LeonardoXR_Test) and choose a destination folder. Click\u00a0Create Project. After creation, Unity opens the project with a sample scene in the Hierarchy panel. Switch Platform to Android From the main menu select\u00a0File &gt; Build Profiles. In the Build Profiles window select\u00a0Android\u00a0from the Platform list. Click\u00a0Switch Platform\u00a0and wait for the process to complete. Close the Build Profiles window. Install Snapdragon Spaces SDK IMPORTANT\u00a0Snapdragon Spaces SDK\u00a0must be installed before\u00a0the LeonardoXR SDK. The LeonardoXR runtime depends on it and will not compile without it. Download Snapdragon Spaces SDK v1.0.4 from the Qualcomm developer portal (a developer account is required):\u00a0https:\/\/spaces.qualcomm.com\/developer\/vr-mr-sdk\/#downloads Open the Package Manager (Window &gt; Package Manager). Click\u00a0+\u00a0and select\u00a0Add package from tarball\u2026 Browse to the downloaded\u00a0.tgz\u00a0file and click\u00a0Open. Installation will start automatically. During installation, two prompts may appear: &#8220;Enable the new input system?&#8221; \u2192 click\u00a0Yes. &#8220;XR Interaction Layer Mask Update Required&#8221; \u2192 for a new project, click\u00a0I Made a Backup, Go Ahead! NOTE\u00a0The editor will restart after installation \u2014 this is expected behaviour, not a crash. For version control, copy the\u00a0.tgz\u00a0into the project&#8217;s\u00a0Packages\/\u00a0folder before adding it; the manifest will then use a relative path, which is better for source control. Unity 6.3+ \u2014 Known Spaces SDK issue:\u00a0After installation you may see the following compile error: BaseRuntimeFeature.InterceptEnvironmentBlendMode.cs(15,10): error CS0592: Attribute &#039;SerializeField&#039; is not valid on this declaration type. To fix it, double-click the error in the Console to open the file, then remove the\u00a0[SerializeField]\u00a0attribute on line 15. This is a bug in Snapdragon Spaces 1.0.4 that only surfaces on Unity 6.3 and above. Install LeonardoXR SDK Download LeonardoXR SDK v1.0.2 from the Youbiquo Developer area. Open the Package Manager (Window &gt; Package Manager). Click\u00a0+\u00a0and select\u00a0Add package from tarball\u2026 Browse to the LeonardoXR SDK\u00a0.tgz\u00a0file and click\u00a0Open. The SDK will be installed together with its dependencies:\u00a0OpenXR Plugin 1.15.1,\u00a0AR Foundation 6.2.1,\u00a0XR Interaction Toolkit 3.3.0, and\u00a0XR Hands 1.7.2\u00a0\u2014 no manual installation of these packages is required. LeonardoXR SDK Manager After the LeonardoXR SDK is installed, a\u00a0LeonardoXR SDK Manager\u00a0window opens automatically. If it does not appear, open it from\u00a0LeonardoXR &gt; SDK Manager\u00a0in the menu bar. The window has two tabs: Setup tab\u00a0\u2014 displays the status of the two packages that cannot be resolved automatically: Package Status Action Snapdragon Spaces SDK 1.0.4 \u2713 \/ \u2717 Browse\u2026\u00a0\u2014 opens a file picker to select the\u00a0.tgz\u00a0and installs it via Package Manager UniTask 2.5.10 \u2713 \/ \u2717 Install\u00a0\u2014 installs UniTask directly from the official Cysharp Git repository Once both packages show \u2713, the setup is complete. Use the\u00a0\u21ba Refresh\u00a0button at any time to re-check the current state. About tab\u00a0\u2014 displays version information for the SDK, device, and Unity Editor. Configure XR Plugin Management and OpenXR Open Project Settings Go to\u00a0Edit &gt; Project Settings\u00a0and select\u00a0XR Plug-in Management\u00a0in the left sidebar. Enable OpenXR and Snapdragon Spaces Click the\u00a0Android\u00a0tab (top right of the window). Under\u00a0Plug-in Providers, ensure both are checked:\u00a0OpenXR\u00a0and\u00a0Snapdragon Spaces feature group. Configure OpenXR Features Click\u00a0OpenXR\u00a0in the left sidebar. In the Snapdragon Spaces feature list, enable only\u00a0Base Runtime\u00a0and disable all others. Advanced features (Hit Testing, Plane Detection, etc.) can be enabled later as needed. NOTE\u00a0For Hand Tracking to work correctly on LeonardoXR, the\u00a0Hand Tracking Subsystem\u00a0option must be enabled in the\u00a0All Features\u00a0section of OpenXR. Add LeonardoXR Feature Group Return to\u00a0XR Plug-in Management &gt; Android. In the Plug-in Providers list, also check\u00a0LeonardoXR feature group. Run Project Validation In the Project Settings sidebar click\u00a0Project Validation. The window shows a list of configuration errors to fix. Click\u00a0Fix All\u00a0to resolve them automatically. NOTE\u00a0Some fixes may require an editor restart. Re-run validation after restarting to confirm all errors are resolved. Import Samples Before creating your own scenes it is useful to import the samples included in each package. For each package: open\u00a0Window &gt; Package Manager, select\u00a0In Project, select the package, expand the\u00a0Samples\u00a0section and click\u00a0Import. Package Samples XR Hands Gestures, Hand Visualizer XR Interaction Toolkit Starter Assets, Hand Interaction Demo Snapdragon Spaces Core Samples LeonardoXR Core Samples, Documentation After importing all samples, add scenes to the build via\u00a0Window &gt; XR &gt; Snapdragon Spaces &gt; Add Scenes to Build Settings. Configure URP Graphics and Quality Settings Open\u00a0Edit &gt; Project Settings &gt; Graphics. Under\u00a0Default Render Pipeline, click the circle and select\u00a0Mobile_RPAsset. Go to\u00a0Project Settings &gt; Quality. In the Levels section, ensure\u00a0Mobile\u00a0has a green checkbox in the Android column. If not, click the\u00a0Default\u00a0triangle under Android\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.youbiquo.eu\/geckode\/en\/leonardoxr-sdk-documentation\/\" \/>\n<meta property=\"og:site_name\" content=\"Geckode!\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-09T13:49:54+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"18 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/en\/leonardoxr-sdk-documentation\/\",\"url\":\"https:\/\/www.youbiquo.eu\/geckode\/en\/leonardoxr-sdk-documentation\/\",\"name\":\"LeonardoXR SDK Documentation - Geckode!\",\"isPartOf\":{\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/#website\"},\"datePublished\":\"2026-04-09T13:47:41+00:00\",\"dateModified\":\"2026-04-09T13:49:54+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/en\/leonardoxr-sdk-documentation\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.youbiquo.eu\/geckode\/en\/leonardoxr-sdk-documentation\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/en\/leonardoxr-sdk-documentation\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.youbiquo.eu\/geckode\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"LeonardoXR SDK Documentation\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/#website\",\"url\":\"https:\/\/www.youbiquo.eu\/geckode\/\",\"name\":\"Geckode!\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.youbiquo.eu\/geckode\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/#organization\",\"name\":\"Geckode!\",\"url\":\"https:\/\/www.youbiquo.eu\/geckode\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.youbiquo.eu\/geckode\/wp-content\/uploads\/sites\/7\/2026\/02\/Gemini_Generated_Image_ns1dvvns1dvvns1d-e1774014413830.png\",\"contentUrl\":\"https:\/\/www.youbiquo.eu\/geckode\/wp-content\/uploads\/sites\/7\/2026\/02\/Gemini_Generated_Image_ns1dvvns1dvvns1d-e1774014413830.png\",\"width\":778,\"height\":778,\"caption\":\"Geckode!\"},\"image\":{\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"LeonardoXR SDK Documentation - Geckode!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.youbiquo.eu\/geckode\/en\/leonardoxr-sdk-documentation\/","og_locale":"en_US","og_type":"article","og_title":"LeonardoXR SDK Documentation - Geckode!","og_description":"LeonardoXR SDK Documentation LeonardoXR SDK Documentation \u2014 LeonardoXR SDK Youbiquo \u2014 LeonardoXR SDK \u2014 Developer Documentation \u00a0 \u00a0 SDK Version 1.0.2 Target Device Youbiquo Leonardo XR Spaces SDK Snapdragon Spaces 1.0.4 Unity Version 6000.0.58f2 Language English Document Index # Title Description 01 Getting Started Project setup, SDK installation, URP and Play-in-Editor configuration 02 VR \/ MR Manual project config, Passthrough, scene setup, lifecycle compatibility 03 Features Snapdragon Spaces features + LeonardoXR proprietary features 04 Samples Guide Overview of all available samples and how to run them 05 Interaction Package Guides XRIT 3.x, XR Hands, controllers and hand tracking 06 Advanced Display refresh rate, performance settings, custom controllers, QNN 01 Getting Started Version 1.0.2 | Device: Youbiquo Leonardo XR | Base SDK: Snapdragon Spaces 1.0.4 Introduction This guide explains how to configure a Unity project for development on Leonardo XR, the Youbiquo AR headset based on Snapdragon Spaces. The goal is to familiarise developers with the SDK configuration for building applications on Leonardo. The next guide covers how to interact with controllers and hands. Leonardo XR runs Android 12 and follows a development workflow familiar to anyone who has previously built Android applications. Required Software Before starting, make sure the following software and packages are installed at the specified versions: Software \/ Package Version Unity Hub Latest available Unity Editor 6000.0.58f2 LeonardoXR SDK 1.0.2 Snapdragon Spaces SDK 1.0.4 OpenXR Plugin 1.15.1 AR Foundation 6.2.1 XR Interaction Toolkit 3.3.0 XR Hands 1.7.2 UniTask 2.5.10 VS Code, Visual Studio or similar IDE \u2014 NOTE\u00a0Unlike the base Snapdragon Spaces guide (which recommends v1.10.0 for Unity 2022), Unity 6 with LeonardoXR uses OpenXR 1.15.1. Do not modify this version manually \u2014 the Package Manager handles it through the SDK dependencies. Create a New Project Open Unity Hub and click\u00a0New Project. Select the\u00a0Universal 3D\u00a0template. Name the project (e.g.\u00a0LeonardoXR_Test) and choose a destination folder. Click\u00a0Create Project. After creation, Unity opens the project with a sample scene in the Hierarchy panel. Switch Platform to Android From the main menu select\u00a0File &gt; Build Profiles. In the Build Profiles window select\u00a0Android\u00a0from the Platform list. Click\u00a0Switch Platform\u00a0and wait for the process to complete. Close the Build Profiles window. Install Snapdragon Spaces SDK IMPORTANT\u00a0Snapdragon Spaces SDK\u00a0must be installed before\u00a0the LeonardoXR SDK. The LeonardoXR runtime depends on it and will not compile without it. Download Snapdragon Spaces SDK v1.0.4 from the Qualcomm developer portal (a developer account is required):\u00a0https:\/\/spaces.qualcomm.com\/developer\/vr-mr-sdk\/#downloads Open the Package Manager (Window &gt; Package Manager). Click\u00a0+\u00a0and select\u00a0Add package from tarball\u2026 Browse to the downloaded\u00a0.tgz\u00a0file and click\u00a0Open. Installation will start automatically. During installation, two prompts may appear: &#8220;Enable the new input system?&#8221; \u2192 click\u00a0Yes. &#8220;XR Interaction Layer Mask Update Required&#8221; \u2192 for a new project, click\u00a0I Made a Backup, Go Ahead! NOTE\u00a0The editor will restart after installation \u2014 this is expected behaviour, not a crash. For version control, copy the\u00a0.tgz\u00a0into the project&#8217;s\u00a0Packages\/\u00a0folder before adding it; the manifest will then use a relative path, which is better for source control. Unity 6.3+ \u2014 Known Spaces SDK issue:\u00a0After installation you may see the following compile error: BaseRuntimeFeature.InterceptEnvironmentBlendMode.cs(15,10): error CS0592: Attribute 'SerializeField' is not valid on this declaration type. To fix it, double-click the error in the Console to open the file, then remove the\u00a0[SerializeField]\u00a0attribute on line 15. This is a bug in Snapdragon Spaces 1.0.4 that only surfaces on Unity 6.3 and above. Install LeonardoXR SDK Download LeonardoXR SDK v1.0.2 from the Youbiquo Developer area. Open the Package Manager (Window &gt; Package Manager). Click\u00a0+\u00a0and select\u00a0Add package from tarball\u2026 Browse to the LeonardoXR SDK\u00a0.tgz\u00a0file and click\u00a0Open. The SDK will be installed together with its dependencies:\u00a0OpenXR Plugin 1.15.1,\u00a0AR Foundation 6.2.1,\u00a0XR Interaction Toolkit 3.3.0, and\u00a0XR Hands 1.7.2\u00a0\u2014 no manual installation of these packages is required. LeonardoXR SDK Manager After the LeonardoXR SDK is installed, a\u00a0LeonardoXR SDK Manager\u00a0window opens automatically. If it does not appear, open it from\u00a0LeonardoXR &gt; SDK Manager\u00a0in the menu bar. The window has two tabs: Setup tab\u00a0\u2014 displays the status of the two packages that cannot be resolved automatically: Package Status Action Snapdragon Spaces SDK 1.0.4 \u2713 \/ \u2717 Browse\u2026\u00a0\u2014 opens a file picker to select the\u00a0.tgz\u00a0and installs it via Package Manager UniTask 2.5.10 \u2713 \/ \u2717 Install\u00a0\u2014 installs UniTask directly from the official Cysharp Git repository Once both packages show \u2713, the setup is complete. Use the\u00a0\u21ba Refresh\u00a0button at any time to re-check the current state. About tab\u00a0\u2014 displays version information for the SDK, device, and Unity Editor. Configure XR Plugin Management and OpenXR Open Project Settings Go to\u00a0Edit &gt; Project Settings\u00a0and select\u00a0XR Plug-in Management\u00a0in the left sidebar. Enable OpenXR and Snapdragon Spaces Click the\u00a0Android\u00a0tab (top right of the window). Under\u00a0Plug-in Providers, ensure both are checked:\u00a0OpenXR\u00a0and\u00a0Snapdragon Spaces feature group. Configure OpenXR Features Click\u00a0OpenXR\u00a0in the left sidebar. In the Snapdragon Spaces feature list, enable only\u00a0Base Runtime\u00a0and disable all others. Advanced features (Hit Testing, Plane Detection, etc.) can be enabled later as needed. NOTE\u00a0For Hand Tracking to work correctly on LeonardoXR, the\u00a0Hand Tracking Subsystem\u00a0option must be enabled in the\u00a0All Features\u00a0section of OpenXR. Add LeonardoXR Feature Group Return to\u00a0XR Plug-in Management &gt; Android. In the Plug-in Providers list, also check\u00a0LeonardoXR feature group. Run Project Validation In the Project Settings sidebar click\u00a0Project Validation. The window shows a list of configuration errors to fix. Click\u00a0Fix All\u00a0to resolve them automatically. NOTE\u00a0Some fixes may require an editor restart. Re-run validation after restarting to confirm all errors are resolved. Import Samples Before creating your own scenes it is useful to import the samples included in each package. For each package: open\u00a0Window &gt; Package Manager, select\u00a0In Project, select the package, expand the\u00a0Samples\u00a0section and click\u00a0Import. Package Samples XR Hands Gestures, Hand Visualizer XR Interaction Toolkit Starter Assets, Hand Interaction Demo Snapdragon Spaces Core Samples LeonardoXR Core Samples, Documentation After importing all samples, add scenes to the build via\u00a0Window &gt; XR &gt; Snapdragon Spaces &gt; Add Scenes to Build Settings. Configure URP Graphics and Quality Settings Open\u00a0Edit &gt; Project Settings &gt; Graphics. Under\u00a0Default Render Pipeline, click the circle and select\u00a0Mobile_RPAsset. Go to\u00a0Project Settings &gt; Quality. In the Levels section, ensure\u00a0Mobile\u00a0has a green checkbox in the Android column. If not, click the\u00a0Default\u00a0triangle under Android","og_url":"https:\/\/www.youbiquo.eu\/geckode\/en\/leonardoxr-sdk-documentation\/","og_site_name":"Geckode!","article_modified_time":"2026-04-09T13:49:54+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"18 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.youbiquo.eu\/geckode\/en\/leonardoxr-sdk-documentation\/","url":"https:\/\/www.youbiquo.eu\/geckode\/en\/leonardoxr-sdk-documentation\/","name":"LeonardoXR SDK Documentation - Geckode!","isPartOf":{"@id":"https:\/\/www.youbiquo.eu\/geckode\/#website"},"datePublished":"2026-04-09T13:47:41+00:00","dateModified":"2026-04-09T13:49:54+00:00","breadcrumb":{"@id":"https:\/\/www.youbiquo.eu\/geckode\/en\/leonardoxr-sdk-documentation\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.youbiquo.eu\/geckode\/en\/leonardoxr-sdk-documentation\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.youbiquo.eu\/geckode\/en\/leonardoxr-sdk-documentation\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.youbiquo.eu\/geckode\/"},{"@type":"ListItem","position":2,"name":"LeonardoXR SDK Documentation"}]},{"@type":"WebSite","@id":"https:\/\/www.youbiquo.eu\/geckode\/#website","url":"https:\/\/www.youbiquo.eu\/geckode\/","name":"Geckode!","description":"","publisher":{"@id":"https:\/\/www.youbiquo.eu\/geckode\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.youbiquo.eu\/geckode\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.youbiquo.eu\/geckode\/#organization","name":"Geckode!","url":"https:\/\/www.youbiquo.eu\/geckode\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.youbiquo.eu\/geckode\/#\/schema\/logo\/image\/","url":"https:\/\/www.youbiquo.eu\/geckode\/wp-content\/uploads\/sites\/7\/2026\/02\/Gemini_Generated_Image_ns1dvvns1dvvns1d-e1774014413830.png","contentUrl":"https:\/\/www.youbiquo.eu\/geckode\/wp-content\/uploads\/sites\/7\/2026\/02\/Gemini_Generated_Image_ns1dvvns1dvvns1d-e1774014413830.png","width":778,"height":778,"caption":"Geckode!"},"image":{"@id":"https:\/\/www.youbiquo.eu\/geckode\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/pages\/1153","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/comments?post=1153"}],"version-history":[{"count":7,"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/pages\/1153\/revisions"}],"predecessor-version":[{"id":1160,"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/pages\/1153\/revisions\/1160"}],"wp:attachment":[{"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/media?parent=1153"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}