From c57f48d78506f65d06184b9ec22fa807f7613ba4 Mon Sep 17 00:00:00 2001 From: Pavel Krasnov Date: Thu, 7 Oct 2021 14:30:58 +0300 Subject: [PATCH 01/10] Container names in Data tree now can be colored --- Assets/Prefabs/UI/UI Tree View Element 1.prefab | 1 + Assets/Prefabs/UI/UI Tree View Element.prefab | 1 + .../DataSources/Containers/CloudCluster.cs | 16 ++++++++++++++++ .../DataSources/Containers/CloudCluster.cs.meta | 3 +++ .../DataSources/Containers/ClustersContainer.cs | 2 +- .../DataSources/SpecialInterfaces/IColorful.cs | 9 +++++++++ .../SpecialInterfaces/IColorful.cs.meta | 3 +++ Assets/Scripts/UI/SourceTreeButtons.cs | 6 ++++++ 8 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 Assets/Scripts/DataSources/Containers/CloudCluster.cs create mode 100644 Assets/Scripts/DataSources/Containers/CloudCluster.cs.meta create mode 100644 Assets/Scripts/DataSources/SpecialInterfaces/IColorful.cs create mode 100644 Assets/Scripts/DataSources/SpecialInterfaces/IColorful.cs.meta diff --git a/Assets/Prefabs/UI/UI Tree View Element 1.prefab b/Assets/Prefabs/UI/UI Tree View Element 1.prefab index 8298b882..ffef4fe2 100644 --- a/Assets/Prefabs/UI/UI Tree View Element 1.prefab +++ b/Assets/Prefabs/UI/UI Tree View Element 1.prefab @@ -798,6 +798,7 @@ MonoBehaviour: WeightSlider: {fileID: 2595604797316575360} MinWeightLabel: {fileID: 7171189489110428294} MaxWeightLabel: {fileID: 1489038758740796000} + NameLabel: {fileID: 3654434711717410252} --- !u!114 &3654434711664828003 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/UI/UI Tree View Element.prefab b/Assets/Prefabs/UI/UI Tree View Element.prefab index 39a262de..a720441b 100644 --- a/Assets/Prefabs/UI/UI Tree View Element.prefab +++ b/Assets/Prefabs/UI/UI Tree View Element.prefab @@ -1319,6 +1319,7 @@ MonoBehaviour: WeightSlider: {fileID: 2750410890576548568} MinWeightLabel: {fileID: 8584815492687513512} MaxWeightLabel: {fileID: 8601169822160353395} + NameLabel: {fileID: 3654434711717410252} --- !u!114 &3654434711664828003 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/DataSources/Containers/CloudCluster.cs b/Assets/Scripts/DataSources/Containers/CloudCluster.cs new file mode 100644 index 00000000..7af095ba --- /dev/null +++ b/Assets/Scripts/DataSources/Containers/CloudCluster.cs @@ -0,0 +1,16 @@ +using Elektronik.Data.PackageObjects; +using Elektronik.DataSources.SpecialInterfaces; +using UnityEngine; + +namespace Elektronik.DataSources.Containers +{ + public class CloudCluster : CloudContainer, IColorful + { + public CloudCluster(Color color, string displayName = "") : base(displayName) + { + Color = color; + } + + public Color Color { get; } + } +} \ No newline at end of file diff --git a/Assets/Scripts/DataSources/Containers/CloudCluster.cs.meta b/Assets/Scripts/DataSources/Containers/CloudCluster.cs.meta new file mode 100644 index 00000000..a67840de --- /dev/null +++ b/Assets/Scripts/DataSources/Containers/CloudCluster.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 17542638d4a94673a43db613ace24597 +timeCreated: 1633602708 \ No newline at end of file diff --git a/Assets/Scripts/DataSources/Containers/ClustersContainer.cs b/Assets/Scripts/DataSources/Containers/ClustersContainer.cs index ed95958d..b0145ab5 100644 --- a/Assets/Scripts/DataSources/Containers/ClustersContainer.cs +++ b/Assets/Scripts/DataSources/Containers/ClustersContainer.cs @@ -118,7 +118,7 @@ private void CreateClusters(IList> data) for (var i = 0; i < data.Count; i++) { var cluster = data[i]; - var container = new CloudContainer($"Cluster {i}"); + var container = new CloudCluster(cluster.FirstOrDefault().Color, $"Cluster {i}"); foreach (var renderer in _consumers) { container.AddConsumer(renderer); diff --git a/Assets/Scripts/DataSources/SpecialInterfaces/IColorful.cs b/Assets/Scripts/DataSources/SpecialInterfaces/IColorful.cs new file mode 100644 index 00000000..afff3530 --- /dev/null +++ b/Assets/Scripts/DataSources/SpecialInterfaces/IColorful.cs @@ -0,0 +1,9 @@ +using UnityEngine; + +namespace Elektronik.DataSources.SpecialInterfaces +{ + public interface IColorful + { + Color Color { get; } + } +} \ No newline at end of file diff --git a/Assets/Scripts/DataSources/SpecialInterfaces/IColorful.cs.meta b/Assets/Scripts/DataSources/SpecialInterfaces/IColorful.cs.meta new file mode 100644 index 00000000..df5ec79c --- /dev/null +++ b/Assets/Scripts/DataSources/SpecialInterfaces/IColorful.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 902ffa94d16448d38256922dc1e838a8 +timeCreated: 1633602602 \ No newline at end of file diff --git a/Assets/Scripts/UI/SourceTreeButtons.cs b/Assets/Scripts/UI/SourceTreeButtons.cs index cbc7e6c5..45f5924e 100644 --- a/Assets/Scripts/UI/SourceTreeButtons.cs +++ b/Assets/Scripts/UI/SourceTreeButtons.cs @@ -29,6 +29,7 @@ public class SourceTreeButtons : MonoBehaviour [SerializeField] private Slider WeightSlider; [SerializeField] private TMP_Text MinWeightLabel; [SerializeField] private TMP_Text MaxWeightLabel; + [SerializeField] private Text NameLabel; #endregion @@ -143,6 +144,11 @@ void SetMaxWeight(int value) { WeightButton.gameObject.SetActive(false); } + + if (_node is IColorful c) + { + NameLabel.color = c.Color; + } } private void Update() From 520cf176532f8861d344d0b752d40ba384e400d0 Mon Sep 17 00:00:00 2001 From: Pavel Krasnov Date: Fri, 8 Oct 2021 10:00:24 +0300 Subject: [PATCH 02/10] ICSConverter moved to plugins --- Assets/Scenes/Main.unity | 4 +- Assets/Scripts/Data/Converters.meta | 8 - Assets/Scripts/Data/Converters/CSConverter.cs | 17 - .../Data/Converters/CSConverter.cs.meta | 11 - .../Camera2Unity3dPackageConverter.cs | 73 ----- .../Camera2Unity3dPackageConverter.cs.meta | 11 - .../Scripts/Data/Converters/ICSConverter.cs | 19 -- .../Data/Converters/ICSConverter.cs.meta | 11 - .../DataControllers/DataSourcesController.cs | 5 +- .../Factories/ElektronikPluginsFactoryBase.cs | 8 +- .../Factories/IElektronikPluginsFactory.cs | 6 +- .../Plugins/FileRecorderPluginBase.cs | 7 +- .../UnitySide/DataSourcePluginsController.cs | 4 +- .../UnitySide/RecorderPluginsController.cs | 10 +- .../UI/ClusterizationAlgorithmPanel.cs | 2 +- Assets/Scripts/UI/ScaleWidget.cs | 2 +- ProjectSettings/ProjectSettings.asset | 2 +- ReleaseNotes.md | 48 +-- .../KMeansClusteringFactory.cs | 5 +- .../PlanesDetectionFactory.cs | 5 +- plugins/Plugins.Common/ICSConverter.cs | 63 ++++ plugins/Plugins.Common/Parsing/DataParser.cs | 3 +- .../OnlineOfflineBenchmark.cs | 9 +- .../Protobuf.Benchmarks.csproj | 1 - .../ExtractFromPackageTests.cs | 292 +++++++++++------- .../Protobuf.Tests.Internal/FakeConverter.cs | 41 --- .../Integration/Online/InfinitePlanesTests.cs | 44 +-- .../Integration/Online/MarkersTests.cs | 25 +- .../Integration/Online/ObservationsTests.cs | 67 ++-- .../Integration/Online/OnlineTestsBase.cs | 4 +- .../Integration/Online/PointsTests.cs | 27 +- .../Integration/Online/SceneTests.cs | 21 +- .../Integration/Online/TrackedObjectsTests.cs | 29 +- .../Protobuf.Tests.Internal/RecorderTests.cs | 145 ++++----- .../RetranslatorTests.cs | 105 ++++--- plugins/Protobuf/Data/MapTypesExtensions.cs | 198 ++++-------- .../Protobuf/Data/ProtobufToUnityConverter.cs | 93 ++++++ .../Protobuf/Offline/Parsers/InfoParser.cs | 2 +- .../Presenters/SlamDataInfoPresenter.cs | 34 +- .../Protobuf/Offline/ProtobufFilePlayer.cs | 7 +- .../Offline/ProtobufFilePlayerFactory.cs | 7 +- .../ConnectableObjectsMapManager.cs | 2 +- .../Online/GrpcServices/LinesMapManager.cs | 2 +- .../Online/GrpcServices/MapManager.cs | 2 +- .../Online/GrpcServices/MarkersMapManager.cs | 2 +- .../GrpcServices/ObservationsMapManager.cs | 2 +- .../Online/GrpcServices/PlanesMapManager.cs | 2 +- .../Online/GrpcServices/PointsMapManager.cs | 2 +- .../GrpcServices/TrackedObjsMapManager.cs | 2 +- .../Protobuf/Online/ProtobufOnlinePlayer.cs | 6 +- .../Online/ProtobufOnlinePlayerFactory.cs | 7 +- .../Recorders/EventArgsToProtobufExt.cs | 2 +- .../Protobuf/Recorders/ProtobufRecorder.cs | 26 +- .../Recorders/ProtobufRecorderFactory.cs | 7 +- .../Recorders/ProtobufRetranslator.cs | 7 +- .../Recorders/ProtobufRetranslatorFactory.cs | 7 +- plugins/Ros/Common/RosConverter.cs | 62 ++-- .../RosMessages/RosMessageConvertExtender.cs | 2 +- plugins/Ros/Ros/Bag/RosbagReader.cs | 1 - plugins/Ros/Ros/Bag/RosbagReaderFactory.cs | 5 +- plugins/Ros/Ros/Online/Ros1Client.cs | 1 - ...1CLientFactory.cs => Ros1ClientFactory.cs} | 5 +- plugins/Ros/Ros2/Bag/Ros2ReaderFactory.cs | 5 +- plugins/Ros/Ros2/Bag/Rosbag2Reader.cs | 1 - plugins/Ros/Ros2/Online/Ros2Client.cs | 1 - plugins/Ros/Ros2/Online/Ros2ClientFactory.cs | 5 +- 66 files changed, 763 insertions(+), 878 deletions(-) delete mode 100644 Assets/Scripts/Data/Converters.meta delete mode 100644 Assets/Scripts/Data/Converters/CSConverter.cs delete mode 100644 Assets/Scripts/Data/Converters/CSConverter.cs.meta delete mode 100644 Assets/Scripts/Data/Converters/Camera2Unity3dPackageConverter.cs delete mode 100644 Assets/Scripts/Data/Converters/Camera2Unity3dPackageConverter.cs.meta delete mode 100644 Assets/Scripts/Data/Converters/ICSConverter.cs delete mode 100644 Assets/Scripts/Data/Converters/ICSConverter.cs.meta create mode 100644 plugins/Plugins.Common/ICSConverter.cs delete mode 100644 plugins/Protobuf.Tests.Internal/FakeConverter.cs create mode 100644 plugins/Protobuf/Data/ProtobufToUnityConverter.cs rename plugins/Ros/Ros/Online/{Ros1CLientFactory.cs => Ros1ClientFactory.cs} (87%) diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity index 60224b06..5305e64f 100644 --- a/Assets/Scenes/Main.unity +++ b/Assets/Scenes/Main.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6e1f57f402aa3e329df27220f5033cbe6f5394a1530e9ae1a05473e1c779dd8e -size 626509 +oid sha256:54aeb9bf65d13ae80b1691a26b8cec633b9ab151cdf31278c592e33a32f7db96 +size 570810 diff --git a/Assets/Scripts/Data/Converters.meta b/Assets/Scripts/Data/Converters.meta deleted file mode 100644 index 39d1d5f8..00000000 --- a/Assets/Scripts/Data/Converters.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 28e0196e997603a44987f3b3f0f3ac7b -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Data/Converters/CSConverter.cs b/Assets/Scripts/Data/Converters/CSConverter.cs deleted file mode 100644 index 34eb786a..00000000 --- a/Assets/Scripts/Data/Converters/CSConverter.cs +++ /dev/null @@ -1,17 +0,0 @@ -using UnityEngine; - -namespace Elektronik.Data.Converters -{ - public abstract class CSConverter : MonoBehaviour, ICSConverter - { - public abstract void Convert(ref Vector3 pos, ref Quaternion rot); - public abstract void Convert(ref Vector3 pos); - public abstract Vector3 Convert(Vector3 pos); - public abstract Quaternion Convert(Quaternion rot); - public abstract (Vector3 pos, Quaternion rot) Convert(Vector3 pos, Quaternion rot); - public abstract void ConvertBack(ref Vector3 pos); - public abstract void ConvertBack(ref Vector3 pos, ref Quaternion rot); - public abstract void SetInitTRS(Vector3 pos, Quaternion rot, Vector3 scale); - public abstract void SetInitTRS(Vector3 pos, Quaternion rot); - } -} diff --git a/Assets/Scripts/Data/Converters/CSConverter.cs.meta b/Assets/Scripts/Data/Converters/CSConverter.cs.meta deleted file mode 100644 index 7fd1dc96..00000000 --- a/Assets/Scripts/Data/Converters/CSConverter.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2b1972753995f824f9f1f07b761fbf16 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Data/Converters/Camera2Unity3dPackageConverter.cs b/Assets/Scripts/Data/Converters/Camera2Unity3dPackageConverter.cs deleted file mode 100644 index 1921c3ca..00000000 --- a/Assets/Scripts/Data/Converters/Camera2Unity3dPackageConverter.cs +++ /dev/null @@ -1,73 +0,0 @@ -using UnityEngine; - -namespace Elektronik.Data.Converters -{ - public class Camera2Unity3dPackageConverter : CSConverter - { - private Matrix4x4 _initPose; - private Vector3 _scale = Vector3.one; - - public override void Convert(ref Vector3 pos) - { - pos.x *= _scale.x; - pos.y = -pos.y * _scale.y; - pos.z *= _scale.z; - } - - public override Vector3 Convert(Vector3 pos) - { - Convert(ref pos); - return pos; - } - - public override Quaternion Convert(Quaternion rot) - { - rot.y = -rot.y; - rot.w = -rot.w; - return rot; - } - - public override (Vector3 pos, Quaternion rot) Convert(Vector3 pos, Quaternion rot) - { - Convert(ref pos, ref rot); - return (pos, rot); - } - - public override void ConvertBack(ref Vector3 pos) - { - pos.x /= _scale.x; - pos.y = -pos.y / _scale.y; - pos.z /= _scale.z; - } - - public override void ConvertBack(ref Vector3 pos, ref Quaternion rot) - { - pos.y = -pos.y; - rot.y = -rot.y; - rot.w = -rot.w; - Matrix4x4 curHomo = Matrix4x4.TRS(pos, rot, Vector3.one); - curHomo = _initPose.inverse * curHomo; - pos = curHomo.GetColumn(3); - rot = Quaternion.LookRotation(curHomo.GetColumn(2), curHomo.GetColumn(1)); - } - - public override void SetInitTRS(Vector3 pos, Quaternion rot, Vector3 scale) - { - _scale = scale; - _initPose = Matrix4x4.TRS(pos, rot, scale); - } - - public override void SetInitTRS(Vector3 pos, Quaternion rot) => SetInitTRS(pos, rot, Vector3.one); - - public override void Convert(ref Vector3 pos, ref Quaternion rot) - { - pos.y = -pos.y; - rot.y = -rot.y; - rot.w = -rot.w; - Matrix4x4 curHomo = Matrix4x4.TRS(pos, rot, Vector3.one); - curHomo = _initPose * curHomo; - pos = curHomo.GetColumn(3); - rot = Quaternion.LookRotation(curHomo.GetColumn(2), curHomo.GetColumn(1)); - } - } -} \ No newline at end of file diff --git a/Assets/Scripts/Data/Converters/Camera2Unity3dPackageConverter.cs.meta b/Assets/Scripts/Data/Converters/Camera2Unity3dPackageConverter.cs.meta deleted file mode 100644 index 75f1346e..00000000 --- a/Assets/Scripts/Data/Converters/Camera2Unity3dPackageConverter.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 18d7f243b0dc21e4f9248b968e38bba9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Data/Converters/ICSConverter.cs b/Assets/Scripts/Data/Converters/ICSConverter.cs deleted file mode 100644 index 14f0efa1..00000000 --- a/Assets/Scripts/Data/Converters/ICSConverter.cs +++ /dev/null @@ -1,19 +0,0 @@ -using UnityEngine; - -namespace Elektronik.Data.Converters -{ - /// Translates data between coordinate systems. - public interface ICSConverter - { - void SetInitTRS(Vector3 pos, Quaternion rot); - void SetInitTRS(Vector3 pos, Quaternion rot, Vector3 scale); - void Convert(ref Vector3 pos, ref Quaternion rot); - void Convert(ref Vector3 pos); - Vector3 Convert(Vector3 pos); - Quaternion Convert(Quaternion rot); - (Vector3 pos, Quaternion rot) Convert(Vector3 pos, Quaternion rot); - - void ConvertBack(ref Vector3 pos); - void ConvertBack(ref Vector3 pos, ref Quaternion rot); - } -} diff --git a/Assets/Scripts/Data/Converters/ICSConverter.cs.meta b/Assets/Scripts/Data/Converters/ICSConverter.cs.meta deleted file mode 100644 index 9e5314f6..00000000 --- a/Assets/Scripts/Data/Converters/ICSConverter.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e5a672bf5f970e74dba07c5f438dc53a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/DataControllers/DataSourcesController.cs b/Assets/Scripts/DataControllers/DataSourcesController.cs index aee1a35c..cef7296f 100644 --- a/Assets/Scripts/DataControllers/DataSourcesController.cs +++ b/Assets/Scripts/DataControllers/DataSourcesController.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using Elektronik.Data.Converters; using Elektronik.DataConsumers; using Elektronik.DataConsumers.CloudRenderers; using Elektronik.DataSources; @@ -26,8 +25,6 @@ public class DataSourcesController : MonoBehaviour [SerializeField] private ConsumersRoot ConsumersRoot; [SerializeField] [CanBeNull] private Window DataSourceWindow; - public CSConverter Converter; - #endregion public event Action OnSourceAdded; @@ -165,7 +162,7 @@ private void LoadSnapshot(string[] files) .FirstOrDefault(pl => pl.SupportedExtensions.Any(e => path.EndsWith(e))); if (factory is null) return; factory.SetFileName(path); - var plugin = (IDataSourcePlugin)factory.Start(Converter); + var plugin = (IDataSourcePlugin)factory.Start(); if (plugin is IRewindableDataSource p) { p.Position = p.AmountOfFrames - 1; diff --git a/Assets/Scripts/PluginsSystem/Factories/ElektronikPluginsFactoryBase.cs b/Assets/Scripts/PluginsSystem/Factories/ElektronikPluginsFactoryBase.cs index e7ce955e..4d0d6016 100644 --- a/Assets/Scripts/PluginsSystem/Factories/ElektronikPluginsFactoryBase.cs +++ b/Assets/Scripts/PluginsSystem/Factories/ElektronikPluginsFactoryBase.cs @@ -1,6 +1,5 @@ using System; using System.Globalization; -using Elektronik.Data.Converters; using Elektronik.Settings; using UnityEngine; using SettingsBag = Elektronik.Settings.SettingsBag; @@ -34,10 +33,10 @@ protected ElektronikPluginsFactoryBase() public ISettingsHistory SettingsHistory => _settingsHistory; /// - public IElektronikPlugin Start(ICSConverter converter) + public IElektronikPlugin Start() { SaveSettings(); - return StartPlugin(_typedSettings, converter); + return StartPlugin(_typedSettings); } /// @@ -63,9 +62,8 @@ public SettingsBag Settings /// This function actually instantiates plugin. /// Plugin's settings that are necessary for start. - /// Converter to unity's coordinates system. /// Plugin. - protected abstract IElektronikPlugin StartPlugin(TSettings settings, ICSConverter converter); + protected abstract IElektronikPlugin StartPlugin(TSettings settings); #endregion diff --git a/Assets/Scripts/PluginsSystem/Factories/IElektronikPluginsFactory.cs b/Assets/Scripts/PluginsSystem/Factories/IElektronikPluginsFactory.cs index 83a465dc..b785cba0 100644 --- a/Assets/Scripts/PluginsSystem/Factories/IElektronikPluginsFactory.cs +++ b/Assets/Scripts/PluginsSystem/Factories/IElektronikPluginsFactory.cs @@ -1,5 +1,4 @@ -using Elektronik.Data.Converters; -using Elektronik.Settings; +using Elektronik.Settings; using UnityEngine; using SettingsBag = Elektronik.Settings.SettingsBag; @@ -31,8 +30,7 @@ public interface IElektronikPluginsFactory ISettingsHistory SettingsHistory { get; } /// This function creates and starts plugin. - /// Converter to unity coordinate system. /// Instantiated plugin. - IElektronikPlugin Start(ICSConverter converter); + IElektronikPlugin Start(); } } \ No newline at end of file diff --git a/Assets/Scripts/PluginsSystem/Plugins/FileRecorderPluginBase.cs b/Assets/Scripts/PluginsSystem/Plugins/FileRecorderPluginBase.cs index dd198f16..7193bd4d 100644 --- a/Assets/Scripts/PluginsSystem/Plugins/FileRecorderPluginBase.cs +++ b/Assets/Scripts/PluginsSystem/Plugins/FileRecorderPluginBase.cs @@ -1,15 +1,13 @@ -using Elektronik.Data.Converters; -using UnityEngine; +using UnityEngine; using SettingsBag = Elektronik.Settings.SettingsBag; namespace Elektronik.PluginsSystem { public abstract class FileRecorderPluginBase : DataRecorderPluginBase { - public FileRecorderPluginBase(string filename, ICSConverter converter) + public FileRecorderPluginBase(string filename) { Filename = filename; - Converter = converter; } #region DataRecorder @@ -23,7 +21,6 @@ public FileRecorderPluginBase(string filename, ICSConverter converter) #region Protected protected readonly string Filename; - protected readonly ICSConverter Converter; #endregion } diff --git a/Assets/Scripts/PluginsSystem/UnitySide/DataSourcePluginsController.cs b/Assets/Scripts/PluginsSystem/UnitySide/DataSourcePluginsController.cs index 9787363b..e1cfd7ec 100644 --- a/Assets/Scripts/PluginsSystem/UnitySide/DataSourcePluginsController.cs +++ b/Assets/Scripts/PluginsSystem/UnitySide/DataSourcePluginsController.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using Elektronik.Data.Converters; using Elektronik.DataControllers; using Elektronik.UI.Windows; using TMPro; @@ -14,7 +13,6 @@ public class DataSourcePluginsController : MonoBehaviour { #region Editor fields - [SerializeField] private CSConverter Converter; [SerializeField] private PlayerEventsController PlayerEvents; [SerializeField] private GameObject ScreenLocker; [SerializeField] private DataSourcesController DataSourcesController; @@ -41,7 +39,7 @@ public void SetNewSource(IDataSourcePluginsFactory factory, bool autoPlay = true { try { - CurrentSource = (IDataSourcePlugin) factory.Start(Converter); + CurrentSource = (IDataSourcePlugin) factory.Start(); Plugins.Add(CurrentSource); } catch (Exception e) diff --git a/Assets/Scripts/PluginsSystem/UnitySide/RecorderPluginsController.cs b/Assets/Scripts/PluginsSystem/UnitySide/RecorderPluginsController.cs index 34357823..58ae45a1 100644 --- a/Assets/Scripts/PluginsSystem/UnitySide/RecorderPluginsController.cs +++ b/Assets/Scripts/PluginsSystem/UnitySide/RecorderPluginsController.cs @@ -1,6 +1,5 @@ using System.IO; using System.Linq; -using Elektronik.Data.Converters; using Elektronik.DataControllers; using Elektronik.DataSources; using Elektronik.UI; @@ -24,7 +23,6 @@ public class RecorderPluginsController : MonoBehaviour [SerializeField] private InputWithBrowse InputWithBrowse; [SerializeField] private Sprite RecordImage; [SerializeField] private Sprite StopImage; - [SerializeField] private CSConverter Converter; [SerializeField] private PluginWindowsManager WindowsManager; #endregion @@ -54,7 +52,6 @@ public void Toggle() private void Awake() { _toolbarButtonImage = ToolbarButton.transform.Find("Image").GetComponent(); - _converter = Converter; } private void Start() @@ -69,7 +66,6 @@ private void Start() private Image _toolbarButtonImage; private static IFileRecorderPluginsFactory[] _fileRecordersFactories; - private static ICSConverter _converter; private IDataRecorderPlugin _currentRecorder; private bool IsRecording => _currentRecorder != null; @@ -77,7 +73,7 @@ private void InitCustomRecorders() { var plugins = PluginsLoader.PluginFactories .OfType() - .Select(f => (IDataRecorderPlugin)f.Start(Converter)); + .Select(f => (IDataRecorderPlugin)f.Start()); foreach (var plugin in plugins) { WindowsManager.RegisterPlugin(plugin); @@ -105,7 +101,7 @@ private void InitFileRecorders() .Select(_ => InputWithBrowse.FilePath) .Select(GetRecorderByFileName) .Where(f => f != null) - .Select(f => (IDataRecorderPlugin)f.Start(Converter)) + .Select(f => (IDataRecorderPlugin)f.Start()) .Do(r => _currentRecorder = r) .Do(DataSourcesController.AddRenderer) .Do(_ => _currentRecorder.OnDisposed += OnRecorderDisposed) @@ -144,7 +140,7 @@ static void Save(ISourceTreeNode node, string filename) { var factory = GetRecorderByFileName(filename); if (factory == null) return; - var recorder = (IDataRecorderPlugin)factory.Start(_converter); + var recorder = (IDataRecorderPlugin)factory.Start(); node.AddConsumer(recorder); recorder.Dispose(); node.RemoveConsumer(recorder); diff --git a/Assets/Scripts/UI/ClusterizationAlgorithmPanel.cs b/Assets/Scripts/UI/ClusterizationAlgorithmPanel.cs index 290a9fc4..819dcbb9 100644 --- a/Assets/Scripts/UI/ClusterizationAlgorithmPanel.cs +++ b/Assets/Scripts/UI/ClusterizationAlgorithmPanel.cs @@ -27,7 +27,7 @@ public void Setup(IClusteringAlgorithmFactory factory) _subject = new Subject(); _generator.Generate(factory.Settings); NameLabel.text = factory.DisplayName; - OnComputeRequested = _subject.Select(_ => (IClusteringAlgorithm)factory.Start(null)); + OnComputeRequested = _subject.Select(_ => (IClusteringAlgorithm)factory.Start()); } public IObservable OnComputeRequested; diff --git a/Assets/Scripts/UI/ScaleWidget.cs b/Assets/Scripts/UI/ScaleWidget.cs index a6896287..bea6e806 100644 --- a/Assets/Scripts/UI/ScaleWidget.cs +++ b/Assets/Scripts/UI/ScaleWidget.cs @@ -52,7 +52,7 @@ private void Start() .Do(v => OnScaleChanged?.Invoke(v)) .Where(v => Slider.minValue <= v && v <= Slider.maxValue) .Do(v => Slider.value = v) - .Do(v => Camera.Scale = v) + .Do(v => Camera.SceneScale = v) .Do(v => OnScaleChangedUnity.Invoke(v)) .Subscribe() .AddTo(this); diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 2e8d9a6d..51dd2b11 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -136,7 +136,7 @@ PlayerSettings: 16:10: 1 16:9: 1 Others: 1 - bundleVersion: 4.0.0-rc2 + bundleVersion: 4.0.0-rc3-WIP preloadedAssets: - {fileID: 11400000, guid: 643c9912d14026240bf6e70b352818ad, type: 2} - {fileID: 11400000, guid: 4d9278389e577024194549bb444fcd74, type: 2} diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 4b3d18fd..d6aec781 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -1,49 +1,11 @@ -![GitHub release (by tag)](https://img.shields.io/github/downloads/dioram/Elektronik/v4.0.0-rc2/total) +![GitHub release (by tag)](https://img.shields.io/github/downloads/dioram/Elektronik/v4.0.0-rc3/total) # Новое в этой версии -- Новый тип отображаемых объектов - маркеры. - - Они представляют собой некий примитив из списка с закреплённым текстом. - - Примитивы: куб, полупрозрачный куб, сфера, полупрозрачная сфера, кристал. - - Примитивам можно установить позицию, ориентацию, цвет и масштаб по трём осям. -- Наблюдения: - - Наблюдения теперь не изменяются в размерах при масштабировании сцены. - - Размер наблюдений можно менять поллзунком в настройках сцены. - - Рендер наблюдений теперь вынесен на GPU ещё большей частью. - - Исправлен баг, когда криво считывалось наведение курсора на наблюдение, и нажатие на него. -- Построение меша: - - Улучшен алгоритм построения меша для плотных облаков. - - Меш теперь может быть отрендерен в качестве полигональной сетки без заливки. -- Экран загрузки. -- Рефакторинг рендера. -- Исправлен баг с бесконечной загрузкой, если окно "Дерево данных" было закрыто или свёрнуто. -- Добавлена возможность выбирать проекцию камеры: перспективную или ортогональную. -- Плагины: - - Protobuf: - - Изображения с камеры теперь могут быть переданы как путь к картинкам. - - Planes detection: - - Теперь точки могут принадлежать нескольким плоскостям одновременно. +# Ломающие изменения +- Работа с конвертерами (ICSConverter) полностью вынесена в плагины. ----------------------- # New in this version -- New type of objects - Visualisation markers. - - It is some primitive from list with text. - - Primitives: cube, semitransparent cube, sphere, semitransparent sphere, crystal. - - Primitives have position, orientation, color and scale. -- Observations: - - Observations now don't change their size when scene is scaling. - - Observations size now can be set by slider in scene settings. - - Observations render now moved on GPU a little more. - - Fixed bug where hovering and clicking on observation handles poorly. -- Meshes: - - Mesh reconstruction algorithm now works better with dense point clouds. - - Meshes now can be rendered as wireframe. -- Loading screen was added. -- Refactoring of render pipeline. -- Fixed bug where Elektronik stuck on loading screen if "Data tree" window was closed or minimized. -- Now user can choose camera projection: perspective or orthographic. -- Plugins - - Protobuf: - - Images from camera now can be sent as paths to images. - - Planes detection: - - Now one point can belong to several planes. \ No newline at end of file +# Breaking changes +- Work with converters (ICSConverter) moved to plugins. \ No newline at end of file diff --git a/plugins/Clustering.KMeans/KMeansClusteringFactory.cs b/plugins/Clustering.KMeans/KMeansClusteringFactory.cs index 2ea027ca..2781dd36 100644 --- a/plugins/Clustering.KMeans/KMeansClusteringFactory.cs +++ b/plugins/Clustering.KMeans/KMeansClusteringFactory.cs @@ -1,12 +1,11 @@ -using Elektronik.Data.Converters; -using Elektronik.PluginsSystem; +using Elektronik.PluginsSystem; namespace Elektronik.Clustering.KMeans { public class KMeansClusterizationFactory : ElektronikPluginsFactoryBase, IClusteringAlgorithmFactory { - protected override IElektronikPlugin StartPlugin(KMeansSettings settings, ICSConverter? converter) + protected override IElektronikPlugin StartPlugin(KMeansSettings settings) { return new KMeansClusterizationAlgorithm(settings, DisplayName); } diff --git a/plugins/Clustering.PlanesDetection/PlanesDetectionFactory.cs b/plugins/Clustering.PlanesDetection/PlanesDetectionFactory.cs index 6eb74c17..e160aa88 100644 --- a/plugins/Clustering.PlanesDetection/PlanesDetectionFactory.cs +++ b/plugins/Clustering.PlanesDetection/PlanesDetectionFactory.cs @@ -1,12 +1,11 @@ -using Elektronik.Data.Converters; -using Elektronik.PluginsSystem; +using Elektronik.PluginsSystem; namespace Elektronik.Clustering.PlanesDetection { public class PlanesDetectionFactory : ElektronikPluginsFactoryBase, IClusteringAlgorithmFactory { - protected override IElektronikPlugin StartPlugin(PlanesDetectionSettings settings, ICSConverter converter) + protected override IElektronikPlugin StartPlugin(PlanesDetectionSettings settings) { return new PlanesDetectionAlgorithm(settings, DisplayName); } diff --git a/plugins/Plugins.Common/ICSConverter.cs b/plugins/Plugins.Common/ICSConverter.cs new file mode 100644 index 00000000..b06a016b --- /dev/null +++ b/plugins/Plugins.Common/ICSConverter.cs @@ -0,0 +1,63 @@ +using UnityEngine; + +namespace Elektronik.Plugins.Common +{ + /// Translates data between coordinate systems. + public interface ICSConverter + { + /// Converts position and rotation to unity coordinate system. + /// + /// + void Convert(ref Vector3 pos, ref Quaternion rot); + + /// Overload for converting only position. + /// + void Convert(ref Vector3 pos); + + /// Overload for converting only rotation. + /// + void Convert(ref Quaternion rot); + + /// Converts position and rotation to unity coordinate system. + /// + /// + /// Converted position and rotation. + (Vector3 pos, Quaternion rot) Converted(Vector3 pos, Quaternion rot); + + /// Overload for converting position into new variable. + /// + /// Converted position. + Vector3 Converted(Vector3 pos); + + /// Overload for converting rotation into new variable. + /// + /// Converted rotation. + Quaternion Converted(Quaternion rot); + + /// Converts position and rotation from unity coordinate system. + /// + /// + void ConvertBack(ref Vector3 pos, ref Quaternion rot); + + /// Overload for converting position from unity coordinate system. + /// + void ConvertBack(ref Vector3 pos); + + /// Overload for converting rotation from unity coordinate system. + /// + void ConvertBack(ref Quaternion rot); + + /// Converts position and rotation from unity coordinate system. + /// + /// + (Vector3 pos, Quaternion rot) ConvertedBack(Vector3 pos, Quaternion rot); + + /// Overload for converting position from unity coordinate system. + /// + Vector3 ConvertedBack(Vector3 pos); + + /// Overload for converting rotation from unity coordinate system. + /// + Quaternion ConvertedBack(Quaternion rot); + } +} diff --git a/plugins/Plugins.Common/Parsing/DataParser.cs b/plugins/Plugins.Common/Parsing/DataParser.cs index 85f53046..98973224 100644 --- a/plugins/Plugins.Common/Parsing/DataParser.cs +++ b/plugins/Plugins.Common/Parsing/DataParser.cs @@ -1,5 +1,4 @@ -using Elektronik.Data.Converters; -using Elektronik.Plugins.Common.Commands; +using Elektronik.Plugins.Common.Commands; namespace Elektronik.Plugins.Common.Parsing { diff --git a/plugins/Protobuf.Benchmarks/OnlineOfflineBenchmark.cs b/plugins/Protobuf.Benchmarks/OnlineOfflineBenchmark.cs index 240501ed..66e5ba4f 100644 --- a/plugins/Protobuf.Benchmarks/OnlineOfflineBenchmark.cs +++ b/plugins/Protobuf.Benchmarks/OnlineOfflineBenchmark.cs @@ -10,7 +10,6 @@ using Elektronik.Protobuf.Data; using Elektronik.Protobuf.Offline.Parsers; using Elektronik.Protobuf.Online.GrpcServices; -using Protobuf.Tests.Internal; namespace Protobuf.Benchmarks { @@ -64,7 +63,7 @@ public void OfflineAdd() var infinitePlanes = new CloudContainer(); var parser = new ObjectsParser(infinitePlanes, points, observations, "C:/"); var commands = new List { Capacity = _packets.Length }; - parser.SetConverter(new FakeConverter()); + parser.SetConverter(new ProtobufToUnityConverter()); foreach (var packet in _packets) { var command = parser.GetCommand(packet); @@ -92,9 +91,9 @@ public void OnlineBufferedAdd() }; var servicesChain = new IChainable[] { - new PointsMapManager(buffer, points, new FakeConverter(), new FakeLogger()), - new ObservationsMapManager(buffer, observations, new FakeConverter(), new FakeLogger()), - new PlanesMapManager(buffer, infinitePlanes, new FakeConverter(), new FakeLogger()) + new PointsMapManager(buffer, points, new ProtobufToUnityConverter(), new FakeLogger()), + new ObservationsMapManager(buffer, observations, new ProtobufToUnityConverter(), new FakeLogger()), + new PlanesMapManager(buffer, infinitePlanes, new ProtobufToUnityConverter(), new FakeLogger()) }.BuildChain(); int i = 0; diff --git a/plugins/Protobuf.Benchmarks/Protobuf.Benchmarks.csproj b/plugins/Protobuf.Benchmarks/Protobuf.Benchmarks.csproj index f1255945..6e6c7b41 100644 --- a/plugins/Protobuf.Benchmarks/Protobuf.Benchmarks.csproj +++ b/plugins/Protobuf.Benchmarks/Protobuf.Benchmarks.csproj @@ -27,7 +27,6 @@ - diff --git a/plugins/Protobuf.Tests.Internal/ExtractFromPackageTests.cs b/plugins/Protobuf.Tests.Internal/ExtractFromPackageTests.cs index 229f233d..b4b7be37 100644 --- a/plugins/Protobuf.Tests.Internal/ExtractFromPackageTests.cs +++ b/plugins/Protobuf.Tests.Internal/ExtractFromPackageTests.cs @@ -1,7 +1,6 @@ -using System.Linq; -using Elektronik.Data.Converters; +using Elektronik.Plugins.Common.DataDiff; using Elektronik.Protobuf.Data; -using Moq; +using FluentAssertions; using NUnit.Framework; using UnityEngine; @@ -9,161 +8,214 @@ namespace Protobuf.Tests.Internal { public class ExtractFromPackageTests { - private readonly Mock _mockedConverter = new(); - - delegate void Convert2Callback(ref Vector3 v, ref Quaternion q); - - delegate void Convert1Callback(ref Vector3 v); - - [SetUp] - public void Setup() - { - _mockedConverter.Setup(c => c.Convert(ref It.Ref.IsAny, ref It.Ref.IsAny)) - .Callback(new Convert2Callback((ref Vector3 v, ref Quaternion q) => - { - v.x = -v.x; - q.w = -q.w; - })); - _mockedConverter.Setup(c => c.Convert(ref It.Ref.IsAny)) - .Callback(new Convert1Callback(((ref Vector3 v) => v.x = -v.x))); - _mockedConverter.Setup(c => c.Convert(It.IsAny())) - .Returns(v => new Vector3(-v.x, v.y, v.z)); - _mockedConverter.Setup(c => c.Convert(It.IsAny())) - .Returns(q => new Quaternion(q.x, q.y, q.z, -q.w)); - _mockedConverter.Setup(c => c.Convert(It.IsAny(), It.IsAny())) - .Returns((Vector3 v, Quaternion q) => (new Vector3(-v.x, v.y, v.z), new Quaternion(q.x, q.y, q.z, -q.w))); - } - [Test] public void ExtractPointsTest() { - var packet = new PacketPb - { - Points = new PacketPb.Types.Points() - }; - packet.Points.Data.Add(new PointPb + var packet = new PacketPb { Points = new PacketPb.Types.Points() }; + packet.Points.Data.Add(new[] { - Id = 1, - Position = new Vector3Pb{X = 2, Y = 3, Z = 4}, - Color = new ColorPb{B = 255, G = 255, R = 255}, - Message = "message" + new PointPb + { + Id = 1, + Position = new Vector3Pb { X = 2, Y = 3, Z = 4 }, + Color = new ColorPb { B = 255, G = 255, R = 255 }, + Message = "message" + }, + new PointPb + { + Id = 4, + Position = new Vector3Pb { X = 5, Y = 6, Z = 7 }, + Color = new ColorPb { B = 0, G = 0, R = 0 }, + Message = "test" + } }); - var points = packet.ExtractPoints(_mockedConverter.Object).ToArray(); - Assert.AreEqual(1, points.Count()); - Assert.AreEqual(1, points[0].Id); - Assert.AreEqual(new Vector3(-2, 3, 4), points[0].Position); - Assert.AreEqual(Color.white, points[0].Color); - Assert.AreEqual("message", points[0].Message); + var expected = new[] + { + new SlamPointDiff(1, new Vector3(2, -3, 4), Color.white, "message"), + new SlamPointDiff(4, new Vector3(5, -6, 7), Color.black, "test"), + }; + + var points = packet.ExtractPoints(new ProtobufToUnityConverter()); + + points.Should().BeEquivalentTo(expected); } [Test] public void ExtractObservationsTest() { - var packet = new PacketPb - { - Observations = new PacketPb.Types.Observations() - }; - packet.Observations.Data.Add(new ObservationPb + var packet = new PacketPb { Observations = new PacketPb.Types.Observations() }; + packet.Observations.Data.Add(new[] { - Filename = "1.png", - Message = "message", - Orientation = new Vector4Pb{X = 5, Y = 6, Z = 7, W = 8}, - Point = new PointPb + new ObservationPb { - Id = 1, - Position = new Vector3Pb{X = 2, Y = 3, Z = 4}, - Color = new ColorPb{B = 255, G = 255, R = 255}, - Message = "message" - } + Filename = "1.png", + Message = "message", + Orientation = new Vector4Pb { X = 5, Y = 6, Z = 7, W = 8 }, + ObservedPoints = { 0, 1, 3, 5 }, + Point = new PointPb + { + Id = 1, + Position = new Vector3Pb { X = 2, Y = 3, Z = 4 }, + Color = new ColorPb { B = 255, G = 255, R = 255 }, + Message = "message" + } + }, + new ObservationPb + { + Filename = "3.png", + Message = "test", + Orientation = new Vector4Pb { X = 8, Y = 7, Z = 6, W = 5 }, + ObservedPoints = { 3, 2, 1, }, + Point = new PointPb + { + Id = 4, + Position = new Vector3Pb { X = 5, Y = 6, Z = 7 }, + Color = new ColorPb { B = 0, G = 0, R = 0 }, + Message = "test" + } + }, }); - var observations = packet.ExtractObservations(_mockedConverter.Object, @"./").ToArray(); - Assert.AreEqual(1, observations.Count()); - Assert.AreEqual(1, observations[0].Id); - Assert.AreEqual(new Vector3(-2, 3, 4), observations[0].Point.Position); - Assert.AreEqual(Color.white, observations[0].Point.Color); - Assert.AreEqual("message", observations[0].Message); - Assert.AreEqual(new Quaternion(5, 6, 7, -8), observations[0].Rotation); - Assert.AreEqual(@"./1.png", observations[0].FileName); + var expected = new[] + { + new SlamObservationDiff(new SlamPointDiff(1, new Vector3(2, -3, 4), Color.white, "message"), + new Quaternion(5, -6, 7, -8), new[] { 0, 1, 3, 5 }, "message", @"./1.png"), + new SlamObservationDiff(new SlamPointDiff(4, new Vector3(5, -6, 7), Color.black, "test"), + new Quaternion(8, -7, 6, -5), new[] { 3, 2, 1 }, "test", @"./3.png") + }; + + var observations = packet.ExtractObservations(new ProtobufToUnityConverter(), @"./"); + + observations.Should().BeEquivalentTo(expected); } [Test] public void ExtractTrackedObjectsTest() { - var packet = new PacketPb - { - TrackedObjs = new PacketPb.Types.TrackedObjs() - }; - packet.TrackedObjs.Data.Add(new TrackedObjPb() + var packet = new PacketPb { TrackedObjs = new PacketPb.Types.TrackedObjs() }; + packet.TrackedObjs.Data.Add(new[] { - Id = 1, - Message = "message", - Orientation = new Vector4Pb{X = 5, Y = 6, Z = 7, W = 8}, - Position = new Vector3Pb{X = 2, Y = 3, Z = 4}, - Color = new ColorPb{B = 255, G = 255, R = 255}, + new TrackedObjPb + { + Id = 1, + Message = "message", + Orientation = new Vector4Pb { X = 5, Y = 6, Z = 7, W = 8 }, + Position = new Vector3Pb { X = 2, Y = 3, Z = 4 }, + Color = new ColorPb { B = 255, G = 255, R = 255 }, + }, + new TrackedObjPb + { + Id = 3, + Message = "test", + Orientation = new Vector4Pb { X = 8, Y = 7, Z = 6, W = 5 }, + Position = new Vector3Pb { X = 5, Y = 6, Z = 7 }, + Color = new ColorPb { B = 0, G = 0, R = 0 }, + }, }); - var trackedObjects = packet.ExtractTrackedObjects(_mockedConverter.Object).ToArray(); - Assert.AreEqual(1, trackedObjects.Count()); - Assert.AreEqual(1, trackedObjects[0].Id); - Assert.AreEqual(new Vector3(-2, 3, 4), trackedObjects[0].Position); - Assert.AreEqual(Color.white, trackedObjects[0].Color); - Assert.AreEqual("message", trackedObjects[0].Message); - Assert.AreEqual(new Quaternion(5, 6, 7, -8), trackedObjects[0].Rotation); + var expected = new[] + { + new SlamTrackedObjectDiff(1, new Vector3(2, -3, 4), new Quaternion(5, -6, 7, -8), Color.white, + "message"), + new SlamTrackedObjectDiff(3, new Vector3(5, -6, 7), new Quaternion(8, -7, 6, -5), Color.black, + "test"), + }; + + var trackedObjects = packet.ExtractTrackedObjects(new ProtobufToUnityConverter()); + + trackedObjects.Should().BeEquivalentTo(expected); } [Test] public void ExtractLinesTest() { - var packet = new PacketPb - { - Lines = new PacketPb.Types.Lines() - }; - packet.Lines.Data.Add(new LinePb + var packet = new PacketPb { Lines = new PacketPb.Types.Lines() }; + packet.Lines.Data.Add(new[] { - Pt1 = new PointPb + new LinePb { - Id = 1, - Position = new Vector3Pb{X = 2, Y = 3, Z = 4}, - Color = new ColorPb{B = 255, G = 255, R = 255}, - Message = "message" + Pt1 = new PointPb + { + Id = 1, + Position = new Vector3Pb { X = 2, Y = 3, Z = 4 }, + Color = new ColorPb { B = 255, G = 255, R = 255 }, + Message = "message" + }, + Pt2 = new PointPb + { + Id = 3, + Position = new Vector3Pb { X = 5, Y = 6, Z = 7 }, + Color = new ColorPb { B = 0, G = 0, R = 0 }, + Message = "message" + } }, - Pt2 = new PointPb + new LinePb { - Id = 1, - Position = new Vector3Pb{X = 5, Y = 6, Z = 7}, - Color = new ColorPb{B = 0, G = 0, R = 0}, - Message = "message" + Pt1 = new PointPb + { + Id = 5, + Position = new Vector3Pb { X = 0, Y = 1, Z = 5 }, + Color = new ColorPb { B = 255, G = 0, R = 0 }, + Message = "test" + }, + Pt2 = new PointPb + { + Id = 6, + Position = new Vector3Pb { X = 3, Y = 5, Z = 9 }, + Color = new ColorPb { B = 0, G = 255, R = 0 }, + Message = "test" + } } }); - var lines = packet.ExtractLines(_mockedConverter.Object).ToArray(); - Assert.AreEqual(1, lines.Count()); - Assert.AreEqual(new Vector3(-2, 3, 4), lines[0].Point1.Position); - Assert.AreEqual(new Vector3(-5, 6, 7), lines[0].Point2.Position); - Assert.AreEqual(Color.white, lines[0].Point1.Color); - Assert.AreEqual(Color.black, lines[0].Point2.Color); + var expected = new[] + { + new SlamLineDiff + { + Point1 = new SlamPointDiff(1, new Vector3(2, -3, 4), Color.white, "message"), + Point2 = new SlamPointDiff(3, new Vector3(5, -6, 7), Color.black, "message"), + }, + new SlamLineDiff + { + Point1 = new SlamPointDiff(5, new Vector3(0, -1, 5), Color.blue, "test"), + Point2 = new SlamPointDiff(6, new Vector3(3, -5, 9), Color.green, "test"), + } + }; + + var lines = packet.ExtractLines(new ProtobufToUnityConverter()); + + lines.Should().BeEquivalentTo(expected); } [Test] public void ExtractPlanesTest() { - var packet = new PacketPb - { - Planes = new PacketPb.Types.Planes() - }; - packet.Planes.Data.Add(new PlanePb + var packet = new PacketPb { Planes = new PacketPb.Types.Planes() }; + packet.Planes.Data.Add(new[] { - Id = 1, - Offset = new Vector3Pb{X = 2, Y = 3, Z = 4}, - Normal = new Vector3Pb{X = 5, Y = 6, Z = 7}, - Color = new ColorPb{B = 255, G = 255, R = 255}, - Message = "message" + new PlanePb + { + Id = 1, + Offset = new Vector3Pb { X = 2, Y = 3, Z = 4 }, + Normal = new Vector3Pb { X = 5, Y = 6, Z = 7 }, + Color = new ColorPb { B = 255, G = 255, R = 255 }, + Message = "message" + }, + new PlanePb + { + Id = 3, + Offset = new Vector3Pb { X = 0, Y = 1, Z = 3 }, + Normal = new Vector3Pb { X = 5, Y = 7, Z = 8 }, + Color = new ColorPb { B = 0, G = 0, R = 0 }, + Message = "test" + } }); - var planes = packet.ExtractPlanes(_mockedConverter.Object).ToArray(); - Assert.AreEqual(1, planes.Count()); - Assert.AreEqual(1, planes[0].Id); - Assert.AreEqual(new Vector3(-2, 3, 4), planes[0].Offset); - Assert.AreEqual(new Vector3(-5, 6, 7), planes[0].Normal); - Assert.AreEqual(Color.white, planes[0].Color); - Assert.AreEqual("message", planes[0].Message); + var expected = new [] + { + new SlamPlaneDiff(1, new Vector3(2, -3, 4), new Vector3(5, -6, 7), Color.white, "message"), + new SlamPlaneDiff(3, new Vector3(0, -1, 3), new Vector3(5, -7, 8), Color.black, "test") + }; + + var planes = packet.ExtractPlanes(new ProtobufToUnityConverter()); + + planes.Should().BeEquivalentTo(expected); } } } \ No newline at end of file diff --git a/plugins/Protobuf.Tests.Internal/FakeConverter.cs b/plugins/Protobuf.Tests.Internal/FakeConverter.cs deleted file mode 100644 index 843ae16e..00000000 --- a/plugins/Protobuf.Tests.Internal/FakeConverter.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Elektronik.Data.Converters; -using UnityEngine; - -namespace Protobuf.Tests.Internal -{ - public class FakeConverter: ICSConverter - { - public void SetInitTRS(Vector3 pos, Quaternion rot) - { } - - public void SetInitTRS(Vector3 pos, Quaternion rot, Vector3 scale) - { } - - public void Convert(ref Vector3 pos, ref Quaternion rot) - { } - - public void Convert(ref Vector3 pos) - { } - - public Vector3 Convert(Vector3 pos) - { - return pos; - } - - public Quaternion Convert(Quaternion rot) - { - return rot; - } - - public (Vector3 pos, Quaternion rot) Convert(Vector3 pos, Quaternion rot) - { - return (pos, rot); - } - - public void ConvertBack(ref Vector3 pos) - { } - - public void ConvertBack(ref Vector3 pos, ref Quaternion rot) - { } - } -} \ No newline at end of file diff --git a/plugins/Protobuf.Tests.Internal/Integration/Online/InfinitePlanesTests.cs b/plugins/Protobuf.Tests.Internal/Integration/Online/InfinitePlanesTests.cs index ef3704ef..bd82f222 100644 --- a/plugins/Protobuf.Tests.Internal/Integration/Online/InfinitePlanesTests.cs +++ b/plugins/Protobuf.Tests.Internal/Integration/Online/InfinitePlanesTests.cs @@ -3,7 +3,6 @@ using System.Threading; using Elektronik.Data.PackageObjects; using Elektronik.DataSources.Containers.EventArgs; -using Elektronik.Plugins.Common.DataDiff; using Elektronik.Protobuf.Data; using FluentAssertions; using Moq; @@ -55,16 +54,14 @@ public void Create() Planes = new PacketPb.Types.Planes(), }; packet.Planes.Data.Add(_planes); - var e = new AddedEventArgs(_planes.Select(p => ((SlamPlaneDiff)p).Apply()) - .ToArray()); + var e = new AddedEventArgs(_planes.Select(p => p.ToUnity(Converter).Apply()).ToArray()); var response = MapClient.Handle(packet); Thread.Sleep(20); response.ErrType.Should().Be(ErrorStatusPb.Types.ErrorStatusEnum.Succeeded); ((ProtobufContainerTree)Sut.Data).Planes.Count.Should().Be(_planes.Length); - MockedPlanesRenderer.Verify( - r => r.OnItemsAdded(((ProtobufContainerTree)Sut.Data).Planes, e), Times.Once); + MockedPlanesRenderer.Verify(r => r.OnItemsAdded(((ProtobufContainerTree)Sut.Data).Planes, e), Times.Once); } [Test, Order(2)] @@ -90,16 +87,14 @@ public void UpdateOffsets() return (newPb, diff); }); packet.Planes.Data.Add(diff); - var e = new UpdatedEventArgs(_planes.Select(p => ((SlamPlaneDiff)p).Apply()) - .ToArray()); + var e = new UpdatedEventArgs(_planes.Select(p => p.ToUnity(Converter).Apply()).ToArray()); var response = MapClient.Handle(packet); Thread.Sleep(20); response.ErrType.Should().Be(ErrorStatusPb.Types.ErrorStatusEnum.Succeeded); ((ProtobufContainerTree)Sut.Data).Planes.Count.Should().Be(_planes.Length); - MockedPlanesRenderer.Verify( - r => r.OnItemsUpdated(((ProtobufContainerTree)Sut.Data).Planes, e), Times.Once); + MockedPlanesRenderer.Verify(r => r.OnItemsUpdated(((ProtobufContainerTree)Sut.Data).Planes, e), Times.Once); } [Test, Order(3)] @@ -125,14 +120,12 @@ public void UpdateNormals() return (newPb, diff); }); packet.Planes.Data.Add(diff); - var e = new UpdatedEventArgs(_planes.Select(p => ((SlamPlaneDiff)p).Apply()) - .ToArray()); + var e = new UpdatedEventArgs(_planes.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); ((ProtobufContainerTree)Sut.Data).Planes.Count.Should().Be(_planes.Length); - MockedPlanesRenderer.Verify( - r => r.OnItemsUpdated(((ProtobufContainerTree)Sut.Data).Planes, e), Times.Once); + MockedPlanesRenderer.Verify(r => r.OnItemsUpdated(((ProtobufContainerTree)Sut.Data).Planes, e), Times.Once); } [Test, Order(4)] @@ -150,14 +143,12 @@ public void UpdateColors() return (newPb, diff); }); packet.Planes.Data.Add(diff); - var e = new UpdatedEventArgs(_planes.Select(p => ((SlamPlaneDiff)p).Apply()) - .ToArray()); + var e = new UpdatedEventArgs(_planes.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); ((ProtobufContainerTree)Sut.Data).Planes.Count.Should().Be(_planes.Length); - MockedPlanesRenderer.Verify( - r => r.OnItemsUpdated(((ProtobufContainerTree)Sut.Data).Planes, e), Times.Once); + MockedPlanesRenderer.Verify(r => r.OnItemsUpdated(((ProtobufContainerTree)Sut.Data).Planes, e), Times.Once); } [Test, Order(5)] @@ -181,14 +172,12 @@ public void ComplexUpdate() } packet.Planes.Data.Add(_planes); - var e = new UpdatedEventArgs(_planes.Select(p => ((SlamPlaneDiff)p).Apply()) - .ToArray()); + var e = new UpdatedEventArgs(_planes.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); ((ProtobufContainerTree)Sut.Data).Planes.Count.Should().Be(_planes.Length); - MockedPlanesRenderer.Verify( - r => r.OnItemsUpdated(((ProtobufContainerTree)Sut.Data).Planes, e), Times.Once); + MockedPlanesRenderer.Verify(r => r.OnItemsUpdated(((ProtobufContainerTree)Sut.Data).Planes, e), Times.Once); } [Test, Order(6)] @@ -202,15 +191,14 @@ public void Remove() packet.Planes.Data.Add(new[] { _planes[1], _planes[3] }); var e = new RemovedEventArgs(new[] { - ((SlamPlaneDiff)_planes[1]).Apply(), - ((SlamPlaneDiff)_planes[3]).Apply(), + _planes[1].ToUnity(Converter).Apply(), + _planes[3].ToUnity(Converter).Apply(), }); SendPacket(packet); ((ProtobufContainerTree)Sut.Data).Planes.Count.Should().Be(_planes.Length - 2); - MockedPlanesRenderer.Verify( - r => r.OnItemsRemoved(((ProtobufContainerTree)Sut.Data).Planes, e), Times.Once); + MockedPlanesRenderer.Verify(r => r.OnItemsRemoved(((ProtobufContainerTree)Sut.Data).Planes, e), Times.Once); } [Test, Order(7)] @@ -223,9 +211,9 @@ public void Clear() }; var e = new RemovedEventArgs(new[] { - ((SlamPlaneDiff)_planes[0]).Apply(), - ((SlamPlaneDiff)_planes[2]).Apply(), - ((SlamPlaneDiff)_planes[4]).Apply(), + _planes[0].ToUnity(Converter).Apply(), + _planes[2].ToUnity(Converter).Apply(), + _planes[4].ToUnity(Converter).Apply(), }); SendPacket(packet); diff --git a/plugins/Protobuf.Tests.Internal/Integration/Online/MarkersTests.cs b/plugins/Protobuf.Tests.Internal/Integration/Online/MarkersTests.cs index ce7be9bb..653b49d9 100644 --- a/plugins/Protobuf.Tests.Internal/Integration/Online/MarkersTests.cs +++ b/plugins/Protobuf.Tests.Internal/Integration/Online/MarkersTests.cs @@ -2,7 +2,6 @@ using System.Linq; using Elektronik.Data.PackageObjects; using Elektronik.DataSources.Containers.EventArgs; -using Elektronik.Plugins.Common.DataDiff; using Elektronik.Protobuf.Data; using FluentAssertions; using Moq; @@ -36,7 +35,7 @@ public void Create() Markers = new PacketPb.Types.Markers(), }; packet.Markers.Data.Add(_map); - var e = new AddedEventArgs(_map.Select(p => ((SlamMarkerDiff)p).Apply()).ToArray()); + var e = new AddedEventArgs(_map.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); @@ -59,7 +58,7 @@ public void UpdatePositions() return (newPb, diff); }); packet.Markers.Data.Add(diff); - var e = new UpdatedEventArgs(_map.Select(p => ((SlamMarkerDiff)p).Apply()).ToArray()); + var e = new UpdatedEventArgs(_map.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); @@ -82,7 +81,7 @@ public void UpdateColors() return (newPb, diff); }); packet.Markers.Data.Add(diff); - var e = new UpdatedEventArgs(_map.Select(p => ((SlamMarkerDiff)p).Apply()).ToArray()); + var e = new UpdatedEventArgs(_map.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); @@ -105,7 +104,7 @@ public void UpdateScale() return (newPb, diff); }); packet.Markers.Data.Add(diff); - var e = new UpdatedEventArgs(_map.Select(p => ((SlamMarkerDiff)p).Apply()).ToArray()); + var e = new UpdatedEventArgs(_map.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); @@ -128,7 +127,7 @@ public void UpdateOrientation() return (newPb, diff); }); packet.Markers.Data.Add(diff); - var e = new UpdatedEventArgs(_map.Select(p => ((SlamMarkerDiff)p).Apply()).ToArray()); + var e = new UpdatedEventArgs(_map.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); @@ -151,7 +150,7 @@ public void UpdateType() return (newPb, diff); }); packet.Markers.Data.Add(diff); - var e = new UpdatedEventArgs(_map.Select(p => ((SlamMarkerDiff)p).Apply()).ToArray()); + var e = new UpdatedEventArgs(_map.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); @@ -182,7 +181,7 @@ public void ComplexUpdate() } packet.Markers.Data.Add(_map); - var e = new UpdatedEventArgs(_map.Select(p => ((SlamMarkerDiff)p).Apply()).ToArray()); + var e = new UpdatedEventArgs(_map.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); @@ -201,8 +200,8 @@ public void Remove() packet.Markers.Data.Add(new[] { _map[1], _map[3] }); var e = new RemovedEventArgs(new[] { - ((SlamMarkerDiff) _map[1]).Apply(), - ((SlamMarkerDiff) _map[3]).Apply() + _map[1].ToUnity(Converter).Apply(), + _map[3].ToUnity(Converter).Apply() }); SendPacket(packet); @@ -221,9 +220,9 @@ public void Clear() }; var e = new RemovedEventArgs(new[] { - ((SlamMarkerDiff) _map[0]).Apply(), - ((SlamMarkerDiff) _map[2]).Apply(), - ((SlamMarkerDiff) _map[4]).Apply(), + _map[0].ToUnity(Converter).Apply(), + _map[2].ToUnity(Converter).Apply(), + _map[4].ToUnity(Converter).Apply(), }); SendPacket(packet); diff --git a/plugins/Protobuf.Tests.Internal/Integration/Online/ObservationsTests.cs b/plugins/Protobuf.Tests.Internal/Integration/Online/ObservationsTests.cs index 32f00518..7010ed4e 100644 --- a/plugins/Protobuf.Tests.Internal/Integration/Online/ObservationsTests.cs +++ b/plugins/Protobuf.Tests.Internal/Integration/Online/ObservationsTests.cs @@ -5,7 +5,6 @@ using Elektronik.Data.PackageObjects; using Elektronik.DataSources.Containers; using Elektronik.DataSources.Containers.EventArgs; -using Elektronik.Plugins.Common.DataDiff; using Elektronik.Protobuf.Data; using FluentAssertions; using Moq; @@ -53,7 +52,7 @@ public void Create() Observations = new PacketPb.Types.Observations(), }; packet.Observations.Data.Add(_map); - var e = new AddedEventArgs(_map.Select(p => ((SlamObservationDiff)p).Apply()).ToArray()); + var e = new AddedEventArgs(_map.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); @@ -73,12 +72,13 @@ public void UpdatePositions() }; var diff = CreateDiff((pb, i) => { - var newPb = new ObservationPb(pb) { Point = { Position = { X = i, Y = 0, Z = 0 } } }; - var diff = new ObservationPb { Point = new PointPb { Id = i, Position = new Vector3Pb { X = i } } }; + var newPb = new ObservationPb(pb) { Point = { Position = { X = i, Y = i, Z = i } } }; + var diff = new ObservationPb + { Point = new PointPb { Id = i, Position = new Vector3Pb { X = i, Y = i, Z = i } } }; return (newPb, diff); }); packet.Observations.Data.Add(diff); - var e = new UpdatedEventArgs(_map.Select(p => ((SlamObservationDiff)p).Apply()).ToArray()); + var e = new UpdatedEventArgs(_map.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); @@ -99,11 +99,12 @@ public void UpdateOrientations() var diff = CreateDiff((pb, i) => { var newPb = new ObservationPb(pb) { Orientation = new Vector4Pb { X = 1, W = 1 } }; - var diff = new ObservationPb { Point = new PointPb {Id = i}, Orientation = new Vector4Pb { X = 1, W = 1 } }; + var diff = new ObservationPb + { Point = new PointPb { Id = i }, Orientation = new Vector4Pb { X = 1, W = 1 } }; return (newPb, diff); }); packet.Observations.Data.Add(diff); - var e = new UpdatedEventArgs(_map.Select(p => ((SlamObservationDiff)p).Apply()).ToArray()); + var e = new UpdatedEventArgs(_map.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); @@ -124,11 +125,12 @@ public void UpdateColors() var diff = CreateDiff((pb, i) => { var newPb = new ObservationPb(pb) { Point = { Color = { R = 255, G = 255 } } }; - var diff = new ObservationPb { Point = new PointPb { Id = i, Color = new ColorPb { R = 255, G = 255 } } }; + var diff = new ObservationPb + { Point = new PointPb { Id = i, Color = new ColorPb { R = 255, G = 255 } } }; return (newPb, diff); }); packet.Observations.Data.Add(diff); - var e = new UpdatedEventArgs(_map.Select(p => ((SlamObservationDiff)p).Apply()).ToArray()); + var e = new UpdatedEventArgs(_map.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); @@ -148,13 +150,13 @@ public void UpdateMessages() }; var diff = CreateDiff((pb, i) => { - var newPb = new ObservationPb(pb) { Message = $"{i}", Filename = "tmp.png"}; - var diff = new ObservationPb { Point = new PointPb {Id = i}, Message = $"{i}", Filename = "tmp.png" }; + var newPb = new ObservationPb(pb) { Message = $"{i}", Filename = "tmp.png" }; + var diff = new ObservationPb { Point = new PointPb { Id = i }, Message = $"{i}", Filename = "tmp.png" }; return (newPb, diff); }); packet.Observations.Data.Add(diff); var e = new UpdatedEventArgs(GetMapWithFullPath() - .Select(p => ((SlamObservationDiff)p).Apply()) + .Select(p => p.ToUnity(Converter).Apply()) .ToArray()); SendPacket(packet); @@ -184,14 +186,15 @@ public void ComplexUpdate() Color = new ColorPb { R = i * 50, G = i * 50, B = i * 50 }, Message = "Test message", }, - Orientation = new Vector4Pb {X = -1, W = 1}, + Orientation = new Vector4Pb { X = -1, W = 1 }, Message = "Test message", Filename = "test.png", }; } + packet.Observations.Data.Add(_map); var e = new UpdatedEventArgs(GetMapWithFullPath() - .Select(p => ((SlamObservationDiff)p).Apply()) + .Select(p => p.ToUnity(Converter).Apply()) .ToArray()); SendPacket(packet); @@ -216,8 +219,8 @@ public void UpdateConnections() }; packet.Connections.Data.Add(_connections); var lines = _connections.Select(c => (_map[c.Id1], _map[c.Id2])) - .Select(pair => (((SlamObservationDiff)pair.Item1).Apply(), - ((SlamObservationDiff)pair.Item2).Apply())) + .Select(pair => (pair.Item1.ToUnity(Converter).Apply(), + pair.Item2.ToUnity(Converter).Apply())) .Select((pair, i) => new SlamLine(pair.Item1, pair.Item2, i)) .ToArray(); var e = new AddedEventArgs(lines); @@ -240,11 +243,11 @@ public void UpdateConnectedObservations() _map[2].Point.Position = new Vector3Pb { X = 1.5f, Y = 1 }; _map[2].Point.Color = new ColorPb { R = 255 }; packet.Observations.Data.Add(_map[2]); - var e = new UpdatedEventArgs(new[] { ((SlamObservationDiff)_map[2]).Apply() }); + var e = new UpdatedEventArgs(new[] { _map[2].ToUnity(Converter).Apply() }); var el = new UpdatedEventArgs(new[] { - new SlamLine(((SlamObservationDiff)_map[0]).Apply(), ((SlamObservationDiff)_map[2]).Apply(), 1), - new SlamLine(((SlamObservationDiff)_map[2]).Apply(), ((SlamObservationDiff)_map[4]).Apply(), 2) + new SlamLine(_map[0].ToUnity(Converter).Apply(), _map[2].ToUnity(Converter).Apply(), 1), + new SlamLine(_map[2].ToUnity(Converter).Apply(), _map[4].ToUnity(Converter).Apply(), 2) }); SendPacket(packet); @@ -273,9 +276,9 @@ public void RemoveConnections() SendPacket(packet); ((ProtobufContainerTree)Sut.Data).Observations.Count.Should().Be(_map.Length); - ((ProtobufContainerTree)Sut.Data).Observations.Connections.Count().Should().Be(_connections.Length-2); - MockedSlamLinesRenderer.Verify(r => r.OnItemsRemoved(It.IsAny>(), - It.IsAny>()), + ((ProtobufContainerTree)Sut.Data).Observations.Connections.Count().Should().Be(_connections.Length - 2); + MockedSlamLinesRenderer.Verify(r => r.OnItemsRemoved(It.IsAny>(), + It.IsAny>()), Times.Once); } @@ -290,18 +293,18 @@ public void Remove() packet.Observations.Data.Add(new[] { _map[1], _map[3] }); var e = new RemovedEventArgs(new[] { - ((SlamObservationDiff) _map[1]).Apply(), - ((SlamObservationDiff) _map[3]).Apply() + _map[1].ToUnity(Converter).Apply(), + _map[3].ToUnity(Converter).Apply() }); SendPacket(packet); - ((ProtobufContainerTree)Sut.Data).Observations.Count.Should().Be(_map.Length-2); + ((ProtobufContainerTree)Sut.Data).Observations.Count.Should().Be(_map.Length - 2); ((ProtobufContainerTree)Sut.Data).Observations.Connections.Count().Should().Be(1); MockedObservationsRenderer.Verify(r => r.OnItemsRemoved(((ProtobufContainerTree)Sut.Data).Observations, e), Times.Once); - MockedSlamLinesRenderer.Verify(r => r.OnItemsRemoved(It.IsAny>(), - It.IsAny>()), + MockedSlamLinesRenderer.Verify(r => r.OnItemsRemoved(It.IsAny>(), + It.IsAny>()), Times.Exactly(2)); } @@ -315,9 +318,9 @@ public void Clear() }; var e = new RemovedEventArgs(new[] { - ((SlamObservationDiff) _map[0]).Apply(), - ((SlamObservationDiff) _map[2]).Apply(), - ((SlamObservationDiff) _map[4]).Apply(), + _map[0].ToUnity(Converter).Apply(), + _map[2].ToUnity(Converter).Apply(), + _map[4].ToUnity(Converter).Apply(), }); SendPacket(packet); @@ -326,8 +329,8 @@ public void Clear() ((ProtobufContainerTree)Sut.Data).Observations.Connections.Count().Should().Be(0); MockedObservationsRenderer.Verify(r => r.OnItemsRemoved(((ProtobufContainerTree)Sut.Data).Observations, e), Times.Once); - MockedSlamLinesRenderer.Verify(r => r.OnItemsRemoved(It.IsAny>(), - It.IsAny>()), + MockedSlamLinesRenderer.Verify(r => r.OnItemsRemoved(It.IsAny>(), + It.IsAny>()), Times.Exactly(3)); } diff --git a/plugins/Protobuf.Tests.Internal/Integration/Online/OnlineTestsBase.cs b/plugins/Protobuf.Tests.Internal/Integration/Online/OnlineTestsBase.cs index b0d52607..b7ed5b79 100644 --- a/plugins/Protobuf.Tests.Internal/Integration/Online/OnlineTestsBase.cs +++ b/plugins/Protobuf.Tests.Internal/Integration/Online/OnlineTestsBase.cs @@ -4,6 +4,7 @@ using Elektronik.DataConsumers.CloudRenderers; using Elektronik.DataConsumers.Windows; using Elektronik.DataSources.Containers.EventArgs; +using Elektronik.Plugins.Common; using Elektronik.Protobuf.Data; using Elektronik.Protobuf.Online; using FluentAssertions; @@ -27,12 +28,13 @@ public class OnlineTestsBase protected readonly Mock> MockedPlanesRenderer; protected readonly Mock> MockedMarkerRenderer; protected readonly Mock> MockedImageRenderer; + protected readonly ICSConverter Converter = new ProtobufToUnityConverter(); protected OnlineTestsBase(int port) { var f = new ProtobufOnlinePlayerFactory() { Settings = new OnlineSettingsBag { ListeningPort = port }, Logger = new TestsLogger() }; - Sut = (ProtobufOnlinePlayer)f.Start(new FakeConverter()); + Sut = (ProtobufOnlinePlayer)f.Start(); Sut.Play(); var channel = new Channel($"127.0.0.1:{port}", ChannelCredentials.Insecure); diff --git a/plugins/Protobuf.Tests.Internal/Integration/Online/PointsTests.cs b/plugins/Protobuf.Tests.Internal/Integration/Online/PointsTests.cs index 7c9fbe8d..729834e9 100644 --- a/plugins/Protobuf.Tests.Internal/Integration/Online/PointsTests.cs +++ b/plugins/Protobuf.Tests.Internal/Integration/Online/PointsTests.cs @@ -3,7 +3,6 @@ using Elektronik.Data.PackageObjects; using Elektronik.DataSources.Containers; using Elektronik.DataSources.Containers.EventArgs; -using Elektronik.Plugins.Common.DataDiff; using Elektronik.Protobuf.Data; using FluentAssertions; using Moq; @@ -45,7 +44,7 @@ public void CreatePoints() Points = new PacketPb.Types.Points(), }; packet.Points.Data.Add(_map); - var e = new AddedEventArgs(_map.Select(p => ((SlamPointDiff)p).Apply()).ToArray()); + var e = new AddedEventArgs(_map.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); @@ -69,7 +68,7 @@ public void UpdatePositions() return (newPb, diff); }); packet.Points.Data.Add(diff); - var e = new UpdatedEventArgs(_map.Select(p => ((SlamPointDiff)p).Apply()).ToArray()); + var e = new UpdatedEventArgs(_map.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); @@ -93,7 +92,7 @@ public void UpdateColors() return (newPb, diff); }); packet.Points.Data.Add(diff); - var e = new UpdatedEventArgs(_map.Select(p => ((SlamPointDiff)p).Apply()).ToArray()); + var e = new UpdatedEventArgs(_map.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); @@ -122,7 +121,7 @@ public void ComplexUpdate() } packet.Points.Data.Add(_map); - var e = new UpdatedEventArgs(_map.Select(p => ((SlamPointDiff)p).Apply()).ToArray()); + var e = new UpdatedEventArgs(_map.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); @@ -145,7 +144,7 @@ public void UpdateConnections() }; packet.Connections.Data.Add(_connections); var lines = _connections.Select(c => (_map[c.Id1], _map[c.Id2])) - .Select(pair => (((SlamPointDiff)pair.Item1).Apply(), ((SlamPointDiff)pair.Item2).Apply())) + .Select(pair => (pair.Item1.ToUnity(Converter).Apply(), pair.Item2.ToUnity(Converter).Apply())) .Select((pair, i) => new SlamLine(pair.Item1, pair.Item2, i)) .ToArray(); var e = new AddedEventArgs(lines); @@ -174,11 +173,11 @@ public void UpdateConnectedPoints() Color = new ColorPb { R = 255 }, }; packet.Points.Data.Add(diff); - var e = new UpdatedEventArgs(new[] { ((SlamPointDiff)_map[2]).Apply() }); + var e = new UpdatedEventArgs(new[] { _map[2].ToUnity(Converter).Apply() }); var el = new UpdatedEventArgs(new[] { - new SlamLine(((SlamPointDiff)_map[0]).Apply(), ((SlamPointDiff)_map[2]).Apply(), 1), - new SlamLine(((SlamPointDiff)_map[2]).Apply(), ((SlamPointDiff)_map[4]).Apply(), 2) + new SlamLine(_map[0].ToUnity(Converter).Apply(), _map[2].ToUnity(Converter).Apply(), 1), + new SlamLine(_map[2].ToUnity(Converter).Apply(), _map[4].ToUnity(Converter).Apply(), 2) }); SendPacket(packet); @@ -223,8 +222,8 @@ public void Remove() packet.Points.Data.Add(new[] { _map[1], _map[3] }); var e = new RemovedEventArgs(new[] { - ((SlamPointDiff) _map[1]).Apply(), - ((SlamPointDiff) _map[3]).Apply() + _map[1].ToUnity(Converter).Apply(), + _map[3].ToUnity(Converter).Apply() }); SendPacket(packet); @@ -247,9 +246,9 @@ public void Clear() }; var e = new RemovedEventArgs(new[] { - ((SlamPointDiff) _map[0]).Apply(), - ((SlamPointDiff) _map[2]).Apply(), - ((SlamPointDiff) _map[4]).Apply(), + _map[0].ToUnity(Converter).Apply(), + _map[2].ToUnity(Converter).Apply(), + _map[4].ToUnity(Converter).Apply(), }); SendPacket(packet); diff --git a/plugins/Protobuf.Tests.Internal/Integration/Online/SceneTests.cs b/plugins/Protobuf.Tests.Internal/Integration/Online/SceneTests.cs index 43077032..88581455 100644 --- a/plugins/Protobuf.Tests.Internal/Integration/Online/SceneTests.cs +++ b/plugins/Protobuf.Tests.Internal/Integration/Online/SceneTests.cs @@ -5,14 +5,12 @@ using Elektronik.Data.PackageObjects; using Elektronik.DataSources.Containers; using Elektronik.DataSources.Containers.EventArgs; -using Elektronik.Plugins.Common.DataDiff; using Elektronik.Protobuf.Data; using FluentAssertions; using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using Moq; using NUnit.Framework; -using UnityEngine; namespace Protobuf.Tests.Internal.Integration.Online { @@ -26,7 +24,6 @@ public class SceneTests : OnlineTestsBase private readonly TrackedObjPb[] _objects; private readonly PlanePb[] _planes; - public SceneTests() : base(40016) { _imageData = File.ReadAllBytes("1.png"); @@ -112,7 +109,7 @@ public void SendPointsAndConnections() Points = new PacketPb.Types.Points(), }; pointsPacket.Points.Data.Add(_pointsMap); - var e = new AddedEventArgs(_pointsMap.Select(p => ((SlamPointDiff)p).Apply()).ToArray()); + var e = new AddedEventArgs(_pointsMap.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(pointsPacket); @@ -129,7 +126,7 @@ public void SendPointsAndConnections() }; connectionsPacket.Connections.Data.Add(_connections); var lines = _connections.Select(c => (_pointsMap[c.Id1], _pointsMap[c.Id2])) - .Select(pair => (((SlamPointDiff)pair.Item1).Apply(), ((SlamPointDiff)pair.Item2).Apply())) + .Select(pair => (pair.Item1.ToUnity(Converter).Apply(), pair.Item2.ToUnity(Converter).Apply())) .Select((pair, i) => new SlamLine(pair.Item1, pair.Item2, i)) .ToArray(); var e1 = new AddedEventArgs(lines); @@ -148,7 +145,7 @@ public void SendObservationsAndConnections() Observations = new PacketPb.Types.Observations(), }; packet.Observations.Data.Add(_observationsMap); - var e = new AddedEventArgs(_observationsMap.Select(p => ((SlamObservationDiff)p).Apply()) + var e = new AddedEventArgs(_observationsMap.Select(p => p.ToUnity(Converter).Apply()) .ToArray()); SendPacket(packet); @@ -167,8 +164,8 @@ public void SendObservationsAndConnections() }; connectionsPacket.Connections.Data.Add(_connections); var lines = _connections.Select(c => (_observationsMap[c.Id1], _observationsMap[c.Id2])) - .Select(pair => (((SlamObservationDiff)pair.Item1).Apply(), - ((SlamObservationDiff)pair.Item2).Apply())) + .Select(pair => (pair.Item1.ToUnity(Converter).Apply(), + pair.Item2.ToUnity(Converter).Apply())) .Select((pair, i) => new SlamLine(pair.Item1, pair.Item2, i)) .ToArray(); var el = new AddedEventArgs(lines); @@ -187,11 +184,11 @@ public void SendTrackedObjects() TrackedObjs = new PacketPb.Types.TrackedObjs(), }; packet.TrackedObjs.Data.Add(_objects); - var e = new AddedEventArgs(_objects.Select(p => ((SlamTrackedObjectDiff)p).Apply()) + var e = new AddedEventArgs(_objects.Select(p => p.ToUnity(Converter).Apply()) .ToArray()); var els = _objects - .Select(o => new AddedEventArgs(new SimpleLine(0, (Vector3)o.Position!, - (Vector3)o.Position!, (Color)o.Color!))) + .Select(o => new AddedEventArgs(new SimpleLine(0, o.Position!.ToUnity(Converter), + o.Position!.ToUnity(Converter), o.Color!.ToUnity()))) .ToArray(); SendPacket(packet); @@ -213,7 +210,7 @@ public void SendPlanes() Planes = new PacketPb.Types.Planes(), }; packet.Planes.Data.Add(_planes); - var e = new AddedEventArgs(_planes.Select(p => ((SlamPlaneDiff)p).Apply()).ToArray()); + var e = new AddedEventArgs(_planes.Select(p => p.ToUnity(Converter).Apply()).ToArray()); SendPacket(packet); diff --git a/plugins/Protobuf.Tests.Internal/Integration/Online/TrackedObjectsTests.cs b/plugins/Protobuf.Tests.Internal/Integration/Online/TrackedObjectsTests.cs index 3d9d3f06..e4ccda97 100644 --- a/plugins/Protobuf.Tests.Internal/Integration/Online/TrackedObjectsTests.cs +++ b/plugins/Protobuf.Tests.Internal/Integration/Online/TrackedObjectsTests.cs @@ -3,7 +3,6 @@ using Elektronik.Data.PackageObjects; using Elektronik.DataSources.Containers; using Elektronik.DataSources.Containers.EventArgs; -using Elektronik.Plugins.Common.DataDiff; using Elektronik.Protobuf.Data; using FluentAssertions; using Moq; @@ -38,8 +37,8 @@ public void Create() TrackedObjs = new PacketPb.Types.TrackedObjs(), }; packet.TrackedObjs.Data.Add(_objects); - var e = new AddedEventArgs(_objects.Select(p => ((SlamTrackedObjectDiff)p).Apply()) - .ToArray()); + var e = new AddedEventArgs(_objects.Select(p => p.ToUnity(Converter).Apply()) + .ToArray()); var els = _objects.Select(o => new AddedEventArgs(FromPb(0, o))).ToArray(); SendPacket(packet); @@ -69,7 +68,7 @@ public void UpdatePositions() return (newPb, diff); }); packet.TrackedObjs.Data.Add(diff); - var e = new UpdatedEventArgs(_objects.Select(o => ((SlamTrackedObjectDiff)o).Apply()) + var e = new UpdatedEventArgs(_objects.Select(p => p.ToUnity(Converter).Apply()) .ToArray()); var els = _objects.Select((o, i) => new AddedEventArgs(FromPb(1, oldObjects[i], o))).ToArray(); @@ -99,7 +98,7 @@ public void UpdateOrientations() return (newPb, diff); }); packet.TrackedObjs.Data.Add(diff); - var e = new UpdatedEventArgs(_objects.Select(o => ((SlamTrackedObjectDiff)o).Apply()) + var e = new UpdatedEventArgs(_objects.Select(p => p.ToUnity(Converter).Apply()) .ToArray()); var els = _objects.Select(o => new AddedEventArgs(FromPb(2, o))).ToArray(); @@ -130,7 +129,7 @@ public void UpdateColors() return (newPb, diff); }); packet.TrackedObjs.Data.Add(diff); - var e = new UpdatedEventArgs(_objects.Select(o => ((SlamTrackedObjectDiff)o).Apply()) + var e = new UpdatedEventArgs(_objects.Select(p => p.ToUnity(Converter).Apply()) .ToArray()); var els = _objects.Select((o, i) => new AddedEventArgs(FromPb(3, oldObjects[i], o))).ToArray(); @@ -160,7 +159,7 @@ public void UpdateMessage() return (newPb, diff); }); packet.TrackedObjs.Data.Add(diff); - var e = new UpdatedEventArgs(_objects.Select(o => ((SlamTrackedObjectDiff)o).Apply()) + var e = new UpdatedEventArgs(_objects.Select(p => p.ToUnity(Converter).Apply()) .ToArray()); var els = _objects.Select(o => new AddedEventArgs(FromPb(4, o))).ToArray(); @@ -197,7 +196,7 @@ public void ComplexUpdate() } packet.TrackedObjs.Data.Add(_objects); - var e = new UpdatedEventArgs(_objects.Select(o => ((SlamTrackedObjectDiff)o).Apply()) + var e = new UpdatedEventArgs(_objects.Select(p => p.ToUnity(Converter).Apply()) .ToArray()); var els = _objects.Select((o, i) => new AddedEventArgs(FromPb(5, oldObjects[i], o))).ToArray(); @@ -221,7 +220,7 @@ public void Remove() TrackedObjs = new PacketPb.Types.TrackedObjs(), }; packet.TrackedObjs.Data.Add(new[] { _objects[1] }); - var e = new RemovedEventArgs(((SlamTrackedObjectDiff)_objects[1]).Apply()); + var e = new RemovedEventArgs(_objects[1].ToUnity(Converter).Apply()); var el = new RemovedEventArgs(Enumerable .Range(0, 6) .Select( @@ -247,7 +246,7 @@ public void Clear() }; var e = new RemovedEventArgs(new[] { - ((SlamTrackedObjectDiff)_objects[0]).Apply(), ((SlamTrackedObjectDiff)_objects[2]).Apply() + _objects[0].ToUnity(Converter).Apply(), _objects[2].ToUnity(Converter).Apply() }); var el = new RemovedEventArgs(Enumerable .Range(0, 6) @@ -266,12 +265,12 @@ public void Clear() #region Not tests - private static SimpleLine FromPb(int id, TrackedObjPb obj) => - new(id, (Vector3)obj.Position!, (Vector3)obj.Position!, (Color)obj.Color!); + private SimpleLine FromPb(int id, TrackedObjPb obj) => + new(id, obj.Position!.ToUnity(Converter), obj.Position!.ToUnity(Converter), obj.Color!.ToUnity()); - private static SimpleLine FromPb(int id, TrackedObjPb obj1, TrackedObjPb obj2) => - new(id, (Vector3)obj1.Position!, (Vector3)(obj2.Position ?? obj1.Position)!, - (Color)obj1.Color!, (Color)(obj2.Color ?? obj1.Color)!); + private SimpleLine FromPb(int id, TrackedObjPb obj1, TrackedObjPb obj2) => + new(id, obj1.Position!.ToUnity(Converter), (obj2.Position ?? obj1.Position)!.ToUnity(Converter), + obj1.Color!.ToUnity(), (obj2.Color ?? obj1.Color)!.ToUnity()); private TrackedObjPb[] CreateDiff(Func func) { diff --git a/plugins/Protobuf.Tests.Internal/RecorderTests.cs b/plugins/Protobuf.Tests.Internal/RecorderTests.cs index 178d79be..ed8faff1 100644 --- a/plugins/Protobuf.Tests.Internal/RecorderTests.cs +++ b/plugins/Protobuf.Tests.Internal/RecorderTests.cs @@ -4,6 +4,7 @@ using System.Linq; using Elektronik.Data.PackageObjects; using Elektronik.DataSources.Containers.EventArgs; +using Elektronik.Plugins.Common; using Elektronik.Plugins.Common.DataDiff; using Elektronik.Protobuf.Data; using Elektronik.Protobuf.Recorders; @@ -17,6 +18,7 @@ namespace Protobuf.Tests.Internal public class RecorderTests { private string _filename; + private readonly ICSConverter _converter = new ProtobufToUnityConverter(); [TearDown] public void TearDown() @@ -47,18 +49,18 @@ public void PointsTest() using var input = File.OpenRead(_filename); var packet = PacketPb.Parser.ParseDelimitedFrom(input); - Assert.AreEqual(PacketPb.Types.ActionType.Add, packet.Action); + packet.Action.Should().Be(PacketPb.Types.ActionType.Add); CheckPoints(points, packet); var anotherPacket = PacketPb.Parser.ParseDelimitedFrom(input); - Assert.AreEqual(PacketPb.Types.ActionType.Update, anotherPacket.Action); + anotherPacket.Action.Should().Be(PacketPb.Types.ActionType.Update); CheckPoints(morePoints, anotherPacket); var yetAnotherPacket = PacketPb.Parser.ParseDelimitedFrom(input); - Assert.AreEqual(PacketPb.Types.ActionType.Remove, yetAnotherPacket.Action); - var removingPoints = yetAnotherPacket.ExtractPoints().ToList(); - Assert.AreEqual(1, removingPoints.Count); - Assert.AreEqual(0, removingPoints[0].Id); + yetAnotherPacket.Action.Should().Be(PacketPb.Types.ActionType.Remove); + var removingPoints = yetAnotherPacket.ExtractPoints(_converter).ToList(); + removingPoints.Count.Should().Be(1); + removingPoints[0].Id.Should().Be(0); CheckMetadata(input, 3); } @@ -118,7 +120,7 @@ public void TrackedObjectsTest() new SlamTrackedObject(0, Vector3.zero, new Quaternion(5, 6, 7, 0), Color.red, "Another message"), new SlamTrackedObject(-10, Vector3.up, Quaternion.identity, Color.white, "test message") }; - + sut.OnItemsAdded(null, new AddedEventArgs(trackedObjects)); sut.OnItemsUpdated(null, new UpdatedEventArgs(moreTrackedObjects)); sut.OnItemsRemoved(null, new RemovedEventArgs(new List { 0 })); @@ -135,7 +137,7 @@ public void TrackedObjectsTest() var yetAnotherPacket = PacketPb.Parser.ParseDelimitedFrom(input); Assert.AreEqual(PacketPb.Types.ActionType.Remove, yetAnotherPacket.Action); - var removingPoints = yetAnotherPacket.ExtractTrackedObjects().ToList(); + var removingPoints = yetAnotherPacket.ExtractTrackedObjects(_converter).ToList(); Assert.AreEqual(1, removingPoints.Count); Assert.AreEqual(0, removingPoints[0].Id); CheckMetadata(input, 3); @@ -173,7 +175,7 @@ public void PlanesTest() var yetAnotherPacket = PacketPb.Parser.ParseDelimitedFrom(input); Assert.AreEqual(PacketPb.Types.ActionType.Remove, yetAnotherPacket.Action); - var removingPoints = yetAnotherPacket.ExtractPlanes().ToList(); + var removingPoints = yetAnotherPacket.ExtractPlanes(_converter).ToList(); Assert.AreEqual(1, removingPoints.Count); Assert.AreEqual(0, removingPoints[0].Id); CheckMetadata(input, 3); @@ -212,7 +214,7 @@ public void LinesTest() var yetAnotherPacket = PacketPb.Parser.ParseDelimitedFrom(input); Assert.AreEqual(PacketPb.Types.ActionType.Remove, yetAnotherPacket.Action); - var removingPoints = yetAnotherPacket.ExtractLines().ToList(); + var removingPoints = yetAnotherPacket.ExtractLines(_converter).ToList(); Assert.AreEqual(1, removingPoints.Count); Assert.AreEqual(0, removingPoints[0].Id); CheckMetadata(input, 3); @@ -237,7 +239,7 @@ public void StartStopTest() sut.OnItemsAdded(null, new AddedEventArgs(points)); sut.OnItemsUpdated(null, new UpdatedEventArgs(morePoints)); sut.Dispose(); - + sut.OnItemsRemoved(null, new RemovedEventArgs(new List { 0 })); using var input = File.OpenRead(_filename); @@ -257,98 +259,103 @@ public void StartStopTest() #region Not tests // Color have 32 bit size, so when it converts form int to float it has 1/256 ~ 0.004 accuracy. - private bool AreColorsEqual(Color first, Color second) + private void CheckColors(Color first, Color second) { float epsilon = 0.004f; - return (Mathf.Abs(first.r - second.r) < epsilon) - && (Mathf.Abs(first.g - second.g) < epsilon) - && (Mathf.Abs(first.b - second.b) < epsilon); + first.r.Should().BeApproximately(second.r, epsilon); + first.g.Should().BeApproximately(second.g, epsilon); + first.b.Should().BeApproximately(second.b, epsilon); } - private bool CheckDiffAndPoint(SlamPointDiff diff, SlamPoint point) + private void CheckDiffAndPoint(SlamPointDiff diff, SlamPoint point) { - bool id = diff.Id == point.Id; - bool offset = !diff.Position.HasValue || diff.Position.Value == point.Position; - bool color = !diff.Color.HasValue || AreColorsEqual(diff.Color.Value, point.Color); - bool message = string.IsNullOrEmpty(diff.Message) || diff.Message == point.Message; - return id && offset && color && message; + diff.Id.Should().Be(point.Id); + diff.Position?.Should().Be(point.Position); + if (diff.Color.HasValue) CheckColors(diff.Color.Value, point.Color); + if (!string.IsNullOrEmpty(diff.Message)) diff.Message.Should().Be(point.Message); } private void CheckPoints(IEnumerable points, PacketPb packet) { Assert.AreEqual(PacketPb.DataOneofCase.Points, packet.DataCase); - Assert.IsTrue(packet.ExtractPoints() - .Zip(points, (point, item) => (point, item)) - .All(d => CheckDiffAndPoint(d.point, d.item))); + foreach (var (diff, expected) in packet.ExtractPoints(_converter) + .Zip(points, (point, item) => (point, item))) + { + CheckDiffAndPoint(diff, expected); + } } - private bool CheckDiffAndObservation(SlamObservationDiff diff, SlamObservation observation) + private void CheckDiffAndObservation(SlamObservationDiff diff, SlamObservation observation) { - bool id = diff.Id == observation.Id; - bool point = CheckDiffAndPoint(diff.Point, observation.Point); - bool offset = !diff.Rotation.HasValue || diff.Rotation.Value == observation.Rotation; - bool message = string.IsNullOrEmpty(diff.Message) || diff.Message == observation.Message; - bool filename = string.IsNullOrEmpty(diff.FileName) || diff.FileName == observation.FileName; - return id && offset && point && message && filename; + diff.Id.Should().Be(observation.Id); + CheckDiffAndPoint(diff.Point, observation.Point); + diff.Rotation?.Should().Be(observation.Rotation); + if (!string.IsNullOrEmpty(diff.Message)) diff.Message.Should().Be(observation.Message); + if (!string.IsNullOrEmpty(diff.FileName)) diff.FileName.Should().Be(observation.FileName); } - private void CheckObservations(IEnumerable points, PacketPb packet) + private void CheckObservations(IEnumerable observations, PacketPb packet) { Assert.AreEqual(PacketPb.DataOneofCase.Observations, packet.DataCase); - Assert.IsTrue(packet.ExtractObservations(null, "") - .Zip(points, (point, item) => (point, item)) - .All(d => CheckDiffAndObservation(d.point, d.item))); + foreach (var (diff, expected) in packet.ExtractObservations(_converter, "") + .Zip(observations, (point, item) => (point, item))) + { + CheckDiffAndObservation(diff, expected); + } } - private bool CheckDiffAndTrackedObj(SlamTrackedObjectDiff diff, SlamTrackedObject obj) + private void CheckDiffAndTrackedObj(SlamTrackedObjectDiff diff, SlamTrackedObject obj) { - bool id = diff.Id == obj.Id; - bool offset = !diff.Position.HasValue || diff.Position.Value == obj.Position; - bool normal = !diff.Rotation.HasValue || diff.Rotation.Value == obj.Rotation; - bool color = !diff.Color.HasValue || AreColorsEqual(diff.Color.Value, obj.Color); - bool message = string.IsNullOrEmpty(diff.Message) || diff.Message == obj.Message; - return id && offset && normal && color && message; + diff.Id.Should().Be(obj.Id); + diff.Position?.Should().Be(obj.Position); + diff.Rotation?.Should().Be(obj.Rotation); + if (diff.Color.HasValue) CheckColors(diff.Color.Value, obj.Color); + if (!string.IsNullOrEmpty(diff.Message)) diff.Message.Should().Be(obj.Message); } - private void CheckTrackedObjects(IEnumerable points, PacketPb packet) + private void CheckTrackedObjects(IEnumerable objs, PacketPb packet) { Assert.AreEqual(PacketPb.DataOneofCase.TrackedObjs, packet.DataCase); - Assert.IsTrue(packet.ExtractTrackedObjects() - .Zip(points, (point, item) => (point, item)) - .All(d => CheckDiffAndTrackedObj(d.point, d.item))); + foreach (var (diff, expected) in packet.ExtractTrackedObjects(_converter) + .Zip(objs, (point, item) => (point, item))) + { + CheckDiffAndTrackedObj(diff, expected); + } } - private bool CheckDiffAndPlane(SlamPlaneDiff diff, SlamPlane plane) + private void CheckDiffAndPlane(SlamPlaneDiff diff, SlamPlane plane) { - bool id = diff.Id == plane.Id; - bool offset = !diff.Offset.HasValue || diff.Offset.Value == plane.Offset; - bool normal = !diff.Normal.HasValue || diff.Normal.Value == plane.Normal; - bool color = !diff.Color.HasValue || AreColorsEqual(diff.Color.Value, plane.Color); - bool message = string.IsNullOrEmpty(diff.Message) || diff.Message == plane.Message; - return id && offset && normal && color && message; + diff.Id.Should().Be(plane.Id); + diff.Offset?.Should().Be(plane.Offset); + diff.Normal?.Should().Be(plane.Normal); + if (diff.Color.HasValue) CheckColors(diff.Color.Value, plane.Color); + if (!string.IsNullOrEmpty(diff.Message)) diff.Message.Should().Be(plane.Message); } - private void CheckPlanes(IEnumerable points, PacketPb packet) + private void CheckPlanes(IEnumerable planes, PacketPb packet) { Assert.AreEqual(PacketPb.DataOneofCase.Planes, packet.DataCase); - Assert.IsTrue(packet.ExtractPlanes() - .Zip(points, (point, item) => (point, item)) - .All(pair => CheckDiffAndPlane(pair.point, pair.item))); + foreach (var (diff, expected) in packet.ExtractPlanes(_converter) + .Zip(planes, (point, item) => (point, item))) + { + CheckDiffAndPlane(diff, expected); + } } - private bool CheckDiffAndLine(SlamLineDiff diff, SlamLine line) + private void CheckDiffAndLine(SlamLineDiff diff, SlamLine line) { - bool point1 = CheckDiffAndPoint(diff.Point1, line.Point1); - bool point2 = CheckDiffAndPoint(diff.Point2, line.Point2); - return point1 && point2; + CheckDiffAndPoint(diff.Point1, line.Point1); + CheckDiffAndPoint(diff.Point2, line.Point2); } - private void CheckLines(IEnumerable points, PacketPb packet) + private void CheckLines(IEnumerable lines, PacketPb packet) { Assert.AreEqual(PacketPb.DataOneofCase.Lines, packet.DataCase); - Assert.IsTrue(packet.ExtractLines() - .Zip(points, (point, item) => (point, item)) - .All(d => CheckDiffAndLine(d.point, d.item))); + foreach (var (diff, expected) in packet.ExtractLines(_converter) + .Zip(lines, (point, item) => (point, item))) + { + CheckDiffAndLine(diff, expected); + } } private void CheckMetadata(FileStream input, int expectedFrames) @@ -356,16 +363,16 @@ private void CheckMetadata(FileStream input, int expectedFrames) input.Position = input.Length - 8; var buffer = new byte[4]; input.Read(buffer, 0, 4); - Assert.AreEqual(BitConverter.GetBytes(ProtobufRecorder.Marker), buffer); + buffer.Should().BeEquivalentTo(BitConverter.GetBytes(ProtobufRecorder.Marker)); input.Read(buffer, 0, 4); - Assert.AreEqual(BitConverter.GetBytes(expectedFrames), buffer); + buffer.Should().BeEquivalentTo(BitConverter.GetBytes(expectedFrames)); } private ProtobufRecorder CreateRecorder(int id) { _filename = $"test_{id}.dat"; - var factory = new ProtobufRecorderFactory() { Filename = _filename }; - return (ProtobufRecorder)factory.Start(new FakeConverter()); + var factory = new ProtobufRecorderFactory { Filename = _filename }; + return (ProtobufRecorder)factory.Start(); } #endregion diff --git a/plugins/Protobuf.Tests.Internal/RetranslatorTests.cs b/plugins/Protobuf.Tests.Internal/RetranslatorTests.cs index bfe4bf25..dc126fa4 100644 --- a/plugins/Protobuf.Tests.Internal/RetranslatorTests.cs +++ b/plugins/Protobuf.Tests.Internal/RetranslatorTests.cs @@ -41,23 +41,26 @@ public void Setup() _mockedObservationsContainer = new Mock>(); _mockedTrackedObjectsContainer = new Mock>(); _mockedPlanesContainer = new Mock>(); - + var factory = new ProtobufRetranslatorFactory(); - _retranslator = (ProtobufRetranslator)factory.Start(new FakeConverter()); + _retranslator = (ProtobufRetranslator)factory.Start(); var settings = (RetranslatorSettingsBag)_retranslator.Settings; settings.Addresses = $"{Address}:{Port}"; settings.StartRetranslation?.Invoke(); - + + var converter = new ProtobufToUnityConverter(); + var logger = new TestsLogger(); - var pointsMapManager = - new PointsMapManager(_mockedBuffer.Object, _mockedPointsContainer.Object, null, logger); - var observationsMapManager = - new ObservationsMapManager(_mockedBuffer.Object, _mockedObservationsContainer.Object, null, logger); - var trackedObjsMapManager = - new TrackedObjsMapManager(_mockedBuffer.Object, _mockedTrackedObjectsContainer.Object, null, - logger); - var planesMapManager = - new PlanesMapManager(_mockedBuffer.Object, _mockedPlanesContainer.Object, null, logger); + var pointsMapManager = new PointsMapManager(_mockedBuffer.Object, _mockedPointsContainer.Object, + converter, logger); + var observationsMapManager = new ObservationsMapManager(_mockedBuffer.Object, + _mockedObservationsContainer.Object, + converter, logger); + var trackedObjsMapManager = new TrackedObjsMapManager(_mockedBuffer.Object, + _mockedTrackedObjectsContainer.Object, + converter, logger); + var planesMapManager = new PlanesMapManager(_mockedBuffer.Object, _mockedPlanesContainer.Object, + converter, logger); var servicesChain = new IChainable[] { @@ -70,14 +73,8 @@ public void Setup() _grpcServer = new Server { - Services = - { - MapsManagerPb.BindService(servicesChain), - }, - Ports = - { - new ServerPort(Address, Port, ServerCredentials.Insecure), - }, + Services = { MapsManagerPb.BindService(servicesChain), }, + Ports = { new ServerPort(Address, Port, ServerCredentials.Insecure), }, }; _grpcServer.Start(); } @@ -112,7 +109,8 @@ public void PointsTest() _retranslator.OnItemsAdded(null, new AddedEventArgs(added.Select(p => p.Apply()).ToArray())); Thread.Sleep(50); - _retranslator.OnItemsUpdated(null, new UpdatedEventArgs(updated.Select(p => p.Apply()).ToArray())); + _retranslator.OnItemsUpdated( + null, new UpdatedEventArgs(updated.Select(p => p.Apply()).ToArray())); Thread.Sleep(50); _retranslator.OnItemsRemoved(null, new RemovedEventArgs(new List { 1 })); Thread.Sleep(100); @@ -127,10 +125,10 @@ public void ObservationsTest() { var added = new[] { - new SlamObservationDiff(new SlamPointDiff(0, Vector3.one, Color.blue), - Quaternion.identity, Array.Empty(), "123", + new SlamObservationDiff(new SlamPointDiff(0, Vector3.one, Color.blue), + Quaternion.identity, Array.Empty(), "123", Path.Combine(Directory.GetCurrentDirectory(), "f.png")), - new SlamObservationDiff(new SlamPointDiff(1, Vector3.down, Color.red), + new SlamObservationDiff(new SlamPointDiff(1, Vector3.down, Color.red), new Quaternion(0, 5, 15, 3), Array.Empty(), "321"), new SlamObservationDiff(new SlamPointDiff(-10, Vector3.forward, Color.gray, "test message"), new Quaternion(59, 46, 3, 24), Array.Empty(), "adsf", @@ -139,22 +137,28 @@ public void ObservationsTest() var updated = new[] { new SlamObservationDiff(new SlamPointDiff(0, Vector3.zero, Color.red, "Another message"), - new Quaternion(6, 2, 1, 0), Array.Empty(), "123", + new Quaternion(6, 2, 1, 0), Array.Empty(), "123", Path.Combine(Directory.GetCurrentDirectory(), "f.png")), - new SlamObservationDiff(new SlamPointDiff(-10, Vector3.up, Color.white, "test message"), - Quaternion.identity, Array.Empty(), "123", + new SlamObservationDiff(new SlamPointDiff(-10, Vector3.up, Color.white, "test message"), + Quaternion.identity, Array.Empty(), "123", Path.Combine(Directory.GetCurrentDirectory(), "f.png")), }; var removed = new[] { new SlamObservationDiff(new SlamPointDiff(0)), }; - var addCommand = new AddCommand(_mockedObservationsContainer.Object, added); - var updateCommand = new UpdateCommand(_mockedObservationsContainer.Object, updated); - var removeCommand = new RemoveCommand(_mockedObservationsContainer.Object, removed); - - _retranslator.OnItemsAdded(null, new AddedEventArgs(added.Select(o => o.Apply()).ToArray())); + var addCommand = new AddCommand( + _mockedObservationsContainer.Object, added); + var updateCommand = new UpdateCommand( + _mockedObservationsContainer.Object, updated); + var removeCommand = new RemoveCommand( + _mockedObservationsContainer.Object, removed); + + _retranslator.OnItemsAdded( + null, new AddedEventArgs(added.Select(o => o.Apply()).ToArray())); Thread.Sleep(100); - _retranslator.OnItemsUpdated(null, new UpdatedEventArgs(updated.Select(o => o.Apply()).ToArray())); + _retranslator.OnItemsUpdated( + null, new UpdatedEventArgs(updated.Select(o => o.Apply()).ToArray())); Thread.Sleep(100); - _retranslator.OnItemsRemoved(null, new RemovedEventArgs(removed.Select(o => o.Apply()).ToArray())); + _retranslator.OnItemsRemoved( + null, new RemovedEventArgs(removed.Select(o => o.Apply()).ToArray())); Thread.Sleep(200); _mockedBuffer.Verify(b => b.Add(addCommand, It.IsAny(), false), Times.Once); @@ -177,17 +181,26 @@ public void TrackedObjectsTest() new SlamTrackedObjectDiff(-10, Vector3.up, Quaternion.identity, Color.white, "test message"), }; var removed = new[] { new SlamTrackedObjectDiff(0), }; - var addCommand = new AddCommand(_mockedTrackedObjectsContainer.Object, added); - var updateCommand = new UpdateCommand(_mockedTrackedObjectsContainer.Object, updated); - var removeCommand = new RemoveCommand(_mockedTrackedObjectsContainer.Object, removed); - - _retranslator.OnItemsAdded(null, new AddedEventArgs(added.Select(o => o.Apply()).ToArray())); + var addCommand = + new AddCommand( + _mockedTrackedObjectsContainer.Object, added); + var updateCommand = + new UpdateCommand( + _mockedTrackedObjectsContainer.Object, updated); + var removeCommand = + new RemoveCommand( + _mockedTrackedObjectsContainer.Object, removed); + + _retranslator.OnItemsAdded( + null, new AddedEventArgs(added.Select(o => o.Apply()).ToArray())); Thread.Sleep(50); - _retranslator.OnItemsUpdated(null, new UpdatedEventArgs(updated.Select(o => o.Apply()).ToArray())); + _retranslator.OnItemsUpdated( + null, new UpdatedEventArgs(updated.Select(o => o.Apply()).ToArray())); Thread.Sleep(50); - _retranslator.OnItemsRemoved(null, new RemovedEventArgs(removed.Select(o => o.Apply()).ToArray())); + _retranslator.OnItemsRemoved( + null, new RemovedEventArgs(removed.Select(o => o.Apply()).ToArray())); Thread.Sleep(100); - + _mockedBuffer.Verify(b => b.Add(addCommand, It.IsAny(), false), Times.Once); _mockedBuffer.Verify(b => b.Add(updateCommand, It.IsAny(), false), Times.Once); _mockedBuffer.Verify(b => b.Add(removeCommand, It.IsAny(), false), Times.Once); @@ -214,11 +227,13 @@ public void InfinitePlanesTest() _retranslator.OnItemsAdded(null, new AddedEventArgs(added.Select(o => o.Apply()).ToArray())); Thread.Sleep(50); - _retranslator.OnItemsUpdated(null, new UpdatedEventArgs(updated.Select(o => o.Apply()).ToArray())); + _retranslator.OnItemsUpdated( + null, new UpdatedEventArgs(updated.Select(o => o.Apply()).ToArray())); Thread.Sleep(50); - _retranslator.OnItemsRemoved(null, new RemovedEventArgs(removed.Select(o => o.Apply()).ToArray())); + _retranslator.OnItemsRemoved( + null, new RemovedEventArgs(removed.Select(o => o.Apply()).ToArray())); Thread.Sleep(100); - + _mockedBuffer.Verify(b => b.Add(addCommand, It.IsAny(), false), Times.Once); _mockedBuffer.Verify(b => b.Add(updateCommand, It.IsAny(), false), Times.Once); _mockedBuffer.Verify(b => b.Add(removeCommand, It.IsAny(), false), Times.Once); diff --git a/plugins/Protobuf/Data/MapTypesExtensions.cs b/plugins/Protobuf/Data/MapTypesExtensions.cs index 4fd8e9d3..507f7db9 100644 --- a/plugins/Protobuf/Data/MapTypesExtensions.cs +++ b/plugins/Protobuf/Data/MapTypesExtensions.cs @@ -1,8 +1,9 @@ using System; using System.Collections.Generic; using System.IO; -using Elektronik.Data.Converters; +using System.Linq; using Elektronik.Data.PackageObjects; +using Elektronik.Plugins.Common; using Elektronik.Plugins.Common.DataDiff; using UnityEngine; @@ -10,33 +11,18 @@ namespace Elektronik.Protobuf.Data { public static class PacketPbExtensions { - public static SlamPointDiff[] ExtractPoints(this PacketPb packet, ICSConverter? converter = null) + public static SlamPointDiff[] ExtractPoints(this PacketPb packet, ICSConverter? converter) { - var result = new SlamPointDiff[packet.Points.Data.Count]; - for (var i = 0; i < result.Length; i++) - { - result[i] = packet.Points.Data[i]; - var position = result[i].Position; - if (position.HasValue) result[i].Position = converter?.Convert(position.Value) ?? position; - } - - return result; + return packet.Points.Data.Select(p => p.ToUnity(converter)).ToArray(); } - public static SlamObservationDiff[] ExtractObservations(this PacketPb packet, - ICSConverter? converter, + public static SlamObservationDiff[] ExtractObservations(this PacketPb packet, ICSConverter? converter, string imageDir) { var result = new SlamObservationDiff[packet.Observations.Data.Count]; for (var i = 0; i < result.Length; i++) { - result[i] = packet.Observations.Data[i]; - - var position = result[i].Point.Position; - if (position.HasValue) result[i].Point.Position = converter?.Convert(position.Value) ?? position; - - var rotation = result[i].Rotation; - if (rotation.HasValue) result[i].Rotation = converter?.Convert(rotation.Value) ?? rotation; + result[i] = packet.Observations.Data[i].ToUnity(converter); if (!string.IsNullOrEmpty(result[i].FileName) && !Path.IsPathRooted(result[i].FileName)) { @@ -47,73 +33,24 @@ public static SlamObservationDiff[] ExtractObservations(this PacketPb packet, return result; } - public static SlamTrackedObjectDiff[] ExtractTrackedObjects(this PacketPb packet, - ICSConverter? converter = null) + public static SlamTrackedObjectDiff[] ExtractTrackedObjects(this PacketPb packet, ICSConverter? converter) { - var result = new SlamTrackedObjectDiff[packet.TrackedObjs.Data.Count]; - for (var i = 0; i < result.Length; i++) - { - result[i] = packet.TrackedObjs.Data[i]; - - var position = result[i].Position; - if (position.HasValue) result[i].Position = converter?.Convert(position.Value) ?? position; - - var rotation = result[i].Rotation; - if (rotation.HasValue) result[i].Rotation = converter?.Convert(rotation.Value) ?? rotation; - } - - return result; + return packet.TrackedObjs.Data.Select(p => p.ToUnity(converter)).ToArray(); } - public static SlamLineDiff[] ExtractLines(this PacketPb packet, ICSConverter? converter = null) + public static SlamLineDiff[] ExtractLines(this PacketPb packet, ICSConverter? converter) { - var result = new SlamLineDiff[packet.Lines.Data.Count]; - for (var i = 0; i < result.Length; i++) - { - result[i] = packet.Lines.Data[i]; - - var position = result[i].Point1.Position; - if (position.HasValue) result[i].Point1.Position = converter?.Convert(position.Value) ?? position; - - position = result[i].Point2.Position; - if (position.HasValue) result[i].Point2.Position = converter?.Convert(position.Value) ?? position; - } - - return result; + return packet.Lines.Data.Select(p => p.ToUnity(converter)).ToArray(); } - public static SlamPlaneDiff[] ExtractPlanes(this PacketPb packet, ICSConverter? converter = null) + public static SlamPlaneDiff[] ExtractPlanes(this PacketPb packet, ICSConverter? converter) { - var result = new SlamPlaneDiff[packet.Planes.Data.Count]; - for (var i = 0; i < result.Length; i++) - { - result[i] = packet.Planes.Data[i]; - - var offset = result[i].Offset; - if (offset.HasValue) result[i].Offset = converter?.Convert(offset.Value) ?? offset; - - var normal = result[i].Normal; - if (normal.HasValue) result[i].Normal = converter?.Convert(normal.Value) ?? normal; - } - - return result; + return packet.Planes.Data.Select(p => p.ToUnity(converter)).ToArray(); } - public static SlamMarkerDiff[] ExtractMarkers(this PacketPb packet, ICSConverter? converter = null) + public static SlamMarkerDiff[] ExtractMarkers(this PacketPb packet, ICSConverter? converter) { - var result = new SlamMarkerDiff[packet.Markers.Data.Count]; - for (var i = 0; i < result.Length; i++) - { - result[i] = packet.Markers.Data[i]; - - var position = result[i].Position; - if (position.HasValue) result[i].Position = converter?.Convert(position.Value) ?? position; - - var rotation = result[i].Rotation; - if (rotation.HasValue) result[i].Rotation = converter?.Convert(rotation.Value) ?? rotation; - } - - return result; + return packet.Markers.Data.Select(p => p.ToUnity(converter)).ToArray(); } public static byte[] ExtractImage(this PacketPb packetPb, string imageDir) @@ -136,123 +73,110 @@ public static byte[] ExtractImage(this PacketPb packetPb, string imageDir) public partial class Vector3Pb { - public static implicit operator Vector3?(Vector3Pb? v) + public Vector3 ToUnity(ICSConverter? converter) { - if (v == null) return null; - return new Vector3((float)v.X, (float)v.Y, (float)v.Z); + var res = new Vector3((float)X, (float)Y, (float)Z); + converter?.Convert(ref res); + return res; } } public partial class Vector4Pb { - public static implicit operator Quaternion?(Vector4Pb? v) + public Quaternion ToUnity(ICSConverter? converter) { - if (v == null) return null; - return new Quaternion((float)v.X, (float)v.Y, (float)v.Z, (float)v.W); + var res = new Quaternion((float)X, (float)Y, (float)Z, (float)W); + converter?.Convert(ref res); + return res; } } public partial class ColorPb { - public static implicit operator Color32?(ColorPb? c) + public Color32 ToUnity32() { - if (c == null) return null; - return new Color32((byte)c.R, (byte)c.G, (byte)c.B, 255); + return new Color32((byte)R, (byte)G, (byte)B, 255); } - public static implicit operator Color?(ColorPb c) => (Color32?)c; + public Color ToUnity() => ToUnity32(); - public static implicit operator ColorPb(Color c) => (Color32)c; + public static ColorPb FromUnity32(Color32 color) => new ColorPb { R = color.r, G = color.g, B = color.b, }; - public static implicit operator ColorPb(Color32 c) => new ColorPb { R = c.r, G = c.g, B = c.b, }; + public static ColorPb FromUnity(Color color) => FromUnity32(color); } public partial class PointPb { - public static implicit operator SlamPointDiff(PointPb? p) - => p != null - ? new SlamPointDiff(p.id_, p.position_, p.color_, p.message_) - : default; + public SlamPointDiff ToUnity(ICSConverter? converter) => + new(Id, Position?.ToUnity(converter), Color?.ToUnity(), Message); } public partial class LinePb { - public static implicit operator SlamLineDiff(LinePb? c) - => c != null ? new SlamLineDiff { Point1 = c.pt1_, Point2 = c.pt2_ } : default; + public SlamLineDiff ToUnity(ICSConverter? converter) => + new SlamLineDiff { Point1 = Pt1.ToUnity(converter), Point2 = Pt2.ToUnity(converter) }; } public partial class ObservationPb { - public static implicit operator SlamObservationDiff(ObservationPb? o) - => o != null - ? new SlamObservationDiff(o.point_, o.Orientation, o.observedPoints_, o.message_, o.filename_) - : default; + public SlamObservationDiff ToUnity(ICSConverter? converter) => + new(Point.ToUnity(converter), Orientation?.ToUnity(converter), ObservedPoints, Message, Filename); } public partial class TrackedObjPb { - public static implicit operator SlamTrackedObjectDiff(TrackedObjPb? o) - => o != null - ? new SlamTrackedObjectDiff(o.id_, o.position_, o.orientation_, o.color_, o.message_) - : default; + public SlamTrackedObjectDiff ToUnity(ICSConverter? converter) => + new(Id, Position?.ToUnity(converter), Orientation?.ToUnity(converter), Color?.ToUnity(), Message); } public partial class PlanePb { - public static implicit operator SlamPlaneDiff(PlanePb? p) - => p != null - ? new SlamPlaneDiff(p.Id, p.Offset, p.Normal, p.Color, p.Message) - : default; + public SlamPlaneDiff ToUnity(ICSConverter? converter) => + new(Id, Offset?.ToUnity(converter), Normal?.ToUnity(converter), Color?.ToUnity(), Message); } public partial class MarkerPb { - public static implicit operator SlamMarkerDiff(MarkerPb? p) - => p != null - ? new SlamMarkerDiff(p.Id, - p.Position, - p.Orientation, - p.Scale, - p.Color, - p.Message, - p.HasPrimitive ? FromProtobuf(p.Primitive) : null) - : default; + public SlamMarkerDiff ToUnity(ICSConverter? converter) => + new(Id, Position?.ToUnity(converter), Orientation?.ToUnity(converter), Scale?.ToUnity(null), + Color?.ToUnity(), Message, GetPrimitive()); - private static SlamMarker.MarkerType? FromProtobuf(Types.Type t) => - t switch - { - Types.Type.Sphere => SlamMarker.MarkerType.Sphere, - Types.Type.Cube => SlamMarker.MarkerType.Cube, - Types.Type.Crystal => SlamMarker.MarkerType.Crystal, - Types.Type.SemitransparentCube => SlamMarker.MarkerType.SemitransparentCube, - Types.Type.SemitransparentSphere => SlamMarker.MarkerType.SemitransparentSphere, - _ => null, - }; + private SlamMarker.MarkerType? GetPrimitive() + { + if (!HasPrimitive) return null; + return Primitive switch + { + Types.Type.Sphere => SlamMarker.MarkerType.Sphere, + Types.Type.Cube => SlamMarker.MarkerType.Cube, + Types.Type.Crystal => SlamMarker.MarkerType.Crystal, + Types.Type.SemitransparentCube => SlamMarker.MarkerType.SemitransparentCube, + Types.Type.SemitransparentSphere => SlamMarker.MarkerType.SemitransparentSphere, + _ => null, + }; + } } public static class Conversions { public static Vector3Pb ToProtobuf(this Vector3 v, ICSConverter? converter = null) { - converter?.ConvertBack(ref v); + if (converter is not null) v = converter.ConvertedBack(v); return new Vector3Pb { X = v.x, Y = v.y, Z = v.z }; } public static Vector4Pb ToProtobuf(this Quaternion q, ICSConverter? converter = null) { - if (converter != null) - { - var v = Vector3.zero; - converter.ConvertBack(ref v, ref q); - } - + if (converter is not null) q = converter.ConvertedBack(q); return new Vector4Pb { X = q.x, Y = q.y, Z = q.z, W = q.w }; } public static PointPb ToProtobuf(this SlamPoint p, ICSConverter? converter = null) => new() { - Id = p.Id, Position = p.Position.ToProtobuf(converter), Color = p.Color, Message = p.Message ?? "" + Id = p.Id, + Position = p.Position.ToProtobuf(converter), + Color = ColorPb.FromUnity(p.Color), + Message = p.Message ?? "" }; public static LinePb ToProtobuf(this SlamLine l, ICSConverter? converter = null) @@ -277,15 +201,15 @@ public static TrackedObjPb ToProtobuf(this SlamTrackedObject o, ICSConverter? co Id = o.Id, Position = o.Position.ToProtobuf(converter), Orientation = o.Rotation.ToProtobuf(converter), - Color = o.Color, + Color = ColorPb.FromUnity(o.Color), Message = o.Message }; public static PlanePb ToProtobuf(this SlamPlane p, ICSConverter? converter = null) => new() { - Color = p.Color, Id = p.Id, + Color = ColorPb.FromUnity(p.Color), Message = p.Message, Normal = p.Normal.ToProtobuf(converter), Offset = p.Offset.ToProtobuf(converter) diff --git a/plugins/Protobuf/Data/ProtobufToUnityConverter.cs b/plugins/Protobuf/Data/ProtobufToUnityConverter.cs new file mode 100644 index 00000000..e0e72927 --- /dev/null +++ b/plugins/Protobuf/Data/ProtobufToUnityConverter.cs @@ -0,0 +1,93 @@ +using Elektronik.Plugins.Common; +using UnityEngine; + +namespace Elektronik.Protobuf.Data +{ + public class ProtobufToUnityConverter : ICSConverter + { + /// + public void Convert(ref Vector3 pos) + { + pos.y = -pos.y; + } + + public void Convert(ref Quaternion rot) + { + rot.y = -rot.y; + rot.w = -rot.w; + } + + /// + public Vector3 Converted(Vector3 pos) + { + Convert(ref pos); + return pos; + } + + /// + public Quaternion Converted(Quaternion rot) + { + rot.y = -rot.y; + rot.w = -rot.w; + return rot; + } + + /// + public (Vector3 pos, Quaternion rot) Converted(Vector3 pos, Quaternion rot) + { + Convert(ref pos, ref rot); + return (pos, rot); + } + + /// + public void ConvertBack(ref Vector3 pos) + { + pos.y = -pos.y; + } + + /// + public void ConvertBack(ref Quaternion rot) + { + rot.y = -rot.y; + rot.w = -rot.w; + } + + /// + public (Vector3 pos, Quaternion rot) ConvertedBack(Vector3 pos, Quaternion rot) + { + pos.y = -pos.y; + rot.y = -rot.y; + rot.w = -rot.w; + return (pos, rot); + } + + public Vector3 ConvertedBack(Vector3 pos) + { + pos.y = -pos.y; + return pos; + } + + /// + public Quaternion ConvertedBack(Quaternion rot) + { + rot.y = -rot.y; + rot.w = -rot.w; + return rot; + } + + /// + public void ConvertBack(ref Vector3 pos, ref Quaternion rot) + { + pos.y = -pos.y; + rot.y = -rot.y; + rot.w = -rot.w; + } + + public void Convert(ref Vector3 pos, ref Quaternion rot) + { + pos.y = -pos.y; + rot.y = -rot.y; + rot.w = -rot.w; + } + } +} \ No newline at end of file diff --git a/plugins/Protobuf/Offline/Parsers/InfoParser.cs b/plugins/Protobuf/Offline/Parsers/InfoParser.cs index 0724f418..e1442e67 100644 --- a/plugins/Protobuf/Offline/Parsers/InfoParser.cs +++ b/plugins/Protobuf/Offline/Parsers/InfoParser.cs @@ -1,4 +1,4 @@ -using Elektronik.Data.Converters; +using Elektronik.Plugins.Common; using Elektronik.Plugins.Common.Commands; using Elektronik.Plugins.Common.Parsing; using Elektronik.Protobuf.Data; diff --git a/plugins/Protobuf/Offline/Presenters/SlamDataInfoPresenter.cs b/plugins/Protobuf/Offline/Presenters/SlamDataInfoPresenter.cs index 805add62..22a8f87c 100644 --- a/plugins/Protobuf/Offline/Presenters/SlamDataInfoPresenter.cs +++ b/plugins/Protobuf/Offline/Presenters/SlamDataInfoPresenter.cs @@ -1,13 +1,12 @@ using System; using System.Collections.Generic; using System.Linq; -using Elektronik.Data.Converters; using Elektronik.Data.PackageObjects; using Elektronik.DataConsumers; using Elektronik.DataConsumers.Windows; using Elektronik.DataSources; using Elektronik.DataSources.SpecialInterfaces; -using Elektronik.Plugins.Common.DataDiff; +using Elektronik.Plugins.Common; using Elektronik.Protobuf.Data; using Elektronik.UI.Windows; @@ -33,7 +32,7 @@ public void Present(PacketPb data, ICSConverter? converter) public string DisplayName { get; set; } public IEnumerable Children { get; } = Array.Empty(); - + public void AddConsumer(IDataConsumer consumer) { if (consumer is WindowsManager factory) @@ -73,27 +72,16 @@ public void Clear() private IEnumerable Pkg2Pts(PacketPb packet, ICSConverter? converter) { - switch (packet.DataCase) + return packet.DataCase switch { - case PacketPb.DataOneofCase.Points: - foreach (var pointPb in packet.Points.Data) - { - var point = ((SlamPointDiff)pointPb).Apply(); - converter?.Convert(ref point.Position); - yield return point; - } - break; - case PacketPb.DataOneofCase.Observations: - foreach (var observationPb in packet.Observations.Data) - { - var observation = ((SlamObservationDiff)observationPb).Apply(); - converter?.Convert(ref observation.Point.Position, ref observation.Rotation); - yield return observation; - } - break; - default: - yield break; - } + PacketPb.DataOneofCase.Points => packet.ExtractPoints(converter) + .Select(d => d.Apply()) + .OfType(), + PacketPb.DataOneofCase.Observations => packet.ExtractObservations(converter, "") + .Select(d => d.Apply()) + .OfType(), + _ => Array.Empty() + }; } #endregion diff --git a/plugins/Protobuf/Offline/ProtobufFilePlayer.cs b/plugins/Protobuf/Offline/ProtobufFilePlayer.cs index 7f0d5260..7471d33c 100644 --- a/plugins/Protobuf/Offline/ProtobufFilePlayer.cs +++ b/plugins/Protobuf/Offline/ProtobufFilePlayer.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.IO; using System.Timers; -using Elektronik.Data.Converters; using Elektronik.DataSources; using Elektronik.Plugins.Common.FrameBuffers; using Elektronik.Plugins.Common.Parsing; @@ -18,8 +17,7 @@ namespace Elektronik.Protobuf.Offline { public class ProtobufFilePlayer : IRewindableDataSource, IChangingSpeed { - public ProtobufFilePlayer(string displayName, Texture2D? logo, OfflineSettingsBag settings, - ICSConverter converter) + public ProtobufFilePlayer(string displayName, Texture2D? logo, OfflineSettingsBag settings) { _containerTree = new ProtobufContainerTree("Protobuf", new SlamDataInfoPresenter("Special info")); @@ -37,8 +35,7 @@ public ProtobufFilePlayer(string displayName, Texture2D? logo, OfflineSettingsBa _containerTree.DisplayName = $"Protobuf: {Path.GetFileName(settings.PathToFile)}"; _input = File.OpenRead(settings.PathToFile); - converter.SetInitTRS(Vector3.zero, Quaternion.identity); - _parsersChain?.SetConverter(converter); + _parsersChain?.SetConverter(new ProtobufToUnityConverter()); _frames = new FramesCollection(ReadCommands, TryGetSize()); _frames.OnSizeChanged += i => OnAmountOfFramesChanged?.Invoke(i); diff --git a/plugins/Protobuf/Offline/ProtobufFilePlayerFactory.cs b/plugins/Protobuf/Offline/ProtobufFilePlayerFactory.cs index a175e306..4d45a444 100644 --- a/plugins/Protobuf/Offline/ProtobufFilePlayerFactory.cs +++ b/plugins/Protobuf/Offline/ProtobufFilePlayerFactory.cs @@ -1,5 +1,4 @@ -using Elektronik.Data.Converters; -using Elektronik.PluginsSystem; +using Elektronik.PluginsSystem; namespace Elektronik.Protobuf.Offline { @@ -20,13 +19,13 @@ public void SetFileName(string? path) public string[] SupportedExtensions { get; } = {".dat"}; - protected override IElektronikPlugin StartPlugin(OfflineSettingsBag settings, ICSConverter converter) + protected override IElektronikPlugin StartPlugin(OfflineSettingsBag settings) { if (!string.IsNullOrEmpty(_filepath)) { settings.PathToFile = _filepath!; } - return new ProtobufFilePlayer(DisplayName, Logo, settings, converter); + return new ProtobufFilePlayer(DisplayName, Logo, settings); } private string? _filepath; diff --git a/plugins/Protobuf/Online/GrpcServices/ConnectableObjectsMapManager.cs b/plugins/Protobuf/Online/GrpcServices/ConnectableObjectsMapManager.cs index 73d081a0..44e39628 100644 --- a/plugins/Protobuf/Online/GrpcServices/ConnectableObjectsMapManager.cs +++ b/plugins/Protobuf/Online/GrpcServices/ConnectableObjectsMapManager.cs @@ -2,9 +2,9 @@ using System.Diagnostics; using System.Linq; using System.Threading.Tasks; -using Elektronik.Data.Converters; using Elektronik.Data.PackageObjects; using Elektronik.DataSources.Containers; +using Elektronik.Plugins.Common; using Elektronik.Plugins.Common.Commands; using Elektronik.Plugins.Common.Commands.Generic; using Elektronik.Plugins.Common.DataDiff; diff --git a/plugins/Protobuf/Online/GrpcServices/LinesMapManager.cs b/plugins/Protobuf/Online/GrpcServices/LinesMapManager.cs index e8cb55df..59c7f9fb 100644 --- a/plugins/Protobuf/Online/GrpcServices/LinesMapManager.cs +++ b/plugins/Protobuf/Online/GrpcServices/LinesMapManager.cs @@ -1,9 +1,9 @@ using System; using System.Diagnostics; using System.Threading.Tasks; -using Elektronik.Data.Converters; using Elektronik.Data.PackageObjects; using Elektronik.DataSources.Containers; +using Elektronik.Plugins.Common; using Elektronik.Plugins.Common.DataDiff; using Elektronik.Plugins.Common.FrameBuffers; using Elektronik.Protobuf.Data; diff --git a/plugins/Protobuf/Online/GrpcServices/MapManager.cs b/plugins/Protobuf/Online/GrpcServices/MapManager.cs index 67f82613..1cfbabad 100644 --- a/plugins/Protobuf/Online/GrpcServices/MapManager.cs +++ b/plugins/Protobuf/Online/GrpcServices/MapManager.cs @@ -1,9 +1,9 @@ using System; using System.Diagnostics; using System.Threading.Tasks; -using Elektronik.Data.Converters; using Elektronik.Data.PackageObjects; using Elektronik.DataSources.Containers; +using Elektronik.Plugins.Common; using Elektronik.Plugins.Common.Commands; using Elektronik.Plugins.Common.Commands.Generic; using Elektronik.Plugins.Common.DataDiff; diff --git a/plugins/Protobuf/Online/GrpcServices/MarkersMapManager.cs b/plugins/Protobuf/Online/GrpcServices/MarkersMapManager.cs index 07ae7eda..80880eda 100644 --- a/plugins/Protobuf/Online/GrpcServices/MarkersMapManager.cs +++ b/plugins/Protobuf/Online/GrpcServices/MarkersMapManager.cs @@ -1,9 +1,9 @@ using System; using System.Diagnostics; using System.Threading.Tasks; -using Elektronik.Data.Converters; using Elektronik.Data.PackageObjects; using Elektronik.DataSources.Containers; +using Elektronik.Plugins.Common; using Elektronik.Plugins.Common.DataDiff; using Elektronik.Plugins.Common.FrameBuffers; using Elektronik.Protobuf.Data; diff --git a/plugins/Protobuf/Online/GrpcServices/ObservationsMapManager.cs b/plugins/Protobuf/Online/GrpcServices/ObservationsMapManager.cs index e5edb0c5..ee94c569 100644 --- a/plugins/Protobuf/Online/GrpcServices/ObservationsMapManager.cs +++ b/plugins/Protobuf/Online/GrpcServices/ObservationsMapManager.cs @@ -2,9 +2,9 @@ using System.Diagnostics; using System.IO; using System.Threading.Tasks; -using Elektronik.Data.Converters; using Elektronik.Data.PackageObjects; using Elektronik.DataSources.Containers; +using Elektronik.Plugins.Common; using Elektronik.Plugins.Common.DataDiff; using Elektronik.Plugins.Common.FrameBuffers; using Elektronik.Protobuf.Data; diff --git a/plugins/Protobuf/Online/GrpcServices/PlanesMapManager.cs b/plugins/Protobuf/Online/GrpcServices/PlanesMapManager.cs index 50f20417..c8a1ae6e 100644 --- a/plugins/Protobuf/Online/GrpcServices/PlanesMapManager.cs +++ b/plugins/Protobuf/Online/GrpcServices/PlanesMapManager.cs @@ -1,9 +1,9 @@ using System; using System.Diagnostics; using System.Threading.Tasks; -using Elektronik.Data.Converters; using Elektronik.Data.PackageObjects; using Elektronik.DataSources.Containers; +using Elektronik.Plugins.Common; using Elektronik.Plugins.Common.DataDiff; using Elektronik.Plugins.Common.FrameBuffers; using Elektronik.Protobuf.Data; diff --git a/plugins/Protobuf/Online/GrpcServices/PointsMapManager.cs b/plugins/Protobuf/Online/GrpcServices/PointsMapManager.cs index 56476dc1..50897729 100644 --- a/plugins/Protobuf/Online/GrpcServices/PointsMapManager.cs +++ b/plugins/Protobuf/Online/GrpcServices/PointsMapManager.cs @@ -1,9 +1,9 @@ using System; using System.Diagnostics; using System.Threading.Tasks; -using Elektronik.Data.Converters; using Elektronik.Data.PackageObjects; using Elektronik.DataSources.Containers; +using Elektronik.Plugins.Common; using Elektronik.Plugins.Common.DataDiff; using Elektronik.Plugins.Common.FrameBuffers; using Elektronik.Protobuf.Data; diff --git a/plugins/Protobuf/Online/GrpcServices/TrackedObjsMapManager.cs b/plugins/Protobuf/Online/GrpcServices/TrackedObjsMapManager.cs index d132f22c..3ac2fd56 100644 --- a/plugins/Protobuf/Online/GrpcServices/TrackedObjsMapManager.cs +++ b/plugins/Protobuf/Online/GrpcServices/TrackedObjsMapManager.cs @@ -1,9 +1,9 @@ using System; using System.Diagnostics; using System.Threading.Tasks; -using Elektronik.Data.Converters; using Elektronik.Data.PackageObjects; using Elektronik.DataSources.Containers; +using Elektronik.Plugins.Common; using Elektronik.Plugins.Common.DataDiff; using Elektronik.Plugins.Common.FrameBuffers; using Elektronik.Protobuf.Data; diff --git a/plugins/Protobuf/Online/ProtobufOnlinePlayer.cs b/plugins/Protobuf/Online/ProtobufOnlinePlayer.cs index 4a4f9380..9905c04d 100644 --- a/plugins/Protobuf/Online/ProtobufOnlinePlayer.cs +++ b/plugins/Protobuf/Online/ProtobufOnlinePlayer.cs @@ -2,8 +2,8 @@ using System.Diagnostics; using System.Threading; using System.Threading.Tasks; -using Elektronik.Data.Converters; using Elektronik.DataSources; +using Elektronik.Plugins.Common; using Elektronik.Plugins.Common.FrameBuffers; using Elektronik.Plugins.Common.Parsing; using Elektronik.PluginsSystem; @@ -21,7 +21,7 @@ namespace Elektronik.Protobuf.Online public class ProtobufOnlinePlayer : IRewindableDataSource, IChangingSpeed { public ProtobufOnlinePlayer(string displayName, Texture2D? logo, OnlineSettingsBag settings, - ICSConverter converter, ILogger? logger = null) + ILogger? logger = null) { var containerTree = new ProtobufContainerTree("Protobuf"); Data = containerTree; @@ -32,7 +32,7 @@ public ProtobufOnlinePlayer(string displayName, Texture2D? logo, OnlineSettingsB AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2Support", true); GrpcEnvironment.SetLogger(_logger); - converter.SetInitTRS(Vector3.zero, Quaternion.identity); + var converter = new ProtobufToUnityConverter(); _services = new IChainable[] { diff --git a/plugins/Protobuf/Online/ProtobufOnlinePlayerFactory.cs b/plugins/Protobuf/Online/ProtobufOnlinePlayerFactory.cs index e28de796..6c9d2257 100644 --- a/plugins/Protobuf/Online/ProtobufOnlinePlayerFactory.cs +++ b/plugins/Protobuf/Online/ProtobufOnlinePlayerFactory.cs @@ -1,5 +1,4 @@ -using Elektronik.Data.Converters; -using Elektronik.PluginsSystem; +using Elektronik.PluginsSystem; using Grpc.Core.Logging; namespace Elektronik.Protobuf.Online @@ -7,9 +6,9 @@ namespace Elektronik.Protobuf.Online public class ProtobufOnlinePlayerFactory : ElektronikPluginsFactoryBase, IDataSourcePluginsFactory { - protected override IElektronikPlugin StartPlugin(OnlineSettingsBag settings, ICSConverter converter) + protected override IElektronikPlugin StartPlugin(OnlineSettingsBag settings) { - return new ProtobufOnlinePlayer(DisplayName, Logo, settings, converter, Logger); + return new ProtobufOnlinePlayer(DisplayName, Logo, settings, Logger); } public ILogger? Logger; diff --git a/plugins/Protobuf/Recorders/EventArgsToProtobufExt.cs b/plugins/Protobuf/Recorders/EventArgsToProtobufExt.cs index 4d39b534..cdf3ec23 100644 --- a/plugins/Protobuf/Recorders/EventArgsToProtobufExt.cs +++ b/plugins/Protobuf/Recorders/EventArgsToProtobufExt.cs @@ -1,7 +1,7 @@ using System.Linq; -using Elektronik.Data.Converters; using Elektronik.Data.PackageObjects; using Elektronik.DataSources.Containers.EventArgs; +using Elektronik.Plugins.Common; using Elektronik.Protobuf.Data; namespace Elektronik.Protobuf.Recorders diff --git a/plugins/Protobuf/Recorders/ProtobufRecorder.cs b/plugins/Protobuf/Recorders/ProtobufRecorder.cs index a50c33e2..fa6b3f40 100644 --- a/plugins/Protobuf/Recorders/ProtobufRecorder.cs +++ b/plugins/Protobuf/Recorders/ProtobufRecorder.cs @@ -1,9 +1,10 @@ using System; using System.IO; -using Elektronik.Data.Converters; using Elektronik.Data.PackageObjects; using Elektronik.DataSources.Containers.EventArgs; +using Elektronik.Plugins.Common; using Elektronik.PluginsSystem; +using Elektronik.Protobuf.Data; using Google.Protobuf; namespace Elektronik.Protobuf.Recorders @@ -12,7 +13,7 @@ public class ProtobufRecorder : FileRecorderPluginBase { public const uint Marker = 0xDEADBEEF; - public ProtobufRecorder(string filename, ICSConverter converter) : base(filename, converter) + public ProtobufRecorder(string filename) : base(filename) { _file = File.OpenWrite(filename); } @@ -22,7 +23,7 @@ public override void OnItemsAdded(object sender, AddedEventArgs e) if (IsDisposed) return; lock (_file) { - e.ToProtobuf(Converter).WriteDelimitedTo(_file); + e.ToProtobuf(_converter).WriteDelimitedTo(_file); _amountOfPackets++; } } @@ -32,7 +33,7 @@ public override void OnItemsUpdated(object sender, UpdatedEventArgs e if (IsDisposed) return; lock (_file) { - e.ToProtobuf(Converter).WriteDelimitedTo(_file); + e.ToProtobuf(_converter).WriteDelimitedTo(_file); _amountOfPackets++; } } @@ -52,7 +53,7 @@ public override void OnItemsAdded(object sender, AddedEventArgs e) if (IsDisposed) return; lock (_file) { - e.ToProtobuf(Converter).WriteDelimitedTo(_file); + e.ToProtobuf(_converter).WriteDelimitedTo(_file); _amountOfPackets++; } } @@ -62,7 +63,7 @@ public override void OnItemsUpdated(object sender, UpdatedEventArgs e) if (IsDisposed) return; lock (_file) { - e.ToProtobuf(Converter).WriteDelimitedTo(_file); + e.ToProtobuf(_converter).WriteDelimitedTo(_file); _amountOfPackets++; } } @@ -97,7 +98,7 @@ public override void OnItemsAdded(object sender, AddedEventArgs if (IsDisposed) return; lock (_file) { - e.ToProtobuf(Converter).WriteDelimitedTo(_file); + e.ToProtobuf(_converter).WriteDelimitedTo(_file); _amountOfPackets++; } } @@ -107,7 +108,7 @@ public override void OnItemsUpdated(object sender, UpdatedEventArgs e) if (IsDisposed) return; lock (_file) { - e.ToProtobuf(Converter).WriteDelimitedTo(_file); + e.ToProtobuf(_converter).WriteDelimitedTo(_file); _amountOfPackets++; } } @@ -167,7 +168,7 @@ public override void OnItemsUpdated(object sender, UpdatedEventArgs e if (IsDisposed) return; lock (_file) { - e.ToProtobuf(Converter).WriteDelimitedTo(_file); + e.ToProtobuf(_converter).WriteDelimitedTo(_file); _amountOfPackets++; } } @@ -197,6 +198,7 @@ public override void Dispose() private readonly FileStream _file; private int _amountOfPackets = 0; + private readonly ICSConverter _converter = new ProtobufToUnityConverter(); #endregion } diff --git a/plugins/Protobuf/Recorders/ProtobufRecorderFactory.cs b/plugins/Protobuf/Recorders/ProtobufRecorderFactory.cs index a4555586..b44c91b1 100644 --- a/plugins/Protobuf/Recorders/ProtobufRecorderFactory.cs +++ b/plugins/Protobuf/Recorders/ProtobufRecorderFactory.cs @@ -1,5 +1,4 @@ -using Elektronik.Data.Converters; -using Elektronik.PluginsSystem; +using Elektronik.PluginsSystem; using Elektronik.Settings; using UnityEngine; @@ -7,9 +6,9 @@ namespace Elektronik.Protobuf.Recorders { public class ProtobufRecorderFactory : IFileRecorderPluginsFactory { - public IElektronikPlugin Start(ICSConverter converter) + public IElektronikPlugin Start() { - return new ProtobufRecorder(Filename, converter); + return new ProtobufRecorder(Filename); } public Texture2D? Logo { get; set; } diff --git a/plugins/Protobuf/Recorders/ProtobufRetranslator.cs b/plugins/Protobuf/Recorders/ProtobufRetranslator.cs index 2b45c6b4..96f846ba 100644 --- a/plugins/Protobuf/Recorders/ProtobufRetranslator.cs +++ b/plugins/Protobuf/Recorders/ProtobufRetranslator.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; using System.Linq; -using Elektronik.Data.Converters; using Elektronik.Data.PackageObjects; using Elektronik.DataSources.Containers.EventArgs; +using Elektronik.Plugins.Common; using Elektronik.PluginsSystem; using Elektronik.Protobuf.Data; using Elektronik.Settings; @@ -14,9 +14,8 @@ namespace Elektronik.Protobuf.Recorders { public class ProtobufRetranslator : DataRecorderPluginBase { - public ProtobufRetranslator(string displayName, Texture2D? logo, ICSConverter? converter) + public ProtobufRetranslator(string displayName, Texture2D? logo) { - _converter = converter; DisplayName = displayName; Logo = logo; AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); @@ -137,7 +136,7 @@ public override void OnItemsRemoved(object sender, RemovedEventArgs e public override SettingsBag Settings => _typedSettings; public override Texture2D? Logo { get; } - private readonly ICSConverter? _converter; + private readonly ICSConverter _converter = new ProtobufToUnityConverter(); #endregion diff --git a/plugins/Protobuf/Recorders/ProtobufRetranslatorFactory.cs b/plugins/Protobuf/Recorders/ProtobufRetranslatorFactory.cs index effd3cda..acb6f109 100644 --- a/plugins/Protobuf/Recorders/ProtobufRetranslatorFactory.cs +++ b/plugins/Protobuf/Recorders/ProtobufRetranslatorFactory.cs @@ -1,14 +1,13 @@ -using Elektronik.Data.Converters; -using Elektronik.PluginsSystem; +using Elektronik.PluginsSystem; using Elektronik.Settings; namespace Elektronik.Protobuf.Recorders { public class ProtobufRetranslatorFactory : ElektronikPluginsFactoryBase, ICustomRecorderPluginsFactory { - protected override IElektronikPlugin StartPlugin(SettingsBag settings, ICSConverter converter) + protected override IElektronikPlugin StartPlugin(SettingsBag settings) { - return new ProtobufRetranslator(DisplayName, Logo, converter); + return new ProtobufRetranslator(DisplayName, Logo); } public override string DisplayName => "Protobuf retranslator"; diff --git a/plugins/Ros/Common/RosConverter.cs b/plugins/Ros/Common/RosConverter.cs index e39bdf0a..b2472dc5 100644 --- a/plugins/Ros/Common/RosConverter.cs +++ b/plugins/Ros/Common/RosConverter.cs @@ -1,57 +1,77 @@ -using Elektronik.Data.Converters; +using Elektronik.Plugins.Common; using UnityEngine; namespace Elektronik.RosPlugin.Common { public class RosConverter : ICSConverter { - private Vector3 _scale = Vector3.one; - - public void SetInitTRS(Vector3 pos, Quaternion rot) => SetInitTRS(pos, rot, Vector3.one); - - public void SetInitTRS(Vector3 pos, Quaternion rot, Vector3 scale) - { - _scale = scale; - } - + /// public void Convert(ref Vector3 pos, ref Quaternion rot) { Convert(ref pos); } + /// public void Convert(ref Vector3 pos) { - pos.x *= _scale.x; - var tmp = pos.y; - pos.y = pos.z * _scale.y; - pos.z = tmp * _scale.z; + (pos.y, pos.z) = (pos.z, pos.y); + } + + /// + public void Convert(ref Quaternion rot) + { + // Do nothing } - public Vector3 Convert(Vector3 pos) + /// + public Vector3 Converted(Vector3 pos) { Convert(ref pos); return pos; } - public Quaternion Convert(Quaternion rot) + /// + public Quaternion Converted(Quaternion rot) { return rot; } - public (Vector3 pos, Quaternion rot) Convert(Vector3 pos, Quaternion rot) + /// + public (Vector3 pos, Quaternion rot) Converted(Vector3 pos, Quaternion rot) { Convert(ref pos, ref rot); return (pos, rot); } + /// public void ConvertBack(ref Vector3 pos) { - pos.x /= _scale.x; - var tmp = pos.y; - pos.y = pos.z / _scale.y; - pos.z = tmp / _scale.z; + (pos.y, pos.z) = (pos.z, pos.y); + } + + void ICSConverter.ConvertBack(ref Quaternion rot) + { + // Do nothing + } + + public (Vector3 pos, Quaternion rot) ConvertedBack(Vector3 pos, Quaternion rot) + { + (pos.y, pos.z) = (pos.z, pos.y); + return (pos, rot); + } + + public Vector3 ConvertedBack(Vector3 pos) + { + (pos.y, pos.z) = (pos.z, pos.y); + return pos; + } + + public Quaternion ConvertedBack(Quaternion rot) + { + return rot; } + /// public void ConvertBack(ref Vector3 pos, ref Quaternion rot) { ConvertBack(ref pos); diff --git a/plugins/Ros/Common/RosMessages/RosMessageConvertExtender.cs b/plugins/Ros/Common/RosMessages/RosMessageConvertExtender.cs index 151849a7..c84ed3a0 100644 --- a/plugins/Ros/Common/RosMessages/RosMessageConvertExtender.cs +++ b/plugins/Ros/Common/RosMessages/RosMessageConvertExtender.cs @@ -3,8 +3,8 @@ using System.Globalization; using System.Linq; using System.Text; -using Elektronik.Data.Converters; using Elektronik.Data.PackageObjects; +using Elektronik.Plugins.Common; using RosSharp.RosBridgeClient.MessageTypes.Geometry; using RosSharp.RosBridgeClient.MessageTypes.Nav; using RosSharp.RosBridgeClient.MessageTypes.Sensor; diff --git a/plugins/Ros/Ros/Bag/RosbagReader.cs b/plugins/Ros/Ros/Bag/RosbagReader.cs index 84214e20..321e6a79 100644 --- a/plugins/Ros/Ros/Bag/RosbagReader.cs +++ b/plugins/Ros/Ros/Bag/RosbagReader.cs @@ -28,7 +28,6 @@ public RosbagReader(string displayName, Texture2D? logo, RosbagSettings settings _frames = new FramesAsyncCollection(() => ReadNext(actualConnections)); _frames.OnCurrentSizeChanged += i => OnAmountOfFramesChanged?.Invoke(i); var converter = new RosConverter(); - converter.SetInitTRS(Vector3.zero, Quaternion.identity); RosMessageConvertExtender.Converter = converter; _threadWorker = new ThreadQueueWorker(); } diff --git a/plugins/Ros/Ros/Bag/RosbagReaderFactory.cs b/plugins/Ros/Ros/Bag/RosbagReaderFactory.cs index 999b8006..12a039ca 100644 --- a/plugins/Ros/Ros/Bag/RosbagReaderFactory.cs +++ b/plugins/Ros/Ros/Bag/RosbagReaderFactory.cs @@ -1,11 +1,10 @@ -using Elektronik.Data.Converters; -using Elektronik.PluginsSystem; +using Elektronik.PluginsSystem; namespace Elektronik.RosPlugin.Ros.Bag { public class RosbagReaderFactory: ElektronikPluginsFactoryBase, IDataSourcePluginsFactory { - protected override IElektronikPlugin StartPlugin(RosbagSettings settings, ICSConverter converter) + protected override IElektronikPlugin StartPlugin(RosbagSettings settings) { return new RosbagReader(DisplayName, Logo, settings); } diff --git a/plugins/Ros/Ros/Online/Ros1Client.cs b/plugins/Ros/Ros/Online/Ros1Client.cs index 724c4a3b..a8d2ab7a 100644 --- a/plugins/Ros/Ros/Online/Ros1Client.cs +++ b/plugins/Ros/Ros/Online/Ros1Client.cs @@ -17,7 +17,6 @@ public Ros1Client(string displayName, Texture2D? logo, Ros1Settings settings) _container = new RosOnlineContainerTree(settings, "TMP"); Data = _container; var converter = new RosConverter(); - converter.SetInitTRS(Vector3.zero, Quaternion.identity); RosMessageConvertExtender.Converter = converter; } diff --git a/plugins/Ros/Ros/Online/Ros1CLientFactory.cs b/plugins/Ros/Ros/Online/Ros1ClientFactory.cs similarity index 87% rename from plugins/Ros/Ros/Online/Ros1CLientFactory.cs rename to plugins/Ros/Ros/Online/Ros1ClientFactory.cs index 4a940593..37816f54 100644 --- a/plugins/Ros/Ros/Online/Ros1CLientFactory.cs +++ b/plugins/Ros/Ros/Online/Ros1ClientFactory.cs @@ -1,11 +1,10 @@ -using Elektronik.Data.Converters; -using Elektronik.PluginsSystem; +using Elektronik.PluginsSystem; namespace Elektronik.RosPlugin.Ros.Online { public class Ros1ClientFactory: ElektronikPluginsFactoryBase, IDataSourcePluginsFactory { - protected override IElektronikPlugin StartPlugin(Ros1Settings settings, ICSConverter converter) + protected override IElektronikPlugin StartPlugin(Ros1Settings settings) { return new Ros1Client(DisplayName, Logo, settings); } diff --git a/plugins/Ros/Ros2/Bag/Ros2ReaderFactory.cs b/plugins/Ros/Ros2/Bag/Ros2ReaderFactory.cs index 5b18a9f9..fc1e76cf 100644 --- a/plugins/Ros/Ros2/Bag/Ros2ReaderFactory.cs +++ b/plugins/Ros/Ros2/Bag/Ros2ReaderFactory.cs @@ -1,11 +1,10 @@ -using Elektronik.Data.Converters; -using Elektronik.PluginsSystem; +using Elektronik.PluginsSystem; namespace Elektronik.RosPlugin.Ros2.Bag { public class Ros2ReaderFactory: ElektronikPluginsFactoryBase, IDataSourcePluginsFactory { - protected override IElektronikPlugin StartPlugin(Rosbag2Settings settings, ICSConverter converter) + protected override IElektronikPlugin StartPlugin(Rosbag2Settings settings) { return new Rosbag2Reader(DisplayName, Logo, settings); } diff --git a/plugins/Ros/Ros2/Bag/Rosbag2Reader.cs b/plugins/Ros/Ros2/Bag/Rosbag2Reader.cs index b5838c73..5b81d86a 100644 --- a/plugins/Ros/Ros2/Bag/Rosbag2Reader.cs +++ b/plugins/Ros/Ros2/Bag/Rosbag2Reader.cs @@ -27,7 +27,6 @@ public Rosbag2Reader(string displayName, Texture2D? logo, Rosbag2Settings settin .ToArray(); var converter = new RosConverter(); - converter.SetInitTRS(Vector3.zero, Quaternion.identity); RosMessageConvertExtender.Converter = converter; } diff --git a/plugins/Ros/Ros2/Online/Ros2Client.cs b/plugins/Ros/Ros2/Online/Ros2Client.cs index 84487ac0..d81a1908 100644 --- a/plugins/Ros/Ros2/Online/Ros2Client.cs +++ b/plugins/Ros/Ros2/Online/Ros2Client.cs @@ -17,7 +17,6 @@ public Ros2Client(string displayName, Texture2D? logo, Ros2Settings settings) _container = new Ros2OnlineContainerTree(settings, "TMP"); Data = _container; var converter = new RosConverter(); - converter.SetInitTRS(Vector3.zero, Quaternion.identity); RosMessageConvertExtender.Converter = converter; } diff --git a/plugins/Ros/Ros2/Online/Ros2ClientFactory.cs b/plugins/Ros/Ros2/Online/Ros2ClientFactory.cs index e2a48d40..cefbadb5 100644 --- a/plugins/Ros/Ros2/Online/Ros2ClientFactory.cs +++ b/plugins/Ros/Ros2/Online/Ros2ClientFactory.cs @@ -1,11 +1,10 @@ -using Elektronik.Data.Converters; -using Elektronik.PluginsSystem; +using Elektronik.PluginsSystem; namespace Elektronik.RosPlugin.Ros2.Online { public class Ros2ClientFactory : ElektronikPluginsFactoryBase, IDataSourcePluginsFactory { - protected override IElektronikPlugin StartPlugin(Ros2Settings settings, ICSConverter converter) + protected override IElektronikPlugin StartPlugin(Ros2Settings settings) { return new Ros2Client(DisplayName, Logo, settings); } From 50d55f2c350c065297db47252d0e338f3ccb22f8 Mon Sep 17 00:00:00 2001 From: Pavel Krasnov Date: Tue, 26 Oct 2021 16:15:02 +0300 Subject: [PATCH 03/10] Shaders unification --- Assets/Shaders/ComputeShaders.cginc | 15 ++++++++ Assets/Shaders/ComputeShaders.cginc.meta | 3 ++ Assets/Shaders/CrystalCloudShader.shader | 18 ++++------ Assets/Shaders/CubeCloudShader.shader | 2 +- Assets/Shaders/LineCloudShader.shader | 27 ++++---------- Assets/Shaders/Markers.cginc | 4 +-- Assets/Shaders/MeshShaderLit.shader | 36 +++++-------------- Assets/Shaders/MeshShaderTransparent.shader | 20 ++--------- Assets/Shaders/MeshShaderUnlit.shader | 34 ++++-------------- Assets/Shaders/ObservationCloudShader.shader | 33 ++++++++--------- Assets/Shaders/PlaneCloudShader.shader | 20 ++--------- Assets/Shaders/PointCloudShader.shader | 27 ++++---------- .../Shaders/TransparentCubeCloudShader.shader | 2 +- Assets/Shaders/TransparentSphere.shader | 12 +++---- Assets/Shaders/Wireframe.cginc | 12 +++++++ Assets/Shaders/Wireframe.cginc.meta | 3 ++ Assets/Shaders/WireframeShader.shader | 10 ++---- Packages/manifest.json | 4 +-- 18 files changed, 101 insertions(+), 181 deletions(-) create mode 100644 Assets/Shaders/ComputeShaders.cginc create mode 100644 Assets/Shaders/ComputeShaders.cginc.meta create mode 100644 Assets/Shaders/Wireframe.cginc create mode 100644 Assets/Shaders/Wireframe.cginc.meta diff --git a/Assets/Shaders/ComputeShaders.cginc b/Assets/Shaders/ComputeShaders.cginc new file mode 100644 index 00000000..05208941 --- /dev/null +++ b/Assets/Shaders/ComputeShaders.cginc @@ -0,0 +1,15 @@ +#define MAX_BRIGHTNESS 16 + +struct VertexInput +{ + uint vertex_id : SV_VertexID; +}; + +half3 decode_color(uint data) +{ + const half r = (data) & 0xff; + const half g = (data >> 8) & 0xff; + const half b = (data >> 16) & 0xff; + const half a = (data >> 24) & 0xff; + return half3(r, g, b) * a * MAX_BRIGHTNESS / (255 * 255); +} diff --git a/Assets/Shaders/ComputeShaders.cginc.meta b/Assets/Shaders/ComputeShaders.cginc.meta new file mode 100644 index 00000000..347c4893 --- /dev/null +++ b/Assets/Shaders/ComputeShaders.cginc.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 07c01a32f85a430bb59ce52333cf8cf4 +timeCreated: 1635252163 \ No newline at end of file diff --git a/Assets/Shaders/CrystalCloudShader.shader b/Assets/Shaders/CrystalCloudShader.shader index e0d8d8f0..ed32014c 100644 --- a/Assets/Shaders/CrystalCloudShader.shader +++ b/Assets/Shaders/CrystalCloudShader.shader @@ -26,12 +26,13 @@ #pragma multi_compile _ _COMPUTE_BUFFER #include "Markers.cginc" + #include "Wireframe.cginc" struct FragmentInput { float4 position : SV_POSITION; - half3 color : COLOR0; - half2 barys: TEXCOORD5; + float4 color : COLOR0; + BARYCENTRIC_COORDINATES }; #define VERTEX_COUNT 24 @@ -75,8 +76,8 @@ FragmentInput o; const float3 pos = mul(transform, float4(points[indexes[i]] * scale * 0.5, 1)); o.position = UnityObjectToClipPos(pos * _Scale); - o.color = input[0].color; - o.barys = bary[i % 3]; + o.color = float4(input[0].color, 1); + o.barycentricCoordinates = bary[i % 3]; stream.Append(o); if (i % 3 == 2) stream.RestartStrip(); } @@ -84,14 +85,7 @@ half3 Fragment(FragmentInput input) : SV_Target { - float3 barys; - barys.xy = input.barys; - barys.z = 1 - barys.x - barys.y; - float min_bary = min(barys.x, min(barys.y, barys.z)); - const float delta = fwidth(min_bary); - min_bary = smoothstep(0.5 * delta, 1.5 * delta, min_bary); - - return input.color * 0.7 * min_bary + input.color * (1 - min_bary); + return Wireframe(input.barycentricCoordinates, input.color * 0.7, input.color); } ENDCG } diff --git a/Assets/Shaders/CubeCloudShader.shader b/Assets/Shaders/CubeCloudShader.shader index 901fc1a5..aa21ca1c 100644 --- a/Assets/Shaders/CubeCloudShader.shader +++ b/Assets/Shaders/CubeCloudShader.shader @@ -23,7 +23,7 @@ #pragma geometry CubeGeometryProgram #pragma fragment Fragment #pragma multi_compile _ _COMPUTE_BUFFER - + #include "Cube.cginc" half3 Fragment(FragmentInput input) : SV_Target diff --git a/Assets/Shaders/LineCloudShader.shader b/Assets/Shaders/LineCloudShader.shader index b95f54d1..ae55d0e8 100644 --- a/Assets/Shaders/LineCloudShader.shader +++ b/Assets/Shaders/LineCloudShader.shader @@ -10,7 +10,7 @@ Shader "Elektronik/LineCloudShader" Tags { "RenderType"="Transparent" - "Queue"="Transparent" + "Queue"="Transparent" } Blend SrcAlpha OneMinusSrcAlpha Cull Off @@ -26,27 +26,13 @@ Shader "Elektronik/LineCloudShader" #pragma vertex Vertex alpha #pragma fragment Fragment alpha #pragma multi_compile _ _COMPUTE_BUFFER - + #include "UnityCG.cginc" - #define MAX_BRIGHTNESS 16 + #include "ComputeShaders.cginc" half _Alpha; half _Scale; StructuredBuffer _ItemsBuffer; - - half3 DecodeColor(uint data) - { - half r = (data ) & 0xff; - half g = (data >> 8) & 0xff; - half b = (data >> 16) & 0xff; - half a = (data >> 24) & 0xff; - return half3(r, g, b) * a * MAX_BRIGHTNESS / (255 * 255); - } - - struct VertexInput - { - uint vertexID : SV_VertexID; - }; struct VertexOutput { @@ -57,9 +43,9 @@ Shader "Elektronik/LineCloudShader" VertexOutput Vertex(VertexInput input) { VertexOutput o; - float4 pt = _ItemsBuffer[input.vertexID]; + float4 pt = _ItemsBuffer[input.vertex_id]; o.position = UnityObjectToClipPos(float4(pt.xyz * _Scale, 1)); - o.color = DecodeColor(asuint(pt.w)); + o.color = decode_color(asuint(pt.w)); return o; } @@ -67,8 +53,7 @@ Shader "Elektronik/LineCloudShader" { return half4(input.color, _Alpha); } - ENDCG } } -} +} \ No newline at end of file diff --git a/Assets/Shaders/Markers.cginc b/Assets/Shaders/Markers.cginc index 35475986..079913ea 100644 --- a/Assets/Shaders/Markers.cginc +++ b/Assets/Shaders/Markers.cginc @@ -14,7 +14,7 @@ struct Marker float3 scale: TEXCOORD7; half3 color : COLOR1; }; - + bool IsInvalid(const in float3 f) { return f[0] == 0 && f[1] == 0 && f[2] == 0; @@ -27,4 +27,4 @@ Marker MarkerVertexProgram(VertexInput input) o.scale = _ScalesBuffer[input.vertexID]; o.color = _ColorsBuffer[input.vertexID].rgb; return o; -} \ No newline at end of file +} diff --git a/Assets/Shaders/MeshShaderLit.shader b/Assets/Shaders/MeshShaderLit.shader index 403e5827..70d4c901 100644 --- a/Assets/Shaders/MeshShaderLit.shader +++ b/Assets/Shaders/MeshShaderLit.shader @@ -2,7 +2,7 @@ Shader "Elektronik/MeshShaderLit" { Properties { - _Color ("Color", Color) = (1, 1, 1, 1) + _Color ("Color", Color) = (1, 1, 1, 1) _Smoothness ("Smoothness", Range(0, 1)) = 0.9 [Gamma] _Metallic ("Metallic", Range(0, 1)) = 0 _Scale("Scale", Float) = 1 @@ -41,30 +41,18 @@ Shader "Elektronik/MeshShaderLit" float _Metallic; float _Smoothness; half3 _Color; - #define MAX_BRIGHTNESS 16 - struct VertexInput - { - uint vertex_id : SV_VertexID; - }; + #include "Wireframe.cginc" + #include "ComputeShaders.cginc" struct VertexOutput { float4 position : SV_POSITION; float3 world_pos : TEXTCOORD1; half3 normal : TEXTCOORD0; - float2 bary_coord: TEXTCOORD2; + BARYCENTRIC_COORDINATES }; - half3 decode_color(uint data) - { - half r = (data) & 0xff; - half g = (data >> 8) & 0xff; - half b = (data >> 16) & 0xff; - half a = (data >> 24) & 0xff; - return half3(r, g, b) * a * MAX_BRIGHTNESS / (255 * 255); - } - VertexOutput vertex_shader(const VertexInput input) { VertexOutput o; @@ -72,7 +60,7 @@ Shader "Elektronik/MeshShaderLit" o.world_pos = pt.xyz * _Scale; o.position = UnityObjectToClipPos(float4(o.world_pos, 1)); o.normal = float3(0, 0, 0); - o.bary_coord = float2(0, 0); + o.barycentricCoordinates = float2(0, 0); return o; } @@ -86,8 +74,8 @@ Shader "Elektronik/MeshShaderLit" i[0].normal = UnityObjectToWorldNormal(triangle_normal); i[1].normal = UnityObjectToWorldNormal(triangle_normal); i[2].normal = UnityObjectToWorldNormal(triangle_normal); - i[0].bary_coord = float2(1, 0); - i[1].bary_coord = float2(0, 1); + i[0].barycentricCoordinates = float2(1, 0); + i[1].barycentricCoordinates = float2(0, 1); stream.Append(i[0]); stream.Append(i[1]); stream.Append(i[2]); @@ -114,20 +102,14 @@ Shader "Elektronik/MeshShaderLit" indirect_light.diffuse = 0.1; indirect_light.specular = 0.1; - float3 color = UNITY_BRDF_PBS( + const float4 color = UNITY_BRDF_PBS( albedo, specular_tint, one_minus_reflectivity, _Smoothness, i.normal, view_dir, light, indirect_light ); - float3 barys; - barys.xy = i.bary_coord; - barys.z = 1 - barys.x - barys.y; - float min_bary = min(barys.x, min(barys.y, barys.z)); - const float delta = fwidth(min_bary); - min_bary = smoothstep(0.5 * delta, 1.5 * delta, min_bary); - return color * min_bary; + return Wireframe(i.barycentricCoordinates, color, float4(0, 0, 0, 1)); } ENDCG } diff --git a/Assets/Shaders/MeshShaderTransparent.shader b/Assets/Shaders/MeshShaderTransparent.shader index 4b05e575..9531bdbe 100644 --- a/Assets/Shaders/MeshShaderTransparent.shader +++ b/Assets/Shaders/MeshShaderTransparent.shader @@ -28,16 +28,11 @@ Shader "Elektronik/MeshShaderUnlit" #pragma multi_compile _ _COMPUTE_BUFFER #include "UnityCG.cginc" - + #include "ComputeShaders.cginc" + half _Scale; StructuredBuffer _VertsBuffer; StructuredBuffer _NormalsBuffer; - #define MAX_BRIGHTNESS 16 - - struct VertexInput - { - uint vertex_id : SV_VertexID; - }; struct VertexOutput { @@ -46,15 +41,6 @@ Shader "Elektronik/MeshShaderUnlit" half3 color: COLOR; }; - half3 decode_color(uint data) - { - const half r = (data) & 0xff; - const half g = (data >> 8) & 0xff; - const half b = (data >> 16) & 0xff; - const half a = (data >> 24) & 0xff; - return half3(r, g, b) * a * MAX_BRIGHTNESS / (255 * 255); - } - VertexOutput vertex_shader(const VertexInput input) { VertexOutput o; @@ -85,7 +71,7 @@ Shader "Elektronik/MeshShaderUnlit" min_bary = smoothstep(0.5 * delta, 1.5 * delta, min_bary); clip(0.5 - min_bary); - + return i.color * min_bary; } ENDCG diff --git a/Assets/Shaders/MeshShaderUnlit.shader b/Assets/Shaders/MeshShaderUnlit.shader index 45ae71fd..37427673 100644 --- a/Assets/Shaders/MeshShaderUnlit.shader +++ b/Assets/Shaders/MeshShaderUnlit.shader @@ -28,39 +28,26 @@ Shader "Elektronik/MeshShaderTransparent" #pragma multi_compile _ _COMPUTE_BUFFER #include "UnityCG.cginc" + #include "ComputeShaders.cginc" + #include "Wireframe.cginc" half _Scale; StructuredBuffer _VertsBuffer; StructuredBuffer _NormalsBuffer; - #define MAX_BRIGHTNESS 16 - - struct VertexInput - { - uint vertex_id : SV_VertexID; - }; struct VertexOutput { float4 position : SV_POSITION; - float2 bary_coord: TEXTCOORD2; half3 color: COLOR; + BARYCENTRIC_COORDINATES }; - half3 decode_color(uint data) - { - const half r = (data) & 0xff; - const half g = (data >> 8) & 0xff; - const half b = (data >> 16) & 0xff; - const half a = (data >> 24) & 0xff; - return half3(r, g, b) * a * MAX_BRIGHTNESS / (255 * 255); - } - VertexOutput vertex_shader(const VertexInput input) { VertexOutput o; float4 pt = _VertsBuffer[input.vertex_id]; o.position = UnityObjectToClipPos(float4(pt.xyz * _Scale, 1)); - o.bary_coord = float2(0, 0); + o.barycentricCoordinates = float2(0, 0); o.color = decode_color(asuint(pt.w)); return o; } @@ -68,8 +55,8 @@ Shader "Elektronik/MeshShaderTransparent" [maxvertexcount(3)] void geometry_shader(triangle VertexOutput i[3], inout TriangleStream stream) { - i[0].bary_coord = float2(1, 0); - i[1].bary_coord = float2(0, 1); + i[0].barycentricCoordinates = float2(1, 0); + i[1].barycentricCoordinates = float2(0, 1); stream.Append(i[0]); stream.Append(i[1]); stream.Append(i[2]); @@ -77,14 +64,7 @@ Shader "Elektronik/MeshShaderTransparent" half3 fragment_shader(VertexOutput i) : SV_Target { - float3 barys; - barys.xy = i.bary_coord; - barys.z = 1 - barys.x - barys.y; - float min_bary = min(barys.x, min(barys.y, barys.z)); - const float delta = fwidth(min_bary); - min_bary = smoothstep(0.5 * delta, 1.5 * delta, min_bary); - - return i.color * min_bary; + return Wireframe(i.barycentricCoordinates, float4(i.color, 0), float4(0, 0, 0, 0)); } ENDCG } diff --git a/Assets/Shaders/ObservationCloudShader.shader b/Assets/Shaders/ObservationCloudShader.shader index f8ae0cd3..28ce129c 100644 --- a/Assets/Shaders/ObservationCloudShader.shader +++ b/Assets/Shaders/ObservationCloudShader.shader @@ -30,6 +30,7 @@ #define INTERNAL_SCALE 0.1 #include "UnityCG.cginc" + #include "Wireframe.cginc" half _Scale; half _Size; @@ -50,8 +51,8 @@ struct VertexOutput { float4 position : SV_POSITION; - half3 color : COLOR0; - half2 barycentricCoords: TEXCOORD9; + float4 color : COLOR0; + BARYCENTRIC_COORDINATES }; Observation Vertex(VertexInput input) @@ -74,9 +75,9 @@ void Geometry(point Observation input[1], inout TriangleStream stream) { const float4x4 transform = input[0].transform; - + if (IsInvalid(transform)) return; - + const float3 points[5] = { float3(0, 0, -1) * _Size, float3(0.707, 0.707, 1 / 3.0) * _Size, @@ -84,13 +85,13 @@ float3(-0.707, -0.707, 1 / 3.0) * _Size, float3(-0.707, 0.707, 1 / 3.0) * _Size }; - + const half2 bary[3] = { half2(0, 0), half2(0, 1), half2(1, 0), }; - + const uint indexes[VERTEX_COUNT] = { 0, 1, 2, 0, 2, 3, @@ -100,7 +101,8 @@ 3, 1, 4 }; - const float4 T = float4(transform[0][3] * _Scale, transform[1][3] * _Scale, transform[2][3] * _Scale, 1); + const float4 T = float4(transform[0][3] * _Scale, transform[1][3] * _Scale, transform[2][3] * _Scale, + 1); const float4x4 RS = float4x4( transform[0][0], transform[0][1], transform[0][2], 0, @@ -108,28 +110,21 @@ transform[2][0], transform[2][1], transform[2][2], 0, transform[3][0], transform[3][1], transform[3][2], 1 ); - + for (uint i = 0; i < VERTEX_COUNT; i++) { VertexOutput o; const float3 pos = mul(RS, float4(points[indexes[i]] * INTERNAL_SCALE, 1)); o.position = UnityObjectToClipPos(pos + T); - o.barycentricCoords = bary[i % 3]; - o.color = input[0].color; + o.barycentricCoordinates = bary[i % 3]; + o.color = float4(input[0].color, 0); stream.Append(o); } } - half3 Fragment(VertexOutput input) : SV_Target + half3 Fragment(const VertexOutput input) : SV_Target { - float3 barys; - barys.xy = input.barycentricCoords; - barys.z = 1 - barys.x - barys.y; - float minBary = min(barys.x, min(barys.y, barys.z)); - float delta = abs(ddx(minBary)) + abs(ddy(minBary)); - minBary = smoothstep(0, delta, minBary); - minBary = clamp(minBary*2, 0.7, 1); - return input.color * minBary + (1 - input.color) * (1 - minBary); + return Wireframe(input.barycentricCoordinates, input.color, input.color * 0.7); } ENDCG } diff --git a/Assets/Shaders/PlaneCloudShader.shader b/Assets/Shaders/PlaneCloudShader.shader index 74a9571c..88dc0454 100644 --- a/Assets/Shaders/PlaneCloudShader.shader +++ b/Assets/Shaders/PlaneCloudShader.shader @@ -26,26 +26,12 @@ Shader "Elektronik/PlaneCloudShader" #pragma multi_compile _ _COMPUTE_BUFFER #include "UnityCG.cginc" - #define MAX_BRIGHTNESS 16 + #include "ComputeShaders.cginc" half _Scale; half _Size; StructuredBuffer _VertsBuffer; - half3 DecodeColor(uint data) - { - half r = (data) & 0xff; - half g = (data >> 8) & 0xff; - half b = (data >> 16) & 0xff; - half a = (data >> 24) & 0xff; - return half3(r, g, b) * a * MAX_BRIGHTNESS / (255 * 255); - } - - struct VertexInput - { - uint vertexID : SV_VertexID; - }; - struct VertexOutput { float4 position : SV_POSITION; @@ -56,7 +42,7 @@ Shader "Elektronik/PlaneCloudShader" VertexOutput Vertex(VertexInput input) { VertexOutput o; - float4 pt = _VertsBuffer[input.vertexID]; + float4 pt = _VertsBuffer[input.vertex_id]; if (distance(pt.xyz, float3(0, 0, 0)) < 0.001f) { o.position = float4(10000, 10000, 10000, 1); @@ -65,7 +51,7 @@ Shader "Elektronik/PlaneCloudShader" { o.position = UnityObjectToClipPos(float4(pt.xyz * _Scale, 1)); } - o.color = DecodeColor(asuint(pt.w)); + o.color = decode_color(asuint(pt.w)); o.viewPos = UnityObjectToViewPos(o.position); return o; } diff --git a/Assets/Shaders/PointCloudShader.shader b/Assets/Shaders/PointCloudShader.shader index bfacdfba..afa86926 100644 --- a/Assets/Shaders/PointCloudShader.shader +++ b/Assets/Shaders/PointCloudShader.shader @@ -20,27 +20,13 @@ Shader "Elektronik/PointCloudShader" #pragma geometry Geometry #pragma fragment Fragment #pragma multi_compile _ _COMPUTE_BUFFER - + #include "UnityCG.cginc" - #define MAX_BRIGHTNESS 16 - + #include "ComputeShaders.cginc" + half _Scale; half _Size; StructuredBuffer _ItemsBuffer; - - half3 DecodeColor(uint data) - { - half r = (data ) & 0xff; - half g = (data >> 8) & 0xff; - half b = (data >> 16) & 0xff; - half a = (data >> 24) & 0xff; - return half3(r, g, b) * a * MAX_BRIGHTNESS / (255 * 255); - } - - struct VertexInput - { - uint vertexID : SV_VertexID; - }; struct VertexOutput { @@ -51,7 +37,7 @@ Shader "Elektronik/PointCloudShader" VertexOutput Vertex(VertexInput input) { VertexOutput o; - float4 pt = _ItemsBuffer[input.vertexID]; + float4 pt = _ItemsBuffer[input.vertex_id]; if (distance(pt.xyz, float3(0, 0, 0)) < 0.001f) { o.position = float4(10000, 10000, 10000, 1); @@ -60,7 +46,7 @@ Shader "Elektronik/PointCloudShader" { o.position = UnityObjectToClipPos(float4(pt.xyz * _Scale, 1)); } - o.color = DecodeColor(asuint(pt.w)); + o.color = decode_color(asuint(pt.w)); return o; } @@ -103,8 +89,7 @@ Shader "Elektronik/PointCloudShader" { return input.color; } - ENDCG } } -} +} \ No newline at end of file diff --git a/Assets/Shaders/TransparentCubeCloudShader.shader b/Assets/Shaders/TransparentCubeCloudShader.shader index 01107ff2..2004ebc4 100644 --- a/Assets/Shaders/TransparentCubeCloudShader.shader +++ b/Assets/Shaders/TransparentCubeCloudShader.shader @@ -27,7 +27,7 @@ Shader "Elektronik/TransparentCubeCloudShader" half4 Fragment(FragmentInput input) : SV_Target { - clip(IsGrid(input)-1); + clip(IsGrid(input) - 1); return half4(input.color, 1); } ENDCG diff --git a/Assets/Shaders/TransparentSphere.shader b/Assets/Shaders/TransparentSphere.shader index e82c0e71..97d17c82 100644 --- a/Assets/Shaders/TransparentSphere.shader +++ b/Assets/Shaders/TransparentSphere.shader @@ -19,7 +19,7 @@ #pragma require geometry #pragma vertex vert #pragma fragment frag - + uniform float _GridThickness; uniform float4 _Color; @@ -43,9 +43,9 @@ output.worldPos = mul(unity_ObjectToWorld, input.vertex); output.localPos = input.vertex.xyz; output.worldScale = float3( - length(float3(unity_ObjectToWorld[0].x, unity_ObjectToWorld[1].x, unity_ObjectToWorld[2].x)), // scale x axis - length(float3(unity_ObjectToWorld[0].y, unity_ObjectToWorld[1].y, unity_ObjectToWorld[2].y)), // scale y axis - length(float3(unity_ObjectToWorld[0].z, unity_ObjectToWorld[1].z, unity_ObjectToWorld[2].z)) // scale z axis + length(float3(unity_ObjectToWorld[0].x, unity_ObjectToWorld[1].x, unity_ObjectToWorld[2].x)), + length(float3(unity_ObjectToWorld[0].y, unity_ObjectToWorld[1].y, unity_ObjectToWorld[2].y)), + length(float3(unity_ObjectToWorld[0].z, unity_ObjectToWorld[1].z, unity_ObjectToWorld[2].z)) ); return output; } @@ -56,7 +56,7 @@ const float x = abs(input.localPos.x * input.worldScale.x); const float y = abs(input.localPos.y * input.worldScale.y); const float z = abs(input.localPos.z * input.worldScale.z); - clip((x < _GridThickness || y < _GridThickness || z < _GridThickness)-1); + clip((x < _GridThickness || y < _GridThickness || z < _GridThickness) - 1); return _Color; } ENDCG @@ -71,7 +71,7 @@ #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" - + uniform float4 _Color; struct vertexInput diff --git a/Assets/Shaders/Wireframe.cginc b/Assets/Shaders/Wireframe.cginc new file mode 100644 index 00000000..e2ad54c6 --- /dev/null +++ b/Assets/Shaders/Wireframe.cginc @@ -0,0 +1,12 @@ +#define BARYCENTRIC_COORDINATES float2 barycentricCoordinates: TEXTCOORD2; + +float4 Wireframe(float2 barycentricCoords, float4 fillColor, float4 wireColor) +{ + float3 barys; + barys.xy = barycentricCoords; + barys.z = 1 - barys.x - barys.y; + float min_bary = min(barys.x, min(barys.y, barys.z)); + const float delta = fwidth(min_bary); + min_bary = smoothstep(0.5 * delta, 1.5 * delta, min_bary); + return fillColor * min_bary + wireColor * (1 - min_bary); +} diff --git a/Assets/Shaders/Wireframe.cginc.meta b/Assets/Shaders/Wireframe.cginc.meta new file mode 100644 index 00000000..226366a9 --- /dev/null +++ b/Assets/Shaders/Wireframe.cginc.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c4824e0a9b294ff2904ee264d4fb441c +timeCreated: 1635251632 \ No newline at end of file diff --git a/Assets/Shaders/WireframeShader.shader b/Assets/Shaders/WireframeShader.shader index e52f22b6..25c3b6b9 100644 --- a/Assets/Shaders/WireframeShader.shader +++ b/Assets/Shaders/WireframeShader.shader @@ -18,6 +18,7 @@ #pragma fragment frag #include "UnityCG.cginc" + #include "Wireframe.cginc" float4 _Color; float4 _WireColor; @@ -54,14 +55,7 @@ fixed4 frag (v2f i) : SV_Target { - float3 barys; - barys.xy = i.bary_coord; - barys.z = 1 - barys.x - barys.y; - float min_bary = min(barys.x, min(barys.y, barys.z)); - const float delta = fwidth(min_bary); - min_bary = smoothstep(0.5 * delta, 1.5 * delta, min_bary); - - return _Color * min_bary + _WireColor * (1 - min_bary); + return Wireframe(i.bary_coord, _Color, _WireColor); } ENDCG } diff --git a/Packages/manifest.json b/Packages/manifest.json index bede9691..0601a82c 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -14,8 +14,8 @@ "com.unity.ide.rider": "3.0.7", "com.unity.inputsystem": "1.0.2", "com.unity.localization": "1.0.0-pre.10", - "com.unity.nuget.newtonsoft-json": "2.0.0", - "com.unity.test-framework": "1.1.29", + "com.unity.nuget.newtonsoft-json": "2.0.2", + "com.unity.test-framework": "1.1.30", "com.unity.textmeshpro": "3.0.6", "com.unity.uiextensions": "2.2.7", "com.valvesoftware.unity.openvr": "file:../Assets/SteamVR/OpenVRUnityXRPackage/Editor/com.valvesoftware.unity.openvr-1.1.4.tgz", From 9222500db05ce8d8f02b73d5ec7b9b7458ffadaa Mon Sep 17 00:00:00 2001 From: Pavel Krasnov Date: Tue, 26 Oct 2021 17:12:46 +0300 Subject: [PATCH 04/10] Small refactoring --- .../Data/PackageObjects/SlamObservation.cs | 30 ++--- .../Renderers/GPU/ObservationCloudRenderer.cs | 2 +- .../DataSources/Containers/Connector.cs | 29 ++--- .../TestScene/ConnectedObservationsTester.cs | 32 +++--- .../Scripts/UI/Windows/ObservationViewer.cs | 4 +- .../DataDiff/SlamObservationDiff.cs | 46 +++++--- .../ExtractFromPackageTests.cs | 4 +- .../Integration/Online/ObservationsTests.cs | 6 +- .../Integration/Online/OnlineTestsBase.cs | 4 +- .../Integration/Online/SceneTests.cs | 2 +- .../Protobuf.Tests.Internal/RecorderTests.cs | 48 ++++---- .../RetranslatorTests.cs | 103 +++++++++++------- plugins/Protobuf/Data/MapTypesExtensions.cs | 9 +- .../Presenters/SlamDataInfoPresenter.cs | 2 +- 14 files changed, 178 insertions(+), 143 deletions(-) diff --git a/Assets/Scripts/Data/PackageObjects/SlamObservation.cs b/Assets/Scripts/Data/PackageObjects/SlamObservation.cs index c025191c..4b731b14 100644 --- a/Assets/Scripts/Data/PackageObjects/SlamObservation.cs +++ b/Assets/Scripts/Data/PackageObjects/SlamObservation.cs @@ -7,37 +7,37 @@ namespace Elektronik.Data.PackageObjects [Serializable] public struct SlamObservation : ICloudItem { - public SlamPoint Point; + public int Id { get; set; } + public Vector3 Position; + public Color Color; public Quaternion Rotation; public string Message { get; set; } - public SlamPoint AsPoint() => Point; + public SlamPoint AsPoint() => new SlamPoint(Id, Position, Color); public string FileName; public HashSet ObservedPoints; - public SlamObservation(SlamPoint pt, Quaternion orientation, string message, string fileName, + public SlamObservation(int id, Vector3 position, Color color, Quaternion orientation, string message, + string fileName, IList observedPoints = null) { - Point = pt; + Id = id; + Position = position; + Color = color; Rotation = orientation; Message = message; FileName = fileName; ObservedPoints = new HashSet(observedPoints ?? Array.Empty()); } - public static implicit operator SlamPoint(SlamObservation obs) => obs.Point; - - public override string ToString() => Point.Message ?? "SlamObservation"; - - public int Id - { - get => Point.Id; - set => Point.Id = value; - } - public bool Equals(SlamObservation other) { - return Point.Equals(other.Point) && Rotation.Equals(other.Rotation) && FileName == other.FileName && Message == other.Message; + return Id.Equals(Id) + && Position.Equals(other.Position) + && ((Color32)Color).Equals((Color32)other.Color) + && Rotation.Equals(other.Rotation) + && FileName == other.FileName + && Message == other.Message; } public override bool Equals(object obj) diff --git a/Assets/Scripts/DataConsumers/CloudRenderers/Renderers/GPU/ObservationCloudRenderer.cs b/Assets/Scripts/DataConsumers/CloudRenderers/Renderers/GPU/ObservationCloudRenderer.cs index b7e7fb31..7fcfafab 100644 --- a/Assets/Scripts/DataConsumers/CloudRenderers/Renderers/GPU/ObservationCloudRenderer.cs +++ b/Assets/Scripts/DataConsumers/CloudRenderers/Renderers/GPU/ObservationCloudRenderer.cs @@ -27,7 +27,7 @@ public ObservationCloudRenderer(Shader shader, float scale, float itemSize) : ba protected override void ProcessItem(ObservationCloudBlock block, SlamObservation item, int inBlockId) { - block[inBlockId] = (Matrix4x4.TRS(item.Point.Position, item.Rotation, Vector3.one), item.Point.Color); + block[inBlockId] = (Matrix4x4.TRS(item.Position, item.Rotation, Vector3.one), item.Color); } protected override void RemoveItem(ObservationCloudBlock block, int inBlockId) diff --git a/Assets/Scripts/DataSources/Containers/Connector.cs b/Assets/Scripts/DataSources/Containers/Connector.cs index a184726d..fd07c74a 100644 --- a/Assets/Scripts/DataSources/Containers/Connector.cs +++ b/Assets/Scripts/DataSources/Containers/Connector.cs @@ -108,15 +108,15 @@ public bool IsVisible private readonly IContainer _observations; private readonly SlamLinesContainer _connections = new SlamLinesContainer(); - private readonly Dictionary<(SlamPoint, SlamPoint), int> _weights = - new Dictionary<(SlamPoint, SlamPoint), int>(); + private readonly Dictionary<(SlamObservation, SlamObservation), int> _weights = + new Dictionary<(SlamObservation, SlamObservation), int>(); - private (SlamPoint, SlamPoint) GetKey(SlamPoint point1, SlamPoint point2) => - point1.Id < point2.Id ? (point1, point2) : (point2, point1); + private (SlamObservation, SlamObservation) GetKey(SlamObservation point1, SlamObservation point2) => + point1.Id < point2.Id ? (point1, point2) : (point2, point1); private void OnObservationsAdded(object sender, AddedEventArgs e) { - var points = new List<(SlamPoint, SlamPoint)>(); + var points = new List<(SlamObservation, SlamObservation)>(); foreach (var observation in _observations) { lock (_weights) @@ -139,7 +139,7 @@ private void OnObservationsAdded(object sender, AddedEventArgs } if (points.Count == 0) return; - _connections.AddRange(points.Select(p => new SlamLine(p.Item1, p.Item2)).ToArray()); + _connections.AddRange(points.Select(p => new SlamLine(p.Item1.AsPoint(), p.Item2.AsPoint())).ToArray()); } private void OnObservationsUpdated(object sender, UpdatedEventArgs e) @@ -151,7 +151,7 @@ private void OnObservationsUpdated(object sender, UpdatedEventArgs e) { - var keys = new List<(SlamPoint, SlamPoint)>(); + var keys = new List<(SlamObservation, SlamObservation)>(); lock (_weights) { foreach (var obs in e.RemovedItems) @@ -168,7 +168,7 @@ private void OnObservationsRemoved(object sender, RemovedEventArgs new SlamLine(ids.Item1, ids.Item2)).ToArray(); + var toRemove = keys.Select(ids => new SlamLine(ids.Item1.AsPoint(), ids.Item2.AsPoint())).ToArray(); if (toRemove.Length > 0) _connections.Remove(toRemove); } @@ -198,9 +198,9 @@ private void OnMinWeightIncreased(float value) lock (_weights) { toRemove = _weights.Where(pair => pair.Value >= _minWeight && pair.Value < value) - .Select(p => p.Key) - .Select(k => new SlamLine(k.Item1, k.Item2)) - .ToArray(); + .Select(p => p.Key) + .Select(k => new SlamLine(k.Item1.AsPoint(), k.Item2.AsPoint())) + .ToArray(); } _connections.Remove(toRemove); @@ -212,10 +212,11 @@ private void OnMinWeightDecreased(float value) lock (_weights) { toAdd = _weights.Where(pair => pair.Value >= value && pair.Value < _minWeight) - .Select(p => p.Key) - .Select(k => new SlamLine(k.Item1, k.Item2)) - .ToArray(); + .Select(p => p.Key) + .Select(k => new SlamLine(k.Item1.AsPoint(), k.Item2.AsPoint())) + .ToArray(); } + _connections.AddRange(toAdd); } diff --git a/Assets/Scripts/TestScene/ConnectedObservationsTester.cs b/Assets/Scripts/TestScene/ConnectedObservationsTester.cs index 104109dc..34ee0402 100644 --- a/Assets/Scripts/TestScene/ConnectedObservationsTester.cs +++ b/Assets/Scripts/TestScene/ConnectedObservationsTester.cs @@ -21,10 +21,10 @@ internal class ConnectedObservationsTester : MonoBehaviour private void Start() { _observations = _observations - .Select(o => new SlamObservation( - new SlamPoint(o.Id, o.Point.Position + transform.position, o.Point.Color), - o.Rotation, o.Message, o.FileName)) - .ToArray(); + .Select(o => new SlamObservation( + o.Id, o.Position + transform.position, o.Color, + o.Rotation, o.Message, o.FileName)) + .ToArray(); Controller.AddDataSource(_container); } @@ -44,19 +44,19 @@ private void OnDisable() private SlamObservation[] _observations = { - new SlamObservation(new SlamPoint(0, Vector3.up, Color.red), Quaternion.identity, "", ""), - new SlamObservation(new SlamPoint(1, Vector3.forward, Color.blue), Quaternion.identity, "", ""), - new SlamObservation(new SlamPoint(2, new Vector3(Mathf.Sqrt(2) / 2, 0, -Mathf.Sqrt(2) / 2), Color.green), + new SlamObservation(0, Vector3.up, Color.red, Quaternion.identity, "", ""), + new SlamObservation(1, Vector3.forward, Color.blue, Quaternion.identity, "", ""), + new SlamObservation(2, new Vector3(Mathf.Sqrt(2) / 2, 0, -Mathf.Sqrt(2) / 2), Color.green, Quaternion.identity, "", ""), - new SlamObservation(new SlamPoint(3, new Vector3(-Mathf.Sqrt(2) / 2, 0, -Mathf.Sqrt(2) / 2), Color.yellow), + new SlamObservation(3, new Vector3(-Mathf.Sqrt(2) / 2, 0, -Mathf.Sqrt(2) / 2), Color.yellow, Quaternion.identity, "", ""), }; private readonly (int id1, int id2)[] _connections = { (0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3) }; private readonly ConnectableObjectsContainer _container = - new ConnectableObjectsContainer(new CloudContainer(), - new SlamLinesContainer()); + new ConnectableObjectsContainer(new CloudContainer(), + new SlamLinesContainer()); private IEnumerator UpdateContainer() { @@ -85,19 +85,19 @@ private IEnumerator UpdateContainer() private SlamObservation ChangeColor(SlamObservation obs) { - return new SlamObservation(new SlamPoint(obs.Point.Id, obs.Point.Position, Color.black), - obs.Rotation, obs.Message, obs.FileName); + return new SlamObservation(obs.Id, obs.Position, Color.black, obs.Rotation, obs.Message, obs.FileName); } private SlamObservation ChangePosition(SlamObservation obs) { - return new SlamObservation(new SlamPoint(obs.Point.Id, obs.Point.Position + Vector3.up, obs.Point.Color), - obs.Rotation, obs.Message, obs.FileName); + return new SlamObservation(obs.Id, obs.Position + Vector3.up, obs.Color, obs.Rotation, obs.Message, + obs.FileName); } - + private static SlamObservation Rotated(SlamObservation obs) { - return new SlamObservation(obs.Point, Quaternion.AngleAxis(45, Vector3.forward) * obs.Rotation, + return new SlamObservation(obs.Id, obs.Position, obs.Color, + Quaternion.AngleAxis(45, Vector3.forward) * obs.Rotation, obs.Message, obs.Message); } diff --git a/Assets/Scripts/UI/Windows/ObservationViewer.cs b/Assets/Scripts/UI/Windows/ObservationViewer.cs index bc803a8d..bfe0813f 100644 --- a/Assets/Scripts/UI/Windows/ObservationViewer.cs +++ b/Assets/Scripts/UI/Windows/ObservationViewer.cs @@ -103,8 +103,8 @@ public void MoveCameraToObservation() var lookable = cam.GetComponent(); if (lookable is null) return; - var direction = (_observation.Point.Position - cam.transform.position).normalized; - var newPos = _observation.Point.Position - direction; + var direction = (_observation.Position - cam.transform.position).normalized; + var newPos = _observation.Position - direction; var rotation = Quaternion.LookRotation(direction); lookable.Look((newPos, rotation)); diff --git a/plugins/Plugins.Common/DataDiff/SlamObservationDiff.cs b/plugins/Plugins.Common/DataDiff/SlamObservationDiff.cs index d6653bfd..12dfd88a 100644 --- a/plugins/Plugins.Common/DataDiff/SlamObservationDiff.cs +++ b/plugins/Plugins.Common/DataDiff/SlamObservationDiff.cs @@ -8,26 +8,33 @@ namespace Elektronik.Plugins.Common.DataDiff { public struct SlamObservationDiff : ICloudItemDiff { - public int Id => Point.Id; - public SlamPointDiff Point; + public int Id { get; } + public Vector3? Position; + public Color? Color; public Quaternion? Rotation; public IList? ObservedPoints; public string? Message; public string? FileName; - public SlamObservationDiff(SlamPointDiff point, Quaternion? rotation = null, IList? observedPoints = null, + public SlamObservationDiff(int id, Vector3? position = null, Color? color = null, Quaternion? rotation = null, + IList? observedPoints = null, string? message = null, string? fileName = null) { - Point = point; + Id = id; + Position = position; + Color = color; Rotation = rotation; ObservedPoints = observedPoints; Message = message; FileName = fileName; } + public SlamObservation Apply() { - return new SlamObservation(Point.Apply(), + return new SlamObservation(Id, + Position ?? Vector3.zero, + Color ?? UnityEngine.Color.black, Rotation ?? Quaternion.identity, string.IsNullOrEmpty(Message) ? "" : Message, string.IsNullOrEmpty(FileName) ? "" : FileName, @@ -36,7 +43,8 @@ public SlamObservation Apply() public SlamObservation Apply(SlamObservation item) { - item.Point = Point.Apply(item.Point); + item.Position = Position ?? item.Position; + item.Color = Color ?? item.Color; item.Rotation = Rotation ?? item.Rotation; item.Message = string.IsNullOrEmpty(Message) ? item.Message : Message; item.FileName = string.IsNullOrEmpty(FileName) ? item.FileName : FileName; @@ -52,9 +60,11 @@ public SlamObservationDiff Apply(SlamObservationDiff right) { if (Id != right.Id) throw new Exception("Ids must be identical!"); var observedPoints = right.ObservedPoints is null || right.ObservedPoints.Count == 0 - ? ObservedPoints - : right.ObservedPoints; - return new SlamObservationDiff(Point.Apply(right.Point), + ? ObservedPoints + : right.ObservedPoints; + return new SlamObservationDiff(Id, + right.Position ?? Position, + right.Color ?? Color, right.Rotation ?? Rotation, observedPoints, string.IsNullOrEmpty(right.Message) ? Message : right.Message, @@ -63,11 +73,15 @@ public SlamObservationDiff Apply(SlamObservationDiff right) public bool Equals(SlamObservationDiff other) { - return Point.Equals(other.Point) - && Nullable.Equals(Rotation, other.Rotation) - && IsObservedEquals(ObservedPoints, other.ObservedPoints) - && ((string.IsNullOrEmpty(Message) && string.IsNullOrEmpty(other.Message)) || Message == other.Message) - && ((string.IsNullOrEmpty(FileName) && string.IsNullOrEmpty(other.FileName)) || FileName == other.FileName); + return Id == other.Id + && Nullable.Equals(Position, other.Position) + && (!Color.HasValue && !Color.HasValue || Color.Value.Equals((Color32)other.Color!.Value)) + && Nullable.Equals(Rotation, other.Rotation) + && IsObservedEquals(ObservedPoints, other.ObservedPoints) + && ((string.IsNullOrEmpty(Message) && string.IsNullOrEmpty(other.Message)) || + Message == other.Message) + && ((string.IsNullOrEmpty(FileName) && string.IsNullOrEmpty(other.FileName)) || + FileName == other.FileName); } private bool IsObservedEquals(IList? left, IList? right) @@ -88,7 +102,9 @@ public override int GetHashCode() { unchecked { - var hashCode = Point.GetHashCode(); + var hashCode = Position.GetHashCode(); + hashCode = (hashCode * 397) ^ Color.GetHashCode(); + hashCode = (hashCode * 397) ^ Id; hashCode = (hashCode * 397) ^ Rotation.GetHashCode(); hashCode = (hashCode * 397) ^ (ObservedPoints != null ? ObservedPoints.GetHashCode() : 0); hashCode = (hashCode * 397) ^ (Message != null ? Message.GetHashCode() : 0); diff --git a/plugins/Protobuf.Tests.Internal/ExtractFromPackageTests.cs b/plugins/Protobuf.Tests.Internal/ExtractFromPackageTests.cs index 229f233d..1179a409 100644 --- a/plugins/Protobuf.Tests.Internal/ExtractFromPackageTests.cs +++ b/plugins/Protobuf.Tests.Internal/ExtractFromPackageTests.cs @@ -79,8 +79,8 @@ public void ExtractObservationsTest() var observations = packet.ExtractObservations(_mockedConverter.Object, @"./").ToArray(); Assert.AreEqual(1, observations.Count()); Assert.AreEqual(1, observations[0].Id); - Assert.AreEqual(new Vector3(-2, 3, 4), observations[0].Point.Position); - Assert.AreEqual(Color.white, observations[0].Point.Color); + Assert.AreEqual(new Vector3(-2, 3, 4), observations[0].Position); + Assert.AreEqual(Color.white, observations[0].Color); Assert.AreEqual("message", observations[0].Message); Assert.AreEqual(new Quaternion(5, 6, 7, -8), observations[0].Rotation); Assert.AreEqual(@"./1.png", observations[0].FileName); diff --git a/plugins/Protobuf.Tests.Internal/Integration/Online/ObservationsTests.cs b/plugins/Protobuf.Tests.Internal/Integration/Online/ObservationsTests.cs index 32f00518..ed707b21 100644 --- a/plugins/Protobuf.Tests.Internal/Integration/Online/ObservationsTests.cs +++ b/plugins/Protobuf.Tests.Internal/Integration/Online/ObservationsTests.cs @@ -218,7 +218,7 @@ public void UpdateConnections() var lines = _connections.Select(c => (_map[c.Id1], _map[c.Id2])) .Select(pair => (((SlamObservationDiff)pair.Item1).Apply(), ((SlamObservationDiff)pair.Item2).Apply())) - .Select((pair, i) => new SlamLine(pair.Item1, pair.Item2, i)) + .Select((pair, i) => new SlamLine(pair.Item1.AsPoint(), pair.Item2.AsPoint(), i)) .ToArray(); var e = new AddedEventArgs(lines); @@ -243,8 +243,8 @@ public void UpdateConnectedObservations() var e = new UpdatedEventArgs(new[] { ((SlamObservationDiff)_map[2]).Apply() }); var el = new UpdatedEventArgs(new[] { - new SlamLine(((SlamObservationDiff)_map[0]).Apply(), ((SlamObservationDiff)_map[2]).Apply(), 1), - new SlamLine(((SlamObservationDiff)_map[2]).Apply(), ((SlamObservationDiff)_map[4]).Apply(), 2) + new SlamLine(((SlamObservationDiff)_map[0]).Apply().AsPoint(), ((SlamObservationDiff)_map[2]).Apply().AsPoint(), 1), + new SlamLine(((SlamObservationDiff)_map[2]).Apply().AsPoint(), ((SlamObservationDiff)_map[4]).Apply().AsPoint(), 2) }); SendPacket(packet); diff --git a/plugins/Protobuf.Tests.Internal/Integration/Online/OnlineTestsBase.cs b/plugins/Protobuf.Tests.Internal/Integration/Online/OnlineTestsBase.cs index b0d52607..551dd371 100644 --- a/plugins/Protobuf.Tests.Internal/Integration/Online/OnlineTestsBase.cs +++ b/plugins/Protobuf.Tests.Internal/Integration/Online/OnlineTestsBase.cs @@ -126,7 +126,7 @@ private void SetupPrintFromMocks() .Callback((object sender, AddedEventArgs e) => { var ss = e.AddedItems - .Select(o => $"{o.Id}, [{ToString(o.Point)}], {o.Rotation}, " + + .Select(o => $"{o.Id}, {o.Position}, {o.Color}, {o.Rotation}, " + $"{o.ObservedPoints.Count}, \"{o.Message}\", \"{o.FileName}\""); TestContext.WriteLine($"Observations added: {sender}\n{string.Join("\n", ss)}"); }); @@ -135,7 +135,7 @@ private void SetupPrintFromMocks() .Callback((object sender, UpdatedEventArgs e) => { var ss = e.UpdatedItems - .Select(o => $"{o.Id}, [{ToString(o.Point)}], {o.Rotation}, " + + .Select(o => $"{o.Id}, {o.Position}, {o.Color}, {o.Rotation}, " + $"{o.ObservedPoints.Count}, \"{o.Message}\", \"{o.FileName}\""); TestContext.WriteLine($"Observations updated: {sender}\n{string.Join("\n", ss)}"); }); diff --git a/plugins/Protobuf.Tests.Internal/Integration/Online/SceneTests.cs b/plugins/Protobuf.Tests.Internal/Integration/Online/SceneTests.cs index 43077032..f901336b 100644 --- a/plugins/Protobuf.Tests.Internal/Integration/Online/SceneTests.cs +++ b/plugins/Protobuf.Tests.Internal/Integration/Online/SceneTests.cs @@ -169,7 +169,7 @@ public void SendObservationsAndConnections() var lines = _connections.Select(c => (_observationsMap[c.Id1], _observationsMap[c.Id2])) .Select(pair => (((SlamObservationDiff)pair.Item1).Apply(), ((SlamObservationDiff)pair.Item2).Apply())) - .Select((pair, i) => new SlamLine(pair.Item1, pair.Item2, i)) + .Select((pair, i) => new SlamLine(pair.Item1.AsPoint(), pair.Item2.AsPoint(), i)) .ToArray(); var el = new AddedEventArgs(lines); diff --git a/plugins/Protobuf.Tests.Internal/RecorderTests.cs b/plugins/Protobuf.Tests.Internal/RecorderTests.cs index 178d79be..7fba62d3 100644 --- a/plugins/Protobuf.Tests.Internal/RecorderTests.cs +++ b/plugins/Protobuf.Tests.Internal/RecorderTests.cs @@ -68,17 +68,14 @@ public void ObservationsTest() var sut = CreateRecorder(1); var observations = new[] { - new SlamObservation(new SlamPoint(0, Vector3.one, Color.blue), Quaternion.identity, "123", "f.jpg"), - new SlamObservation(new SlamPoint(1, Vector3.down, Color.red), new Quaternion(0, 5, 15, 3), "321", ""), - new SlamObservation(new SlamPoint(-10, Vector3.forward, Color.gray, "test message"), - new Quaternion(59, 46, 3, 24), "adsf", "f.jpg"), + new SlamObservation(0, Vector3.one, Color.blue, Quaternion.identity, "123", "f.jpg"), + new SlamObservation(1, Vector3.down, Color.red, new Quaternion(0, 5, 15, 3), "321", ""), + new SlamObservation(-10, Vector3.forward, Color.gray, new Quaternion(59, 46, 3, 24), "adsf", "f.jpg"), }; var moreObservations = new[] { - new SlamObservation(new SlamPoint(0, Vector3.zero, Color.red, "Another message"), - new Quaternion(6, 2, 1, 0), "123", "f.jpg"), - new SlamObservation(new SlamPoint(-10, Vector3.up, Color.white, "test message"), Quaternion.identity, - "123", "f.jpg"), + new SlamObservation(0, Vector3.zero, Color.red, new Quaternion(6, 2, 1, 0), "123", "f.jpg"), + new SlamObservation(-10, Vector3.up, Color.white, Quaternion.identity, "123", "f.jpg"), }; sut.OnItemsAdded(null, new AddedEventArgs(observations)); @@ -118,7 +115,7 @@ public void TrackedObjectsTest() new SlamTrackedObject(0, Vector3.zero, new Quaternion(5, 6, 7, 0), Color.red, "Another message"), new SlamTrackedObject(-10, Vector3.up, Quaternion.identity, Color.white, "test message") }; - + sut.OnItemsAdded(null, new AddedEventArgs(trackedObjects)); sut.OnItemsUpdated(null, new UpdatedEventArgs(moreTrackedObjects)); sut.OnItemsRemoved(null, new RemovedEventArgs(new List { 0 })); @@ -237,7 +234,7 @@ public void StartStopTest() sut.OnItemsAdded(null, new AddedEventArgs(points)); sut.OnItemsUpdated(null, new UpdatedEventArgs(morePoints)); sut.Dispose(); - + sut.OnItemsRemoved(null, new RemovedEventArgs(new List { 0 })); using var input = File.OpenRead(_filename); @@ -261,8 +258,8 @@ private bool AreColorsEqual(Color first, Color second) { float epsilon = 0.004f; return (Mathf.Abs(first.r - second.r) < epsilon) - && (Mathf.Abs(first.g - second.g) < epsilon) - && (Mathf.Abs(first.b - second.b) < epsilon); + && (Mathf.Abs(first.g - second.g) < epsilon) + && (Mathf.Abs(first.b - second.b) < epsilon); } private bool CheckDiffAndPoint(SlamPointDiff diff, SlamPoint point) @@ -278,26 +275,27 @@ private void CheckPoints(IEnumerable points, PacketPb packet) { Assert.AreEqual(PacketPb.DataOneofCase.Points, packet.DataCase); Assert.IsTrue(packet.ExtractPoints() - .Zip(points, (point, item) => (point, item)) - .All(d => CheckDiffAndPoint(d.point, d.item))); + .Zip(points, (point, item) => (point, item)) + .All(d => CheckDiffAndPoint(d.point, d.item))); } private bool CheckDiffAndObservation(SlamObservationDiff diff, SlamObservation observation) { bool id = diff.Id == observation.Id; - bool point = CheckDiffAndPoint(diff.Point, observation.Point); - bool offset = !diff.Rotation.HasValue || diff.Rotation.Value == observation.Rotation; + bool position = !diff.Position.HasValue || diff.Position.Value == observation.Position; + bool color = !diff.Color.HasValue || AreColorsEqual(diff.Color.Value, observation.Color); + bool rotation = !diff.Rotation.HasValue || diff.Rotation.Value == observation.Rotation; bool message = string.IsNullOrEmpty(diff.Message) || diff.Message == observation.Message; bool filename = string.IsNullOrEmpty(diff.FileName) || diff.FileName == observation.FileName; - return id && offset && point && message && filename; + return id && position && color && rotation && message && filename; } private void CheckObservations(IEnumerable points, PacketPb packet) { Assert.AreEqual(PacketPb.DataOneofCase.Observations, packet.DataCase); Assert.IsTrue(packet.ExtractObservations(null, "") - .Zip(points, (point, item) => (point, item)) - .All(d => CheckDiffAndObservation(d.point, d.item))); + .Zip(points, (point, item) => (point, item)) + .All(d => CheckDiffAndObservation(d.point, d.item))); } private bool CheckDiffAndTrackedObj(SlamTrackedObjectDiff diff, SlamTrackedObject obj) @@ -314,8 +312,8 @@ private void CheckTrackedObjects(IEnumerable points, PacketPb { Assert.AreEqual(PacketPb.DataOneofCase.TrackedObjs, packet.DataCase); Assert.IsTrue(packet.ExtractTrackedObjects() - .Zip(points, (point, item) => (point, item)) - .All(d => CheckDiffAndTrackedObj(d.point, d.item))); + .Zip(points, (point, item) => (point, item)) + .All(d => CheckDiffAndTrackedObj(d.point, d.item))); } private bool CheckDiffAndPlane(SlamPlaneDiff diff, SlamPlane plane) @@ -332,8 +330,8 @@ private void CheckPlanes(IEnumerable points, PacketPb packet) { Assert.AreEqual(PacketPb.DataOneofCase.Planes, packet.DataCase); Assert.IsTrue(packet.ExtractPlanes() - .Zip(points, (point, item) => (point, item)) - .All(pair => CheckDiffAndPlane(pair.point, pair.item))); + .Zip(points, (point, item) => (point, item)) + .All(pair => CheckDiffAndPlane(pair.point, pair.item))); } private bool CheckDiffAndLine(SlamLineDiff diff, SlamLine line) @@ -347,8 +345,8 @@ private void CheckLines(IEnumerable points, PacketPb packet) { Assert.AreEqual(PacketPb.DataOneofCase.Lines, packet.DataCase); Assert.IsTrue(packet.ExtractLines() - .Zip(points, (point, item) => (point, item)) - .All(d => CheckDiffAndLine(d.point, d.item))); + .Zip(points, (point, item) => (point, item)) + .All(d => CheckDiffAndLine(d.point, d.item))); } private void CheckMetadata(FileStream input, int expectedFrames) diff --git a/plugins/Protobuf.Tests.Internal/RetranslatorTests.cs b/plugins/Protobuf.Tests.Internal/RetranslatorTests.cs index bfe4bf25..55e60a50 100644 --- a/plugins/Protobuf.Tests.Internal/RetranslatorTests.cs +++ b/plugins/Protobuf.Tests.Internal/RetranslatorTests.cs @@ -41,23 +41,24 @@ public void Setup() _mockedObservationsContainer = new Mock>(); _mockedTrackedObjectsContainer = new Mock>(); _mockedPlanesContainer = new Mock>(); - + var factory = new ProtobufRetranslatorFactory(); _retranslator = (ProtobufRetranslator)factory.Start(new FakeConverter()); var settings = (RetranslatorSettingsBag)_retranslator.Settings; settings.Addresses = $"{Address}:{Port}"; settings.StartRetranslation?.Invoke(); - + var logger = new TestsLogger(); - var pointsMapManager = - new PointsMapManager(_mockedBuffer.Object, _mockedPointsContainer.Object, null, logger); - var observationsMapManager = - new ObservationsMapManager(_mockedBuffer.Object, _mockedObservationsContainer.Object, null, logger); - var trackedObjsMapManager = - new TrackedObjsMapManager(_mockedBuffer.Object, _mockedTrackedObjectsContainer.Object, null, - logger); - var planesMapManager = - new PlanesMapManager(_mockedBuffer.Object, _mockedPlanesContainer.Object, null, logger); + var pointsMapManager = new PointsMapManager(_mockedBuffer.Object, _mockedPointsContainer.Object, null, + logger); + var observationsMapManager = new ObservationsMapManager(_mockedBuffer.Object, + _mockedObservationsContainer.Object, + null, logger); + var trackedObjsMapManager = new TrackedObjsMapManager(_mockedBuffer.Object, + _mockedTrackedObjectsContainer.Object, null, + logger); + var planesMapManager = new PlanesMapManager(_mockedBuffer.Object, _mockedPlanesContainer.Object, + null, logger); var servicesChain = new IChainable[] { @@ -112,7 +113,8 @@ public void PointsTest() _retranslator.OnItemsAdded(null, new AddedEventArgs(added.Select(p => p.Apply()).ToArray())); Thread.Sleep(50); - _retranslator.OnItemsUpdated(null, new UpdatedEventArgs(updated.Select(p => p.Apply()).ToArray())); + _retranslator.OnItemsUpdated(null, + new UpdatedEventArgs(updated.Select(p => p.Apply()).ToArray())); Thread.Sleep(50); _retranslator.OnItemsRemoved(null, new RemovedEventArgs(new List { 1 })); Thread.Sleep(100); @@ -127,34 +129,39 @@ public void ObservationsTest() { var added = new[] { - new SlamObservationDiff(new SlamPointDiff(0, Vector3.one, Color.blue), - Quaternion.identity, Array.Empty(), "123", + new SlamObservationDiff(0, Vector3.one, Color.blue, Quaternion.identity, Array.Empty(), "123", Path.Combine(Directory.GetCurrentDirectory(), "f.png")), - new SlamObservationDiff(new SlamPointDiff(1, Vector3.down, Color.red), - new Quaternion(0, 5, 15, 3), Array.Empty(), "321"), - new SlamObservationDiff(new SlamPointDiff(-10, Vector3.forward, Color.gray, "test message"), - new Quaternion(59, 46, 3, 24), Array.Empty(), "adsf", + new SlamObservationDiff(1, Vector3.down, Color.red, new Quaternion(0, 5, 15, 3), Array.Empty(), + "321"), + new SlamObservationDiff(-10, Vector3.forward, Color.gray, new Quaternion(59, 46, 3, 24), + Array.Empty(), "adsf", Path.Combine(Directory.GetCurrentDirectory(), "f.png")), }; var updated = new[] { - new SlamObservationDiff(new SlamPointDiff(0, Vector3.zero, Color.red, "Another message"), - new Quaternion(6, 2, 1, 0), Array.Empty(), "123", - Path.Combine(Directory.GetCurrentDirectory(), "f.png")), - new SlamObservationDiff(new SlamPointDiff(-10, Vector3.up, Color.white, "test message"), - Quaternion.identity, Array.Empty(), "123", + new SlamObservationDiff(0, Vector3.zero, Color.red, new Quaternion(6, 2, 1, 0), Array.Empty(), + "123", Path.Combine(Directory.GetCurrentDirectory(), "f.png")), + new SlamObservationDiff(-10, Vector3.up, Color.white, Quaternion.identity, Array.Empty(), "123", Path.Combine(Directory.GetCurrentDirectory(), "f.png")), }; - var removed = new[] { new SlamObservationDiff(new SlamPointDiff(0)), }; - var addCommand = new AddCommand(_mockedObservationsContainer.Object, added); - var updateCommand = new UpdateCommand(_mockedObservationsContainer.Object, updated); - var removeCommand = new RemoveCommand(_mockedObservationsContainer.Object, removed); - - _retranslator.OnItemsAdded(null, new AddedEventArgs(added.Select(o => o.Apply()).ToArray())); + var removed = new[] { new SlamObservationDiff(0), }; + var addCommand = + new AddCommand(_mockedObservationsContainer.Object, added); + var updateCommand = + new UpdateCommand(_mockedObservationsContainer.Object, updated); + var removeCommand = + new RemoveCommand(_mockedObservationsContainer.Object, removed); + + _retranslator.OnItemsAdded(null, + new AddedEventArgs(added.Select(o => o.Apply()).ToArray())); Thread.Sleep(100); - _retranslator.OnItemsUpdated(null, new UpdatedEventArgs(updated.Select(o => o.Apply()).ToArray())); + _retranslator.OnItemsUpdated(null, + new UpdatedEventArgs(updated.Select(o => o.Apply()) + .ToArray())); Thread.Sleep(100); - _retranslator.OnItemsRemoved(null, new RemovedEventArgs(removed.Select(o => o.Apply()).ToArray())); + _retranslator.OnItemsRemoved(null, + new RemovedEventArgs(removed.Select(o => o.Apply()) + .ToArray())); Thread.Sleep(200); _mockedBuffer.Verify(b => b.Add(addCommand, It.IsAny(), false), Times.Once); @@ -177,17 +184,27 @@ public void TrackedObjectsTest() new SlamTrackedObjectDiff(-10, Vector3.up, Quaternion.identity, Color.white, "test message"), }; var removed = new[] { new SlamTrackedObjectDiff(0), }; - var addCommand = new AddCommand(_mockedTrackedObjectsContainer.Object, added); - var updateCommand = new UpdateCommand(_mockedTrackedObjectsContainer.Object, updated); - var removeCommand = new RemoveCommand(_mockedTrackedObjectsContainer.Object, removed); - - _retranslator.OnItemsAdded(null, new AddedEventArgs(added.Select(o => o.Apply()).ToArray())); + var addCommand = + new AddCommand(_mockedTrackedObjectsContainer.Object, added); + var updateCommand = + new UpdateCommand(_mockedTrackedObjectsContainer.Object, + updated); + var removeCommand = + new RemoveCommand(_mockedTrackedObjectsContainer.Object, + removed); + + _retranslator.OnItemsAdded(null, + new AddedEventArgs(added.Select(o => o.Apply()).ToArray())); Thread.Sleep(50); - _retranslator.OnItemsUpdated(null, new UpdatedEventArgs(updated.Select(o => o.Apply()).ToArray())); + _retranslator.OnItemsUpdated(null, + new UpdatedEventArgs(updated.Select(o => o.Apply()) + .ToArray())); Thread.Sleep(50); - _retranslator.OnItemsRemoved(null, new RemovedEventArgs(removed.Select(o => o.Apply()).ToArray())); + _retranslator.OnItemsRemoved(null, + new RemovedEventArgs(removed.Select(o => o.Apply()) + .ToArray())); Thread.Sleep(100); - + _mockedBuffer.Verify(b => b.Add(addCommand, It.IsAny(), false), Times.Once); _mockedBuffer.Verify(b => b.Add(updateCommand, It.IsAny(), false), Times.Once); _mockedBuffer.Verify(b => b.Add(removeCommand, It.IsAny(), false), Times.Once); @@ -214,11 +231,13 @@ public void InfinitePlanesTest() _retranslator.OnItemsAdded(null, new AddedEventArgs(added.Select(o => o.Apply()).ToArray())); Thread.Sleep(50); - _retranslator.OnItemsUpdated(null, new UpdatedEventArgs(updated.Select(o => o.Apply()).ToArray())); + _retranslator.OnItemsUpdated(null, + new UpdatedEventArgs(updated.Select(o => o.Apply()).ToArray())); Thread.Sleep(50); - _retranslator.OnItemsRemoved(null, new RemovedEventArgs(removed.Select(o => o.Apply()).ToArray())); + _retranslator.OnItemsRemoved(null, + new RemovedEventArgs(removed.Select(o => o.Apply()).ToArray())); Thread.Sleep(100); - + _mockedBuffer.Verify(b => b.Add(addCommand, It.IsAny(), false), Times.Once); _mockedBuffer.Verify(b => b.Add(updateCommand, It.IsAny(), false), Times.Once); _mockedBuffer.Verify(b => b.Add(removeCommand, It.IsAny(), false), Times.Once); diff --git a/plugins/Protobuf/Data/MapTypesExtensions.cs b/plugins/Protobuf/Data/MapTypesExtensions.cs index 4fd8e9d3..0be677d0 100644 --- a/plugins/Protobuf/Data/MapTypesExtensions.cs +++ b/plugins/Protobuf/Data/MapTypesExtensions.cs @@ -32,8 +32,8 @@ public static SlamObservationDiff[] ExtractObservations(this PacketPb packet, { result[i] = packet.Observations.Data[i]; - var position = result[i].Point.Position; - if (position.HasValue) result[i].Point.Position = converter?.Convert(position.Value) ?? position; + var position = result[i].Position; + if (position.HasValue) result[i].Position = converter?.Convert(position.Value) ?? position; var rotation = result[i].Rotation; if (rotation.HasValue) result[i].Rotation = converter?.Convert(rotation.Value) ?? rotation; @@ -185,7 +185,8 @@ public partial class ObservationPb { public static implicit operator SlamObservationDiff(ObservationPb? o) => o != null - ? new SlamObservationDiff(o.point_, o.Orientation, o.observedPoints_, o.message_, o.filename_) + ? new SlamObservationDiff(o.Point.Id, o.Point.Position, o.Point.Color, + o.Orientation, o.observedPoints_, o.message_, o.filename_) : default; } @@ -262,7 +263,7 @@ public static ObservationPb ToProtobuf(this SlamObservation o, ICSConverter? con { var pb = new ObservationPb { - Point = o.Point.ToProtobuf(converter), + Point = new PointPb{Id = o.Id, Position = o.Position.ToProtobuf(converter), Color = o.Color}, Orientation = o.Rotation.ToProtobuf(converter), Message = o.Message ?? "", Filename = o.FileName ?? "", diff --git a/plugins/Protobuf/Offline/Presenters/SlamDataInfoPresenter.cs b/plugins/Protobuf/Offline/Presenters/SlamDataInfoPresenter.cs index 805add62..d9498122 100644 --- a/plugins/Protobuf/Offline/Presenters/SlamDataInfoPresenter.cs +++ b/plugins/Protobuf/Offline/Presenters/SlamDataInfoPresenter.cs @@ -87,7 +87,7 @@ private IEnumerable Pkg2Pts(PacketPb packet, ICSConverter? converter foreach (var observationPb in packet.Observations.Data) { var observation = ((SlamObservationDiff)observationPb).Apply(); - converter?.Convert(ref observation.Point.Position, ref observation.Rotation); + converter?.Convert(ref observation.Position, ref observation.Rotation); yield return observation; } break; From c5be4b72cb54d1689912f9088acd5a1ba13313f5 Mon Sep 17 00:00:00 2001 From: Pavel Krasnov Date: Wed, 27 Oct 2021 11:17:18 +0300 Subject: [PATCH 05/10] XML api reference --- Assets/Prefabs/Renderers.prefab | 7 +- Assets/Prefabs/UI/Axis View.prefab | 2094 +++++++++++++++++ .../UI/Axis View.prefab.meta} | 5 +- Assets/Scenes/Main.unity | 4 +- Assets/Scenes/Test scene.unity | 4 +- .../Cameras/CameraOrientationWidget2D.cs | 82 +- Assets/Scripts/Cameras/DisableAutoXR.cs | 28 - Assets/Scripts/Cameras/DisableAutoXR.cs.meta | 11 - Assets/Scripts/Cameras/FreeFlyCamera.cs | 19 +- Assets/Scripts/Cameras/Grid.cs | 168 +- Assets/Scripts/Cameras/LookableCamera.cs | 28 +- .../Scripts/Data/PackageObjects/ICloudItem.cs | 13 - .../CloudRenderers/Blocks/ICloudBlock.cs | 17 - .../CloudRenderers/ConsumersRoot.cs | 3 +- .../DataConsumers/CloudRenderers/GPUItem.cs | 47 - .../CloudRenderers/RenderQueueController.cs | 7 +- .../CloudRenderers/Renderers/DataComponent.cs | 30 +- .../{ => Renderers/GPU}/Blocks.meta | 0 .../{ => Renderers/GPU}/Blocks/CloudBlock.cs | 17 +- .../GPU}/Blocks/CloudBlock.cs.meta | 0 .../Renderers/GPU/Blocks/ICloudBlock.cs | 26 + .../GPU}/Blocks/ICloudBlock.cs.meta | 0 .../GPU}/Blocks/LineCloudBlock.cs | 20 +- .../GPU}/Blocks/LineCloudBlock.cs.meta | 0 .../GPU}/Blocks/MarkerCloudBlock.cs | 17 +- .../GPU}/Blocks/MarkerCloudBlock.cs.meta | 0 .../GPU}/Blocks/MeshRendererBlock.cs | 29 +- .../GPU}/Blocks/MeshRendererBlock.cs.meta | 0 .../GPU}/Blocks/ObservationCloudBlock.cs | 22 +- .../GPU}/Blocks/ObservationCloudBlock.cs.meta | 0 .../GPU}/Blocks/PlaneCloudBlock.cs | 25 +- .../GPU}/Blocks/PlaneCloudBlock.cs.meta | 0 .../GPU}/Blocks/PointCloudBlock.cs | 27 +- .../GPU}/Blocks/PointCloudBlock.cs.meta | 0 .../Blocks/TransparentMarkerCloudBlock.cs | 6 +- .../TransparentMarkerCloudBlock.cs.meta | 0 .../{ => Renderers/GPU}/GPUItem.cs.meta | 0 .../Renderers/GPU/GpuCloudRenderer.cs | 46 +- .../CloudRenderers/Renderers/GPU/GpuItem.cs | 51 + .../GpuMeshRenderer.cs | 55 +- .../GpuMeshRenderer.cs.meta | 0 .../Renderers/GPU/IGpuRenderer.cs | 6 + .../GPU/MarkerCloudRenderer.Generic.cs | 15 +- .../Renderers/GPU/MarkerCloudRenderer.cs | 11 +- .../Renderers/GPU/ObservationCloudRenderer.cs | 43 +- .../Renderers/GPU/PlaneCloudRenderer.cs | 40 +- .../Renderers/GPU/PointCloudRenderer.cs | 34 +- .../Renderers/GPU/SimpleLineCloudRenderer.cs | 23 +- .../Renderers/GPU/SlamLineCloudRenderer.cs | 21 +- .../Renderers/ICloudRenderer.cs | 18 - .../Renderers/IMarkerCloudRenderer.cs | 4 +- .../CloudRenderers/Renderers/IMeshRenderer.cs | 15 +- .../Renderers/IResizableRenderer.cs | 4 +- .../UnityComponents/GameObjectCloud.cs | 132 +- .../GameObjectMarkerCloudRenderer.cs | 31 +- .../MarkerCloudRendererComponent.cs | 12 - .../UnityComponents/MarkersMessageRenderer.cs | 95 +- .../SimpleLineCloudRendererComponent.cs | 15 - .../SlamLineCloudRendererComponent.cs | 15 - .../UnityComponents/TrackedObjectCloud.cs | 51 +- .../Renderers/UnityComponents/Wrappers.meta | 3 + .../{ => Wrappers}/CloudRendererComponent.cs | 28 +- .../CloudRendererComponent.cs.meta | 0 .../Wrappers/GpuMeshRendererComponent.cs | 96 + .../Wrappers/GpuMeshRendererComponent.cs.meta | 3 + .../Wrappers/MarkerCloudRendererComponent.cs | 13 + .../MarkerCloudRendererComponent.cs.meta | 0 .../ObservationCloudRendererComponent.cs | 5 +- .../ObservationCloudRendererComponent.cs.meta | 0 .../OpaqueMarkerCloudRendererComponent.cs | 6 +- ...OpaqueMarkerCloudRendererComponent.cs.meta | 0 .../PlaneCloudRendererComponent.cs | 5 +- .../PlaneCloudRendererComponent.cs.meta | 0 .../PointCloudRendererComponent.cs | 5 +- .../PointCloudRendererComponent.cs.meta | 0 .../SimpleLineCloudRendererComponent.cs | 21 + .../SimpleLineCloudRendererComponent.cs.meta | 0 .../SlamLineCloudRendererComponent.cs | 21 + .../SlamLineCloudRendererComponent.cs.meta | 0 ...TransparentMarkerCloudRendererComponent.cs | 5 +- ...parentMarkerCloudRendererComponent.cs.meta | 0 .../Collision/CollisionAlgorithms.cs | 1 + .../DataConsumers/Collision/CollisionBlock.cs | 55 +- .../DataConsumers/Collision/CollisionCloud.cs | 82 +- .../Collision/ObservationCollisionCloud.cs | 5 +- .../Collision/PointCollisionCloud.cs | 3 +- .../Scripts/DataConsumers/ICloudRenderer.cs | 41 + .../Renderers => }/ICloudRenderer.cs.meta | 0 Assets/Scripts/DataConsumers/IDataConsumer.cs | 5 +- Assets/Scripts/DataConsumers/IScalable.cs | 12 + .../Scripts/DataConsumers/IScalable.cs.meta | 3 + .../DataConsumers/Windows/ImageData.cs | 31 +- .../DataConsumers/Windows/ImageRenderer.cs | 56 +- .../DataConsumers/Windows/SlamInfoRenderer.cs | 35 +- .../DataConsumers/Windows/StringRenderer.cs | 20 +- .../DataConsumers/Windows/TableRenderer.cs | 25 +- .../DataControllers/ClustersController.cs | 32 +- .../DataControllers/DataSourcesController.cs | 73 +- .../DataControllers/PlayerEventsController.cs | 37 +- .../Scripts/{Data.meta => DataObjects.meta} | 0 Assets/Scripts/DataObjects/ICloudItem.cs | 15 + .../ICloudItem.cs.meta | 0 .../SimpleLine.cs | 27 +- .../SimpleLine.cs.meta | 0 .../SlamLine.cs | 31 +- .../SlamLine.cs.meta | 0 .../SlamMarker.cs | 13 +- .../SlamMarker.cs.meta | 0 .../SlamObservation.cs | 20 +- .../SlamObservation.cs.meta | 0 .../SlamPlane.cs | 16 +- .../SlamPlane.cs.meta | 0 .../SlamPoint.cs | 34 +- .../SlamPoint.cs.meta | 0 .../SlamTrackedObject.cs | 10 +- .../SlamTrackedObject.cs.meta | 0 .../DataSources/Containers/CloudCluster.cs | 9 +- .../DataSources/Containers/CloudContainer.cs | 73 +- .../Containers/CloudContainerBase.cs | 61 +- .../Containers/ClustersContainer.cs | 51 +- ...cs => ConnectableObjectsCloudContainer.cs} | 65 +- ... ConnectableObjectsCloudContainer.cs.meta} | 0 .../DataSources/Containers/Connector.cs | 47 +- .../Containers/EventArgs/AddedEventArgs.cs | 4 +- .../EventArgs/ConnectionsEventArgs.cs | 1 + .../EventArgs/MeshUpdatedEventArgs.cs | 6 +- .../Containers/EventArgs/RemovedEventArgs.cs | 4 +- .../Containers/EventArgs/UpdatedEventArgs.cs | 4 +- .../DataSources/Containers/ICloudContainer.cs | 60 + ...tainer.cs.meta => ICloudContainer.cs.meta} | 0 .../IConnectableObjectsCloudContainer.cs | 39 + ...IConnectableObjectsCloudContainer.cs.meta} | 0 .../IConnectableObjectsContainer.cs | 21 - .../DataSources/Containers/IContainer.cs | 33 - .../DataSources/Containers/IMeshContainer.cs | 2 +- ...Container.cs => ITrackedCloudContainer.cs} | 4 +- ...cs.meta => ITrackedCloudContainer.cs.meta} | 0 .../Containers/MeshReconstructor.cs | 12 +- ...ontainer.cs => SlamLinesCloudContainer.cs} | 23 +- ...s.meta => SlamLinesCloudContainer.cs.meta} | 0 .../Containers/SnapshotContainer.cs | 4 +- .../DataSources/Containers/TraceSettings.cs | 2 +- ...ackContainer.cs => TrackCloudContainer.cs} | 38 +- ...er.cs.meta => TrackCloudContainer.cs.meta} | 0 ...ner.cs => TrackedCloudObjectsContainer.cs} | 47 +- ...a => TrackedCloudObjectsContainer.cs.meta} | 0 ...{VirtualSource.cs => VirtualDataSource.cs} | 44 +- ...urce.cs.meta => VirtualDataSource.cs.meta} | 0 .../{ISourceTreeNode.cs => IDataSource.cs} | 6 +- ...ceTreeNode.cs.meta => IDataSource.cs.meta} | 0 .../SpecialInterfaces/IClusterable.cs | 9 - .../IClusterableDataSource.cs | 11 + ...cs.meta => IClusterableDataSource.cs.meta} | 0 .../SpecialInterfaces/IColorful.cs | 9 - .../SpecialInterfaces/IColorfulDataSource.cs | 11 + ...ul.cs.meta => IColorfulDataSource.cs.meta} | 0 .../IFilterableDataSource.cs | 18 + ....cs.meta => IFilterableDataSource.cs.meta} | 0 .../SpecialInterfaces/IFollowable.cs | 17 - .../IFollowableDataSource.cs | 22 + ....cs.meta => IFollowableDataSource.cs.meta} | 0 .../{ILookable.cs => ILookableDataSource.cs} | 5 +- ...le.cs.meta => ILookableDataSource.cs.meta} | 0 .../SpecialInterfaces/IRemovable.cs | 10 - .../SpecialInterfaces/IRemovableDataSource.cs | 14 + ...e.cs.meta => IRemovableDataSource.cs.meta} | 0 .../SpecialInterfaces/IRendersToWindow.cs | 20 +- .../SpecialInterfaces/ISavableDataSource.cs | 7 + ...ave.cs.meta => ISavableDataSource.cs.meta} | 0 .../DataSources/SpecialInterfaces/ISave.cs | 6 - .../SpecialInterfaces/ITraceable.cs | 8 - .../SpecialInterfaces/ITraceableDataSource.cs | 11 + ...e.cs.meta => ITraceableDataSource.cs.meta} | 0 .../DataSources/SpecialInterfaces/IVisible.cs | 13 - .../SpecialInterfaces/IVisibleDataSource.cs | 14 + ...ble.cs.meta => IVisibleDataSource.cs.meta} | 0 .../SpecialInterfaces/IWeightable.cs | 13 - .../EditorTests/ContainersTests/TraceTests.cs | 90 +- .../EditorTests/ContainersTests/TrackTests.cs | 30 +- .../EditorTests/LinqExtensionsTests.cs | 1 + .../Plugins/DataRecorderPluginBase.cs | 4 +- .../Plugins/IClusteringAlgorithm.cs | 20 +- .../Plugins/IDataSourcePlugin.cs | 2 +- .../UnitySide/RecorderPluginsController.cs | 10 +- .../TestScene/ConnectedObservationsTester.cs | 26 +- .../TestScene/ConnectedPointsTester.cs | 22 +- Assets/Scripts/TestScene/MarkersTester.cs | 24 +- Assets/Scripts/TestScene/MeshTester.cs | 111 + Assets/Scripts/TestScene/MeshTester.cs.meta | 3 + .../Scripts/TestScene/TrackedObjectsTester.cs | 4 +- Assets/Scripts/UI/DataSourcesTreeWidget.cs | 10 +- Assets/Scripts/UI/HotkeysRouter.cs | 2 +- .../UI/ListBox/SpecialInfoListBoxItem.cs | 4 +- Assets/Scripts/UI/ObservationToolTip.cs | 14 +- Assets/Scripts/UI/ScaleWidget.cs | 2 +- Assets/Scripts/UI/SourceTreeButtons.cs | 26 +- Assets/Scripts/UI/SourceTreeElement.cs | 2 +- .../Scripts/UI/Windows/ObservationViewer.cs | 20 +- .../KMeansClusteringAlgorithm.cs | 2 +- .../PlanesDetectionAlgorithm.cs | 2 +- .../Commands/Generic/AddCommand.cs | 2 +- .../Commands/Generic/AddConnectionsCommand.cs | 2 +- .../Commands/Generic/ClearCommand.cs | 2 +- .../Generic/ConnectableClearCommand.cs | 2 +- .../Generic/ConnectableRemoveCommand.cs | 2 +- .../Commands/Generic/RemoveCommand.cs | 2 +- .../Generic/RemoveConnectionsCommand.cs | 2 +- .../Commands/Generic/UpdateCommand.cs | 2 +- .../TrackedObj/ClearTrackedObjsCommand.cs | 2 +- .../TrackedObj/RemoveTrackedObjsCommand.cs | 2 +- .../DataDiff/ConteinersDiffExt.cs | 2 +- .../Plugins.Common/DataDiff/ICloudItemDiff.cs | 2 +- .../Plugins.Common/DataDiff/SlamLineDiff.cs | 2 +- .../Plugins.Common/DataDiff/SlamMarkerDiff.cs | 2 +- .../DataDiff/SlamObservationDiff.cs | 2 +- .../Plugins.Common/DataDiff/SlamPlaneDiff.cs | 2 +- .../Plugins.Common/DataDiff/SlamPointDiff.cs | 2 +- .../DataDiff/SlamTrackedObjectDiff.cs | 2 +- .../OnlineOfflineBenchmark.cs | 2 +- .../Integration/Online/InfinitePlanesTests.cs | 2 +- .../Integration/Online/MarkersTests.cs | 2 +- .../Integration/Online/ObservationsTests.cs | 2 +- .../Integration/Online/OnlineTestsBase.cs | 3 +- .../Integration/Online/PointsTests.cs | 2 +- .../Integration/Online/SceneTests.cs | 2 +- .../Integration/Online/TrackedObjectsTests.cs | 2 +- .../Protobuf.Tests.Internal/RecorderTests.cs | 2 +- .../RetranslatorTests.cs | 2 +- plugins/Protobuf/Data/MapTypesExtensions.cs | 2 +- .../Protobuf/Data/ProtobufContainerTree.cs | 2 +- .../Protobuf/Offline/Parsers/ObjectsParser.cs | 2 +- .../Offline/Parsers/TrackedObjectsParser.cs | 2 +- .../Presenters/SlamDataInfoPresenter.cs | 2 +- .../Protobuf/Offline/ProtobufFilePlayer.cs | 18 +- .../ConnectableObjectsMapManager.cs | 2 +- .../Online/GrpcServices/LinesMapManager.cs | 2 +- .../Online/GrpcServices/MapManager.cs | 2 +- .../Online/GrpcServices/MarkersMapManager.cs | 2 +- .../GrpcServices/ObservationsMapManager.cs | 2 +- .../Online/GrpcServices/PlanesMapManager.cs | 2 +- .../Online/GrpcServices/PointsMapManager.cs | 2 +- .../GrpcServices/TrackedObjsMapManager.cs | 2 +- .../Recorders/EventArgsToProtobufExt.cs | 2 +- .../Protobuf/Recorders/ProtobufRecorder.cs | 2 +- .../Recorders/ProtobufRetranslator.cs | 2 +- plugins/Ros.Exporter/Program.cs | 22 +- plugins/Ros/Common/Containers/ImageDataExt.cs | 13 +- .../Ros/Common/Containers/ImagePresenter.cs | 4 +- plugins/Ros/Common/RosMessages/Marker.cs | 2 +- .../RosMessages/RosMessageConvertExtender.cs | 2 +- .../Ros/Bag/Parsers/MessageToCommandExt.cs | 4 +- plugins/Ros/Ros/Bag/RosbagContainerTree.cs | 2 +- .../Ros/Online/Handlers/OdometryHandler.cs | 2 +- .../Ros/Online/Handlers/PointCloud2Handler.cs | 2 +- .../Ros/Online/Handlers/PoseStampedHandler.cs | 2 +- .../Ros/Ros/Online/RosOnlineContainerTree.cs | 2 +- .../Bag/Containers/AddOrUpdateExtension.cs | 2 +- .../Ros2/Bag/Containers/ImageDBContainer.cs | 4 +- .../Ros2/Bag/Containers/PointsDBContainer.cs | 2 +- .../Ros2/Bag/Containers/TrackedDBContainer.cs | 2 +- .../VisualisationMarkersDBContainer.cs | 2 +- .../Ros/Ros2/Online/Handlers/ImageHandler.cs | 9 +- .../Ros2/Online/Handlers/OdometryHandler.cs | 2 +- .../Online/Handlers/PointCloud2Handler.cs | 2 +- .../Online/Handlers/PoseStampedHandler.cs | 2 +- plugins/Ros/Ros2/Online/MessageExt.cs | 2 +- .../Ros2/Online/Ros2OnlineContainerTree.cs | 2 +- 267 files changed, 4541 insertions(+), 1349 deletions(-) create mode 100644 Assets/Prefabs/UI/Axis View.prefab rename Assets/{Scripts/Data/PackageObjects.meta => Prefabs/UI/Axis View.prefab.meta} (57%) delete mode 100644 Assets/Scripts/Cameras/DisableAutoXR.cs delete mode 100644 Assets/Scripts/Cameras/DisableAutoXR.cs.meta delete mode 100644 Assets/Scripts/Data/PackageObjects/ICloudItem.cs delete mode 100644 Assets/Scripts/DataConsumers/CloudRenderers/Blocks/ICloudBlock.cs delete mode 100644 Assets/Scripts/DataConsumers/CloudRenderers/GPUItem.cs rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/Blocks.meta (100%) rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/Blocks/CloudBlock.cs (62%) rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/Blocks/CloudBlock.cs.meta (100%) create mode 100644 Assets/Scripts/DataConsumers/CloudRenderers/Renderers/GPU/Blocks/ICloudBlock.cs rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/Blocks/ICloudBlock.cs.meta (100%) rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/Blocks/LineCloudBlock.cs (70%) rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/Blocks/LineCloudBlock.cs.meta (100%) rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/Blocks/MarkerCloudBlock.cs (81%) rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/Blocks/MarkerCloudBlock.cs.meta (100%) rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/Blocks/MeshRendererBlock.cs (60%) rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/Blocks/MeshRendererBlock.cs.meta (100%) rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/Blocks/ObservationCloudBlock.cs (76%) rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/Blocks/ObservationCloudBlock.cs.meta (100%) rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/Blocks/PlaneCloudBlock.cs (71%) rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/Blocks/PlaneCloudBlock.cs.meta (100%) rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/Blocks/PointCloudBlock.cs (64%) rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/Blocks/PointCloudBlock.cs.meta (100%) rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/Blocks/TransparentMarkerCloudBlock.cs (63%) rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/Blocks/TransparentMarkerCloudBlock.cs.meta (100%) rename Assets/Scripts/DataConsumers/CloudRenderers/{ => Renderers/GPU}/GPUItem.cs.meta (100%) create mode 100644 Assets/Scripts/DataConsumers/CloudRenderers/Renderers/GPU/GpuItem.cs rename Assets/Scripts/DataConsumers/CloudRenderers/Renderers/{UnityComponents => GPU}/GpuMeshRenderer.cs (69%) rename Assets/Scripts/DataConsumers/CloudRenderers/Renderers/{UnityComponents => GPU}/GpuMeshRenderer.cs.meta (100%) delete mode 100644 Assets/Scripts/DataConsumers/CloudRenderers/Renderers/ICloudRenderer.cs delete mode 100644 Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/MarkerCloudRendererComponent.cs delete mode 100644 Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/SimpleLineCloudRendererComponent.cs delete mode 100644 Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/SlamLineCloudRendererComponent.cs create mode 100644 Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/Wrappers.meta rename Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/{ => Wrappers}/CloudRendererComponent.cs (71%) rename Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/{ => Wrappers}/CloudRendererComponent.cs.meta (100%) create mode 100644 Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/Wrappers/GpuMeshRendererComponent.cs create mode 100644 Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/Wrappers/GpuMeshRendererComponent.cs.meta create mode 100644 Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/Wrappers/MarkerCloudRendererComponent.cs rename Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/{ => Wrappers}/MarkerCloudRendererComponent.cs.meta (100%) rename Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/{ => Wrappers}/ObservationCloudRendererComponent.cs (66%) rename Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/{ => Wrappers}/ObservationCloudRendererComponent.cs.meta (100%) rename Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/{ => Wrappers}/OpaqueMarkerCloudRendererComponent.cs (62%) rename Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/{ => Wrappers}/OpaqueMarkerCloudRendererComponent.cs.meta (100%) rename Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/{ => Wrappers}/PlaneCloudRendererComponent.cs (59%) rename Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/{ => Wrappers}/PlaneCloudRendererComponent.cs.meta (100%) rename Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/{ => Wrappers}/PointCloudRendererComponent.cs (68%) rename Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/{ => Wrappers}/PointCloudRendererComponent.cs.meta (100%) create mode 100644 Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/Wrappers/SimpleLineCloudRendererComponent.cs rename Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/{ => Wrappers}/SimpleLineCloudRendererComponent.cs.meta (100%) create mode 100644 Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/Wrappers/SlamLineCloudRendererComponent.cs rename Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/{ => Wrappers}/SlamLineCloudRendererComponent.cs.meta (100%) rename Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/{ => Wrappers}/TransparentMarkerCloudRendererComponent.cs (65%) rename Assets/Scripts/DataConsumers/CloudRenderers/Renderers/UnityComponents/{ => Wrappers}/TransparentMarkerCloudRendererComponent.cs.meta (100%) create mode 100644 Assets/Scripts/DataConsumers/ICloudRenderer.cs rename Assets/Scripts/DataConsumers/{CloudRenderers/Renderers => }/ICloudRenderer.cs.meta (100%) create mode 100644 Assets/Scripts/DataConsumers/IScalable.cs create mode 100644 Assets/Scripts/DataConsumers/IScalable.cs.meta rename Assets/Scripts/{Data.meta => DataObjects.meta} (100%) create mode 100644 Assets/Scripts/DataObjects/ICloudItem.cs rename Assets/Scripts/{Data/PackageObjects => DataObjects}/ICloudItem.cs.meta (100%) rename Assets/Scripts/{Data/PackageObjects => DataObjects}/SimpleLine.cs (70%) rename Assets/Scripts/{Data/PackageObjects => DataObjects}/SimpleLine.cs.meta (100%) rename Assets/Scripts/{Data/PackageObjects => DataObjects}/SlamLine.cs (58%) rename Assets/Scripts/{Data/PackageObjects => DataObjects}/SlamLine.cs.meta (100%) rename Assets/Scripts/{Data/PackageObjects => DataObjects}/SlamMarker.cs (84%) rename Assets/Scripts/{Data/PackageObjects => DataObjects}/SlamMarker.cs.meta (100%) rename Assets/Scripts/{Data/PackageObjects => DataObjects}/SlamObservation.cs (71%) rename Assets/Scripts/{Data/PackageObjects => DataObjects}/SlamObservation.cs.meta (100%) rename Assets/Scripts/{Data/PackageObjects => DataObjects}/SlamPlane.cs (77%) rename Assets/Scripts/{Data/PackageObjects => DataObjects}/SlamPlane.cs.meta (100%) rename Assets/Scripts/{Data/PackageObjects => DataObjects}/SlamPoint.cs (56%) rename Assets/Scripts/{Data/PackageObjects => DataObjects}/SlamPoint.cs.meta (100%) rename Assets/Scripts/{Data/PackageObjects => DataObjects}/SlamTrackedObject.cs (80%) rename Assets/Scripts/{Data/PackageObjects => DataObjects}/SlamTrackedObject.cs.meta (100%) rename Assets/Scripts/DataSources/Containers/{ConnectableObjectsContainer.cs => ConnectableObjectsCloudContainer.cs} (82%) rename Assets/Scripts/DataSources/Containers/{ConnectableObjectsContainer.cs.meta => ConnectableObjectsCloudContainer.cs.meta} (100%) create mode 100644 Assets/Scripts/DataSources/Containers/ICloudContainer.cs rename Assets/Scripts/DataSources/Containers/{IContainer.cs.meta => ICloudContainer.cs.meta} (100%) create mode 100644 Assets/Scripts/DataSources/Containers/IConnectableObjectsCloudContainer.cs rename Assets/Scripts/DataSources/Containers/{IConnectableObjectsContainer.cs.meta => IConnectableObjectsCloudContainer.cs.meta} (100%) delete mode 100644 Assets/Scripts/DataSources/Containers/IConnectableObjectsContainer.cs delete mode 100644 Assets/Scripts/DataSources/Containers/IContainer.cs rename Assets/Scripts/DataSources/Containers/{ITrackedContainer.cs => ITrackedCloudContainer.cs} (67%) rename Assets/Scripts/DataSources/Containers/{ITrackedContainer.cs.meta => ITrackedCloudContainer.cs.meta} (100%) rename Assets/Scripts/DataSources/Containers/{SlamLinesContainer.cs => SlamLinesCloudContainer.cs} (94%) rename Assets/Scripts/DataSources/Containers/{SlamLinesContainer.cs.meta => SlamLinesCloudContainer.cs.meta} (100%) rename Assets/Scripts/DataSources/Containers/{TrackContainer.cs => TrackCloudContainer.cs} (89%) rename Assets/Scripts/DataSources/Containers/{TrackContainer.cs.meta => TrackCloudContainer.cs.meta} (100%) rename Assets/Scripts/DataSources/Containers/{TrackedObjectsContainer.cs => TrackedCloudObjectsContainer.cs} (91%) rename Assets/Scripts/DataSources/Containers/{TrackedObjectsContainer.cs.meta => TrackedCloudObjectsContainer.cs.meta} (100%) rename Assets/Scripts/DataSources/Containers/{VirtualSource.cs => VirtualDataSource.cs} (63%) rename Assets/Scripts/DataSources/Containers/{VirtualSource.cs.meta => VirtualDataSource.cs.meta} (100%) rename Assets/Scripts/DataSources/{ISourceTreeNode.cs => IDataSource.cs} (92%) rename Assets/Scripts/DataSources/{ISourceTreeNode.cs.meta => IDataSource.cs.meta} (100%) delete mode 100644 Assets/Scripts/DataSources/SpecialInterfaces/IClusterable.cs create mode 100644 Assets/Scripts/DataSources/SpecialInterfaces/IClusterableDataSource.cs rename Assets/Scripts/DataSources/SpecialInterfaces/{IClusterable.cs.meta => IClusterableDataSource.cs.meta} (100%) delete mode 100644 Assets/Scripts/DataSources/SpecialInterfaces/IColorful.cs create mode 100644 Assets/Scripts/DataSources/SpecialInterfaces/IColorfulDataSource.cs rename Assets/Scripts/DataSources/SpecialInterfaces/{IColorful.cs.meta => IColorfulDataSource.cs.meta} (100%) create mode 100644 Assets/Scripts/DataSources/SpecialInterfaces/IFilterableDataSource.cs rename Assets/Scripts/DataSources/SpecialInterfaces/{IWeightable.cs.meta => IFilterableDataSource.cs.meta} (100%) delete mode 100644 Assets/Scripts/DataSources/SpecialInterfaces/IFollowable.cs create mode 100644 Assets/Scripts/DataSources/SpecialInterfaces/IFollowableDataSource.cs rename Assets/Scripts/DataSources/SpecialInterfaces/{IFollowable.cs.meta => IFollowableDataSource.cs.meta} (100%) rename Assets/Scripts/DataSources/SpecialInterfaces/{ILookable.cs => ILookableDataSource.cs} (62%) rename Assets/Scripts/DataSources/SpecialInterfaces/{ILookable.cs.meta => ILookableDataSource.cs.meta} (100%) delete mode 100644 Assets/Scripts/DataSources/SpecialInterfaces/IRemovable.cs create mode 100644 Assets/Scripts/DataSources/SpecialInterfaces/IRemovableDataSource.cs rename Assets/Scripts/DataSources/SpecialInterfaces/{IRemovable.cs.meta => IRemovableDataSource.cs.meta} (100%) create mode 100644 Assets/Scripts/DataSources/SpecialInterfaces/ISavableDataSource.cs rename Assets/Scripts/DataSources/SpecialInterfaces/{ISave.cs.meta => ISavableDataSource.cs.meta} (100%) delete mode 100644 Assets/Scripts/DataSources/SpecialInterfaces/ISave.cs delete mode 100644 Assets/Scripts/DataSources/SpecialInterfaces/ITraceable.cs create mode 100644 Assets/Scripts/DataSources/SpecialInterfaces/ITraceableDataSource.cs rename Assets/Scripts/DataSources/SpecialInterfaces/{ITraceable.cs.meta => ITraceableDataSource.cs.meta} (100%) delete mode 100644 Assets/Scripts/DataSources/SpecialInterfaces/IVisible.cs create mode 100644 Assets/Scripts/DataSources/SpecialInterfaces/IVisibleDataSource.cs rename Assets/Scripts/DataSources/SpecialInterfaces/{IVisible.cs.meta => IVisibleDataSource.cs.meta} (100%) delete mode 100644 Assets/Scripts/DataSources/SpecialInterfaces/IWeightable.cs create mode 100644 Assets/Scripts/TestScene/MeshTester.cs create mode 100644 Assets/Scripts/TestScene/MeshTester.cs.meta diff --git a/Assets/Prefabs/Renderers.prefab b/Assets/Prefabs/Renderers.prefab index 75fa8be5..f0ba87f3 100644 --- a/Assets/Prefabs/Renderers.prefab +++ b/Assets/Prefabs/Renderers.prefab @@ -268,7 +268,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 20f39d247d024f7fb79a5a2be490a04b, type: 3} m_Name: m_EditorClassIdentifier: - Radius: 0.1 + RadiusMultiplier: 0.1 --- !u!1 &7296739703025488552 GameObject: m_ObjectHideFlags: 0 @@ -381,7 +381,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 4831ebbdf2404a5da28855483b9f4a06, type: 3} m_Name: m_EditorClassIdentifier: - Radius: 0 + RadiusMultiplier: 1 --- !u!1 &7296739703072376918 GameObject: m_ObjectHideFlags: 0 @@ -658,7 +658,7 @@ MonoBehaviour: m_GameObject: {fileID: 7296739703995181297} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: b77433a08e0343c49352697d56da2793, type: 3} + m_Script: {fileID: 11500000, guid: 5abcca8fa016405f8a439d3280564e3d, type: 3} m_Name: m_EditorClassIdentifier: Shaders: @@ -709,6 +709,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: CloudShader: {fileID: 4800000, guid: e44f975a7b184e5ea5a47c39935a3bbf, type: 3} + ItemSize: 0.5 --- !u!1 &7296739704005602618 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/UI/Axis View.prefab b/Assets/Prefabs/UI/Axis View.prefab new file mode 100644 index 00000000..29d6e195 --- /dev/null +++ b/Assets/Prefabs/UI/Axis View.prefab @@ -0,0 +1,2094 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &411310029954151517 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310029954151516} + - component: {fileID: 411310029954151518} + - component: {fileID: 411310029954151519} + - component: {fileID: 411310029954151505} + m_Layer: 0 + m_Name: +Y + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310029954151516 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310029954151517} + 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_Children: + - {fileID: 411310030812837871} + m_Father: {fileID: 411310031017541655} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &411310029954151518 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310029954151517} + m_CullTransparentMesh: 1 +--- !u!114 &411310029954151519 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310029954151517} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0.78431374, b: 0, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &411310029954151505 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310029954151517} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 411310029954151519} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &411310029985031978 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310029985031981} + - component: {fileID: 411310029985031983} + - component: {fileID: 411310029985031980} + - component: {fileID: 411310029985031982} + m_Layer: 0 + m_Name: -X + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310029985031981 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310029985031978} + 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_Children: [] + m_Father: {fileID: 411310031017541655} + m_RootOrder: 5 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &411310029985031983 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310029985031978} + m_CullTransparentMesh: 1 +--- !u!114 &411310029985031980 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310029985031978} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &411310029985031982 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310029985031978} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 411310029985031980} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &411310030293777006 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310030293776993} + - component: {fileID: 411310030293776994} + - component: {fileID: 411310030293776995} + - component: {fileID: 411310030293776992} + m_Layer: 0 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310030293776993 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030293777006} + 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_Children: [] + m_Father: {fileID: 411310031080072343} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &411310030293776994 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030293777006} + m_CullTransparentMesh: 1 +--- !u!114 &411310030293776995 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030293777006} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Z + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, 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: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 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: 1 + 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: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &411310030293776992 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030293777006} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 2 +--- !u!1 &411310030393183567 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310030393183566} + - component: {fileID: 411310030393183552} + - component: {fileID: 411310030393183553} + m_Layer: 0 + m_Name: X + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310030393183566 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030393183567} + 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_Children: [] + m_Father: {fileID: 411310031622043821} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &411310030393183552 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030393183567} + m_CullTransparentMesh: 1 +--- !u!114 &411310030393183553 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030393183567} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5b33b2e663e78774c9f0c9af55018725, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_improveResolution: 0 + m_Resolution: 0 + m_useNativeSize: 0 + m_points: + - {x: 0, y: 0} + - {x: 0, y: 0} + lineThickness: 2 + relativeSize: 0 + lineList: 0 + lineCaps: 0 + bezierSegmentsPerCurve: 10 + LineJoins: 0 + BezierMode: 0 + drivenExternally: 0 +--- !u!1 &411310030658893502 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310030658893489} + - component: {fileID: 411310030658893490} + - component: {fileID: 411310030658893491} + - component: {fileID: 411310030658893488} + m_Layer: 0 + m_Name: PositionLabel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310030658893489 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030658893502} + 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_Children: [] + m_Father: {fileID: 411310031452517680} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: -100} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 1} +--- !u!222 &411310030658893490 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030658893502} + m_CullTransparentMesh: 1 +--- !u!114 &411310030658893491 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030658893502} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: (-100.00, -100.00, -100.00) + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, 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: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 0 + 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: 1 + 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: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &411310030658893488 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030658893502} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 2 +--- !u!1 &411310030770446918 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310030770446937} + - component: {fileID: 411310030770446939} + - component: {fileID: 411310030770446936} + - component: {fileID: 411310030770446938} + m_Layer: 0 + m_Name: -Z + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310030770446937 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030770446918} + 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_Children: [] + m_Father: {fileID: 411310031017541655} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &411310030770446939 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030770446918} + m_CullTransparentMesh: 1 +--- !u!114 &411310030770446936 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030770446918} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &411310030770446938 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030770446918} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 411310030770446936} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &411310030812837868 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310030812837871} + - component: {fileID: 411310030812837856} + - component: {fileID: 411310030812837857} + - component: {fileID: 411310030812837870} + m_Layer: 0 + m_Name: Text (TMP) (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310030812837871 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030812837868} + 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_Children: [] + m_Father: {fileID: 411310029954151516} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &411310030812837856 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030812837868} + m_CullTransparentMesh: 1 +--- !u!114 &411310030812837857 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030812837868} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Y + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, 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: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 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: 1 + 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: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &411310030812837870 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030812837868} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 2 +--- !u!1 &411310030888669724 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310030888669727} + - component: {fileID: 411310030888669713} + - component: {fileID: 411310030888669726} + - component: {fileID: 411310030888669712} + m_Layer: 0 + m_Name: -Y + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310030888669727 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030888669724} + 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_Children: [] + m_Father: {fileID: 411310031017541655} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &411310030888669713 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030888669724} + m_CullTransparentMesh: 1 +--- !u!114 &411310030888669726 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030888669724} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0.78431374, b: 0, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &411310030888669712 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030888669724} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 411310030888669726} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &411310030934299952 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310030934299955} + - component: {fileID: 411310030934299957} + - component: {fileID: 411310030934299954} + m_Layer: 0 + m_Name: Z + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310030934299955 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030934299952} + 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_Children: [] + m_Father: {fileID: 411310031622043821} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &411310030934299957 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030934299952} + m_CullTransparentMesh: 1 +--- !u!114 &411310030934299954 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030934299952} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5b33b2e663e78774c9f0c9af55018725, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_improveResolution: 0 + m_Resolution: 0 + m_useNativeSize: 0 + m_points: + - {x: 0, y: 0} + - {x: 0, y: 0} + lineThickness: 2 + relativeSize: 0 + lineList: 0 + lineCaps: 0 + bezierSegmentsPerCurve: 10 + LineJoins: 0 + BezierMode: 0 + drivenExternally: 0 +--- !u!1 &411310030939651142 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310030939651161} + - component: {fileID: 411310030939651163} + - component: {fileID: 411310030939651160} + - component: {fileID: 411310030939651162} + m_Layer: 0 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310030939651161 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030939651142} + 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_Children: [] + m_Father: {fileID: 411310031501749635} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 10, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 1, y: 0.5} +--- !u!222 &411310030939651163 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030939651142} + m_CullTransparentMesh: 1 +--- !u!114 &411310030939651160 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030939651142} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Persp + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 1f50e686876162448a97c5de561725d5, type: 2} + m_sharedMaterial: {fileID: -8607631598616168397, guid: 1f50e686876162448a97c5de561725d5, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, 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: 16 + m_fontSizeBase: 16 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 4 + 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_enableWordWrapping: 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: 1 + 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: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &411310030939651162 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310030939651142} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 2 +--- !u!1 &411310031017541652 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310031017541655} + m_Layer: 0 + m_Name: Buttons + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310031017541655 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031017541652} + 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_Children: + - {fileID: 411310030770446937} + - {fileID: 411310031080072343} + - {fileID: 411310029954151516} + - {fileID: 411310030888669727} + - {fileID: 411310031330511976} + - {fileID: 411310029985031981} + m_Father: {fileID: 411310031452517680} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &411310031080072340 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310031080072343} + - component: {fileID: 411310031080072361} + - component: {fileID: 411310031080072342} + - component: {fileID: 411310031080072360} + m_Layer: 0 + m_Name: +Z + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310031080072343 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031080072340} + 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_Children: + - {fileID: 411310030293776993} + m_Father: {fileID: 411310031017541655} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &411310031080072361 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031080072340} + m_CullTransparentMesh: 1 +--- !u!114 &411310031080072342 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031080072340} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &411310031080072360 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031080072340} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 411310031080072342} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &411310031330511977 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310031330511976} + - component: {fileID: 411310031330511978} + - component: {fileID: 411310031330511979} + - component: {fileID: 411310031330511981} + m_Layer: 0 + m_Name: +X + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310031330511976 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031330511977} + 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_Children: + - {fileID: 411310031692615786} + m_Father: {fileID: 411310031017541655} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &411310031330511978 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031330511977} + m_CullTransparentMesh: 1 +--- !u!114 &411310031330511979 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031330511977} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 0, b: 0, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10913, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &411310031330511981 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031330511977} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 411310031330511979} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!1 &411310031452517681 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310031452517680} + - component: {fileID: 411310031452517683} + m_Layer: 0 + m_Name: Axis View + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310031452517680 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031452517681} + 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_Children: + - {fileID: 411310030658893489} + - {fileID: 411310031622043821} + - {fileID: 411310031017541655} + - {fileID: 411310031501749635} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 150, y: 100} + m_Pivot: {x: 1, y: 1} +--- !u!114 &411310031452517683 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031452517681} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7b62a3f08bf942f9a1c3788d35d93cc1, type: 3} + m_Name: + m_EditorClassIdentifier: + RotationTime: 1 + Scale: 35 + MarkerSize: 20 + ShowCoordinates: 1 + AxisLabels: + - {fileID: 411310030770446937} + - {fileID: 411310031080072343} + - {fileID: 411310029954151516} + - {fileID: 411310030888669727} + - {fileID: 411310031330511976} + - {fileID: 411310029985031981} + PositionLabel: {fileID: 411310030658893491} + XLine: {fileID: 411310030393183553} + YLine: {fileID: 411310032033445360} + ZLine: {fileID: 411310030934299954} +--- !u!1 &411310031501749632 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310031501749635} + - component: {fileID: 411310031501749636} + - component: {fileID: 411310031501749637} + - component: {fileID: 411310031501749634} + - component: {fileID: 411310031501749639} + m_Layer: 0 + m_Name: Projection + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310031501749635 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031501749632} + 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_Children: + - {fileID: 411310030939651161} + - {fileID: 411310031625170436} + m_Father: {fileID: 411310031452517680} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -85} + m_SizeDelta: {x: 100, y: 35} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &411310031501749636 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031501749632} + m_CullTransparentMesh: 1 +--- !u!114 &411310031501749637 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031501749632} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &411310031501749634 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031501749632} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 0 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 0} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 0.39215687} + m_PressedColor: {r: 1, g: 1, b: 1, a: 0.78431374} + m_SelectedColor: {r: 1, g: 1, b: 1, a: 0.39215687} + m_DisabledColor: {r: 1, g: 1, b: 1, a: 0} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 411310031501749637} + m_OnClick: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &411310031501749639 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031501749632} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 56ed278f0bbb47c1abd23ff94c76dcd6, type: 3} + m_Name: + m_EditorClassIdentifier: + Button: {fileID: 411310031501749634} + Icon: {fileID: 411310031625170438} + Label: {fileID: 411310030939651160} + PerspectiveText: Persp + OrthographicText: Ortho + PerspectiveSprite: {fileID: 21300000, guid: 03e1d26bb3bda4448a56d251806e45e7, type: 3} + OrthographicSprite: {fileID: 21300000, guid: 9a55f781fea5c2240a207032493f395b, type: 3} +--- !u!1 &411310031622043818 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310031622043821} + m_Layer: 0 + m_Name: Lines + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310031622043821 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031622043818} + 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_Children: + - {fileID: 411310030934299955} + - {fileID: 411310032033445361} + - {fileID: 411310030393183566} + m_Father: {fileID: 411310031452517680} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &411310031625170437 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310031625170436} + - component: {fileID: 411310031625170457} + - component: {fileID: 411310031625170438} + - component: {fileID: 411310031625170439} + m_Layer: 0 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310031625170436 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031625170437} + 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_Children: [] + m_Father: {fileID: 411310031501749635} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 20, y: 0} + m_SizeDelta: {x: 24, y: 24} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &411310031625170457 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031625170437} + m_CullTransparentMesh: 1 +--- !u!114 &411310031625170438 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031625170437} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 03e1d26bb3bda4448a56d251806e45e7, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!114 &411310031625170439 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031625170437} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreLayout: 0 + m_MinWidth: 32 + m_MinHeight: 32 + m_PreferredWidth: 32 + m_PreferredHeight: 32 + m_FlexibleWidth: -1 + m_FlexibleHeight: -1 + m_LayoutPriority: 1 +--- !u!1 &411310031692615787 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310031692615786} + - component: {fileID: 411310031692615791} + - component: {fileID: 411310031692615788} + - component: {fileID: 411310031692615789} + m_Layer: 0 + m_Name: Text (TMP) (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310031692615786 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031692615787} + 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_Children: [] + m_Father: {fileID: 411310031330511976} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &411310031692615791 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031692615787} + m_CullTransparentMesh: 1 +--- !u!114 &411310031692615788 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031692615787} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: X + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, 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: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 1 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 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: 1 + 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: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!114 &411310031692615789 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310031692615787} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 2 + m_VerticalFit: 2 +--- !u!1 &411310032033445374 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 411310032033445361} + - component: {fileID: 411310032033445363} + - component: {fileID: 411310032033445360} + m_Layer: 0 + m_Name: Y + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &411310032033445361 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310032033445374} + 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_Children: [] + m_Father: {fileID: 411310031622043821} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &411310032033445363 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310032033445374} + m_CullTransparentMesh: 1 +--- !u!114 &411310032033445360 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 411310032033445374} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5b33b2e663e78774c9f0c9af55018725, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0.78431374, b: 0, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_improveResolution: 0 + m_Resolution: 0 + m_useNativeSize: 0 + m_points: + - {x: 0, y: 0} + - {x: 0, y: 0} + lineThickness: 2 + relativeSize: 0 + lineList: 0 + lineCaps: 0 + bezierSegmentsPerCurve: 10 + LineJoins: 0 + BezierMode: 0 + drivenExternally: 0 diff --git a/Assets/Scripts/Data/PackageObjects.meta b/Assets/Prefabs/UI/Axis View.prefab.meta similarity index 57% rename from Assets/Scripts/Data/PackageObjects.meta rename to Assets/Prefabs/UI/Axis View.prefab.meta index 88be3d14..f04037e3 100644 --- a/Assets/Scripts/Data/PackageObjects.meta +++ b/Assets/Prefabs/UI/Axis View.prefab.meta @@ -1,7 +1,6 @@ fileFormatVersion: 2 -guid: f9e59e314559e114d9452a9b35920d8c -folderAsset: yes -DefaultImporter: +guid: 0e05f52b5329b734da94d30d40e40d1f +PrefabImporter: externalObjects: {} userData: assetBundleName: diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity index 5305e64f..8fdd6889 100644 --- a/Assets/Scenes/Main.unity +++ b/Assets/Scenes/Main.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:54aeb9bf65d13ae80b1691a26b8cec633b9ab151cdf31278c592e33a32f7db96 -size 570810 +oid sha256:eb01a4e8368044914f5e09a12a1f509ef467b26f8e591bbfbf7b90bdf9e0ac51 +size 570640 diff --git a/Assets/Scenes/Test scene.unity b/Assets/Scenes/Test scene.unity index 6307d8f0..06088db1 100644 --- a/Assets/Scenes/Test scene.unity +++ b/Assets/Scenes/Test scene.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6929d7c4d24dc01284259d4754cc7f97fe4a88f815ce248a2e4a9c076ea10c51 -size 17899 +oid sha256:71d46d53a1cd5c4257f84dae33091944656992d678571febddbb34a721e92c8f +size 19125 diff --git a/Assets/Scripts/Cameras/CameraOrientationWidget2D.cs b/Assets/Scripts/Cameras/CameraOrientationWidget2D.cs index 0387ce77..a9658a69 100644 --- a/Assets/Scripts/Cameras/CameraOrientationWidget2D.cs +++ b/Assets/Scripts/Cameras/CameraOrientationWidget2D.cs @@ -1,4 +1,5 @@ using System.Collections; +using System.Linq; using TMPro; using UniRx; using UnityEngine; @@ -7,43 +8,56 @@ namespace Elektronik.Cameras { - public class CameraOrientationWidget2D : MonoBehaviour + /// This component controls widget that shows camera orientation. + internal sealed class CameraOrientationWidget2D : MonoBehaviour { - [Range(0, 5)] public float RotationTime = 1; - [Range(0, 100)] public float Scale = 15; - [Range(0, 30)] public float MarkerSize = 20; - [SerializeField] private RectTransform[] AxisLabels = new RectTransform[6]; - public TMP_Text PositionLabel; - public UILineRenderer XLine; - public UILineRenderer YLine; - public UILineRenderer ZLine; - public bool ShowCoordinates = true; - private Transform _camera; - private bool _rotating; + #region Editor fields + + /// Time interval for camera alignment animation. + [Header("Settings")] [Range(0, 5)] [SerializeField] [Tooltip("Time interval for camera alignment animation.")] + private float RotationTime = 1; + + /// Length of axis lines in widget. + [Range(0, 100)] [SerializeField] [Tooltip("Length of axis lines in widget.")] + private float Scale = 15; + + /// Size of marker with axis name. + [Range(0, 30)] [SerializeField] [Tooltip("Size of marker with axis name.")] + private float MarkerSize = 20; + + [SerializeField] private bool ShowCoordinates = true; + + [Header("Objects")] [SerializeField] private RectTransform[] AxisLabels = new RectTransform[6]; + [SerializeField] private TMP_Text PositionLabel; + [SerializeField] private UILineRenderer XLine; + [SerializeField] private UILineRenderer YLine; + [SerializeField] private UILineRenderer ZLine; + + #endregion + + #region Unity events private void Start() { _camera = Camera.main.transform; ShowCoordinates = ShowCoordinates && (PositionLabel != null); - - AxisLabels[0].GetComponent