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(); }
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(); }
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); }
/* * 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(); } } }
public ARMarkerTrackingEventArgs(string markerIdentifier, GameObject gameObject) { MarkerObject = new ARMarkerObject(markerIdentifier, gameObject); }
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); } } }); } }