private void SpatialAnchorsSession_AnchorLocated(object sender, AnchorLocatedEventArgs e)
        {
            LocateAnchorStatus status = e.Status;

            switch (status)
            {
            case LocateAnchorStatus.AlreadyTracked:
                break;

            case LocateAnchorStatus.Located:
            {
                CloudSpatialAnchor anchor = e.Anchor;
                Debug.WriteLine("Cloud Anchor found! Identifier : " + anchor.Identifier);
                AnchorVisual visual = new AnchorVisual
                {
                    cloudAnchor = anchor,
                    identifier  = anchor.Identifier,
                    localAnchor = anchor.LocalAnchor
                };
                this.anchorVisuals[visual.identifier] = visual;
                this.scnView.Session.AddAnchor(anchor.LocalAnchor);
                this.PlaceCube(visual.localAnchor);
                break;
            }

            case LocateAnchorStatus.NotLocated:
            case LocateAnchorStatus.NotLocatedAnchorDoesNotExist:
                break;
            }

            this.OnAnchorLocated?.Invoke(sender, e);
        }
        private SCNNode PlaceCube(ARAnchor anchor)
        {
            AnchorVisual visual = this.anchorVisuals.Values.FirstOrDefault(a => a.localAnchor == anchor);

            if (visual is null)
            {
                return(null);
            }

            Debug.WriteLine($"renderer:nodeForAnchor with local anchor {anchor} at {anchor.Transform}");
            SCNBox box = new SCNBox {
                Width = 0.2f, Height = 0.2f, Length = 0.2f
            };

            if (visual.identifier != this.unsavedAnchorId)
            {
                box.FirstMaterial.Diffuse.Contents = this.foundColor;
            }
            else
            {
                box.FirstMaterial.Diffuse.Contents = this.readyColor;
            }

            this.localAnchorCube = box;
            SCNNode cubeNode = new SCNNode
            {
                Position = visual.localAnchor.Transform.ToPosition(),
                Geometry = box
            };

            this.scnView.Scene.RootNode.AddChildNode(cubeNode);
            visual.node = cubeNode;

            return(visual.node);
        }
        protected virtual void AnchorSaveSuccess(CloudSpatialAnchor result)
        {
            this.saveCount += 1;
            this.localAnchorCube.FirstMaterial.Diffuse.Contents = this.savedColor;
            this.targetId = result.Identifier;
            Console.WriteLine("ASADemo: created anchor: " + this.targetId);

            AnchorVisual visual = this.anchorVisuals[this.unsavedAnchorId];

            visual.cloudAnchor = this.cloudAnchor;
            visual.identifier  = this.cloudAnchor.Identifier;
            this.anchorVisuals[visual.identifier] = visual;

            this.anchorVisuals.TryRemove(this.unsavedAnchorId, out _);
            this.localAnchor = null;
        }
        public void CreateLocalAnchor(ref NMatrix4 transform)
        {
            if (this.localAnchor != null)
            {
                return;
            }

            this.localAnchor = new ARAnchor(transform);
            this.scnView.Session.AddAnchor(this.localAnchor);

            // Put the local anchor in the anchorVisuals list with a special key
            AnchorVisual visual = new AnchorVisual
            {
                identifier  = this.unsavedAnchorId,
                localAnchor = this.localAnchor
            };

            this.anchorVisuals[visual.identifier] = visual;

            this.PlaceCube(this.localAnchor);

            this.UpdateMainStatusTitle("Create Cloud Anchor (once at 100%)");
        }