{"id":996,"date":"2026-04-09T11:07:29","date_gmt":"2026-04-09T09:07:29","guid":{"rendered":"https:\/\/www.youbiquo.eu\/geckode\/?page_id=996"},"modified":"2026-04-09T13:22:24","modified_gmt":"2026-04-09T11:22:24","slug":"features-2","status":"publish","type":"page","link":"https:\/\/www.youbiquo.eu\/geckode\/en\/features-2\/","title":{"rendered":"Features"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"996\" class=\"elementor elementor-996\" 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\">Features<\/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\tFeatures \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<h3 id=\"features\" class=\"code-line\" dir=\"auto\" data-line=\"0\">Features<\/h3><ul><li class=\"code-line\" dir=\"auto\" data-line=\"2\"><em><strong>Version<\/strong> 1.0.2<\/em><\/li><li class=\"code-line\" dir=\"auto\" data-line=\"2\"><em><strong>Device:<\/strong> Youbiquo Leonardo XR<\/em><\/li><li class=\"code-line\" dir=\"auto\" data-line=\"2\"><em><strong> Base SDK:<\/strong> Snapdragon Spaces 1.0.4<\/em><\/li><\/ul><p class=\"code-line\" dir=\"auto\" data-line=\"4\">This page documents the features available in the LeonardoXR SDK, organised in two sections:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"6\"><li class=\"code-line\" dir=\"auto\" data-line=\"6\"><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=\"7\"><strong>LeonardoXR Features<\/strong>\u00a0\u2014 proprietary features specific to Leonardo XR.<\/li><\/ul><hr class=\"code-line\" dir=\"auto\" data-line=\"9\" \/><h4 id=\"snapdragon-spaces-features\" class=\"code-line\" dir=\"auto\" data-line=\"11\">Snapdragon Spaces Features<\/h4><h5 id=\"local-anchors\" class=\"code-line\" dir=\"auto\" data-line=\"13\">Local Anchors<\/h5><p class=\"code-line\" dir=\"auto\" data-line=\"15\"><strong>How to Enable<\/strong><\/p><p class=\"code-line\" dir=\"auto\" data-line=\"17\">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=\"19\"><strong>Spaces Anchor Store<\/strong><\/p><blockquote class=\"code-line\" dir=\"auto\" data-line=\"21\"><p class=\"code-line\" dir=\"auto\" data-line=\"21\"><strong>NOTE<\/strong> Look 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><pre><span style=\"color: #003366;\"><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"23\"><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}<\/code><\/span><\/pre><\/blockquote><p class=\"code-line\" dir=\"auto\" data-line=\"40\"><strong>API Reference<\/strong><\/p><table class=\"code-line\" dir=\"auto\" data-line=\"42\"><thead class=\"code-line\" dir=\"auto\" data-line=\"42\"><tr class=\"code-line\" dir=\"auto\" data-line=\"42\"><th>Method<\/th><th>Description<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"44\"><tr class=\"code-line\" dir=\"auto\" data-line=\"44\"><td><code>ClearStore()<\/code><\/td><td>Clears the local anchor storage.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"45\"><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=\"46\"><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=\"47\"><td><code>DeleteSavedAnchor(name)<\/code><\/td><td>Deletes a saved anchor by name.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"48\"><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=\"49\"><td><code>LoadAllSavedAnchors(...)<\/code><\/td><td>Loads all stored anchors.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"50\"><td><code>GetSavedAnchorNames()<\/code><\/td><td>Returns all saved anchor names.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"51\"><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=\"53\"><strong>SaveAnchorResult Values<\/strong><\/p><table class=\"code-line\" dir=\"auto\" data-line=\"55\"><thead class=\"code-line\" dir=\"auto\" data-line=\"55\"><tr class=\"code-line\" dir=\"auto\" data-line=\"55\"><th>Value<\/th><th>Meaning<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"57\"><tr class=\"code-line\" dir=\"auto\" data-line=\"57\"><td><code>PENDING<\/code><\/td><td>Anchor is awaiting save.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"58\"><td><code>SAVED<\/code><\/td><td>Successfully saved.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"59\"><td><code>FAILURE_RUNTIME_ERROR<\/code><\/td><td>Runtime error.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"60\"><td><code>FAILURE_STORE_NOT_LOADED<\/code><\/td><td>Anchor Store failed to load.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"61\"><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=\"63\" \/><h5 id=\"hit-testing\" class=\"code-line\" dir=\"auto\" data-line=\"65\">Hit Testing<\/h5><p class=\"code-line\" dir=\"auto\" data-line=\"67\">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=\"69\">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=\"71\"><span style=\"color: #003366;\">List&lt;ARRaycastHit&gt; hits = new List&lt;ARRaycastHit&gt;();<\/span><br \/><span style=\"color: #003366;\">if (raycastManager.Raycast(screenCenter, hits, TrackableType.PlaneWithinPolygon))<\/span><br \/><span style=\"color: #003366;\">{<\/span><br \/><span style=\"color: #003366;\">Pose hitPose = hits[0].pose;<\/span><br \/><span style=\"color: #003366;\">\/\/ Place AR content at hitPose.position<\/span><br \/><span style=\"color: #003366;\">}<\/span>\n<\/code><\/pre><blockquote class=\"code-line\" dir=\"auto\" data-line=\"80\"><p class=\"code-line\" dir=\"auto\" data-line=\"80\"><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=\"82\" \/><h3 id=\"image-tracking\" class=\"code-line\" dir=\"auto\" data-line=\"84\">Image Tracking<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"86\">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 class=\"code-line\" dir=\"auto\" data-line=\"86\"><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"88\"><span style=\"color: #003366;\">\/\/ Mutable library example<\/span><br \/><span style=\"color: #003366;\">var library = trackedImageManager.CreateRuntimeLibrary() as MutableRuntimeReferenceImageLibrary;<\/span><br \/><span style=\"color: #003366;\">await library.ScheduleAddImageWithValidationJob(texture, \"image-name\", 0.1f); \/\/ 0.1f = physical width in metres<\/span><br \/><span style=\"color: #003366;\">trackedImageManager.referenceLibrary = library;<\/span><br \/><\/code><\/pre><hr class=\"code-line\" dir=\"auto\" data-line=\"95\" \/><h3 id=\"plane-detection\" class=\"code-line\" dir=\"auto\" data-line=\"97\">Plane Detection<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"99\">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=\"101\"><span style=\"color: #003366;\">arPlaneManager.requestedDetectionMode = PlaneDetectionMode.Horizontal | PlaneDetectionMode.Vertical;<\/span>\n<\/code><\/pre><blockquote class=\"code-line\" dir=\"auto\" data-line=\"105\"><p class=\"code-line\" dir=\"auto\" data-line=\"105\"><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=\"107\" \/><h3 id=\"camera-frame-access\" class=\"code-line\" dir=\"auto\" data-line=\"109\">Camera Frame Access<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"111\">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=\"113\"><li class=\"code-line\" dir=\"auto\" data-line=\"113\">Raw camera frame access in YUV (Y&#8217;UV420sp) and YUYV \/ YUY2 formats.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"114\"><code>XRCpuImage.GetPlane(int)<\/code>\u00a0for CPU-side image access.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"115\"><code>XRCpuImage.ConvertAsync<\/code>\u00a0for asynchronous conversion.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"116\">GPU-accelerated RGB frame access for AiO devices (via OpenGL).<\/li><li class=\"code-line code-active-line\" dir=\"auto\" data-line=\"117\">Sensor extrinsics \/ pose retrieval via\u00a0<code>InputBindings<\/code>.<\/li><\/ul><blockquote class=\"code-line\" dir=\"auto\" data-line=\"119\"><p class=\"code-line\" dir=\"auto\" data-line=\"119\"><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=\"121\"><span style=\"color: #003366;\">void OnCameraFrameReceived(ARCameraFrameEventArgs args)<\/span><br \/><span style=\"color: #003366;\">{<\/span><br \/><span style=\"color: #003366;\">if (cameraManager.TryAcquireLatestCpuImage(out XRCpuImage image))<\/span><br \/><span style=\"color: #003366;\">{<\/span><br \/><span style=\"color: #003366;\">using (image)<\/span><br \/><span style=\"color: #003366;\">{<\/span><br \/><span style=\"color: #003366;\">XRCpuImage.Plane yPlane = image.GetPlane(0); \/\/ Luminance plane<\/span><br \/><span style=\"color: #003366;\">\/\/ yPlane.data contains the raw data<\/span><br \/><span style=\"color: #003366;\">}<\/span><br \/><span style=\"color: #003366;\">}<\/span><br \/><span style=\"color: #003366;\">}<\/span>\n<\/code><\/pre><hr class=\"code-line\" dir=\"auto\" data-line=\"135\" \/><h3 id=\"spatial-meshing\" class=\"code-line\" dir=\"auto\" data-line=\"137\">Spatial Meshing<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"139\">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=\"141\" \/><h3 id=\"qr-code-tracking\" class=\"code-line\" dir=\"auto\" data-line=\"143\">QR Code Tracking<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"145\">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=\"147\"><\/code><\/pre><pre><span style=\"color: #003366;\"><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"147\"><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}<\/code><\/span><\/pre><pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"147\"><\/code><\/pre><hr class=\"code-line\" dir=\"auto\" data-line=\"159\" \/><h3 id=\"hand-tracking\" class=\"code-line\" dir=\"auto\" data-line=\"161\">Hand Tracking<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"163\">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=\"165\"><p class=\"code-line\" dir=\"auto\" data-line=\"165\"><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=\"167\">For full Hand Tracking integration with XR Interaction Toolkit, see the Interaction Package Guides document.<\/p><hr class=\"code-line\" dir=\"auto\" data-line=\"169\" \/><h3 id=\"foveated-rendering\" class=\"code-line\" dir=\"auto\" data-line=\"171\">Foveated Rendering<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"173\">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=\"175\"><thead class=\"code-line\" dir=\"auto\" data-line=\"175\"><tr class=\"code-line\" dir=\"auto\" data-line=\"175\"><th>Level<\/th><th>Description<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"177\"><tr class=\"code-line\" dir=\"auto\" data-line=\"177\"><td>None<\/td><td>No reduction.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"178\"><td>Low<\/td><td>Light reduction, imperceptible to most users.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"179\"><td>Medium<\/td><td>Good quality\/performance trade-off.<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"180\"><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=\"182\" \/><h2 id=\"leonardoxr-features\" class=\"code-line\" dir=\"auto\" data-line=\"184\">LeonardoXR Features<\/h2><p class=\"code-line\" dir=\"auto\" data-line=\"186\">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><h3 id=\"dual-camera-access\" class=\"code-line\" dir=\"auto\" data-line=\"188\">Dual Camera Access<\/h3><blockquote class=\"code-line\" dir=\"auto\" data-line=\"190\"><p class=\"code-line\" dir=\"auto\" data-line=\"190\"><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><h3 id=\"qnn-inference-plugin\" class=\"code-line\" dir=\"auto\" data-line=\"192\">QNN Inference Plugin<\/h3><blockquote class=\"code-line\" dir=\"auto\" data-line=\"194\"><p class=\"code-line\" dir=\"auto\" data-line=\"194\"><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><h3 id=\"intercept-openxr-function\" class=\"code-line\" dir=\"auto\" data-line=\"196\">Intercept OpenXR Function<\/h3><blockquote class=\"code-line\" dir=\"auto\" data-line=\"198\"><p class=\"code-line\" dir=\"auto\" data-line=\"198\"><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>\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>Features Features \u2014 LeonardoXR SDK Features Version 1.0.2 Device: Youbiquo Leonardo XR Base SDK: Snapdragon Spaces 1.0.4 This page documents the features available in the LeonardoXR SDK, organised in two sections: Snapdragon Spaces Features\u00a0\u2014 AR\/XR functionality provided by the Snapdragon Spaces platform, accessible through AR Foundation. LeonardoXR Features\u00a0\u2014 proprietary features specific to Leonardo XR. Snapdragon Spaces Features Local Anchors How to Enable Go to\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Spatial Anchors\u00a0and enable the feature. Spaces Anchor Store NOTE Look 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. namespace Qualcomm.Snapdragon.Spaces { public class SpacesAnchorStore { public void ClearStore(); public void SaveAnchor(ARAnchor anchor, string anchorName, Action&lt;bool&gt; onSavedCallback = null); public void SaveAnchorWithResult(ARAnchor anchor, string anchorName, Action&lt;SaveAnchorResult&gt; callback = null); public void DeleteSavedAnchor(string anchorName); public void LoadSavedAnchor(string anchorName, Action&lt;bool&gt; onLoadedCallback = null); public void LoadAllSavedAnchors(Action&lt;bool&gt; onLoadedCallback = null); public string[] GetSavedAnchorNames(); public string GetSavedAnchorNameFromARAnchor(ARAnchor anchor); } } API Reference Method Description ClearStore() Clears the local anchor storage. SaveAnchor(&#8230;) Saves an ARAnchor by name or generated hash; optional callback on completion. SaveAnchorWithResult(&#8230;) Like SaveAnchor but returns a\u00a0SaveAnchorResult\u00a0enum. DeleteSavedAnchor(name) Deletes a saved anchor by name. LoadSavedAnchor(name, &#8230;) Loads an anchor from storage and attempts to localise it; fires\u00a0anchorsChanged.added. LoadAllSavedAnchors(&#8230;) Loads all stored anchors. GetSavedAnchorNames() Returns all saved anchor names. GetSavedAnchorNameFromARAnchor(anchor) Returns the name of a saved anchor from a tracked ARAnchor, or empty string if not saved. SaveAnchorResult Values Value Meaning PENDING Anchor is awaiting save. SAVED Successfully saved. FAILURE_RUNTIME_ERROR Runtime error. FAILURE_STORE_NOT_LOADED Anchor Store failed to load. FAILURE_INSUFFICIENT_QUALITY Environment map quality is insufficient. Hit Testing Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Hit Testing. Uses the\u00a0AR Raycast Manager\u00a0from AR Foundation (XRRaycastSubsystem). 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). List&lt;ARRaycastHit&gt; hits = new List&lt;ARRaycastHit&gt;();if (raycastManager.Raycast(screenCenter, hits, TrackableType.PlaneWithinPolygon)){Pose hitPose = hits[0].pose;\/\/ Place AR content at hitPose.position} CAUTION\u00a0ARRaycastHit.trackableId\u00a0always returns\u00a00-0. (Known Issue) Image Tracking Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Image Tracking. Uses the\u00a0AR Tracked Image Manager\u00a0(XRImageTrackingSubsystem). Supports static and mutable (runtime) reference image libraries. \/\/ Mutable library examplevar library = trackedImageManager.CreateRuntimeLibrary() as MutableRuntimeReferenceImageLibrary;await library.ScheduleAddImageWithValidationJob(texture, &#8220;image-name&#8221;, 0.1f); \/\/ 0.1f = physical width in metrestrackedImageManager.referenceLibrary = library; Plane Detection Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Plane Detection. Uses the\u00a0AR Plane Manager\u00a0(XRPlaneSubsystem).\u00a0Use Scene Understanding Backend\u00a0is enabled by default. arPlaneManager.requestedDetectionMode = PlaneDetectionMode.Horizontal | PlaneDetectionMode.Vertical; CAUTION\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. Camera Frame Access Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Camera Frame Access. Uses the\u00a0AR Camera Manager\u00a0(XRCameraSubsystem). Key capabilities: Raw camera frame access in YUV (Y&#8217;UV420sp) and YUYV \/ YUY2 formats. XRCpuImage.GetPlane(int)\u00a0for CPU-side image access. XRCpuImage.ConvertAsync\u00a0for asynchronous conversion. GPU-accelerated RGB frame access for AiO devices (via OpenGL). Sensor extrinsics \/ pose retrieval via\u00a0InputBindings. NOTE\u00a0Enable\u00a0Allow &#8216;unsafe&#8217; Code\u00a0in\u00a0Player Settings &gt; Android &gt; Other Settings &gt; Script Compilation\u00a0when using the Camera Frame Access sample. Disable AR Camera Background to avoid rendering issues. void OnCameraFrameReceived(ARCameraFrameEventArgs args){if (cameraManager.TryAcquireLatestCpuImage(out XRCpuImage image)){using (image){XRCpuImage.Plane yPlane = image.GetPlane(0); \/\/ Luminance plane\/\/ yPlane.data contains the raw data}}} Spatial Meshing Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Spatial Meshing. Uses the\u00a0AR Mesh Manager\u00a0(XRMeshSubsystem). The optional\u00a0SpacesARMeshManagerConfig\u00a0component controls mesh characteristics and camera height offsets for\u00a0TrackingOriginMode.Floor. QR Code Tracking Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; QR Code Tracking. Uses the custom\u00a0SpacesQrCodeManager\u00a0component. Supports multiple tracking modes to control algorithm update frequency. \/\/ Editor build workaround (no simulation subsystem for QR Code Tracking) bool CheckSubsystem() { #if UNITY_EDITOR return arQrCodeManager.subsystem?.running ?? false; #else return true; #endif } Hand Tracking Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Hand Tracking. 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. NOTE\u00a0For Hand Tracking to work correctly on LeonardoXR, the\u00a0Hand Tracking Subsystem\u00a0option must be active in\u00a0All Features\u00a0of OpenXR. For full Hand Tracking integration with XR Interaction Toolkit, see the Interaction Package Guides document. Foveated Rendering Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Foveated Rendering. Reduces GPU load by rendering the visual field periphery at lower resolution. Foveation settings persist after application pause and resume. Level Description None No reduction. Low Light reduction, imperceptible to most users. Medium Good quality\/performance trade-off. High Maximum reduction; recommended only for heavily 3D content scenes. LeonardoXR Features The following features are specific to Leonardo XR and are not part of the base Snapdragon Spaces platform. Enable them via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; LeonardoXR feature group. Dual Camera Access DOCUMENTATION IN PROGRESS\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. QNN Inference Plugin DOCUMENTATION IN PROGRESS\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. Intercept OpenXR Function DOCUMENTATION IN PROGRESS\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>\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-996","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>Features - 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\/features-2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Features - Geckode!\" \/>\n<meta property=\"og:description\" content=\"Features Features \u2014 LeonardoXR SDK Features Version 1.0.2 Device: Youbiquo Leonardo XR Base SDK: Snapdragon Spaces 1.0.4 This page documents the features available in the LeonardoXR SDK, organised in two sections: Snapdragon Spaces Features\u00a0\u2014 AR\/XR functionality provided by the Snapdragon Spaces platform, accessible through AR Foundation. LeonardoXR Features\u00a0\u2014 proprietary features specific to Leonardo XR. Snapdragon Spaces Features Local Anchors How to Enable Go to\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Spatial Anchors\u00a0and enable the feature. Spaces Anchor Store NOTE Look 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. namespace Qualcomm.Snapdragon.Spaces { public class SpacesAnchorStore { public void ClearStore(); public void SaveAnchor(ARAnchor anchor, string anchorName, Action&lt;bool&gt; onSavedCallback = null); public void SaveAnchorWithResult(ARAnchor anchor, string anchorName, Action&lt;SaveAnchorResult&gt; callback = null); public void DeleteSavedAnchor(string anchorName); public void LoadSavedAnchor(string anchorName, Action&lt;bool&gt; onLoadedCallback = null); public void LoadAllSavedAnchors(Action&lt;bool&gt; onLoadedCallback = null); public string[] GetSavedAnchorNames(); public string GetSavedAnchorNameFromARAnchor(ARAnchor anchor); } } API Reference Method Description ClearStore() Clears the local anchor storage. SaveAnchor(...) Saves an ARAnchor by name or generated hash; optional callback on completion. SaveAnchorWithResult(...) Like SaveAnchor but returns a\u00a0SaveAnchorResult\u00a0enum. DeleteSavedAnchor(name) Deletes a saved anchor by name. LoadSavedAnchor(name, ...) Loads an anchor from storage and attempts to localise it; fires\u00a0anchorsChanged.added. LoadAllSavedAnchors(...) Loads all stored anchors. GetSavedAnchorNames() Returns all saved anchor names. GetSavedAnchorNameFromARAnchor(anchor) Returns the name of a saved anchor from a tracked ARAnchor, or empty string if not saved. SaveAnchorResult Values Value Meaning PENDING Anchor is awaiting save. SAVED Successfully saved. FAILURE_RUNTIME_ERROR Runtime error. FAILURE_STORE_NOT_LOADED Anchor Store failed to load. FAILURE_INSUFFICIENT_QUALITY Environment map quality is insufficient. Hit Testing Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Hit Testing. Uses the\u00a0AR Raycast Manager\u00a0from AR Foundation (XRRaycastSubsystem). 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). List&lt;ARRaycastHit&gt; hits = new List&lt;ARRaycastHit&gt;();if (raycastManager.Raycast(screenCenter, hits, TrackableType.PlaneWithinPolygon)){Pose hitPose = hits[0].pose;\/\/ Place AR content at hitPose.position} CAUTION\u00a0ARRaycastHit.trackableId\u00a0always returns\u00a00-0. (Known Issue) Image Tracking Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Image Tracking. Uses the\u00a0AR Tracked Image Manager\u00a0(XRImageTrackingSubsystem). Supports static and mutable (runtime) reference image libraries. \/\/ Mutable library examplevar library = trackedImageManager.CreateRuntimeLibrary() as MutableRuntimeReferenceImageLibrary;await library.ScheduleAddImageWithValidationJob(texture, &quot;image-name&quot;, 0.1f); \/\/ 0.1f = physical width in metrestrackedImageManager.referenceLibrary = library; Plane Detection Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Plane Detection. Uses the\u00a0AR Plane Manager\u00a0(XRPlaneSubsystem).\u00a0Use Scene Understanding Backend\u00a0is enabled by default. arPlaneManager.requestedDetectionMode = PlaneDetectionMode.Horizontal | PlaneDetectionMode.Vertical; CAUTION\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. Camera Frame Access Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Camera Frame Access. Uses the\u00a0AR Camera Manager\u00a0(XRCameraSubsystem). Key capabilities: Raw camera frame access in YUV (Y&#8217;UV420sp) and YUYV \/ YUY2 formats. XRCpuImage.GetPlane(int)\u00a0for CPU-side image access. XRCpuImage.ConvertAsync\u00a0for asynchronous conversion. GPU-accelerated RGB frame access for AiO devices (via OpenGL). Sensor extrinsics \/ pose retrieval via\u00a0InputBindings. NOTE\u00a0Enable\u00a0Allow &#8216;unsafe&#8217; Code\u00a0in\u00a0Player Settings &gt; Android &gt; Other Settings &gt; Script Compilation\u00a0when using the Camera Frame Access sample. Disable AR Camera Background to avoid rendering issues. void OnCameraFrameReceived(ARCameraFrameEventArgs args){if (cameraManager.TryAcquireLatestCpuImage(out XRCpuImage image)){using (image){XRCpuImage.Plane yPlane = image.GetPlane(0); \/\/ Luminance plane\/\/ yPlane.data contains the raw data}}} Spatial Meshing Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Spatial Meshing. Uses the\u00a0AR Mesh Manager\u00a0(XRMeshSubsystem). The optional\u00a0SpacesARMeshManagerConfig\u00a0component controls mesh characteristics and camera height offsets for\u00a0TrackingOriginMode.Floor. QR Code Tracking Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; QR Code Tracking. Uses the custom\u00a0SpacesQrCodeManager\u00a0component. Supports multiple tracking modes to control algorithm update frequency. \/\/ Editor build workaround (no simulation subsystem for QR Code Tracking) bool CheckSubsystem() { #if UNITY_EDITOR return arQrCodeManager.subsystem?.running ?? false; #else return true; #endif } Hand Tracking Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Hand Tracking. 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. NOTE\u00a0For Hand Tracking to work correctly on LeonardoXR, the\u00a0Hand Tracking Subsystem\u00a0option must be active in\u00a0All Features\u00a0of OpenXR. For full Hand Tracking integration with XR Interaction Toolkit, see the Interaction Package Guides document. Foveated Rendering Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Foveated Rendering. Reduces GPU load by rendering the visual field periphery at lower resolution. Foveation settings persist after application pause and resume. Level Description None No reduction. Low Light reduction, imperceptible to most users. Medium Good quality\/performance trade-off. High Maximum reduction; recommended only for heavily 3D content scenes. LeonardoXR Features The following features are specific to Leonardo XR and are not part of the base Snapdragon Spaces platform. Enable them via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; LeonardoXR feature group. Dual Camera Access DOCUMENTATION IN PROGRESS\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. QNN Inference Plugin DOCUMENTATION IN PROGRESS\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. Intercept OpenXR Function DOCUMENTATION IN PROGRESS\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.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.youbiquo.eu\/geckode\/en\/features-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Geckode!\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-09T11:22:24+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=\"3 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\/features-2\/\",\"url\":\"https:\/\/www.youbiquo.eu\/geckode\/en\/features-2\/\",\"name\":\"Features - Geckode!\",\"isPartOf\":{\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/#website\"},\"datePublished\":\"2026-04-09T09:07:29+00:00\",\"dateModified\":\"2026-04-09T11:22:24+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/en\/features-2\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.youbiquo.eu\/geckode\/en\/features-2\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/en\/features-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.youbiquo.eu\/geckode\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Features\"}]},{\"@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":"Features - 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\/features-2\/","og_locale":"en_US","og_type":"article","og_title":"Features - Geckode!","og_description":"Features Features \u2014 LeonardoXR SDK Features Version 1.0.2 Device: Youbiquo Leonardo XR Base SDK: Snapdragon Spaces 1.0.4 This page documents the features available in the LeonardoXR SDK, organised in two sections: Snapdragon Spaces Features\u00a0\u2014 AR\/XR functionality provided by the Snapdragon Spaces platform, accessible through AR Foundation. LeonardoXR Features\u00a0\u2014 proprietary features specific to Leonardo XR. Snapdragon Spaces Features Local Anchors How to Enable Go to\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Spatial Anchors\u00a0and enable the feature. Spaces Anchor Store NOTE Look 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. namespace Qualcomm.Snapdragon.Spaces { public class SpacesAnchorStore { public void ClearStore(); public void SaveAnchor(ARAnchor anchor, string anchorName, Action&lt;bool&gt; onSavedCallback = null); public void SaveAnchorWithResult(ARAnchor anchor, string anchorName, Action&lt;SaveAnchorResult&gt; callback = null); public void DeleteSavedAnchor(string anchorName); public void LoadSavedAnchor(string anchorName, Action&lt;bool&gt; onLoadedCallback = null); public void LoadAllSavedAnchors(Action&lt;bool&gt; onLoadedCallback = null); public string[] GetSavedAnchorNames(); public string GetSavedAnchorNameFromARAnchor(ARAnchor anchor); } } API Reference Method Description ClearStore() Clears the local anchor storage. SaveAnchor(...) Saves an ARAnchor by name or generated hash; optional callback on completion. SaveAnchorWithResult(...) Like SaveAnchor but returns a\u00a0SaveAnchorResult\u00a0enum. DeleteSavedAnchor(name) Deletes a saved anchor by name. LoadSavedAnchor(name, ...) Loads an anchor from storage and attempts to localise it; fires\u00a0anchorsChanged.added. LoadAllSavedAnchors(...) Loads all stored anchors. GetSavedAnchorNames() Returns all saved anchor names. GetSavedAnchorNameFromARAnchor(anchor) Returns the name of a saved anchor from a tracked ARAnchor, or empty string if not saved. SaveAnchorResult Values Value Meaning PENDING Anchor is awaiting save. SAVED Successfully saved. FAILURE_RUNTIME_ERROR Runtime error. FAILURE_STORE_NOT_LOADED Anchor Store failed to load. FAILURE_INSUFFICIENT_QUALITY Environment map quality is insufficient. Hit Testing Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Hit Testing. Uses the\u00a0AR Raycast Manager\u00a0from AR Foundation (XRRaycastSubsystem). 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). List&lt;ARRaycastHit&gt; hits = new List&lt;ARRaycastHit&gt;();if (raycastManager.Raycast(screenCenter, hits, TrackableType.PlaneWithinPolygon)){Pose hitPose = hits[0].pose;\/\/ Place AR content at hitPose.position} CAUTION\u00a0ARRaycastHit.trackableId\u00a0always returns\u00a00-0. (Known Issue) Image Tracking Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Image Tracking. Uses the\u00a0AR Tracked Image Manager\u00a0(XRImageTrackingSubsystem). Supports static and mutable (runtime) reference image libraries. \/\/ Mutable library examplevar library = trackedImageManager.CreateRuntimeLibrary() as MutableRuntimeReferenceImageLibrary;await library.ScheduleAddImageWithValidationJob(texture, \"image-name\", 0.1f); \/\/ 0.1f = physical width in metrestrackedImageManager.referenceLibrary = library; Plane Detection Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Plane Detection. Uses the\u00a0AR Plane Manager\u00a0(XRPlaneSubsystem).\u00a0Use Scene Understanding Backend\u00a0is enabled by default. arPlaneManager.requestedDetectionMode = PlaneDetectionMode.Horizontal | PlaneDetectionMode.Vertical; CAUTION\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. Camera Frame Access Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Camera Frame Access. Uses the\u00a0AR Camera Manager\u00a0(XRCameraSubsystem). Key capabilities: Raw camera frame access in YUV (Y&#8217;UV420sp) and YUYV \/ YUY2 formats. XRCpuImage.GetPlane(int)\u00a0for CPU-side image access. XRCpuImage.ConvertAsync\u00a0for asynchronous conversion. GPU-accelerated RGB frame access for AiO devices (via OpenGL). Sensor extrinsics \/ pose retrieval via\u00a0InputBindings. NOTE\u00a0Enable\u00a0Allow &#8216;unsafe&#8217; Code\u00a0in\u00a0Player Settings &gt; Android &gt; Other Settings &gt; Script Compilation\u00a0when using the Camera Frame Access sample. Disable AR Camera Background to avoid rendering issues. void OnCameraFrameReceived(ARCameraFrameEventArgs args){if (cameraManager.TryAcquireLatestCpuImage(out XRCpuImage image)){using (image){XRCpuImage.Plane yPlane = image.GetPlane(0); \/\/ Luminance plane\/\/ yPlane.data contains the raw data}}} Spatial Meshing Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Spatial Meshing. Uses the\u00a0AR Mesh Manager\u00a0(XRMeshSubsystem). The optional\u00a0SpacesARMeshManagerConfig\u00a0component controls mesh characteristics and camera height offsets for\u00a0TrackingOriginMode.Floor. QR Code Tracking Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; QR Code Tracking. Uses the custom\u00a0SpacesQrCodeManager\u00a0component. Supports multiple tracking modes to control algorithm update frequency. \/\/ Editor build workaround (no simulation subsystem for QR Code Tracking) bool CheckSubsystem() { #if UNITY_EDITOR return arQrCodeManager.subsystem?.running ?? false; #else return true; #endif } Hand Tracking Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Hand Tracking. 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. NOTE\u00a0For Hand Tracking to work correctly on LeonardoXR, the\u00a0Hand Tracking Subsystem\u00a0option must be active in\u00a0All Features\u00a0of OpenXR. For full Hand Tracking integration with XR Interaction Toolkit, see the Interaction Package Guides document. Foveated Rendering Enable via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; Snapdragon Spaces &gt; Foveated Rendering. Reduces GPU load by rendering the visual field periphery at lower resolution. Foveation settings persist after application pause and resume. Level Description None No reduction. Low Light reduction, imperceptible to most users. Medium Good quality\/performance trade-off. High Maximum reduction; recommended only for heavily 3D content scenes. LeonardoXR Features The following features are specific to Leonardo XR and are not part of the base Snapdragon Spaces platform. Enable them via\u00a0Project Settings &gt; XR Plug-in Management &gt; OpenXR (Android) &gt; LeonardoXR feature group. Dual Camera Access DOCUMENTATION IN PROGRESS\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. QNN Inference Plugin DOCUMENTATION IN PROGRESS\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. Intercept OpenXR Function DOCUMENTATION IN PROGRESS\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.","og_url":"https:\/\/www.youbiquo.eu\/geckode\/en\/features-2\/","og_site_name":"Geckode!","article_modified_time":"2026-04-09T11:22:24+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.youbiquo.eu\/geckode\/en\/features-2\/","url":"https:\/\/www.youbiquo.eu\/geckode\/en\/features-2\/","name":"Features - Geckode!","isPartOf":{"@id":"https:\/\/www.youbiquo.eu\/geckode\/#website"},"datePublished":"2026-04-09T09:07:29+00:00","dateModified":"2026-04-09T11:22:24+00:00","breadcrumb":{"@id":"https:\/\/www.youbiquo.eu\/geckode\/en\/features-2\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.youbiquo.eu\/geckode\/en\/features-2\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.youbiquo.eu\/geckode\/en\/features-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.youbiquo.eu\/geckode\/"},{"@type":"ListItem","position":2,"name":"Features"}]},{"@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\/996","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=996"}],"version-history":[{"count":16,"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/pages\/996\/revisions"}],"predecessor-version":[{"id":1065,"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/pages\/996\/revisions\/1065"}],"wp:attachment":[{"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/media?parent=996"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}