23 Commits

Author SHA1 Message Date
b33e5ca223 build: Update project version 2025-02-26 15:58:15 +08:00
fe4430b1bf feat: Add new event sources 2025-02-26 15:58:02 +08:00
5a48073152 ci: Update plugins 2025-02-26 15:57:04 +08:00
41c1e6f9fd fix: Fix network events invalidating map view 2025-02-26 15:36:02 +08:00
0743fa45eb fix: Keep ongoing events if present on reported 2025-02-26 15:18:37 +08:00
7f2c0d2e23 fix: Keep ongoing events if present on reported 2025-02-26 15:05:34 +08:00
14202714cc fix: Fix error on polygon elements with holes 2025-02-26 01:20:18 +08:00
ce0c23805a refactor: Remove useless suppressions 2025-02-22 15:39:38 +08:00
75124a4f62 feat: Add assembly version 2025-02-22 00:30:42 +08:00
9193eb9c8c refactor: Cleanup 2025-02-21 21:43:53 +08:00
c0b3449cc8 fix: Fix ongoing event cycling logic (Amend) 2025-02-21 21:43:32 +08:00
d986418927 fix: Suppress verbose event logs 2025-02-21 21:43:09 +08:00
0adea1a325 fix: Remove SeverityColorMapping config 2025-02-21 21:42:28 +08:00
399fb577f3 fix: Modify the cycling duration of ongoing events 2025-02-21 21:41:46 +08:00
c3cd512611 fix: Fix ongoing event cycling logic 2025-02-21 21:40:54 +08:00
f783d45e23 fix: Ensure UpdateTransform is called at most once per frame 2025-02-21 21:38:26 +08:00
04ba735ea6 fix: Improve performance for map tile loading 2025-02-19 21:52:08 +08:00
7bfe335c13 fix: Fix incorrect pooling logic in multi-line renderer 2025-02-19 21:51:31 +08:00
4c812db03a fix: Add missing usings 2025-02-19 21:50:26 +08:00
6ee7a4720c fix: Fix memory leak from instantiated materials in line renderer and polygon renderer 2025-02-19 21:49:38 +08:00
302dc36eba fix: Fix ongoing event cycling logic 2025-02-19 21:48:17 +08:00
3ca96c1a68 feat: Add status view 2025-02-19 21:43:45 +08:00
fbf35c923b refactor: Fix namespace name 2025-02-19 21:42:21 +08:00
93 changed files with 953 additions and 99 deletions

View File

@@ -1,7 +1,7 @@
using System;
using UnityEngine;
namespace Utils {
namespace Cryville.Common.Unity {
public class PropertyTweener<T> {
readonly Func<T> _getter;
readonly Action<T> _setter;

View File

@@ -0,0 +1,3 @@
using System.Reflection;
[assembly: AssemblyVersion("0.0.2")]

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c468580e7742d414e96822c2dfe6e4b4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,10 +1,10 @@
using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace Cryville.EEW.Unity {
record Config(
string SeverityScheme,
string SeverityColorMapping,
float SeverityColorMappingLuminanceMultiplier,
bool UseContinuousColor,
string ColorScheme,
@@ -16,7 +16,6 @@ namespace Cryville.EEW.Unity {
IReadOnlyCollection<EventSourceConfig> EventSources
) {
public static Config Default => new(
"Default",
"Default",
1f,
false,
@@ -27,28 +26,34 @@ namespace Cryville.EEW.Unity {
true,
new List<EventSourceConfig> {
new JMAAtomEventSourceConfig(),
new JMAAtomEventSourceConfig(Array.Empty<string>()),
new UpdateCheckerEventSourceConfig(),
new WolfxEventSourceConfig(),
new WolfxEventSourceConfig(Array.Empty<string>()),
}
);
}
[JsonPolymorphic(TypeDiscriminatorPropertyName = "Type", UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FallBackToBaseType)]
[JsonDerivedType(typeof(BMKGOpenDataEventSourceConfig), "BMKGOpenData")]
[JsonDerivedType(typeof(CWAOpenDataEventSourceConfig), "CWAOpenData")]
[JsonDerivedType(typeof(EMSCRealTimeEventSourceConfig), "EMSCRealTime")]
[JsonDerivedType(typeof(GlobalQuakeServerEventSourceConfig), "GlobalQuakeServer")]
[JsonDerivedType(typeof(GlobalQuakeServer15EventSourceConfig), "GlobalQuakeServer15")]
[JsonDerivedType(typeof(JMAAtomEventSourceConfig), "JMAAtom")]
[JsonDerivedType(typeof(NOAAEventSourceConfig), "NOAA")]
[JsonDerivedType(typeof(UpdateCheckerEventSourceConfig), "UpdateChecker")]
[JsonDerivedType(typeof(USGSQuakeMLEventSourceConfig), "USGSQuakeML")]
[JsonDerivedType(typeof(WolfxEventSourceConfig), "Wolfx")]
abstract record EventSourceConfig();
record BMKGOpenDataEventSourceConfig([property: JsonRequired] string[] Subtypes) : EventSourceConfig;
record CWAOpenDataEventSourceConfig([property: JsonRequired] string Subtype, [property: JsonRequired] string Token) : EventSourceConfig;
record EMSCRealTimeEventSourceConfig() : EventSourceConfig;
record GlobalQuakeServerEventSourceConfig([property: JsonRequired] string Host, int Port = 38000) : EventSourceConfig;
record GlobalQuakeServer15EventSourceConfig(string Host, int Port = 38000) : GlobalQuakeServerEventSourceConfig(Host, Port);
record JMAAtomEventSourceConfig(IReadOnlyCollection<string> Filter = null, bool IsFilterWhitelist = false) : EventSourceConfig;
record NOAAEventSourceConfig([property: JsonRequired] string Subtype) : EventSourceConfig;
record UpdateCheckerEventSourceConfig : EventSourceConfig;
record USGSQuakeMLEventSourceConfig([property: JsonRequired] string Subtype) : EventSourceConfig;
record WolfxEventSourceConfig(IReadOnlyCollection<string> Filter = null, bool IsFilterWhitelist = false) : EventSourceConfig;
[JsonSerializable(typeof(Config))]

View File

@@ -26,7 +26,7 @@ namespace Cryville.EEW.Unity.Map {
_tiles.CacheDir = Application.temporaryCachePath;
_camera.orthographicSize = 0.5f / MathF.Max(1, (float)_camera.pixelWidth / _camera.pixelHeight);
_elementLayerZ = m_layerElement.transform.position.z;
UpdateTransform();
_mapElementUpdated = true;
}
void OnDestroy() {
_tiles.Dispose();
@@ -39,7 +39,9 @@ namespace Cryville.EEW.Unity.Map {
static readonly Rect _viewportRect = new(0, 0, 1, 1);
Vector3? ppos;
bool _mapElementUpdated;
void Update() {
bool flag = false;
var cpos = Input.mousePosition;
bool isMouseInViewport = _viewportRect.Contains(_camera.ScreenToViewportPoint(Input.mousePosition));
if (Input.GetMouseButtonDown(0) && isMouseInViewport) {
@@ -49,18 +51,25 @@ namespace Cryville.EEW.Unity.Map {
var delta = _camera.ScreenToWorldPoint(pos0) - _camera.ScreenToWorldPoint(cpos);
transform.position += delta;
ppos = cpos;
UpdateTransform();
flag = true;
}
if (Input.GetMouseButtonUp(0)) {
ppos = null;
}
if (Input.mouseScrollDelta.y != 0 && isMouseInViewport) {
Scale *= Mathf.Pow(2, -Input.mouseScrollDelta.y / 8);
UpdateTransform();
flag = true;
}
if (_mapElementUpdated) {
_mapElementUpdated = false;
ZoomToMapElement();
flag = true;
}
if (flag) {
UpdateTransform(); // Ensure UpdateTransform is called at most once per frame for tiles to unload correctly
}
}
public void OnMapElementUpdated() {
void ZoomToMapElement() {
var aabb = m_layerElement.AABB;
if (aabb is not RectangleF b) return;
if (b.Width * _camera.pixelHeight < _camera.pixelWidth * b.Height)
@@ -70,7 +79,9 @@ namespace Cryville.EEW.Unity.Map {
Scale *= 0.6f;
if (Scale < 0.01f) Scale = 0.01f;
transform.localPosition = new PointF(b.X + b.Width / 2, b.Y + b.Height / 2).ToVector2();
UpdateTransform();
}
public void OnMapElementUpdated() {
_mapElementUpdated = true;
}
void UpdateTransform() {

View File

@@ -4,7 +4,7 @@ MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
executionOrder: 5
icon: {instanceID: 0}
userData:
assetBundleName:

View File

@@ -13,11 +13,16 @@ namespace Cryville.EEW.Unity.Map {
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
class LineRenderer : MonoBehaviour {
Material _sharedMaterial;
public Material Material {
get => _meshRenderer.material;
get => _meshRenderer.sharedMaterial;
set {
_meshRenderer.material = value;
_meshRenderer.material.color = m_color;
if (value == _sharedMaterial) return;
if (_sharedMaterial != null) Destroy(_meshRenderer.sharedMaterial);
_sharedMaterial = value;
if (_sharedMaterial == null) return;
_meshRenderer.sharedMaterial = Instantiate(_sharedMaterial);
_meshRenderer.sharedMaterial.color = m_color;
}
}
@@ -28,7 +33,7 @@ namespace Cryville.EEW.Unity.Map {
set {
if (m_color == value) return;
m_color = value;
_meshRenderer.material.color = value;
_meshRenderer.sharedMaterial.color = value;
}
}
@@ -126,12 +131,17 @@ namespace Cryville.EEW.Unity.Map {
_meshFilter.mesh = new();
}
_mesh = _meshFilter.mesh;
_meshRenderer.material.color = m_color;
if (_sharedMaterial == null && _meshRenderer.sharedMaterial != null) {
_sharedMaterial = _meshRenderer.sharedMaterial;
_meshRenderer.sharedMaterial = Instantiate(_sharedMaterial);
_meshRenderer.sharedMaterial.color = m_color;
}
}
void OnDestroy() {
if (_positions is not null)
ArrayPool<Vector2>.Shared.Return(_positions);
Destroy(_mesh);
Destroy(Material);
}
void LateUpdate() {
if (_valid) return;

View File

@@ -1,9 +1,12 @@
using Cryville.EEW.BMKGOpenData.Map;
using Cryville.EEW.Core;
using Cryville.EEW.CWAOpenData.Map;
using Cryville.EEW.EMSC.Map;
using Cryville.EEW.GlobalQuake.Map;
using Cryville.EEW.JMAAtom.Map;
using Cryville.EEW.Map;
using Cryville.EEW.NOAA.Map;
using Cryville.EEW.QuakeML.Map;
using Cryville.EEW.Report;
using Cryville.EEW.Wolfx.Map;
using System.Collections.Generic;
@@ -22,6 +25,9 @@ namespace Cryville.EEW.Unity.Map {
readonly List<ReportViewModel> _displayingReports = new();
readonly List<int> _displayingOrder = new();
public int Count => _displayingReports.Count;
public int OngoingCount => _displayingReports.Count - (_selected != null ? 1 : 0);
[SerializeField] MapElementManager m_subManager;
public RectangleF? AABB {
@@ -37,25 +43,44 @@ namespace Cryville.EEW.Unity.Map {
return _displayingElements[index].AABB;
}
public void AddOngoing(ReportViewModel e) => Add(e);
public void RemoveOngoing(ReportViewModel e) => Remove(e);
public void SetSelected(ReportViewModel e) {
if (_selected is not null)
public void SetSelected(ReportViewModel e, bool forced = false) {
if (e == null) {
Remove(_selected);
if (e == null || _displayingReports.Contains(e)) {
_selected = null;
return;
}
Add(e);
if (_displayingReports.Contains(e)) {
if (forced) return;
Remove(_selected);
_selected = null;
return;
}
if (e.IsExcludedFromHistory)
return;
if (!Add(e))
return;
if (_selected is not null)
Remove(_selected);
_selected = e;
}
public void SetCurrent(ReportViewModel e) {
public bool SetCurrent(ReportViewModel e) {
if (e == null) {
_current = null;
return true;
}
if (!_displayingReports.Contains(e)) {
_current = null;
return false;
}
if (_current == e)
return false;
_current = e;
return true;
}
void Add(ReportViewModel e) {
public bool Add(ReportViewModel e) {
var element = Build(e.Model, out _, out int order);
if (element == null) return;
if (element == null) return false;
var pos = element.transform.localPosition;
pos.z = OrderToZ(_displayingOrder.Sum());
element.transform.localPosition = pos;
@@ -64,8 +89,10 @@ namespace Cryville.EEW.Unity.Map {
_displayingOrder.Add(order);
element.transform.SetParent(transform, false);
if (m_subManager != null) m_subManager.Add(e);
return true;
}
void Remove(ReportViewModel e) {
public void Remove(ReportViewModel e) {
if (_current == e) _current = null;
int index = _displayingReports.IndexOf(e);
if (index == -1) return;
_displayingElements.RemoveAt(index);
@@ -100,16 +127,19 @@ namespace Cryville.EEW.Unity.Map {
}
readonly ContextedGeneratorManager<IMapGeneratorContext, MapElement> _gen = new(new IContextedGenerator<IMapGeneratorContext, MapElement>[] {
new BMKGEarthquakeMapGenerator(),
new CENCEarthquakeMapGenerator(),
new CENCEEWMapGenerator(),
new CWAEarthquakeMapGenerator(),
new CWAEEWMapGenerator(),
new CWATsunamiMapGenerator(),
new EMSCRealTimeEventMapGenerator(),
new FujianEEWMapGenerator(),
new GlobalQuakeMapViewGenerator(),
new JMAAtomMapGenerator(),
new JMAEEWMapGenerator(),
new NOAAMapGenerator(),
new QuakeMLEventMapGenerator(),
new SichuanEEWMapGenerator(),
});
public UnityMapElement Build(object e, out CultureInfo culture, out int order) {

View File

@@ -1,6 +1,5 @@
using Cryville.EEW.Core.Map;
using System;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Net.Http;
using System.Threading;
@@ -67,7 +66,6 @@ namespace Cryville.EEW.Unity.Map {
_downloadDone = true;
}
[SuppressMessage("CodeQuality", "IDE0051", Justification = "Unity message")]
void Update() {
if (_downloadDone) {
try {
@@ -87,7 +85,7 @@ namespace Cryville.EEW.Unity.Map {
if (_texHandler.isDone) {
_tex = _texHandler.texture;
_tex.wrapMode = TextureWrapMode.Clamp;
_sprite = Sprite.Create(_tex, new Rect(0, 0, _tex.width, _tex.height), Vector2.zero, _tex.height);
_sprite = Sprite.Create(_tex, new Rect(0, 0, _tex.width, _tex.height), Vector2.zero, _tex.height, 0, SpriteMeshType.FullRect, Vector4.zero, false);
_renderer.sprite = _sprite;
}
else {
@@ -100,11 +98,11 @@ namespace Cryville.EEW.Unity.Map {
_callback?.Invoke(this);
}
[SuppressMessage("CodeQuality", "IDE0051", Justification = "Unity message")]
void OnDestroy() {
if (_req != null) {
_req.Abort();
_req.Dispose();
_texHandler.Dispose();
}
if (_sprite) Destroy(_sprite);
if (_tex) Destroy(_tex);

View File

@@ -48,11 +48,13 @@ namespace Cryville.EEW.Unity.Map {
_segments.Add(segment = Instantiate(m_lineRendererPrefab, transform, false).GetComponent<LineRenderer>());
}
else {
segment = _segments[_segmentIndex++];
segment = _segments[_segmentIndex];
segment.gameObject.SetActive(true);
}
_segmentIndex++;
segment.SetPositions(positions, index, length);
segment.Width = m_width;
segment.TilingScale = m_tilingScale;
}
public void Clear() {
for (int i = 0; i < _segmentIndex; i++) {

View File

@@ -11,11 +11,16 @@ namespace Cryville.EEW.Unity.Map {
[RequireComponent(typeof(MeshFilter))]
[RequireComponent(typeof(MeshRenderer))]
class PolygonRenderer : MonoBehaviour {
Material _sharedMaterial;
public Material Material {
get => _meshRenderer.material;
get => _meshRenderer.sharedMaterial;
set {
_meshRenderer.material = value;
_meshRenderer.material.color = m_color;
if (value == _sharedMaterial) return;
if (_sharedMaterial != null) Destroy(_meshRenderer.sharedMaterial);
_sharedMaterial = value;
if (_sharedMaterial == null) return;
_meshRenderer.sharedMaterial = Instantiate(_sharedMaterial);
_meshRenderer.sharedMaterial.color = m_color;
}
}
@@ -40,10 +45,15 @@ namespace Cryville.EEW.Unity.Map {
_meshFilter.mesh = new();
}
_mesh = _meshFilter.mesh;
_meshRenderer.material.color = m_color;
if (_sharedMaterial == null && _meshRenderer.sharedMaterial != null) {
_sharedMaterial = _meshRenderer.sharedMaterial;
_meshRenderer.sharedMaterial = Instantiate(_sharedMaterial);
_meshRenderer.sharedMaterial.color = m_color;
}
}
void OnDestroy() {
Destroy(_mesh);
Destroy(Material);
}
public void SetPolygon(IEnumerable<IEnumerable<PointF>> polygon) {
_mesh.Clear();
@@ -67,7 +77,13 @@ namespace Cryville.EEW.Unity.Map {
DTSweep.Triangulate(tcx);
var codeToIndex = new Dictionary<uint, int>();
var vertices = ArrayPool<Vector3>.Shared.Rent(convertedPolygon.Points.Count);
int vertexCount = convertedPolygon.Points.Count;
if (convertedPolygon.Holes != null) {
foreach (var hole in convertedPolygon.Holes) {
vertexCount += hole.Points.Count;
}
}
var vertices = ArrayPool<Vector3>.Shared.Rent(vertexCount);
var triangles = ArrayPool<int>.Shared.Rent(convertedPolygon.Triangles.Count * 3);
int vi = 0, ii = 0;
foreach (var tri in convertedPolygon.Triangles) {

View File

@@ -69,11 +69,14 @@ namespace Cryville.EEW.Unity {
"Legacy" => new LegacySeverityScheme(),
_ => throw new InvalidOperationException("Unknown severity scheme."),
};
SeverityColorMapping = config.SeverityColorMapping switch {
SeverityColorMapping = config.ColorScheme switch {
"Default" => new DefaultSeverityColorMapping(config.SeverityColorMappingLuminanceMultiplier),
"SREV" => new SREVSeverityColorMapping(config.SeverityColorMappingLuminanceMultiplier),
"SREVBorder" => new SREVBorderSeverityColorMapping(config.SeverityColorMappingLuminanceMultiplier),
_ => throw new InvalidOperationException("Unknown severity color mapping."),
"DichromaticYB" => new DichromaticSeverityColorMapping(0.62f, 0.20f, 90, config.SeverityColorMappingLuminanceMultiplier),
"DichromaticRC" => new DichromaticSeverityColorMapping(0.62f, 0.25f, 30, config.SeverityColorMappingLuminanceMultiplier),
"DichromaticPG" => new DichromaticSeverityColorMapping(0.62f, 0.30f, -30, config.SeverityColorMappingLuminanceMultiplier),
"Monochromatic" => new MonochromaticSeverityColorMapping(config.SeverityColorMappingLuminanceMultiplier),
_ => throw new InvalidOperationException("Unknown color scheme."),
};
UseContinuousColor = config.UseContinuousColor;
ColorScheme = config.ColorScheme switch {

View File

@@ -16,8 +16,6 @@ namespace Cryville.EEW.Unity.UI {
readonly List<ReportViewModel> _displayingReports = new();
readonly List<EventOngoingView> _displayingViews = new();
public int Count => _displayingReports.Count;
public void Add(ReportViewModel e) {
_displayingReports.Add(e);
@@ -81,14 +79,15 @@ namespace Cryville.EEW.Unity.UI {
m_currentView.SetViewModel(e, true);
var keyProp = e.Properties.FirstOrDefault();
_displayingViews[_index].SetCurrent(true);
_tickDown = Math.Max(0, keyProp?.Severity ?? 0) * 4 + 4;
_tickDown = MathF.Exp(Math.Max(-1f, keyProp?.Severity ?? -1f) + 1);
m_currentView.gameObject.SetActive(true);
Worker.Instance.SetCurrent(e);
}
public void SetCurrent(ReportViewModel viewModel) {
public void OnItemClicked(ReportViewModel viewModel) {
int index = _displayingReports.IndexOf(viewModel);
if (index == -1) return;
SwitchTo(index);
Worker.Instance.SetSelected(null);
}
}
}

View File

@@ -1,10 +1,10 @@
using Cryville.Common.Unity;
using Cryville.Common.Unity.UI;
using Cryville.EEW.Report;
using System.Globalization;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
using Utils;
namespace Cryville.EEW.Unity.UI {
class EventOngoingView : MonoBehaviour {
@@ -51,7 +51,7 @@ namespace Cryville.EEW.Unity.UI {
m_button.onClick.AddListener(OnViewClicked);
}
void OnViewClicked() {
EventOngoingListView.Instance.SetCurrent(_viewModel);
EventOngoingListView.Instance.OnItemClicked(_viewModel);
}
void Update() {
_dockRatioTweener.Advance(Time.deltaTime);

View File

@@ -0,0 +1,27 @@
using System.Globalization;
using TMPro;
using UnityEngine;
namespace Cryville.EEW.Unity.UI {
[RequireComponent(typeof(TMP_Text))]
class StatusView : MonoBehaviour {
TMP_Text _textView;
void Awake() {
_textView = GetComponent<TMP_Text>();
}
void Update() {
_textView.text = string.Format(
CultureInfo.InvariantCulture,
"FPS: i{0:0} / s{1:0}\nSMem: {2:N0} / {3:N0}\nIMem: {4:N0} / {5:N0}",
1 / Time.deltaTime,
1 / Time.smoothDeltaTime,
UnityEngine.Profiling.Profiler.GetMonoUsedSizeLong(),
UnityEngine.Profiling.Profiler.GetMonoHeapSizeLong(),
UnityEngine.Profiling.Profiler.GetTotalAllocatedMemoryLong(),
UnityEngine.Profiling.Profiler.GetTotalReservedMemoryLong()
);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4e142baf0f0bd70439133e17e7185611
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,20 +1,28 @@
using Cryville.EEW.BMKGOpenData;
using Cryville.EEW.BMKGOpenData.TTS;
using Cryville.EEW.Core;
using Cryville.EEW.CWAOpenData;
using Cryville.EEW.CWAOpenData.Model;
using Cryville.EEW.CWAOpenData.TTS;
using Cryville.EEW.EMSC;
using Cryville.EEW.GlobalQuake;
using Cryville.EEW.JMAAtom;
using Cryville.EEW.JMAAtom.TTS;
using Cryville.EEW.NOAA;
using Cryville.EEW.NOAA.TTS;
using Cryville.EEW.QuakeML;
using Cryville.EEW.Report;
using Cryville.EEW.Unity.Map;
using Cryville.EEW.Unity.UI;
using Cryville.EEW.UpdateChecker;
using Cryville.EEW.USGS;
using Cryville.EEW.Wolfx;
using Cryville.EEW.Wolfx.Model;
using Cryville.EEW.Wolfx.TTS;
using System;
using System.Collections.Concurrent;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading;
@@ -78,20 +86,24 @@ namespace Cryville.EEW.Unity {
}
static void RegisterViewModelGenerators(CoreWorker worker) {
worker.RegisterViewModelGenerator(new BMKGEarthquakeRVMGenerator());
worker.RegisterViewModelGenerator(new CENCEarthquakeRVMGenerator());
worker.RegisterViewModelGenerator(new CENCEEWRVMGenerator());
worker.RegisterViewModelGenerator(new CWAEarthquakeRVMGenerator());
worker.RegisterViewModelGenerator(new CWAEEWRVMGenerator());
worker.RegisterViewModelGenerator(new CWATsunamiRVMGenerator());
worker.RegisterViewModelGenerator(new EMSCRealTimeEventRVMGenerator());
worker.RegisterViewModelGenerator(new FujianEEWRVMGenerator());
worker.RegisterViewModelGenerator(new GlobalQuakeRVMGenerator());
worker.RegisterViewModelGenerator(new JMAAtomRVMGenerator());
worker.RegisterViewModelGenerator(new JMAEEWRVMGenerator());
worker.RegisterViewModelGenerator(new NOAAAtomRVMGenerator());
worker.RegisterViewModelGenerator(new QuakeMLEventRVMGenerator());
worker.RegisterViewModelGenerator(new SichuanEEWRVMGenerator());
worker.RegisterViewModelGenerator(new VersionRVMGenerator());
}
static void RegisterTTSMessageGenerators(CoreWorker worker) {
worker.RegisterTTSMessageGenerator(new BMKGEarthquakeTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new CENCEarthquakeTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new CENCEEWTTSMessageGenerator());
worker.RegisterTTSMessageGenerator(new CWAEarthquakeTTSMessageGenerator());
@@ -112,17 +124,22 @@ namespace Cryville.EEW.Unity {
_worker.AddWorker(new CWAReportWorker<Tsunami>(new Uri("http://localhost:9095/E-A0014-001.json"), "1"));
_worker.AddWorker(new CWAReportWorker<Earthquake>(new Uri("http://localhost:9095/E-A0015-001.json"), "1"));
_worker.AddWorker(new CWAReportWorker<Earthquake>(new Uri("http://localhost:9095/E-A0016-001.json"), "1"));
BMKGOpenDataWorker bmkgWorker = new(new Uri("http://localhost:9095/autogempa.json"));
bmkgWorker.SetDataUris(new Uri[] { new("http://localhost:9095/gempadirasakan.json") });
_worker.AddWorker(bmkgWorker);
_worker.AddWorker(new NOAAAtomWorker(new("http://localhost:9095/PAAQAtom.xml")));
_worker.AddWorker(new UpdateCheckerWorker(typeof(Worker).Assembly.GetName().Version?.ToString(3) ?? "", "unity"));
#else
foreach (var source in SharedSettings.Instance.EventSources) {
_worker.AddWorker(source switch {
BMKGOpenDataEventSourceConfig bmkgOpenData => BuildBMKGOpenDataWorkerUris(new BMKGOpenDataWorker(new("https://data.bmkg.go.id/DataMKG/TEWS/autogempa.json")), bmkgOpenData),
CWAOpenDataEventSourceConfig cwaOpenData => cwaOpenData.Subtype switch {
"E-A0014-001" => new CWAReportWorker<Tsunami>(new Uri("https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0014-001"), cwaOpenData.Token, 1440, 17280),
"E-A0015-001" => new CWAReportWorker<Earthquake>(new Uri("https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0015-001"), cwaOpenData.Token),
"E-A0016-001" => new CWAReportWorker<Earthquake>(new Uri("https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0016-001"), cwaOpenData.Token),
_ => throw new InvalidOperationException("Unknown CWA open data sub-type."),
},
EMSCRealTimeEventSourceConfig => new EMSCRealTimeWorker(new("wss://www.seismicportal.eu/standing_order/websocket")),
GlobalQuakeServer15EventSourceConfig gq => new GlobalQuakeWorker15(gq.Host, gq.Port),
GlobalQuakeServerEventSourceConfig gq => new GlobalQuakeWorker(gq.Host, gq.Port),
JMAAtomEventSourceConfig jmaAtom => BuildJMAAtomWorkerFilter(new JMAAtomWorker(new("https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml")), jmaAtom),
@@ -132,19 +149,19 @@ namespace Cryville.EEW.Unity {
_ => throw new InvalidOperationException("Unknown NOAA sub-type."),
},
UpdateCheckerEventSourceConfig => new UpdateCheckerWorker(typeof(Worker).Assembly.GetName().Version?.ToString(3) ?? "", "unity"),
USGSQuakeMLEventSourceConfig usgsQuakeML => BuildUSGSQuakeMLWorkerUri(new USGSQuakeMLWorker(new Uri("https://earthquake.usgs.gov/earthquakes/feed/v1.0/quakeml.php")), usgsQuakeML),
WolfxEventSourceConfig wolfx => BuildWolfxWorkerFilter(new WolfxWorker(new Uri("wss://ws-api.wolfx.jp/all_eew")), wolfx),
_ => throw new InvalidOperationException("Unknown event source type."),
});
}
#endif
}
#if !UNITY_EDITOR
JMAAtomWorker BuildJMAAtomWorkerFilter(JMAAtomWorker worker, JMAAtomEventSourceConfig config) {
static JMAAtomWorker BuildJMAAtomWorkerFilter(JMAAtomWorker worker, JMAAtomEventSourceConfig config) {
if (config.Filter != null) worker.SetFilter(config.Filter);
worker.IsFilterWhitelist = config.IsFilterWhitelist;
return worker;
}
WolfxWorker BuildWolfxWorkerFilter(WolfxWorker worker, WolfxEventSourceConfig config) {
static WolfxWorker BuildWolfxWorkerFilter(WolfxWorker worker, WolfxEventSourceConfig config) {
if (config.Filter != null) worker.SetFilter(config.Filter.Select(i => i switch {
"cenc_eew" => typeof(CENCEEW),
"cenc_eqlist" => typeof(WolfxEarthquakeList<CENCEarthquake>),
@@ -157,38 +174,48 @@ namespace Cryville.EEW.Unity {
worker.IsFilterWhitelist = config.IsFilterWhitelist;
return worker;
}
#endif
static BMKGOpenDataWorker BuildBMKGOpenDataWorkerUris(BMKGOpenDataWorker worker, BMKGOpenDataEventSourceConfig config) {
worker.SetDataUris(config.Subtypes.Select(i => new Uri(string.Format(CultureInfo.InvariantCulture, "https://data.bmkg.go.id/DataMKG/TEWS/{0}.json", i))));
return worker;
}
static USGSQuakeMLWorker BuildUSGSQuakeMLWorkerUri(USGSQuakeMLWorker worker, USGSQuakeMLEventSourceConfig config) {
worker.SetFeedRelativeUri(new(string.Format(CultureInfo.InvariantCulture, "/earthquakes/feed/v1.0/summary/{0}.quakeml", config.Subtype), UriKind.Relative));
return worker;
}
readonly OngoingReportManager _ongoingReportManager = new();
readonly ConcurrentQueue<Action> _uiActionQueue = new();
ReportViewModel _latestHistoryReport;
void OnReported(object sender, ReportViewModel e) {
Debug.Log(e);
if (e.Model is Exception && e.Model is not SourceWorkerNetworkException)
Debug.LogError(e);
_ongoingReportManager.Report(e);
_uiActionQueue.Enqueue(() => {
if (m_mapElementManager.OngoingCount == 0) {
m_mapElementManager.SetSelected(e);
m_cameraController.OnMapElementUpdated();
}
if (e.InvalidatedTime == null && (!(e.RevisionKey?.IsCancellation ?? false))) {
_latestHistoryReport = e;
}
m_cameraController.OnMapElementUpdated();
});
}
void OnOngoingReported(ReportViewModel item, CollectionChangeAction action) {
if (action == CollectionChangeAction.Add) {
_uiActionQueue.Enqueue(() => {
m_mapElementManager.AddOngoing(item);
if (m_mapElementManager.Add(item)) {
m_mapElementManager.SetSelected(null);
}
m_ongoingEventList.Add(item);
m_cameraController.OnMapElementUpdated();
});
}
else if (action == CollectionChangeAction.Remove) {
_uiActionQueue.Enqueue(() => {
m_mapElementManager.RemoveOngoing(item);
m_ongoingEventList.Remove(item);
if (m_ongoingEventList.Count == 0 && SharedSettings.Instance.DoSwitchBackToHistory && _latestHistoryReport is not null) {
m_mapElementManager.SetSelected(_latestHistoryReport);
m_mapElementManager.Remove(item);
if (m_mapElementManager.Count == 0 && SharedSettings.Instance.DoSwitchBackToHistory && _latestHistoryReport is not null) {
m_mapElementManager.SetSelected(_latestHistoryReport, true);
}
m_cameraController.OnMapElementUpdated();
m_ongoingEventList.Remove(item);
});
}
}
@@ -203,9 +230,10 @@ namespace Cryville.EEW.Unity {
m_cameraController.OnMapElementUpdated();
}
public void SetCurrent(ReportViewModel e) {
m_mapElementManager.SetCurrent(e);
if (m_mapElementManager.SetCurrent(e)) {
m_cameraController.OnMapElementUpdated();
}
}
void Update() {
while (_uiActionQueue.TryDequeue(out var action)) {

View File

@@ -706,6 +706,7 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 123805241}
- {fileID: 2039723256}
- {fileID: 1925427751}
m_Father: {fileID: 1431650511}
m_RootOrder: 2
@@ -1362,12 +1363,12 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 408286581}
m_RootOrder: 1
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 1180, y: 620}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1925427753
MonoBehaviour:
@@ -1466,6 +1467,158 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1925427750}
m_CullTransparentMesh: 1
--- !u!1 &2039723255
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2039723256}
- component: {fileID: 2039723259}
- component: {fileID: 2039723258}
- component: {fileID: 2039723257}
m_Layer: 5
m_Name: Status
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2039723256
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2039723255}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 408286581}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &2039723257
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2039723255}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e142baf0f0bd70439133e17e7185611, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!114 &2039723258
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2039723255}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 83e7715acbfae1d4b84414c13d03ed3f, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 0
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: 'FPS: i60 / s60
SMem: 0 / 0
IMem: 0 / 0'
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 2b12354fb2d86744887c3e4bfee63986, type: 2}
m_sharedMaterial: {fileID: -3021868053195457599, guid: 2b12354fb2d86744887c3e4bfee63986, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4279769379
m_fontColor: {r: 0.13725491, g: 0.09803922, b: 0.09411765, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 12
m_fontSizeBase: 12
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 0
m_fontSizeMax: 0
m_fontStyle: 0
m_HorizontalAlignment: 1
m_VerticalAlignment: 1024
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_parseCtrlCharacters: 0
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 8, y: 4, z: 8, w: 4}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!222 &2039723259
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2039723255}
m_CullTransparentMesh: 1
--- !u!114 &79416137231161493
MonoBehaviour:
m_ObjectHideFlags: 0

Binary file not shown.

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 9c2c20067e0adc54c813350fd61f9a3a
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: e9164d2df3d1c03499419935666416ae
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 152cea136489ac044b7c12c66ba72b53
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: e1ef9470a2a1d7b4da9ddd106620b665
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 48f0c884a8a1e4043948f765ed18e4bc
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: 4d3d5b78e07866347b2ba028b4bd3ef8
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: ec4fba30706c64142a5504e3f0e64620
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: b3347ce24f73cab44a4191aa8976d88a
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -519,7 +519,7 @@
<param name="Properties">The properties of the feature.</param>
<param name="BoundingBox">The bounding box.</param>
</member>
<member name="M:Cryville.EEW.Models.GeoJSON.Feature.#ctor(System.Object,Cryville.EEW.Models.GeoJSON.Geometry,System.Collections.Generic.IDictionary{System.String,System.Object},System.Double[])">
<member name="M:Cryville.EEW.Models.GeoJSON.Feature.#ctor(System.Text.Json.JsonElement,Cryville.EEW.Models.GeoJSON.Geometry,System.Collections.Generic.IDictionary{System.String,System.Text.Json.JsonElement},System.Double[])">
<summary>
Represents a spatially bounded thing.
</summary>
@@ -741,143 +741,143 @@
<member name="M:Cryville.EEW.Models.GeoJSON.PositionConverter.Write(System.Text.Json.Utf8JsonWriter,Cryville.EEW.Models.GeoJSON.Position,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="T:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext">
<member name="T:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext">
<summary>
<see cref="T:System.Text.Json.Serialization.JsonSerializerContext" /> for GeoJSON objects.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.Double">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.Double">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.NullableDouble">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.NullableDouble">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.DoubleArray">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.DoubleArray">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.Feature">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.Feature">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.FeatureArray">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.FeatureArray">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.FeatureCollection">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.FeatureCollection">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.GeoJSONObject">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.GeoJSONObject">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.Geometry">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.Geometry">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.GeometryArray">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.GeometryArray">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.GeometryCollection">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.GeometryCollection">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.LineString">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.LineString">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.MultiLineString">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.MultiLineString">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.MultiPoint">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.MultiPoint">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.MultiPolygon">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.MultiPolygon">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.Point">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.Point">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.Polygon">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.Polygon">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.Position">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.Position">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.PositionArray">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.PositionArray">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.PositionArrayArray">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.PositionArrayArray">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.PositionArrayArrayArray">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.PositionArrayArrayArray">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.IDictionaryStringObject">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.IDictionaryStringJsonElement">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.Object">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.JsonElement">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.String">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.String">
<summary>
Defines the source generated JSON serialization contract metadata for a given type.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.Default">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.Default">
<summary>
The default <see cref="T:System.Text.Json.Serialization.JsonSerializerContext"/> associated with a default <see cref="T:System.Text.Json.JsonSerializerOptions"/> instance.
</summary>
</member>
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.GeneratedSerializerOptions">
<member name="P:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.GeneratedSerializerOptions">
<summary>
The source-generated options associated with this context.
</summary>
</member>
<member name="M:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.#ctor">
<member name="M:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.#ctor">
<inheritdoc/>
</member>
<member name="M:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.#ctor(System.Text.Json.JsonSerializerOptions)">
<member name="M:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.#ctor(System.Text.Json.JsonSerializerOptions)">
<inheritdoc/>
</member>
<member name="M:Cryville.EEW.Models.GeoJSON.GeoJSONSerializationContext.GetTypeInfo(System.Type)">
<member name="M:Cryville.EEW.Models.GeoJSON.GeoJSONSerializerContext.GetTypeInfo(System.Type)">
<inheritdoc/>
</member>
<member name="T:Cryville.EEW.Models.XmlSerializedDateTimeOffset">
@@ -1039,6 +1039,9 @@
<member name="P:Cryville.EEW.Report.EmptyRVMGeneratorContext.SeverityScheme">
<inheritdoc />
</member>
<member name="P:Cryville.EEW.Report.EmptyRVMGeneratorContext.LocationConverter">
<inheritdoc />
</member>
<member name="T:Cryville.EEW.Report.EmptySeverityScheme">
<summary>
An empty <see cref="T:Cryville.EEW.Report.ISeverityScheme" /> that always returns <c>-1</c>.
@@ -1189,6 +1192,11 @@
The severity scheme.
</summary>
</member>
<member name="P:Cryville.EEW.Report.IRVMGeneratorContext.LocationConverter">
<summary>
The location converter.
</summary>
</member>
<member name="T:Cryville.EEW.Report.ISeverityScheme">
<summary>
Represents a severity scheme, extracting severity values from different properties.
@@ -1497,6 +1505,11 @@
The culture <c>en-US</c>.
</summary>
</member>
<member name="F:Cryville.EEW.SharedCultures.IdIdCulture">
<summary>
The culture <c>id-ID</c>.
</summary>
</member>
<member name="F:Cryville.EEW.SharedCultures.JaJpCulture">
<summary>
The culture <c>ja-JP</c>.
@@ -1549,6 +1562,11 @@
China Standard Time.
</summary>
</member>
<member name="F:Cryville.EEW.SharedTimeZones.SEAsia">
<summary>
SE Asia Standard Time.
</summary>
</member>
<member name="F:Cryville.EEW.SharedTimeZones.Taipei">
<summary>
Taipei Standard Time.

BIN
Assets/Plugins/QuakeML.dll Normal file

Binary file not shown.

View File

@@ -0,0 +1,33 @@
fileFormatVersion: 2
guid: a5809b30a2765e54aa6f2b5d15c00a76
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 75452b90c729a7248958090ab7acd6fd
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,12 @@
{
"Culture": "en-US",
"Strings": {
"Headline": "An earthquake{1} occurred at {0:HH:mm:ss 'on' MMM dd yyyy} Western Indonesia Time.{2}",
"HeadlineDepth": " Hypocenter depth {0}km.",
"HeadlineMagnitude": " of magnitude {0:F1}",
"MaxIntensity": "The maximum intensity observed is {0}.",
"Region": "The epicenter is in {0}.",
"Title": "Earthquake Data.",
"TitleStandAlone": "Earthquake Data"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: e4420490220c6df4fb07cd0c63dec184
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,12 @@
{
"Culture": "id-ID",
"Strings": {
"Headline": "Telah terjadi gempa pada {0:dd MMMM yyyy 'pukul' H 'lewat' m 'menit' s 'detik'} Waktu Indonesia Barat{1}{2}.",
"HeadlineDepth": ", pada kedalaman {0} km",
"HeadlineMagnitude": ", dengan magnitudo {0:F1}",
"MaxIntensity": "Intensitas gempa maksimum yang dirasakan adalah {0}.",
"Region": "Pusat gempa berada di {0}.",
"Title": "Data Gempabumi.",
"TitleStandAlone": "Data Gempabumi"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 76aa8016add210b489ed175d006ef35d
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,12 @@
{
"Culture": "yue-HK",
"Strings": {
"Headline": "印度尼西亞西部時間{0},發生咗一次{1}地震。{2}",
"HeadlineDepth": "震源深度{0}公里。",
"HeadlineMagnitude": "規模{0:F1}級。",
"MaxIntensity": "觀測到嘅最大烈度為{0}。",
"Region": "震中位於{0}。",
"Title": "地震數據。",
"TitleStandAlone": "地震數據"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 8e3514f18dcd7b74b9b54beccc44859a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,12 @@
{
"Culture": "zh-TW",
"Strings": {
"Headline": "印度尼西亞西部時間{0},發生了一次{1}地震。{2}",
"HeadlineDepth": "震源深度{0}公里。",
"HeadlineMagnitude": "規模{0:F1}級。",
"MaxIntensity": "觀測到的最大震度為{0}。",
"Region": "震中位於{0}。",
"Title": "地震數據。",
"TitleStandAlone": "地震數據"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: cfe65eab919d49d468d19f4ecc516dd8
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,12 @@
{
"Culture": "zh-CN",
"Strings": {
"Headline": "印度尼西亚西部时间{0},发生了一次{1}地震。{2}",
"HeadlineDepth": "震源深度{0}千米。",
"HeadlineMagnitude": "规模{0:F1}级",
"MaxIntensity": "观测到的最大烈度为{0}。",
"Region": "震中位于{0}。",
"Title": "地震数据。",
"TitleStandAlone": "地震数据"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 899b38f34c7628c4e936ec2bdfdd5410
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 470f88c90de9dd74387453bffdbf21f7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,6 @@
{
"Culture": "en-US",
"Strings": {
"SourceName": "BMKG Open Data"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: a1d44f3546003e1498cfc23e8d16942f
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,6 @@
{
"Culture": "id-ID",
"Strings": {
"SourceName": "Data Terbuka BMKG"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: f3b9467d0b8b4054c818a5607dcc247a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,6 @@
{
"Culture": "yue-HK",
"Strings": {
"SourceName": "BMKG 開放數據"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: a025449f2f513e14fbbd596f87d47cb3
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,6 @@
{
"Culture": "zh-TW",
"Strings": {
"SourceName": "BMKG 開放數據"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: d7c4a0eac847b5e458d4aaead9380023
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,6 @@
{
"Culture": "zh-CN",
"Strings": {
"SourceName": "BMKG 开放数据"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 76619ea161099bc4ab2efb2ad0802bde
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 561a1f4df4315a04f9bcc5f961a8fd60
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,6 @@
{
"Culture": "en-US",
"Strings": {
"SourceName": "EMSC"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 717e698cdc268a74b990d4c756f2bbda
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
{
"Culture": "en-US",
"Parent": "und",
"Strings": {
"526": "Gulf of America"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 01d2f8da0a8c09b45a8d79163519000a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -75,7 +75,7 @@
"WEHW": "Hawaii",
"WEPA": "non US Pacific",
"WEPA41": "Alaska, British Colombia, and US West Coast",
"WEXX": "US Atlantic, Gulf of Mexico, and Canada",
"WEXX": "US Atlantic, Gulf of America, and Canada",
"WEZS": "American Samoa"
}
},
@@ -378,9 +378,9 @@
"WEPA40": "Tsunami Threat Message for Non US Pacific",
"WEPA41": "Tsunami Warning, Advisory, and Watch for Alaska, British Colombia, and US West Coast",
"WEPA42": "Tsunami Information Statement for Non US Pacific",
"WEXX20": "Tsunami Warning, Advisory, and Watch for US Atlantic, Gulf of Mexico, and Canada",
"WEXX30": "Tsunami Warning, Advisory, and Watch for US Atlantic, Gulf of Mexico, and Canada",
"WEXX32": "Tsunami Information Statement for US Atlantic, Gulf of Mexico, and Canada",
"WEXX20": "Tsunami Warning, Advisory, and Watch for US Atlantic, Gulf of America, and Canada",
"WEXX30": "Tsunami Warning, Advisory, and Watch for US Atlantic, Gulf of America, and Canada",
"WEXX32": "Tsunami Information Statement for US Atlantic, Gulf of America, and Canada",
"WEZS40": "Tsunami Warning, Advisory, and Watch for American Samoa",
"WEZS42": "Tsunami Information Statement for American Samoa"
}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 58a3af6a954cf284991d05d023df9ac8
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,6 @@
{
"Culture": "en-US",
"Strings": {
"SourceName": "USGS"
}
}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 8319fb6384cd5254c86e9baae6810020
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -134,7 +134,7 @@ PlayerSettings:
16:10: 1
16:9: 1
Others: 1
bundleVersion: 0.0.1
bundleVersion: 0.0.2
preloadedAssets: []
metroInputSource: 0
wsaTransparentSwapchain: 0