You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
6.0 KiB
156 lines
6.0 KiB
using System.Collections;
|
|
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;
|
|
|
|
private List<DataEntry> _dataEntries = new List<DataEntry>();
|
|
private List<GameObject> _stages = new List<GameObject>();
|
|
private List<PlaceAtLocation> _placeAtComponents = new List<PlaceAtLocation>();
|
|
|
|
// Start is called before the first frame update
|
|
void Start()
|
|
{
|
|
LoadXmlFile();
|
|
BuildGameObjects();
|
|
}
|
|
|
|
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);
|
|
|
|
_stages.Add(instance);
|
|
}
|
|
}
|
|
|
|
// 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}");
|
|
}
|
|
}
|
|
}
|
|
}
|