123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- using System.Collections.Generic;
- using System.Globalization;
- using System.Xml;
- using UnityEngine;
- namespace ARLocation
- {
- public class WebMapLoader : MonoBehaviour
- {
- public class DataEntry
- {
- public int id;
- public double lat;
- public double lng;
- public double altitude;
- public string altitudeMode;
- public string name;
- public string meshId;
- public float movementSmoothing;
- public int maxNumberOfLocationUpdates;
- public bool useMovingAverage;
- public bool hideObjectUtilItIsPlaced;
- public AltitudeMode getAltitudeMode()
- {
- if (altitudeMode == "GroundRelative")
- {
- return AltitudeMode.GroundRelative;
- }
- else if (altitudeMode == "DeviceRelative")
- {
- return AltitudeMode.DeviceRelative;
- }
- else if (altitudeMode == "Absolute")
- {
- return AltitudeMode.Absolute;
- }
- else
- {
- return AltitudeMode.Ignore;
- }
- }
- }
- /// <summary>
- /// The `PrefabDatabase` ScriptableObject, containing a dictionary of Prefabs with a string ID.
- /// </summary>
- public PrefabDatabase PrefabDatabase;
- /// <summary>
- /// The XML data file download from the Web Map Editor (htttps://editor.unity-ar-gps-location.com)
- /// </summary>
- public TextAsset XmlDataFile;
- /// <summary>
- /// If true, enable DebugMode on the `PlaceAtLocation` generated instances.
- /// </summary>
- public bool DebugMode;
- /// <summary>
- /// Returns a list of the `PlaceAtLocation` instances created by this compoonent.
- /// >/summary>
- public List<PlaceAtLocation> Instances
- {
- get => _placeAtComponents;
- }
- private List<DataEntry> _dataEntries = new List<DataEntry>();
- private List<PlaceAtLocation> _placeAtComponents = new List<PlaceAtLocation>();
- // Start is called before the first frame update
- void Start()
- {
- LoadXmlFile();
- BuildGameObjects();
- }
- /// <summary>
- ///
- /// Calls `SetActive(value)` for each of the gameObjects created by this component.
- ///
- /// </summary>
- public void SetActiveGameObjects(bool value)
- {
- foreach (var i in _placeAtComponents)
- {
- i.gameObject.SetActive(value);
- }
- }
- /// <summary>
- ///
- /// Hides all the meshes contained on each of the gameObjects created
- /// by this component, but does not disable the gameObjects.
- ///
- /// </summary>
- public void HideMeshes()
- {
- foreach (var i in _placeAtComponents)
- {
- Utils.Misc.HideGameObject(i.gameObject);
- }
- }
- /// <summary>
- ///
- /// Makes all the gameObjects visible after calling `HideMeshes`.
- ///
- /// </summary>
- public void ShowMeshes()
- {
- foreach (var i in _placeAtComponents)
- {
- Utils.Misc.ShowGameObject(i.gameObject);
- }
- }
- void BuildGameObjects()
- {
- foreach (var entry in _dataEntries)
- {
- var Prefab = PrefabDatabase.GetEntryById(entry.meshId);
- if (!Prefab)
- {
- Debug.LogWarning($"[ARLocation#WebMapLoader]: Prefab {entry.meshId} not found.");
- continue;
- }
- var PlacementOptions = new PlaceAtLocation.PlaceAtOptions()
- {
- MovementSmoothing = entry.movementSmoothing,
- MaxNumberOfLocationUpdates = entry.maxNumberOfLocationUpdates,
- UseMovingAverage = entry.useMovingAverage,
- HideObjectUntilItIsPlaced = entry.hideObjectUtilItIsPlaced
- };
- var location = new Location()
- {
- Latitude = entry.lat,
- Longitude = entry.lng,
- Altitude = entry.altitude,
- AltitudeMode = entry.getAltitudeMode(),
- Label = entry.name
- };
- var instance = PlaceAtLocation.CreatePlacedInstance(Prefab,
- location,
- PlacementOptions,
- DebugMode);
- _placeAtComponents.Add(instance.GetComponent<PlaceAtLocation>());
- }
- }
- // Update is called once per frame
- void LoadXmlFile()
- {
- var xmlString = XmlDataFile.text;
- Debug.Log(xmlString);
- XmlDocument xmlDoc = new XmlDocument();
- try
- {
- xmlDoc.LoadXml(xmlString);
- }
- catch (XmlException e)
- {
- Debug.LogError("[ARLocation#WebMapLoader]: Failed to parse XML file: " + e.Message);
- }
- var root = xmlDoc.FirstChild;
- var nodes = root.ChildNodes;
- foreach (XmlNode node in nodes)
- {
- Debug.Log(node.InnerXml);
- Debug.Log(node["id"].InnerText);
- int id = int.Parse(node["id"].InnerText);
- double lat = double.Parse(node["lat"].InnerText, CultureInfo.InvariantCulture);
- double lng = double.Parse(node["lng"].InnerText, CultureInfo.InvariantCulture);
- double altitude = double.Parse(node["altitude"].InnerText, CultureInfo.InvariantCulture);
- string altitudeMode = node["altitudeMode"].InnerText;
- string name = node["name"].InnerText;
- string meshId = node["meshId"].InnerText;
- float movementSmoothing = float.Parse(node["movementSmoothing"].InnerText, CultureInfo.InvariantCulture);
- int maxNumberOfLocationUpdates = int.Parse(node["maxNumberOfLocationUpdates"].InnerText);
- bool useMovingAverage = bool.Parse(node["useMovingAverage"].InnerText);
- bool hideObjectUtilItIsPlaced = bool.Parse(node["hideObjectUtilItIsPlaced"].InnerText);
- DataEntry entry = new DataEntry()
- {
- id = id,
- lat = lat,
- lng = lng,
- altitudeMode = altitudeMode,
- altitude = altitude,
- name = name,
- meshId = meshId,
- movementSmoothing = movementSmoothing,
- maxNumberOfLocationUpdates = maxNumberOfLocationUpdates,
- useMovingAverage = useMovingAverage,
- hideObjectUtilItIsPlaced = hideObjectUtilItIsPlaced
- };
- _dataEntries.Add(entry);
- Debug.Log($"{id}, {lat}, {lng}, {altitude}, {altitudeMode}, {name}, {meshId}, {movementSmoothing}, {maxNumberOfLocationUpdates}, {useMovingAverage}, {hideObjectUtilItIsPlaced}");
- }
- }
- }
- }
|