コード例 #1
0
        internal void StartTracking(ARMarkerObject markerObj)
        {
            var markerIdent = markerObj.MarkerIdentifier;

            m_logger.Debug("start tracking {0}", markerIdent);

            m_trackingMarkerObjects.Add(markerIdent, markerObj);

            // Find all media items for the given marker
            var media = m_activeResourceMedia[markerIdent];

            m_logger.Debug("found {0} media items for {1}", media == null ? 0 : media.Count(), markerIdent);

            if (media != null)
            {
                foreach (var c in media)
                {
                    // Attach each media item to the marker
                    AttachMediaObject(c, markerObj);
                }
            }

            var assets = m_activeResourceAssets[markerIdent];

            if (assets != null)
            {
                foreach (var a in assets)
                {
                    AttachAssetObject(a, markerObj);
                }
            }

            TrackingConditionMonitor.TrackingMarkersUpdated();
        }
コード例 #2
0
        internal void StopTracking(ARMarkerObject markerObj)
        {
            if (m_trackingHold.Contains(markerObj))
            {
                m_trackingHold.Remove(markerObj);

                return;
            }

            // Pause all audio/video players
            var audioPlayers = markerObj.GameObject.GetComponentsInChildren <AudioSubpanel>();
            var videoPlayers = markerObj.GameObject.GetComponentsInChildren <VideoSubpanel>();

            foreach (var ap in audioPlayers)
            {
                ap.Pause();
            }

            foreach (var vp in videoPlayers)
            {
                vp.Pause();
            }

            List <GameObject> objs = new List <GameObject>();

            for (int i = 0; i < markerObj.GameObject.transform.childCount; i++)
            {
                var t = markerObj.GameObject.transform.GetChild(i);
                objs.Add(t.gameObject);
            }

            foreach (var obj in objs)
            {
                obj.transform.SetParent(null);
                obj.SetActive(false);
            }

            var markerIdent = markerObj.MarkerIdentifier;

            foreach (var activeObj in GetActiveObjects(markerIdent))
            {
                VisualMarkerWorldObject worldObj = null;

                if (activeObj.TrackingMarkerObjects.TryGetValue(markerObj.GameObject, out worldObj))
                {
                    activeObj.TrackingMarkerObjects.Remove(markerObj.GameObject);
                    activeObj.HoldingMarkerObjects.Add(markerIdent, worldObj);
                }
            }

            if (markerIdent != null)
            {
                m_logger.Debug("stop tracking {0}", markerIdent);

                m_trackingMarkerObjects.RemoveWhere(markerIdent, m => m.GameObject == markerObj.GameObject);
            }

            TrackingConditionMonitor.TrackingMarkersUpdated();
        }
コード例 #3
0
        VisualMarkerWorldObject CreateWorldObject(ARMarkerObject markerObj, VisualMarkerObject spawnedItem, GameObject animationTarget, ResourceActivationContext context = null)
        {
            var worldObj = new VisualMarkerWorldObject
            {
                GameObject = spawnedItem.gameObject
            };

            spawnedItem.WorldObject = worldObj;

            ARWorld.Instance.AddWorldObject(worldObj, context);
            WorldObjectManager.Instance.AddWorldObject(context, spawnedItem.gameObject, animationTarget, spawnedItem.LayoutObject);

            m_spawnedObjects.Add(markerObj, spawnedItem);

            return(worldObj);
        }
コード例 #4
0
        /*
         * void AttachAssetObject(VuMarkIdentifier identifier, GameObject parent, string objectId, AssetInstance assetInstance, MediaElement fallbackImage, Action onOpen, Action onSelect)
         * {
         *  if (fallbackImage != null)
         *  {
         *      AttachAssetObject(identifier, parent, objectId, assetInstance, fallbackImage.MediaUrl, fallbackImage.Layout, onOpen, onSelect);
         *  }
         *  else
         *  {
         *      AttachAssetObject(identifier, parent, objectId, assetInstance, null, null, onOpen);
         *  }
         * }*/

        void AttachMediaObject(
            MarkerMedia media,
            ARMarkerObject markerObj)
        {
            var activeObject = GetOrCreateActiveObject(media.ObjectId);

            VisualMarkerObject mediaObj = null;

            Action onReady = null;

            var worldObj = activeObject.HoldingMarkerObjects.GetFirstOrDefault(markerObj.MarkerIdentifier);

            if (worldObj != null)
            {
                activeObject.HoldingMarkerObjects.Remove(markerObj.MarkerIdentifier, worldObj);
                activeObject.TrackingMarkerObjects.Add(markerObj.GameObject, worldObj);

                mediaObj = worldObj.GameObject.GetComponent <VisualMarkerObject>();

                switch (media.MediaType)
                {
                case Motive.Core.Media.MediaType.Audio:
                    onReady = () =>
                    {
                        var player = mediaObj.GetComponentInChildren <AudioSubpanel>();

                        player.Play(media.OnClose);
                    };

                    break;

                case Motive.Core.Media.MediaType.Video:
                    onReady = () =>
                    {
                        var player = mediaObj.GetComponentInChildren <VideoSubpanel>();

                        player.Play(media.OnClose);
                    };

                    break;
                }

                worldObj.GameObject.SetActive(true);
            }
            else
            {
                switch (media.MediaType)
                {
                case Motive.Core.Media.MediaType.Audio:
                {
                    mediaObj = Instantiate(MarkerAudioObject);

                    onReady = () =>
                    {
                        var player = mediaObj.GetComponentInChildren <AudioSubpanel>();

                        player.Play(media.MediaUrl, media.OnClose);
                    };

                    break;
                }

                case Motive.Core.Media.MediaType.Image:
                {
                    mediaObj = Instantiate(MarkerImageObject);

                    onReady = () =>
                    {
                        ThreadHelper.Instance.StartCoroutine(
                            ImageLoader.LoadImage(media.MediaUrl, mediaObj.RenderObject));
                    };

                    break;
                }

                case Motive.Core.Media.MediaType.Video:
                {
                    mediaObj = Instantiate(MarkerVideoObject);

                    var renderer = mediaObj.RenderObject.GetComponent <Renderer>();

                    renderer.enabled = false;

                    onReady = () =>
                    {
                        var player = mediaObj.GetComponentInChildren <VideoSubpanel>();

                        UnityAction setAspect = () =>
                        {
                            renderer.enabled = true;

                            if (media.MediaLayout == null)
                            {
                                var aspect = player.AspectRatio;

                                if (aspect > 1)
                                {
                                    // Wider than tall, reduce y scale
                                    player.transform.localScale =
                                        new Vector3(1, 1 / aspect, 1);
                                }
                                else
                                {
                                    // Wider than tall, reduce x scale
                                    player.transform.localScale = new Vector3(aspect, 1, 1);
                                }
                            }
                        };

                        player.ClipLoaded.AddListener(setAspect);

                        player.Play(media.MediaUrl, media.OnClose);
                    };
                    break;
                }
                }

                if (mediaObj)
                {
                    if (media.MediaLayout != null)
                    {
                        LayoutHelper.Apply(mediaObj.LayoutObject.transform, media.MediaLayout);
                    }

                    if (media.Color != null)
                    {
                        var renderer = mediaObj.RenderObject.GetComponent <Renderer>();

                        if (renderer)
                        {
                            renderer.material.color = ColorHelper.ToUnityColor(media.Color);
                        }
                    }

                    worldObj = CreateWorldObject(markerObj, mediaObj, mediaObj.RenderObject, media.ActivationContext);

                    activeObject.TrackingMarkerObjects[markerObj.GameObject] = worldObj;

                    worldObj.Clicked += (sender, args) =>
                    {
                        if (media.OnSelect != null)
                        {
                            media.OnSelect();
                        }
                    };
                }
            }

            if (mediaObj)
            {
                mediaObj.transform.SetParent(markerObj.GameObject.transform, false);
                mediaObj.transform.localScale    = ItemScale;
                mediaObj.transform.localPosition = Vector3.zero;
                mediaObj.transform.localRotation = Quaternion.identity;

                if (onReady != null)
                {
                    onReady();
                }

                if (media.OnOpen != null)
                {
                    media.OnOpen();
                }
            }
        }
コード例 #5
0
 public ARMarkerTrackingEventArgs(string markerIdentifier, GameObject gameObject)
 {
     MarkerObject = new ARMarkerObject(markerIdentifier, gameObject);
 }
コード例 #6
0
        void AttachAssetObject(MarkerAsset asset, ARMarkerObject markerObj)
        {
            var activeObject = GetOrCreateActiveObject(asset.ObjectId);

            var worldObj = activeObject.HoldingMarkerObjects.GetFirstOrDefault(markerObj.MarkerIdentifier);

            if (worldObj != null)
            {
                activeObject.HoldingMarkerObjects.Remove(markerObj.MarkerIdentifier, worldObj);
                activeObject.TrackingMarkerObjects.Add(markerObj.GameObject, worldObj);

                worldObj.GameObject.transform.SetParent(markerObj.GameObject.transform, false);
                worldObj.GameObject.transform.localPosition = Vector3.zero;
                worldObj.GameObject.transform.localScale    = ItemScale;
                worldObj.GameObject.transform.localRotation = Quaternion.identity;

                if (asset.OnOpen != null)
                {
                    asset.OnOpen();
                }

                worldObj.GameObject.SetActive(true);
            }
            else
            {
                if (activeObject.PendingLoads.Contains(asset.Marker.GetIdentifier()))
                {
                    return;
                }

                activeObject.PendingLoads.Add(asset.Marker.GetIdentifier());

                AssetLoader.LoadAsset <GameObject>(asset.AssetInstance.Asset, (gameObj) =>
                {
                    activeObject.PendingLoads.Remove(asset.Marker.GetIdentifier());

                    // parent object could have been destroyed
                    if (gameObj && markerObj.GameObject)
                    {
                        var assetObj = Instantiate(MarkerAssetObject);

                        worldObj = CreateWorldObject(markerObj, assetObj, gameObj, asset.ActivationContext);

                        worldObj.Clicked += (sender, args) =>
                        {
                            if (asset.OnSelect != null)
                            {
                                asset.OnSelect();
                            }
                        };

                        gameObj.transform.SetParent(assetObj.LayoutObject.transform, false);
                        gameObj.transform.localPosition = Vector3.zero;

                        assetObj.transform.SetParent(markerObj.GameObject.transform, false);
                        assetObj.transform.localPosition = Vector3.zero;
                        assetObj.transform.localScale    = ItemScale;
                        assetObj.transform.localRotation = Quaternion.identity;

                        if (asset.AssetInstance.Layout != null)
                        {
                            LayoutHelper.Apply(assetObj.LayoutObject.transform, asset.AssetInstance.Layout);
                        }

                        var collider = gameObj.GetComponent <Collider>();

                        if (!collider)
                        {
                            gameObj.AddComponent <SphereCollider>();
                        }

                        activeObject.TrackingMarkerObjects.Add(markerObj.GameObject, worldObj);

                        if (asset.OnOpen != null)
                        {
                            asset.OnOpen();
                        }
                    }
                    else
                    {
                        if (asset.MediaUrl != null)
                        {
                            AttachMediaObject(asset, markerObj);
                        }
                    }
                });
            }
        }