using Mapbox.Unity.Map; using Project; using System; using Unity.Netcode; using GeoJSON.Net.Geometry; using Newtonsoft.Json; namespace Virgis { public class MapBoxLayer : MapBoxLayerPrototype { private readonly NetworkVariable data = new(); private MapboxData tmpdata = new(); new protected void Awake() { base.Awake(); featureType = FeatureType.MAP; } public override void OnNetworkSpawn() { base.OnNetworkSpawn(); data.OnValueChanged += SetData; if (IsServer) { data.Value = tmpdata; } else { SetData(data.Value, data.Value); } } public override void OnNetworkDespawn() { base.OnNetworkDespawn(); data.OnValueChanged -= SetData; } public override void Initialize(GeogData props) { Enum.TryParse(props.imagerySourceType, true, out tmpdata.st); Enum.TryParse(props.elevationLayerType, true, out tmpdata.lt); Enum.TryParse(props.elevationSourceType, true, out tmpdata.et); tmpdata.origin = State.instance.project.Origin; tmpdata.MapSize = props.MapSize; tmpdata.MapScale = props.MapScale; } private void SetData(MapboxData olddata, MapboxData newdata) { VirgisAbstractMap mbLayer = GetComponent(); mbLayer.UseWorldScale(); mbLayer.SetProperties(newdata.st, newdata.lt, newdata.et, newdata.MapSize); mbLayer.Initialize(newdata.origin.Coordinates.Vector2d(), newdata.MapScale); } } /// /// Serializeable struct that defines all data needed to instantiate the Mapbox Map /// struct MapboxData : INetworkSerializable { public ImagerySourceType st; public ElevationLayerType lt; public ElevationSourceType et; public Point origin; public int MapSize; public int MapScale; public void NetworkSerialize(BufferSerializer serializer) where T : IReaderWriter { if (serializer.IsReader) { var reader = serializer.GetFastBufferReader(); reader.ReadValueSafe(out st); reader.ReadValueSafe(out lt); reader.ReadValueSafe(out et); reader.ReadValueSafe(out string json); origin = JsonConvert.DeserializeObject(json); reader.ReadValueSafe(out MapSize); reader.ReadValueSafe(out MapScale); } else { var writer = serializer.GetFastBufferWriter(); writer.WriteValueSafe(st); writer.WriteValueSafe(lt); writer.WriteValueSafe(et); writer.WriteValueSafe(JsonConvert.SerializeObject(origin)); writer.WriteValueSafe(MapSize); writer.WriteValueSafe(MapScale); } } } }