33 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
b749cf0221 chore: Clear cached font data 2025-02-18 20:48:29 +08:00
5b3a51150c feat: Add config 2025-02-18 12:04:38 +08:00
02fc481993 feat: Set app icon 2025-02-17 21:04:40 +08:00
1d619391c9 feat: Add connecting hint 2025-02-17 20:54:27 +08:00
dad7e703e6 build: Switch build platform 2025-02-17 17:17:47 +08:00
a1f6c4ef94 feat: Generates group views dynamically 2025-02-17 17:17:06 +08:00
a0ded872b3 fix: Fix incorrect iteration when destroying game objects 2025-02-17 17:16:27 +08:00
35b77b044c feat: Add gateway verification 2025-02-16 23:49:20 +08:00
70f4d0ffc3 chore: Add README and licenses to streaming assets 2025-02-16 21:11:55 +08:00
6ead7aa5ce fix: Increase extra map tile zoom level 2025-02-16 20:57:03 +08:00
116 changed files with 1998 additions and 469 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,160 @@
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace Cryville.Common.Unity.UI {
public delegate void LoadItemHandler(int index, GameObject gameObject);
[RequireComponent(typeof(RectTransform))]
public class RecyclerView : UIBehaviour {
[SerializeField]
private GameObject m_itemTemplate;
public GameObject ItemTemplate {
get { return m_itemTemplate; }
set { m_itemTemplate = value; /*OnTemplateUpdate();*/ }
}
public LoadItemHandler LoadItem { private get; set; }
public enum Axis {
Horizontal = 0,
Vertical = 1,
}
[SerializeField]
private Axis m_direction;
public Axis Direction {
get { return m_direction; }
set { m_direction = value; /*OnFrameUpdate();*/ }
}
[SerializeField]
RectOffset m_padding;
public RectOffset Padding {
get => m_padding;
set => m_padding = value;
}
[SerializeField]
float m_spacing;
public float Spacing {
get => m_spacing;
set => m_spacing = value;
}
[SerializeField]
private int m_itemCount = 3;
public int ItemCount {
get { return m_itemCount; }
set { m_itemCount = value; /*OnRefresh();*/ }
}
RectTransform _rectTransform;
protected override void Awake() {
_rectTransform = GetComponent<RectTransform>();
}
const float _placeholderLength = 100;
int _firstIndex, _lastIndex;
readonly Stack<GameObject> _pool = new();
void Update() {
int axis = (int)m_direction;
int sign = m_direction == 0 ? 1 : -1;
float padding = axis == 0 ? m_padding.left : m_padding.top;
if (_rectTransform.parent is not RectTransform parentTransform)
throw new InvalidOperationException("Parent transform is not RectTransform");
Vector2 apos = _rectTransform.anchoredPosition;
float pos = apos[axis] + padding;
float childPos = _firstIndex * _placeholderLength + padding;
float visibleLength = parentTransform.rect.size[axis];
//// Add preceding
//while (_firstIndex > 0 && childPos > pos) {
// var child = Rent();
// child.transform.SetAsFirstSibling();
// LoadItem(--_firstIndex, child);
// pos += GetLength(axis, child.transform) - _placeholderLength;
// childPos -= _placeholderLength;
//}
//// Remove preceding
//while (_firstIndex < _lastIndex) {
// var child = transform.GetChild(0);
// float len = GetLength(axis, child.transform);
// if (childPos + len > pos) break;
// Return(child.gameObject);
// _firstIndex++;
// pos += _placeholderLength - len;
// childPos += _placeholderLength;
//}
//apos[axis] = pos;
//_rectTransform.anchoredPosition = apos;
// Layout existing
int index = _firstIndex;
float layoutToPos = pos + visibleLength;
for (; index < _lastIndex && childPos < layoutToPos; index++) {
var child = (RectTransform)transform.GetChild(index - _firstIndex);
LayoutChild(axis, sign, ref childPos, child);
}
// Remove following
for (; _lastIndex > index; --_lastIndex) {
var child = (RectTransform)transform.GetChild(index - _firstIndex);
Return(child.gameObject);
}
// Add following (and layout)
while (_lastIndex < m_itemCount && childPos < layoutToPos) {
var child = Rent();
if (child.transform is not RectTransform childTransform)
throw new InvalidOperationException("Child transform is not RectTransform");
childTransform.SetSiblingIndex(_lastIndex - _firstIndex);
LoadItem(_lastIndex++, child);
LayoutChild(axis, sign, ref childPos, childTransform);
}
Vector2 gsize = _rectTransform.sizeDelta;
gsize[axis] = childPos + (m_itemCount - _lastIndex) * _placeholderLength + (axis == 0 ? m_padding.horizontal : m_padding.vertical);
_rectTransform.sizeDelta = gsize;
}
static float GetLength(int axis, Transform child) {
if (child is not RectTransform childTransform)
throw new InvalidOperationException("Child transform is not RectTransform");
return LayoutUtility.GetPreferredSize(childTransform, axis);
}
void LayoutChild(int axis, int sign, ref float childPos, RectTransform childTransform) {
Vector2 cpos = childTransform.anchoredPosition;
cpos[axis] = childPos * sign;
cpos[axis ^ 1] = axis == 1 ? m_padding.left : m_padding.top;
childTransform.anchoredPosition = cpos;
Vector2 size = childTransform.sizeDelta;
size[axis ^ 1] = _rectTransform.rect.size[axis ^ 1] - (axis == 1 ? m_padding.horizontal : m_padding.vertical);
childTransform.sizeDelta = size;
childPos += GetLength(axis, childTransform) + m_spacing;
}
GameObject Rent() {
if (_pool.TryPop(out var ret)) {
ret.SetActive(true);
return ret;
}
return Instantiate(m_itemTemplate, transform, false);
}
void Return(GameObject child) {
child.transform.SetAsLastSibling();
child.SetActive(false);
_pool.Push(child);
}
public void InvalidateAll() {
for (; _lastIndex > _firstIndex; --_lastIndex) {
var child = (RectTransform)transform.GetChild(0);
Return(child.gameObject);
}
}
}
}

View File

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

View File

@@ -1,11 +1,10 @@
using Cryville.Common.Font;
using Cryville.Common.Unity.UI;
using Cryville.Crtr;
using Cryville.Culture;
using System.IO;
using System.Text;
using System.Xml.Linq;
using System.Xml;
using System.Xml.Linq;
using UnityEngine;
namespace Cryville.EEW.Unity {

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

@@ -0,0 +1,62 @@
using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace Cryville.EEW.Unity {
record Config(
string SeverityScheme,
float SeverityColorMappingLuminanceMultiplier,
bool UseContinuousColor,
string ColorScheme,
string OverrideTimeZone,
bool DoDisplayTimeZone,
bool DoSwitchBackToHistory,
IReadOnlyCollection<EventSourceConfig> EventSources
) {
public static Config Default => new(
"Default",
1f,
false,
"Default",
null,
true,
true,
new List<EventSourceConfig> {
new JMAAtomEventSourceConfig(Array.Empty<string>()),
new UpdateCheckerEventSourceConfig(),
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))]
[JsonSourceGenerationOptions(WriteIndented = true)]
sealed partial class ConfigSerializationContext : JsonSerializerContext { }
}

View File

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

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

@@ -21,7 +21,7 @@ namespace Cryville.EEW.Unity.Map {
}
sealed class MapTileCacheManager : IDisposable {
public int ExtraCachedZoomLevel { get; set; } = 2;
public int ExtraCachedZoomLevel { get; set; } = 20;
GameObject m_prefabTile;
public GameObject PrefabTile {

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

@@ -1,7 +1,8 @@
using Cryville.Common.Font;
using System.Collections.Generic;
using UnityEngine;
namespace Cryville.Crtr {
namespace Cryville.EEW.Unity {
internal static class PlatformConfig {
#if UNITY_STANDALONE_WIN
public static readonly string Name = "windows";
@@ -11,11 +12,17 @@ namespace Cryville.Crtr {
#error Unknown platform.
#endif
#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
#if UNITY_EDITOR_WIN
public static readonly string ConfigPath = Application.persistentDataPath;
#else
public static readonly string ConfigPath = Application.dataPath;
#endif
public static readonly string FileProtocolPrefix = "file:///";
public static readonly FontManager FontManager = new FontManagerWindows();
public static Dictionary<string, List<string>> ScriptFontMap => FallbackListFontMatcher.GetDefaultWindowsFallbackMap();
public static readonly string TextShader = "TextMesh Pro/Shaders/TMP_SDF SSD";
#elif UNITY_ANDROID
public static readonly string ConfigPath = Application.persistentDataPath;
public static readonly string FileProtocolPrefix = "file://";
public static readonly FontManager FontManager = new FontManagerAndroid();
public static Dictionary<string, List<string>> ScriptFontMap => FallbackListFontMatcher.GetDefaultAndroidFallbackMap();

View File

@@ -5,7 +5,12 @@ using Cryville.EEW.Map;
using Cryville.EEW.Report;
using Cryville.EEW.TTS;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text.Json;
using UnityEngine;
using Color = System.Drawing.Color;
@@ -14,19 +19,98 @@ namespace Cryville.EEW.Unity {
static SharedSettings s_instance;
public static SharedSettings Instance => s_instance ??= new();
public ISeverityScheme SeverityScheme => DefaultSeverityScheme.Instance;
public ISeverityColorMapping SeverityColorMapping => DefaultSeverityColorMapping.Instance;
public bool UseContinuousColor => true;
public IColorScheme ColorScheme => new SeverityBasedColorScheme(SeverityScheme, DefaultSeverityColorMapping.Instance);
public ISubColorScheme BorderColorScheme => new WrappedColorScheme(new SeverityBasedColorScheme(SeverityScheme, DefaultSeverityColorMapping.SecondaryInstance));
public ISubColorScheme TextColorScheme => new DefaultTextColorScheme(Color.White, Color.Black);
public ILocationConverter LocationConverter => new FERegionLongConverter();
public TimeSpan NowcastWarningDelayTolerance => TimeSpan.MaxValue;
public ISeverityScheme SeverityScheme { get; private set; } = DefaultSeverityScheme.Instance;
public ISeverityColorMapping SeverityColorMapping { get; private set; } = DefaultSeverityColorMapping.Instance;
public bool UseContinuousColor { get; private set; } = true;
public IColorScheme ColorScheme { get; private set; } = new SeverityBasedColorScheme(DefaultSeverityScheme.Instance, DefaultSeverityColorMapping.Instance);
public ISubColorScheme BorderColorScheme { get; private set; } = new WrappedColorScheme(new SeverityBasedColorScheme(DefaultSeverityScheme.Instance, DefaultSeverityColorMapping.SecondaryInstance));
public ISubColorScheme TextColorScheme { get; private set; } = new DefaultTextColorScheme(Color.White, Color.Black);
public ILocationConverter LocationConverter => new FERegionLongConverter(); // TODO TTS
public TimeSpan NowcastWarningDelayTolerance => TimeSpan.FromMinutes(60); // TODO TTS
public TimeZoneInfo OverrideTimeZone { get; private set; }
public bool DoDisplayTimeZone { get; private set; } = true;
public bool DoSwitchBackToHistory { get; private set; } = true;
public IReadOnlyCollection<EventSourceConfig> EventSources { get; private set; }
public string Id { get; private set; }
public byte[] IdBytes { get; } = new byte[32];
public string UnityUserAgent { get; private set; }
public void Init() {
Id = SystemInfo.deviceUniqueIdentifier;
using var hash = SHA256.Create();
hash.ComputeHash(EEW.SharedSettings.Encoding.GetBytes(SystemInfo.deviceUniqueIdentifier)).CopyTo(IdBytes, 0);
hash.ComputeHash(EEW.SharedSettings.Encoding.GetBytes(Id)).CopyTo(IdBytes, 0);
#if UNITY_STANDALONE_WIN
UnityUserAgent = string.Format(
CultureInfo.InvariantCulture,
"{0} CysTerraUnity/{1} (Windows NT {2}; {3})",
EEW.SharedSettings.UserAgent,
Application.version,
Environment.OSVersion.Version,
RuntimeInformation.OSArchitecture.ToString().ToLowerInvariant()
);
#else
#error No Unity User Agent
#endif
var file = new FileInfo(Path.Combine(PlatformConfig.ConfigPath, "config.json"));
if (!file.Exists) {
using var stream1 = file.OpenWrite();
using var writer = new StreamWriter(stream1, EEW.SharedSettings.Encoding);
writer.Write(JsonSerializer.Serialize(Config.Default, ConfigSerializationContext.Default.Config));
}
using var stream = file.OpenRead();
var config = JsonSerializer.Deserialize(stream, ConfigSerializationContext.Default.Config) ?? throw new InvalidOperationException("Null config.");
SeverityScheme = config.SeverityScheme switch {
"Default" => new DefaultSeverityScheme(),
"Legacy" => new LegacySeverityScheme(),
_ => throw new InvalidOperationException("Unknown severity scheme."),
};
SeverityColorMapping = config.ColorScheme switch {
"Default" => new DefaultSeverityColorMapping(config.SeverityColorMappingLuminanceMultiplier),
"SREV" => new SREVSeverityColorMapping(config.SeverityColorMappingLuminanceMultiplier),
"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 {
"Default" => new SeverityBasedColorScheme(SeverityScheme, DefaultSeverityColorMapping.Instance),
"SREV" => new SREVColorScheme(),
"DichromaticYB" => new SeverityBasedColorScheme(SeverityScheme, new DichromaticSeverityColorMapping(0.62f, 0.20f, 90)),
"DichromaticRC" => new SeverityBasedColorScheme(SeverityScheme, new DichromaticSeverityColorMapping(0.62f, 0.25f, 30)),
"DichromaticPG" => new SeverityBasedColorScheme(SeverityScheme, new DichromaticSeverityColorMapping(0.62f, 0.30f, -30)),
"Monochromatic" => new SeverityBasedColorScheme(SeverityScheme, new MonochromaticSeverityColorMapping()),
_ => throw new InvalidOperationException("Unknown color scheme."),
};
BorderColorScheme = config.ColorScheme switch {
"Default" => new WrappedColorScheme(new SeverityBasedColorScheme(SeverityScheme, DefaultSeverityColorMapping.SecondaryInstance)),
"SREV" => new WrappedColorScheme(new SREVBorderColorScheme()),
"DichromaticYB" => new WrappedColorScheme(new SeverityBasedColorScheme(SeverityScheme, new DichromaticSeverityColorMapping(0.62f, 0.20f, 90, 0.75f))),
"DichromaticRC" => new WrappedColorScheme(new SeverityBasedColorScheme(SeverityScheme, new DichromaticSeverityColorMapping(0.62f, 0.25f, 30, 0.75f))),
"DichromaticPG" => new WrappedColorScheme(new SeverityBasedColorScheme(SeverityScheme, new DichromaticSeverityColorMapping(0.62f, 0.30f, -30, 0.75f))),
"Monochromatic" => new WrappedColorScheme(new SeverityBasedColorScheme(SeverityScheme, new MonochromaticSeverityColorMapping(0.75f))),
_ => throw new InvalidOperationException("Unknown color scheme."),
};
TextColorScheme = config.ColorScheme switch {
"SREV" => new DefaultTextColorScheme(Color.White, Color.FromArgb(28, 28, 28), 0.555f),
_ => new DefaultTextColorScheme(Color.White, Color.Black),
};
OverrideTimeZone = ParseTimeZone(config.OverrideTimeZone);
DoDisplayTimeZone = config.DoDisplayTimeZone;
DoSwitchBackToHistory = config.DoSwitchBackToHistory;
EventSources = config.EventSources;
}
TimeZoneInfo ParseTimeZone(string timeZone) {
if (timeZone == null) return null;
if (timeZone == "") return TimeZoneInfo.Local;
return TimeZoneInfo.CreateCustomTimeZone("Custom", TimeSpan.Parse(timeZone, CultureInfo.InvariantCulture), null, null);
}
}
}

View File

@@ -39,18 +39,15 @@ namespace Cryville.EEW.Unity.UI {
SetText(m_locationView, location.Value, location.Culture);
SetText(m_predicateView, predicate.Value, predicate.Culture);
if (time.Value is DateTime ttime) {
// TODO
//if (SharedSettings.Instance.OverrideTimeZone is TimeZoneInfo tTimeZone)
// ttime = TimeZoneInfo.ConvertTime(ttime, timeZone, tTimeZone);
//else
// tTimeZone = timeZone;
TimeZoneInfo tTimeZone = timeZone;
if (SharedSettings.Instance.OverrideTimeZone is TimeZoneInfo tTimeZone)
ttime = TimeZoneInfo.ConvertTime(ttime, timeZone, tTimeZone);
else
tTimeZone = timeZone;
if (UseShortTimeFormat) {
SetText(m_timeView, ttime.ToString("G", time.Culture), time.Culture);
}
else {
// TODO SetText(m_timeView, SharedSettings.Instance.DoDisplayTimeZone ? string.Format(time.Culture, "{0:G} ({1})", ttime, tTimeZone.ToTimeZoneString()) : ttime.ToString(time.Culture), time.Culture);
SetText(m_timeView, string.Format(time.Culture, "{0:G} ({1})", ttime, tTimeZone.ToTimeZoneString()), time.Culture);
SetText(m_timeView, SharedSettings.Instance.DoDisplayTimeZone ? string.Format(time.Culture, "{0:G} ({1})", ttime, tTimeZone.ToTimeZoneString()) : ttime.ToString(time.Culture), time.Culture);
}
}
else {

View File

@@ -1,11 +1,19 @@
using Cryville.Common.Unity.UI;
using Cryville.EEW.Core;
using System.Collections.Generic;
using UnityEngine;
namespace Cryville.EEW.Unity.UI {
[RequireComponent(typeof(RecyclerView))]
class EventGroupListView : MonoBehaviour {
[SerializeField]
EventGroupView m_prefabEventGroupView;
RecyclerView _recyclerView;
void Awake() {
_recyclerView = GetComponent<RecyclerView>();
_recyclerView.LoadItem = LoadItem;
}
void LoadItem(int index, GameObject gameObject) {
gameObject.GetComponent<EventGroupView>().Set(_groups[^(index + 1)]);
}
readonly List<ReportGroup> _groups = new();
public void UpdateGroup(ReportGroup e) {
@@ -17,19 +25,16 @@ namespace Cryville.EEW.Unity.UI {
}
void Add(ReportGroup group) {
_groups.Add(group);
var child = Instantiate(m_prefabEventGroupView);
child.Set(group);
child.transform.SetParent(transform, false);
child.transform.SetSiblingIndex(0);
_recyclerView.ItemCount++;
_recyclerView.InvalidateAll();
}
void Remove(ReportGroup group) {
int index = _groups.LastIndexOf(group);
if (index == -1) return;
_groups.RemoveAt(index);
var child = transform.GetChild(_groups.Count - index);
child.SetParent(null, false);
Destroy(child.gameObject);
--_recyclerView.ItemCount;
_recyclerView.InvalidateAll();
}
}
}

View File

@@ -79,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

@@ -7,11 +7,10 @@ namespace Cryville.EEW.Unity.UI {
EventUnitView m_prefabEventUnitView;
public void Set(ReportGroup group) {
foreach(Transform child in transform) {
child.SetParent(null, false);
foreach (Transform child in transform) {
Destroy(child.gameObject);
}
foreach(var unit in group) {
foreach (var unit in group) {
Add(unit);
}
}

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

@@ -13,7 +13,13 @@ namespace Cryville.EEW.Unity.UI {
}
void Update() {
_textView.text = string.Format(CultureInfo.CurrentCulture, "{0:G} ({1})", DateTime.Now, TimeZoneInfo.Local.ToTimeZoneString());
var time = DateTime.Now;
var timeZone = TimeZoneInfo.Local;
if (SharedSettings.Instance.OverrideTimeZone is TimeZoneInfo tTimeZone)
time = TimeZoneInfo.ConvertTime(time, timeZone, tTimeZone);
else
tTimeZone = timeZone;
_textView.text = SharedSettings.Instance.DoDisplayTimeZone ? string.Format(CultureInfo.CurrentCulture, "{0:G} ({1})", time, tTimeZone.ToTimeZoneString()) : time.ToString(CultureInfo.CurrentCulture);
}
}
}

View File

@@ -1,20 +1,30 @@
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;
using System.Threading.Tasks;
using UnityEngine;
@@ -27,6 +37,7 @@ namespace Cryville.EEW.Unity {
[SerializeField] MapElementManager m_mapElementManager;
[SerializeField] EventOngoingListView m_ongoingEventList;
[SerializeField] EventGroupListView m_historyEventGroupList;
[SerializeField] GameObject m_connectingHint;
GroupingCoreWorker _worker;
CancellationTokenSource _cancellationTokenSource;
@@ -55,8 +66,17 @@ namespace Cryville.EEW.Unity {
_worker.Reported += OnReported;
_worker.GroupUpdated += OnGroupUpdated;
_worker.GroupRemoved += OnGroupRemoved;
Task.Run(() => GatewayVerify(_cancellationTokenSource.Token)).ContinueWith(task => {
if (task.IsFaulted) {
OnReported(this, new() { Title = task.Exception.Message });
return;
}
_verified = true;
_uiActionQueue.Enqueue(() => m_connectingHint.SetActive(false));
Task.Run(() => ScheduledGatewayVerify(_cancellationTokenSource, _cancellationTokenSource.Token));
Task.Run(() => _worker.RunAsync(_cancellationTokenSource.Token));
Task.Run(() => _ongoingReportManager.RunAsync(_cancellationTokenSource.Token));
}, TaskScheduler.Current);
}
void OnDestroy() {
@@ -66,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());
@@ -92,47 +116,105 @@ namespace Cryville.EEW.Unity {
worker.RegisterTTSMessageGenerator(new SichuanEEWTTSMessageGenerator());
}
WolfxWorker _wolfxWorker;
JMAAtomWorker _jmaWorker;
CWAReportWorker<Tsunami> _cwa14Worker;
CWAReportWorker<Earthquake> _cwa15Worker;
CWAReportWorker<Earthquake> _cwa16Worker;
GlobalQuakeWorker _gqWorker;
NOAAAtomWorker _ntwcWorker;
NOAAAtomWorker _ptwcWorker;
UpdateCheckerWorker _updateChecker;
bool _verified;
void BuildWorkers() {
#if UNITY_EDITOR
_worker.AddWorker(_wolfxWorker = new WolfxWorker(new Uri("ws://localhost:9995/wolfx")));
_worker.AddWorker(_jmaWorker = new JMAAtomWorker(new Uri("http://localhost:9095/eqvol.xml")));
_worker.AddWorker(_cwa14Worker = new CWAReportWorker<Tsunami>(new Uri("http://localhost:9095/E-A0014-001.json"), "1"));
_worker.AddWorker(_cwa15Worker = new CWAReportWorker<Earthquake>(new Uri("http://localhost:9095/E-A0015-001.json"), "1"));
_worker.AddWorker(_cwa16Worker = new CWAReportWorker<Earthquake>(new Uri("http://localhost:9095/E-A0016-001.json"), "1"));
_worker.AddWorker(_ntwcWorker = new NOAAAtomWorker(new("http://localhost:9095/PAAQAtom.xml")));
// _worker.AddWorker(_gqWorker = new GlobalQuakeWorker("localhost", 38000));
_worker.AddWorker(new WolfxWorker(new Uri("ws://localhost:9995/wolfx")));
_worker.AddWorker(new JMAAtomWorker(new Uri("http://localhost:9095/eqvol.xml")));
_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
// TODO
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),
NOAAEventSourceConfig noaaAtom => noaaAtom.Subtype switch {
"PAAQ" => new NOAAAtomWorker(new("https://www.tsunami.gov/events/xml/PAAQAtom.xml"), new("https://www.tsunami.gov/"), new("/php/esri.php?e=t", UriKind.Relative), "PAAQ"),
"PHEB" => new NOAAAtomWorker(new("https://www.tsunami.gov/events/xml/PHEBAtom.xml"), new("https://www.tsunami.gov/"), new("/php/esri.php?e=t", UriKind.Relative), "PHEB"),
_ => 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 (_updateChecker == null) _worker.AddWorker(_updateChecker = new(typeof(Worker).Assembly.GetName().Version?.ToString(3) ?? "", "unity"));
}
static JMAAtomWorker BuildJMAAtomWorkerFilter(JMAAtomWorker worker, JMAAtomEventSourceConfig config) {
if (config.Filter != null) worker.SetFilter(config.Filter);
worker.IsFilterWhitelist = config.IsFilterWhitelist;
return worker;
}
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>),
"cwa_eew" => typeof(CWAEEW),
"fj_eew" => typeof(FujianEEW),
"jma_eew" => typeof(JMAEEW),
"sc_eew" => typeof(SichuanEEW),
_ => throw new InvalidOperationException("Unknown Wolfx event type."),
}));
worker.IsFilterWhitelist = config.IsFilterWhitelist;
return worker;
}
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(() => m_mapElementManager.SetSelected(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;
}
});
}
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);
});
}
else if (action == CollectionChangeAction.Remove) {
_uiActionQueue.Enqueue(() => {
m_mapElementManager.RemoveOngoing(item);
m_mapElementManager.Remove(item);
if (m_mapElementManager.Count == 0 && SharedSettings.Instance.DoSwitchBackToHistory && _latestHistoryReport is not null) {
m_mapElementManager.SetSelected(_latestHistoryReport, true);
}
m_ongoingEventList.Remove(item);
});
}
@@ -148,15 +230,58 @@ 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)) {
action();
m_cameraController.OnMapElementUpdated();
}
}
async Task ScheduledGatewayVerify(CancellationTokenSource source, CancellationToken cancellationToken) {
Exception lastEx = null;
for (int i = 0; i < 8; i++) {
await Task.Delay(TimeSpan.FromHours(3), cancellationToken).ConfigureAwait(true);
try {
await GatewayVerify(cancellationToken).ConfigureAwait(true);
i = -1;
}
catch (HttpRequestException ex) {
lastEx = ex;
}
catch (WebException ex) {
lastEx = ex;
}
catch (InvalidOperationException ex) {
lastEx = ex;
break;
}
}
if (lastEx != null) {
OnReported(this, new() { Title = lastEx.Message });
_verified = false;
}
source.Cancel();
}
#if UNITY_EDITOR
#pragma warning disable CS1998
#endif
static async Task GatewayVerify(CancellationToken cancellationToken) {
#if !UNITY_EDITOR
using var client = new HttpClient();
client.DefaultRequestHeaders.UserAgent.ParseAdd(SharedSettings.Instance.UnityUserAgent);
using var response = await client.GetAsync(new Uri("https://gateway.cryville.world/?rin=" + SharedSettings.Instance.Id), cancellationToken).ConfigureAwait(true);
if (response.StatusCode is >= ((HttpStatusCode)400) and < ((HttpStatusCode)500)) {
throw new InvalidOperationException(response.ReasonPhrase);
}
response.EnsureSuccessStatusCode();
#endif
}
#if UNITY_EDITOR
#pragma warning restore CS1998
#endif
}
}

View File

@@ -149,16 +149,16 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 123805240}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
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: 1431650511}
m_RootOrder: 2
m_Father: {fileID: 408286581}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0.75, 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}
@@ -468,9 +468,8 @@ GameObject:
serializedVersion: 6
m_Component:
- component: {fileID: 249202787}
- component: {fileID: 249202790}
- component: {fileID: 249202791}
- component: {fileID: 249202792}
- component: {fileID: 249202789}
- component: {fileID: 249202788}
m_Layer: 5
m_Name: _content
m_TagString: Untagged
@@ -493,52 +492,12 @@ RectTransform:
m_Father: {fileID: 800505390}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 1}
--- !u!114 &249202790
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 249202786}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Padding:
m_Left: 6
m_Right: 6
m_Top: 6
m_Bottom: 6
m_ChildAlignment: 0
m_Spacing: 8
m_ChildForceExpandWidth: 1
m_ChildForceExpandHeight: 0
m_ChildControlWidth: 1
m_ChildControlHeight: 1
m_ChildScaleWidth: 0
m_ChildScaleHeight: 1
m_ReverseArrangement: 0
--- !u!114 &249202791
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 249202786}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
m_Name:
m_EditorClassIdentifier:
m_HorizontalFit: 0
m_VerticalFit: 2
--- !u!114 &249202792
--- !u!114 &249202788
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -550,7 +509,27 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 2426bd244f51fed429d955beee52e91d, type: 3}
m_Name:
m_EditorClassIdentifier:
m_prefabEventGroupView: {fileID: 1040273476696300640, guid: 5d21267de716a844c92260bad4d20b0a, type: 3}
--- !u!114 &249202789
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 249202786}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1257c1f4490f1d64bb8fc52a9abed1ae, type: 3}
m_Name:
m_EditorClassIdentifier:
m_itemTemplate: {fileID: 5834406092508179350, guid: 5d21267de716a844c92260bad4d20b0a, type: 3}
m_direction: 1
m_padding:
m_Left: 6
m_Right: 6
m_Top: 6
m_Bottom: 6
m_spacing: 6
m_itemCount: 0
--- !u!1 &303098820
GameObject:
m_ObjectHideFlags: 0
@@ -634,7 +613,7 @@ Camera:
m_Enabled: 1
serializedVersion: 2
m_ClearFlags: 2
m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0}
m_BackGroundColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
m_projectionMatrixMode: 1
m_GateFitMode: 2
m_FOVAxisMode: 0
@@ -698,6 +677,45 @@ MonoBehaviour:
m_layerElement: {fileID: 1602500234}
m_layerElementSub: {fileID: 303098821}
m_prefabTile: {fileID: 7683017549812261837, guid: e090edd328c6750478f5849a43a9d278, type: 3}
--- !u!1 &408286580
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 408286581}
m_Layer: 5
m_Name: Overlay
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &408286581
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 408286580}
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:
- {fileID: 123805241}
- {fileID: 2039723256}
- {fileID: 1925427751}
m_Father: {fileID: 1431650511}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0.75, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &719162186
GameObject:
m_ObjectHideFlags: 0
@@ -947,7 +965,8 @@ MonoBehaviour:
m_cameraController: {fileID: 376792590}
m_mapElementManager: {fileID: 1602500234}
m_ongoingEventList: {fileID: 719162189}
m_historyEventGroupList: {fileID: 249202792}
m_historyEventGroupList: {fileID: 249202788}
m_connectingHint: {fileID: 1925427750}
--- !u!1 &1349222218
GameObject:
m_ObjectHideFlags: 0
@@ -959,7 +978,7 @@ GameObject:
- component: {fileID: 1349222219}
- component: {fileID: 1349222222}
- component: {fileID: 1349222221}
- component: {fileID: 1349222220}
- component: {fileID: 1349222223}
m_Layer: 5
m_Name: History Panel
m_TagString: Untagged
@@ -988,36 +1007,6 @@ RectTransform:
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 1, y: 0.5}
--- !u!114 &1349222220
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1349222218}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Content: {fileID: 249202787}
m_Horizontal: 0
m_Vertical: 1
m_MovementType: 1
m_Elasticity: 0.1
m_Inertia: 1
m_DecelerationRate: 0.135
m_ScrollSensitivity: 32
m_Viewport: {fileID: 800505390}
m_HorizontalScrollbar: {fileID: 0}
m_VerticalScrollbar: {fileID: 0}
m_HorizontalScrollbarVisibility: 0
m_VerticalScrollbarVisibility: 0
m_HorizontalScrollbarSpacing: 0
m_VerticalScrollbarSpacing: 0
m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
--- !u!114 &1349222221
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -1056,6 +1045,36 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1349222218}
m_CullTransparentMesh: 1
--- !u!114 &1349222223
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1349222218}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Content: {fileID: 249202787}
m_Horizontal: 0
m_Vertical: 1
m_MovementType: 1
m_Elasticity: 0.1
m_Inertia: 1
m_DecelerationRate: 0.135
m_ScrollSensitivity: 32
m_Viewport: {fileID: 800505390}
m_HorizontalScrollbar: {fileID: 0}
m_VerticalScrollbar: {fileID: 0}
m_HorizontalScrollbarVisibility: 0
m_VerticalScrollbarVisibility: 0
m_HorizontalScrollbarSpacing: 0
m_VerticalScrollbarSpacing: 0
m_OnValueChanged:
m_PersistentCalls:
m_Calls: []
--- !u!1 &1412061071
GameObject:
m_ObjectHideFlags: 0
@@ -1181,7 +1200,7 @@ RectTransform:
m_Children:
- {fileID: 719162187}
- {fileID: 1349222219}
- {fileID: 123805241}
- {fileID: 408286581}
m_Father: {fileID: 0}
m_RootOrder: 5
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -1313,6 +1332,293 @@ Transform:
m_Father: {fileID: 0}
m_RootOrder: 6
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1925427750
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1925427751}
- component: {fileID: 1925427754}
- component: {fileID: 1925427753}
m_Layer: 5
m_Name: Connecting
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1925427751
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1925427750}
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: 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: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1925427753
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1925427750}
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: Connecting...
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: 20
m_fontSizeBase: 20
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 0
m_fontSizeMax: 0
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
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 &1925427754
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
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

View File

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

View File

@@ -0,0 +1,78 @@
fileFormatVersion: 2
guid: 15569127b9ff7604198a55092602f59a
labels:
- RoslynAnalyzer
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
: Any
second:
enabled: 0
settings:
Exclude Android: 1
Exclude Editor: 1
Exclude Linux64: 1
Exclude OSXUniversal: 1
Exclude Win: 1
Exclude Win64: 1
- first:
Android: Android
second:
enabled: 0
settings:
CPU: ARMv7
- first:
Any:
second:
enabled: 0
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
CPU: AnyCPU
DefaultValueInitialized: true
OS: AnyOS
- first:
Standalone: Linux64
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: OSXUniversal
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: Win
second:
enabled: 0
settings:
CPU: None
- first:
Standalone: Win64
second:
enabled: 0
settings:
CPU: None
- 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: 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

@@ -1271,6 +1271,7 @@ GameObject:
m_Component:
- component: {fileID: 5834406092508179349}
- component: {fileID: 5834406092508179348}
- component: {fileID: 3674434324840772959}
- component: {fileID: 1040273476696300640}
m_Layer: 5
m_Name: Event Group
@@ -1300,7 +1301,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 320, y: 160}
m_SizeDelta: {x: 320, y: 0}
m_Pivot: {x: 0, y: 1}
--- !u!114 &5834406092508179348
MonoBehaviour:
@@ -1328,6 +1329,20 @@ MonoBehaviour:
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!114 &3674434324840772959
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5834406092508179350}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3}
m_Name:
m_EditorClassIdentifier:
m_HorizontalFit: 0
m_VerticalFit: 2
--- !u!114 &1040273476696300640
MonoBehaviour:
m_ObjectHideFlags: 0

File diff suppressed because one or more lines are too long

BIN
Assets/Sprites/appicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@@ -0,0 +1,135 @@
fileFormatVersion: 2
guid: 419b00c31d31d234d93476f8b2e04653
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 12
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMasterTextureLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 0
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 0
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
cookieLightType: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Server
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
nameFileIdTable: {}
spritePackingTag:
pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0
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:

Some files were not shown because too many files have changed in this diff Show More