From ba624f7872826eca47595c7994028487c0bccfc3 Mon Sep 17 00:00:00 2001 From: Sylvain Renault Date: Tue, 28 Jun 2022 17:53:02 +0200 Subject: [PATCH 01/18] Now one keyvalue can be given. Main window: filtering by value for key "Group". --- .../Editor/Windows/TrackableWindow.cs | 54 +++--- .../Editor/Windows/WorldAnchorWindow.cs | 45 ++--- .../Editor/Windows/WorldLinkWindow.cs | 83 ++++++--- .../Editor/Windows/WorldStorageWindow.cs | 74 ++++++-- UserSettings/Layouts/default-2021.dwlt | 172 +++++++++--------- 5 files changed, 256 insertions(+), 172 deletions(-) diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs index f6da0d8..3a361a8 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs @@ -60,6 +60,8 @@ namespace ETSI.ARF.WorldStorage.UI Vector3 localCRS_rot; byte[] trackablePayload = new byte[1] { 0 }; [SerializeField] Dictionary> keyValueTags = new Dictionary>(); + string key1 = ""; + string value1 = ""; // UI stuffs private Vector2 scrollPos; @@ -120,14 +122,14 @@ namespace ETSI.ARF.WorldStorage.UI #endif EditorGUILayout.Space(); - GUI.backgroundColor = WorldStorageWindow.arfColors[1]; - if (GUILayout.Button("Read Parameters")) - { - UUID = WorldStorageWindow.GetUUIDFromString(customName); - if (UUID == null) UUID = customName; // try this - GetTrackableParams(); - } - GUI.backgroundColor = ori; + //GUI.backgroundColor = WorldStorageWindow.arfColors[1]; + //if (GUILayout.Button("Read Parameters")) + //{ + // UUID = WorldStorageWindow.GetUUIDFromString(customName); + // if (UUID == null) UUID = customName; // try this + // GetTrackableParams(); + //} + //GUI.backgroundColor = ori; type = (Trackable.TrackableTypeEnum)EditorGUILayout.EnumPopup("Trackable Type:", type); unit = (UnitSystem)EditorGUILayout.EnumPopup("Unit System:", unit); @@ -137,8 +139,8 @@ namespace ETSI.ARF.WorldStorage.UI EditorGUILayout.Space(10); GUILayout.Label("Local CRS:"); - localCRS_pos = EditorGUILayout.Vector3Field("Position:", localCRS_pos); - localCRS_rot = EditorGUILayout.Vector3Field("Rotation:", localCRS_rot); + localCRS_pos = EditorGUILayout.Vector3Field(" Position:", localCRS_pos); + localCRS_rot = EditorGUILayout.Vector3Field(" Rotation:", localCRS_rot); EditorGUILayout.Space(); if (GUILayout.Button("Generate Dummy Payload")) @@ -153,25 +155,10 @@ namespace ETSI.ARF.WorldStorage.UI EditorGUILayout.Space(); groupEnabled = EditorGUILayout.BeginToggleGroup("Optional Parameters:", groupEnabled); - //EditorGUILayout.IntField("Number of KeyValues", 0); - //EditorGUILayout.Space(); - //EditorGUILayout.TextField("Key", ""); - //EditorGUILayout.TextField("Value", ""); - if (GUILayout.Button("Generate Dummy Key Values")) - { - // dummy - keyValueTags.Clear(); - keyValueTags.Add("Location", new List { "Room1" }); - } - // Test - //keyValueTags.Add("1", "a"); - //ScriptableObject target = this; - //SerializedObject so = new SerializedObject(target); - //SerializedProperty stringsProperty = so.FindProperty("trackables"); - //EditorGUILayout.PropertyField(stringsProperty, true); // True means show children - //so.ApplyModifiedProperties(); // Remember to apply modified properties + key1 = EditorGUILayout.TextField("Key 1", key1); + value1 = EditorGUILayout.TextField("Value 1", value1); EditorGUILayout.EndToggleGroup(); - + // GUILayout.EndVertical(); // ########################################################### @@ -252,7 +239,12 @@ namespace ETSI.ARF.WorldStorage.UI localCRS_pos = Vector3.zero; localCRS_rot = Vector3.zero; } - keyValueTags = obj.KeyvalueTags; + + // Read a key value (demo) + var first = WorldStorageWindow.GetFirstKeyValueTags(obj.KeyvalueTags); + key1 = first.Item1; + value1 = first.Item2; + this.Repaint(); // TODO } @@ -281,6 +273,10 @@ namespace ETSI.ARF.WorldStorage.UI localCRS.m30, localCRS.m31, localCRS.m32, localCRS.m33, }; + // Create a key value (one from demo) + keyValueTags.Clear(); + keyValueTags.Add(key1, new List { value1 }); + System.Guid _uuid = System.Guid.Parse(UUID); System.Guid _creator = System.Guid.Parse(worldStorageUser.UUID); Trackable t = new Trackable(_uuid, customName, _creator, type, trackableEncodingInformation, trackablePayload, _localCRS, unit, _trackableSize, keyValueTags); diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldAnchorWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldAnchorWindow.cs index ae8f0c3..5eddea4 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldAnchorWindow.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldAnchorWindow.cs @@ -57,6 +57,8 @@ namespace ETSI.ARF.WorldStorage.UI Vector3 localCRS_pos; Vector3 localCRS_rot; [SerializeField] Dictionary> keyValueTags = new Dictionary>(); + string key1 = ""; + string value1 = ""; // UI stuffs private Vector2 scrollPos; @@ -117,14 +119,14 @@ namespace ETSI.ARF.WorldStorage.UI #endif EditorGUILayout.Space(); - GUI.backgroundColor = WorldStorageWindow.arfColors[1]; - if (GUILayout.Button("Read Parameters")) - { - UUID = WorldStorageWindow.GetUUIDFromString(customName); - if (UUID == null) UUID = customName; // try this - GetWorldAnchorParams(); - } - GUI.backgroundColor = ori; + //GUI.backgroundColor = WorldStorageWindow.arfColors[1]; + //if (GUILayout.Button("Read Parameters")) + //{ + // UUID = WorldStorageWindow.GetUUIDFromString(customName); + // if (UUID == null) UUID = customName; // try this + // GetWorldAnchorParams(); + //} + //GUI.backgroundColor = ori; unit = (UnitSystem)EditorGUILayout.EnumPopup("Unit System:", unit); @@ -133,21 +135,13 @@ namespace ETSI.ARF.WorldStorage.UI EditorGUILayout.Space(10); GUILayout.Label("Local CRS:"); - localCRS_pos = EditorGUILayout.Vector3Field("Position:", localCRS_pos); - localCRS_rot = EditorGUILayout.Vector3Field("Rotation:", localCRS_rot); + localCRS_pos = EditorGUILayout.Vector3Field(" Position:", localCRS_pos); + localCRS_rot = EditorGUILayout.Vector3Field(" Rotation:", localCRS_rot); EditorGUILayout.Space(); groupEnabled = EditorGUILayout.BeginToggleGroup("Optional Parameters:", groupEnabled); - //EditorGUILayout.IntField("Number of KeyValues", 0); - //EditorGUILayout.Space(); - //EditorGUILayout.TextField("Key", ""); - //EditorGUILayout.TextField("Value", ""); - if (GUILayout.Button("Generate Dummy Key Values")) - { - // dummy - keyValueTags.Clear(); - keyValueTags.Add("Location", new List { "Room1" }); - } + key1 = EditorGUILayout.TextField("Key 1", key1); + value1 = EditorGUILayout.TextField("Value 1", value1); EditorGUILayout.EndToggleGroup(); // GUILayout.EndVertical(); @@ -228,7 +222,12 @@ namespace ETSI.ARF.WorldStorage.UI localCRS_pos = Vector3.zero; localCRS_rot = Vector3.zero; } - keyValueTags = obj.KeyvalueTags; + + // Read a key value (demo) + var first = WorldStorageWindow.GetFirstKeyValueTags(obj.KeyvalueTags); + key1 = first.Item1; + value1 = first.Item2; + this.Repaint(); // TODO } @@ -254,6 +253,10 @@ namespace ETSI.ARF.WorldStorage.UI localCRS.m30, localCRS.m31, localCRS.m32, localCRS.m33, }; + // Create a key value (one from demo) + keyValueTags.Clear(); + keyValueTags.Add(key1, new List { value1 }); + System.Guid _uuid = System.Guid.Parse(UUID); System.Guid _creator = System.Guid.Parse(worldStorageUser.UUID); WorldAnchor t = new WorldAnchor(_uuid, customName, _creator, _localCRS, unit, _worldAnchorSize, keyValueTags); diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldLinkWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldLinkWindow.cs index 039ca12..05971e7 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldLinkWindow.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldLinkWindow.cs @@ -120,36 +120,49 @@ namespace ETSI.ARF.WorldStorage.UI EditorGUILayout.Space(); //GUILayout.BeginHorizontal(); - customName = EditorGUILayout.TextField("Name of Link", customName); + //customName = EditorGUILayout.TextField("Name of Link", customName); #if isDEBUG GUILayout.Label("UUID: " + UUID, EditorStyles.miniLabel); // readonly GUILayout.Label("Creator UID: " + creatorUUID, EditorStyles.miniLabel); // readonly #endif EditorGUILayout.Space(); - GUI.backgroundColor = WorldStorageWindow.arfColors[1]; - if (GUILayout.Button("Read Parameters")) - { - UUID = WorldStorageWindow.GetUUIDFromString(customName); - if (UUID == null) UUID = customName; // try this - GetWorldLinkParams(); - } - GUI.backgroundColor = ori; - - unit = (UnitSystem)EditorGUILayout.EnumPopup("Unit System:", unit); EditorGUILayout.Space(); - showListFrom = EditorGUILayout.Foldout(showListFrom, "Parent Object (From)"); + showListFrom = EditorGUILayout.Foldout(showListFrom, "From (parent object)"); if (showListFrom) { EditorGUILayout.BeginHorizontal(); - fromUUID = EditorGUILayout.TextField("UUID", fromUUID); + string lastFromUUID = fromUUID; + fromUUID = EditorGUILayout.TextField("Enter a valid UUID:", fromUUID); GUI.backgroundColor = WorldStorageWindow.arfColors[1]; - if (GUILayout.Button("Find", EditorStyles.miniButtonLeft, miniButtonWidth)) + if (GUILayout.Button("Request", EditorStyles.miniButtonLeft, miniButtonWidth) || lastFromUUID != fromUUID) { - // TODO Request the object from the server - fromName = "(not implemented yet)"; - fromType = ObjectType.NotIdentified; + bool found = false; + try + { + Trackable result = TrackableRequest.GetTrackable(worldStorageServer, fromUUID); + fromName = result.Name; + fromType = ObjectType.Trackable; + found = true; + } + catch { /* Object was not found */ } + + if (!found) + try + { + WorldAnchor result = WorldAnchorRequest.GetWorldAnchor(worldStorageServer, fromUUID); + fromName = result.Name; + fromType = ObjectType.WorldAnchor; + found = true; + } + catch { /* Object was not found */ } + + if (!found) + { + fromName = ""; + fromType = ObjectType.NotIdentified; + } } EditorGUILayout.EndHorizontal(); GUI.backgroundColor = ori; @@ -158,17 +171,40 @@ namespace ETSI.ARF.WorldStorage.UI } EditorGUILayout.Space(); - showListTo = EditorGUILayout.Foldout(showListTo, "Child Object (To)"); + showListTo = EditorGUILayout.Foldout(showListTo, "To (child object)"); if (showListTo) { EditorGUILayout.BeginHorizontal(); - toUUID = EditorGUILayout.TextField("UUID", toUUID); + string lastToUUID = fromUUID; + toUUID = EditorGUILayout.TextField("Eenter a valid UUID:", toUUID); GUI.backgroundColor = WorldStorageWindow.arfColors[1]; - if (GUILayout.Button("Find", EditorStyles.miniButtonLeft, miniButtonWidth)) + if (GUILayout.Button("Request", EditorStyles.miniButtonLeft, miniButtonWidth) || lastToUUID != toUUID) { - // TODO Request the object from the server - toName = "(not implemented yet)"; - toType = ObjectType.NotIdentified; + bool found = false; + try + { + Trackable result = TrackableRequest.GetTrackable(worldStorageServer, toUUID); + toName = result.Name; + toType = ObjectType.Trackable; + found = true; + } + catch { /* Object was not found */ } + + if (!found) + try + { + WorldAnchor result = WorldAnchorRequest.GetWorldAnchor(worldStorageServer, toUUID); + toName = result.Name; + toType = ObjectType.WorldAnchor; + found = true; + } + catch { /* Object was not found */ } + + if (!found) + { + toName = ""; + toType = ObjectType.NotIdentified; + } } EditorGUILayout.EndHorizontal(); GUI.backgroundColor = ori; @@ -177,6 +213,7 @@ namespace ETSI.ARF.WorldStorage.UI } EditorGUILayout.Space(10); + unit = (UnitSystem)EditorGUILayout.EnumPopup("Unit System:", unit); GUILayout.Label("Local CRS:"); localCRS_pos = EditorGUILayout.Vector3Field("Position:", localCRS_pos); localCRS_rot = EditorGUILayout.Vector3Field("Rotation:", localCRS_rot); diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldStorageWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldStorageWindow.cs index d983045..490ff31 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldStorageWindow.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldStorageWindow.cs @@ -64,6 +64,8 @@ namespace ETSI.ARF.WorldStorage.UI private bool showListT = true; private bool showListA = true; private bool showListL = true; + + private string filterByKeyValueTag = ""; static public string winName = "ARF Authoring Editor"; static public Color[] arfColors = new Color[] @@ -92,7 +94,7 @@ namespace ETSI.ARF.WorldStorage.UI { // Title GUILayout.Label("Augmented Reality Framework", EditorStyles.boldLabel); - GUILayout.Label("Copyright(c) 2022, ETSI (BSD 3-Clause License)"); + GUILayout.Label("Copyright (C) 2022, ETSI (BSD 3-Clause License)"); } void OnGUI() @@ -195,6 +197,17 @@ namespace ETSI.ARF.WorldStorage.UI so.ApplyModifiedProperties(); // Remember to apply modified properties #endregion + EditorGUILayout.Space(10); + GUILayout.Label("World Storage Elements", EditorStyles.whiteLargeLabel); + + // ########################################################### + // Handle Key Values + // ########################################################### + #region Filter + EditorGUILayout.Space(10); + filterByKeyValueTag = EditorGUILayout.TextField("Filter Value (Key = Group):", filterByKeyValueTag); + #endregion + // ########################################################### // Handle trackables // ########################################################### @@ -248,15 +261,17 @@ namespace ETSI.ARF.WorldStorage.UI { EditorGUILayout.BeginHorizontal(); EditorGUILayout.PropertyField(stringsProperty.GetArrayElementAtIndex(i)); - //EditorGUILayout.PropertyField(list.GetArrayElementAtIndex(i), GUIContent.none); string UUID = WorldStorageWindow.GetUUIDFromString(stringsProperty.GetArrayElementAtIndex(i).stringValue); if (UUID == null) UUID = trackables[i]; // try this if (GUILayout.Button("-", EditorStyles.miniButtonLeft, miniButtonWidth)) { - TrackableRequest.DeleteTrackable(worldStorageServer, UUID); - WorldStorageWindowSingleton.GetTrackables(); - WorldStorageWindowSingleton.Repaint(); + if (EditorUtility.DisplayDialog("Delete", "Are you sure you want to delete this element?", "Delete", "Cancel")) + { + TrackableRequest.DeleteTrackable(worldStorageServer, UUID); + WorldStorageWindowSingleton.GetTrackables(); + WorldStorageWindowSingleton.Repaint(); + } } if (GUILayout.Button("Edit...", EditorStyles.miniButtonLeft, buttonWidth)) { @@ -321,15 +336,17 @@ namespace ETSI.ARF.WorldStorage.UI { EditorGUILayout.BeginHorizontal(); EditorGUILayout.PropertyField(stringsProperty.GetArrayElementAtIndex(i)); - //EditorGUILayout.PropertyField(list.GetArrayElementAtIndex(i), GUIContent.none); string UUID = WorldStorageWindow.GetUUIDFromString(stringsProperty.GetArrayElementAtIndex(i).stringValue); if (UUID == null) UUID = anchors[i]; // try this if (GUILayout.Button("-", EditorStyles.miniButtonLeft, miniButtonWidth)) { - WorldAnchorRequest.DeleteWorldAnchor(worldStorageServer, UUID); - WorldStorageWindowSingleton.GetWorldAnchors(); - WorldStorageWindowSingleton.Repaint(); + if (EditorUtility.DisplayDialog("Delete", "Are you sure you want to delete this element?", "Delete", "Cancel")) + { + WorldAnchorRequest.DeleteWorldAnchor(worldStorageServer, UUID); + WorldStorageWindowSingleton.GetWorldAnchors(); + WorldStorageWindowSingleton.Repaint(); + } } if (GUILayout.Button("Edit...", EditorStyles.miniButtonLeft, buttonWidth)) { @@ -394,16 +411,19 @@ namespace ETSI.ARF.WorldStorage.UI { EditorGUILayout.BeginHorizontal(); EditorGUILayout.PropertyField(stringsProperty.GetArrayElementAtIndex(i)); - //EditorGUILayout.PropertyField(list.GetArrayElementAtIndex(i), GUIContent.none); string UUID = WorldStorageWindow.GetUUIDFromString(stringsProperty.GetArrayElementAtIndex(i).stringValue); if (UUID == null) UUID = links[i]; // try this if (GUILayout.Button("-", EditorStyles.miniButtonLeft, miniButtonWidth)) { - WorldLinkRequest.DeleteWorldLink(worldStorageServer, UUID); - WorldStorageWindowSingleton.GetWorldLinks(); - WorldStorageWindowSingleton.Repaint(); + if (EditorUtility.DisplayDialog("Delete", "Are you sure you want to delete this element?", "Delete", "Cancel")) + { + WorldLinkRequest.DeleteWorldLink(worldStorageServer, UUID); + WorldStorageWindowSingleton.GetWorldLinks(); + WorldStorageWindowSingleton.Repaint(); + } } + if (GUILayout.Button("Edit...", EditorStyles.miniButtonLeft, buttonWidth)) { Debug.Log("Open Link Window"); @@ -444,6 +464,24 @@ namespace ETSI.ARF.WorldStorage.UI } } + static public (string, string) GetFirstKeyValueTags(Dictionary> dict) + { + if (dict.Count >= 1) + { + // Get the first value in account (demo) + foreach (var item in dict) + { + string key1 = item.Key; + if (item.Value.Count >= 1) + { + string value1 = item.Value[0]; + return (key1, value1); + } + } + } + return ("", ""); + } + public void GetTrackables() { // Get all objects @@ -452,6 +490,11 @@ namespace ETSI.ARF.WorldStorage.UI trackables.Clear(); foreach (var item in res) { + if (filterByKeyValueTag != "") + { + var first = GetFirstKeyValueTags(item.KeyvalueTags); + if (first.Item1.ToLower() != "group" || first.Item2 != filterByKeyValueTag) continue; + } if (!string.IsNullOrEmpty(item.Name)) trackables.Add(item.Name + " [" + item.UUID.ToString() + "]"); else trackables.Add(item.UUID.ToString()); } @@ -465,6 +508,11 @@ namespace ETSI.ARF.WorldStorage.UI anchors.Clear(); foreach (var item in res) { + if (filterByKeyValueTag != "") + { + var first = GetFirstKeyValueTags(item.KeyvalueTags); + if (first.Item1.ToLower() != "group" || first.Item2 != filterByKeyValueTag) continue; + } if (!string.IsNullOrEmpty(item.Name)) anchors.Add(item.Name + " [" + item.UUID.ToString() + "]"); else anchors.Add(item.UUID.ToString()); } diff --git a/UserSettings/Layouts/default-2021.dwlt b/UserSettings/Layouts/default-2021.dwlt index 6907351..11c68c0 100644 --- a/UserSettings/Layouts/default-2021.dwlt +++ b/UserSettings/Layouts/default-2021.dwlt @@ -14,16 +14,16 @@ MonoBehaviour: m_EditorClassIdentifier: m_PixelRect: serializedVersion: 2 - x: 12.888889 - y: 72 - width: 1365.3334 - height: 935.11115 + x: 0 + y: 42.22222 + width: 1706.6666 + height: 984.44446 m_ShowMode: 4 - m_Title: Inspector + m_Title: Project m_RootView: {fileID: 8} m_MinSize: {x: 875, y: 300} m_MaxSize: {x: 10000, y: 10000} - m_Maximized: 0 + m_Maximized: 1 --- !u!114 &2 MonoBehaviour: m_ObjectHideFlags: 52 @@ -39,12 +39,12 @@ MonoBehaviour: m_Children: [] m_Position: serializedVersion: 2 - x: 469.33334 + x: 557.3333 y: 0 - width: 534.22217 - height: 350 - m_MinSize: {x: 102, y: 121} - m_MaxSize: {x: 4002, y: 4021} + width: 632.88885 + height: 369.55554 + m_MinSize: {x: 100, y: 100} + m_MaxSize: {x: 4000, y: 4000} m_ActualView: {fileID: 20} m_Panes: - {fileID: 20} @@ -68,13 +68,13 @@ MonoBehaviour: m_Position: serializedVersion: 2 x: 0 - y: 535.1111 - width: 1003.55554 - height: 350 + y: 564.8889 + width: 1190.2222 + height: 369.55554 m_MinSize: {x: 200, y: 100} m_MaxSize: {x: 16192, y: 8096} vertical: 0 - controlID: 73 + controlID: 174 --- !u!114 &4 MonoBehaviour: m_ObjectHideFlags: 52 @@ -94,12 +94,12 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 30 - width: 1365.3334 - height: 885.1111 + width: 1706.6666 + height: 934.44446 m_MinSize: {x: 300, y: 200} m_MaxSize: {x: 24288, y: 16192} vertical: 0 - controlID: 156 + controlID: 128 --- !u!114 &5 MonoBehaviour: m_ObjectHideFlags: 52 @@ -115,12 +115,12 @@ MonoBehaviour: m_Children: [] m_Position: serializedVersion: 2 - x: 1003.55554 + x: 1190.2222 y: 0 - width: 361.77783 - height: 885.1111 - m_MinSize: {x: 276, y: 71} - m_MaxSize: {x: 4001, y: 4021} + width: 516.44446 + height: 934.44446 + m_MinSize: {x: 275, y: 50} + m_MaxSize: {x: 4000, y: 4000} m_ActualView: {fileID: 16} m_Panes: - {fileID: 16} @@ -143,8 +143,8 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 0 - width: 239.55556 - height: 535.1111 + width: 284.8889 + height: 564.8889 m_MinSize: {x: 201, y: 221} m_MaxSize: {x: 4001, y: 4021} m_ActualView: {fileID: 17} @@ -169,8 +169,8 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 0 - width: 469.33334 - height: 350 + width: 557.3333 + height: 369.55554 m_MinSize: {x: 231, y: 271} m_MaxSize: {x: 10001, y: 10021} m_ActualView: {fileID: 15} @@ -198,8 +198,8 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 0 - width: 1365.3334 - height: 935.1111 + width: 1706.6666 + height: 984.44446 m_MinSize: {x: 875, y: 300} m_MaxSize: {x: 10000, y: 10000} m_UseTopView: 1 @@ -223,7 +223,7 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 0 - width: 1365.3334 + width: 1706.6666 height: 30 m_MinSize: {x: 0, y: 0} m_MaxSize: {x: 0, y: 0} @@ -244,8 +244,8 @@ MonoBehaviour: m_Position: serializedVersion: 2 x: 0 - y: 915.1111 - width: 1365.3334 + y: 964.44446 + width: 1706.6666 height: 20 m_MinSize: {x: 0, y: 0} m_MaxSize: {x: 0, y: 0} @@ -268,12 +268,12 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 0 - width: 1003.55554 - height: 885.1111 + width: 1190.2222 + height: 934.44446 m_MinSize: {x: 200, y: 200} m_MaxSize: {x: 16192, y: 16192} vertical: 1 - controlID: 72 + controlID: 173 --- !u!114 &12 MonoBehaviour: m_ObjectHideFlags: 52 @@ -293,12 +293,12 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 0 - width: 1003.55554 - height: 535.1111 + width: 1190.2222 + height: 564.8889 m_MinSize: {x: 200, y: 100} m_MaxSize: {x: 16192, y: 8096} vertical: 0 - controlID: 184 + controlID: 233 --- !u!114 &13 MonoBehaviour: m_ObjectHideFlags: 52 @@ -314,12 +314,12 @@ MonoBehaviour: m_Children: [] m_Position: serializedVersion: 2 - x: 239.55556 + x: 284.8889 y: 0 - width: 764 - height: 535.1111 - m_MinSize: {x: 202, y: 221} - m_MaxSize: {x: 4002, y: 4021} + width: 905.33325 + height: 564.8889 + m_MinSize: {x: 200, y: 200} + m_MaxSize: {x: 4000, y: 4000} m_ActualView: {fileID: 18} m_Panes: - {fileID: 18} @@ -343,7 +343,7 @@ MonoBehaviour: m_MaxSize: {x: 2048, y: 2048} m_TitleContent: m_Text: Asset Store - m_Image: {fileID: -7444545952099596278, guid: 0000000000000000d000000000000000, type: 0} + m_Image: {fileID: -4391848389275900105, guid: 0000000000000000d000000000000000, type: 0} m_Tooltip: m_Pos: serializedVersion: 2 @@ -371,14 +371,14 @@ MonoBehaviour: m_MaxSize: {x: 10000, y: 10000} m_TitleContent: m_Text: Project - m_Image: {fileID: -5179483145760003458, guid: 0000000000000000d000000000000000, type: 0} + m_Image: {fileID: -2032128904892744680, guid: 0000000000000000d000000000000000, type: 0} m_Tooltip: m_Pos: serializedVersion: 2 - x: 12.888889 + x: 0 y: 637.3333 - width: 468.33334 - height: 329 + width: 556.3333 + height: 348.55554 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default @@ -396,22 +396,22 @@ MonoBehaviour: m_SkipHidden: 0 m_SearchArea: 1 m_Folders: - - Assets/ETSI.ARF/ARF World Storage API/World Storage + - Assets/ETSI.ARF/ARF World Storage API/Editor/Windows m_Globs: [] m_OriginalText: m_ViewMode: 1 m_StartGridSize: 16 m_LastFolders: - - Assets/ETSI.ARF/ARF World Storage API/World Storage + - Assets/ETSI.ARF/ARF World Storage API/Editor/Windows m_LastFoldersGridSize: 16 m_LastProjectPath: D:\Fraunhofer\Projects\ETSI\GitLab (STF)\unity-world-storage-editor m_LockTracker: m_IsLocked: 0 m_FolderTreeState: scrollPos: {x: 0, y: 0} - m_SelectedIDs: 684b0000 - m_LastClickedID: 19304 - m_ExpandedIDs: 000000004c4b00004e4b0000504b0000524b0000544b0000564b0000584b000000ca9a3bffffff7f + m_SelectedIDs: 6c4b0000 + m_LastClickedID: 19308 + m_ExpandedIDs: 00000000564b0000584b00005a4b00005c4b00005e4b0000604b0000624b000000ca9a3bffffff7f m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -439,7 +439,7 @@ MonoBehaviour: scrollPos: {x: 0, y: 0} m_SelectedIDs: m_LastClickedID: 0 - m_ExpandedIDs: 000000004c4b00004e4b0000504b0000524b0000544b0000564b0000584b0000 + m_ExpandedIDs: 00000000564b0000584b00005a4b00005c4b00005e4b0000604b0000624b0000 m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -466,7 +466,7 @@ MonoBehaviour: m_ListAreaState: m_SelectedInstanceIDs: m_LastClickedInstanceID: 0 - m_HadKeyboardFocusLastEvent: 1 + m_HadKeyboardFocusLastEvent: 0 m_ExpandedInstanceIDs: c6230000de4b0000 m_RenameOverlay: m_UserAcceptedRename: 0 @@ -511,14 +511,14 @@ MonoBehaviour: m_MaxSize: {x: 4000, y: 4000} m_TitleContent: m_Text: Inspector - m_Image: {fileID: -440750813802333266, guid: 0000000000000000d000000000000000, type: 0} + m_Image: {fileID: 8356117983803934776, guid: 0000000000000000d000000000000000, type: 0} m_Tooltip: m_Pos: serializedVersion: 2 - x: 1016.44446 - y: 102.22222 - width: 360.77783 - height: 864.1111 + x: 1190.2223 + y: 72.44444 + width: 515.44446 + height: 913.44446 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default @@ -552,14 +552,14 @@ MonoBehaviour: m_MaxSize: {x: 4000, y: 4000} m_TitleContent: m_Text: Hierarchy - m_Image: {fileID: -3734745235275155857, guid: 0000000000000000d000000000000000, type: 0} + m_Image: {fileID: -9000905672528348964, guid: 0000000000000000d000000000000000, type: 0} m_Tooltip: m_Pos: serializedVersion: 2 - x: 12.888889 - y: 102.22222 - width: 238.55556 - height: 514.1111 + x: 0 + y: 72.44444 + width: 283.8889 + height: 543.8889 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default @@ -567,7 +567,7 @@ MonoBehaviour: m_SceneHierarchy: m_TreeViewState: scrollPos: {x: 0, y: 0} - m_SelectedIDs: 464b0000 + m_SelectedIDs: a2080000 m_LastClickedID: 0 m_ExpandedIDs: 34fbffff m_RenameOverlay: @@ -609,14 +609,14 @@ MonoBehaviour: m_MaxSize: {x: 4000, y: 4000} m_TitleContent: m_Text: Scene - m_Image: {fileID: 8634526014445323508, guid: 0000000000000000d000000000000000, type: 0} + m_Image: {fileID: -131512000283675692, guid: 0000000000000000d000000000000000, type: 0} m_Tooltip: m_Pos: serializedVersion: 2 - x: 252.44444 - y: 102.22222 - width: 762 - height: 514.1111 + x: 284.8889 + y: 72.44444 + width: 903.33325 + height: 543.8889 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default @@ -844,7 +844,7 @@ MonoBehaviour: m_Target: 0 speed: 2 m_Value: 0 - m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4} + m_Color: {r: 0, g: 1, b: 0, a: 0.4} m_Pivot: {x: 0, y: 0, z: 0} m_Size: {x: 0, y: 0} yGrid: @@ -852,7 +852,7 @@ MonoBehaviour: m_Target: 1 speed: 2 m_Value: 1 - m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4} + m_Color: {r: 0, g: 1, b: 0, a: 0.4} m_Pivot: {x: 0, y: 0, z: 0} m_Size: {x: 1, y: 1} zGrid: @@ -860,7 +860,7 @@ MonoBehaviour: m_Target: 0 speed: 2 m_Value: 0 - m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4} + m_Color: {r: 0, g: 1, b: 0, a: 0.4} m_Pivot: {x: 0, y: 0, z: 0} m_Size: {x: 0, y: 0} m_ShowGrid: 1 @@ -914,7 +914,7 @@ MonoBehaviour: m_MaxSize: {x: 4000, y: 4000} m_TitleContent: m_Text: Game - m_Image: {fileID: 4621777727084837110, guid: 0000000000000000d000000000000000, type: 0} + m_Image: {fileID: 257045534191678443, guid: 0000000000000000d000000000000000, type: 0} m_Tooltip: m_Pos: serializedVersion: 2 @@ -949,8 +949,8 @@ MonoBehaviour: vZoomLockedByDefault: 0 m_HBaseRangeMin: -766 m_HBaseRangeMax: 766 - m_VBaseRangeMin: -395 - m_VBaseRangeMax: 395 + m_VBaseRangeMin: -384.5 + m_VBaseRangeMax: 384.5 m_HAllowExceedBaseRangeMin: 1 m_HAllowExceedBaseRangeMax: 1 m_VAllowExceedBaseRangeMin: 1 @@ -967,11 +967,11 @@ MonoBehaviour: m_DrawArea: serializedVersion: 2 x: 0 - y: 0 + y: 21 width: 1532 - height: 790 + height: 769 m_Scale: {x: 1, y: 1} - m_Translation: {x: 766, y: 395} + m_Translation: {x: 766, y: 384.5} m_MarginLeft: 0 m_MarginRight: 0 m_MarginTop: 0 @@ -979,9 +979,9 @@ MonoBehaviour: m_LastShownAreaInsideMargins: serializedVersion: 2 x: -766 - y: -395 + y: -384.5 width: 1532 - height: 790 + height: 769 m_MinimalGUI: 1 m_defaultScale: 1 m_LastWindowPixelSize: {x: 3447, y: 1777.5} @@ -1006,14 +1006,14 @@ MonoBehaviour: m_MaxSize: {x: 4000, y: 4000} m_TitleContent: m_Text: Console - m_Image: {fileID: -4950941429401207979, guid: 0000000000000000d000000000000000, type: 0} + m_Image: {fileID: -3303252850963283158, guid: 0000000000000000d000000000000000, type: 0} m_Tooltip: m_Pos: serializedVersion: 2 - x: 482.22223 + x: 557.3333 y: 637.3333 - width: 532.22217 - height: 329 + width: 630.88885 + height: 348.55554 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default -- GitLab From 1528494088307d4b81e3fe8d4a2ccb0a904885b8 Mon Sep 17 00:00:00 2001 From: "BCOM\\nchambron" Date: Fri, 8 Jul 2022 17:45:05 +0200 Subject: [PATCH 02/18] first commit --- .../Editor/Graph/ARFEdgeLink.cs | 28 + .../Editor/Graph/ARFEdgeLink.cs.meta | 11 + .../Editor/Graph/ARFGraphView.cs | 574 ++++++++++++--- .../Editor/Graph/ARFNode.cs | 142 ++-- .../Editor/Graph/ARFNodeTrackable.cs | 88 +++ .../Editor/Graph/ARFNodeTrackable.cs.meta | 11 + .../Editor/Graph/ARFNodeWorldAnchor.cs | 88 +++ .../Editor/Graph/ARFNodeWorldAnchor.cs.meta | 11 + .../Editor/Graph/GraphWindow.cs | 608 ++++++++++------ .../Editor/Graph/GraphWindow.cs.meta | 5 +- .../Editor/Graph/WorldLinkListener.cs | 27 + .../Editor/Graph/WorldLinkListener.cs.meta | 11 + .../Editor/Windows/NodeEditorWindow.cs | 70 ++ .../Editor/Windows/NodeEditorWindow.cs.meta | 11 + .../Editor/Windows/TrackableWindow.cs | 60 +- .../Editor/Windows/TrackableWindow.cs.meta | 5 +- .../Editor/Windows/WorldAnchorWindow.cs | 63 +- .../Editor/Windows/WorldGraphWindow.cs | 218 ++++++ .../Editor/Windows/WorldGraphWindow.cs.meta | 14 + .../Editor/Windows/WorldLinkWindow.cs | 662 ++++++++++-------- .../Editor/Windows/WorldStorageWindow.cs.meta | 5 +- .../ARF World Storage API/Materials.meta | 8 + .../World Storage/LocalHost8080.asset | 19 + .../World Storage/LocalHost8080.asset.meta | 8 + .../World Storage/LocalHost8081.asset | 19 + .../World Storage/LocalHost8081.asset.meta | 8 + ProjectSettings/EditorSettings.asset | 22 +- ProjectSettings/ProjectSettings.asset | 3 +- UserSettings/Layouts/default-2021.dwlt | 439 +++++------- UserSettings/Search.index | 13 + UserSettings/Search.settings | 67 ++ 31 files changed, 2345 insertions(+), 973 deletions(-) create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFEdgeLink.cs create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFEdgeLink.cs.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeTrackable.cs create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeTrackable.cs.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeWorldAnchor.cs create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeWorldAnchor.cs.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/WorldLinkListener.cs create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/WorldLinkListener.cs.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/NodeEditorWindow.cs create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/NodeEditorWindow.cs.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Materials.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/World Storage/LocalHost8080.asset create mode 100644 Assets/ETSI.ARF/ARF World Storage API/World Storage/LocalHost8080.asset.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/World Storage/LocalHost8081.asset create mode 100644 Assets/ETSI.ARF/ARF World Storage API/World Storage/LocalHost8081.asset.meta create mode 100644 UserSettings/Search.index create mode 100644 UserSettings/Search.settings diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFEdgeLink.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFEdgeLink.cs new file mode 100644 index 0000000..ee0ae20 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFEdgeLink.cs @@ -0,0 +1,28 @@ +using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows; +using Org.OpenAPITools.Model; +using UnityEditor; +using UnityEditor.Experimental.GraphView; +using UnityEngine; +using UnityEngine.UIElements; + +namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph +{ + public class ARFEdgeLink : Edge + { + public WorldLink worldLink; + public string GUID; + public ARFEdgeLink() + { + var doubleClickManipulator = new Clickable(clicked); + doubleClickManipulator.activators.Clear(); + doubleClickManipulator.activators.Add(new ManipulatorActivationFilter { button = MouseButton.LeftMouse, clickCount = 2 }); + this.AddManipulator(doubleClickManipulator); + this.style.color = new Color(239, 239, 239); + } + + public void clicked() + { + NodeEditorWindow.ShowWindow(this); + } + } +} \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFEdgeLink.cs.meta b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFEdgeLink.cs.meta new file mode 100644 index 0000000..723d9ee --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFEdgeLink.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 81a94cf483be20040aa4fe8d9f93d5c5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFGraphView.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFGraphView.cs index 2993790..b85f7c8 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFGraphView.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFGraphView.cs @@ -1,109 +1,467 @@ -// -// ARF - Augmented Reality Framework (ETSI ISG ARF) -// -// Copyright 2022 ETSI -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Last change: June 2022 -// - -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.UIElements; -using UnityEditor.Experimental.GraphView; -using System; - -namespace ETSI.ARF.WorldStorage.UI -{ - public class ARFGraphView : GraphView - { - public ARFGraphView() - { - //GridBackground back = new GridBackground(); - //back.StretchToParentSize(); - //Insert(0, back); - - this.AddManipulator(new ContentDragger()); - this.AddManipulator(new SelectionDragger()); - this.AddManipulator(new RectangleSelector()); - - AddElement(GenerateEntryPointNode()); - } - - public override List GetCompatiblePorts(Port startPort, NodeAdapter nodeAdapter) - { - var cPorts = new List(); - ports.ForEach (funcCall: port => - { - if (startPort != port && startPort.node != port.node) cPorts.Add(port); - }); - return cPorts; - } - - private Port GeneratePort (ARFNode node, Direction portDirection, Port.Capacity capacity = Port.Capacity.Multi) - { - return node.InstantiatePort(Orientation.Horizontal, portDirection, capacity, typeof(int)); // dummy - } - - private ARFNode GenerateEntryPointNode() - { - var node = new ARFNode - { - title = "World Storage", - text = "EntryPoint", - GUID = Guid.NewGuid().ToString(), - entryPoint = true - }; - - var portOut = GeneratePort(node, Direction.Output); - portOut.portName = "Link"; - node.outputContainer.Add(portOut); - - node.RefreshExpandedState(); - node.RefreshPorts(); - node.SetPosition(new Rect(50, 100, 200, 150)); - return node; - } - - public void CreateNode(string name) - { - AddElement(CreateARFNode(name)); - } - - public ARFNode CreateARFNode(string name) - { - var node = new ARFNode - { - title = name, - text = name, - GUID = Guid.NewGuid().ToString() - }; - - var portIn = GeneratePort(node, Direction.Input, Port.Capacity.Multi); - portIn.portName = "Link"; // "Input"; - node.inputContainer.Add(portIn); - - var portOut = GeneratePort(node, Direction.Output, Port.Capacity.Multi); - portOut.portName = "Link"; // "Output"; - node.outputContainer.Add(portOut); - - node.RefreshExpandedState(); - node.RefreshPorts(); - node.SetPosition(new Rect(200, 100, 200, 150)); - - return node; - } - } +// +// ARF - Augmented Reality Framework (ETSI ISG ARF) +// +// Copyright 2022 ETSI +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: June 2022 +// +#define USING_OPENAPI_GENERATOR + +using System.Collections; +using System.Collections.Generic; +#if USING_OPENAPI_GENERATOR +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Model; +#else +using IO.Swagger.Api; +using IO.Swagger.Model; +#endif +using UnityEngine; +using UnityEngine.UIElements; +using UnityEditor.Experimental.GraphView; +using System; +using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph; +using ETSI.ARF.WorldStorage.REST; +using UnityEditor; +using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows; + +namespace ETSI.ARF.WorldStorage.UI +{ + public class ARFGraphView : GraphView + { + public WorldStorageServer worldStorageServer; + public WorldStorageUser worldStorageUser; + + public ARFGraphView() + { + SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale); + + //deleSection + deleteSelection += DeleteFunc; + + this.AddManipulator(new ContentDragger()); + this.AddManipulator(new SelectionDragger()); + this.AddManipulator(new RectangleSelector()); + + } + + //method called when an element is deleted from the graphview + public void DeleteFunc(string operationName, AskUser askUser) + { + //build the message to list all the deleted elements + String message = "Are you sure you want to delete "; + if (selection.Count > 1) + { + message += selection.Count + " elements ?"; + } + else + { + message += "this element ?"; + } + + //remove from the graph all the deleted elements + if (EditorUtility.DisplayDialog("Deleting elements", message, "Yes", "No")) + { + if (SaveInfo.instance.elemsToRemove == null) + { + SaveInfo.instance.elemsToRemove = new List(); + } + foreach (GraphElement elt in selection.ToArray()) + { + ARFNodeWorldAnchor nodeAnchor = elt as ARFNodeWorldAnchor; + if (nodeAnchor != null) + { + nodeAnchor.DisconnectAllPorts(this); + if (SaveInfo.instance.nodePositions.ContainsKey(nodeAnchor.GUID)) + { + SaveInfo.instance.elemsToRemove.Add(nodeAnchor.GUID); + } + RemoveElement(elt); + continue; + } + ARFNodeTrackable nodeTrackable = elt as ARFNodeTrackable; + if (nodeTrackable != null) + { + nodeTrackable.DisconnectAllPorts(this); + if (SaveInfo.instance.nodePositions.ContainsKey(nodeTrackable.GUID)) + { + SaveInfo.instance.elemsToRemove.Add(nodeTrackable.GUID); + } + RemoveElement(elt); + continue; + } + ARFEdgeLink edgeLink = elt as ARFEdgeLink; + if (edgeLink != null) + { + edgeLink.input.Disconnect(edgeLink); + edgeLink.output.Disconnect(edgeLink); + SaveInfo.instance.elemsToRemove.Add(edgeLink.GUID); + RemoveElement(elt); + continue; + } + } + } + } + + public override void BuildContextualMenu(UnityEngine.UIElements.ContextualMenuPopulateEvent evt) + { + Vector2 localMousePos = evt.localMousePosition; + Vector2 actualGraphPosition = viewTransform.matrix.inverse.MultiplyPoint(localMousePos); + + evt.menu.AppendSeparator(); + evt.menu.AppendAction("Reload graph", delegate + { + if (positionshaveBeenChanged() && EditorUtility.DisplayDialog("Saving node positions", "The nodes positions have been changed, would you like to save them ?", "Yes", "No")) + { + saveElemPositionsInServer(); + } + reload(); + SaveInfo.instance.toReFrame = true; + }, (DropdownMenuAction a) => DropdownMenuAction.Status.Normal); + evt.menu.AppendAction("Create Trackable", delegate + { + //generate the Trackables's attributes + EncodingInformationStructure trackableEncodingInformation = new EncodingInformationStructure(EncodingInformationStructure.DataFormatEnum.OTHER, "0"); + + List localCRS = new List(); + for (int i = 0; i < 16; i++) + { + localCRS.Add(0); + } + + List trackableSize = new List(); + for (int i = 0; i < 3; i++) + { + trackableSize.Add(0); + } + + Trackable trackable = new Trackable(Guid.NewGuid(), "Defaulttrackable", Guid.Parse(worldStorageUser.UUID), Trackable.TrackableTypeEnum.OTHER, trackableEncodingInformation, new byte[64], localCRS, UnitSystem.CM, trackableSize, new Dictionary>()); + createTrackableNode(trackable, actualGraphPosition.x, actualGraphPosition.y); + + }, (DropdownMenuAction a) => DropdownMenuAction.Status.Normal); + evt.menu.AppendAction("Create World Anchor", delegate + { + //generate the worldAnchor attributes + + List localCRS = new List(); + for (int i = 0; i < 16; i++) + { + localCRS.Add(0); + } + + List worldAnchorSize = new List(); + for (int i = 0; i < 3; i++) + { + worldAnchorSize.Add(0); + } + + WorldAnchor anchor = new WorldAnchor(Guid.NewGuid(), "DefaultWorldAnchor", Guid.Parse(worldStorageUser.UUID), localCRS, UnitSystem.CM, worldAnchorSize, new Dictionary>()); + createAnchorNode(anchor, actualGraphPosition.x, actualGraphPosition.y); + + }, (DropdownMenuAction a) => DropdownMenuAction.Status.Normal); + evt.menu.AppendSeparator(); + if (evt.target is ARFNode || evt.target is Group || evt.target is ARFEdgeLink) + { + evt.menu.AppendSeparator(); + evt.menu.AppendAction("Delete", delegate + { + DeleteSelectionCallback(AskUser.AskUser); + }, (DropdownMenuAction a) => canDeleteSelection ? DropdownMenuAction.Status.Normal : DropdownMenuAction.Status.Disabled); + evt.menu.AppendSeparator(); + } + if (evt.target is GraphView) + { + } + } + private bool positionshaveBeenChanged() + { + if (SaveInfo.instance.elemsToRemove.Count != 0) + { + return true; + } + foreach (ARFNode node in nodes) + { + float nodeX = node.GetPosition().x; + float nodeY = node.GetPosition().y; + float dataX = SaveInfo.instance.nodePositions[node.GUID].x; + float dataY = SaveInfo.instance.nodePositions[node.GUID].y; + if ((nodeX != dataX) || (nodeY != dataY)) + { + return true; + } + } + return false; + } + + public override List GetCompatiblePorts(Port startPort, NodeAdapter nodeAdapter) + { + var cPorts = new List(); + ports.ForEach(funcCall: port => + { + if (startPort != port && startPort.node != port.node) cPorts.Add(port); + }); + return cPorts; + } + + public void paintWorldStorage() + { + List trackables = TrackableRequest.GetAllTrackables(worldStorageServer); + List worldAnchors = WorldAnchorRequest.GetAllWorldAnchors(worldStorageServer); + List worldLinks = WorldLinkRequest.GetAllWorldLinks(worldStorageServer); + + foreach (WorldAnchor worldAnchor in worldAnchors) + { + var waNode = new ARFNodeWorldAnchor(worldAnchor); + + Rect posTemp = new Rect(26, 93, 160, 77); + SaveInfo.instance.nodePositions.TryGetValue(worldAnchor.UUID.ToString(), out posTemp); + waNode.SetPosition(posTemp); + + AddElement(waNode); + } + + foreach (Trackable trackable in trackables) + { + var tracknode = new ARFNodeTrackable(trackable); + + Rect posTemp = new Rect(26, 93, 160, 77); + SaveInfo.instance.nodePositions.TryGetValue(trackable.UUID.ToString(), out posTemp); + tracknode.SetPosition(posTemp); + + AddElement(tracknode); + } + foreach (WorldLink worldLink in worldLinks) + { + var portPair = getPortsFromWorldLink(worldLink); + ARFEdgeLink edge = portPair.Key.ConnectTo(portPair.Value); + edge.worldLink = worldLink; + edge.GUID = worldLink.UUID.ToString(); + + AddElement(edge); + } + + } + + internal void createTrackableNode(Trackable track, float posX, float posY) + { + var tracknode = new ARFNodeTrackable(track); + Rect pos = new Rect(RoundToNearestHalf(posX), RoundToNearestHalf(posY), 160, 77); + tracknode.SetPosition(pos); + + AddElement(tracknode); + } + + internal void createAnchorNode(WorldAnchor wa, float posX, float posY) + { + var waNode = new ARFNodeWorldAnchor(wa); + + Rect pos = new Rect(RoundToNearestHalf(posX), RoundToNearestHalf(posY), 160, 77); + waNode.SetPosition(pos); + + AddElement(waNode); + } + + internal void createLink(WorldLink worldLink) + { + var portPair = getPortsFromWorldLink(worldLink); + ARFEdgeLink edge = portPair.Key.ConnectTo(portPair.Value); + edge.worldLink = worldLink; + Debug.Log(worldLink.UUID.ToString()); + edge.GUID = worldLink.UUID.ToString(); + + AddElement(edge); + } + + public void reload() + { + DeleteElements(graphElements); + paintWorldStorage(); + FrameAllElements(); + } + + public Dictionary SavePositions() + { + Dictionary ret = new Dictionary(); + foreach (ARFNode elem in nodes) + { + ret.Add(elem.GUID, elem.GetPosition()); + } + return ret; + } + + private KeyValuePair getPortsFromWorldLink(WorldLink worldLink) + { + var ret = new KeyValuePair(); + + //To + Guid idTo = worldLink.UUIDTo; + Port portIn = null; + switch (worldLink.TypeTo) + { + case ObjectType.Trackable: + foreach (GraphElement node in this.graphElements) + { + ARFNodeTrackable nodeTrackable = node as ARFNodeTrackable; + if ((nodeTrackable != null) && (nodeTrackable.trackable.UUID == idTo)) + { + portIn = nodeTrackable.portIn; + break; + } + } + break; + case ObjectType.WorldAnchor: + foreach (GraphElement node in this.graphElements) + { + ARFNodeWorldAnchor nodeAnchor = node as ARFNodeWorldAnchor; + if ((nodeAnchor != null) && nodeAnchor.worldAnchor.UUID == idTo) + { + portIn = nodeAnchor.portIn; + break; + } + } + break; + default: + Debug.Log("what are you doing here..."); + break; + } + + //From + Guid idFrom = worldLink.UUIDFrom; + Port portOut = null; + switch (worldLink.TypeFrom) + { + case ObjectType.Trackable: + foreach (GraphElement node in this.graphElements) + { + ARFNodeTrackable nodeTrackable = node as ARFNodeTrackable; + if ((nodeTrackable != null) && (nodeTrackable.trackable.UUID == idFrom)) + { + portOut = nodeTrackable.portOut; + break; + } + } + break; + case ObjectType.WorldAnchor: + foreach (GraphElement node in this.graphElements) + { + ARFNodeWorldAnchor nodeAnchor = node as ARFNodeWorldAnchor; + if ((nodeAnchor != null) && nodeAnchor.worldAnchor.UUID == idFrom) + { + portOut = nodeAnchor.portOut; + break; + } + } + break; + default: + Debug.Log("what are you doing here..."); + break; + } + + if ((portOut != null) && (portIn != null)) + { + ret = new KeyValuePair(portOut, portIn); + } + + return ret; + } + + // + // Résumé : + // Calculate the rectangle size and position to fit all elements in graph. + // + // Paramètres : + // container: + // This should be the view container. + // + // Retourne : + // The calculated rectangle. + public override Rect CalculateRectToFitAll(VisualElement container) + { + Rect rectToFit = container.layout; + bool reachedFirstChild = false; + graphElements.ForEach(delegate (GraphElement ge) + { + if (!(ge is ARFEdgeLink) && !(ge is Port)) + { + if (!reachedFirstChild) + { + rectToFit = ge.ChangeCoordinatesTo(contentViewContainer, ge.contentRect); + reachedFirstChild = true; + } + else + { + rectToFit = RectUtils.Encompass(rectToFit, ge.ChangeCoordinatesTo(contentViewContainer, ge.contentRect)); + } + } + }); + return rectToFit; + } + + //k_FrameBorder is private readOnly graphView attribute, had to redeclare it to access it + private readonly int k_FrameBorder = 30; + public void FrameAllElements() + { + Vector3 frameTranslation = Vector3.zero; + Vector3 frameScaling = Vector3.one; + var rectToFit = CalculateRectToFitAll(contentViewContainer); + CalculateFrameTransform(rectToFit, layout, k_FrameBorder, out frameTranslation, out frameScaling); + Matrix4x4.TRS(frameTranslation, Quaternion.identity, frameScaling); + UpdateViewTransform(frameTranslation, frameScaling); + } + + //method to predict the position of a node (the float that will be saved in the PositionInfo singleton) + public static float RoundToNearestHalf(float a) + { + return a = Mathf.Round(a * 2f) * 0.5f; + } + + public void saveElemPositionsInServer() + { + foreach (ARFNode node in nodes) + { + if (!SaveInfo.instance.nodePositions.ContainsKey(node.GUID)) + { + //TODO + Debug.Log("need to post " + node.GUID); + } + else + { + float xLocal = node.GetPosition().x; + float yLocal = node.GetPosition().y; + float xServer = SaveInfo.instance.nodePositions[node.GUID].x; ; + float yServer = SaveInfo.instance.nodePositions[node.GUID].y; + if ((xLocal != xServer) && (yLocal != yServer)) + { + //TODO + Debug.Log("need to update " + node.GUID); + } + } + } + foreach (ARFEdgeLink edge in edges) + { + if (!SaveInfo.instance.linkIds.Contains(edge.GUID)) + { + //TODO + Debug.Log("need to post link between " + edge.input); + } + } + foreach (String elemId in SaveInfo.instance.elemsToRemove) + { + //TODO + Debug.Log("need to remove " + elemId); + } + } + } } \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNode.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNode.cs index 5ea6fbe..6c29371 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNode.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNode.cs @@ -1,41 +1,103 @@ -// -// ARF - Augmented Reality Framework (ETSI ISG ARF) -// -// Copyright 2022 ETSI -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Last change: June 2022 -// - -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.UIElements; -using UnityEditor.Experimental.GraphView; - -namespace ETSI.ARF.WorldStorage.UI -{ - public class ARFNode : Node - { - public string GUID; - public string text; - public bool entryPoint = false; - - public ARFNode() - { - - - } - } +// +// ARF - Augmented Reality Framework (ETSI ISG ARF) +// +// Copyright 2022 ETSI +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: June 2022 +// +#define USING_OPENAPI_GENERATOR // alt. is Swagger + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using ETSI.ARF.WorldStorage.REST; + +#if USING_OPENAPI_GENERATOR +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Model; +#else +using IO.Swagger.Api; +using IO.Swagger.Model; +#endif +using UnityEngine.UIElements; +using UnityEditor.Experimental.GraphView; +using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph; +using System; + +namespace ETSI.ARF.WorldStorage.UI +{ + public class ARFNode : Node + { + public string GUID; + public bool entryPoint = false; + public Port portOut; + public Port portIn; + public GUID id; + public ARFNode() + { + + } + + public override Port InstantiatePort(Orientation orientation, Direction direction, Port.Capacity capacity, Type type) + { + switch (direction) + { + case Direction.Input: + portIn = Port.Create(orientation, direction, capacity, type); + return portIn; + case Direction.Output: + portOut = Port.Create(orientation, direction, capacity, type); + return portOut; + default: + return null; + } + } + + public void DisconnectAllPorts(ARFGraphView graphView) + { + DisconnectInputPorts(graphView); + DisconnectOutputPorts(graphView); + } + + private void DisconnectInputPorts(ARFGraphView graphView) + { + DisconnectPorts(inputContainer, graphView); + } + + private void DisconnectOutputPorts(ARFGraphView graphView) + { + DisconnectPorts(outputContainer, graphView); + } + + private void DisconnectPorts(VisualElement container, ARFGraphView graphView) + { + foreach (Port port in container.Children()) + { + if (!port.connected) + { + continue; + } + + graphView.DeleteElements(port.connections); + } + } + + public Port GeneratePort(ARFNode node, Direction portDirection, Port.Capacity capacity = Port.Capacity.Multi) + { + return node.InstantiatePort(Orientation.Horizontal, portDirection, capacity, typeof(int)); // dummy + } + } } \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeTrackable.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeTrackable.cs new file mode 100644 index 0000000..b25b58e --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeTrackable.cs @@ -0,0 +1,88 @@ +// +// ARF - Augmented Reality Framework (ETSI ISG ARF) +// +// Copyright 2022 ETSI +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: June 2022 +// +#define USING_OPENAPI_GENERATOR // alt. is Swagger + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using ETSI.ARF.WorldStorage.REST; + +#if USING_OPENAPI_GENERATOR +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Model; +#else +using IO.Swagger.Api; +using IO.Swagger.Model; +#endif +using UnityEngine.UIElements; +using UnityEditor.Experimental.GraphView; +using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows; +using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph; + +namespace ETSI.ARF.WorldStorage.UI +{ + public class ARFNodeTrackable : ARFNode + { + public Trackable trackable; + + public ARFNodeTrackable(Trackable trackable) + { + this.trackable = trackable; + this.GUID = trackable.UUID.ToString(); + this.title = trackable.Name; + + /*COLOR*/ + var colorRectangle = new VisualElement(); + colorRectangle.style.height = 160; + colorRectangle.style.height = 5; + colorRectangle.style.backgroundColor = new Color(0.9f, 0.78f, 0.54f, 0.9f); + mainContainer.Insert(1, colorRectangle); + + /*PORTS*/ + var portIn = GeneratePort(this, Direction.Input, Port.Capacity.Multi); + portIn.portColor = new Color(0.77f, 0.77f, 0.77f, 0.77f); + portIn.portName = "Target"; // "Input" + portIn.AddManipulator(new EdgeConnector(new WorldLinkListener())); + inputContainer.Add(portIn); + + var portOut = GeneratePort(this, Direction.Output, Port.Capacity.Multi); + portOut.portColor = new Color(0.77f, 0.77f, 0.77f, 0.77f); + portOut.portName = "Source"; // "Output"; + portOut.AddManipulator(new EdgeConnector(new WorldLinkListener())); ; + outputContainer.Add(portOut); + + RefreshExpandedState(); + RefreshPorts(); + + /*MANIPULATOR*/ + var doubleClickManipulator = new Clickable(clicked); + doubleClickManipulator.activators.Clear(); + doubleClickManipulator.activators.Add(new ManipulatorActivationFilter { button = MouseButton.LeftMouse, clickCount = 2 }); + this.AddManipulator(doubleClickManipulator); + } + + public void clicked() + { + NodeEditorWindow.ShowWindow(this); + Debug.Log(trackable.ToString()); + } + } +} \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeTrackable.cs.meta b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeTrackable.cs.meta new file mode 100644 index 0000000..17e98f2 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeTrackable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 01bfb1a0a4a788c48a6c6675034ba8d5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeWorldAnchor.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeWorldAnchor.cs new file mode 100644 index 0000000..a8c83a3 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeWorldAnchor.cs @@ -0,0 +1,88 @@ +// +// ARF - Augmented Reality Framework (ETSI ISG ARF) +// +// Copyright 2022 ETSI +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: June 2022 +// +#define USING_OPENAPI_GENERATOR // alt. is Swagger + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using ETSI.ARF.WorldStorage.REST; + +#if USING_OPENAPI_GENERATOR +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Model; +#else +using IO.Swagger.Api; +using IO.Swagger.Model; +#endif +using UnityEngine.UIElements; +using UnityEditor.Experimental.GraphView; +using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows; +using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph; + +namespace ETSI.ARF.WorldStorage.UI +{ + public class ARFNodeWorldAnchor : ARFNode + { + public WorldAnchor worldAnchor; + + public ARFNodeWorldAnchor(WorldAnchor worldAnchor) + { + this.worldAnchor = worldAnchor; + this.GUID = worldAnchor.UUID.ToString(); + this.title = worldAnchor.Name; + + /*COLOR*/ + var colorRectangle = new VisualElement(); + colorRectangle.style.height = 160; + colorRectangle.style.height = 5; + colorRectangle.style.backgroundColor = new Color(0.76f, 0.9f, 0.46f, 0.9f); + mainContainer.Insert(1, colorRectangle); + + /*PORTS*/ + var portIn = GeneratePort(this, Direction.Input, Port.Capacity.Multi); + portIn.portColor = new Color(0.77f,0.77f,0.77f, 0.77f); + portIn.portName = "Target"; // "Input"; + portIn.AddManipulator(new EdgeConnector(new WorldLinkListener())); + inputContainer.Add(portIn); + + var portOut = GeneratePort(this, Direction.Output, Port.Capacity.Multi); + portOut.portColor = new Color(0.77f, 0.77f, 0.77f, 0.77f); + portOut.portName = "Source"; // "Output"; + portOut.AddManipulator(new EdgeConnector(new WorldLinkListener())); + outputContainer.Add(portOut); + + RefreshExpandedState(); + RefreshPorts(); + + /*MANIPULATOR*/ + var doubleClickManipulator = new Clickable(clicked); + doubleClickManipulator.activators.Clear(); + doubleClickManipulator.activators.Add(new ManipulatorActivationFilter { button = MouseButton.LeftMouse, clickCount = 2 }); + this.AddManipulator(doubleClickManipulator); + } + + public void clicked() + { + Debug.Log(worldAnchor.ToString()); + NodeEditorWindow.ShowWindow(this); + } + } +} \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeWorldAnchor.cs.meta b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeWorldAnchor.cs.meta new file mode 100644 index 0000000..bb1bb7e --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeWorldAnchor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 21e22c1ed011b7a4da95fad83be1d9fa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs index 3a21abe..9c496ee 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs @@ -1,216 +1,394 @@ -// -// ARF - Augmented Reality Framework (ETSI ISG ARF) -// -// Copyright 2022 ETSI -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Last change: June 2022 -// - -#define USING_OPENAPI_GENERATOR // alt. is Swagger - -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEditor; -using UnityEditor.Experimental.GraphView; -using UnityEngine.UIElements; -using UnityEditor.UIElements; -using ETSI.ARF.WorldStorage.REST; - -#if USING_OPENAPI_GENERATOR -using Org.OpenAPITools.Api; -using Org.OpenAPITools.Model; -#else -using IO.Swagger.Api; -using IO.Swagger.Model; -#endif - - -namespace ETSI.ARF.WorldStorage.UI -{ - - public class GraphWindow : EditorWindow - { - [HideInInspector] public WorldStorageServer worldStorageSettings; - - [SerializeField] public List trackables = new List(); - - bool groupEnabled; - - string uid = System.Guid.Empty.ToString(); - string customName = "NotDefined"; - string creatorUid = System.Guid.Empty.ToString(); - string type = "Unknow"; - string unit = "Unknow"; - Vector2Int dim; - - private Trackable currentTrackable; - private Vector2 scrollPos; - private Color ori; - private GUIStyle gsTest; - - private ARFGraphView myGraph; - - [MenuItem("ARFWorldStorage/Graph Editor")] - public static void ShowWindow()//WorldStorageServer ws) - { - GraphWindow win = EditorWindow.GetWindow(typeof(GraphWindow), false, WorldStorageWindow.winName) as GraphWindow; - //win.worldStorageSettings = ws; - } - - public GraphWindow() - { - // init somne stuffs - //currentTrackable = new Trackable(); - } - - public void OnEnable() - { - ConstructGraphView(); - GenerateToolbar(); - } - - public void OnDisable() - { - rootVisualElement.Remove(myGraph); - } - - private void GenerateToolbar() - { - var toolbar = new Toolbar(); - - var createNodeT = new Button(clickEvent: () => { myGraph.CreateNode("Trackable"); }); - createNodeT.text = "Create Trackable"; - toolbar.Add(createNodeT); - - var createNodeWA = new Button(clickEvent: () => { myGraph.CreateNode("World Anchor"); }); - createNodeWA.text = "Create World Anchor"; - toolbar.Add(createNodeWA); - - var createNodeL = new Button(clickEvent: () => { }); - createNodeL.text = "Create Link"; - toolbar.Add(createNodeL); - - var close = new Button(clickEvent: () => { Close(); }); - close.text = "Close Window"; - toolbar.Add(close); - - rootVisualElement.Add(toolbar); - } - - private void ConstructGraphView() - { - myGraph = new ARFGraphView - { - name = "ARF Graph" - }; - myGraph.StretchToParentSize(); - //myGraph.StretchToParentWidth(); - rootVisualElement.Add(myGraph); - } - - void OnGUI() - { - ori = GUI.backgroundColor; // remember ori color - - gsTest = new GUIStyle("window"); - gsTest.normal.textColor = WorldStorageWindow.arfColors[0]; - gsTest.fontStyle = FontStyle.Bold; - - EditorGUILayout.Space(24); - GUI.contentColor = WorldStorageWindow.arfColors[1]; - WorldStorageWindow.DrawCopyright(); - - //TLP.Editor.EditorGraph graph = new TLP.Editor.EditorGraph(0, -1, 10, 1, "Just a sin wave", 100); - //graph.AddFunction(x => Mathf.Sin(x)); - //graph.Draw(); - } - - /* - void DrawTrackableStuffs()// Trackable trackable) - { - GUILayout.BeginVertical("AR Trackable", gsTest); - // - GUILayout.Label("Server: " + worldStorageSettings.serverName, EditorStyles.whiteLargeLabel); - GUILayout.Label("Creator UID: " + creatorUid, EditorStyles.miniLabel); // readonly - EditorGUILayout.Space(); - - //GUILayout.BeginHorizontal(); - uid = EditorGUILayout.TextField("UID (0 = new one)", uid); - EditorGUILayout.Space(); - - GUI.backgroundColor = WorldStorageWindow.arfColors[1]; - if (GUILayout.Button("Get Parameters")) - { - Trackable t = RESTfulTrackableRequest.GetTrackable(worldStorageSettings, uid); - creatorUid = t.CreatorUUID.ToString(); - type = t.GetType().ToString(); - unit = t.Unit.ToString(); - } - GUI.backgroundColor = ori; - - type = EditorGUILayout.TextField("Trackable Type", type); - unit = EditorGUILayout.TextField("Unit System", unit); - - EditorGUILayout.Space(10); - dim = EditorGUILayout.Vector2IntField("Dimension", dim); - - EditorGUILayout.Space(); - GUILayout.Button("Payload from Asset..."); - - EditorGUILayout.Space(); - groupEnabled = EditorGUILayout.BeginToggleGroup("Optional Parameters:", groupEnabled); - EditorGUILayout.IntField("Number of KeyValues", 0); - EditorGUILayout.Space(); - EditorGUILayout.TextField("Key", ""); - EditorGUILayout.TextField("Value", ""); - EditorGUILayout.EndToggleGroup(); - // - GUILayout.EndVertical(); - - GUI.backgroundColor = WorldStorageWindow.arfColors[3]; - if (GUILayout.Button("Delete Trackable")) - { - Debug.Log("Deleting Trackable"); - RESTfulTrackableRequest.DeleteTrackable(worldStorageSettings, uid); - uid = System.Guid.Empty.ToString(); - creatorUid = System.Guid.Empty.ToString(); - type = ""; - unit = ""; - WorldStorageWindow.WorldStorageWindowSingleton.UpdateList(); - WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); - } - GUI.backgroundColor = ori; - - GUI.backgroundColor = WorldStorageWindow.arfColors[2]; - if (GUILayout.Button("Create/Update Trackable")) - { - Debug.Log("PostAddTrackable"); - if (string.IsNullOrEmpty(uid) || uid == "0") uid = System.Guid.Empty.ToString(); - Trackable t = RESTfulTrackableRequest.TrackableFromStrings(uid, cus, worldStorageSettings.creatorUID); - RESTfulTrackableRequest.PostAddTrackable(worldStorageSettings, t); - WorldStorageWindow.WorldStorageWindowSingleton.UpdateList(); - WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); - - uid = t.UUID.ToString(); - type = t.GetType().ToString(); - unit = t.Unit.ToString(); - } - GUI.backgroundColor = ori; - } - - */ - } +// +// ARF - Augmented Reality Framework (ETSI ISG ARF) +// +// Copyright 2022 ETSI +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: June 2022 +// + +#define USING_OPENAPI_GENERATOR // alt. is Swagger + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using UnityEditor.Experimental.GraphView; +using UnityEngine.UIElements; +using UnityEditor.UIElements; +using ETSI.ARF.WorldStorage.REST; +using System; +using System.Threading.Tasks; +using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows; + +#if USING_OPENAPI_GENERATOR +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Model; +#else +using IO.Swagger.Api; +using IO.Swagger.Model; +#endif + + +namespace ETSI.ARF.WorldStorage.UI +{ + + public class GraphWindow : EditorWindow + { + + static public GraphWindow graphWindowSingleton; + + string tempStorageUrl; + int tempStoragePort; + + [HideInInspector] public WorldStorageServer worldStorageServer; + [HideInInspector] public WorldStorageUser worldStorageUser; + + [SerializeField] public List trackables = new List(); + + private Color ori; + private GUIStyle gsTest; + + private ARFGraphView myGraph; + + [MenuItem("ARFWorldStorage/Graph Editor")] + public static void ShowWindow() + { + GetWindow("Menu Editor", true, typeof(SceneView)); + GraphWindow win = EditorWindow.GetWindow(typeof(GraphWindow), false, WorldStorageWindow.winName) as GraphWindow; + } + + public GraphWindow() + { + graphWindowSingleton = this; + } + + public void OnEnable() + { + Debug.Log("onEnable"); + //At unity launch + if (SaveInfo.instance.nodePositions == null) + { + initNodePos(); + } + + tempStorageUrl = this.worldStorageServer.basePath; + tempStoragePort = this.worldStorageServer.port; + ConstructGraphView(); + rootVisualElement.Add(GenerateToolbar()); + myGraph.StretchToParentSize(); + //top offset so that the graph does'nt overlap with the rest of the ui + myGraph.style.top = Length.Percent(11); + rootVisualElement.Add(myGraph); + } + + private void initNodePos() + { + + SaveInfo.instance.nodePositions = new Dictionary(); + foreach (Trackable track in TrackableRequest.GetAllTrackables(worldStorageServer)) + { + if (track.KeyvalueTags.ContainsKey("unityAuthoringPosX") && track.KeyvalueTags.ContainsKey("unityAuthoringPosY")) + { + var posX = float.Parse(track.KeyvalueTags["unityAuthoringPosX"][0]); + var posY = float.Parse(track.KeyvalueTags["unityAuthoringPosY"][0]); + Rect trackPos = new Rect(posX, posY, 135, 77); + SaveInfo.instance.nodePositions[track.UUID.ToString()] = trackPos; + } + else + { + Rect trackPos = new Rect(0, 0, 135, 77); + SaveInfo.instance.nodePositions[track.UUID.ToString()] = trackPos; + } + } + foreach (WorldAnchor wa in WorldAnchorRequest.GetAllWorldAnchors(worldStorageServer)) + { + if (wa.KeyvalueTags.ContainsKey("unityAuthoringPosX") && wa.KeyvalueTags.ContainsKey("unityAuthoringPosY")) + { + var posX = float.Parse(wa.KeyvalueTags["unityAuthoringPosX"][0]); + var posY = float.Parse(wa.KeyvalueTags["unityAuthoringPosY"][0]); + Rect waPos = new Rect(posX, posY, 135, 77); + SaveInfo.instance.nodePositions[wa.UUID.ToString()] = waPos; + } + else + { + Rect trackPos = new Rect(0, 0, 135, 77); + SaveInfo.instance.nodePositions[wa.UUID.ToString()] = trackPos; + } + } + SaveInfo.instance.toReFrame = true; + } + + public void OnDisable() + { + if (positionshaveBeenChanged() && EditorUtility.DisplayDialog("Saving node positions", "The nodes positions have been changed, would you like to save them ?", "Yes", "No")) + { + SaveInfo.instance.nodePositions = myGraph.SavePositions(); + saveElemPositionsInServer(); + + } + //remove the toolbar + rootVisualElement.RemoveAt(0); + //remove the graph + rootVisualElement.Remove(myGraph); + + } + + private void saveElemPositionsInServer() + { + List trackables = TrackableRequest.GetAllTrackables(worldStorageServer); + List anchors = WorldAnchorRequest.GetAllWorldAnchors(worldStorageServer); + foreach (Trackable serverTrack in trackables) + { + if (serverTrack.KeyvalueTags.ContainsKey("unityAuthoringPosX") && serverTrack.KeyvalueTags.ContainsKey("unityAuthoringPosY")) + { + float xLocal = SaveInfo.instance.nodePositions[serverTrack.UUID.ToString()].x; + float yLocal = SaveInfo.instance.nodePositions[serverTrack.UUID.ToString()].y; + float xServer = float.Parse(serverTrack.KeyvalueTags["unityAuthoringPosX"][0]); + float yServer = float.Parse(serverTrack.KeyvalueTags["unityAuthoringPosY"][0]); + if ((xLocal != xServer) && (yLocal != yServer)) + { + var posX = new List(); + posX.Add(SaveInfo.instance.nodePositions[serverTrack.UUID.ToString()].x.ToString()); + serverTrack.KeyvalueTags["unityAuthoringPosX"] = posX; + var posY = new List(); + posY.Add(SaveInfo.instance.nodePositions[serverTrack.UUID.ToString()].y.ToString()); + serverTrack.KeyvalueTags["unityAuthoringPosY"] = posY; + TrackableRequest.UpdateTrackable(worldStorageServer, serverTrack); + } + } + else + { + var posX = new List(); + posX.Add(SaveInfo.instance.nodePositions[serverTrack.UUID.ToString()].x.ToString()); + serverTrack.KeyvalueTags["unityAuthoringPosX"] = posX; + var posY = new List(); + posY.Add(SaveInfo.instance.nodePositions[serverTrack.UUID.ToString()].y.ToString()); + serverTrack.KeyvalueTags["unityAuthoringPosY"] = posY; + TrackableRequest.UpdateTrackable(worldStorageServer, serverTrack); + } + } + foreach (WorldAnchor serverWorldAnchor in anchors) + { + if (serverWorldAnchor.KeyvalueTags.ContainsKey("unityAuthoringPosX") && serverWorldAnchor.KeyvalueTags.ContainsKey("unityAuthoringPosY")) + { + float xLocal = SaveInfo.instance.nodePositions[serverWorldAnchor.UUID.ToString()].x; + float yLocal = SaveInfo.instance.nodePositions[serverWorldAnchor.UUID.ToString()].y; + float xServer = float.Parse(serverWorldAnchor.KeyvalueTags["unityAuthoringPosX"][0]); + float yServer = float.Parse(serverWorldAnchor.KeyvalueTags["unityAuthoringPosY"][0]); + if ((xLocal != xServer) && (yLocal != yServer)) + { + var posX = new List(); + posX.Add(SaveInfo.instance.nodePositions[serverWorldAnchor.UUID.ToString()].x.ToString()); + serverWorldAnchor.KeyvalueTags["unityAuthoringPosX"] = posX; + var posY = new List(); + posY.Add(SaveInfo.instance.nodePositions[serverWorldAnchor.UUID.ToString()].y.ToString()); + serverWorldAnchor.KeyvalueTags["unityAuthoringPosY"] = posY; + WorldAnchorRequest.UpdateWorldAnchor(worldStorageServer, serverWorldAnchor); + } + } + else + { + var posX = new List(); + posX.Add(SaveInfo.instance.nodePositions[serverWorldAnchor.UUID.ToString()].x.ToString()); + serverWorldAnchor.KeyvalueTags["unityAuthoringPosX"] = posX; + var posY = new List(); + posY.Add(SaveInfo.instance.nodePositions[serverWorldAnchor.UUID.ToString()].y.ToString()); + serverWorldAnchor.KeyvalueTags["unityAuthoringPosY"] = posY; + WorldAnchorRequest.UpdateWorldAnchor(worldStorageServer, serverWorldAnchor); + } + } + } + + internal void createTrackableNode(string uUID, float posX, float posY) + { + Trackable track = TrackableRequest.GetTrackable(worldStorageServer, uUID); + myGraph.createTrackableNode(track, posX, posY); + } + + internal void createAnchorNode(string uUID, float posX, float posY) + { + WorldAnchor wa = WorldAnchorRequest.GetWorldAnchor(worldStorageServer, uUID); + myGraph.createAnchorNode(wa, posX, posY); + } + + internal void createLink(string uUID) + { + WorldLink worldLink = WorldLinkRequest.GetWorldLink(worldStorageServer, uUID); + myGraph.createLink(worldLink); + } + + private Toolbar GenerateToolbar() + { + var toolbar = new Toolbar(); + + var createNodeT = new Button(clickEvent: () => { + TrackableWindow.ShowWindow(worldStorageServer, worldStorageUser); + TrackableWindow.winSingleton.nodePosX = 0; + TrackableWindow.winSingleton.nodePosY = 0; + }); + createNodeT.text = "Create Trackable"; + toolbar.Add(createNodeT); + + var createNodeWA = new Button(clickEvent: () => { + WorldAnchorWindow.ShowWindow(worldStorageServer, worldStorageUser); + WorldAnchorWindow.winSingleton.nodePosX = 0; + WorldAnchorWindow.winSingleton.nodePosY = 0; + }); + createNodeWA.text = "Create World Anchor"; + toolbar.Add(createNodeWA); + + toolbar.Add(new ToolbarSpacer() + { + flex = true + }); + + var reload = new Button(clickEvent: () => { + Reload(); + }) + { + text = "reload" + }; + toolbar.Add(reload); + + return toolbar; + } + + public void ConstructGraphView() + { + myGraph = new ARFGraphView + { + name = "ARF Graph", + worldStorageServer = worldStorageServer, + worldStorageUser = worldStorageUser + }; + myGraph.paintWorldStorage(); + SaveInfo.instance.toReFrame = true; + } + + private void OnValidate() + { + Debug.Log("validate"); + } + + + void OnGUI() + { + ori = GUI.backgroundColor; // remember ori color + + gsTest = new GUIStyle("window"); + gsTest.normal.textColor = WorldStorageWindow.arfColors[0]; + gsTest.fontStyle = FontStyle.Bold; + + EditorGUILayout.BeginVertical(); + EditorGUILayout.Space(24); + + + EditorGUI.BeginChangeCheck(); + worldStorageServer = (WorldStorageServer)EditorGUILayout.ObjectField("World Storage Server", worldStorageServer, typeof(WorldStorageServer), false, GUILayout.Width(500)); + if (EditorGUI.EndChangeCheck()) + { + OnDisable(); + initNodePos(); + OnEnable(); + //ConstructGraphView(); + } + + + /*EditorGUILayout.BeginHorizontal(); + tempStorageUrl = EditorGUILayout.TextField(tempStorageUrl); + EditorGUILayout.LabelField(":", GUILayout.ExpandWidth(false), GUILayout.Width(5)); + tempStoragePort = EditorGUILayout.IntField(tempStoragePort, GUILayout.ExpandWidth(false), GUILayout.Width(40)); + GUILayout.Space(5); + *//* if (GUILayout.Button("Change WorldStorage")) + { + ChangeWorldStorage(); + }*//* + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal();*/ + + + GUI.contentColor = WorldStorageWindow.arfColors[1]; + WorldStorageWindow.DrawCopyright(); + if (SaveInfo.instance.toReFrame) + { + myGraph.FrameAllElements(); + SaveInfo.instance.toReFrame = false; + } + EditorGUILayout.EndVertical(); + } + + private void ChangeWorldStorage() + { + string[] guids1 = AssetDatabase.FindAssets("t:WorldStorageServer", null); + + foreach (string guid1 in guids1) + { + string path = AssetDatabase.GUIDToAssetPath(guid1); + WorldStorageServer server = AssetDatabase.LoadAssetAtPath(path, typeof(WorldStorageServer)) as WorldStorageServer; + if ((server.port == tempStoragePort)&&(server.basePath == tempStorageUrl)) + { + this.worldStorageServer = server; + myGraph.worldStorageServer = server; + } + else + { + WorldStorageServer newServer = (WorldStorageServer) ScriptableObject.CreateInstance(typeof(WorldStorageServer)); + newServer.basePath = tempStorageUrl; + } + } + } + + void Update() + { + } + + private bool positionshaveBeenChanged() + { + bool changed = false; + foreach(ARFNode node in myGraph.nodes) + { + float nodeX = node.GetPosition().x; + float nodeY = node.GetPosition().y; + float dataX = SaveInfo.instance.nodePositions[node.GUID].x; + float dataY = SaveInfo.instance.nodePositions[node.GUID].y; + if((nodeX != dataX) || (nodeY != dataY)) + { + changed = true; + return changed; + } + } + return changed; + } + + public void Reload() + { + if (positionshaveBeenChanged() && EditorUtility.DisplayDialog("Saving node positions", "The nodes positions have been changed, would you like to save them ?", "Yes", "No")) + { + SaveInfo.instance.nodePositions = myGraph.SavePositions(); + } + myGraph.reload(); + SaveInfo.instance.toReFrame = true; + } + + public void RefreshWithoutReframe() + { + if (positionshaveBeenChanged() && EditorUtility.DisplayDialog("Saving node positions", "The nodes positions have been changed, would you like to save them ?", "Yes", "No")) + { + SaveInfo.instance.nodePositions = myGraph.SavePositions(); + } + myGraph.reload(); + } + } } \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs.meta b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs.meta index dd5ac4d..3634acd 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs.meta +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs.meta @@ -3,7 +3,10 @@ guid: 8dd64e8d8a545ab45b424402550b55a6 MonoImporter: externalObjects: {} serializedVersion: 2 - defaultReferences: [] + defaultReferences: + - m_ViewDataDictionary: {instanceID: 0} + - worldStorageServer: {fileID: 11400000, guid: 3a9ba82f4e8dd124ca2b005861c64d01, type: 2} + - worldStorageUser: {fileID: 11400000, guid: c0696089e4a855b46ad490437919b1e8, type: 2} executionOrder: 0 icon: {instanceID: 0} userData: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/WorldLinkListener.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/WorldLinkListener.cs new file mode 100644 index 0000000..36c855f --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/WorldLinkListener.cs @@ -0,0 +1,27 @@ +using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows; +using ETSI.ARF.WorldStorage; +using ETSI.ARF.WorldStorage.UI; +using UnityEditor; +using UnityEditor.Experimental.GraphView; +using UnityEngine; +using UnityEngine.UIElements; + +namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph +{ + public class WorldLinkListener : IEdgeConnectorListener + { + public void OnDrop(GraphView graphView, Edge edge) + { + ARFNode fromNode = edge.output.node as ARFNode; + ARFNode toNode = edge.input.node as ARFNode; + + NodeEditorWindow.ShowWindow((ARFEdgeLink)edge); + //WorldLinkWindow.preFill(fromNode, toNode); + } + + public void OnDropOutsidePort(Edge edge, Vector2 position) + { + Debug.Log("OnDropOutsidePort"); + } + } +} \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/WorldLinkListener.cs.meta b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/WorldLinkListener.cs.meta new file mode 100644 index 0000000..e19f2ea --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/WorldLinkListener.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 54dbfcfdc75de1b46bc7da09df52db34 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/NodeEditorWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/NodeEditorWindow.cs new file mode 100644 index 0000000..856a1f2 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/NodeEditorWindow.cs @@ -0,0 +1,70 @@ +using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph; +using ETSI.ARF.WorldStorage; +using ETSI.ARF.WorldStorage.UI; +using Org.OpenAPITools.Model; +using System; +using UnityEditor; +using UnityEngine; + +namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows +{ + public class NodeEditorWindow : EditorWindow + { + public enum GraphEditorType + { + TRACKABLE, + WORLDANCHOR, + WORLDLINK + } + + public GraphEditorType type; + + // UI stuffs + private Vector2 scrollPos; + static public NodeEditorWindow winSingleton; + + public static void ShowWindow(ARFNodeTrackable trackableNode) + { + Type inspectorType = Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll"); + winSingleton = GetWindow("Trackable Editor", true, inspectorType); + winSingleton.type = GraphEditorType.TRACKABLE; + } + + public static void ShowWindow(ARFNodeWorldAnchor worldAnchorNode) + { + Type inspectorType = Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll"); + winSingleton = GetWindow("Anchor Editor", true, inspectorType); + winSingleton.type = GraphEditorType.WORLDANCHOR; + } + + public static void ShowWindow(ARFEdgeLink graphEdge) + { + Type inspectorType = Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll"); + winSingleton = GetWindow("Link Editor", true, inspectorType); + winSingleton.type = GraphEditorType.WORLDLINK; + } + + public void OnGUI() + { + + scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.ExpandWidth(true)); + + switch (type) + { + case GraphEditorType.WORLDLINK: + GUILayout.Label("link"); + break; + case GraphEditorType.TRACKABLE: + GUILayout.Label("tra"); + break; + case GraphEditorType.WORLDANCHOR: + GUILayout.Label("wa"); + break; + default: + break; + } + + EditorGUILayout.EndScrollView(); + } + } +} \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/NodeEditorWindow.cs.meta b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/NodeEditorWindow.cs.meta new file mode 100644 index 0000000..1079749 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/NodeEditorWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e219817d65c8b1f40ad85e6185e89e92 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs index f6da0d8..d6ac48b 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs @@ -26,7 +26,8 @@ using System.Collections.Generic; using UnityEngine; using UnityEditor; using ETSI.ARF.WorldStorage.REST; - +using System; + #if USING_OPENAPI_GENERATOR using Org.OpenAPITools.Api; using Org.OpenAPITools.Model; @@ -66,8 +67,15 @@ namespace ETSI.ARF.WorldStorage.UI private Color ori; private GUIStyle gsTest; + //graph params to generate the node + public bool useCoord; + public float nodePosX = 0; + public float nodePosY = 0; + public static void ShowWindow(WorldStorageServer ws, WorldStorageUser user, string UUID = "") - { + { + Type inspectorType = Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll"); + GetWindow("Menu Editor", true, inspectorType); winSingleton = EditorWindow.GetWindow(typeof(TrackableWindow), false, WorldStorageWindow.winName) as TrackableWindow; winSingleton.worldStorageServer = ws; winSingleton.worldStorageUser = user; @@ -184,8 +192,18 @@ namespace ETSI.ARF.WorldStorage.UI if (string.IsNullOrEmpty(UUID) || UUID == "0") UUID = System.Guid.Empty.ToString(); Trackable obj = GenerateTrackable(); UUID = TrackableRequest.AddTrackable(worldStorageServer, obj); - WorldStorageWindow.WorldStorageWindowSingleton.GetTrackables(); - WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + + if (WorldStorageWindow.WorldStorageWindowSingleton != null) + { + WorldStorageWindow.WorldStorageWindowSingleton.GetTrackables(); + WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + } + if (GraphWindow.graphWindowSingleton != null) + { + UUID = UUID.Replace("\"", ""); + GraphWindow.graphWindowSingleton.createTrackableNode(UUID, nodePosX, nodePosY); + } + Close(); } GUI.backgroundColor = WorldStorageWindow.arfColors[2]; @@ -198,8 +216,16 @@ namespace ETSI.ARF.WorldStorage.UI Trackable obj = GenerateTrackable(); UUID = TrackableRequest.UpdateTrackable(worldStorageServer, obj); } - WorldStorageWindow.WorldStorageWindowSingleton.GetTrackables(); - WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + if (WorldStorageWindow.WorldStorageWindowSingleton != null) + { + WorldStorageWindow.WorldStorageWindowSingleton.GetTrackables(); + WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + } + if (GraphWindow.graphWindowSingleton != null) + { + GraphWindow.graphWindowSingleton.Reload(); + } + Close(); } // ########################################################### @@ -212,8 +238,16 @@ namespace ETSI.ARF.WorldStorage.UI creatorUUID = System.Guid.Empty.ToString(); type = Trackable.TrackableTypeEnum.OTHER; unit = UnitSystem.CM; - WorldStorageWindow.WorldStorageWindowSingleton.GetTrackables(); - WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + if (WorldStorageWindow.WorldStorageWindowSingleton != null) + { + WorldStorageWindow.WorldStorageWindowSingleton.GetTrackables(); + WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + } + if (GraphWindow.graphWindowSingleton != null) + { + GraphWindow.graphWindowSingleton.Reload(); + } + Close(); } GUI.backgroundColor = ori; @@ -283,7 +317,15 @@ namespace ETSI.ARF.WorldStorage.UI System.Guid _uuid = System.Guid.Parse(UUID); System.Guid _creator = System.Guid.Parse(worldStorageUser.UUID); - Trackable t = new Trackable(_uuid, customName, _creator, type, trackableEncodingInformation, trackablePayload, _localCRS, unit, _trackableSize, keyValueTags); + Trackable t = new Trackable(_uuid, customName, _creator, type, trackableEncodingInformation, trackablePayload, _localCRS, unit, _trackableSize, keyValueTags); + + var posX = new List(); + posX.Add(nodePosX.ToString()); + t.KeyvalueTags["unityAuthoringPosX"] = posX; + var posY = new List(); + posY.Add(nodePosY.ToString()); + t.KeyvalueTags["unityAuthoringPosY"] = posY; + return t; } } diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs.meta b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs.meta index 40f6111..020c2af 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs.meta +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs.meta @@ -3,7 +3,10 @@ guid: 229d5ea484d30f945b9318581fb4f2da MonoImporter: externalObjects: {} serializedVersion: 2 - defaultReferences: [] + defaultReferences: + - m_ViewDataDictionary: {instanceID: 0} + - worldStorageServer: {fileID: 11400000, guid: 4f997253243de534dad12937f1284975, type: 2} + - worldStorageUser: {instanceID: 0} executionOrder: 0 icon: {instanceID: 0} userData: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldAnchorWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldAnchorWindow.cs index ae8f0c3..328e950 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldAnchorWindow.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldAnchorWindow.cs @@ -26,7 +26,8 @@ using System.Collections.Generic; using UnityEngine; using UnityEditor; using ETSI.ARF.WorldStorage.REST; - +using System; + #if USING_OPENAPI_GENERATOR using Org.OpenAPITools.Api; using Org.OpenAPITools.Model; @@ -63,8 +64,15 @@ namespace ETSI.ARF.WorldStorage.UI private Color ori; private GUIStyle gsTest; + //graph params to generate the node + public bool useCoord; + public float nodePosX = 0; + public float nodePosY = 0; + public static void ShowWindow(WorldStorageServer ws, WorldStorageUser user, string UUID = "") - { + { + Type inspectorType = Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll"); + GetWindow("WorldAnchor Editor", true, inspectorType); winSingleton = EditorWindow.GetWindow(typeof(WorldAnchorWindow), false, WorldStorageWindow.winName) as WorldAnchorWindow; winSingleton.worldStorageServer = ws; winSingleton.worldStorageUser = user; @@ -162,8 +170,17 @@ namespace ETSI.ARF.WorldStorage.UI if (string.IsNullOrEmpty(UUID) || UUID == "0") UUID = System.Guid.Empty.ToString(); WorldAnchor obj = GenerateWorldAnchor(); UUID = WorldAnchorRequest.AddWorldAnchor(worldStorageServer, obj); - WorldStorageWindow.WorldStorageWindowSingleton.GetWorldAnchors(); - WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + if (WorldStorageWindow.WorldStorageWindowSingleton != null) + { + WorldStorageWindow.WorldStorageWindowSingleton.GetWorldAnchors(); + WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + } + if (GraphWindow.graphWindowSingleton != null) + { + UUID = UUID.Replace("\"", ""); + GraphWindow.graphWindowSingleton.createAnchorNode(UUID, nodePosX, nodePosY); + } + Close(); } GUI.backgroundColor = WorldStorageWindow.arfColors[2]; @@ -174,10 +191,18 @@ namespace ETSI.ARF.WorldStorage.UI if (!string.IsNullOrEmpty(UUID) && UUID != "0") { WorldAnchor obj = GenerateWorldAnchor(); - UUID = WorldAnchorRequest.UpdateWorldAnchor(worldStorageServer, obj); - WorldStorageWindow.WorldStorageWindowSingleton.GetWorldAnchors(); - WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + UUID = WorldAnchorRequest.UpdateWorldAnchor(worldStorageServer, obj); + if (WorldStorageWindow.WorldStorageWindowSingleton != null) + { + WorldStorageWindow.WorldStorageWindowSingleton.GetWorldAnchors(); + WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + } + if (GraphWindow.graphWindowSingleton != null) + { + GraphWindow.graphWindowSingleton.Reload(); + } } + Close(); } // ########################################################### @@ -189,8 +214,16 @@ namespace ETSI.ARF.WorldStorage.UI UUID = System.Guid.Empty.ToString(); creatorUUID = System.Guid.Empty.ToString(); unit = UnitSystem.CM; - WorldStorageWindow.WorldStorageWindowSingleton.GetWorldAnchors(); - WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + if (WorldStorageWindow.WorldStorageWindowSingleton != null) + { + WorldStorageWindow.WorldStorageWindowSingleton.GetWorldAnchors(); + WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + } + if (GraphWindow.graphWindowSingleton != null) + { + GraphWindow.graphWindowSingleton.Reload(); + } + Close(); } GUI.backgroundColor = ori; @@ -239,9 +272,9 @@ namespace ETSI.ARF.WorldStorage.UI #else List trackableDimension = new List(); #endif - _worldAnchorSize.Add(worldAnchorSize.x); _worldAnchorSize.Add(worldAnchorSize.x); _worldAnchorSize.Add(worldAnchorSize.y); + _worldAnchorSize.Add(worldAnchorSize.z); Debug.Log("Created dimension"); Matrix4x4 localCRS = new Matrix4x4(); @@ -256,7 +289,15 @@ namespace ETSI.ARF.WorldStorage.UI System.Guid _uuid = System.Guid.Parse(UUID); System.Guid _creator = System.Guid.Parse(worldStorageUser.UUID); - WorldAnchor t = new WorldAnchor(_uuid, customName, _creator, _localCRS, unit, _worldAnchorSize, keyValueTags); + WorldAnchor t = new WorldAnchor(_uuid, customName, _creator, _localCRS, unit, _worldAnchorSize, keyValueTags); + + var posX = new List(); + posX.Add(nodePosX.ToString()); + t.KeyvalueTags["unityAuthoringPosX"] = posX; + var posY = new List(); + posY.Add(nodePosY.ToString()); + t.KeyvalueTags["unityAuthoringPosY"] = posY; + return t; } } diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs new file mode 100644 index 0000000..d20562f --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs @@ -0,0 +1,218 @@ +using ETSI.ARF.WorldStorage; +using ETSI.ARF.WorldStorage.REST; +using ETSI.ARF.WorldStorage.UI; +using Org.OpenAPITools.Model; +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEditor.UIElements; +using UnityEngine; +using UnityEngine.UIElements; + +namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows +{ + public class WorldGraphWindow : EditorWindow + { + + [HideInInspector] public WorldStorageServer worldStorageServer; + [HideInInspector] public WorldStorageUser worldStorageUser; + + private ARFGraphView myGraph; + + [MenuItem("ARFWorldStorage/Edit Graph...")] + public static void ShowWindow() + { + GetWindow("Graph Editor", true, typeof(SceneView)); + } + + public void OnEnable() + { + if (SaveInfo.instance.nodePositions == null) + { + SaveInfo.instance.initNodePos(worldStorageServer); + } + + rootVisualElement.Add(GenerateToolbar()); + + ConstructGraphView(); + myGraph.style.top = Length.Percent(11); + rootVisualElement.Add(myGraph); + } + + //initiate the graphView Attribute + public void ConstructGraphView() + { + myGraph = new ARFGraphView + { + name = "ARF Graph", + worldStorageServer = worldStorageServer, + worldStorageUser = worldStorageUser + }; + //top offset so that the graph does'nt overlap with the rest of the ui + myGraph.style.top = Length.Percent(11); + myGraph.paintWorldStorage(); + myGraph.StretchToParentSize(); + SaveInfo.instance.toReFrame = true; + } + + + void OnGUI() + { + EditorGUILayout.BeginVertical(); + EditorGUILayout.Space(24); + + EditorGUI.BeginChangeCheck(); + worldStorageServer = (WorldStorageServer)EditorGUILayout.ObjectField("World Storage Server", worldStorageServer, typeof(WorldStorageServer), false, GUILayout.Width(500)); + if (EditorGUI.EndChangeCheck()) + { + myGraph.saveElemPositionsInServer(); + rootVisualElement.Remove(myGraph); + + SaveInfo.instance.initNodePos(worldStorageServer); + + ConstructGraphView(); + myGraph.style.top = Length.Percent(11); + rootVisualElement.Add(myGraph); + } + + + //reframe all elements to see them all + if (SaveInfo.instance.toReFrame) + { + myGraph.FrameAllElements(); + SaveInfo.instance.toReFrame = false; + } + EditorGUILayout.EndVertical(); + } + private bool localAndServerDifferent() + { + foreach (ARFNode node in myGraph.nodes) + { + float nodeX = node.GetPosition().x; + float nodeY = node.GetPosition().y; + if (SaveInfo.instance.nodePositions.ContainsKey(node.GUID)){ + float dataX = SaveInfo.instance.nodePositions[node.GUID].x; + float dataY = SaveInfo.instance.nodePositions[node.GUID].y; + if ((nodeX != dataX) || (nodeY != dataY)) + { + return true; + } + } + else + { + return true; + } + } + return false; + } + + + //generate the window's top toolbar + private Toolbar GenerateToolbar() + { + var toolbar = new Toolbar(); + + var createNodeT = new Button(clickEvent: () => + { + TrackableWindow.ShowWindow(worldStorageServer, worldStorageUser); + TrackableWindow.winSingleton.nodePosX = 0; + TrackableWindow.winSingleton.nodePosY = 0; + }); + createNodeT.text = "Create Trackable"; + toolbar.Add(createNodeT); + + var createNodeWA = new Button(clickEvent: () => + { + WorldAnchorWindow.ShowWindow(worldStorageServer, worldStorageUser); + WorldAnchorWindow.winSingleton.nodePosX = 0; + WorldAnchorWindow.winSingleton.nodePosY = 0; + }); + createNodeWA.text = "Create World Anchor"; + toolbar.Add(createNodeWA); + + toolbar.Add(new ToolbarSpacer() + { + flex = true + }); + + var save = new Button(clickEvent: () => + { + myGraph.saveElemPositionsInServer(); + }) + { + text = "Save" + }; + toolbar.Add(save); + + return toolbar; + } + } + + public class SaveInfo : ScriptableSingleton + { + [SerializeField] + public Dictionary nodePositions; + public List linkIds; + + public List elemsToRemove; + + //keep the info of the graph reframe + public Boolean toReFrame = false; + + public WorldStorageServer worldStorageServer; + + public void initNodePos(WorldStorageServer server) + { + worldStorageServer = server; + + instance.nodePositions = new Dictionary(); + foreach (Trackable track in TrackableRequest.GetAllTrackables(worldStorageServer)) + { + if (track.KeyvalueTags.ContainsKey("unityAuthoringPosX") && track.KeyvalueTags.ContainsKey("unityAuthoringPosY")) + { + var posX = RoundToNearestHalf(float.Parse(track.KeyvalueTags["unityAuthoringPosX"][0])); + var posY = RoundToNearestHalf(float.Parse(track.KeyvalueTags["unityAuthoringPosY"][0])); + Rect trackPos = new Rect(posX, posY, 135, 77); + instance.nodePositions[track.UUID.ToString()] = trackPos; + } + else + { + Rect trackPos = new Rect(0, 0, 135, 77); + instance.nodePositions[track.UUID.ToString()] = trackPos; + } + } + foreach (WorldAnchor wa in WorldAnchorRequest.GetAllWorldAnchors(worldStorageServer)) + { + if (wa.KeyvalueTags.ContainsKey("unityAuthoringPosX") && wa.KeyvalueTags.ContainsKey("unityAuthoringPosY")) + { + var posX = RoundToNearestHalf(float.Parse(wa.KeyvalueTags["unityAuthoringPosX"][0])); + var posY = RoundToNearestHalf(float.Parse(wa.KeyvalueTags["unityAuthoringPosY"][0])); + Rect waPos = new Rect(posX, posY, 135, 77); + instance.nodePositions[wa.UUID.ToString()] = waPos; + } + else + { + Rect trackPos = new Rect(0, 0, 135, 77); + instance.nodePositions[wa.UUID.ToString()] = trackPos; + } + } + + instance.linkIds = new List(); + foreach (WorldLink link in WorldLinkRequest.GetAllWorldLinks(worldStorageServer)) + { + instance.linkIds.Add(link.UUID.ToString()); + } + instance.toReFrame = true; + + instance.elemsToRemove = new List(); + } + + //method to predict the position of a node (the float that will be saved in the PositionInfo singleton) + public static float RoundToNearestHalf(float a) + { + return a = Mathf.Round(a * 2f) * 0.5f; + } + + + } +} \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs.meta b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs.meta new file mode 100644 index 0000000..ad87e74 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 2c1a0c92306453d46897c1af6cb5c2f9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: + - m_ViewDataDictionary: {instanceID: 0} + - worldStorageServer: {fileID: 11400000, guid: 777684ed8f62c9d408a1813e8382c676, type: 2} + - worldStorageUser: {fileID: 11400000, guid: c0696089e4a855b46ad490437919b1e8, type: 2} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldLinkWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldLinkWindow.cs index 039ca12..bbd3b00 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldLinkWindow.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldLinkWindow.cs @@ -1,299 +1,365 @@ -// -// ARF - Augmented Reality Framework (ETSI ISG ARF) -// -// Copyright 2022 ETSI -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Last change: June 2022 -// - -#define USING_OPENAPI_GENERATOR // alt. is Swagger -#define isDEBUG - -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEditor; -using ETSI.ARF.WorldStorage.REST; - -#if USING_OPENAPI_GENERATOR -using Org.OpenAPITools.Api; -using Org.OpenAPITools.Model; -#else -using IO.Swagger.Api; -using IO.Swagger.Model; -#endif - -namespace ETSI.ARF.WorldStorage.UI -{ - public class WorldLinkWindow : EditorWindow - { - static public WorldLinkWindow winSingleton; - - [HideInInspector] public WorldStorageServer worldStorageServer; - [HideInInspector] public WorldStorageUser worldStorageUser; - - [SerializeField] public List anchors = new List(); - - bool groupEnabled; - private static GUILayoutOption miniButtonWidth = GUILayout.Width(50); - - // World Anchors params - string UUID = System.Guid.Empty.ToString(); - string customName = "(no name for World Links)"; - string creatorUUID = System.Guid.Empty.ToString(); - // From... - private bool showListFrom = true; - string fromName = "(none)"; - string fromUUID = System.Guid.Empty.ToString(); - // To... - private bool showListTo = true; - string toName = "(none)"; - string toUUID = System.Guid.Empty.ToString(); - - UnitSystem unit = UnitSystem.CM; - ObjectType fromType = ObjectType.NotIdentified, toType = ObjectType.NotIdentified; - Vector3 localCRS_pos; - Vector3 localCRS_rot; - [SerializeField] Dictionary> keyValueTags = new Dictionary>(); - - // UI stuffs - private Vector2 scrollPos; - private Color ori; - private GUIStyle gsTest; - - public static void ShowWindow(WorldStorageServer ws, WorldStorageUser user, string UUID = "") - { - winSingleton = EditorWindow.GetWindow(typeof(WorldLinkWindow), false, WorldStorageWindow.winName) as WorldLinkWindow; - winSingleton.worldStorageServer = ws; - winSingleton.worldStorageUser = user; - if (!string.IsNullOrEmpty(UUID)) - { - winSingleton.UUID = UUID; - winSingleton.GetWorldLinkParams(); - } - } - - public WorldLinkWindow() - { - // init somne stuffs - } - - void OnGUI() - { - ori = GUI.backgroundColor; // remember ori color - - gsTest = new GUIStyle("window"); - gsTest.normal.textColor = WorldStorageWindow.arfColors[0]; - gsTest.fontStyle = FontStyle.Bold; - - scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.ExpandWidth(true)); - WorldStorageWindow.DrawCopyright(); - - DrawAnchorStuffs(); - - EditorGUILayout.EndScrollView(); - - if (GUILayout.Button("Close Window")) - { - Close(); - } - } - - void DrawAnchorStuffs() - { - GUILayout.BeginVertical("World Link Editor", gsTest); - // - GUILayout.Label("Server: " + worldStorageServer.serverName, EditorStyles.whiteLargeLabel); - GUILayout.Label("User: " + worldStorageUser.userName, EditorStyles.whiteLargeLabel); - EditorGUILayout.Space(); - - //GUILayout.BeginHorizontal(); - customName = EditorGUILayout.TextField("Name of Link", customName); -#if isDEBUG - GUILayout.Label("UUID: " + UUID, EditorStyles.miniLabel); // readonly - GUILayout.Label("Creator UID: " + creatorUUID, EditorStyles.miniLabel); // readonly -#endif - EditorGUILayout.Space(); - - GUI.backgroundColor = WorldStorageWindow.arfColors[1]; - if (GUILayout.Button("Read Parameters")) - { - UUID = WorldStorageWindow.GetUUIDFromString(customName); - if (UUID == null) UUID = customName; // try this - GetWorldLinkParams(); - } - GUI.backgroundColor = ori; - - unit = (UnitSystem)EditorGUILayout.EnumPopup("Unit System:", unit); - - EditorGUILayout.Space(); - showListFrom = EditorGUILayout.Foldout(showListFrom, "Parent Object (From)"); - if (showListFrom) - { - EditorGUILayout.BeginHorizontal(); - fromUUID = EditorGUILayout.TextField("UUID", fromUUID); - GUI.backgroundColor = WorldStorageWindow.arfColors[1]; - if (GUILayout.Button("Find", EditorStyles.miniButtonLeft, miniButtonWidth)) - { - // TODO Request the object from the server - fromName = "(not implemented yet)"; - fromType = ObjectType.NotIdentified; - } - EditorGUILayout.EndHorizontal(); - GUI.backgroundColor = ori; - fromName = EditorGUILayout.TextField("Name", fromName); - fromType = (ObjectType)EditorGUILayout.EnumPopup("Type:", fromType); - } - - EditorGUILayout.Space(); - showListTo = EditorGUILayout.Foldout(showListTo, "Child Object (To)"); - if (showListTo) - { - EditorGUILayout.BeginHorizontal(); - toUUID = EditorGUILayout.TextField("UUID", toUUID); - GUI.backgroundColor = WorldStorageWindow.arfColors[1]; - if (GUILayout.Button("Find", EditorStyles.miniButtonLeft, miniButtonWidth)) - { - // TODO Request the object from the server - toName = "(not implemented yet)"; - toType = ObjectType.NotIdentified; - } - EditorGUILayout.EndHorizontal(); - GUI.backgroundColor = ori; - toName = EditorGUILayout.TextField("Name", toName); - toType = (ObjectType)EditorGUILayout.EnumPopup("Type:", toType); - } - - EditorGUILayout.Space(10); - GUILayout.Label("Local CRS:"); - localCRS_pos = EditorGUILayout.Vector3Field("Position:", localCRS_pos); - localCRS_rot = EditorGUILayout.Vector3Field("Rotation:", localCRS_rot); - - EditorGUILayout.Space(); - groupEnabled = EditorGUILayout.BeginToggleGroup("Optional Parameters:", groupEnabled); - //EditorGUILayout.IntField("Number of KeyValues", 0); - //EditorGUILayout.Space(); - //EditorGUILayout.TextField("Key", ""); - //EditorGUILayout.TextField("Value", ""); - if (GUILayout.Button("Generate Dummy Key Values")) - { - // dummy - keyValueTags.Clear(); - keyValueTags.Add("Location", new List { "Room1" }); - } - EditorGUILayout.EndToggleGroup(); - // - GUILayout.EndVertical(); - - // ########################################################### - GUI.backgroundColor = WorldStorageWindow.arfColors[1]; - if (GUILayout.Button("Create New World Link")) - { - Debug.Log("POST World Link"); - - UUID = "0"; - if (string.IsNullOrEmpty(UUID) || UUID == "0") UUID = System.Guid.Empty.ToString(); - WorldLink obj = GenerateWorldLink(); - UUID = WorldLinkRequest.AddWorldLink(worldStorageServer, obj); - WorldStorageWindow.WorldStorageWindowSingleton.GetWorldLinks(); - WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); - } - - GUI.backgroundColor = WorldStorageWindow.arfColors[2]; - if (GUILayout.Button("Modify World Link")) - { - Debug.Log("PUT World Link"); - - if (!string.IsNullOrEmpty(UUID) && UUID != "0") - { - WorldLink obj = GenerateWorldLink(); - UUID = WorldLinkRequest.UpdateWorldLink(worldStorageServer, obj); - WorldStorageWindow.WorldStorageWindowSingleton.GetWorldLinks(); - WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); - } - } - - // ########################################################### - GUI.backgroundColor = WorldStorageWindow.arfColors[3]; - if (GUILayout.Button("Delete World Link")) - { - Debug.Log("Delete World Link"); - WorldLinkRequest.DeleteWorldLink(worldStorageServer, UUID); - UUID = System.Guid.Empty.ToString(); - creatorUUID = System.Guid.Empty.ToString(); - unit = UnitSystem.CM; - WorldStorageWindow.WorldStorageWindowSingleton.GetWorldLinks(); - WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); - } - GUI.backgroundColor = ori; - - // ########################################################### - GUI.backgroundColor = WorldStorageWindow.arfColors[5]; - if (GUILayout.Button("Generate GameObject Component")) - { - } - GUI.backgroundColor = ori; - } - - private void GetWorldLinkParams() - { - WorldLink obj = WorldLinkRequest.GetWorldLink(worldStorageServer, UUID); - //customName = obj.Name; - creatorUUID = obj.CreatorUUID.ToString(); - fromUUID = obj.UUIDFrom.ToString(); - toUUID = obj.UUIDTo.ToString(); - fromType = obj.TypeFrom; - toType = obj.TypeTo; - unit = obj.Unit; - if (obj.Transform.Count == 16) - { - Matrix4x4 localCRS = new Matrix4x4(); - localCRS.m00 = obj.Transform[0]; localCRS.m01 = obj.Transform[1]; localCRS.m02 = obj.Transform[2]; localCRS.m03 = obj.Transform[3]; - localCRS.m10 = obj.Transform[4]; localCRS.m11 = obj.Transform[5]; localCRS.m12 = obj.Transform[6]; localCRS.m13 = obj.Transform[7]; - localCRS.m20 = obj.Transform[8]; localCRS.m21 = obj.Transform[9]; localCRS.m22 = obj.Transform[10]; localCRS.m23 = obj.Transform[11]; - localCRS.m30 = obj.Transform[12]; localCRS.m31 = obj.Transform[13]; localCRS.m32 = obj.Transform[14]; localCRS.m33 = obj.Transform[15]; - localCRS_pos = localCRS.GetPosition(); - localCRS_rot = localCRS.rotation.eulerAngles; - } - else - { - localCRS_pos = Vector3.zero; - localCRS_rot = Vector3.zero; - } - keyValueTags = obj.KeyvalueTags; - this.Repaint(); // TODO - } - - public WorldLink GenerateWorldLink() - { - Matrix4x4 localCRS = new Matrix4x4(); - localCRS = Matrix4x4.TRS(localCRS_pos, Quaternion.Euler(localCRS_rot), Vector3.one); - List _transform3d = new List - { - localCRS.m00, localCRS.m01, localCRS.m02, localCRS.m03, - localCRS.m10, localCRS.m11, localCRS.m12, localCRS.m13, - localCRS.m20, localCRS.m21, localCRS.m22, localCRS.m23, - localCRS.m30, localCRS.m31, localCRS.m32, localCRS.m33, - }; - - System.Guid _uuid = System.Guid.Parse(UUID); - System.Guid _creator = System.Guid.Parse(worldStorageUser.UUID); - System.Guid _from = System.Guid.Parse(fromUUID); - System.Guid _to = System.Guid.Parse(toUUID); - WorldLink t = new WorldLink(_uuid, _creator, _to, _from, fromType, toType, _transform3d, unit, keyValueTags); - return t; - } - } +// +// ARF - Augmented Reality Framework (ETSI ISG ARF) +// +// Copyright 2022 ETSI +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: June 2022 +// + +#define USING_OPENAPI_GENERATOR // alt. is Swagger +#define isDEBUG + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using ETSI.ARF.WorldStorage.REST; +using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph; +using System; + +#if USING_OPENAPI_GENERATOR +using Org.OpenAPITools.Api; +using Org.OpenAPITools.Model; +#else +using IO.Swagger.Api; +using IO.Swagger.Model; +#endif + +namespace ETSI.ARF.WorldStorage.UI +{ + public class WorldLinkWindow : EditorWindow + { + static public WorldLinkWindow winSingleton; + + [HideInInspector] public WorldStorageServer worldStorageServer; + [HideInInspector] public WorldStorageUser worldStorageUser; + + [SerializeField] public List anchors = new List(); + + bool groupEnabled; + private static GUILayoutOption miniButtonWidth = GUILayout.Width(50); + + // World Anchors params + string UUID = System.Guid.Empty.ToString(); + string customName = "(no name for World Links)"; + string creatorUUID = System.Guid.Empty.ToString(); + // From... + private bool showListFrom = true; + string fromName = "(none)"; + string fromUUID = System.Guid.Empty.ToString(); + // To... + private bool showListTo = true; + string toName = "(none)"; + string toUUID = System.Guid.Empty.ToString(); + + UnitSystem unit = UnitSystem.CM; + ObjectType fromType = ObjectType.NotIdentified, toType = ObjectType.NotIdentified; + Vector3 localCRS_pos; + Vector3 localCRS_rot; + [SerializeField] Dictionary> keyValueTags = new Dictionary>(); + + // UI stuffs + private Vector2 scrollPos; + private Color ori; + private GUIStyle gsTest; + + //graph + public ARFEdgeLink graphEdge; + + public static void ShowWindow(WorldStorageServer ws, WorldStorageUser user, string UUID = "") + { + Type inspectorType = Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll"); + GetWindow("Menu Editor", true, inspectorType); + winSingleton = EditorWindow.GetWindow(typeof(WorldLinkWindow), false, WorldStorageWindow.winName) as WorldLinkWindow; + winSingleton.worldStorageServer = ws; + winSingleton.worldStorageUser = user; + if (!string.IsNullOrEmpty(UUID)) + { + winSingleton.UUID = UUID; + winSingleton.GetWorldLinkParams(); + } + } + + public WorldLinkWindow() + { + // init somne stuffs + } + + void OnGUI() + { + ori = GUI.backgroundColor; // remember ori color + + gsTest = new GUIStyle("window"); + gsTest.normal.textColor = WorldStorageWindow.arfColors[0]; + gsTest.fontStyle = FontStyle.Bold; + + scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.ExpandWidth(true)); + WorldStorageWindow.DrawCopyright(); + + DrawAnchorStuffs(); + + EditorGUILayout.EndScrollView(); + + if (GUILayout.Button("Close Window")) + { + Close(); + } + } + + void DrawAnchorStuffs() + { + GUILayout.BeginVertical("World Link Editor", gsTest); + // + GUILayout.Label("Server: " + worldStorageServer.serverName, EditorStyles.whiteLargeLabel); + GUILayout.Label("User: " + worldStorageUser.userName, EditorStyles.whiteLargeLabel); + EditorGUILayout.Space(); + + //GUILayout.BeginHorizontal(); + customName = EditorGUILayout.TextField("Name of Link", customName); +#if isDEBUG + GUILayout.Label("UUID: " + UUID, EditorStyles.miniLabel); // readonly + GUILayout.Label("Creator UID: " + creatorUUID, EditorStyles.miniLabel); // readonly +#endif + EditorGUILayout.Space(); + + GUI.backgroundColor = WorldStorageWindow.arfColors[1]; + if (GUILayout.Button("Read Parameters")) + { + UUID = WorldStorageWindow.GetUUIDFromString(customName); + if (UUID == null) UUID = customName; // try this + GetWorldLinkParams(); + } + GUI.backgroundColor = ori; + + unit = (UnitSystem)EditorGUILayout.EnumPopup("Unit System:", unit); + + EditorGUILayout.Space(); + showListFrom = EditorGUILayout.Foldout(showListFrom, "Parent Object (From)"); + if (showListFrom) + { + EditorGUILayout.BeginHorizontal(); + fromUUID = EditorGUILayout.TextField("UUID", fromUUID); + GUI.backgroundColor = WorldStorageWindow.arfColors[1]; + if (GUILayout.Button("Find", EditorStyles.miniButtonLeft, miniButtonWidth)) + { + // TODO Request the object from the server + fromName = "(not implemented yet)"; + fromType = ObjectType.NotIdentified; + } + EditorGUILayout.EndHorizontal(); + GUI.backgroundColor = ori; + fromName = EditorGUILayout.TextField("Name", fromName); + fromType = (ObjectType)EditorGUILayout.EnumPopup("Type:", fromType); + } + + EditorGUILayout.Space(); + showListTo = EditorGUILayout.Foldout(showListTo, "Child Object (To)"); + if (showListTo) + { + EditorGUILayout.BeginHorizontal(); + toUUID = EditorGUILayout.TextField("UUID", toUUID); + GUI.backgroundColor = WorldStorageWindow.arfColors[1]; + if (GUILayout.Button("Find", EditorStyles.miniButtonLeft, miniButtonWidth)) + { + // TODO Request the object from the server + toName = "(not implemented yet)"; + toType = ObjectType.NotIdentified; + } + EditorGUILayout.EndHorizontal(); + GUI.backgroundColor = ori; + toName = EditorGUILayout.TextField("Name", toName); + toType = (ObjectType)EditorGUILayout.EnumPopup("Type:", toType); + } + + EditorGUILayout.Space(10); + GUILayout.Label("Local CRS:"); + localCRS_pos = EditorGUILayout.Vector3Field("Position:", localCRS_pos); + localCRS_rot = EditorGUILayout.Vector3Field("Rotation:", localCRS_rot); + + EditorGUILayout.Space(); + groupEnabled = EditorGUILayout.BeginToggleGroup("Optional Parameters:", groupEnabled); + //EditorGUILayout.IntField("Number of KeyValues", 0); + //EditorGUILayout.Space(); + //EditorGUILayout.TextField("Key", ""); + //EditorGUILayout.TextField("Value", ""); + if (GUILayout.Button("Generate Dummy Key Values")) + { + // dummy + keyValueTags.Clear(); + keyValueTags.Add("Location", new List { "Room1" }); + } + EditorGUILayout.EndToggleGroup(); + // + GUILayout.EndVertical(); + + // ########################################################### + GUI.backgroundColor = WorldStorageWindow.arfColors[1]; + if (GUILayout.Button("Create New World Link")) + { + UUID = "0"; + if (string.IsNullOrEmpty(UUID) || UUID == "0") UUID = System.Guid.Empty.ToString(); + WorldLink obj = GenerateWorldLink(); + UUID = WorldLinkRequest.AddWorldLink(worldStorageServer, obj); + + if (WorldStorageWindow.WorldStorageWindowSingleton != null) + { + WorldStorageWindow.WorldStorageWindowSingleton.GetWorldLinks(); + WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + } + if (graphEdge != null/*GraphWindow.graphWindowSingleton != null*/) + { + UUID = UUID.Replace("\"", ""); + obj.UUID = System.Guid.Parse(UUID); + graphEdge.worldLink = obj; + } + Close(); + } + + GUI.backgroundColor = WorldStorageWindow.arfColors[2]; + if (GUILayout.Button("Modify World Link")) + { + Debug.Log("PUT World Link"); + + if (!string.IsNullOrEmpty(UUID) && UUID != "0") + { + WorldLink obj = GenerateWorldLink(); + UUID = WorldLinkRequest.UpdateWorldLink(worldStorageServer, obj); + + if (WorldStorageWindow.WorldStorageWindowSingleton != null) + { + WorldStorageWindow.WorldStorageWindowSingleton.GetWorldLinks(); + WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + } + } + Close(); + } + + // ########################################################### + GUI.backgroundColor = WorldStorageWindow.arfColors[3]; + if (GUILayout.Button("Delete World Link")) + { + Debug.Log("Delete World Link"); + WorldLinkRequest.DeleteWorldLink(worldStorageServer, UUID); + UUID = System.Guid.Empty.ToString(); + creatorUUID = System.Guid.Empty.ToString(); + unit = UnitSystem.CM; + + if (WorldStorageWindow.WorldStorageWindowSingleton != null) + { + WorldStorageWindow.WorldStorageWindowSingleton.GetWorldLinks(); + WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + } + Close(); + } + GUI.backgroundColor = ori; + + // ########################################################### + GUI.backgroundColor = WorldStorageWindow.arfColors[5]; + if (GUILayout.Button("Generate GameObject Component")) + { + } + GUI.backgroundColor = ori; + } + + private void GetWorldLinkParams() + { + WorldLink obj = WorldLinkRequest.GetWorldLink(worldStorageServer, UUID); + //customName = obj.Name; + creatorUUID = obj.CreatorUUID.ToString(); + fromUUID = obj.UUIDFrom.ToString(); + toUUID = obj.UUIDTo.ToString(); + fromType = obj.TypeFrom; + toType = obj.TypeTo; + unit = obj.Unit; + if (obj.Transform.Count == 16) + { + Matrix4x4 localCRS = new Matrix4x4(); + localCRS.m00 = obj.Transform[0]; localCRS.m01 = obj.Transform[1]; localCRS.m02 = obj.Transform[2]; localCRS.m03 = obj.Transform[3]; + localCRS.m10 = obj.Transform[4]; localCRS.m11 = obj.Transform[5]; localCRS.m12 = obj.Transform[6]; localCRS.m13 = obj.Transform[7]; + localCRS.m20 = obj.Transform[8]; localCRS.m21 = obj.Transform[9]; localCRS.m22 = obj.Transform[10]; localCRS.m23 = obj.Transform[11]; + localCRS.m30 = obj.Transform[12]; localCRS.m31 = obj.Transform[13]; localCRS.m32 = obj.Transform[14]; localCRS.m33 = obj.Transform[15]; + localCRS_pos = localCRS.GetPosition(); + localCRS_rot = localCRS.rotation.eulerAngles; + } + else + { + localCRS_pos = Vector3.zero; + localCRS_rot = Vector3.zero; + } + keyValueTags = obj.KeyvalueTags; + this.Repaint(); // TODO + } + + public WorldLink GenerateWorldLink() + { + Matrix4x4 localCRS = new Matrix4x4(); + localCRS = Matrix4x4.TRS(localCRS_pos, Quaternion.Euler(localCRS_rot), Vector3.one); + List _transform3d = new List + { + localCRS.m00, localCRS.m01, localCRS.m02, localCRS.m03, + localCRS.m10, localCRS.m11, localCRS.m12, localCRS.m13, + localCRS.m20, localCRS.m21, localCRS.m22, localCRS.m23, + localCRS.m30, localCRS.m31, localCRS.m32, localCRS.m33, + }; + + System.Guid _uuid = System.Guid.Parse(UUID); + System.Guid _creator = System.Guid.Parse(worldStorageUser.UUID); + System.Guid _from = System.Guid.Parse(fromUUID); + System.Guid _to = System.Guid.Parse(toUUID); + WorldLink t = new WorldLink(_uuid, _creator, _from, _to, fromType, toType, _transform3d, unit, keyValueTags); + return t; + } + + public static void preFill(ARFNode nodeFrom, ARFNode nodeTo) + { + //fromNode + ARFNodeTrackable nodeFromTrackable = nodeFrom as ARFNodeTrackable; + ARFNodeWorldAnchor nodeFromWorldAnchor = nodeFrom as ARFNodeWorldAnchor; + if (nodeFromTrackable != null) + { + Trackable trackFrom = nodeFromTrackable.trackable; + winSingleton.fromName = trackFrom.Name; + winSingleton.fromUUID = trackFrom.UUID.ToString(); + winSingleton.fromType = ObjectType.Trackable; + } + else if (nodeFromWorldAnchor != null) + { + WorldAnchor worldAnchorFrom = nodeFromWorldAnchor.worldAnchor; + winSingleton.fromName = worldAnchorFrom.Name; + winSingleton.fromUUID = worldAnchorFrom.UUID.ToString(); + winSingleton.fromType = ObjectType.WorldAnchor; + } + + //toNode + ARFNodeTrackable nodeToTrackable = nodeTo as ARFNodeTrackable; + ARFNodeWorldAnchor nodeToWorldAnchor = nodeTo as ARFNodeWorldAnchor; + if (nodeToTrackable != null) + { + Trackable trackTo = nodeToTrackable.trackable; + winSingleton.toName = trackTo.Name; + winSingleton.toUUID = trackTo.UUID.ToString(); + winSingleton.toType = ObjectType.Trackable; + } + else if (nodeToWorldAnchor != null) + { + WorldAnchor worldAnchorTo = nodeToWorldAnchor.worldAnchor; + winSingleton.toName = worldAnchorTo.Name; + winSingleton.toUUID = worldAnchorTo.UUID.ToString(); + winSingleton.toType = ObjectType.WorldAnchor; + } + winSingleton.Repaint(); + } + } } \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldStorageWindow.cs.meta b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldStorageWindow.cs.meta index c8d7fb0..ec99c51 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldStorageWindow.cs.meta +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldStorageWindow.cs.meta @@ -3,7 +3,10 @@ guid: a1647df9b48bf4f49a664a929fff57ff MonoImporter: externalObjects: {} serializedVersion: 2 - defaultReferences: [] + defaultReferences: + - m_ViewDataDictionary: {instanceID: 0} + - worldStorageServer: {fileID: 11400000, guid: 4f997253243de534dad12937f1284975, type: 2} + - worldStorageUser: {fileID: 11400000, guid: c0696089e4a855b46ad490437919b1e8, type: 2} executionOrder: 0 icon: {instanceID: 0} userData: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Materials.meta b/Assets/ETSI.ARF/ARF World Storage API/Materials.meta new file mode 100644 index 0000000..3f1c3d9 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b5cde36cc09a55741b364219c48efe3e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/World Storage/LocalHost8080.asset b/Assets/ETSI.ARF/ARF World Storage API/World Storage/LocalHost8080.asset new file mode 100644 index 0000000..d00574d --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/World Storage/LocalHost8080.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e4b7be4c33f68d0418c3b4e1a7053d91, type: 3} + m_Name: LocalHost8080 + m_EditorClassIdentifier: + serverName: Local hosted World Storage + company: b<>com + basePath: http://10.55.11.9 + port: 8080 + currentUser: {fileID: 11400000, guid: c0696089e4a855b46ad490437919b1e8, type: 2} diff --git a/Assets/ETSI.ARF/ARF World Storage API/World Storage/LocalHost8080.asset.meta b/Assets/ETSI.ARF/ARF World Storage API/World Storage/LocalHost8080.asset.meta new file mode 100644 index 0000000..d979dc5 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/World Storage/LocalHost8080.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3a9ba82f4e8dd124ca2b005861c64d01 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/World Storage/LocalHost8081.asset b/Assets/ETSI.ARF/ARF World Storage API/World Storage/LocalHost8081.asset new file mode 100644 index 0000000..66e0b50 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/World Storage/LocalHost8081.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e4b7be4c33f68d0418c3b4e1a7053d91, type: 3} + m_Name: LocalHost8081 + m_EditorClassIdentifier: + serverName: local hosted 8081 + company: b<>com + basePath: http://10.55.11.9 + port: 8081 + currentUser: {fileID: 11400000, guid: c0696089e4a855b46ad490437919b1e8, type: 2} diff --git a/Assets/ETSI.ARF/ARF World Storage API/World Storage/LocalHost8081.asset.meta b/Assets/ETSI.ARF/ARF World Storage API/World Storage/LocalHost8081.asset.meta new file mode 100644 index 0000000..b86dce6 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/World Storage/LocalHost8081.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 777684ed8f62c9d408a1813e8382c676 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/ProjectSettings/EditorSettings.asset b/ProjectSettings/EditorSettings.asset index de5d0b2..621c545 100644 --- a/ProjectSettings/EditorSettings.asset +++ b/ProjectSettings/EditorSettings.asset @@ -4,7 +4,6 @@ EditorSettings: m_ObjectHideFlags: 0 serializedVersion: 11 - m_ExternalVersionControlSupport: Visible Meta Files m_SerializationMode: 2 m_LineEndingsForNewScripts: 0 m_DefaultBehaviorMode: 0 @@ -12,19 +11,32 @@ EditorSettings: m_PrefabUIEnvironment: {fileID: 0} m_SpritePackerMode: 0 m_SpritePackerPaddingPower: 1 + m_Bc7TextureCompressor: 0 m_EtcTextureCompressorBehavior: 1 m_EtcTextureFastCompressor: 1 m_EtcTextureNormalCompressor: 2 m_EtcTextureBestCompressor: 4 m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref m_ProjectGenerationRootNamespace: - m_CollabEditorSettings: - inProgressEnabled: 1 m_EnableTextureStreamingInEditMode: 1 m_EnableTextureStreamingInPlayMode: 1 m_AsyncShaderCompilation: 1 + m_CachingShaderPreprocessor: 1 + m_PrefabModeAllowAutoSave: 1 m_EnterPlayModeOptionsEnabled: 0 m_EnterPlayModeOptions: 3 - m_ShowLightmapResolutionOverlay: 1 + m_GameObjectNamingDigits: 1 + m_GameObjectNamingScheme: 0 + m_AssetNamingUsesSpace: 1 m_UseLegacyProbeSampleCount: 0 - m_SerializeInlineMappingsOnOneLine: 1 \ No newline at end of file + m_SerializeInlineMappingsOnOneLine: 1 + m_DisableCookiesInLightmapper: 0 + m_AssetPipelineMode: 1 + m_RefreshImportMode: 0 + m_CacheServerMode: 0 + m_CacheServerEndpoint: + m_CacheServerNamespacePrefix: default + m_CacheServerEnableDownload: 1 + m_CacheServerEnableUpload: 1 + m_CacheServerEnableAuth: 0 + m_CacheServerEnableTls: 0 diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index e29f9aa..cb14926 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -152,7 +152,8 @@ PlayerSettings: resolutionScalingMode: 0 androidSupportedAspectRatio: 1 androidMaxAspectRatio: 2.1 - applicationIdentifier: {} + applicationIdentifier: + Standalone: com.DefaultCompany.My-project buildNumber: Standalone: 0 iPhone: 0 diff --git a/UserSettings/Layouts/default-2021.dwlt b/UserSettings/Layouts/default-2021.dwlt index db25c22..aff4bb3 100644 --- a/UserSettings/Layouts/default-2021.dwlt +++ b/UserSettings/Layouts/default-2021.dwlt @@ -1,30 +1,6 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: --- !u!114 &1 -MonoBehaviour: - m_ObjectHideFlags: 52 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 12004, guid: 0000000000000000e000000000000000, type: 0} - m_Name: - m_EditorClassIdentifier: - m_PixelRect: - serializedVersion: 2 - x: 464 - y: 157.33333 - width: 696.44446 - height: 876.8889 - m_ShowMode: 0 - m_Title: ETSI ARF - Authoring Editor - m_RootView: {fileID: 4} - m_MinSize: {x: 100, y: 121} - m_MaxSize: {x: 4000, y: 4021} - m_Maximized: 0 ---- !u!114 &2 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -38,118 +14,17 @@ MonoBehaviour: m_EditorClassIdentifier: m_PixelRect: serializedVersion: 2 - x: 12.888889 - y: 72 - width: 1365.3334 - height: 935.11115 + x: 0 + y: 42 + width: 1600 + height: 818 m_ShowMode: 4 - m_Title: Console - m_RootView: {fileID: 11} + m_Title: Graph Editor + m_RootView: {fileID: 6} m_MinSize: {x: 875, y: 300} m_MaxSize: {x: 10000, y: 10000} - m_Maximized: 0 ---- !u!114 &3 -MonoBehaviour: - m_ObjectHideFlags: 52 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} - m_Name: WorldStorageWindow - m_EditorClassIdentifier: - m_Children: [] - m_Position: - serializedVersion: 2 - x: 0 - y: 0 - width: 696.44446 - height: 876.8889 - m_MinSize: {x: 100, y: 121} - m_MaxSize: {x: 4000, y: 4021} - m_ActualView: {fileID: 17} - m_Panes: - - {fileID: 17} - m_Selected: 0 - m_LastSelected: 0 ---- !u!114 &4 -MonoBehaviour: - m_ObjectHideFlags: 52 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} - m_Name: - m_EditorClassIdentifier: - m_Children: - - {fileID: 3} - m_Position: - serializedVersion: 2 - x: 0 - y: 0 - width: 696.44446 - height: 876.8889 - m_MinSize: {x: 100, y: 121} - m_MaxSize: {x: 4000, y: 4021} - vertical: 0 - controlID: 1081 ---- !u!114 &5 -MonoBehaviour: - m_ObjectHideFlags: 52 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} - m_Name: ConsoleWindow - m_EditorClassIdentifier: - m_Children: [] - m_Position: - serializedVersion: 2 - x: 469.33334 - y: 0 - width: 534.22217 - height: 350.00006 - m_MinSize: {x: 102, y: 121} - m_MaxSize: {x: 4002, y: 4021} - m_ActualView: {fileID: 24} - m_Panes: - - {fileID: 24} - m_Selected: 0 - m_LastSelected: 0 ---- !u!114 &6 -MonoBehaviour: - m_ObjectHideFlags: 52 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} - m_Name: - m_EditorClassIdentifier: - m_Children: - - {fileID: 10} - - {fileID: 5} - m_Position: - serializedVersion: 2 - x: 0 - y: 535.1111 - width: 1003.55554 - height: 350.00006 - m_MinSize: {x: 200, y: 100} - m_MaxSize: {x: 16192, y: 8096} - vertical: 0 - controlID: 17 ---- !u!114 &7 + m_Maximized: 1 +--- !u!114 &2 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -162,19 +37,19 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Children: - - {fileID: 14} - - {fileID: 8} + - {fileID: 9} + - {fileID: 3} m_Position: serializedVersion: 2 x: 0 y: 30 - width: 1365.3334 - height: 885.11115 + width: 1600 + height: 768 m_MinSize: {x: 300, y: 200} m_MaxSize: {x: 24288, y: 16192} vertical: 0 controlID: 15 ---- !u!114 &8 +--- !u!114 &3 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -184,23 +59,24 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 1 m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} - m_Name: + m_Name: NodeEditorWindow m_EditorClassIdentifier: m_Children: [] m_Position: serializedVersion: 2 - x: 1003.55554 + x: 1186 y: 0 - width: 361.77783 - height: 885.11115 - m_MinSize: {x: 276, y: 71} + width: 414 + height: 768 + m_MinSize: {x: 101, y: 121} m_MaxSize: {x: 4001, y: 4021} - m_ActualView: {fileID: 20} + m_ActualView: {fileID: 12} m_Panes: - - {fileID: 20} - m_Selected: 0 - m_LastSelected: 0 ---- !u!114 &9 + - {fileID: 15} + - {fileID: 12} + m_Selected: 1 + m_LastSelected: 1 +--- !u!114 &4 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -217,16 +93,16 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 0 - width: 239.55556 - height: 535.1111 + width: 314 + height: 455 m_MinSize: {x: 201, y: 221} m_MaxSize: {x: 4001, y: 4021} - m_ActualView: {fileID: 21} + m_ActualView: {fileID: 16} m_Panes: - - {fileID: 21} + - {fileID: 16} m_Selected: 0 m_LastSelected: 0 ---- !u!114 &10 +--- !u!114 &5 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -236,23 +112,24 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 1 m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} - m_Name: ProjectBrowser + m_Name: ConsoleWindow m_EditorClassIdentifier: m_Children: [] m_Position: serializedVersion: 2 x: 0 - y: 0 - width: 469.33334 - height: 350.00006 - m_MinSize: {x: 231, y: 271} - m_MaxSize: {x: 10001, y: 10021} + y: 455 + width: 1186 + height: 313 + m_MinSize: {x: 101, y: 121} + m_MaxSize: {x: 4001, y: 4021} m_ActualView: {fileID: 19} m_Panes: + - {fileID: 14} - {fileID: 19} - m_Selected: 0 + m_Selected: 1 m_LastSelected: 0 ---- !u!114 &11 +--- !u!114 &6 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -265,22 +142,22 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Children: - - {fileID: 12} - {fileID: 7} - - {fileID: 13} + - {fileID: 2} + - {fileID: 8} m_Position: serializedVersion: 2 x: 0 y: 0 - width: 1365.3334 - height: 935.11115 + width: 1600 + height: 818 m_MinSize: {x: 875, y: 300} m_MaxSize: {x: 10000, y: 10000} m_UseTopView: 1 m_TopViewHeight: 30 m_UseBottomView: 1 m_BottomViewHeight: 20 ---- !u!114 &12 +--- !u!114 &7 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -297,12 +174,12 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 0 - width: 1365.3334 + width: 1600 height: 30 m_MinSize: {x: 0, y: 0} m_MaxSize: {x: 0, y: 0} m_LastLoadedLayoutName: ---- !u!114 &13 +--- !u!114 &8 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -318,12 +195,12 @@ MonoBehaviour: m_Position: serializedVersion: 2 x: 0 - y: 915.11115 - width: 1365.3334 + y: 798 + width: 1600 height: 20 m_MinSize: {x: 0, y: 0} m_MaxSize: {x: 0, y: 0} ---- !u!114 &14 +--- !u!114 &9 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -336,19 +213,19 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Children: - - {fileID: 15} - - {fileID: 6} + - {fileID: 10} + - {fileID: 5} m_Position: serializedVersion: 2 x: 0 y: 0 - width: 1003.55554 - height: 885.11115 + width: 1186 + height: 768 m_MinSize: {x: 200, y: 200} m_MaxSize: {x: 16192, y: 16192} vertical: 1 - controlID: 16 ---- !u!114 &15 + controlID: 83 +--- !u!114 &10 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -361,19 +238,19 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Children: - - {fileID: 9} - - {fileID: 16} + - {fileID: 4} + - {fileID: 11} m_Position: serializedVersion: 2 x: 0 y: 0 - width: 1003.55554 - height: 535.1111 + width: 1186 + height: 455 m_MinSize: {x: 200, y: 100} m_MaxSize: {x: 16192, y: 8096} vertical: 0 - controlID: 102 ---- !u!114 &16 + controlID: 84 +--- !u!114 &11 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -383,25 +260,25 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 1 m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} - m_Name: + m_Name: WorldGraphWindow m_EditorClassIdentifier: m_Children: [] m_Position: serializedVersion: 2 - x: 239.55556 + x: 314 y: 0 - width: 764 - height: 535.1111 - m_MinSize: {x: 202, y: 221} + width: 872 + height: 455 + m_MinSize: {x: 102, y: 121} m_MaxSize: {x: 4002, y: 4021} - m_ActualView: {fileID: 22} + m_ActualView: {fileID: 13} m_Panes: - - {fileID: 22} - - {fileID: 23} + - {fileID: 17} - {fileID: 18} - m_Selected: 0 - m_LastSelected: 1 ---- !u!114 &17 + - {fileID: 13} + m_Selected: 2 + m_LastSelected: 2 +--- !u!114 &12 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -410,33 +287,27 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a1647df9b48bf4f49a664a929fff57ff, type: 3} + m_Script: {fileID: 11500000, guid: e219817d65c8b1f40ad85e6185e89e92, type: 3} m_Name: m_EditorClassIdentifier: m_MinSize: {x: 100, y: 100} m_MaxSize: {x: 4000, y: 4000} m_TitleContent: - m_Text: ETSI ARF - Authoring Editor + m_Text: Trackable Editor m_Image: {fileID: 0} m_Tooltip: m_Pos: serializedVersion: 2 - x: 464 - y: 157.33333 - width: 696.44446 - height: 855.8889 + x: 1186 + y: 72 + width: 413 + height: 747 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default m_SaveData: [] - worldStorageServer: {fileID: 11400000, guid: 4f997253243de534dad12937f1284975, type: 2} - worldStorageUser: {fileID: 11400000, guid: ce0f40be06008b14283766424922b729, type: 2} - creators: [] - trackables: [] - anchors: [] - links: - - c6998f4f-1b8d-460b-9de8-4793b92fae2a ---- !u!114 &18 + type: 2 +--- !u!114 &13 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -444,27 +315,29 @@ MonoBehaviour: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 0} m_Enabled: 1 - m_EditorHideFlags: 1 - m_Script: {fileID: 12111, guid: 0000000000000000e000000000000000, type: 0} + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2c1a0c92306453d46897c1af6cb5c2f9, type: 3} m_Name: m_EditorClassIdentifier: - m_MinSize: {x: 400, y: 100} - m_MaxSize: {x: 2048, y: 2048} + m_MinSize: {x: 100, y: 100} + m_MaxSize: {x: 4000, y: 4000} m_TitleContent: - m_Text: Asset Store - m_Image: {fileID: -7444545952099596278, guid: 0000000000000000d000000000000000, type: 0} + m_Text: Graph Editor + m_Image: {fileID: 0} m_Tooltip: m_Pos: serializedVersion: 2 - x: 468 - y: 181 - width: 973 - height: 501 + x: 314 + y: 72 + width: 870 + height: 434 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default m_SaveData: [] ---- !u!114 &19 + worldStorageServer: {fileID: 11400000, guid: 3a9ba82f4e8dd124ca2b005861c64d01, type: 2} + worldStorageUser: {fileID: 11400000, guid: c0696089e4a855b46ad490437919b1e8, type: 2} +--- !u!114 &14 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -484,10 +357,10 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: 12.888889 - y: 637.3333 - width: 468.33334 - height: 329.00006 + x: 0 + y: 527 + width: 1185.5 + height: 292 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default @@ -505,22 +378,22 @@ MonoBehaviour: m_SkipHidden: 0 m_SearchArea: 1 m_Folders: - - Assets/ETSI.ARF/ARF World Storage API/World Storage + - Assets/ETSI.ARF/ARF World Storage API/Editor/Windows m_Globs: [] m_OriginalText: m_ViewMode: 1 - m_StartGridSize: 16 + m_StartGridSize: 64 m_LastFolders: - - Assets/ETSI.ARF/ARF World Storage API/World Storage - m_LastFoldersGridSize: 16 - m_LastProjectPath: D:\Fraunhofer\Projects\ETSI\GitLab (STF)\unity-world-storage-editor + - Assets/ETSI.ARF/ARF World Storage API/Editor/Windows + m_LastFoldersGridSize: -1 + m_LastProjectPath: C:\Dev\unity-world-storage-editor m_LockTracker: m_IsLocked: 0 m_FolderTreeState: scrollPos: {x: 0, y: 0} - m_SelectedIDs: 5e4b0000 - m_LastClickedID: 19294 - m_ExpandedIDs: 00000000424b0000444b0000464b0000484b00004a4b00004c4b00004e4b000000ca9a3bffffff7f + m_SelectedIDs: 644b0000 + m_LastClickedID: 19300 + m_ExpandedIDs: 00000000504b0000524b0000544b0000564b000000ca9a3bffffff7f m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -536,7 +409,7 @@ MonoBehaviour: m_IsRenaming: 0 m_OriginalEventType: 11 m_IsRenamingFilename: 1 - m_ClientGUIView: {fileID: 10} + m_ClientGUIView: {fileID: 0} m_SearchString: m_CreateAssetUtility: m_EndAction: {fileID: 0} @@ -548,7 +421,7 @@ MonoBehaviour: scrollPos: {x: 0, y: 0} m_SelectedIDs: m_LastClickedID: 0 - m_ExpandedIDs: 00000000424b0000444b0000464b0000484b00004a4b00004c4b00004e4b0000 + m_ExpandedIDs: 00000000504b0000524b0000544b0000564b0000 m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -573,10 +446,10 @@ MonoBehaviour: m_Icon: {fileID: 0} m_ResourceFile: m_ListAreaState: - m_SelectedInstanceIDs: - m_LastClickedInstanceID: 0 + m_SelectedInstanceIDs: d80c0000 + m_LastClickedInstanceID: 3288 m_HadKeyboardFocusLastEvent: 1 - m_ExpandedInstanceIDs: c6230000de4b0000 + m_ExpandedInstanceIDs: c6230000 m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -592,7 +465,7 @@ MonoBehaviour: m_IsRenaming: 0 m_OriginalEventType: 11 m_IsRenamingFilename: 1 - m_ClientGUIView: {fileID: 10} + m_ClientGUIView: {fileID: 5} m_CreateAssetUtility: m_EndAction: {fileID: 0} m_InstanceID: 0 @@ -601,10 +474,10 @@ MonoBehaviour: m_ResourceFile: m_NewAssetIndexInList: -1 m_ScrollPosition: {x: 0, y: 0} - m_GridSize: 16 + m_GridSize: 64 m_SkipHiddenPackages: 0 - m_DirectoriesAreaWidth: 248.11111 ---- !u!114 &20 + m_DirectoriesAreaWidth: 207 +--- !u!114 &15 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -624,10 +497,10 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: 1016.44446 - y: 102.22222 - width: 360.77783 - height: 864.11115 + x: 1186.5 + y: 72 + width: 412.5 + height: 747 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default @@ -638,14 +511,14 @@ MonoBehaviour: m_CachedPref: 160 m_ControlHash: -371814159 m_PrefName: Preview_InspectorPreview - m_LastInspectedObjectInstanceID: -1 + m_LastInspectedObjectInstanceID: 3288 m_LastVerticalScrollValue: 0 m_GlobalObjectId: m_InspectorMode: 0 m_LockTracker: m_IsLocked: 0 m_PreviewWindow: {fileID: 0} ---- !u!114 &21 +--- !u!114 &16 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -665,10 +538,10 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: 12.888889 - y: 102.22222 - width: 238.55556 - height: 514.1111 + x: 0 + y: 72 + width: 313 + height: 434 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default @@ -676,9 +549,9 @@ MonoBehaviour: m_SceneHierarchy: m_TreeViewState: scrollPos: {x: 0, y: 0} - m_SelectedIDs: 844b0000 + m_SelectedIDs: d80c0000 m_LastClickedID: 0 - m_ExpandedIDs: 34fbffff + m_ExpandedIDs: 38fbffff m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -701,8 +574,8 @@ MonoBehaviour: m_LockTracker: m_IsLocked: 0 m_CurrentSortingName: TransformSorting - m_WindowGUID: 26d3cc4a749ad3148bdaac8cbfc0727d ---- !u!114 &22 + m_WindowGUID: 4c969a2b90040154d917609493e03593 +--- !u!114 &17 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -722,10 +595,10 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: 252.44444 - y: 102.22222 - width: 762 - height: 514.1111 + x: 302.5 + y: 72 + width: 917 + height: 434 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default @@ -736,7 +609,7 @@ MonoBehaviour: collapsed: 0 displayed: 1 snapOffset: {x: 0, y: 0} - snapOffsetDelta: {x: -98.22223, y: -25.777771} + snapOffsetDelta: {x: -98, y: -26} snapCorner: 3 id: Tool Settings index: 0 @@ -917,7 +790,7 @@ MonoBehaviour: id: Scene View/Particles index: 10 layout: 4 - m_WindowGUID: f5dcb30f0be3f8447834243ac481bdf9 + m_WindowGUID: cc27987af1a868c49b0894db9c0f5429 m_Gizmos: 1 m_OverrideSceneCullingMask: 6917529027641081856 m_SceneIsLit: 1 @@ -940,9 +813,9 @@ MonoBehaviour: m_ExposureSliderValue: 0 m_SceneViewState: m_AlwaysRefresh: 0 - showFog: 1 - showSkybox: 1 - showFlares: 1 + showFog: 0 + showSkybox: 0 + showFlares: 0 showImageEffects: 1 showParticleSystems: 1 showVisualEffectGraphs: 1 @@ -990,7 +863,7 @@ MonoBehaviour: m_CameraSettings: m_Speed: 1 m_SpeedNormalized: 0.5 - m_SpeedMin: 0.01 + m_SpeedMin: 0.001 m_SpeedMax: 2 m_EasingEnabled: 1 m_EasingDuration: 0.4 @@ -1007,7 +880,7 @@ MonoBehaviour: m_SceneVisActive: 1 m_LastLockedObject: {fileID: 0} m_ViewIsLockedToObject: 0 ---- !u!114 &23 +--- !u!114 &18 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -1041,7 +914,7 @@ MonoBehaviour: m_ShowGizmos: 0 m_TargetDisplay: 0 m_ClearColor: {r: 0, g: 0, b: 0, a: 0} - m_TargetSize: {x: 3447, y: 1730.25} + m_TargetSize: {x: 1532, y: 769} m_TextureFilterMode: 0 m_TextureHideFlags: 61 m_RenderIMGUI: 0 @@ -1056,10 +929,10 @@ MonoBehaviour: m_VRangeLocked: 0 hZoomLockedByDefault: 0 vZoomLockedByDefault: 0 - m_HBaseRangeMin: -766 - m_HBaseRangeMax: 766 - m_VBaseRangeMin: -384.5 - m_VBaseRangeMax: 384.5 + m_HBaseRangeMin: -383 + m_HBaseRangeMax: 383 + m_VBaseRangeMin: -192.25 + m_VBaseRangeMax: 192.25 m_HAllowExceedBaseRangeMin: 1 m_HAllowExceedBaseRangeMax: 1 m_VAllowExceedBaseRangeMin: 1 @@ -1079,7 +952,7 @@ MonoBehaviour: y: 21 width: 1532 height: 769 - m_Scale: {x: 1, y: 1} + m_Scale: {x: 2, y: 2} m_Translation: {x: 766, y: 384.5} m_MarginLeft: 0 m_MarginRight: 0 @@ -1087,19 +960,19 @@ MonoBehaviour: m_MarginBottom: 0 m_LastShownAreaInsideMargins: serializedVersion: 2 - x: -766 - y: -384.5 - width: 1532 - height: 769 + x: -383 + y: -192.25 + width: 766 + height: 384.5 m_MinimalGUI: 1 - m_defaultScale: 1 - m_LastWindowPixelSize: {x: 3447, y: 1777.5} + m_defaultScale: 2 + m_LastWindowPixelSize: {x: 3064, y: 1580} m_ClearInEditMode: 1 m_NoCameraWarning: 1 - m_LowResolutionForAspectRatios: 00000000000000000000 + m_LowResolutionForAspectRatios: 01000000000000000000 m_XRRenderMode: 0 m_RenderTexture: {fileID: 0} ---- !u!114 &24 +--- !u!114 &19 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -1119,10 +992,10 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: 482.22223 - y: 637.3333 - width: 532.22217 - height: 329.00006 + x: 0 + y: 527 + width: 1185 + height: 292 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default diff --git a/UserSettings/Search.index b/UserSettings/Search.index new file mode 100644 index 0000000..299c246 --- /dev/null +++ b/UserSettings/Search.index @@ -0,0 +1,13 @@ +{ + "name": "Assets", + "roots": ["Assets"], + "includes": [], + "excludes": ["Temp/", "External/"], + "options": { + "types": true, + "properties": false, + "extended": false, + "dependencies": false + }, + "baseScore": 999 +} \ No newline at end of file diff --git a/UserSettings/Search.settings b/UserSettings/Search.settings new file mode 100644 index 0000000..93e90a3 --- /dev/null +++ b/UserSettings/Search.settings @@ -0,0 +1,67 @@ +trackSelection = true +fetchPreview = true +wantsMore = false +keepOpen = false +queryFolder = "Assets" +onBoardingDoNotAskAgain = true +showPackageIndexes = false +showStatusBar = false +scopes = { + "last_search.8040E7BB" = "fast" + "OpenInspectorPreview.8040E7BB" = "0" + "currentGroup.8040E7BB" = "all" +} +providers = { + adb = { + active = false + priority = 2500 + defaultAction = null + } + asset = { + active = true + priority = 25 + defaultAction = null + } + store = { + active = true + priority = 100 + defaultAction = null + } + find = { + active = true + priority = 25 + defaultAction = null + } + log = { + active = false + priority = 210 + defaultAction = null + } + packages = { + active = true + priority = 90 + defaultAction = null + } + performance = { + active = false + priority = 100 + defaultAction = null + } + scene = { + active = true + priority = 50 + defaultAction = null + } +} +recentSearches = [ +] +searchItemFavorites = [ +] +savedSearchesSortOrder = 0 +showSavedSearchPanel = false +expandedQueries = [ +] +queryBuilder = false +ignoredProperties = "id;name;classname;imagecontentshash" +helperWidgetCurrentArea = "all" +disabledIndexers = "" \ No newline at end of file -- GitLab From 373c7ab34594cd77a25bca58dcb6eb5ca5fd3fcd Mon Sep 17 00:00:00 2001 From: "BCOM\\nchambron" Date: Tue, 12 Jul 2022 16:18:52 +0200 Subject: [PATCH 03/18] working graphview --- .../Editor/Graph/ARFEdgeLink.cs | 1 + .../Editor/Graph/ARFGraphView.cs | 163 +++++++++++++++--- .../Editor/Graph/ARFNode.cs | 13 +- .../Editor/Graph/ARFNodeTrackable.cs | 8 +- .../Editor/Graph/ARFNodeWorldAnchor.cs | 8 +- .../Editor/Graph/ARFPort.cs | 49 ++++++ .../Editor/Graph/ARFPort.cs.meta | 11 ++ .../Editor/Graph/GraphWindow.cs | 2 + .../Editor/Graph/WorldLinkListener.cs | 60 ++++++- .../Editor/Windows/WorldGraphWindow.cs | 75 ++++---- UserSettings/Layouts/default-2021.dwlt | 98 +++++------ 11 files changed, 361 insertions(+), 127 deletions(-) create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFPort.cs create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFPort.cs.meta diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFEdgeLink.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFEdgeLink.cs index ee0ae20..1f39c84 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFEdgeLink.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFEdgeLink.cs @@ -22,6 +22,7 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph public void clicked() { + Debug.Log(worldLink.ToJson()); NodeEditorWindow.ShowWindow(this); } } diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFGraphView.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFGraphView.cs index b85f7c8..6cd3ad9 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFGraphView.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFGraphView.cs @@ -76,7 +76,7 @@ namespace ETSI.ARF.WorldStorage.UI { if (SaveInfo.instance.elemsToRemove == null) { - SaveInfo.instance.elemsToRemove = new List(); + SaveInfo.instance.elemsToRemove = new Dictionary(); } foreach (GraphElement elt in selection.ToArray()) { @@ -86,7 +86,7 @@ namespace ETSI.ARF.WorldStorage.UI nodeAnchor.DisconnectAllPorts(this); if (SaveInfo.instance.nodePositions.ContainsKey(nodeAnchor.GUID)) { - SaveInfo.instance.elemsToRemove.Add(nodeAnchor.GUID); + SaveInfo.instance.elemsToRemove.Add(nodeAnchor.GUID, typeof(WorldAnchor)); } RemoveElement(elt); continue; @@ -97,7 +97,7 @@ namespace ETSI.ARF.WorldStorage.UI nodeTrackable.DisconnectAllPorts(this); if (SaveInfo.instance.nodePositions.ContainsKey(nodeTrackable.GUID)) { - SaveInfo.instance.elemsToRemove.Add(nodeTrackable.GUID); + SaveInfo.instance.elemsToRemove.Add(nodeTrackable.GUID, typeof(Trackable)); } RemoveElement(elt); continue; @@ -107,7 +107,7 @@ namespace ETSI.ARF.WorldStorage.UI { edgeLink.input.Disconnect(edgeLink); edgeLink.output.Disconnect(edgeLink); - SaveInfo.instance.elemsToRemove.Add(edgeLink.GUID); + SaveInfo.instance.elemsToRemove.Add(edgeLink.GUID, typeof(WorldLink)); RemoveElement(elt); continue; } @@ -123,9 +123,9 @@ namespace ETSI.ARF.WorldStorage.UI evt.menu.AppendSeparator(); evt.menu.AppendAction("Reload graph", delegate { - if (positionshaveBeenChanged() && EditorUtility.DisplayDialog("Saving node positions", "The nodes positions have been changed, would you like to save them ?", "Yes", "No")) + if (ServerAndLocalDifferent() && EditorUtility.DisplayDialog("Saving node positions", "The World Graph has been modified. \nWould you like to push the modifications to the server ?", "Yes", "No")) { - saveElemPositionsInServer(); + saveInServer(); } reload(); SaveInfo.instance.toReFrame = true; @@ -185,9 +185,10 @@ namespace ETSI.ARF.WorldStorage.UI { } } - private bool positionshaveBeenChanged() + + public bool ServerAndLocalDifferent() { - if (SaveInfo.instance.elemsToRemove.Count != 0) + if ((SaveInfo.instance.elemsToRemove.Count != 0) || (SaveInfo.instance.elemsToUpdate.Count != 0)) { return true; } @@ -195,9 +196,23 @@ namespace ETSI.ARF.WorldStorage.UI { float nodeX = node.GetPosition().x; float nodeY = node.GetPosition().y; - float dataX = SaveInfo.instance.nodePositions[node.GUID].x; - float dataY = SaveInfo.instance.nodePositions[node.GUID].y; - if ((nodeX != dataX) || (nodeY != dataY)) + if (!SaveInfo.instance.nodePositions.ContainsKey(node.GUID)) + { + return true; + } + else + { + float dataX = SaveInfo.instance.nodePositions[node.GUID].x; + float dataY = SaveInfo.instance.nodePositions[node.GUID].y; + if ((nodeX != dataX) || (nodeY != dataY)) + { + return true; + } + } + } + foreach (ARFEdgeLink edge in edges) + { + if (!SaveInfo.instance.linkIds.Contains(edge.GUID)) { return true; } @@ -225,7 +240,7 @@ namespace ETSI.ARF.WorldStorage.UI { var waNode = new ARFNodeWorldAnchor(worldAnchor); - Rect posTemp = new Rect(26, 93, 160, 77); + Rect posTemp = new(26, 93, 160, 77); SaveInfo.instance.nodePositions.TryGetValue(worldAnchor.UUID.ToString(), out posTemp); waNode.SetPosition(posTemp); @@ -236,7 +251,7 @@ namespace ETSI.ARF.WorldStorage.UI { var tracknode = new ARFNodeTrackable(trackable); - Rect posTemp = new Rect(26, 93, 160, 77); + Rect posTemp = new(26, 93, 160, 77); SaveInfo.instance.nodePositions.TryGetValue(trackable.UUID.ToString(), out posTemp); tracknode.SetPosition(posTemp); @@ -427,14 +442,64 @@ namespace ETSI.ARF.WorldStorage.UI return a = Mathf.Round(a * 2f) * 0.5f; } - public void saveElemPositionsInServer() + //Save all modified/deleted/added elements to the server + public void saveInServer() { foreach (ARFNode node in nodes) { if (!SaveInfo.instance.nodePositions.ContainsKey(node.GUID)) { - //TODO - Debug.Log("need to post " + node.GUID); + //POST TRACKABLE + if (node is ARFNodeTrackable aRFNodeTrackable) + { + var posX = new List(); + posX.Add(aRFNodeTrackable.GetPosition().x.ToString()); + var posY = new List(); + posY.Add(aRFNodeTrackable.GetPosition().y.ToString()); + Trackable trackable = aRFNodeTrackable.trackable; + trackable.KeyvalueTags["unityAuthoringPosX"] = posX; + trackable.KeyvalueTags["unityAuthoringPosY"] = posY; + String uuid = TrackableRequest.AddTrackable(worldStorageServer, trackable); + + //change the uuid in its edges, if there is a new edge to be added in the world storage it needs to have the correct uuid + uuid = uuid.Replace("\"", ""); + foreach (ARFEdgeLink edge in aRFNodeTrackable.portIn.connections) + { + edge.worldLink.UUIDTo = Guid.Parse(uuid); + } + foreach (ARFEdgeLink edge in aRFNodeTrackable.portOut.connections) + { + edge.worldLink.UUIDFrom = Guid.Parse(uuid); + } + aRFNodeTrackable.trackable.UUID = Guid.Parse(uuid); + aRFNodeTrackable.GUID = uuid; + } + //POST WORLDANCHOR + if (node is ARFNodeWorldAnchor aRFNodeWorldAnchor) + { + var posX = new List(); + posX.Add(aRFNodeWorldAnchor.GetPosition().x.ToString()); + var posY = new List(); + posY.Add(aRFNodeWorldAnchor.GetPosition().y.ToString()); + WorldAnchor worldAnchor = aRFNodeWorldAnchor.worldAnchor; + worldAnchor.KeyvalueTags["unityAuthoringPosX"] = posX; + worldAnchor.KeyvalueTags["unityAuthoringPosY"] = posY; + + String uuid = WorldAnchorRequest.AddWorldAnchor(worldStorageServer, worldAnchor); + + //change the uuid in its edges, if there is a new edge to be added in the world storage it needs to have the correct uuid + uuid = uuid.Replace("\"",""); + foreach (ARFEdgeLink edge in aRFNodeWorldAnchor.portIn.connections) + { + edge.worldLink.UUIDTo = Guid.Parse(uuid); + } + foreach (ARFEdgeLink edge in aRFNodeWorldAnchor.portOut.connections) + { + edge.worldLink.UUIDFrom = Guid.Parse(uuid); + } + aRFNodeWorldAnchor.worldAnchor.UUID = Guid.Parse(uuid); + aRFNodeWorldAnchor.GUID = uuid; + } } else { @@ -442,26 +507,74 @@ namespace ETSI.ARF.WorldStorage.UI float yLocal = node.GetPosition().y; float xServer = SaveInfo.instance.nodePositions[node.GUID].x; ; float yServer = SaveInfo.instance.nodePositions[node.GUID].y; - if ((xLocal != xServer) && (yLocal != yServer)) + if (((xLocal != xServer) || (yLocal != yServer)) || SaveInfo.instance.elemsToUpdate.Contains(node.GUID)) { - //TODO - Debug.Log("need to update " + node.GUID); + if(node is ARFNodeTrackable aRFNodeTrackable) + { + var posX = new List(); + posX.Add(aRFNodeTrackable.GetPosition().x.ToString()); + var posY = new List(); + posY.Add(aRFNodeTrackable.GetPosition().y.ToString()); + Trackable trackable = aRFNodeTrackable.trackable; + trackable.KeyvalueTags["unityAuthoringPosX"] = posX; + trackable.KeyvalueTags["unityAuthoringPosY"] = posY; + TrackableRequest.UpdateTrackable(worldStorageServer, trackable); + } + if (node is ARFNodeWorldAnchor aRFNodeWorldAnchor) + { + var posX = new List(); + posX.Add(aRFNodeWorldAnchor.GetPosition().x.ToString()); + var posY = new List(); + posY.Add(aRFNodeWorldAnchor.GetPosition().y.ToString()); + WorldAnchor worldAnchor = aRFNodeWorldAnchor.worldAnchor; + worldAnchor.KeyvalueTags["unityAuthoringPosX"] = posX; + worldAnchor.KeyvalueTags["unityAuthoringPosY"] = posY; + WorldAnchorRequest.UpdateWorldAnchor(worldStorageServer, worldAnchor); + } } } } foreach (ARFEdgeLink edge in edges) { - if (!SaveInfo.instance.linkIds.Contains(edge.GUID)) + if (edge is ARFEdgeLink aRFEdgeLink) { - //TODO - Debug.Log("need to post link between " + edge.input); + if (!SaveInfo.instance.linkIds.Contains(aRFEdgeLink.GUID)) + { + WorldLink worldLink = aRFEdgeLink.worldLink; + string uuid = WorldLinkRequest.AddWorldLink(worldStorageServer, worldLink); + uuid = uuid.Replace("\"", ""); + + aRFEdgeLink.worldLink.UUID = Guid.Parse(uuid); + aRFEdgeLink.GUID = uuid; + } + else if (SaveInfo.instance.elemsToUpdate.Contains(aRFEdgeLink.GUID)) + { + WorldLink worldLink = aRFEdgeLink.worldLink; + WorldLinkRequest.UpdateWorldLink(worldStorageServer, worldLink); + } } } - foreach (String elemId in SaveInfo.instance.elemsToRemove) + //DELETE ELEMENTS FROM THE SERVER + foreach (KeyValuePair elemToRemove in SaveInfo.instance.elemsToRemove) { - //TODO - Debug.Log("need to remove " + elemId); + string typeName = elemToRemove.Value.Name; + switch (typeName) + { + case nameof(Trackable): + TrackableRequest.DeleteTrackable(worldStorageServer, elemToRemove.Key); + break; + case nameof(WorldAnchor): + WorldAnchorRequest.DeleteWorldAnchor(worldStorageServer, elemToRemove.Key); + break; + case nameof(WorldLink): + WorldLinkRequest.DeleteWorldLink(worldStorageServer, elemToRemove.Key); + break; + default: + Debug.Log("oops"); + break; + } } + SaveInfo.instance.initNodePos(worldStorageServer, worldStorageUser); } } } \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNode.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNode.cs index 6c29371..fb3eb4e 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNode.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNode.cs @@ -39,27 +39,26 @@ using System; namespace ETSI.ARF.WorldStorage.UI { - public class ARFNode : Node + public abstract class ARFNode : Node { public string GUID; public bool entryPoint = false; - public Port portOut; - public Port portIn; + public ARFPort portOut; + public ARFPort portIn; public GUID id; public ARFNode() { } - public override Port InstantiatePort(Orientation orientation, Direction direction, Port.Capacity capacity, Type type) { switch (direction) { case Direction.Input: - portIn = Port.Create(orientation, direction, capacity, type); + portIn = ARFPort.CreateARF(orientation, direction, capacity, type); return portIn; case Direction.Output: - portOut = Port.Create(orientation, direction, capacity, type); + portOut = ARFPort.CreateARF(orientation, direction, capacity, type); return portOut; default: return null; @@ -99,5 +98,7 @@ namespace ETSI.ARF.WorldStorage.UI { return node.InstantiatePort(Orientation.Horizontal, portDirection, capacity, typeof(int)); // dummy } + + public abstract ObjectType GetElemType(); } } \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeTrackable.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeTrackable.cs index b25b58e..ebc1646 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeTrackable.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeTrackable.cs @@ -60,13 +60,13 @@ namespace ETSI.ARF.WorldStorage.UI var portIn = GeneratePort(this, Direction.Input, Port.Capacity.Multi); portIn.portColor = new Color(0.77f, 0.77f, 0.77f, 0.77f); portIn.portName = "Target"; // "Input" - portIn.AddManipulator(new EdgeConnector(new WorldLinkListener())); + //portIn.AddManipulator(new EdgeConnector(new WorldLinkListener())); inputContainer.Add(portIn); var portOut = GeneratePort(this, Direction.Output, Port.Capacity.Multi); portOut.portColor = new Color(0.77f, 0.77f, 0.77f, 0.77f); portOut.portName = "Source"; // "Output"; - portOut.AddManipulator(new EdgeConnector(new WorldLinkListener())); ; + //portOut.AddManipulator(new EdgeConnector(new WorldLinkListener())); ; outputContainer.Add(portOut); RefreshExpandedState(); @@ -84,5 +84,9 @@ namespace ETSI.ARF.WorldStorage.UI NodeEditorWindow.ShowWindow(this); Debug.Log(trackable.ToString()); } + public override ObjectType GetElemType() + { + return ObjectType.Trackable; + } } } \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeWorldAnchor.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeWorldAnchor.cs index a8c83a3..4c272f9 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeWorldAnchor.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeWorldAnchor.cs @@ -60,13 +60,13 @@ namespace ETSI.ARF.WorldStorage.UI var portIn = GeneratePort(this, Direction.Input, Port.Capacity.Multi); portIn.portColor = new Color(0.77f,0.77f,0.77f, 0.77f); portIn.portName = "Target"; // "Input"; - portIn.AddManipulator(new EdgeConnector(new WorldLinkListener())); + //portIn.AddManipulator(new EdgeConnector(new WorldLinkListener())); inputContainer.Add(portIn); var portOut = GeneratePort(this, Direction.Output, Port.Capacity.Multi); portOut.portColor = new Color(0.77f, 0.77f, 0.77f, 0.77f); portOut.portName = "Source"; // "Output"; - portOut.AddManipulator(new EdgeConnector(new WorldLinkListener())); + //portOut.AddManipulator(new EdgeConnector(new WorldLinkListener())); outputContainer.Add(portOut); RefreshExpandedState(); @@ -84,5 +84,9 @@ namespace ETSI.ARF.WorldStorage.UI Debug.Log(worldAnchor.ToString()); NodeEditorWindow.ShowWindow(this); } + public override ObjectType GetElemType() + { + return ObjectType.WorldAnchor; + } } } \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFPort.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFPort.cs new file mode 100644 index 0000000..faa8077 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFPort.cs @@ -0,0 +1,49 @@ +using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows; +using ETSI.ARF.WorldStorage.UI; +using Org.OpenAPITools.Model; +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEditor.Experimental.GraphView; +using UnityEngine; +using UnityEngine.UIElements; + +namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph +{ + public class ARFPort : Port + { + protected ARFPort(Orientation portOrientation, Direction portDirection, Capacity portCapacity, Type type) : base(portOrientation, portDirection, portCapacity, type) + { + } + + public override void Connect(Edge edge) + { + base.Connect(edge); + ARFNode fromNode = edge.output.node as ARFNode; + ARFNode toNode = edge.input.node as ARFNode; + + if (edge is ARFEdgeLink aRFedge) + { + List transform = new List(); + for (int i = 0; i < 16; i++) + { + transform.Add(0); + } + + WorldLink worldLink = new WorldLink(Guid.NewGuid(), Guid.Parse(SaveInfo.instance.worldStorageUser.UUID), Guid.Parse(fromNode.GUID), Guid.Parse(toNode.GUID), fromNode.GetElemType(), toNode.GetElemType(), transform, UnitSystem.CM, new Dictionary>()); + aRFedge.worldLink = worldLink; + } + } + + public static ARFPort CreateARF(Orientation orientation, Direction direction, Capacity capacity, Type type) where TEdge : Edge, new() + { + WorldLinkListener listener = new WorldLinkListener(); + ARFPort port = new(orientation, direction, capacity, type) + { + m_EdgeConnector = new EdgeConnector(listener) + }; + port.AddManipulator(port.m_EdgeConnector); + return port; + } + } +} \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFPort.cs.meta b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFPort.cs.meta new file mode 100644 index 0000000..6d043fd --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFPort.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3c67fa4402011954bb65be6215d52512 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs index 9c496ee..8d70a34 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs @@ -41,6 +41,8 @@ using IO.Swagger.Model; #endif +//THIS CLASS IS GOING TO BE DELETED !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + namespace ETSI.ARF.WorldStorage.UI { diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/WorldLinkListener.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/WorldLinkListener.cs index 36c855f..79b6914 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/WorldLinkListener.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/WorldLinkListener.cs @@ -1,22 +1,76 @@ using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows; using ETSI.ARF.WorldStorage; using ETSI.ARF.WorldStorage.UI; +using Org.OpenAPITools.Model; +using System; +using System.Collections.Generic; using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEngine; using UnityEngine.UIElements; +using static UnityEditor.Experimental.GraphView.Port; namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph { public class WorldLinkListener : IEdgeConnectorListener { + private GraphViewChange m_GraphViewChange; + + private List m_EdgesToCreate; + + private List m_EdgesToDelete; + + public WorldLinkListener() + { + m_EdgesToCreate = new List(); + m_EdgesToDelete = new List(); + m_GraphViewChange.edgesToCreate = m_EdgesToCreate; + } public void OnDrop(GraphView graphView, Edge edge) { - ARFNode fromNode = edge.output.node as ARFNode; - ARFNode toNode = edge.input.node as ARFNode; + m_EdgesToCreate.Clear(); + m_EdgesToCreate.Add(edge); + m_EdgesToDelete.Clear(); + if (edge.input.capacity == Capacity.Single) + { + foreach (Edge connection in edge.input.connections) + { + if (connection != edge) + { + m_EdgesToDelete.Add(connection); + } + } + } + + if (edge.output.capacity == Capacity.Single) + { + foreach (Edge connection2 in edge.output.connections) + { + if (connection2 != edge) + { + m_EdgesToDelete.Add(connection2); + } + } + } + + if (m_EdgesToDelete.Count > 0) + { + graphView.DeleteElements(m_EdgesToDelete); + } + + List edgesToCreate = m_EdgesToCreate; + if (graphView.graphViewChanged != null) + { + edgesToCreate = graphView.graphViewChanged(m_GraphViewChange).edgesToCreate; + } + foreach (Edge item in edgesToCreate) + { + graphView.AddElement(item); + edge.input.Connect(item); + edge.output.Connect(item); + } NodeEditorWindow.ShowWindow((ARFEdgeLink)edge); - //WorldLinkWindow.preFill(fromNode, toNode); } public void OnDropOutsidePort(Edge edge, Vector2 position) diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs index d20562f..f32f961 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs @@ -19,6 +19,9 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows private ARFGraphView myGraph; + //to delay the reframe (otherwise it reframes when the graph isn't built yet) + int twoFrames = 0; + [MenuItem("ARFWorldStorage/Edit Graph...")] public static void ShowWindow() { @@ -27,13 +30,13 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows public void OnEnable() { - if (SaveInfo.instance.nodePositions == null) - { - SaveInfo.instance.initNodePos(worldStorageServer); - } rootVisualElement.Add(GenerateToolbar()); + if (SaveInfo.instance.nodePositions == null) + { + SaveInfo.instance.initNodePos(worldStorageServer, worldStorageUser); + } ConstructGraphView(); myGraph.style.top = Length.Percent(11); rootVisualElement.Add(myGraph); @@ -58,6 +61,11 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows void OnGUI() { + if (SaveInfo.instance.nodePositions == null) + { + SaveInfo.instance.initNodePos(worldStorageServer, worldStorageUser); + } + EditorGUILayout.BeginVertical(); EditorGUILayout.Space(24); @@ -65,11 +73,13 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows worldStorageServer = (WorldStorageServer)EditorGUILayout.ObjectField("World Storage Server", worldStorageServer, typeof(WorldStorageServer), false, GUILayout.Width(500)); if (EditorGUI.EndChangeCheck()) { - myGraph.saveElemPositionsInServer(); + if (myGraph.ServerAndLocalDifferent() && EditorUtility.DisplayDialog("Saving node positions", "The World Graph has been modified. \nWould you like to push the modifications to the server ?", "Yes", "No")) + { + myGraph.saveInServer(); + } rootVisualElement.Remove(myGraph); - SaveInfo.instance.initNodePos(worldStorageServer); - + SaveInfo.instance.initNodePos(worldStorageServer, worldStorageUser); ConstructGraphView(); myGraph.style.top = Length.Percent(11); rootVisualElement.Add(myGraph); @@ -77,36 +87,19 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows //reframe all elements to see them all - if (SaveInfo.instance.toReFrame) + if (SaveInfo.instance.toReFrame && (twoFrames == 2)) { myGraph.FrameAllElements(); SaveInfo.instance.toReFrame = false; + twoFrames = 0; } - EditorGUILayout.EndVertical(); - } - private bool localAndServerDifferent() - { - foreach (ARFNode node in myGraph.nodes) + else if (SaveInfo.instance.toReFrame) { - float nodeX = node.GetPosition().x; - float nodeY = node.GetPosition().y; - if (SaveInfo.instance.nodePositions.ContainsKey(node.GUID)){ - float dataX = SaveInfo.instance.nodePositions[node.GUID].x; - float dataY = SaveInfo.instance.nodePositions[node.GUID].y; - if ((nodeX != dataX) || (nodeY != dataY)) - { - return true; - } - } - else - { - return true; - } + twoFrames++; } - return false; + EditorGUILayout.EndVertical(); } - //generate the window's top toolbar private Toolbar GenerateToolbar() { @@ -137,7 +130,7 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows var save = new Button(clickEvent: () => { - myGraph.saveElemPositionsInServer(); + myGraph.saveInServer(); }) { text = "Save" @@ -154,16 +147,19 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows public Dictionary nodePositions; public List linkIds; - public List elemsToRemove; + public Dictionary elemsToRemove; + public List elemsToUpdate; //keep the info of the graph reframe public Boolean toReFrame = false; public WorldStorageServer worldStorageServer; + public WorldStorageUser worldStorageUser; - public void initNodePos(WorldStorageServer server) + public void initNodePos(WorldStorageServer server, WorldStorageUser user) { worldStorageServer = server; + worldStorageUser = user; instance.nodePositions = new Dictionary(); foreach (Trackable track in TrackableRequest.GetAllTrackables(worldStorageServer)) @@ -172,12 +168,12 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows { var posX = RoundToNearestHalf(float.Parse(track.KeyvalueTags["unityAuthoringPosX"][0])); var posY = RoundToNearestHalf(float.Parse(track.KeyvalueTags["unityAuthoringPosY"][0])); - Rect trackPos = new Rect(posX, posY, 135, 77); + Rect trackPos = new(posX, posY, 135, 77); instance.nodePositions[track.UUID.ToString()] = trackPos; } else { - Rect trackPos = new Rect(0, 0, 135, 77); + Rect trackPos = new(0, 0, 135, 77); instance.nodePositions[track.UUID.ToString()] = trackPos; } } @@ -187,12 +183,12 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows { var posX = RoundToNearestHalf(float.Parse(wa.KeyvalueTags["unityAuthoringPosX"][0])); var posY = RoundToNearestHalf(float.Parse(wa.KeyvalueTags["unityAuthoringPosY"][0])); - Rect waPos = new Rect(posX, posY, 135, 77); + Rect waPos = new(posX, posY, 135, 77); instance.nodePositions[wa.UUID.ToString()] = waPos; } else { - Rect trackPos = new Rect(0, 0, 135, 77); + Rect trackPos = new(0, 0, 135, 77); instance.nodePositions[wa.UUID.ToString()] = trackPos; } } @@ -202,9 +198,10 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows { instance.linkIds.Add(link.UUID.ToString()); } - instance.toReFrame = true; - instance.elemsToRemove = new List(); + instance.toReFrame = true; + instance.elemsToRemove = new Dictionary(); + instance.elemsToUpdate = new List(); } //method to predict the position of a node (the float that will be saved in the PositionInfo singleton) @@ -212,7 +209,5 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows { return a = Mathf.Round(a * 2f) * 0.5f; } - - } } \ No newline at end of file diff --git a/UserSettings/Layouts/default-2021.dwlt b/UserSettings/Layouts/default-2021.dwlt index aff4bb3..ac8618f 100644 --- a/UserSettings/Layouts/default-2021.dwlt +++ b/UserSettings/Layouts/default-2021.dwlt @@ -48,7 +48,7 @@ MonoBehaviour: m_MinSize: {x: 300, y: 200} m_MaxSize: {x: 24288, y: 16192} vertical: 0 - controlID: 15 + controlID: 50 --- !u!114 &3 MonoBehaviour: m_ObjectHideFlags: 52 @@ -70,10 +70,10 @@ MonoBehaviour: height: 768 m_MinSize: {x: 101, y: 121} m_MaxSize: {x: 4001, y: 4021} - m_ActualView: {fileID: 12} + m_ActualView: {fileID: 13} m_Panes: - {fileID: 15} - - {fileID: 12} + - {fileID: 13} m_Selected: 1 m_LastSelected: 1 --- !u!114 &4 @@ -93,10 +93,10 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 0 - width: 314 + width: 313 height: 455 - m_MinSize: {x: 201, y: 221} - m_MaxSize: {x: 4001, y: 4021} + m_MinSize: {x: 200, y: 200} + m_MaxSize: {x: 4000, y: 4000} m_ActualView: {fileID: 16} m_Panes: - {fileID: 16} @@ -224,7 +224,7 @@ MonoBehaviour: m_MinSize: {x: 200, y: 200} m_MaxSize: {x: 16192, y: 16192} vertical: 1 - controlID: 83 + controlID: 51 --- !u!114 &10 MonoBehaviour: m_ObjectHideFlags: 52 @@ -249,7 +249,7 @@ MonoBehaviour: m_MinSize: {x: 200, y: 100} m_MaxSize: {x: 16192, y: 8096} vertical: 0 - controlID: 84 + controlID: 52 --- !u!114 &11 MonoBehaviour: m_ObjectHideFlags: 52 @@ -265,19 +265,19 @@ MonoBehaviour: m_Children: [] m_Position: serializedVersion: 2 - x: 314 + x: 313 y: 0 - width: 872 + width: 873 height: 455 m_MinSize: {x: 102, y: 121} m_MaxSize: {x: 4002, y: 4021} - m_ActualView: {fileID: 13} + m_ActualView: {fileID: 12} m_Panes: - {fileID: 17} - {fileID: 18} - - {fileID: 13} + - {fileID: 12} m_Selected: 2 - m_LastSelected: 2 + m_LastSelected: 1 --- !u!114 &12 MonoBehaviour: m_ObjectHideFlags: 52 @@ -287,26 +287,27 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e219817d65c8b1f40ad85e6185e89e92, type: 3} + m_Script: {fileID: 11500000, guid: 2c1a0c92306453d46897c1af6cb5c2f9, type: 3} m_Name: m_EditorClassIdentifier: m_MinSize: {x: 100, y: 100} m_MaxSize: {x: 4000, y: 4000} m_TitleContent: - m_Text: Trackable Editor + m_Text: Graph Editor m_Image: {fileID: 0} m_Tooltip: m_Pos: serializedVersion: 2 - x: 1186 + x: 313 y: 72 - width: 413 - height: 747 + width: 871 + height: 434 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default m_SaveData: [] - type: 2 + worldStorageServer: {fileID: 11400000, guid: 777684ed8f62c9d408a1813e8382c676, type: 2} + worldStorageUser: {fileID: 11400000, guid: c0696089e4a855b46ad490437919b1e8, type: 2} --- !u!114 &13 MonoBehaviour: m_ObjectHideFlags: 52 @@ -316,27 +317,26 @@ MonoBehaviour: m_GameObject: {fileID: 0} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2c1a0c92306453d46897c1af6cb5c2f9, type: 3} + m_Script: {fileID: 11500000, guid: e219817d65c8b1f40ad85e6185e89e92, type: 3} m_Name: m_EditorClassIdentifier: m_MinSize: {x: 100, y: 100} m_MaxSize: {x: 4000, y: 4000} m_TitleContent: - m_Text: Graph Editor + m_Text: Trackable Editor m_Image: {fileID: 0} m_Tooltip: m_Pos: serializedVersion: 2 - x: 314 + x: 1186 y: 72 - width: 870 - height: 434 + width: 413 + height: 747 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default m_SaveData: [] - worldStorageServer: {fileID: 11400000, guid: 3a9ba82f4e8dd124ca2b005861c64d01, type: 2} - worldStorageUser: {fileID: 11400000, guid: c0696089e4a855b46ad490437919b1e8, type: 2} + type: 0 --- !u!114 &14 MonoBehaviour: m_ObjectHideFlags: 52 @@ -393,7 +393,7 @@ MonoBehaviour: scrollPos: {x: 0, y: 0} m_SelectedIDs: 644b0000 m_LastClickedID: 19300 - m_ExpandedIDs: 00000000504b0000524b0000544b0000564b000000ca9a3bffffff7f + m_ExpandedIDs: 00000000524b0000544b0000564b0000584b0000 m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -421,7 +421,7 @@ MonoBehaviour: scrollPos: {x: 0, y: 0} m_SelectedIDs: m_LastClickedID: 0 - m_ExpandedIDs: 00000000504b0000524b0000544b0000564b0000 + m_ExpandedIDs: 00000000524b0000544b0000564b0000584b0000 m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -511,7 +511,7 @@ MonoBehaviour: m_CachedPref: 160 m_ControlHash: -371814159 m_PrefName: Preview_InspectorPreview - m_LastInspectedObjectInstanceID: 3288 + m_LastInspectedObjectInstanceID: 19264 m_LastVerticalScrollValue: 0 m_GlobalObjectId: m_InspectorMode: 0 @@ -540,7 +540,7 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 72 - width: 313 + width: 312 height: 434 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: @@ -549,7 +549,7 @@ MonoBehaviour: m_SceneHierarchy: m_TreeViewState: scrollPos: {x: 0, y: 0} - m_SelectedIDs: d80c0000 + m_SelectedIDs: 404b0000 m_LastClickedID: 0 m_ExpandedIDs: 38fbffff m_RenameOverlay: @@ -900,10 +900,10 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: 507 - y: 94 - width: 1532 - height: 790 + x: 313 + y: 72 + width: 871 + height: 434 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default @@ -914,10 +914,10 @@ MonoBehaviour: m_ShowGizmos: 0 m_TargetDisplay: 0 m_ClearColor: {r: 0, g: 0, b: 0, a: 0} - m_TargetSize: {x: 1532, y: 769} + m_TargetSize: {x: 871, y: 413} m_TextureFilterMode: 0 m_TextureHideFlags: 61 - m_RenderIMGUI: 0 + m_RenderIMGUI: 1 m_EnterPlayModeBehavior: 0 m_UseMipMap: 0 m_VSyncEnabled: 0 @@ -929,10 +929,10 @@ MonoBehaviour: m_VRangeLocked: 0 hZoomLockedByDefault: 0 vZoomLockedByDefault: 0 - m_HBaseRangeMin: -383 - m_HBaseRangeMax: 383 - m_VBaseRangeMin: -192.25 - m_VBaseRangeMax: 192.25 + m_HBaseRangeMin: -217.75 + m_HBaseRangeMax: 217.75 + m_VBaseRangeMin: -103.25 + m_VBaseRangeMax: 103.25 m_HAllowExceedBaseRangeMin: 1 m_HAllowExceedBaseRangeMax: 1 m_VAllowExceedBaseRangeMin: 1 @@ -950,23 +950,23 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 21 - width: 1532 - height: 769 + width: 871 + height: 413 m_Scale: {x: 2, y: 2} - m_Translation: {x: 766, y: 384.5} + m_Translation: {x: 435.5, y: 206.5} m_MarginLeft: 0 m_MarginRight: 0 m_MarginTop: 0 m_MarginBottom: 0 m_LastShownAreaInsideMargins: serializedVersion: 2 - x: -383 - y: -192.25 - width: 766 - height: 384.5 + x: -217.75 + y: -103.25 + width: 435.5 + height: 206.5 m_MinimalGUI: 1 m_defaultScale: 2 - m_LastWindowPixelSize: {x: 3064, y: 1580} + m_LastWindowPixelSize: {x: 1742, y: 868} m_ClearInEditMode: 1 m_NoCameraWarning: 1 m_LowResolutionForAspectRatios: 01000000000000000000 -- GitLab From ccf5ef33fa4c55e41524829d1b701943ad1017de Mon Sep 17 00:00:00 2001 From: "BCOM\\nchambron" Date: Wed, 20 Jul 2022 17:01:31 +0200 Subject: [PATCH 04/18] everything is working, need ui fix --- .../Editor/Graph/ARFEdgeLink.cs | 31 +- .../Editor/Graph/ARFGraphView.cs | 107 +- .../Editor/Graph/ARFNode.cs | 8 +- .../Editor/Graph/ARFNodeTrackable.cs | 17 +- .../Editor/Graph/ARFNodeWorldAnchor.cs | 16 +- .../Editor/Graph/ARFPort.cs | 29 +- .../Editor/Graph/GraphWindow.cs | 396 ------ .../Editor/Graph/GraphWindow.cs.meta | 14 - .../Editor/Graph/WorldLinkListener.cs | 31 +- .../Editor/Windows/GraphEditorWindow.cs | 1094 +++++++++++++++++ ...ndow.cs.meta => GraphEditorWindow.cs.meta} | 0 .../Editor/Windows/NodeEditorWindow.cs | 70 -- .../Editor/Windows/TrackableWindow.cs | 13 - .../Editor/Windows/WorldAnchorWindow.cs | 13 - .../Editor/Windows/WorldGraphWindow.cs | 86 +- .../Editor/Windows/WorldGraphWindow.cs.meta | 2 +- .../Editor/Windows/WorldStorageWindow.cs | 4 - .../ARF World Storage API/Images.meta | 8 + .../ARF World Storage API/Images/anchor.png | Bin 0 -> 21219 bytes .../Images/anchor.png.meta | 98 ++ .../ARF World Storage API/Images/link.png | Bin 0 -> 18903 bytes .../Images/link.png.meta | 98 ++ .../Images/trackable.png | Bin 0 -> 14290 bytes .../Images/trackable.png.meta | 98 ++ UserSettings/Layouts/default-2021.dwlt | 273 ++-- 25 files changed, 1754 insertions(+), 752 deletions(-) delete mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs delete mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/GraphEditorWindow.cs rename Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/{NodeEditorWindow.cs.meta => GraphEditorWindow.cs.meta} (100%) delete mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/NodeEditorWindow.cs create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Images.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Images/anchor.png create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Images/anchor.png.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Images/link.png create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Images/link.png.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Images/trackable.png create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Images/trackable.png.meta diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFEdgeLink.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFEdgeLink.cs index 1f39c84..d3b98fb 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFEdgeLink.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFEdgeLink.cs @@ -1,6 +1,25 @@ -using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows; +// +// ARF - Augmented Reality Framework (ETSI ISG ARF) +// +// Copyright 2022 ETSI +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: July 2022 +// + +using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows; using Org.OpenAPITools.Model; -using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEngine; using UnityEngine.UIElements; @@ -13,17 +32,17 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph public string GUID; public ARFEdgeLink() { - var doubleClickManipulator = new Clickable(clicked); + var doubleClickManipulator = new Clickable(Clicked); doubleClickManipulator.activators.Clear(); doubleClickManipulator.activators.Add(new ManipulatorActivationFilter { button = MouseButton.LeftMouse, clickCount = 2 }); this.AddManipulator(doubleClickManipulator); - this.style.color = new Color(239, 239, 239); + style.color = new Color(239, 239, 239); } - public void clicked() + public void Clicked() { Debug.Log(worldLink.ToJson()); - NodeEditorWindow.ShowWindow(this); + GraphEditorWindow.ShowWindow(this); } } } \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFGraphView.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFGraphView.cs index 6cd3ad9..ee94e9b 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFGraphView.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFGraphView.cs @@ -15,14 +15,13 @@ // See the License for the specific language governing permissions and // limitations under the License. // -// Last change: June 2022 +// Last change: July 2022 // + #define USING_OPENAPI_GENERATOR -using System.Collections; using System.Collections.Generic; #if USING_OPENAPI_GENERATOR -using Org.OpenAPITools.Api; using Org.OpenAPITools.Model; #else using IO.Swagger.Api; @@ -54,7 +53,6 @@ namespace ETSI.ARF.WorldStorage.UI this.AddManipulator(new ContentDragger()); this.AddManipulator(new SelectionDragger()); this.AddManipulator(new RectangleSelector()); - } //method called when an element is deleted from the graphview @@ -113,6 +111,8 @@ namespace ETSI.ARF.WorldStorage.UI } } } + + GraphEditorWindow.ResetWindow(); } public override void BuildContextualMenu(UnityEngine.UIElements.ContextualMenuPopulateEvent evt) @@ -125,9 +125,9 @@ namespace ETSI.ARF.WorldStorage.UI { if (ServerAndLocalDifferent() && EditorUtility.DisplayDialog("Saving node positions", "The World Graph has been modified. \nWould you like to push the modifications to the server ?", "Yes", "No")) { - saveInServer(); + SaveInServer(); } - reload(); + Reload(); SaveInfo.instance.toReFrame = true; }, (DropdownMenuAction a) => DropdownMenuAction.Status.Normal); evt.menu.AppendAction("Create Trackable", delegate @@ -135,31 +135,34 @@ namespace ETSI.ARF.WorldStorage.UI //generate the Trackables's attributes EncodingInformationStructure trackableEncodingInformation = new EncodingInformationStructure(EncodingInformationStructure.DataFormatEnum.OTHER, "0"); - List localCRS = new List(); - for (int i = 0; i < 16; i++) + List localCRS = new(); + for (int i = 0; i < 15; i++) { localCRS.Add(0); } + localCRS.Add(1); - List trackableSize = new List(); + List trackableSize = new(); for (int i = 0; i < 3; i++) { trackableSize.Add(0); } Trackable trackable = new Trackable(Guid.NewGuid(), "Defaulttrackable", Guid.Parse(worldStorageUser.UUID), Trackable.TrackableTypeEnum.OTHER, trackableEncodingInformation, new byte[64], localCRS, UnitSystem.CM, trackableSize, new Dictionary>()); - createTrackableNode(trackable, actualGraphPosition.x, actualGraphPosition.y); + + selection.Clear(); + AddToSelection(CreateTrackableNode(trackable, actualGraphPosition.x, actualGraphPosition.y)); }, (DropdownMenuAction a) => DropdownMenuAction.Status.Normal); evt.menu.AppendAction("Create World Anchor", delegate { //generate the worldAnchor attributes - List localCRS = new List(); - for (int i = 0; i < 16; i++) + for (int i = 0; i < 15; i++) { localCRS.Add(0); } + localCRS.Add(1); List worldAnchorSize = new List(); for (int i = 0; i < 3; i++) @@ -168,7 +171,7 @@ namespace ETSI.ARF.WorldStorage.UI } WorldAnchor anchor = new WorldAnchor(Guid.NewGuid(), "DefaultWorldAnchor", Guid.Parse(worldStorageUser.UUID), localCRS, UnitSystem.CM, worldAnchorSize, new Dictionary>()); - createAnchorNode(anchor, actualGraphPosition.x, actualGraphPosition.y); + CreateAnchorNode(anchor, actualGraphPosition.x, actualGraphPosition.y); }, (DropdownMenuAction a) => DropdownMenuAction.Status.Normal); evt.menu.AppendSeparator(); @@ -230,7 +233,7 @@ namespace ETSI.ARF.WorldStorage.UI return cPorts; } - public void paintWorldStorage() + public void PaintWorldStorage() { List trackables = TrackableRequest.GetAllTrackables(worldStorageServer); List worldAnchors = WorldAnchorRequest.GetAllWorldAnchors(worldStorageServer); @@ -259,7 +262,7 @@ namespace ETSI.ARF.WorldStorage.UI } foreach (WorldLink worldLink in worldLinks) { - var portPair = getPortsFromWorldLink(worldLink); + var portPair = GetPortsFromWorldLink(worldLink); ARFEdgeLink edge = portPair.Key.ConnectTo(portPair.Value); edge.worldLink = worldLink; edge.GUID = worldLink.UUID.ToString(); @@ -269,16 +272,17 @@ namespace ETSI.ARF.WorldStorage.UI } - internal void createTrackableNode(Trackable track, float posX, float posY) + internal ARFNodeTrackable CreateTrackableNode(Trackable track, float posX, float posY) { var tracknode = new ARFNodeTrackable(track); Rect pos = new Rect(RoundToNearestHalf(posX), RoundToNearestHalf(posY), 160, 77); tracknode.SetPosition(pos); AddElement(tracknode); + return tracknode; } - internal void createAnchorNode(WorldAnchor wa, float posX, float posY) + internal ARFNodeWorldAnchor CreateAnchorNode(WorldAnchor wa, float posX, float posY) { var waNode = new ARFNodeWorldAnchor(wa); @@ -286,27 +290,31 @@ namespace ETSI.ARF.WorldStorage.UI waNode.SetPosition(pos); AddElement(waNode); + return waNode; } - internal void createLink(WorldLink worldLink) + internal ARFEdgeLink CreateLink(WorldLink worldLink) { - var portPair = getPortsFromWorldLink(worldLink); + var portPair = GetPortsFromWorldLink(worldLink); ARFEdgeLink edge = portPair.Key.ConnectTo(portPair.Value); edge.worldLink = worldLink; Debug.Log(worldLink.UUID.ToString()); edge.GUID = worldLink.UUID.ToString(); AddElement(edge); + return edge; } - public void reload() + public void Reload() { + GraphEditorWindow.ResetWindow(); DeleteElements(graphElements); - paintWorldStorage(); + SaveInfo.instance.InitNodePos(worldStorageServer, worldStorageUser); + PaintWorldStorage(); FrameAllElements(); } - public Dictionary SavePositions() + public Dictionary GetNodePositions() { Dictionary ret = new Dictionary(); foreach (ARFNode elem in nodes) @@ -316,7 +324,7 @@ namespace ETSI.ARF.WorldStorage.UI return ret; } - private KeyValuePair getPortsFromWorldLink(WorldLink worldLink) + private KeyValuePair GetPortsFromWorldLink(WorldLink worldLink) { var ret = new KeyValuePair(); @@ -443,8 +451,31 @@ namespace ETSI.ARF.WorldStorage.UI } //Save all modified/deleted/added elements to the server - public void saveInServer() + public void SaveInServer() { + //DELETE ELEMENTS FROM THE SERVER + foreach (KeyValuePair elemToRemove in SaveInfo.instance.elemsToRemove) + { + string typeName = elemToRemove.Value.Name; + switch (typeName) + { + case nameof(Trackable): + TrackableRequest.DeleteTrackable(worldStorageServer, elemToRemove.Key); + break; + case nameof(WorldAnchor): + Debug.Log("delete worldanchor"); + WorldAnchorRequest.DeleteWorldAnchor(worldStorageServer, elemToRemove.Key); + break; + case nameof(WorldLink): + WorldLinkRequest.DeleteWorldLink(worldStorageServer, elemToRemove.Key); + break; + default: + Debug.Log("oops"); + break; + } + } + + //UPDATE AND ADD ELEMENTS foreach (ARFNode node in nodes) { if (!SaveInfo.instance.nodePositions.ContainsKey(node.GUID)) @@ -473,6 +504,7 @@ namespace ETSI.ARF.WorldStorage.UI } aRFNodeTrackable.trackable.UUID = Guid.Parse(uuid); aRFNodeTrackable.GUID = uuid; + aRFNodeTrackable.title = trackable.Name; } //POST WORLDANCHOR if (node is ARFNodeWorldAnchor aRFNodeWorldAnchor) @@ -499,6 +531,7 @@ namespace ETSI.ARF.WorldStorage.UI } aRFNodeWorldAnchor.worldAnchor.UUID = Guid.Parse(uuid); aRFNodeWorldAnchor.GUID = uuid; + aRFNodeWorldAnchor.title = worldAnchor.Name; } } else @@ -519,6 +552,7 @@ namespace ETSI.ARF.WorldStorage.UI trackable.KeyvalueTags["unityAuthoringPosX"] = posX; trackable.KeyvalueTags["unityAuthoringPosY"] = posY; TrackableRequest.UpdateTrackable(worldStorageServer, trackable); + aRFNodeTrackable.title = trackable.Name; } if (node is ARFNodeWorldAnchor aRFNodeWorldAnchor) { @@ -530,6 +564,7 @@ namespace ETSI.ARF.WorldStorage.UI worldAnchor.KeyvalueTags["unityAuthoringPosX"] = posX; worldAnchor.KeyvalueTags["unityAuthoringPosY"] = posY; WorldAnchorRequest.UpdateWorldAnchor(worldStorageServer, worldAnchor); + aRFNodeWorldAnchor.title = worldAnchor.Name; } } } @@ -554,27 +589,9 @@ namespace ETSI.ARF.WorldStorage.UI } } } - //DELETE ELEMENTS FROM THE SERVER - foreach (KeyValuePair elemToRemove in SaveInfo.instance.elemsToRemove) - { - string typeName = elemToRemove.Value.Name; - switch (typeName) - { - case nameof(Trackable): - TrackableRequest.DeleteTrackable(worldStorageServer, elemToRemove.Key); - break; - case nameof(WorldAnchor): - WorldAnchorRequest.DeleteWorldAnchor(worldStorageServer, elemToRemove.Key); - break; - case nameof(WorldLink): - WorldLinkRequest.DeleteWorldLink(worldStorageServer, elemToRemove.Key); - break; - default: - Debug.Log("oops"); - break; - } - } - SaveInfo.instance.initNodePos(worldStorageServer, worldStorageUser); + SaveInfo.instance.InitNodePos(worldStorageServer, worldStorageUser); + + GraphEditorWindow.ResetWindow(); } } } \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNode.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNode.cs index fb3eb4e..900bac9 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNode.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNode.cs @@ -15,18 +15,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // -// Last change: June 2022 +// Last change: July 2022 // + #define USING_OPENAPI_GENERATOR // alt. is Swagger -using System.Collections; -using System.Collections.Generic; -using UnityEngine; using UnityEditor; -using ETSI.ARF.WorldStorage.REST; #if USING_OPENAPI_GENERATOR -using Org.OpenAPITools.Api; using Org.OpenAPITools.Model; #else using IO.Swagger.Api; diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeTrackable.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeTrackable.cs index ebc1646..4b32dba 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeTrackable.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeTrackable.cs @@ -15,18 +15,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // -// Last change: June 2022 +// Last change: July 2022 // + #define USING_OPENAPI_GENERATOR // alt. is Swagger -using System.Collections; -using System.Collections.Generic; using UnityEngine; -using UnityEditor; -using ETSI.ARF.WorldStorage.REST; #if USING_OPENAPI_GENERATOR -using Org.OpenAPITools.Api; using Org.OpenAPITools.Model; #else using IO.Swagger.Api; @@ -35,7 +31,6 @@ using IO.Swagger.Model; using UnityEngine.UIElements; using UnityEditor.Experimental.GraphView; using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows; -using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph; namespace ETSI.ARF.WorldStorage.UI { @@ -73,16 +68,16 @@ namespace ETSI.ARF.WorldStorage.UI RefreshPorts(); /*MANIPULATOR*/ - var doubleClickManipulator = new Clickable(clicked); + var doubleClickManipulator = new Clickable(Clicked); doubleClickManipulator.activators.Clear(); doubleClickManipulator.activators.Add(new ManipulatorActivationFilter { button = MouseButton.LeftMouse, clickCount = 2 }); this.AddManipulator(doubleClickManipulator); } - public void clicked() + public void Clicked() { - NodeEditorWindow.ShowWindow(this); - Debug.Log(trackable.ToString()); + Debug.Log(trackable.ToJson()); + GraphEditorWindow.ShowWindow(this); } public override ObjectType GetElemType() { diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeWorldAnchor.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeWorldAnchor.cs index 4c272f9..e0a8672 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeWorldAnchor.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFNodeWorldAnchor.cs @@ -15,18 +15,14 @@ // See the License for the specific language governing permissions and // limitations under the License. // -// Last change: June 2022 +// Last change: July 2022 // + #define USING_OPENAPI_GENERATOR // alt. is Swagger -using System.Collections; -using System.Collections.Generic; using UnityEngine; -using UnityEditor; -using ETSI.ARF.WorldStorage.REST; #if USING_OPENAPI_GENERATOR -using Org.OpenAPITools.Api; using Org.OpenAPITools.Model; #else using IO.Swagger.Api; @@ -35,7 +31,6 @@ using IO.Swagger.Model; using UnityEngine.UIElements; using UnityEditor.Experimental.GraphView; using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows; -using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph; namespace ETSI.ARF.WorldStorage.UI { @@ -73,16 +68,15 @@ namespace ETSI.ARF.WorldStorage.UI RefreshPorts(); /*MANIPULATOR*/ - var doubleClickManipulator = new Clickable(clicked); + var doubleClickManipulator = new Clickable(Clicked); doubleClickManipulator.activators.Clear(); doubleClickManipulator.activators.Add(new ManipulatorActivationFilter { button = MouseButton.LeftMouse, clickCount = 2 }); this.AddManipulator(doubleClickManipulator); } - public void clicked() + public void Clicked() { - Debug.Log(worldAnchor.ToString()); - NodeEditorWindow.ShowWindow(this); + GraphEditorWindow.ShowWindow(this); } public override ObjectType GetElemType() { diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFPort.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFPort.cs index faa8077..ef4338b 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFPort.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/ARFPort.cs @@ -1,11 +1,29 @@ -using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows; +// +// ARF - Augmented Reality Framework (ETSI ISG ARF) +// +// Copyright 2022 ETSI +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: July 2022 +// + +using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows; using ETSI.ARF.WorldStorage.UI; using Org.OpenAPITools.Model; using System; using System.Collections.Generic; -using UnityEditor; using UnityEditor.Experimental.GraphView; -using UnityEngine; using UnityEngine.UIElements; namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph @@ -25,12 +43,13 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph if (edge is ARFEdgeLink aRFedge) { List transform = new List(); - for (int i = 0; i < 16; i++) + for (int i = 0; i < 15; i++) { transform.Add(0); } + transform.Add(1); - WorldLink worldLink = new WorldLink(Guid.NewGuid(), Guid.Parse(SaveInfo.instance.worldStorageUser.UUID), Guid.Parse(fromNode.GUID), Guid.Parse(toNode.GUID), fromNode.GetElemType(), toNode.GetElemType(), transform, UnitSystem.CM, new Dictionary>()); + WorldLink worldLink = new(Guid.NewGuid(), Guid.Parse(SaveInfo.instance.worldStorageUser.UUID), Guid.Parse(fromNode.GUID), Guid.Parse(toNode.GUID), fromNode.GetElemType(), toNode.GetElemType(), transform, UnitSystem.CM, new Dictionary>()); aRFedge.worldLink = worldLink; } } diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs deleted file mode 100644 index 8d70a34..0000000 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs +++ /dev/null @@ -1,396 +0,0 @@ -// -// ARF - Augmented Reality Framework (ETSI ISG ARF) -// -// Copyright 2022 ETSI -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Last change: June 2022 -// - -#define USING_OPENAPI_GENERATOR // alt. is Swagger - -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEditor; -using UnityEditor.Experimental.GraphView; -using UnityEngine.UIElements; -using UnityEditor.UIElements; -using ETSI.ARF.WorldStorage.REST; -using System; -using System.Threading.Tasks; -using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows; - -#if USING_OPENAPI_GENERATOR -using Org.OpenAPITools.Api; -using Org.OpenAPITools.Model; -#else -using IO.Swagger.Api; -using IO.Swagger.Model; -#endif - - -//THIS CLASS IS GOING TO BE DELETED !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -namespace ETSI.ARF.WorldStorage.UI -{ - - public class GraphWindow : EditorWindow - { - - static public GraphWindow graphWindowSingleton; - - string tempStorageUrl; - int tempStoragePort; - - [HideInInspector] public WorldStorageServer worldStorageServer; - [HideInInspector] public WorldStorageUser worldStorageUser; - - [SerializeField] public List trackables = new List(); - - private Color ori; - private GUIStyle gsTest; - - private ARFGraphView myGraph; - - [MenuItem("ARFWorldStorage/Graph Editor")] - public static void ShowWindow() - { - GetWindow("Menu Editor", true, typeof(SceneView)); - GraphWindow win = EditorWindow.GetWindow(typeof(GraphWindow), false, WorldStorageWindow.winName) as GraphWindow; - } - - public GraphWindow() - { - graphWindowSingleton = this; - } - - public void OnEnable() - { - Debug.Log("onEnable"); - //At unity launch - if (SaveInfo.instance.nodePositions == null) - { - initNodePos(); - } - - tempStorageUrl = this.worldStorageServer.basePath; - tempStoragePort = this.worldStorageServer.port; - ConstructGraphView(); - rootVisualElement.Add(GenerateToolbar()); - myGraph.StretchToParentSize(); - //top offset so that the graph does'nt overlap with the rest of the ui - myGraph.style.top = Length.Percent(11); - rootVisualElement.Add(myGraph); - } - - private void initNodePos() - { - - SaveInfo.instance.nodePositions = new Dictionary(); - foreach (Trackable track in TrackableRequest.GetAllTrackables(worldStorageServer)) - { - if (track.KeyvalueTags.ContainsKey("unityAuthoringPosX") && track.KeyvalueTags.ContainsKey("unityAuthoringPosY")) - { - var posX = float.Parse(track.KeyvalueTags["unityAuthoringPosX"][0]); - var posY = float.Parse(track.KeyvalueTags["unityAuthoringPosY"][0]); - Rect trackPos = new Rect(posX, posY, 135, 77); - SaveInfo.instance.nodePositions[track.UUID.ToString()] = trackPos; - } - else - { - Rect trackPos = new Rect(0, 0, 135, 77); - SaveInfo.instance.nodePositions[track.UUID.ToString()] = trackPos; - } - } - foreach (WorldAnchor wa in WorldAnchorRequest.GetAllWorldAnchors(worldStorageServer)) - { - if (wa.KeyvalueTags.ContainsKey("unityAuthoringPosX") && wa.KeyvalueTags.ContainsKey("unityAuthoringPosY")) - { - var posX = float.Parse(wa.KeyvalueTags["unityAuthoringPosX"][0]); - var posY = float.Parse(wa.KeyvalueTags["unityAuthoringPosY"][0]); - Rect waPos = new Rect(posX, posY, 135, 77); - SaveInfo.instance.nodePositions[wa.UUID.ToString()] = waPos; - } - else - { - Rect trackPos = new Rect(0, 0, 135, 77); - SaveInfo.instance.nodePositions[wa.UUID.ToString()] = trackPos; - } - } - SaveInfo.instance.toReFrame = true; - } - - public void OnDisable() - { - if (positionshaveBeenChanged() && EditorUtility.DisplayDialog("Saving node positions", "The nodes positions have been changed, would you like to save them ?", "Yes", "No")) - { - SaveInfo.instance.nodePositions = myGraph.SavePositions(); - saveElemPositionsInServer(); - - } - //remove the toolbar - rootVisualElement.RemoveAt(0); - //remove the graph - rootVisualElement.Remove(myGraph); - - } - - private void saveElemPositionsInServer() - { - List trackables = TrackableRequest.GetAllTrackables(worldStorageServer); - List anchors = WorldAnchorRequest.GetAllWorldAnchors(worldStorageServer); - foreach (Trackable serverTrack in trackables) - { - if (serverTrack.KeyvalueTags.ContainsKey("unityAuthoringPosX") && serverTrack.KeyvalueTags.ContainsKey("unityAuthoringPosY")) - { - float xLocal = SaveInfo.instance.nodePositions[serverTrack.UUID.ToString()].x; - float yLocal = SaveInfo.instance.nodePositions[serverTrack.UUID.ToString()].y; - float xServer = float.Parse(serverTrack.KeyvalueTags["unityAuthoringPosX"][0]); - float yServer = float.Parse(serverTrack.KeyvalueTags["unityAuthoringPosY"][0]); - if ((xLocal != xServer) && (yLocal != yServer)) - { - var posX = new List(); - posX.Add(SaveInfo.instance.nodePositions[serverTrack.UUID.ToString()].x.ToString()); - serverTrack.KeyvalueTags["unityAuthoringPosX"] = posX; - var posY = new List(); - posY.Add(SaveInfo.instance.nodePositions[serverTrack.UUID.ToString()].y.ToString()); - serverTrack.KeyvalueTags["unityAuthoringPosY"] = posY; - TrackableRequest.UpdateTrackable(worldStorageServer, serverTrack); - } - } - else - { - var posX = new List(); - posX.Add(SaveInfo.instance.nodePositions[serverTrack.UUID.ToString()].x.ToString()); - serverTrack.KeyvalueTags["unityAuthoringPosX"] = posX; - var posY = new List(); - posY.Add(SaveInfo.instance.nodePositions[serverTrack.UUID.ToString()].y.ToString()); - serverTrack.KeyvalueTags["unityAuthoringPosY"] = posY; - TrackableRequest.UpdateTrackable(worldStorageServer, serverTrack); - } - } - foreach (WorldAnchor serverWorldAnchor in anchors) - { - if (serverWorldAnchor.KeyvalueTags.ContainsKey("unityAuthoringPosX") && serverWorldAnchor.KeyvalueTags.ContainsKey("unityAuthoringPosY")) - { - float xLocal = SaveInfo.instance.nodePositions[serverWorldAnchor.UUID.ToString()].x; - float yLocal = SaveInfo.instance.nodePositions[serverWorldAnchor.UUID.ToString()].y; - float xServer = float.Parse(serverWorldAnchor.KeyvalueTags["unityAuthoringPosX"][0]); - float yServer = float.Parse(serverWorldAnchor.KeyvalueTags["unityAuthoringPosY"][0]); - if ((xLocal != xServer) && (yLocal != yServer)) - { - var posX = new List(); - posX.Add(SaveInfo.instance.nodePositions[serverWorldAnchor.UUID.ToString()].x.ToString()); - serverWorldAnchor.KeyvalueTags["unityAuthoringPosX"] = posX; - var posY = new List(); - posY.Add(SaveInfo.instance.nodePositions[serverWorldAnchor.UUID.ToString()].y.ToString()); - serverWorldAnchor.KeyvalueTags["unityAuthoringPosY"] = posY; - WorldAnchorRequest.UpdateWorldAnchor(worldStorageServer, serverWorldAnchor); - } - } - else - { - var posX = new List(); - posX.Add(SaveInfo.instance.nodePositions[serverWorldAnchor.UUID.ToString()].x.ToString()); - serverWorldAnchor.KeyvalueTags["unityAuthoringPosX"] = posX; - var posY = new List(); - posY.Add(SaveInfo.instance.nodePositions[serverWorldAnchor.UUID.ToString()].y.ToString()); - serverWorldAnchor.KeyvalueTags["unityAuthoringPosY"] = posY; - WorldAnchorRequest.UpdateWorldAnchor(worldStorageServer, serverWorldAnchor); - } - } - } - - internal void createTrackableNode(string uUID, float posX, float posY) - { - Trackable track = TrackableRequest.GetTrackable(worldStorageServer, uUID); - myGraph.createTrackableNode(track, posX, posY); - } - - internal void createAnchorNode(string uUID, float posX, float posY) - { - WorldAnchor wa = WorldAnchorRequest.GetWorldAnchor(worldStorageServer, uUID); - myGraph.createAnchorNode(wa, posX, posY); - } - - internal void createLink(string uUID) - { - WorldLink worldLink = WorldLinkRequest.GetWorldLink(worldStorageServer, uUID); - myGraph.createLink(worldLink); - } - - private Toolbar GenerateToolbar() - { - var toolbar = new Toolbar(); - - var createNodeT = new Button(clickEvent: () => { - TrackableWindow.ShowWindow(worldStorageServer, worldStorageUser); - TrackableWindow.winSingleton.nodePosX = 0; - TrackableWindow.winSingleton.nodePosY = 0; - }); - createNodeT.text = "Create Trackable"; - toolbar.Add(createNodeT); - - var createNodeWA = new Button(clickEvent: () => { - WorldAnchorWindow.ShowWindow(worldStorageServer, worldStorageUser); - WorldAnchorWindow.winSingleton.nodePosX = 0; - WorldAnchorWindow.winSingleton.nodePosY = 0; - }); - createNodeWA.text = "Create World Anchor"; - toolbar.Add(createNodeWA); - - toolbar.Add(new ToolbarSpacer() - { - flex = true - }); - - var reload = new Button(clickEvent: () => { - Reload(); - }) - { - text = "reload" - }; - toolbar.Add(reload); - - return toolbar; - } - - public void ConstructGraphView() - { - myGraph = new ARFGraphView - { - name = "ARF Graph", - worldStorageServer = worldStorageServer, - worldStorageUser = worldStorageUser - }; - myGraph.paintWorldStorage(); - SaveInfo.instance.toReFrame = true; - } - - private void OnValidate() - { - Debug.Log("validate"); - } - - - void OnGUI() - { - ori = GUI.backgroundColor; // remember ori color - - gsTest = new GUIStyle("window"); - gsTest.normal.textColor = WorldStorageWindow.arfColors[0]; - gsTest.fontStyle = FontStyle.Bold; - - EditorGUILayout.BeginVertical(); - EditorGUILayout.Space(24); - - - EditorGUI.BeginChangeCheck(); - worldStorageServer = (WorldStorageServer)EditorGUILayout.ObjectField("World Storage Server", worldStorageServer, typeof(WorldStorageServer), false, GUILayout.Width(500)); - if (EditorGUI.EndChangeCheck()) - { - OnDisable(); - initNodePos(); - OnEnable(); - //ConstructGraphView(); - } - - - /*EditorGUILayout.BeginHorizontal(); - tempStorageUrl = EditorGUILayout.TextField(tempStorageUrl); - EditorGUILayout.LabelField(":", GUILayout.ExpandWidth(false), GUILayout.Width(5)); - tempStoragePort = EditorGUILayout.IntField(tempStoragePort, GUILayout.ExpandWidth(false), GUILayout.Width(40)); - GUILayout.Space(5); - *//* if (GUILayout.Button("Change WorldStorage")) - { - ChangeWorldStorage(); - }*//* - GUILayout.FlexibleSpace(); - EditorGUILayout.EndHorizontal();*/ - - - GUI.contentColor = WorldStorageWindow.arfColors[1]; - WorldStorageWindow.DrawCopyright(); - if (SaveInfo.instance.toReFrame) - { - myGraph.FrameAllElements(); - SaveInfo.instance.toReFrame = false; - } - EditorGUILayout.EndVertical(); - } - - private void ChangeWorldStorage() - { - string[] guids1 = AssetDatabase.FindAssets("t:WorldStorageServer", null); - - foreach (string guid1 in guids1) - { - string path = AssetDatabase.GUIDToAssetPath(guid1); - WorldStorageServer server = AssetDatabase.LoadAssetAtPath(path, typeof(WorldStorageServer)) as WorldStorageServer; - if ((server.port == tempStoragePort)&&(server.basePath == tempStorageUrl)) - { - this.worldStorageServer = server; - myGraph.worldStorageServer = server; - } - else - { - WorldStorageServer newServer = (WorldStorageServer) ScriptableObject.CreateInstance(typeof(WorldStorageServer)); - newServer.basePath = tempStorageUrl; - } - } - } - - void Update() - { - } - - private bool positionshaveBeenChanged() - { - bool changed = false; - foreach(ARFNode node in myGraph.nodes) - { - float nodeX = node.GetPosition().x; - float nodeY = node.GetPosition().y; - float dataX = SaveInfo.instance.nodePositions[node.GUID].x; - float dataY = SaveInfo.instance.nodePositions[node.GUID].y; - if((nodeX != dataX) || (nodeY != dataY)) - { - changed = true; - return changed; - } - } - return changed; - } - - public void Reload() - { - if (positionshaveBeenChanged() && EditorUtility.DisplayDialog("Saving node positions", "The nodes positions have been changed, would you like to save them ?", "Yes", "No")) - { - SaveInfo.instance.nodePositions = myGraph.SavePositions(); - } - myGraph.reload(); - SaveInfo.instance.toReFrame = true; - } - - public void RefreshWithoutReframe() - { - if (positionshaveBeenChanged() && EditorUtility.DisplayDialog("Saving node positions", "The nodes positions have been changed, would you like to save them ?", "Yes", "No")) - { - SaveInfo.instance.nodePositions = myGraph.SavePositions(); - } - myGraph.reload(); - } - } -} \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs.meta b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs.meta deleted file mode 100644 index 3634acd..0000000 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/GraphWindow.cs.meta +++ /dev/null @@ -1,14 +0,0 @@ -fileFormatVersion: 2 -guid: 8dd64e8d8a545ab45b424402550b55a6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: - - m_ViewDataDictionary: {instanceID: 0} - - worldStorageServer: {fileID: 11400000, guid: 3a9ba82f4e8dd124ca2b005861c64d01, type: 2} - - worldStorageUser: {fileID: 11400000, guid: c0696089e4a855b46ad490437919b1e8, type: 2} - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/WorldLinkListener.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/WorldLinkListener.cs index 79b6914..eb0ab14 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/WorldLinkListener.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Graph/WorldLinkListener.cs @@ -1,13 +1,27 @@ -using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows; -using ETSI.ARF.WorldStorage; -using ETSI.ARF.WorldStorage.UI; -using Org.OpenAPITools.Model; -using System; +// +// ARF - Augmented Reality Framework (ETSI ISG ARF) +// +// Copyright 2022 ETSI +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: July 2022 +// + +using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows; using System.Collections.Generic; -using UnityEditor; using UnityEditor.Experimental.GraphView; using UnityEngine; -using UnityEngine.UIElements; using static UnityEditor.Experimental.GraphView.Port; namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph @@ -70,12 +84,11 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph edge.input.Connect(item); edge.output.Connect(item); } - NodeEditorWindow.ShowWindow((ARFEdgeLink)edge); + GraphEditorWindow.ShowWindow((ARFEdgeLink)edge); } public void OnDropOutsidePort(Edge edge, Vector2 position) { - Debug.Log("OnDropOutsidePort"); } } } \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/GraphEditorWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/GraphEditorWindow.cs new file mode 100644 index 0000000..49c5ed3 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/GraphEditorWindow.cs @@ -0,0 +1,1094 @@ +// +// ARF - Augmented Reality Framework (ETSI ISG ARF) +// +// Copyright 2022 ETSI +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: July 2022 +// + +using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph; +using ETSI.ARF.WorldStorage.REST; +using ETSI.ARF.WorldStorage.UI; +using Org.OpenAPITools.Model; +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows +{ + public class GraphEditorWindow : EditorWindow + { + public enum GraphEditorType + { + TRACKABLE, + WORLDANCHOR, + WORLDLINK, + NULL + } + + public GraphEditorType type; + + public ARFNodeTrackable trackableNode; + public ARFNodeWorldAnchor worldAnchorNode; + public ARFEdgeLink worldLinkEdge; + + public Trackable trackable; + public WorldAnchor worldAnchor; + public WorldLink worldLink; + + public Vector3 local_size; + public Vector3 local_rot; + public Vector3 local_pos; + + //test + string m_newKey = ""; + List m_newValues = new List(); + + // UI stuffs + private Vector2 scrollPos; + static public GraphEditorWindow winSingleton; + + public void OnEnable() + { + ResetWindow(); + } + + public static void ResetWindow() + { + Type inspectorType = Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll"); + winSingleton = GetWindow("Element Editor", true, inspectorType); + winSingleton.trackable = null; + winSingleton.worldAnchor = null; + winSingleton.worldLink = null; + + winSingleton.trackableNode = null; + winSingleton.worldAnchorNode = null; + winSingleton.worldLinkEdge = null; + + winSingleton.local_size = Vector3.zero; + winSingleton.local_rot = Vector3.zero; + winSingleton.local_pos = Vector3.zero; + + winSingleton.type = GraphEditorType.NULL; + } + + public static void ShowWindow(ARFNodeTrackable trackableNode) + { + Type inspectorType = Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll"); + winSingleton = GetWindow("Element Editor", true, inspectorType); + winSingleton.type = GraphEditorType.TRACKABLE; + + winSingleton.trackable = null; + winSingleton.worldAnchor = null; + winSingleton.worldLink = null; + + winSingleton.trackableNode = null; + winSingleton.worldAnchorNode = null; + winSingleton.worldLinkEdge = null; + + winSingleton.trackableNode = trackableNode; + winSingleton.trackable = trackableNode.trackable; + + winSingleton.local_size = new Vector3((float)winSingleton.trackable.TrackableSize[0], (float)winSingleton.trackable.TrackableSize[1], (float)winSingleton.trackable.TrackableSize[2]); + if (winSingleton.trackable.LocalCRS.Count == 16) + { + Matrix4x4 localCRS = new Matrix4x4(); + localCRS.m00 = winSingleton.trackable.LocalCRS[0]; localCRS.m01 = winSingleton.trackable.LocalCRS[1]; localCRS.m02 = winSingleton.trackable.LocalCRS[2]; localCRS.m03 = winSingleton.trackable.LocalCRS[3]; + localCRS.m10 = winSingleton.trackable.LocalCRS[4]; localCRS.m11 = winSingleton.trackable.LocalCRS[5]; localCRS.m12 = winSingleton.trackable.LocalCRS[6]; localCRS.m13 = winSingleton.trackable.LocalCRS[7]; + localCRS.m20 = winSingleton.trackable.LocalCRS[8]; localCRS.m21 = winSingleton.trackable.LocalCRS[9]; localCRS.m22 = winSingleton.trackable.LocalCRS[10]; localCRS.m23 = winSingleton.trackable.LocalCRS[11]; + localCRS.m30 = winSingleton.trackable.LocalCRS[12]; localCRS.m31 = winSingleton.trackable.LocalCRS[13]; localCRS.m32 = winSingleton.trackable.LocalCRS[14]; localCRS.m33 = winSingleton.trackable.LocalCRS[15]; + winSingleton.local_pos = localCRS.GetPosition(); + winSingleton.local_rot = localCRS.rotation.eulerAngles; + } + + } + + public static void ShowWindow(ARFNodeWorldAnchor worldAnchorNode) + { + Type inspectorType = Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll"); + winSingleton = GetWindow("Element Editor", true, inspectorType); + winSingleton.type = GraphEditorType.WORLDANCHOR; + + winSingleton.trackable = null; + winSingleton.worldAnchor = null; + winSingleton.worldLink = null; + + winSingleton.trackableNode = null; + winSingleton.worldAnchorNode = null; + winSingleton.worldLinkEdge = null; + + winSingleton.worldAnchorNode = worldAnchorNode; + winSingleton.worldAnchor = worldAnchorNode.worldAnchor; + + winSingleton.local_size = new Vector3((float)winSingleton.worldAnchor.WorldAnchorSize[0], (float)winSingleton.worldAnchor.WorldAnchorSize[1], (float)winSingleton.worldAnchor.WorldAnchorSize[2]); + if (winSingleton.worldAnchor.LocalCRS.Count == 16) + { + Matrix4x4 localCRS = new Matrix4x4(); + localCRS.m00 = winSingleton.worldAnchor.LocalCRS[0]; localCRS.m01 = winSingleton.worldAnchor.LocalCRS[1]; localCRS.m02 = winSingleton.worldAnchor.LocalCRS[2]; localCRS.m03 = winSingleton.worldAnchor.LocalCRS[3]; + localCRS.m10 = winSingleton.worldAnchor.LocalCRS[4]; localCRS.m11 = winSingleton.worldAnchor.LocalCRS[5]; localCRS.m12 = winSingleton.worldAnchor.LocalCRS[6]; localCRS.m13 = winSingleton.worldAnchor.LocalCRS[7]; + localCRS.m20 = winSingleton.worldAnchor.LocalCRS[8]; localCRS.m21 = winSingleton.worldAnchor.LocalCRS[9]; localCRS.m22 = winSingleton.worldAnchor.LocalCRS[10]; localCRS.m23 = winSingleton.worldAnchor.LocalCRS[11]; + localCRS.m30 = winSingleton.worldAnchor.LocalCRS[12]; localCRS.m31 = winSingleton.worldAnchor.LocalCRS[13]; localCRS.m32 = winSingleton.worldAnchor.LocalCRS[14]; localCRS.m33 = winSingleton.worldAnchor.LocalCRS[15]; + winSingleton.local_pos = localCRS.GetPosition(); + winSingleton.local_rot = localCRS.rotation.eulerAngles; + } + } + + public static void ShowWindow(ARFEdgeLink graphEdge) + { + Type inspectorType = Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll"); + winSingleton = GetWindow("Element Editor", true, inspectorType); + winSingleton.type = GraphEditorType.WORLDLINK; + + winSingleton.trackable = null; + winSingleton.worldAnchor = null; + winSingleton.worldLink = null; + + winSingleton.trackableNode = null; + winSingleton.worldAnchorNode = null; + winSingleton.worldLinkEdge = null; + + winSingleton.worldLinkEdge = graphEdge; + winSingleton.worldLink = graphEdge.worldLink; + + if (winSingleton.worldLink.Transform.Count == 16) + { + Matrix4x4 localCRS = new Matrix4x4(); + localCRS.m00 = winSingleton.worldLink.Transform[0]; localCRS.m01 = winSingleton.worldLink.Transform[1]; localCRS.m02 = winSingleton.worldLink.Transform[2]; localCRS.m03 = winSingleton.worldLink.Transform[3]; + localCRS.m10 = winSingleton.worldLink.Transform[4]; localCRS.m11 = winSingleton.worldLink.Transform[5]; localCRS.m12 = winSingleton.worldLink.Transform[6]; localCRS.m13 = winSingleton.worldLink.Transform[7]; + localCRS.m20 = winSingleton.worldLink.Transform[8]; localCRS.m21 = winSingleton.worldLink.Transform[9]; localCRS.m22 = winSingleton.worldLink.Transform[10]; localCRS.m23 = winSingleton.worldLink.Transform[11]; + localCRS.m30 = winSingleton.worldLink.Transform[12]; localCRS.m31 = winSingleton.worldLink.Transform[13]; localCRS.m32 = winSingleton.worldLink.Transform[14]; localCRS.m33 = winSingleton.worldLink.Transform[15]; + winSingleton.local_pos = localCRS.GetPosition(); + winSingleton.local_rot = localCRS.rotation.eulerAngles; + } + } + + public void OnGUI() + { + + scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.ExpandWidth(true)); + + switch (type) + { + case GraphEditorType.WORLDLINK: + BuildWorldLinkUI(); + break; + case GraphEditorType.TRACKABLE: + BuildTrackableUI(); + break; + case GraphEditorType.WORLDANCHOR: + BuildWorldAnchorUI(); + break; + default: + break; + } + + EditorGUILayout.EndScrollView(); + } + + //BUILD UI FOR MODIYING THE WORLDANCHOR + private void BuildWorldAnchorUI() + { + if(worldAnchor != null) { + + // + //HEADER + // + + //anchor icon + EditorGUILayout.BeginHorizontal(); + Texture anchorImage = (Texture)AssetDatabase.LoadAssetAtPath("Assets/ETSI.ARF/ARF World Storage API/Images/anchor.png", typeof(Texture)); + GUI.backgroundColor = Color.clear; + GUILayout.Box(anchorImage, GUILayout.Width(40), GUILayout.Height(40)); + + //anchor label + EditorGUILayout.BeginVertical(GUILayout.Height(50)); + GUILayout.FlexibleSpace(); + EditorGUILayout.LabelField("WORLD ANCHOR", EditorStyles.boldLabel); + GUILayout.FlexibleSpace(); + EditorGUILayout.EndVertical(); + EditorGUILayout.EndHorizontal(); + + //separator line + var rect = EditorGUILayout.BeginHorizontal(GUILayout.Height(40)); + DrawUILine(new Color(0.76f, 0.9f, 0.46f, 0.9f), 5, 5); + EditorGUILayout.EndHorizontal(); + + // + //ELEMENT PARAMETERS + // + + EditorGUI.BeginChangeCheck(); + + //uuid + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("UUID : ", EditorStyles.boldLabel, GUILayout.Width(50)); + if (!SaveInfo.instance.nodePositions.ContainsKey(worldAnchor.UUID.ToString())) + { + EditorGUILayout.LabelField("none Yet"); + } + else + { + EditorGUILayout.SelectableLabel(worldAnchor.UUID.ToString(), EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight)); + } + EditorGUILayout.EndHorizontal(); + + //name + EditorGUILayout.BeginHorizontal(); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.LabelField("NAME : ", EditorStyles.boldLabel, GUILayout.Width(50)); + worldAnchor.Name = EditorGUILayout.DelayedTextField(worldAnchor.Name); + if (EditorGUI.EndChangeCheck()) + { + worldAnchorNode.title = worldAnchor.Name; + } + EditorGUILayout.EndHorizontal(); + + //unit system + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("UNIT : ", EditorStyles.boldLabel, GUILayout.Width(50)); + worldAnchor.Unit = (UnitSystem)EditorGUILayout.EnumPopup(worldAnchor.Unit); + EditorGUILayout.EndHorizontal(); + + //size + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("SIZE : ", EditorStyles.boldLabel, GUILayout.Width(50)); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("X", GUILayout.Width(15)); + local_size[0] = EditorGUILayout.DelayedFloatField(local_size[0]); + EditorGUILayout.LabelField("Y", GUILayout.Width(15)); + local_size[1] = EditorGUILayout.DelayedFloatField(local_size[1]); + EditorGUILayout.LabelField("Z", GUILayout.Width(15)); + local_size[2] = EditorGUILayout.DelayedFloatField(local_size[2]); + EditorGUILayout.EndHorizontal(); + + //localCRS + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("LOCAL CRS : ", EditorStyles.boldLabel); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.LabelField("position : "); + //position + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("X", GUILayout.Width(15)); + local_pos[0] = EditorGUILayout.DelayedFloatField(local_pos[0]); + EditorGUILayout.LabelField("Y", GUILayout.Width(15)); + local_pos[1] = EditorGUILayout.DelayedFloatField(local_pos[1]); + EditorGUILayout.LabelField("Z", GUILayout.Width(15)); + local_pos[2] = EditorGUILayout.DelayedFloatField(local_pos[2]); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.LabelField("rotation : "); + //rotation + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("X", GUILayout.Width(15)); + local_rot[0] = EditorGUILayout.DelayedFloatField(local_rot[0]); + EditorGUILayout.LabelField("Y", GUILayout.Width(15)); + local_rot[1] = EditorGUILayout.DelayedFloatField(local_rot[1]); + EditorGUILayout.LabelField("Z", GUILayout.Width(15)); + local_rot[2] = EditorGUILayout.DelayedFloatField(local_rot[2]); + EditorGUILayout.EndHorizontal(); + + //keyvaluetags=================================================================================================TOBEMODIFIED + EditorGUILayout.BeginHorizontal(); + GUILayout.Label("TAGS : ", EditorStyles.boldLabel); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginVertical(); + Dictionary> tempPairs = worldAnchor.KeyvalueTags; + EditorGUILayout.BeginHorizontal(); + m_newKey = GUILayout.TextField(m_newKey, GUILayout.Width(300)); + if (GUILayout.Button("Add Key")) + { + if (m_newKey != "") + { + List emptyList = new List(); + worldAnchor.KeyvalueTags.Add(m_newKey, emptyList); + m_newKey = ""; + } + } + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal(); + //iterator on m_newValues + int j = 0; + foreach (KeyValuePair> entry in tempPairs) + { + DrawUILine(Color.gray, 1, 1); + EditorGUILayout.BeginHorizontal(); + GUILayout.Label(entry.Key); + GUILayout.FlexibleSpace(); + if (GUILayout.Button("x", GUILayout.Width(18), GUILayout.Height(18))) + { + worldAnchor.KeyvalueTags.Remove(entry.Key); + m_newValues[j] = ""; + } + EditorGUILayout.EndHorizontal(); + + + EditorGUILayout.BeginHorizontal(); + List tempValues = entry.Value; + foreach (string value in tempValues) + { + GUILayout.Label(value); + + if (GUILayout.Button("x", GUILayout.Width(18), GUILayout.Height(18))) + { + tempValues.Remove(value); + worldAnchor.KeyvalueTags[entry.Key] = tempValues; + } + } + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + if (m_newValues.Count < j + 1) + { + string value = ""; + m_newValues.Add(value); + } + m_newValues[j] = GUILayout.TextField(m_newValues[j], GUILayout.Width(200)); + if (GUILayout.Button("Add Value")) + { + if (m_newValues[j] != "") + { + List valueList = entry.Value; + valueList.Add(m_newValues[j]); + worldAnchor.KeyvalueTags[entry.Key] = valueList; + m_newValues[j] = ""; + } + } + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal(); + + j++; + } + EditorGUILayout.EndVertical(); + //keyvaluetags=================================================================================================TOBEMODIFIED + + + //Actions when the ui fields have been changed + if (EditorGUI.EndChangeCheck()) + { + // + Matrix4x4 localCRS = Matrix4x4.TRS(local_pos, Quaternion.Euler(local_rot), Vector3.one); + List localCRSasFloat = new List + { + localCRS.m00, localCRS.m01, localCRS.m02, localCRS.m03, + localCRS.m10, localCRS.m11, localCRS.m12, localCRS.m13, + localCRS.m20, localCRS.m21, localCRS.m22, localCRS.m23, + localCRS.m30, localCRS.m31, localCRS.m32, localCRS.m33, + }; + worldAnchor.LocalCRS = localCRSasFloat; + + List localSizeAsFloat = new List + { + local_size.x, local_size.y, local_size.z + }; + worldAnchor.WorldAnchorSize = localSizeAsFloat; + + if (SaveInfo.instance.nodePositions.ContainsKey(worldAnchor.UUID.ToString()) && (!SaveInfo.instance.elemsToUpdate.Contains(worldAnchor.UUID.ToString()))) + { + SaveInfo.instance.elemsToUpdate.Add(worldAnchor.UUID.ToString()); + } + } + + // + //FOOTER + // + GUILayout.FlexibleSpace(); + EditorGUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + //reset button + if (GUILayout.Button("Reset")) + { + //lose focus of fields otherwise the selected field won't updaate + EditorGUI.FocusTextInControl(null); + if (SaveInfo.instance.nodePositions.ContainsKey(worldAnchor.UUID.ToString())) + { + if (SaveInfo.instance.elemsToUpdate.Contains(worldAnchor.UUID.ToString()) && EditorUtility.DisplayDialog("Reset elements", "Are you sure you want to lose all your changes ?", "Yes", "No")) + { + worldAnchor = WorldAnchorRequest.GetWorldAnchor(SaveInfo.instance.worldStorageServer, worldAnchor.UUID.ToString()); + worldAnchorNode.worldAnchor = worldAnchor; + ShowWindow(worldAnchorNode); + } + } + else + { + if (EditorUtility.DisplayDialog("Reset elements", "Are you sure you want to lose all your changes ?", "Yes", "No")) + { + //generate the worldAnchor attributes + List localCRS = new List(); + for (int i = 0; i < 15; i++) + { + localCRS.Add(0); + } + localCRS.Add(1); + + List worldAnchorSize = new List(); + for (int i = 0; i < 3; i++) + { + worldAnchorSize.Add(0); + } + worldAnchor = new WorldAnchor(Guid.NewGuid(), "DefaultWorldAnchor", Guid.Parse(SaveInfo.instance.worldStorageUser.UUID), localCRS, UnitSystem.CM, worldAnchorSize, new Dictionary>()); + worldAnchorNode.worldAnchor = worldAnchor; + ShowWindow(worldAnchorNode); + } + } + } + //delete button + if (GUILayout.Button("Delete")) + { + if (EditorUtility.DisplayDialog("Deleting elements", "Are you sure you want to delete this element ?", "Yes", "No")) + { + if (SaveInfo.instance.nodePositions.ContainsKey(worldAnchor.UUID.ToString())) + { + SaveInfo.instance.elemsToRemove.Add(worldAnchor.UUID.ToString(), typeof(WorldAnchor)); + } + var window = GetWindow(); + window.DeleteNode(worldAnchorNode); + ResetWindow(); + } + } + //save button + if (GUILayout.Button("Save")) + { + if (SaveInfo.instance.nodePositions.ContainsKey(worldAnchor.UUID.ToString())) + { + if (SaveInfo.instance.elemsToUpdate.Contains(worldAnchor.UUID.ToString())) + { + if (EditorUtility.DisplayDialog("Saving element", "Are you sure you want to save this element in the server ?", "Yes", "No")) + { + WorldAnchorRequest.UpdateWorldAnchor(SaveInfo.instance.worldStorageServer, worldAnchor); + SaveInfo.instance.elemsToUpdate.Remove(worldAnchor.UUID.ToString()); + } + } + } + else + { + if (EditorUtility.DisplayDialog("Saving element", "Are you sure you want to save this element's informations to the server ?", "Yes", "No")) + { + var posX = new List(); + posX.Add(worldAnchorNode.GetPosition().x.ToString()); + var posY = new List(); + posY.Add(worldAnchorNode.GetPosition().y.ToString()); + WorldAnchor worldAnchor = worldAnchorNode.worldAnchor; + worldAnchor.KeyvalueTags["unityAuthoringPosX"] = posX; + worldAnchor.KeyvalueTags["unityAuthoringPosY"] = posY; + + String uuid = WorldAnchorRequest.AddWorldAnchor(SaveInfo.instance.worldStorageServer, worldAnchor); + + //change the uuid in its edges, if there is a new edge to be added in the world storage it needs to have the correct uuid + uuid = uuid.Replace("\"", ""); + foreach (ARFEdgeLink edge in worldAnchorNode.portIn.connections) + { + edge.worldLink.UUIDTo = Guid.Parse(uuid); + } + foreach (ARFEdgeLink edge in worldAnchorNode.portOut.connections) + { + edge.worldLink.UUIDFrom = Guid.Parse(uuid); + } + worldAnchorNode.worldAnchor.UUID = Guid.Parse(uuid); + worldAnchorNode.GUID = uuid; + worldAnchorNode.title = worldAnchor.Name; + + //Add the newly saved World Anchor to the SaveInfo singleton + Rect trackPos = new(worldAnchorNode.GetPosition().x, worldAnchorNode.GetPosition().y, 135, 77); + SaveInfo.instance.nodePositions[uuid] = trackPos; + } + } + } + GUILayout.Space(10); + EditorGUILayout.EndHorizontal(); + GUILayout.Space(10); + + + } + } + + private void BuildTrackableUI() + { + if (trackable != null) + { + // + //HEADER + // + + //trackable icon + EditorGUILayout.BeginHorizontal(); + Texture trackImage = (Texture)AssetDatabase.LoadAssetAtPath("Assets/ETSI.ARF/ARF World Storage API/Images/trackable.png", typeof(Texture)); + GUI.backgroundColor = Color.clear; + GUILayout.Box(trackImage, GUILayout.Width(40), GUILayout.Height(40)); + + //trackable label + EditorGUILayout.BeginVertical(GUILayout.Height(50)); + GUILayout.FlexibleSpace(); + EditorGUILayout.LabelField("TRACKABLE", EditorStyles.boldLabel); + GUILayout.FlexibleSpace(); + EditorGUILayout.EndVertical(); + EditorGUILayout.EndHorizontal(); + + //separator line + var rect = EditorGUILayout.BeginHorizontal(GUILayout.Height(40)); + DrawUILine(new Color(0.9f, 0.78f, 0.54f, 0.9f), 5, 5); + EditorGUILayout.EndHorizontal(); + + // + //ELEMENT PARAMETERS + // + + EditorGUI.BeginChangeCheck(); + + //uuid + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("UUID : ", EditorStyles.boldLabel, GUILayout.Width(50)); + if (!SaveInfo.instance.nodePositions.ContainsKey(trackable.UUID.ToString())) + { + EditorGUILayout.LabelField("none Yet"); + } + else + { + EditorGUILayout.SelectableLabel(trackable.UUID.ToString(), EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight)); + } + EditorGUILayout.EndHorizontal(); + + //name + EditorGUILayout.BeginHorizontal(); + EditorGUI.BeginChangeCheck(); + EditorGUILayout.LabelField("NAME : ", EditorStyles.boldLabel, GUILayout.Width(50)); + trackable.Name = EditorGUILayout.DelayedTextField(trackable.Name); + if (EditorGUI.EndChangeCheck()) + { + trackableNode.title = trackable.Name; + } + EditorGUILayout.EndHorizontal(); + + //unit system + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("UNIT : ", EditorStyles.boldLabel, GUILayout.Width(50)); + trackable.Unit = (UnitSystem)EditorGUILayout.EnumPopup(trackable.Unit); + EditorGUILayout.EndHorizontal(); + + //size + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("SIZE : ", EditorStyles.boldLabel, GUILayout.Width(50)); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("X", GUILayout.Width(15)); + local_size[0] = EditorGUILayout.DelayedFloatField(local_size[0]); + EditorGUILayout.LabelField("Y", GUILayout.Width(15)); + local_size[1] = EditorGUILayout.DelayedFloatField(local_size[1]); + EditorGUILayout.LabelField("Z", GUILayout.Width(15)); + local_size[2] = EditorGUILayout.DelayedFloatField(local_size[2]); + EditorGUILayout.EndHorizontal(); + + //localCRS + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("LOCAL CRS : ", EditorStyles.boldLabel); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.LabelField("position : "); + //position + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("X", GUILayout.Width(15)); + local_pos[0] = EditorGUILayout.DelayedFloatField(local_pos[0]); + EditorGUILayout.LabelField("Y", GUILayout.Width(15)); + local_pos[1] = EditorGUILayout.DelayedFloatField(local_pos[1]); + EditorGUILayout.LabelField("Z", GUILayout.Width(15)); + local_pos[2] = EditorGUILayout.DelayedFloatField(local_pos[2]); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.LabelField("rotation : "); + //rotation + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("X", GUILayout.Width(15)); + local_rot[0] = EditorGUILayout.DelayedFloatField(local_rot[0]); + EditorGUILayout.LabelField("Y", GUILayout.Width(15)); + local_rot[1] = EditorGUILayout.DelayedFloatField(local_rot[1]); + EditorGUILayout.LabelField("Z", GUILayout.Width(15)); + local_rot[2] = EditorGUILayout.DelayedFloatField(local_rot[2]); + EditorGUILayout.EndHorizontal(); + + //encodingInofrmation + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("TRACKABLE INFORMATION : ", EditorStyles.boldLabel); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("Format : ", GUILayout.Width(50)); + trackable.TrackableEncodingInformation.DataFormat = (EncodingInformationStructure.DataFormatEnum)EditorGUILayout.EnumPopup(trackable.TrackableEncodingInformation.DataFormat); + EditorGUILayout.LabelField("Version : ", GUILayout.Width(50)); + float floatVersion = EditorGUILayout.DelayedFloatField(float.Parse(trackable.TrackableEncodingInformation._Version)); + trackable.TrackableEncodingInformation._Version = floatVersion.ToString(); + EditorGUILayout.EndHorizontal(); + + //trackable payload + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("TRACKABLE PAYLOAD : ", EditorStyles.boldLabel, GUILayout.Width(140)); + EditorGUILayout.LabelField("==============================================================================="); + EditorGUILayout.EndHorizontal(); + + //keyvaluetags=================================================================================================TOBEMODIFIED + EditorGUILayout.BeginHorizontal(); + GUILayout.Label("TAGS : ", EditorStyles.boldLabel); + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginVertical(); + Dictionary> tempPairs = trackable.KeyvalueTags; + EditorGUILayout.BeginHorizontal(); + m_newKey = GUILayout.TextField(m_newKey, GUILayout.Width(300)); + if (GUILayout.Button("Add Key")) + { + if (m_newKey != "") + { + List emptyList = new List(); + trackable.KeyvalueTags.Add(m_newKey, emptyList); + m_newKey = ""; + } + } + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal(); + //iterator on m_newValues + int j = 0; + foreach (KeyValuePair> entry in tempPairs) + { + DrawUILine(Color.gray, 1, 1); + EditorGUILayout.BeginHorizontal(); + GUILayout.Label(entry.Key); + GUILayout.FlexibleSpace(); + if (GUILayout.Button("x", GUILayout.Width(18), GUILayout.Height(18))) + { + trackable.KeyvalueTags.Remove(entry.Key); + m_newValues[j] = ""; + } + EditorGUILayout.EndHorizontal(); + + + EditorGUILayout.BeginHorizontal(); + List tempValues = entry.Value; + foreach (string value in tempValues) + { + GUILayout.Label(value); + + if (GUILayout.Button("x", GUILayout.Width(18), GUILayout.Height(18))) + { + tempValues.Remove(value); + trackable.KeyvalueTags[entry.Key] = tempValues; + } + } + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + if (m_newValues.Count < j + 1) + { + string value = ""; + m_newValues.Add(value); + } + m_newValues[j] = GUILayout.TextField(m_newValues[j], GUILayout.Width(200)); + if (GUILayout.Button("Add Value")) + { + if (m_newValues[j] != "") + { + List valueList = entry.Value; + valueList.Add(m_newValues[j]); + trackable.KeyvalueTags[entry.Key] = valueList; + m_newValues[j] = ""; + } + } + GUILayout.FlexibleSpace(); + EditorGUILayout.EndHorizontal(); + + j++; + } + EditorGUILayout.EndVertical(); + //keyvaluetags=================================================================================================TOBEMODIFIED + + + //Actions when the ui fields have been changed + if (EditorGUI.EndChangeCheck()) + { + // + Matrix4x4 localCRS = Matrix4x4.TRS(local_pos, Quaternion.Euler(local_rot), Vector3.one); + List localCRSasFloat = new List + { + localCRS.m00, localCRS.m01, localCRS.m02, localCRS.m03, + localCRS.m10, localCRS.m11, localCRS.m12, localCRS.m13, + localCRS.m20, localCRS.m21, localCRS.m22, localCRS.m23, + localCRS.m30, localCRS.m31, localCRS.m32, localCRS.m33, + }; + trackable.LocalCRS = localCRSasFloat; + + List localSizeAsFloat = new List + { + local_size.x, local_size.y, local_size.z + }; + trackable.TrackableSize = localSizeAsFloat; + + if (SaveInfo.instance.nodePositions.ContainsKey(trackable.UUID.ToString()) && (!SaveInfo.instance.elemsToUpdate.Contains(trackable.UUID.ToString()))) + { + SaveInfo.instance.elemsToUpdate.Add(trackable.UUID.ToString()); + } + } + + // + //FOOTER + // + GUILayout.FlexibleSpace(); + EditorGUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + //reset button + if (GUILayout.Button("Reset")) + { + //lose focus of fields otherwise the selected field won't updaate + EditorGUI.FocusTextInControl(null); + if (SaveInfo.instance.nodePositions.ContainsKey(trackable.UUID.ToString())) + { + if (SaveInfo.instance.elemsToUpdate.Contains(trackable.UUID.ToString()) && EditorUtility.DisplayDialog("Reset elements", "Are you sure you want to lose all your changes ?", "Yes", "No")) + { + trackable = TrackableRequest.GetTrackable(SaveInfo.instance.worldStorageServer, trackable.UUID.ToString()); + trackableNode.trackable = trackable; + ShowWindow(trackableNode); + } + } + else + { + if (EditorUtility.DisplayDialog("Reset elements", "Are you sure you want to lose all your changes ?", "Yes", "No")) + { + //generate the Trackables's attributes + EncodingInformationStructure trackableEncodingInformation = new EncodingInformationStructure(EncodingInformationStructure.DataFormatEnum.OTHER, "0"); + + List localCRS = new(); + for (int i = 0; i < 15; i++) + { + localCRS.Add(0); + } + localCRS.Add(1); + + List trackableSize = new(); + for (int i = 0; i < 3; i++) + { + trackableSize.Add(0); + } + + Trackable trackable = new Trackable(Guid.NewGuid(), "Defaulttrackable", Guid.Parse(SaveInfo.instance.worldStorageUser.UUID), Trackable.TrackableTypeEnum.OTHER, trackableEncodingInformation, new byte[64], localCRS, UnitSystem.CM, trackableSize, new Dictionary>()); + trackableNode.trackable = trackable; + ShowWindow(trackableNode); + } + } + } + //delete button + if (GUILayout.Button("Delete")) + { + if (EditorUtility.DisplayDialog("Deleting elements", "Are you sure you want to delete this element ?", "Yes", "No")) + { + if (SaveInfo.instance.nodePositions.ContainsKey(trackable.UUID.ToString())) + { + SaveInfo.instance.elemsToRemove.Add(trackable.UUID.ToString(), typeof(Trackable)); + } + var window = GetWindow(); + window.DeleteNode(trackableNode); + ResetWindow(); + } + } + //save button + if (GUILayout.Button("Save")) + { + if (SaveInfo.instance.nodePositions.ContainsKey(trackable.UUID.ToString())) + { + if (SaveInfo.instance.elemsToUpdate.Contains(trackable.UUID.ToString())) + { + if (EditorUtility.DisplayDialog("Saving element", "Are you sure you want to save this element in the server ?", "Yes", "No")) + { + TrackableRequest.UpdateTrackable(SaveInfo.instance.worldStorageServer, trackable); + SaveInfo.instance.elemsToUpdate.Remove(trackable.UUID.ToString()); + } + } + } + else + { + if (EditorUtility.DisplayDialog("Saving element", "Are you sure you want to save this element's informations to the server ?", "Yes", "No")) + { + var posX = new List(); + posX.Add(trackableNode.GetPosition().x.ToString()); + var posY = new List(); + posY.Add(trackableNode.GetPosition().y.ToString()); + Trackable trackable = trackableNode.trackable; + trackable.KeyvalueTags["unityAuthoringPosX"] = posX; + trackable.KeyvalueTags["unityAuthoringPosY"] = posY; + String uuid = TrackableRequest.AddTrackable(SaveInfo.instance.worldStorageServer, trackable); + + //change the uuid in its edges, if there is a new edge to be added in the world storage it needs to have the correct uuid + uuid = uuid.Replace("\"", ""); + foreach (ARFEdgeLink edge in trackableNode.portIn.connections) + { + edge.worldLink.UUIDTo = Guid.Parse(uuid); + } + foreach (ARFEdgeLink edge in trackableNode.portOut.connections) + { + edge.worldLink.UUIDFrom = Guid.Parse(uuid); + } + trackableNode.trackable.UUID = Guid.Parse(uuid); + trackableNode.GUID = uuid; + trackableNode.title = trackable.Name; + + //Add the newly saved Trackable to the SaveInfo singleton + Rect trackPos = new(trackableNode.GetPosition().x, trackableNode.GetPosition().y, 135, 77); + SaveInfo.instance.nodePositions[uuid] = trackPos; + } + } + } + GUILayout.Space(10); + EditorGUILayout.EndHorizontal(); + GUILayout.Space(10); + + + } + } + + private void BuildWorldLinkUI() + { + if (worldLink != null) + { + // + //HEADER + // + + //world link icon + EditorGUILayout.BeginHorizontal(); + Texture linkImage = (Texture)AssetDatabase.LoadAssetAtPath("Assets/ETSI.ARF/ARF World Storage API/Images/link.png", typeof(Texture)); + GUI.backgroundColor = Color.clear; + GUILayout.Box(linkImage, GUILayout.Width(40), GUILayout.Height(40)); + + //world link label + EditorGUILayout.BeginVertical(GUILayout.Height(50)); + GUILayout.FlexibleSpace(); + EditorGUILayout.LabelField("WORLD LINK", EditorStyles.boldLabel); + GUILayout.FlexibleSpace(); + EditorGUILayout.EndVertical(); + EditorGUILayout.EndHorizontal(); + + //separator line + var rect = EditorGUILayout.BeginHorizontal(GUILayout.Height(40)); + DrawUILine(new Color(0.77f, 0.77f, 0.77f, 0.77f), 5, 5); + EditorGUILayout.EndHorizontal(); + + //ELEMENT'S ATTRIBUTES + EditorGUI.BeginChangeCheck(); + + //uuid + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("UUID : ", EditorStyles.boldLabel, GUILayout.Width(50)); + if (!SaveInfo.instance.linkIds.Contains(worldLink.UUID.ToString())) + { + EditorGUILayout.LabelField("none Yet"); + } + else + { + EditorGUILayout.SelectableLabel(worldLink.UUID.ToString(), EditorStyles.textField, GUILayout.Height(EditorGUIUtility.singleLineHeight)); + } + EditorGUILayout.EndHorizontal(); + + //source element + EditorGUILayout.LabelField("SOURCE ELEMENT : ", EditorStyles.boldLabel); + EditorGUILayout.BeginHorizontal(); + GUILayout.Space(50); + EditorGUILayout.LabelField("name : ", GUILayout.Width(75)); + EditorGUILayout.LabelField(worldLinkEdge.output.node.title); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + GUILayout.Space(50); + EditorGUILayout.LabelField("type : ", GUILayout.Width(75)); + EditorGUILayout.LabelField(worldLink.TypeFrom.ToString(), GUILayout.Width(80)); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + GUILayout.Space(50); + EditorGUILayout.LabelField("uuid : ", GUILayout.Width(75)); + if (SaveInfo.instance.nodePositions.ContainsKey(worldLink.UUIDFrom.ToString())) + { + EditorGUILayout.LabelField(worldLink.UUIDFrom.ToString()); + } + else + { + EditorGUILayout.LabelField("no UUID yet"); + } + EditorGUILayout.EndHorizontal(); + + //target element + EditorGUILayout.LabelField("TARGET ELEMENT : ", EditorStyles.boldLabel); + EditorGUILayout.BeginHorizontal(); + GUILayout.Space(50); + EditorGUILayout.LabelField("name : ", GUILayout.Width(75)); + EditorGUILayout.LabelField(worldLinkEdge.input.node.title); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + GUILayout.Space(50); + EditorGUILayout.LabelField("type : ", GUILayout.Width(75)); + EditorGUILayout.LabelField(worldLink.TypeTo.ToString(), GUILayout.Width(80)); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + GUILayout.Space(50); + EditorGUILayout.LabelField("uuid : ", GUILayout.Width(75)); + if (SaveInfo.instance.nodePositions.ContainsKey(worldLink.UUIDTo.ToString())) + { + EditorGUILayout.LabelField(worldLink.UUIDTo.ToString()); + } + else + { + EditorGUILayout.LabelField("no UUID yet"); + } + EditorGUILayout.EndHorizontal(); + + //unit system + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("UNIT : ", EditorStyles.boldLabel, GUILayout.Width(50)); + worldLink.Unit = (UnitSystem)EditorGUILayout.EnumPopup(worldLink.Unit); + EditorGUILayout.EndHorizontal(); + + //localCRS + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("3D TRANSFORM : ", EditorStyles.boldLabel); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.LabelField("position : "); + //position + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("X", GUILayout.Width(15)); + local_pos[0] = EditorGUILayout.DelayedFloatField(local_pos[0]); + EditorGUILayout.LabelField("Y", GUILayout.Width(15)); + local_pos[1] = EditorGUILayout.DelayedFloatField(local_pos[1]); + EditorGUILayout.LabelField("Z", GUILayout.Width(15)); + local_pos[2] = EditorGUILayout.DelayedFloatField(local_pos[2]); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.LabelField("rotation : "); + //rotation + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField("X", GUILayout.Width(15)); + local_rot[0] = EditorGUILayout.DelayedFloatField(local_rot[0]); + EditorGUILayout.LabelField("Y", GUILayout.Width(15)); + local_rot[1] = EditorGUILayout.DelayedFloatField(local_rot[1]); + EditorGUILayout.LabelField("Z", GUILayout.Width(15)); + local_rot[2] = EditorGUILayout.DelayedFloatField(local_rot[2]); + EditorGUILayout.EndHorizontal(); + + //Actions when the ui fields have been changed + if (EditorGUI.EndChangeCheck()) + { + // + Matrix4x4 localCRS = Matrix4x4.TRS(local_pos, Quaternion.Euler(local_rot), Vector3.one); + List localCRSasFloat = new List + { + localCRS.m00, localCRS.m01, localCRS.m02, localCRS.m03, + localCRS.m10, localCRS.m11, localCRS.m12, localCRS.m13, + localCRS.m20, localCRS.m21, localCRS.m22, localCRS.m23, + localCRS.m30, localCRS.m31, localCRS.m32, localCRS.m33, + }; + worldLink.Transform = localCRSasFloat; + + if (SaveInfo.instance.linkIds.Contains(worldLink.UUID.ToString()) && (!SaveInfo.instance.elemsToUpdate.Contains(worldLink.UUID.ToString()))) + { + SaveInfo.instance.elemsToUpdate.Add(worldLink.UUID.ToString()); + } + } + + // + //FOOTER + // + GUILayout.FlexibleSpace(); + EditorGUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + //reset button + if (GUILayout.Button("Reset")) + { + //lose focus of fields otherwise the selected field won't updaate + EditorGUI.FocusTextInControl(null); + if (SaveInfo.instance.linkIds.Contains(worldLink.UUID.ToString())) + { + if (SaveInfo.instance.elemsToUpdate.Contains(worldLink.UUID.ToString()) && EditorUtility.DisplayDialog("Reset elements", "Are you sure you want to lose all your changes ?", "Yes", "No")) + { + worldLink = WorldLinkRequest.GetWorldLink(SaveInfo.instance.worldStorageServer, worldLink.UUID.ToString()); + worldLinkEdge.worldLink = worldLink; + ShowWindow(worldLinkEdge); + } + } + else + { + if (EditorUtility.DisplayDialog("Reset elements", "Are you sure you want to lose all your changes ?", "Yes", "No")) + { + + List transform = new List(); + for (int i = 0; i < 15; i++) + { + transform.Add(0); + } + transform.Add(1); + + worldLink.Transform = transform; + worldLink.Unit = UnitSystem.CM; + ShowWindow(worldLinkEdge); + } + } + } + //delete button + if (GUILayout.Button("Delete")) + { + if (EditorUtility.DisplayDialog("Deleting elements", "Are you sure you want to delete this element ?", "Yes", "No")) + { + if (SaveInfo.instance.linkIds.Contains(worldLink.UUID.ToString())) + { + SaveInfo.instance.elemsToRemove.Add(worldLink.UUID.ToString(), typeof(WorldLink)); + } + var window = GetWindow(); + window.DeleteEdge(worldLinkEdge); + ResetWindow(); + } + } + //save button + if (GUILayout.Button("Save")) + { + if (SaveInfo.instance.linkIds.Contains(worldLink.UUID.ToString())) + { + if (SaveInfo.instance.elemsToUpdate.Contains(worldLink.UUID.ToString())) + { + if (EditorUtility.DisplayDialog("Saving element", "Are you sure you want to save this element in the server ?", "Yes", "No")) + { + WorldLinkRequest.UpdateWorldLink(SaveInfo.instance.worldStorageServer, worldLink); + SaveInfo.instance.elemsToUpdate.Remove(worldLink.UUID.ToString()); + } + } + } + else + { + if (EditorUtility.DisplayDialog("Saving element", "Are you sure you want to save this element's informations to the server ?", "Yes", "No")) + { + String uuid = WorldLinkRequest.AddWorldLink(SaveInfo.instance.worldStorageServer, worldLink); + + //Add the newly saved WorldLink to the SaveInfo singleton + uuid = uuid.Replace("\"", ""); + SaveInfo.instance.linkIds.Add(uuid); + } + } + } + GUILayout.Space(10); + EditorGUILayout.EndHorizontal(); + GUILayout.Space(10); + + } + } + + //utilty method to draw lines + public static void DrawUILine(Color color, int thickness = 2, int padding = 10) + { + Rect r = EditorGUILayout.GetControlRect(GUILayout.Height(padding + thickness)); + r.height = thickness; + r.y+=padding/2; + r.x-=2; + r.width +=6; + EditorGUI.DrawRect(r, color); + } + } +} \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/NodeEditorWindow.cs.meta b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/GraphEditorWindow.cs.meta similarity index 100% rename from Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/NodeEditorWindow.cs.meta rename to Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/GraphEditorWindow.cs.meta diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/NodeEditorWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/NodeEditorWindow.cs deleted file mode 100644 index 856a1f2..0000000 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/NodeEditorWindow.cs +++ /dev/null @@ -1,70 +0,0 @@ -using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph; -using ETSI.ARF.WorldStorage; -using ETSI.ARF.WorldStorage.UI; -using Org.OpenAPITools.Model; -using System; -using UnityEditor; -using UnityEngine; - -namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows -{ - public class NodeEditorWindow : EditorWindow - { - public enum GraphEditorType - { - TRACKABLE, - WORLDANCHOR, - WORLDLINK - } - - public GraphEditorType type; - - // UI stuffs - private Vector2 scrollPos; - static public NodeEditorWindow winSingleton; - - public static void ShowWindow(ARFNodeTrackable trackableNode) - { - Type inspectorType = Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll"); - winSingleton = GetWindow("Trackable Editor", true, inspectorType); - winSingleton.type = GraphEditorType.TRACKABLE; - } - - public static void ShowWindow(ARFNodeWorldAnchor worldAnchorNode) - { - Type inspectorType = Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll"); - winSingleton = GetWindow("Anchor Editor", true, inspectorType); - winSingleton.type = GraphEditorType.WORLDANCHOR; - } - - public static void ShowWindow(ARFEdgeLink graphEdge) - { - Type inspectorType = Type.GetType("UnityEditor.InspectorWindow,UnityEditor.dll"); - winSingleton = GetWindow("Link Editor", true, inspectorType); - winSingleton.type = GraphEditorType.WORLDLINK; - } - - public void OnGUI() - { - - scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.ExpandWidth(true)); - - switch (type) - { - case GraphEditorType.WORLDLINK: - GUILayout.Label("link"); - break; - case GraphEditorType.TRACKABLE: - GUILayout.Label("tra"); - break; - case GraphEditorType.WORLDANCHOR: - GUILayout.Label("wa"); - break; - default: - break; - } - - EditorGUILayout.EndScrollView(); - } - } -} \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs index d6ac48b..e89f7db 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs @@ -197,11 +197,6 @@ namespace ETSI.ARF.WorldStorage.UI { WorldStorageWindow.WorldStorageWindowSingleton.GetTrackables(); WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); - } - if (GraphWindow.graphWindowSingleton != null) - { - UUID = UUID.Replace("\"", ""); - GraphWindow.graphWindowSingleton.createTrackableNode(UUID, nodePosX, nodePosY); } Close(); } @@ -220,10 +215,6 @@ namespace ETSI.ARF.WorldStorage.UI { WorldStorageWindow.WorldStorageWindowSingleton.GetTrackables(); WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); - } - if (GraphWindow.graphWindowSingleton != null) - { - GraphWindow.graphWindowSingleton.Reload(); } Close(); } @@ -242,10 +233,6 @@ namespace ETSI.ARF.WorldStorage.UI { WorldStorageWindow.WorldStorageWindowSingleton.GetTrackables(); WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); - } - if (GraphWindow.graphWindowSingleton != null) - { - GraphWindow.graphWindowSingleton.Reload(); } Close(); } diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldAnchorWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldAnchorWindow.cs index 328e950..4e16be7 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldAnchorWindow.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldAnchorWindow.cs @@ -174,11 +174,6 @@ namespace ETSI.ARF.WorldStorage.UI { WorldStorageWindow.WorldStorageWindowSingleton.GetWorldAnchors(); WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); - } - if (GraphWindow.graphWindowSingleton != null) - { - UUID = UUID.Replace("\"", ""); - GraphWindow.graphWindowSingleton.createAnchorNode(UUID, nodePosX, nodePosY); } Close(); } @@ -196,10 +191,6 @@ namespace ETSI.ARF.WorldStorage.UI { WorldStorageWindow.WorldStorageWindowSingleton.GetWorldAnchors(); WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); - } - if (GraphWindow.graphWindowSingleton != null) - { - GraphWindow.graphWindowSingleton.Reload(); } } Close(); @@ -218,10 +209,6 @@ namespace ETSI.ARF.WorldStorage.UI { WorldStorageWindow.WorldStorageWindowSingleton.GetWorldAnchors(); WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); - } - if (GraphWindow.graphWindowSingleton != null) - { - GraphWindow.graphWindowSingleton.Reload(); } Close(); } diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs index f32f961..46c24fa 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs @@ -1,10 +1,32 @@ -using ETSI.ARF.WorldStorage; +// +// ARF - Augmented Reality Framework (ETSI ISG ARF) +// +// Copyright 2022 ETSI +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: July 2022 +// + +using Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Graph; +using ETSI.ARF.WorldStorage; using ETSI.ARF.WorldStorage.REST; using ETSI.ARF.WorldStorage.UI; using Org.OpenAPITools.Model; using System; using System.Collections.Generic; using UnityEditor; +using UnityEditor.Experimental.GraphView; using UnityEditor.UIElements; using UnityEngine; using UnityEngine.UIElements; @@ -35,7 +57,7 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows if (SaveInfo.instance.nodePositions == null) { - SaveInfo.instance.initNodePos(worldStorageServer, worldStorageUser); + SaveInfo.instance.InitNodePos(worldStorageServer, worldStorageUser); } ConstructGraphView(); myGraph.style.top = Length.Percent(11); @@ -53,7 +75,7 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows }; //top offset so that the graph does'nt overlap with the rest of the ui myGraph.style.top = Length.Percent(11); - myGraph.paintWorldStorage(); + myGraph.PaintWorldStorage(); myGraph.StretchToParentSize(); SaveInfo.instance.toReFrame = true; } @@ -63,7 +85,7 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows { if (SaveInfo.instance.nodePositions == null) { - SaveInfo.instance.initNodePos(worldStorageServer, worldStorageUser); + SaveInfo.instance.InitNodePos(worldStorageServer, worldStorageUser); } EditorGUILayout.BeginVertical(); @@ -75,11 +97,12 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows { if (myGraph.ServerAndLocalDifferent() && EditorUtility.DisplayDialog("Saving node positions", "The World Graph has been modified. \nWould you like to push the modifications to the server ?", "Yes", "No")) { - myGraph.saveInServer(); + myGraph.SaveInServer(); } + GraphEditorWindow.ResetWindow(); rootVisualElement.Remove(myGraph); - SaveInfo.instance.initNodePos(worldStorageServer, worldStorageUser); + SaveInfo.instance.InitNodePos(worldStorageServer, worldStorageUser); ConstructGraphView(); myGraph.style.top = Length.Percent(11); rootVisualElement.Add(myGraph); @@ -105,32 +128,23 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows { var toolbar = new Toolbar(); - var createNodeT = new Button(clickEvent: () => + toolbar.Add(new ToolbarSpacer() { - TrackableWindow.ShowWindow(worldStorageServer, worldStorageUser); - TrackableWindow.winSingleton.nodePosX = 0; - TrackableWindow.winSingleton.nodePosY = 0; + flex = true }); - createNodeT.text = "Create Trackable"; - toolbar.Add(createNodeT); - var createNodeWA = new Button(clickEvent: () => + var debug = new Button(clickEvent: () => { - WorldAnchorWindow.ShowWindow(worldStorageServer, worldStorageUser); - WorldAnchorWindow.winSingleton.nodePosX = 0; - WorldAnchorWindow.winSingleton.nodePosY = 0; - }); - createNodeWA.text = "Create World Anchor"; - toolbar.Add(createNodeWA); - - toolbar.Add(new ToolbarSpacer() + SaveInfo.PrintInfo(); + }) { - flex = true - }); + text = "Debug" + }; + toolbar.Add(debug); var save = new Button(clickEvent: () => { - myGraph.saveInServer(); + myGraph.SaveInServer(); }) { text = "Save" @@ -139,6 +153,21 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows return toolbar; } + + public void DeleteNode(ARFNode node) + { + rootVisualElement.Remove(myGraph); + node.DisconnectAllPorts(myGraph); + myGraph.DeleteElements(new List{ node }); + rootVisualElement.Add(myGraph); + } + + public void DeleteEdge(ARFEdgeLink edge) + { + rootVisualElement.Remove(myGraph); + myGraph.DeleteElements(new List { edge }); + rootVisualElement.Add(myGraph); + } } public class SaveInfo : ScriptableSingleton @@ -156,7 +185,7 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows public WorldStorageServer worldStorageServer; public WorldStorageUser worldStorageUser; - public void initNodePos(WorldStorageServer server, WorldStorageUser user) + public void InitNodePos(WorldStorageServer server, WorldStorageUser user) { worldStorageServer = server; worldStorageUser = user; @@ -209,5 +238,12 @@ namespace Assets.ETSI.ARF.ARF_World_Storage_API.Editor.Windows { return a = Mathf.Round(a * 2f) * 0.5f; } + + public static void PrintInfo() + { + Debug.Log("elems to delete : " + string.Join(", ", instance.elemsToRemove.Keys)); + Debug.Log("elems to update : " + string.Join(", ", instance.elemsToUpdate)); + Debug.Log("elems tout court : " + string.Join(", ", instance.nodePositions.Keys)); + } } } \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs.meta b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs.meta index ad87e74..e3ea974 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs.meta +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldGraphWindow.cs.meta @@ -5,7 +5,7 @@ MonoImporter: serializedVersion: 2 defaultReferences: - m_ViewDataDictionary: {instanceID: 0} - - worldStorageServer: {fileID: 11400000, guid: 777684ed8f62c9d408a1813e8382c676, type: 2} + - worldStorageServer: {fileID: 11400000, guid: 3a9ba82f4e8dd124ca2b005861c64d01, type: 2} - worldStorageUser: {fileID: 11400000, guid: c0696089e4a855b46ad490437919b1e8, type: 2} executionOrder: 0 icon: {instanceID: 0} diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldStorageWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldStorageWindow.cs index d983045..1993f0f 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldStorageWindow.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldStorageWindow.cs @@ -119,10 +119,6 @@ namespace ETSI.ARF.WorldStorage.UI #endif GUI.backgroundColor = WorldStorageWindow.arfColors[4]; - if (GUILayout.Button("Open World Representation Graph Window...")) - { - GraphWindow.ShowWindow(); - } GUI.backgroundColor = ori; DrawElementStuffs(); diff --git a/Assets/ETSI.ARF/ARF World Storage API/Images.meta b/Assets/ETSI.ARF/ARF World Storage API/Images.meta new file mode 100644 index 0000000..1186988 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Images.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7d34ace7d2e2513479736d20d0c95ad0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Images/anchor.png b/Assets/ETSI.ARF/ARF World Storage API/Images/anchor.png new file mode 100644 index 0000000000000000000000000000000000000000..bb1804db730faff5a6f0a7523a8729085e8dae34 GIT binary patch literal 21219 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 literal 0 HcmV?d00001 diff --git a/Assets/ETSI.ARF/ARF World Storage API/Images/anchor.png.meta b/Assets/ETSI.ARF/ARF World Storage API/Images/anchor.png.meta new file mode 100644 index 0000000..b8da83a --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Images/anchor.png.meta @@ -0,0 +1,98 @@ +fileFormatVersion: 2 +guid: 000725cae67a4f7448f79fe2a478a50d +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Images/link.png b/Assets/ETSI.ARF/ARF World Storage API/Images/link.png new file mode 100644 index 0000000000000000000000000000000000000000..dda8f37b2a455617c9f692431928b0502e31747c GIT binary patch literal 18903 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 GzV$Cjsy(#; literal 0 HcmV?d00001 diff --git a/Assets/ETSI.ARF/ARF World Storage API/Images/link.png.meta b/Assets/ETSI.ARF/ARF World Storage API/Images/link.png.meta new file mode 100644 index 0000000..70c4fed --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Images/link.png.meta @@ -0,0 +1,98 @@ +fileFormatVersion: 2 +guid: fef18a27fe1e4a040b8cfda6b3b5c178 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Images/trackable.png b/Assets/ETSI.ARF/ARF World Storage API/Images/trackable.png new file mode 100644 index 0000000000000000000000000000000000000000..f31019b2f9ea607e3bfa127348fa17d80296938d GIT binary patch literal 14290 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 literal 0 HcmV?d00001 diff --git a/Assets/ETSI.ARF/ARF World Storage API/Images/trackable.png.meta b/Assets/ETSI.ARF/ARF World Storage API/Images/trackable.png.meta new file mode 100644 index 0000000..fb29933 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Images/trackable.png.meta @@ -0,0 +1,98 @@ +fileFormatVersion: 2 +guid: 90d4635c9d0895c42bec0551c4e790ea +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/UserSettings/Layouts/default-2021.dwlt b/UserSettings/Layouts/default-2021.dwlt index ac8618f..853d3ed 100644 --- a/UserSettings/Layouts/default-2021.dwlt +++ b/UserSettings/Layouts/default-2021.dwlt @@ -14,16 +14,16 @@ MonoBehaviour: m_EditorClassIdentifier: m_PixelRect: serializedVersion: 2 - x: 0 - y: 42 - width: 1600 - height: 818 + x: 6.5 + y: 48.5 + width: 1587 + height: 792.5 m_ShowMode: 4 m_Title: Graph Editor - m_RootView: {fileID: 6} + m_RootView: {fileID: 7} m_MinSize: {x: 875, y: 300} m_MaxSize: {x: 10000, y: 10000} - m_Maximized: 1 + m_Maximized: 0 --- !u!114 &2 MonoBehaviour: m_ObjectHideFlags: 52 @@ -32,24 +32,48 @@ MonoBehaviour: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 0} m_Enabled: 1 - m_EditorHideFlags: 1 + m_EditorHideFlags: 0 m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} m_Name: m_EditorClassIdentifier: m_Children: - - {fileID: 9} - {fileID: 3} m_Position: serializedVersion: 2 x: 0 y: 30 - width: 1600 - height: 768 + width: 1587 + height: 742.5 m_MinSize: {x: 300, y: 200} m_MaxSize: {x: 24288, y: 16192} - vertical: 0 - controlID: 50 + vertical: 1 + controlID: 19 --- !u!114 &3 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 10} + - {fileID: 4} + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 1587 + height: 742.5 + m_MinSize: {x: 300, y: 200} + m_MaxSize: {x: 24288, y: 16192} + vertical: 0 + controlID: 20 +--- !u!114 &4 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -59,24 +83,24 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 1 m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} - m_Name: NodeEditorWindow + m_Name: GraphEditorWindow m_EditorClassIdentifier: m_Children: [] m_Position: serializedVersion: 2 - x: 1186 + x: 1159.5 y: 0 - width: 414 - height: 768 - m_MinSize: {x: 101, y: 121} - m_MaxSize: {x: 4001, y: 4021} - m_ActualView: {fileID: 13} + width: 427.5 + height: 742.5 + m_MinSize: {x: 100, y: 100} + m_MaxSize: {x: 4000, y: 4000} + m_ActualView: {fileID: 14} m_Panes: - - {fileID: 15} - - {fileID: 13} + - {fileID: 16} + - {fileID: 14} m_Selected: 1 - m_LastSelected: 1 ---- !u!114 &4 + m_LastSelected: 0 +--- !u!114 &5 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -93,16 +117,16 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 0 - width: 313 - height: 455 + width: 449 + height: 403 m_MinSize: {x: 200, y: 200} m_MaxSize: {x: 4000, y: 4000} - m_ActualView: {fileID: 16} + m_ActualView: {fileID: 17} m_Panes: - - {fileID: 16} + - {fileID: 17} m_Selected: 0 m_LastSelected: 0 ---- !u!114 &5 +--- !u!114 &6 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -118,18 +142,18 @@ MonoBehaviour: m_Position: serializedVersion: 2 x: 0 - y: 455 - width: 1186 - height: 313 + y: 403 + width: 1159.5 + height: 339.5 m_MinSize: {x: 101, y: 121} m_MaxSize: {x: 4001, y: 4021} - m_ActualView: {fileID: 19} + m_ActualView: {fileID: 20} m_Panes: - - {fileID: 14} - - {fileID: 19} + - {fileID: 15} + - {fileID: 20} m_Selected: 1 m_LastSelected: 0 ---- !u!114 &6 +--- !u!114 &7 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -142,22 +166,22 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Children: - - {fileID: 7} - - {fileID: 2} - {fileID: 8} + - {fileID: 2} + - {fileID: 9} m_Position: serializedVersion: 2 x: 0 y: 0 - width: 1600 - height: 818 + width: 1587 + height: 792.5 m_MinSize: {x: 875, y: 300} m_MaxSize: {x: 10000, y: 10000} m_UseTopView: 1 m_TopViewHeight: 30 m_UseBottomView: 1 m_BottomViewHeight: 20 ---- !u!114 &7 +--- !u!114 &8 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -174,12 +198,12 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 0 - width: 1600 + width: 1587 height: 30 m_MinSize: {x: 0, y: 0} m_MaxSize: {x: 0, y: 0} m_LastLoadedLayoutName: ---- !u!114 &8 +--- !u!114 &9 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -195,12 +219,12 @@ MonoBehaviour: m_Position: serializedVersion: 2 x: 0 - y: 798 - width: 1600 + y: 772.5 + width: 1587 height: 20 m_MinSize: {x: 0, y: 0} m_MaxSize: {x: 0, y: 0} ---- !u!114 &9 +--- !u!114 &10 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -213,19 +237,19 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Children: - - {fileID: 10} - - {fileID: 5} + - {fileID: 11} + - {fileID: 6} m_Position: serializedVersion: 2 x: 0 y: 0 - width: 1186 - height: 768 + width: 1159.5 + height: 742.5 m_MinSize: {x: 200, y: 200} m_MaxSize: {x: 16192, y: 16192} vertical: 1 - controlID: 51 ---- !u!114 &10 + controlID: 35 +--- !u!114 &11 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -238,19 +262,19 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_Children: - - {fileID: 4} - - {fileID: 11} + - {fileID: 5} + - {fileID: 12} m_Position: serializedVersion: 2 x: 0 y: 0 - width: 1186 - height: 455 + width: 1159.5 + height: 403 m_MinSize: {x: 200, y: 100} m_MaxSize: {x: 16192, y: 8096} vertical: 0 - controlID: 52 ---- !u!114 &11 + controlID: 36 +--- !u!114 &12 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -265,20 +289,20 @@ MonoBehaviour: m_Children: [] m_Position: serializedVersion: 2 - x: 313 + x: 449 y: 0 - width: 873 - height: 455 + width: 710.5 + height: 403 m_MinSize: {x: 102, y: 121} m_MaxSize: {x: 4002, y: 4021} - m_ActualView: {fileID: 12} + m_ActualView: {fileID: 13} m_Panes: - - {fileID: 17} - {fileID: 18} - - {fileID: 12} + - {fileID: 19} + - {fileID: 13} m_Selected: 2 m_LastSelected: 1 ---- !u!114 &12 +--- !u!114 &13 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -298,17 +322,17 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: 313 - y: 72 - width: 871 - height: 434 + x: 455.5 + y: 78.5 + width: 708.5 + height: 382 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default m_SaveData: [] - worldStorageServer: {fileID: 11400000, guid: 777684ed8f62c9d408a1813e8382c676, type: 2} + worldStorageServer: {fileID: 11400000, guid: 3a9ba82f4e8dd124ca2b005861c64d01, type: 2} worldStorageUser: {fileID: 11400000, guid: c0696089e4a855b46ad490437919b1e8, type: 2} ---- !u!114 &13 +--- !u!114 &14 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -323,21 +347,24 @@ MonoBehaviour: m_MinSize: {x: 100, y: 100} m_MaxSize: {x: 4000, y: 4000} m_TitleContent: - m_Text: Trackable Editor + m_Text: Element Editor m_Image: {fileID: 0} m_Tooltip: m_Pos: serializedVersion: 2 - x: 1186 - y: 72 - width: 413 - height: 747 + x: 1166 + y: 78.5 + width: 426.5 + height: 721.5 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default m_SaveData: [] - type: 0 ---- !u!114 &14 + type: 3 + local_size: {x: 0, y: 0, z: 0} + local_rot: {x: 0, y: 0, z: 0} + local_pos: {x: 0, y: 0, z: 0} +--- !u!114 &15 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -357,10 +384,10 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: 0 - y: 527 - width: 1185.5 - height: 292 + x: 6.5 + y: 481.5 + width: 1158.5 + height: 318.5 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default @@ -391,9 +418,9 @@ MonoBehaviour: m_IsLocked: 0 m_FolderTreeState: scrollPos: {x: 0, y: 0} - m_SelectedIDs: 644b0000 - m_LastClickedID: 19300 - m_ExpandedIDs: 00000000524b0000544b0000564b0000584b0000 + m_SelectedIDs: 8c4b0000 + m_LastClickedID: 19340 + m_ExpandedIDs: 00000000544b0000564b0000584b00005a4b000000ca9a3bffffff7f m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -409,7 +436,7 @@ MonoBehaviour: m_IsRenaming: 0 m_OriginalEventType: 11 m_IsRenamingFilename: 1 - m_ClientGUIView: {fileID: 0} + m_ClientGUIView: {fileID: 6} m_SearchString: m_CreateAssetUtility: m_EndAction: {fileID: 0} @@ -421,7 +448,7 @@ MonoBehaviour: scrollPos: {x: 0, y: 0} m_SelectedIDs: m_LastClickedID: 0 - m_ExpandedIDs: 00000000524b0000544b0000564b0000584b0000 + m_ExpandedIDs: 00000000544b0000564b0000584b00005a4b0000 m_RenameOverlay: m_UserAcceptedRename: 0 m_Name: @@ -465,7 +492,7 @@ MonoBehaviour: m_IsRenaming: 0 m_OriginalEventType: 11 m_IsRenamingFilename: 1 - m_ClientGUIView: {fileID: 5} + m_ClientGUIView: {fileID: 6} m_CreateAssetUtility: m_EndAction: {fileID: 0} m_InstanceID: 0 @@ -477,7 +504,7 @@ MonoBehaviour: m_GridSize: 64 m_SkipHiddenPackages: 0 m_DirectoriesAreaWidth: 207 ---- !u!114 &15 +--- !u!114 &16 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -497,10 +524,10 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: 1186.5 - y: 72 - width: 412.5 - height: 747 + x: 1166 + y: 78.5 + width: 426.5 + height: 721.5 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default @@ -511,14 +538,14 @@ MonoBehaviour: m_CachedPref: 160 m_ControlHash: -371814159 m_PrefName: Preview_InspectorPreview - m_LastInspectedObjectInstanceID: 19264 + m_LastInspectedObjectInstanceID: 3288 m_LastVerticalScrollValue: 0 m_GlobalObjectId: m_InspectorMode: 0 m_LockTracker: m_IsLocked: 0 m_PreviewWindow: {fileID: 0} ---- !u!114 &16 +--- !u!114 &17 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -538,10 +565,10 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: 0 - y: 72 - width: 312 - height: 434 + x: 6.5 + y: 78.5 + width: 448 + height: 382 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default @@ -549,7 +576,7 @@ MonoBehaviour: m_SceneHierarchy: m_TreeViewState: scrollPos: {x: 0, y: 0} - m_SelectedIDs: 404b0000 + m_SelectedIDs: d80c0000 m_LastClickedID: 0 m_ExpandedIDs: 38fbffff m_RenameOverlay: @@ -575,7 +602,7 @@ MonoBehaviour: m_IsLocked: 0 m_CurrentSortingName: TransformSorting m_WindowGUID: 4c969a2b90040154d917609493e03593 ---- !u!114 &17 +--- !u!114 &18 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -880,7 +907,7 @@ MonoBehaviour: m_SceneVisActive: 1 m_LastLockedObject: {fileID: 0} m_ViewIsLockedToObject: 0 ---- !u!114 &18 +--- !u!114 &19 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -900,10 +927,10 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: 313 - y: 72 - width: 871 - height: 434 + x: 455.5 + y: 78.5 + width: 708.5 + height: 382 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default @@ -914,7 +941,7 @@ MonoBehaviour: m_ShowGizmos: 0 m_TargetDisplay: 0 m_ClearColor: {r: 0, g: 0, b: 0, a: 0} - m_TargetSize: {x: 871, y: 413} + m_TargetSize: {x: 708.5, y: 361} m_TextureFilterMode: 0 m_TextureHideFlags: 61 m_RenderIMGUI: 1 @@ -929,10 +956,10 @@ MonoBehaviour: m_VRangeLocked: 0 hZoomLockedByDefault: 0 vZoomLockedByDefault: 0 - m_HBaseRangeMin: -217.75 - m_HBaseRangeMax: 217.75 - m_VBaseRangeMin: -103.25 - m_VBaseRangeMax: 103.25 + m_HBaseRangeMin: -177.125 + m_HBaseRangeMax: 177.125 + m_VBaseRangeMin: -90.25 + m_VBaseRangeMax: 90.25 m_HAllowExceedBaseRangeMin: 1 m_HAllowExceedBaseRangeMax: 1 m_VAllowExceedBaseRangeMin: 1 @@ -950,29 +977,29 @@ MonoBehaviour: serializedVersion: 2 x: 0 y: 21 - width: 871 - height: 413 + width: 708.5 + height: 361 m_Scale: {x: 2, y: 2} - m_Translation: {x: 435.5, y: 206.5} + m_Translation: {x: 354.25, y: 180.5} m_MarginLeft: 0 m_MarginRight: 0 m_MarginTop: 0 m_MarginBottom: 0 m_LastShownAreaInsideMargins: serializedVersion: 2 - x: -217.75 - y: -103.25 - width: 435.5 - height: 206.5 + x: -177.125 + y: -90.25 + width: 354.25 + height: 180.5 m_MinimalGUI: 1 m_defaultScale: 2 - m_LastWindowPixelSize: {x: 1742, y: 868} + m_LastWindowPixelSize: {x: 1417, y: 764} m_ClearInEditMode: 1 m_NoCameraWarning: 1 m_LowResolutionForAspectRatios: 01000000000000000000 m_XRRenderMode: 0 m_RenderTexture: {fileID: 0} ---- !u!114 &19 +--- !u!114 &20 MonoBehaviour: m_ObjectHideFlags: 52 m_CorrespondingSourceObject: {fileID: 0} @@ -992,10 +1019,10 @@ MonoBehaviour: m_Tooltip: m_Pos: serializedVersion: 2 - x: 0 - y: 527 - width: 1185 - height: 292 + x: 6.5 + y: 481.5 + width: 1158.5 + height: 318.5 m_ViewDataDictionary: {fileID: 0} m_OverlayCanvas: m_LastAppliedPresetName: Default -- GitLab From 96573066042e4fada91b809f4f1490f572952979 Mon Sep 17 00:00:00 2001 From: Sylvain Renault Date: Wed, 27 Jul 2022 16:52:20 +0200 Subject: [PATCH 05/18] Lot of new functions :-) Group concept as KeyValue. Visual for trackables, anchors and link via prefabs. Edit link now run well (TODO: drag/select elements?). Code optimization in WorldLink. TMP Pro for UI. --- .../Editor/Windows/TrackableWindow.cs | 43 +- .../Editor/Windows/WorldAnchorWindow.cs | 41 +- .../Editor/Windows/WorldLinkWindow.cs | 262 +- .../Editor/Windows/WorldStorageWindow.cs | 95 +- .../Editor/WorldStoragePrefabs.cs | 36 + .../Editor/WorldStoragePrefabs.cs.meta | 11 + .../ARF World Storage API/Materials.meta | 8 + .../ARF World Storage API/Materials/blue.mat | 80 + .../Materials/blue.mat.meta | 8 + .../ARF World Storage API/Materials/green.mat | 80 + .../Materials/green.mat.meta | 8 + .../ARF World Storage API/Materials/grey.mat | 80 + .../Materials/grey.mat.meta | 8 + .../ARF World Storage API/Materials/red.mat | 80 + .../Materials/red.mat.meta | 8 + .../Prefabs/ARFTrackable.prefab | 835 ++ .../Prefabs/ARFTrackable.prefab.meta | 7 + .../Prefabs/ARFWorldAnchor.prefab | 835 ++ .../Prefabs/ARFWorldAnchor.prefab.meta | 7 + .../Prefabs/ARFWorldLink.prefab | 540 ++ .../Prefabs/ARFWorldLink.prefab.meta | 7 + .../ARF World Storage API/Resources.meta | 8 + .../Resources/ARFPrefabs.asset | 17 + .../Resources/ARFPrefabs.asset.meta | 8 + .../Scenes/WorldStorageSample.unity | 3872 +++++++- .../World Storage/NAME.asset | 17 + .../World Storage/NAME.asset.meta | 8 + .../World Storage/TEST.asset | 19 + .../World Storage/TEST.asset.meta | 8 + Assets/TextMesh Pro.meta | 8 + Assets/TextMesh Pro/Documentation.meta | 8 + .../TextMesh Pro User Guide 2016.pdf | Bin 0 -> 694398 bytes .../TextMesh Pro User Guide 2016.pdf.meta | 7 + Assets/TextMesh Pro/Fonts.meta | 8 + .../Fonts/LiberationSans - OFL.txt | 46 + .../Fonts/LiberationSans - OFL.txt.meta | 8 + Assets/TextMesh Pro/Fonts/LiberationSans.ttf | Bin 0 -> 350200 bytes .../Fonts/LiberationSans.ttf.meta | 19 + Assets/TextMesh Pro/Resources.meta | 8 + .../Resources/Fonts & Materials.meta | 9 + .../LiberationSans SDF - Drop Shadow.mat | 106 + .../LiberationSans SDF - Drop Shadow.mat.meta | 8 + .../LiberationSans SDF - Fallback.asset | 343 + .../LiberationSans SDF - Fallback.asset.meta | 8 + .../LiberationSans SDF - Outline.mat | 104 + .../LiberationSans SDF - Outline.mat.meta | 8 + .../LiberationSans SDF.asset | 7821 +++++++++++++++++ .../LiberationSans SDF.asset.meta | 8 + .../LineBreaking Following Characters.txt | 1 + ...LineBreaking Following Characters.txt.meta | 8 + .../LineBreaking Leading Characters.txt | 1 + .../LineBreaking Leading Characters.txt.meta | 8 + .../TextMesh Pro/Resources/Sprite Assets.meta | 9 + .../Resources/Sprite Assets/EmojiOne.asset | 659 ++ .../Sprite Assets/EmojiOne.asset.meta | 8 + .../TextMesh Pro/Resources/Style Sheets.meta | 9 + .../Style Sheets/Default Style Sheet.asset | 68 + .../Default Style Sheet.asset.meta | 8 + .../TextMesh Pro/Resources/TMP Settings.asset | 46 + .../Resources/TMP Settings.asset.meta | 8 + Assets/TextMesh Pro/Shaders.meta | 8 + .../Shaders/TMP_Bitmap-Custom-Atlas.shader | 143 + .../TMP_Bitmap-Custom-Atlas.shader.meta | 9 + .../Shaders/TMP_Bitmap-Mobile.shader | 145 + .../Shaders/TMP_Bitmap-Mobile.shader.meta | 9 + Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader | 143 + .../Shaders/TMP_Bitmap.shader.meta | 9 + .../Shaders/TMP_SDF Overlay.shader | 317 + .../Shaders/TMP_SDF Overlay.shader.meta | 9 + .../TextMesh Pro/Shaders/TMP_SDF SSD.shader | 310 + .../Shaders/TMP_SDF SSD.shader.meta | 9 + .../Shaders/TMP_SDF-Mobile Masking.shader | 247 + .../TMP_SDF-Mobile Masking.shader.meta | 9 + .../Shaders/TMP_SDF-Mobile Overlay.shader | 240 + .../TMP_SDF-Mobile Overlay.shader.meta | 9 + .../Shaders/TMP_SDF-Mobile SSD.shader | 106 + .../Shaders/TMP_SDF-Mobile SSD.shader.meta | 9 + .../Shaders/TMP_SDF-Mobile.shader | 240 + .../Shaders/TMP_SDF-Mobile.shader.meta | 9 + .../Shaders/TMP_SDF-Surface-Mobile.shader | 138 + .../TMP_SDF-Surface-Mobile.shader.meta | 9 + .../Shaders/TMP_SDF-Surface.shader | 158 + .../Shaders/TMP_SDF-Surface.shader.meta | 9 + Assets/TextMesh Pro/Shaders/TMP_SDF.shader | 317 + .../TextMesh Pro/Shaders/TMP_SDF.shader.meta | 9 + Assets/TextMesh Pro/Shaders/TMP_Sprite.shader | 116 + .../Shaders/TMP_Sprite.shader.meta | 9 + Assets/TextMesh Pro/Shaders/TMPro.cginc | 84 + Assets/TextMesh Pro/Shaders/TMPro.cginc.meta | 9 + .../TextMesh Pro/Shaders/TMPro_Mobile.cginc | 157 + .../Shaders/TMPro_Mobile.cginc.meta | 9 + .../Shaders/TMPro_Properties.cginc | 85 + .../Shaders/TMPro_Properties.cginc.meta | 9 + .../TextMesh Pro/Shaders/TMPro_Surface.cginc | 101 + .../Shaders/TMPro_Surface.cginc.meta | 9 + Assets/TextMesh Pro/Sprites.meta | 8 + .../Sprites/EmojiOne Attribution.txt | 3 + .../Sprites/EmojiOne Attribution.txt.meta | 7 + Assets/TextMesh Pro/Sprites/EmojiOne.json | 156 + .../TextMesh Pro/Sprites/EmojiOne.json.meta | 8 + Assets/TextMesh Pro/Sprites/EmojiOne.png | Bin 0 -> 112319 bytes Assets/TextMesh Pro/Sprites/EmojiOne.png.meta | 431 + UserSettings/Layouts/default-2021.dwlt | 90 +- UserSettings/Search.settings | 1 + 104 files changed, 19926 insertions(+), 382 deletions(-) create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/WorldStoragePrefabs.cs create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Editor/WorldStoragePrefabs.cs.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Materials.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Materials/blue.mat create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Materials/blue.mat.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Materials/green.mat create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Materials/green.mat.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Materials/grey.mat create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Materials/grey.mat.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Materials/red.mat create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Materials/red.mat.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFTrackable.prefab create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFTrackable.prefab.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFWorldAnchor.prefab create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFWorldAnchor.prefab.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFWorldLink.prefab create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFWorldLink.prefab.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Resources.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Resources/ARFPrefabs.asset create mode 100644 Assets/ETSI.ARF/ARF World Storage API/Resources/ARFPrefabs.asset.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/World Storage/NAME.asset create mode 100644 Assets/ETSI.ARF/ARF World Storage API/World Storage/NAME.asset.meta create mode 100644 Assets/ETSI.ARF/ARF World Storage API/World Storage/TEST.asset create mode 100644 Assets/ETSI.ARF/ARF World Storage API/World Storage/TEST.asset.meta create mode 100644 Assets/TextMesh Pro.meta create mode 100644 Assets/TextMesh Pro/Documentation.meta create mode 100644 Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf create mode 100644 Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf.meta create mode 100644 Assets/TextMesh Pro/Fonts.meta create mode 100644 Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt create mode 100644 Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt.meta create mode 100644 Assets/TextMesh Pro/Fonts/LiberationSans.ttf create mode 100644 Assets/TextMesh Pro/Fonts/LiberationSans.ttf.meta create mode 100644 Assets/TextMesh Pro/Resources.meta create mode 100644 Assets/TextMesh Pro/Resources/Fonts & Materials.meta create mode 100644 Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat create mode 100644 Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat.meta create mode 100644 Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset create mode 100644 Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset.meta create mode 100644 Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat create mode 100644 Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat.meta create mode 100644 Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset create mode 100644 Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset.meta create mode 100644 Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt create mode 100644 Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt.meta create mode 100644 Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt create mode 100644 Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt.meta create mode 100644 Assets/TextMesh Pro/Resources/Sprite Assets.meta create mode 100644 Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset create mode 100644 Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset.meta create mode 100644 Assets/TextMesh Pro/Resources/Style Sheets.meta create mode 100644 Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset create mode 100644 Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset.meta create mode 100644 Assets/TextMesh Pro/Resources/TMP Settings.asset create mode 100644 Assets/TextMesh Pro/Resources/TMP Settings.asset.meta create mode 100644 Assets/TextMesh Pro/Shaders.meta create mode 100644 Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader create mode 100644 Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader.meta create mode 100644 Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader create mode 100644 Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader.meta create mode 100644 Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader create mode 100644 Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader.meta create mode 100644 Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader create mode 100644 Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader.meta create mode 100644 Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader create mode 100644 Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader.meta create mode 100644 Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader create mode 100644 Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader.meta create mode 100644 Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader create mode 100644 Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader.meta create mode 100644 Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader create mode 100644 Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader.meta create mode 100644 Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader create mode 100644 Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader.meta create mode 100644 Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader create mode 100644 Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader.meta create mode 100644 Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader create mode 100644 Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader.meta create mode 100644 Assets/TextMesh Pro/Shaders/TMP_SDF.shader create mode 100644 Assets/TextMesh Pro/Shaders/TMP_SDF.shader.meta create mode 100644 Assets/TextMesh Pro/Shaders/TMP_Sprite.shader create mode 100644 Assets/TextMesh Pro/Shaders/TMP_Sprite.shader.meta create mode 100644 Assets/TextMesh Pro/Shaders/TMPro.cginc create mode 100644 Assets/TextMesh Pro/Shaders/TMPro.cginc.meta create mode 100644 Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc create mode 100644 Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc.meta create mode 100644 Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc create mode 100644 Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc.meta create mode 100644 Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc create mode 100644 Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc.meta create mode 100644 Assets/TextMesh Pro/Sprites.meta create mode 100644 Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt create mode 100644 Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta create mode 100644 Assets/TextMesh Pro/Sprites/EmojiOne.json create mode 100644 Assets/TextMesh Pro/Sprites/EmojiOne.json.meta create mode 100644 Assets/TextMesh Pro/Sprites/EmojiOne.png create mode 100644 Assets/TextMesh Pro/Sprites/EmojiOne.png.meta create mode 100644 UserSettings/Search.settings diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs index 3a361a8..3827d41 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/TrackableWindow.cs @@ -15,7 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. // -// Last change: June 2022 +// Last change: July 2022 // #define USING_OPENAPI_GENERATOR // alt. is Swagger @@ -25,6 +25,7 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; +using TMPro; using ETSI.ARF.WorldStorage.REST; #if USING_OPENAPI_GENERATOR @@ -59,6 +60,7 @@ namespace ETSI.ARF.WorldStorage.UI Vector3 localCRS_pos; Vector3 localCRS_rot; byte[] trackablePayload = new byte[1] { 0 }; + [SerializeField] Dictionary> keyValueTags = new Dictionary>(); string key1 = ""; string value1 = ""; @@ -70,7 +72,7 @@ namespace ETSI.ARF.WorldStorage.UI public static void ShowWindow(WorldStorageServer ws, WorldStorageUser user, string UUID = "") { - winSingleton = EditorWindow.GetWindow(typeof(TrackableWindow), false, WorldStorageWindow.winName) as TrackableWindow; + winSingleton = EditorWindow.GetWindow(typeof(TrackableWindow), false, "ETSI ARF - Trackable") as TrackableWindow; winSingleton.worldStorageServer = ws; winSingleton.worldStorageUser = user; if (!string.IsNullOrEmpty(UUID)) @@ -80,6 +82,27 @@ namespace ETSI.ARF.WorldStorage.UI } } + public static GameObject GenerateAndUpdateVisual(string UUID, string name, Vector3 pos, Vector3 rot) + { + ETSI.ARF.WorldStorage.UI.Prefabs.WorldStoragePrefabs prefabs; + prefabs = (Prefabs.WorldStoragePrefabs)Resources.Load("ARFPrefabs"); + GameObject arf = GameObject.Find("ARF Visuals"); + GameObject visual = GameObject.Find(UUID); + + if (arf == null) arf = new GameObject("ARF Visuals"); + if (visual == null) + { + visual = SceneAsset.Instantiate(prefabs.trackablePrefab, pos, Quaternion.Euler(rot), arf.transform); // TODO rot + visual.name = UUID; + } + else + { + visual.transform.SetPositionAndRotation(pos, Quaternion.Euler(rot)); + } + visual.transform.Find("Canvas/Text").GetComponent().text = $"Name: { name }\nUUID: { UUID }"; + return visual; + } + public TrackableWindow() { // init somne stuffs @@ -115,7 +138,7 @@ namespace ETSI.ARF.WorldStorage.UI EditorGUILayout.Space(); //GUILayout.BeginHorizontal(); - customName = EditorGUILayout.TextField("Name of Trackable", customName); + customName = EditorGUILayout.TextField("Name of Trackable:", customName); #if isDEBUG GUILayout.Label("UUID: " + UUID, EditorStyles.miniLabel); // readonly GUILayout.Label("Creator UID: " + creatorUUID, EditorStyles.miniLabel); // readonly @@ -171,6 +194,7 @@ namespace ETSI.ARF.WorldStorage.UI if (string.IsNullOrEmpty(UUID) || UUID == "0") UUID = System.Guid.Empty.ToString(); Trackable obj = GenerateTrackable(); UUID = TrackableRequest.AddTrackable(worldStorageServer, obj); + UUID = UUID.Trim('"'); //Bugfix: remove " from server return value WorldStorageWindow.WorldStorageWindowSingleton.GetTrackables(); WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); } @@ -184,6 +208,7 @@ namespace ETSI.ARF.WorldStorage.UI { Trackable obj = GenerateTrackable(); UUID = TrackableRequest.UpdateTrackable(worldStorageServer, obj); + UUID = UUID.Trim('"'); //Bugfix: remove " from server return value } WorldStorageWindow.WorldStorageWindowSingleton.GetTrackables(); WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); @@ -206,8 +231,9 @@ namespace ETSI.ARF.WorldStorage.UI // ########################################################### GUI.backgroundColor = WorldStorageWindow.arfColors[5]; - if (GUILayout.Button("Generate GameObject Component")) + if (GUILayout.Button("Generate/Update GameObject Visual")) { + GenerateAndUpdateVisual(UUID, customName, localCRS_pos, localCRS_rot); } GUI.backgroundColor = ori; } @@ -224,13 +250,10 @@ namespace ETSI.ARF.WorldStorage.UI trackableSize = new Vector3((float)obj.TrackableSize[0], (float)obj.TrackableSize[1], (float)obj.TrackableSize[2]); } else trackableSize = Vector3.zero; + if (obj.LocalCRS.Count == 16) { - Matrix4x4 localCRS = new Matrix4x4(); - localCRS.m00 = obj.LocalCRS[0]; localCRS.m01 = obj.LocalCRS[1]; localCRS.m02 = obj.LocalCRS[2]; localCRS.m03 = obj.LocalCRS[3]; - localCRS.m10 = obj.LocalCRS[4]; localCRS.m11 = obj.LocalCRS[5]; localCRS.m12 = obj.LocalCRS[6]; localCRS.m13 = obj.LocalCRS[7]; - localCRS.m20 = obj.LocalCRS[8]; localCRS.m21 = obj.LocalCRS[9]; localCRS.m22 = obj.LocalCRS[10]; localCRS.m23 = obj.LocalCRS[11]; - localCRS.m30 = obj.LocalCRS[12]; localCRS.m31 = obj.LocalCRS[13]; localCRS.m32 = obj.LocalCRS[14]; localCRS.m33 = obj.LocalCRS[15]; + Matrix4x4 localCRS = WorldStorageWindow.MatrixFromLocalCRS(obj.LocalCRS); localCRS_pos = localCRS.GetPosition(); localCRS_rot = localCRS.rotation.eulerAngles; } @@ -245,7 +268,7 @@ namespace ETSI.ARF.WorldStorage.UI key1 = first.Item1; value1 = first.Item2; - this.Repaint(); // TODO + this.Repaint(); } public Trackable GenerateTrackable() diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldAnchorWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldAnchorWindow.cs index 5eddea4..0166ffa 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldAnchorWindow.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldAnchorWindow.cs @@ -25,6 +25,7 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; +using TMPro; using ETSI.ARF.WorldStorage.REST; #if USING_OPENAPI_GENERATOR @@ -56,6 +57,7 @@ namespace ETSI.ARF.WorldStorage.UI Vector3 worldAnchorSize; Vector3 localCRS_pos; Vector3 localCRS_rot; + [SerializeField] Dictionary> keyValueTags = new Dictionary>(); string key1 = ""; string value1 = ""; @@ -67,7 +69,7 @@ namespace ETSI.ARF.WorldStorage.UI public static void ShowWindow(WorldStorageServer ws, WorldStorageUser user, string UUID = "") { - winSingleton = EditorWindow.GetWindow(typeof(WorldAnchorWindow), false, WorldStorageWindow.winName) as WorldAnchorWindow; + winSingleton = EditorWindow.GetWindow(typeof(WorldAnchorWindow), false, "ETSI ARF - World Anchor") as WorldAnchorWindow; winSingleton.worldStorageServer = ws; winSingleton.worldStorageUser = user; if (!string.IsNullOrEmpty(UUID)) @@ -77,6 +79,27 @@ namespace ETSI.ARF.WorldStorage.UI } } + public static GameObject GenerateAndUpdateVisual(string UUID, string name, Vector3 pos, Vector3 rot) + { + ETSI.ARF.WorldStorage.UI.Prefabs.WorldStoragePrefabs prefabs; + prefabs = (Prefabs.WorldStoragePrefabs)Resources.Load("ARFPrefabs"); + GameObject arf = GameObject.Find("ARF Visuals"); + GameObject visual = GameObject.Find(UUID); + + if (arf == null) arf = new GameObject("ARF Visuals"); + if (visual == null) + { + visual = SceneAsset.Instantiate(prefabs.worldAnchorPrefab, pos, Quaternion.Euler(rot), arf.transform); // TODO rot + visual.name = UUID; + } + else + { + visual.transform.SetPositionAndRotation(pos, Quaternion.Euler(rot)); + } + visual.transform.Find("Canvas/Text").GetComponent().text = $"Name: { name }\nUUID: { UUID }"; + return visual; + } + public WorldAnchorWindow() { // init somne stuffs @@ -112,7 +135,7 @@ namespace ETSI.ARF.WorldStorage.UI EditorGUILayout.Space(); //GUILayout.BeginHorizontal(); - customName = EditorGUILayout.TextField("Name of Anchor", customName); + customName = EditorGUILayout.TextField("Name of Anchor:", customName); #if isDEBUG GUILayout.Label("UUID: " + UUID, EditorStyles.miniLabel); // readonly GUILayout.Label("Creator UID: " + creatorUUID, EditorStyles.miniLabel); // readonly @@ -156,6 +179,7 @@ namespace ETSI.ARF.WorldStorage.UI if (string.IsNullOrEmpty(UUID) || UUID == "0") UUID = System.Guid.Empty.ToString(); WorldAnchor obj = GenerateWorldAnchor(); UUID = WorldAnchorRequest.AddWorldAnchor(worldStorageServer, obj); + UUID = UUID.Trim('"'); //Bugfix: remove " from server return value WorldStorageWindow.WorldStorageWindowSingleton.GetWorldAnchors(); WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); } @@ -169,6 +193,7 @@ namespace ETSI.ARF.WorldStorage.UI { WorldAnchor obj = GenerateWorldAnchor(); UUID = WorldAnchorRequest.UpdateWorldAnchor(worldStorageServer, obj); + UUID = UUID.Trim('"'); //Bugfix: remove " from server return value WorldStorageWindow.WorldStorageWindowSingleton.GetWorldAnchors(); WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); } @@ -190,8 +215,9 @@ namespace ETSI.ARF.WorldStorage.UI // ########################################################### GUI.backgroundColor = WorldStorageWindow.arfColors[5]; - if (GUILayout.Button("Generate GameObject Component")) + if (GUILayout.Button("Generate/Update GameObject Visual")) { + GenerateAndUpdateVisual(UUID, customName, localCRS_pos, localCRS_rot); } GUI.backgroundColor = ori; } @@ -207,13 +233,10 @@ namespace ETSI.ARF.WorldStorage.UI worldAnchorSize = new Vector3((float)obj.WorldAnchorSize[0], (float)obj.WorldAnchorSize[1], (float)obj.WorldAnchorSize[2]); } else worldAnchorSize = Vector3.zero; + if (obj.LocalCRS.Count == 16) { - Matrix4x4 localCRS = new Matrix4x4(); - localCRS.m00 = obj.LocalCRS[0]; localCRS.m01 = obj.LocalCRS[1]; localCRS.m02 = obj.LocalCRS[2]; localCRS.m03 = obj.LocalCRS[3]; - localCRS.m10 = obj.LocalCRS[4]; localCRS.m11 = obj.LocalCRS[5]; localCRS.m12 = obj.LocalCRS[6]; localCRS.m13 = obj.LocalCRS[7]; - localCRS.m20 = obj.LocalCRS[8]; localCRS.m21 = obj.LocalCRS[9]; localCRS.m22 = obj.LocalCRS[10]; localCRS.m23 = obj.LocalCRS[11]; - localCRS.m30 = obj.LocalCRS[12]; localCRS.m31 = obj.LocalCRS[13]; localCRS.m32 = obj.LocalCRS[14]; localCRS.m33 = obj.LocalCRS[15]; + Matrix4x4 localCRS = WorldStorageWindow.MatrixFromLocalCRS(obj.LocalCRS); localCRS_pos = localCRS.GetPosition(); localCRS_rot = localCRS.rotation.eulerAngles; } @@ -228,7 +251,7 @@ namespace ETSI.ARF.WorldStorage.UI key1 = first.Item1; value1 = first.Item2; - this.Repaint(); // TODO + this.Repaint(); } public WorldAnchor GenerateWorldAnchor() diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldLinkWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldLinkWindow.cs index 05971e7..b135cc7 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldLinkWindow.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldLinkWindow.cs @@ -25,6 +25,7 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; +using TMPro; using ETSI.ARF.WorldStorage.REST; #if USING_OPENAPI_GENERATOR @@ -39,6 +40,14 @@ namespace ETSI.ARF.WorldStorage.UI { public class WorldLinkWindow : EditorWindow { + private class Element + { + public string UUID = System.Guid.Empty.ToString(); + public string name = "(none)"; + public ObjectType type = ObjectType.NotIdentified; + public Vector3 pos = Vector3.zero; + } + static public WorldLinkWindow winSingleton; [HideInInspector] public WorldStorageServer worldStorageServer; @@ -53,20 +62,20 @@ namespace ETSI.ARF.WorldStorage.UI string UUID = System.Guid.Empty.ToString(); string customName = "(no name for World Links)"; string creatorUUID = System.Guid.Empty.ToString(); - // From... + + // From & To elements: private bool showListFrom = true; - string fromName = "(none)"; - string fromUUID = System.Guid.Empty.ToString(); - // To... private bool showListTo = true; - string toName = "(none)"; - string toUUID = System.Guid.Empty.ToString(); + private Element FROM = new Element(); + private Element TO = new Element(); UnitSystem unit = UnitSystem.CM; - ObjectType fromType = ObjectType.NotIdentified, toType = ObjectType.NotIdentified; - Vector3 localCRS_pos; - Vector3 localCRS_rot; + Vector3 transf_pos; + Vector3 transf_rot; + [SerializeField] Dictionary> keyValueTags = new Dictionary>(); + string key1 = ""; + string value1 = ""; // UI stuffs private Vector2 scrollPos; @@ -75,7 +84,7 @@ namespace ETSI.ARF.WorldStorage.UI public static void ShowWindow(WorldStorageServer ws, WorldStorageUser user, string UUID = "") { - winSingleton = EditorWindow.GetWindow(typeof(WorldLinkWindow), false, WorldStorageWindow.winName) as WorldLinkWindow; + winSingleton = EditorWindow.GetWindow(typeof(WorldLinkWindow), false, "ETSI ARF - World Link") as WorldLinkWindow; winSingleton.worldStorageServer = ws; winSingleton.worldStorageUser = user; if (!string.IsNullOrEmpty(UUID)) @@ -85,6 +94,27 @@ namespace ETSI.ARF.WorldStorage.UI } } + public static GameObject GenerateAndUpdateVisual(string UUID, string from, string to, Vector3 pos, Vector3 rot) + { + ETSI.ARF.WorldStorage.UI.Prefabs.WorldStoragePrefabs prefabs; + prefabs = (Prefabs.WorldStoragePrefabs)Resources.Load("ARFPrefabs"); + GameObject arf = GameObject.Find("ARF Visuals"); + GameObject visual = GameObject.Find(UUID); + + if (arf == null) arf = new GameObject("ARF Visuals"); + if (visual == null) + { + visual = SceneAsset.Instantiate(prefabs.worldLinkPrefab, pos, Quaternion.Euler(rot), arf.transform); // TODO rot + visual.name = UUID; + } + else + { + visual.transform.SetPositionAndRotation(pos, Quaternion.Euler(rot)); + } + visual.transform.Find("Canvas/Text").GetComponent().text = $"UUID: { UUID }\nFrom: { from }\nTo: { to }"; + return visual; + } + public WorldLinkWindow() { // init somne stuffs @@ -111,6 +141,73 @@ namespace ETSI.ARF.WorldStorage.UI } } + private void GetElementFROM() + { + // Trackable? + try + { + Trackable result = TrackableRequest.GetTrackable(worldStorageServer, FROM.UUID); + FROM.name = result.Name; + FROM.type = ObjectType.Trackable; + + Matrix4x4 localCRS = WorldStorageWindow.MatrixFromLocalCRS(result.LocalCRS); + FROM.pos = localCRS.GetPosition(); + } + catch + { + // Anchor? + try + { + WorldAnchor result = WorldAnchorRequest.GetWorldAnchor(worldStorageServer, FROM.UUID); + FROM.name = result.Name; + FROM.type = ObjectType.WorldAnchor; + + Matrix4x4 localCRS = WorldStorageWindow.MatrixFromLocalCRS(result.LocalCRS); + FROM.pos = localCRS.GetPosition(); + } + catch + { + // Nothing! + FROM.name = ""; + FROM.type = ObjectType.NotIdentified; + } + } + } + + private void GetElementTO() + { + // Trackable? + try + { + Trackable result = TrackableRequest.GetTrackable(worldStorageServer, TO.UUID); + TO.name = result.Name; + TO.type = ObjectType.Trackable; + + Matrix4x4 localCRS = WorldStorageWindow.MatrixFromLocalCRS(result.LocalCRS); + TO.pos = localCRS.GetPosition(); + } + catch + { + // Anchor? + try + { + WorldAnchor result = WorldAnchorRequest.GetWorldAnchor(worldStorageServer, TO.UUID); + TO.name = result.Name; + TO.type = ObjectType.WorldAnchor; + + Matrix4x4 localCRS = WorldStorageWindow.MatrixFromLocalCRS(result.LocalCRS); + TO.pos = localCRS.GetPosition(); + } + catch + { + // Nothing! + TO.UUID = System.Guid.Empty.ToString(); + TO.name = ""; + TO.type = ObjectType.NotIdentified; + } + } + } + void DrawAnchorStuffs() { GUILayout.BeginVertical("World Link Editor", gsTest); @@ -133,41 +230,17 @@ namespace ETSI.ARF.WorldStorage.UI if (showListFrom) { EditorGUILayout.BeginHorizontal(); - string lastFromUUID = fromUUID; - fromUUID = EditorGUILayout.TextField("Enter a valid UUID:", fromUUID); + string lastFromUUID = FROM.UUID; + FROM.UUID = EditorGUILayout.TextField("UUID:", FROM.UUID); GUI.backgroundColor = WorldStorageWindow.arfColors[1]; - if (GUILayout.Button("Request", EditorStyles.miniButtonLeft, miniButtonWidth) || lastFromUUID != fromUUID) + if (GUILayout.Button("Request", EditorStyles.miniButtonLeft, miniButtonWidth) || lastFromUUID != FROM.UUID) { - bool found = false; - try - { - Trackable result = TrackableRequest.GetTrackable(worldStorageServer, fromUUID); - fromName = result.Name; - fromType = ObjectType.Trackable; - found = true; - } - catch { /* Object was not found */ } - - if (!found) - try - { - WorldAnchor result = WorldAnchorRequest.GetWorldAnchor(worldStorageServer, fromUUID); - fromName = result.Name; - fromType = ObjectType.WorldAnchor; - found = true; - } - catch { /* Object was not found */ } - - if (!found) - { - fromName = ""; - fromType = ObjectType.NotIdentified; - } + GetElementFROM(); } EditorGUILayout.EndHorizontal(); GUI.backgroundColor = ori; - fromName = EditorGUILayout.TextField("Name", fromName); - fromType = (ObjectType)EditorGUILayout.EnumPopup("Type:", fromType); + FROM.name = EditorGUILayout.TextField("Name:", FROM.name); + FROM.type = (ObjectType)EditorGUILayout.EnumPopup("Type:", FROM.type); } EditorGUILayout.Space(); @@ -175,61 +248,32 @@ namespace ETSI.ARF.WorldStorage.UI if (showListTo) { EditorGUILayout.BeginHorizontal(); - string lastToUUID = fromUUID; - toUUID = EditorGUILayout.TextField("Eenter a valid UUID:", toUUID); + string lastToUUID = TO.UUID; + TO.UUID = EditorGUILayout.TextField("UUID:", TO.UUID); GUI.backgroundColor = WorldStorageWindow.arfColors[1]; - if (GUILayout.Button("Request", EditorStyles.miniButtonLeft, miniButtonWidth) || lastToUUID != toUUID) + if (GUILayout.Button("Request", EditorStyles.miniButtonLeft, miniButtonWidth) || lastToUUID != TO.UUID) { - bool found = false; - try - { - Trackable result = TrackableRequest.GetTrackable(worldStorageServer, toUUID); - toName = result.Name; - toType = ObjectType.Trackable; - found = true; - } - catch { /* Object was not found */ } - - if (!found) - try - { - WorldAnchor result = WorldAnchorRequest.GetWorldAnchor(worldStorageServer, toUUID); - toName = result.Name; - toType = ObjectType.WorldAnchor; - found = true; - } - catch { /* Object was not found */ } - - if (!found) - { - toName = ""; - toType = ObjectType.NotIdentified; - } + GetElementTO(); } EditorGUILayout.EndHorizontal(); GUI.backgroundColor = ori; - toName = EditorGUILayout.TextField("Name", toName); - toType = (ObjectType)EditorGUILayout.EnumPopup("Type:", toType); + TO.name = EditorGUILayout.TextField("Name:", TO.name); + TO.type = (ObjectType)EditorGUILayout.EnumPopup("Type:", TO.type); } EditorGUILayout.Space(10); unit = (UnitSystem)EditorGUILayout.EnumPopup("Unit System:", unit); - GUILayout.Label("Local CRS:"); - localCRS_pos = EditorGUILayout.Vector3Field("Position:", localCRS_pos); - localCRS_rot = EditorGUILayout.Vector3Field("Rotation:", localCRS_rot); + + EditorGUILayout.Space(10); + //TODO Is this required??? + GUILayout.Label("Transform:"); + transf_pos = EditorGUILayout.Vector3Field("Position:", transf_pos); + transf_rot = EditorGUILayout.Vector3Field("Rotation:", transf_rot); EditorGUILayout.Space(); groupEnabled = EditorGUILayout.BeginToggleGroup("Optional Parameters:", groupEnabled); - //EditorGUILayout.IntField("Number of KeyValues", 0); - //EditorGUILayout.Space(); - //EditorGUILayout.TextField("Key", ""); - //EditorGUILayout.TextField("Value", ""); - if (GUILayout.Button("Generate Dummy Key Values")) - { - // dummy - keyValueTags.Clear(); - keyValueTags.Add("Location", new List { "Room1" }); - } + key1 = EditorGUILayout.TextField("Key 1", key1); + value1 = EditorGUILayout.TextField("Value 1", value1); EditorGUILayout.EndToggleGroup(); // GUILayout.EndVertical(); @@ -244,6 +288,7 @@ namespace ETSI.ARF.WorldStorage.UI if (string.IsNullOrEmpty(UUID) || UUID == "0") UUID = System.Guid.Empty.ToString(); WorldLink obj = GenerateWorldLink(); UUID = WorldLinkRequest.AddWorldLink(worldStorageServer, obj); + UUID = UUID.Trim('"'); //Bugfix: remove " from server return value WorldStorageWindow.WorldStorageWindowSingleton.GetWorldLinks(); WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); } @@ -257,6 +302,7 @@ namespace ETSI.ARF.WorldStorage.UI { WorldLink obj = GenerateWorldLink(); UUID = WorldLinkRequest.UpdateWorldLink(worldStorageServer, obj); + UUID = UUID.Trim('"'); //Bugfix: remove " from server return value WorldStorageWindow.WorldStorageWindowSingleton.GetWorldLinks(); WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); } @@ -278,8 +324,12 @@ namespace ETSI.ARF.WorldStorage.UI // ########################################################### GUI.backgroundColor = WorldStorageWindow.arfColors[5]; - if (GUILayout.Button("Generate GameObject Component")) + if (GUILayout.Button("Generate/Update GameObject Visual")) { + //TODO: Value between from and to + Vector3 pos = (FROM.pos + TO.pos) * 0.5f; + Vector3 rot = Vector3.zero; // Direction + GenerateAndUpdateVisual(UUID, FROM.name, TO.name, pos, rot); } GUI.backgroundColor = ori; } @@ -289,34 +339,38 @@ namespace ETSI.ARF.WorldStorage.UI WorldLink obj = WorldLinkRequest.GetWorldLink(worldStorageServer, UUID); //customName = obj.Name; creatorUUID = obj.CreatorUUID.ToString(); - fromUUID = obj.UUIDFrom.ToString(); - toUUID = obj.UUIDTo.ToString(); - fromType = obj.TypeFrom; - toType = obj.TypeTo; + + FROM.UUID = obj.UUIDFrom.ToString(); + FROM.type = obj.TypeFrom; + + TO.UUID = obj.UUIDTo.ToString(); + TO.type = obj.TypeTo; + unit = obj.Unit; if (obj.Transform.Count == 16) { - Matrix4x4 localCRS = new Matrix4x4(); - localCRS.m00 = obj.Transform[0]; localCRS.m01 = obj.Transform[1]; localCRS.m02 = obj.Transform[2]; localCRS.m03 = obj.Transform[3]; - localCRS.m10 = obj.Transform[4]; localCRS.m11 = obj.Transform[5]; localCRS.m12 = obj.Transform[6]; localCRS.m13 = obj.Transform[7]; - localCRS.m20 = obj.Transform[8]; localCRS.m21 = obj.Transform[9]; localCRS.m22 = obj.Transform[10]; localCRS.m23 = obj.Transform[11]; - localCRS.m30 = obj.Transform[12]; localCRS.m31 = obj.Transform[13]; localCRS.m32 = obj.Transform[14]; localCRS.m33 = obj.Transform[15]; - localCRS_pos = localCRS.GetPosition(); - localCRS_rot = localCRS.rotation.eulerAngles; + Matrix4x4 transf = WorldStorageWindow.MatrixFromLocalCRS(obj.Transform); + transf_pos = transf.GetPosition(); + transf_rot = transf.rotation.eulerAngles; } else { - localCRS_pos = Vector3.zero; - localCRS_rot = Vector3.zero; + transf_pos = Vector3.zero; + transf_rot = Vector3.zero; } keyValueTags = obj.KeyvalueTags; - this.Repaint(); // TODO + + // Get here the params of the from/to elements (GET) + GetElementFROM(); + GetElementTO(); + + this.Repaint(); } public WorldLink GenerateWorldLink() { Matrix4x4 localCRS = new Matrix4x4(); - localCRS = Matrix4x4.TRS(localCRS_pos, Quaternion.Euler(localCRS_rot), Vector3.one); + localCRS = Matrix4x4.TRS(transf_pos, Quaternion.Euler(transf_rot), Vector3.one); List _transform3d = new List { localCRS.m00, localCRS.m01, localCRS.m02, localCRS.m03, @@ -325,11 +379,15 @@ namespace ETSI.ARF.WorldStorage.UI localCRS.m30, localCRS.m31, localCRS.m32, localCRS.m33, }; + // Create a key value (one from demo) + keyValueTags.Clear(); + keyValueTags.Add(key1, new List { value1 }); + System.Guid _uuid = System.Guid.Parse(UUID); System.Guid _creator = System.Guid.Parse(worldStorageUser.UUID); - System.Guid _from = System.Guid.Parse(fromUUID); - System.Guid _to = System.Guid.Parse(toUUID); - WorldLink t = new WorldLink(_uuid, _creator, _to, _from, fromType, toType, _transform3d, unit, keyValueTags); + System.Guid _from = System.Guid.Parse(FROM.UUID); + System.Guid _to = System.Guid.Parse(TO.UUID); + WorldLink t = new WorldLink(_uuid, _creator, _to, _from, FROM.type, TO.type, _transform3d, unit, keyValueTags); return t; } } diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldStorageWindow.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldStorageWindow.cs index 490ff31..90d5909 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldStorageWindow.cs +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/Windows/WorldStorageWindow.cs @@ -121,7 +121,7 @@ namespace ETSI.ARF.WorldStorage.UI #endif GUI.backgroundColor = WorldStorageWindow.arfColors[4]; - if (GUILayout.Button("Open World Representation Graph Window...")) + if (GUILayout.Button("Open World Graph Window...")) { GraphWindow.ShowWindow(); } @@ -205,7 +205,7 @@ namespace ETSI.ARF.WorldStorage.UI // ########################################################### #region Filter EditorGUILayout.Space(10); - filterByKeyValueTag = EditorGUILayout.TextField("Filter Value (Key = Group):", filterByKeyValueTag); + filterByKeyValueTag = EditorGUILayout.TextField("Filter for KeyValue Group:", filterByKeyValueTag); #endregion // ########################################################### @@ -230,22 +230,25 @@ namespace ETSI.ARF.WorldStorage.UI GUI.backgroundColor = WorldStorageWindow.arfColors[3]; if (GUILayout.Button("Delete all Trackables (3 stay in!!!)")) { - Debug.Log("Deleting all Trackable "); - int n = 0; - string UUID; - foreach (var customName in trackables) + if (EditorUtility.DisplayDialog("Deleting elements", "Do you really want to delete all trackables?", "Yes", "No")) { - if (!customName.Contains("[")) UUID = customName; - else + Debug.Log("Deleting all Trackable "); + int n = 0; + string UUID; + foreach (var customName in trackables) { - // extract the UUID - UUID = customName.Split('[', ']')[1]; + if (!customName.Contains("[")) UUID = customName; + else + { + // extract the UUID + UUID = customName.Split('[', ']')[1]; + } + if (++n > 3) TrackableRequest.DeleteTrackable(worldStorageServer, UUID); } - if (++n > 3) TrackableRequest.DeleteTrackable(worldStorageServer, UUID); - } - GetTrackables(); - WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + GetTrackables(); + WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + } } GUI.backgroundColor = ori; @@ -305,22 +308,25 @@ namespace ETSI.ARF.WorldStorage.UI GUI.backgroundColor = WorldStorageWindow.arfColors[3]; if (GUILayout.Button("Delete all World Anchors (3 stay in!!!)")) { - Debug.Log("Deleting all World Anchors "); - int n = 0; - string UUID; - foreach (var customName in anchors) + if (EditorUtility.DisplayDialog("Deleting elements", "Do you really want to delete all anchors?", "Yes", "No")) { - if (!customName.Contains("[")) UUID = customName; - else + Debug.Log("Deleting all World Anchors "); + int n = 0; + string UUID; + foreach (var customName in anchors) { - // extract the UUID - UUID = customName.Split('[', ']')[1]; + if (!customName.Contains("[")) UUID = customName; + else + { + // extract the UUID + UUID = customName.Split('[', ']')[1]; + } + if (++n > 3) WorldAnchorRequest.DeleteWorldAnchor(worldStorageServer, UUID); } - if (++n > 3) WorldAnchorRequest.DeleteWorldAnchor(worldStorageServer, UUID); - } - GetWorldAnchors(); - WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + GetWorldAnchors(); + WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + } } GUI.backgroundColor = ori; @@ -380,22 +386,25 @@ namespace ETSI.ARF.WorldStorage.UI GUI.backgroundColor = WorldStorageWindow.arfColors[3]; if (GUILayout.Button("Delete all World Links (3 stay in!!!)")) { - Debug.Log("Deleting all World Links"); - int n = 0; - string UUID; - foreach (var customName in links) + if (EditorUtility.DisplayDialog("Deleting elements", "Do you really want to delete all links?", "Yes", "No")) { - if (!customName.Contains("[")) UUID = customName; - else + Debug.Log("Deleting all World Links"); + int n = 0; + string UUID; + foreach (var customName in links) { - // extract the UUID - UUID = customName.Split('[', ']')[1]; + if (!customName.Contains("[")) UUID = customName; + else + { + // extract the UUID + UUID = customName.Split('[', ']')[1]; + } + if (++n > 3) WorldLinkRequest.DeleteWorldLink(worldStorageServer, UUID); } - if (++n > 3) WorldLinkRequest.DeleteWorldLink(worldStorageServer, UUID); - } - GetWorldLinks(); - WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + GetWorldLinks(); + WorldStorageWindow.WorldStorageWindowSingleton.Repaint(); + } } GUI.backgroundColor = ori; @@ -482,6 +491,16 @@ namespace ETSI.ARF.WorldStorage.UI return ("", ""); } + static public Matrix4x4 MatrixFromLocalCRS(List localCRS) + { + Matrix4x4 matrix = new Matrix4x4(); + matrix.m00 = localCRS[0]; matrix.m01 = localCRS[1]; matrix.m02 = localCRS[2]; matrix.m03 = localCRS[3]; + matrix.m10 = localCRS[4]; matrix.m11 = localCRS[5]; matrix.m12 = localCRS[6]; matrix.m13 = localCRS[7]; + matrix.m20 = localCRS[8]; matrix.m21 = localCRS[9]; matrix.m22 = localCRS[10]; matrix.m23 = localCRS[11]; + matrix.m30 = localCRS[12]; matrix.m31 = localCRS[13]; matrix.m32 = localCRS[14]; matrix.m33 = localCRS[15]; + return matrix; + } + public void GetTrackables() { // Get all objects diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/WorldStoragePrefabs.cs b/Assets/ETSI.ARF/ARF World Storage API/Editor/WorldStoragePrefabs.cs new file mode 100644 index 0000000..c94c0e3 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/WorldStoragePrefabs.cs @@ -0,0 +1,36 @@ +// +// ARF - Augmented Reality Framework (ETSI ISG ARF) +// +// Copyright 2022 ETSI +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Last change: July 2022 +// + +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace ETSI.ARF.WorldStorage.UI.Prefabs +{ + [System.Serializable] + [CreateAssetMenu(fileName = "ARFPrefabs", menuName = "ARF World Storage/Setup for Visuals (prefabs)", order = 1)] + public class WorldStoragePrefabs : ScriptableObject + { + [SerializeField] public GameObject trackablePrefab; + [SerializeField] public GameObject worldAnchorPrefab; + [SerializeField] public GameObject worldLinkPrefab; + } +} \ No newline at end of file diff --git a/Assets/ETSI.ARF/ARF World Storage API/Editor/WorldStoragePrefabs.cs.meta b/Assets/ETSI.ARF/ARF World Storage API/Editor/WorldStoragePrefabs.cs.meta new file mode 100644 index 0000000..c921b23 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Editor/WorldStoragePrefabs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1aec4cd1383f70e4092183ea55088e8e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Materials.meta b/Assets/ETSI.ARF/ARF World Storage API/Materials.meta new file mode 100644 index 0000000..22acca0 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 02d39249ee4060a4d974bc4e02954b72 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Materials/blue.mat b/Assets/ETSI.ARF/ARF World Storage API/Materials/blue.mat new file mode 100644 index 0000000..55a4310 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Materials/blue.mat @@ -0,0 +1,80 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: blue + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0, g: 0, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/ETSI.ARF/ARF World Storage API/Materials/blue.mat.meta b/Assets/ETSI.ARF/ARF World Storage API/Materials/blue.mat.meta new file mode 100644 index 0000000..550aada --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Materials/blue.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1b6b868784cd25c46a90fe7b882fddb2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Materials/green.mat b/Assets/ETSI.ARF/ARF World Storage API/Materials/green.mat new file mode 100644 index 0000000..62e6953 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Materials/green.mat @@ -0,0 +1,80 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: green + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0, g: 1, b: 0, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/ETSI.ARF/ARF World Storage API/Materials/green.mat.meta b/Assets/ETSI.ARF/ARF World Storage API/Materials/green.mat.meta new file mode 100644 index 0000000..67bcad2 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Materials/green.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 19de5bd9483daf448a5fab21d3eecba3 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Materials/grey.mat b/Assets/ETSI.ARF/ARF World Storage API/Materials/grey.mat new file mode 100644 index 0000000..6487e10 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Materials/grey.mat @@ -0,0 +1,80 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: grey + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 0.5188679, g: 0.5188679, b: 0.5188679, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/ETSI.ARF/ARF World Storage API/Materials/grey.mat.meta b/Assets/ETSI.ARF/ARF World Storage API/Materials/grey.mat.meta new file mode 100644 index 0000000..31fcd3c --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Materials/grey.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f453607d5281b9e4c88da6356ec54ddd +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Materials/red.mat b/Assets/ETSI.ARF/ARF World Storage API/Materials/red.mat new file mode 100644 index 0000000..cdde4c4 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Materials/red.mat @@ -0,0 +1,80 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: red + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 1 + m_Colors: + - _Color: {r: 1, g: 0, b: 0, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + m_BuildTextureStacks: [] diff --git a/Assets/ETSI.ARF/ARF World Storage API/Materials/red.mat.meta b/Assets/ETSI.ARF/ARF World Storage API/Materials/red.mat.meta new file mode 100644 index 0000000..2f910fe --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Materials/red.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0c6a9f85031693343a9e37c4a08627e9 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFTrackable.prefab b/Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFTrackable.prefab new file mode 100644 index 0000000..ca86143 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFTrackable.prefab @@ -0,0 +1,835 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1239500166128132140 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1814829793678878270} + m_Layer: 0 + m_Name: ARFTrackable + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1814829793678878270 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1239500166128132140} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4532241398218188797} + - {fileID: 33536572583887604} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1389085265039543899 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 788171341007892784} + - component: {fileID: 8839914115087242523} + - component: {fileID: 4246121306890513542} + - component: {fileID: 1020142642249578057} + m_Layer: 0 + m_Name: Y + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &788171341007892784 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1389085265039543899} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0.1, z: 0} + m_LocalScale: {x: 0.020000001, y: 0.05, z: 0.020000001} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4532241398218188797} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &8839914115087242523 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1389085265039543899} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &4246121306890513542 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1389085265039543899} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 19de5bd9483daf448a5fab21d3eecba3, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!136 &1020142642249578057 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1389085265039543899} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!1 &1687101261560852242 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 377487265314945344} + - component: {fileID: 6822513350628080072} + - component: {fileID: 6739960153126183626} + - component: {fileID: 8765868915607131294} + m_Layer: 0 + m_Name: Z + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &377487265314945344 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1687101261560852242} + m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 0.1} + m_LocalScale: {x: 0.020000001, y: 0.05000001, z: 0.019999998} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4532241398218188797} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!33 &6822513350628080072 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1687101261560852242} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &6739960153126183626 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1687101261560852242} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 1b6b868784cd25c46a90fe7b882fddb2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!136 &8765868915607131294 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1687101261560852242} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!1 &1823986580348874447 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1436432047471570793} + - component: {fileID: 5158975352210721371} + - component: {fileID: 4673833591676428792} + - component: {fileID: 961187375770271614} + m_Layer: 0 + m_Name: X + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1436432047471570793 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1823986580348874447} + m_LocalRotation: {x: -0, y: -0, z: 0.7071068, w: 0.7071068} + m_LocalPosition: {x: 0.1, y: 0, z: 0} + m_LocalScale: {x: 0.019999998, y: 0.05000001, z: 0.020000001} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4532241398218188797} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90} +--- !u!33 &5158975352210721371 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1823986580348874447} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &4673833591676428792 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1823986580348874447} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 0c6a9f85031693343a9e37c4a08627e9, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!136 &961187375770271614 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1823986580348874447} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!1 &4451045791079530586 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2888022835692577799} + - component: {fileID: 3434672324534858807} + - component: {fileID: 420668000673399792} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2888022835692577799 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4451045791079530586} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 33536572583887604} + 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.025} + m_SizeDelta: {x: 250, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3434672324534858807 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4451045791079530586} + m_CullTransparentMesh: 1 +--- !u!114 &420668000673399792 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4451045791079530586} + 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: 'Name: + + UUID:' + 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: 16 + m_fontSizeBase: 16 + 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!1 &5897666007833324009 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8156859587808685068} + - component: {fileID: 1360188677730577841} + - component: {fileID: 3860478840123770047} + m_Layer: 5 + m_Name: Headline + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8156859587808685068 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5897666007833324009} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 33536572583887604} + 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.02} + m_SizeDelta: {x: 250, y: 25} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1360188677730577841 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5897666007833324009} + m_CullTransparentMesh: 1 +--- !u!114 &3860478840123770047 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5897666007833324009} + 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: AR Trackable + 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: 24 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + 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!1 &8182691244837652424 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4532241398218188797} + m_Layer: 0 + m_Name: Axe + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4532241398218188797 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8182691244837652424} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8225488253825437765} + - {fileID: 1436432047471570793} + - {fileID: 788171341007892784} + - {fileID: 377487265314945344} + m_Father: {fileID: 1814829793678878270} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &8225488253825437761 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8225488253825437765} + - component: {fileID: 8225488253825437764} + - component: {fileID: 8225488253825437763} + - component: {fileID: 8225488253825437762} + m_Layer: 0 + m_Name: Center + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8225488253825437765 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8225488253825437761} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 4532241398218188797} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &8225488253825437764 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8225488253825437761} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &8225488253825437763 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8225488253825437761} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: f453607d5281b9e4c88da6356ec54ddd, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &8225488253825437762 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8225488253825437761} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &8292506020522815698 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 33536572583887604} + - component: {fileID: 1417027443369488948} + - component: {fileID: 1035955511594240086} + - component: {fileID: 5661858723465099382} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &33536572583887604 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8292506020522815698} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8156859587808685068} + - {fileID: 2888022835692577799} + m_Father: {fileID: 1814829793678878270} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0.1263, y: -0.1} + m_SizeDelta: {x: 640, y: 480} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!223 &1417027443369488948 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8292506020522815698} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!114 &1035955511594240086 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8292506020522815698} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 1 +--- !u!114 &5661858723465099382 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8292506020522815698} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 diff --git a/Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFTrackable.prefab.meta b/Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFTrackable.prefab.meta new file mode 100644 index 0000000..817771e --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFTrackable.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 889bc3e43608e504c977b93ba5f8ed37 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFWorldAnchor.prefab b/Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFWorldAnchor.prefab new file mode 100644 index 0000000..5cb6661 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFWorldAnchor.prefab @@ -0,0 +1,835 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1058305942658709743 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4263110725940009300} + - component: {fileID: 4129045750120536829} + - component: {fileID: 6557221987491350997} + m_Layer: 5 + m_Name: Headline + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4263110725940009300 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1058305942658709743} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1497700213276983046} + 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.02} + m_SizeDelta: {x: 250, y: 25} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &4129045750120536829 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1058305942658709743} + m_CullTransparentMesh: 1 +--- !u!114 &6557221987491350997 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1058305942658709743} + 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: AR World Anchor + 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: 24 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + 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!1 &1525499792725534490 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6503384942250313519} + m_Layer: 0 + m_Name: Axe + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6503384942250313519 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1525499792725534490} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1622323168209334423} + - {fileID: 8595771872739495867} + - {fileID: 7950346510699467234} + - {fileID: 7032495084649945490} + m_Father: {fileID: 9046317383172441836} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1622323168209334419 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1622323168209334423} + - component: {fileID: 1622323168209334422} + - component: {fileID: 1622323168209334417} + - component: {fileID: 1622323168209334416} + m_Layer: 0 + m_Name: Center + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1622323168209334423 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1622323168209334419} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6503384942250313519} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &1622323168209334422 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1622323168209334419} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1622323168209334417 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1622323168209334419} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: f453607d5281b9e4c88da6356ec54ddd, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &1622323168209334416 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1622323168209334419} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &4529171925897838154 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2044833251513730170} + - component: {fileID: 8475275463028488054} + - component: {fileID: 3041298355498540117} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2044833251513730170 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4529171925897838154} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1497700213276983046} + 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.025} + m_SizeDelta: {x: 250, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8475275463028488054 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4529171925897838154} + m_CullTransparentMesh: 1 +--- !u!114 &3041298355498540117 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4529171925897838154} + 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: 'Name: + + UUID:' + 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: 16 + m_fontSizeBase: 16 + 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!1 &8344222362070912960 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7032495084649945490} + - component: {fileID: 4182441150992537882} + - component: {fileID: 4119753123192799768} + - component: {fileID: 2090784007532835916} + m_Layer: 0 + m_Name: Z + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7032495084649945490 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8344222362070912960} + m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 0.1} + m_LocalScale: {x: 0.020000001, y: 0.05000001, z: 0.019999998} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6503384942250313519} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!33 &4182441150992537882 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8344222362070912960} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &4119753123192799768 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8344222362070912960} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 1b6b868784cd25c46a90fe7b882fddb2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!136 &2090784007532835916 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8344222362070912960} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!1 &8473238451594182910 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9046317383172441836} + m_Layer: 0 + m_Name: ARFWorldAnchor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &9046317383172441836 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8473238451594182910} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6503384942250313519} + - {fileID: 1497700213276983046} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &8638588117357457033 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7950346510699467234} + - component: {fileID: 2164195824166614473} + - component: {fileID: 6793727845488397396} + - component: {fileID: 7677843500006282907} + m_Layer: 0 + m_Name: Y + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7950346510699467234 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8638588117357457033} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0.1, z: 0} + m_LocalScale: {x: 0.020000001, y: 0.05, z: 0.020000001} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6503384942250313519} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &2164195824166614473 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8638588117357457033} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &6793727845488397396 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8638588117357457033} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 19de5bd9483daf448a5fab21d3eecba3, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!136 &7677843500006282907 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8638588117357457033} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!1 &8828373246506081872 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1497700213276983046} + - component: {fileID: 8595258003796922682} + - component: {fileID: 3895121440785909528} + - component: {fileID: 2278103916936109689} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1497700213276983046 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8828373246506081872} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4263110725940009300} + - {fileID: 2044833251513730170} + m_Father: {fileID: 9046317383172441836} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0.1263, y: -0.1} + m_SizeDelta: {x: 640, y: 480} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!223 &8595258003796922682 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8828373246506081872} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!114 &3895121440785909528 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8828373246506081872} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 1 +--- !u!114 &2278103916936109689 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8828373246506081872} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!1 &9076285480843021853 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8595771872739495867} + - component: {fileID: 2539246307318246025} + - component: {fileID: 2628309207522230570} + - component: {fileID: 7634649738335838124} + m_Layer: 0 + m_Name: X + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8595771872739495867 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9076285480843021853} + m_LocalRotation: {x: -0, y: -0, z: 0.7071068, w: 0.7071068} + m_LocalPosition: {x: 0.1, y: 0, z: 0} + m_LocalScale: {x: 0.019999998, y: 0.05000001, z: 0.020000001} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6503384942250313519} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90} +--- !u!33 &2539246307318246025 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9076285480843021853} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &2628309207522230570 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9076285480843021853} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 0c6a9f85031693343a9e37c4a08627e9, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!136 &7634649738335838124 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9076285480843021853} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} diff --git a/Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFWorldAnchor.prefab.meta b/Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFWorldAnchor.prefab.meta new file mode 100644 index 0000000..898f39e --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFWorldAnchor.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 832a64407eb5c8249bb8e4a074649918 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFWorldLink.prefab b/Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFWorldLink.prefab new file mode 100644 index 0000000..3c1be06 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFWorldLink.prefab @@ -0,0 +1,540 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1239500166128132140 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1814829793678878270} + m_Layer: 0 + m_Name: ARFWorldLink + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1814829793678878270 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1239500166128132140} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 4532241398218188797} + - {fileID: 33536572583887604} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &4451045791079530586 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2888022835692577799} + - component: {fileID: 3434672324534858807} + - component: {fileID: 420668000673399792} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2888022835692577799 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4451045791079530586} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 33536572583887604} + 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.025} + m_SizeDelta: {x: 250, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3434672324534858807 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4451045791079530586} + m_CullTransparentMesh: 1 +--- !u!114 &420668000673399792 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4451045791079530586} + 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: 'UUID: + + From: + + To:' + 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: 16 + m_fontSizeBase: 16 + 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!1 &5897666007833324009 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8156859587808685068} + - component: {fileID: 1360188677730577841} + - component: {fileID: 3860478840123770047} + m_Layer: 5 + m_Name: Headline + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &8156859587808685068 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5897666007833324009} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 33536572583887604} + 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.02} + m_SizeDelta: {x: 250, y: 25} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1360188677730577841 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5897666007833324009} + m_CullTransparentMesh: 1 +--- !u!114 &3860478840123770047 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5897666007833324009} + 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: AR World Link + 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: 24 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + 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!1 &8182691244837652424 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4532241398218188797} + m_Layer: 0 + m_Name: Axe + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &4532241398218188797 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8182691244837652424} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8225488253825437765} + m_Father: {fileID: 1814829793678878270} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &8225488253825437761 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8225488253825437765} + - component: {fileID: 8225488253825437764} + - component: {fileID: 8225488253825437763} + - component: {fileID: 8225488253825437762} + m_Layer: 0 + m_Name: Center + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8225488253825437765 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8225488253825437761} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 4532241398218188797} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &8225488253825437764 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8225488253825437761} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &8225488253825437763 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8225488253825437761} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: f453607d5281b9e4c88da6356ec54ddd, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &8225488253825437762 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8225488253825437761} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &8292506020522815698 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 33536572583887604} + - component: {fileID: 1417027443369488948} + - component: {fileID: 1035955511594240086} + - component: {fileID: 5661858723465099382} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &33536572583887604 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8292506020522815698} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 8156859587808685068} + - {fileID: 2888022835692577799} + m_Father: {fileID: 1814829793678878270} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0.1263, y: -0.1} + m_SizeDelta: {x: 640, y: 480} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!223 &1417027443369488948 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8292506020522815698} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!114 &1035955511594240086 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8292506020522815698} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 1 +--- !u!114 &5661858723465099382 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8292506020522815698} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 diff --git a/Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFWorldLink.prefab.meta b/Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFWorldLink.prefab.meta new file mode 100644 index 0000000..7c41f4e --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Prefabs/ARFWorldLink.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: fbd37f7ee889c994a913eeca05e0501f +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Resources.meta b/Assets/ETSI.ARF/ARF World Storage API/Resources.meta new file mode 100644 index 0000000..f531d88 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f07b85312ef176543b32402edd2bdb8a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Resources/ARFPrefabs.asset b/Assets/ETSI.ARF/ARF World Storage API/Resources/ARFPrefabs.asset new file mode 100644 index 0000000..9190b5a --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Resources/ARFPrefabs.asset @@ -0,0 +1,17 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aec4cd1383f70e4092183ea55088e8e, type: 3} + m_Name: ARFPrefabs + m_EditorClassIdentifier: + trackablePrefab: {fileID: 1239500166128132140, guid: 889bc3e43608e504c977b93ba5f8ed37, type: 3} + worldAnchorPrefab: {fileID: 8473238451594182910, guid: 832a64407eb5c8249bb8e4a074649918, type: 3} + worldLinkPrefab: {fileID: 1239500166128132140, guid: fbd37f7ee889c994a913eeca05e0501f, type: 3} diff --git a/Assets/ETSI.ARF/ARF World Storage API/Resources/ARFPrefabs.asset.meta b/Assets/ETSI.ARF/ARF World Storage API/Resources/ARFPrefabs.asset.meta new file mode 100644 index 0000000..a377b92 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/Resources/ARFPrefabs.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cc22d9e73b4dcca4da1f7bdd0321a3d2 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/Scenes/WorldStorageSample.unity b/Assets/ETSI.ARF/ARF World Storage API/Scenes/WorldStorageSample.unity index 3a33138..a0b192c 100644 --- a/Assets/ETSI.ARF/ARF World Storage API/Scenes/WorldStorageSample.unity +++ b/Assets/ETSI.ARF/ARF World Storage API/Scenes/WorldStorageSample.unity @@ -123,6 +123,1188 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} +--- !u!1 &20694661 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 20694662} + - component: {fileID: 20694664} + - component: {fileID: 20694663} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &20694662 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 20694661} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1125603789} + 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.025} + m_SizeDelta: {x: 250, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &20694663 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 20694661} + 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: 'Name: myAnchor_01 + + UUID: b0eca848-4716-4662-8dcf-73a62af6905b' + 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: 16 + m_fontSizeBase: 16 + 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!222 &20694664 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 20694661} + m_CullTransparentMesh: 1 +--- !u!1 &24083083 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 24083084} + m_Layer: 0 + m_Name: ARF Visuals + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &24083084 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 24083083} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 713720969} + - {fileID: 1919389732} + - {fileID: 725287313} + - {fileID: 2082184237} + - {fileID: 1677265198} + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &44035624 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 44035625} + - component: {fileID: 44035627} + - component: {fileID: 44035626} + m_Layer: 5 + m_Name: Headline + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &44035625 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 44035624} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 370169937} + 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.02} + m_SizeDelta: {x: 250, y: 25} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &44035626 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 44035624} + 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: AR World Link + 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: 24 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + 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!222 &44035627 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 44035624} + m_CullTransparentMesh: 1 +--- !u!1 &210458806 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 210458807} + m_Layer: 0 + m_Name: Axe + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &210458807 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 210458806} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1987857291} + m_Father: {fileID: 1677265198} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &213762996 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 213762997} + - component: {fileID: 213763000} + - component: {fileID: 213762999} + - component: {fileID: 213762998} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &213762997 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 213762996} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1421309256} + - {fileID: 785029364} + m_Father: {fileID: 1677265198} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0.1263, y: -0.1} + m_SizeDelta: {x: 640, y: 480} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &213762998 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 213762996} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &213762999 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 213762996} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 1 +--- !u!223 &213763000 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 213762996} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!1 &317113689 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 317113690} + m_Layer: 0 + m_Name: Axe + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &317113690 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 317113689} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1269067760} + - {fileID: 526555817} + - {fileID: 2120796059} + - {fileID: 442001531} + m_Father: {fileID: 713720969} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &353369395 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 353369396} + - component: {fileID: 353369398} + - component: {fileID: 353369397} + m_Layer: 5 + m_Name: Headline + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &353369396 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 353369395} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1125603789} + 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.02} + m_SizeDelta: {x: 250, y: 25} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &353369397 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 353369395} + 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: AR World Anchor + 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: 24 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + 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!222 &353369398 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 353369395} + m_CullTransparentMesh: 1 +--- !u!1 &370169936 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 370169937} + - component: {fileID: 370169940} + - component: {fileID: 370169939} + - component: {fileID: 370169938} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &370169937 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 370169936} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 44035625} + - {fileID: 643353436} + m_Father: {fileID: 725287313} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0.1263, y: -0.1} + m_SizeDelta: {x: 640, y: 480} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &370169938 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 370169936} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &370169939 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 370169936} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 1 +--- !u!223 &370169940 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 370169936} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!1 &442001530 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 442001531} + - component: {fileID: 442001534} + - component: {fileID: 442001533} + - component: {fileID: 442001532} + m_Layer: 0 + m_Name: Z + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &442001531 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 442001530} + m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 0.1} + m_LocalScale: {x: 0.020000001, y: 0.05000001, z: 0.019999998} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 317113690} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!136 &442001532 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 442001530} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &442001533 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 442001530} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 1b6b868784cd25c46a90fe7b882fddb2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &442001534 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 442001530} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &526555816 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 526555817} + - component: {fileID: 526555820} + - component: {fileID: 526555819} + - component: {fileID: 526555818} + m_Layer: 0 + m_Name: X + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &526555817 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 526555816} + m_LocalRotation: {x: -0, y: -0, z: 0.7071068, w: 0.7071068} + m_LocalPosition: {x: 0.1, y: 0, z: 0} + m_LocalScale: {x: 0.019999998, y: 0.05000001, z: 0.020000001} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 317113690} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90} +--- !u!136 &526555818 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 526555816} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &526555819 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 526555816} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 0c6a9f85031693343a9e37c4a08627e9, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &526555820 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 526555816} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &611324538 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 611324539} + - component: {fileID: 611324542} + - component: {fileID: 611324541} + - component: {fileID: 611324540} + m_Layer: 0 + m_Name: Center + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &611324539 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 611324538} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 687316359} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &611324540 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 611324538} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &611324541 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 611324538} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: f453607d5281b9e4c88da6356ec54ddd, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &611324542 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 611324538} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &643353435 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 643353436} + - component: {fileID: 643353438} + - component: {fileID: 643353437} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &643353436 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 643353435} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 370169937} + 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.025} + m_SizeDelta: {x: 250, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &643353437 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 643353435} + 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: 'UUID: 24d17ddf-c018-4ef8-bcfe-827880faf81f + + From: Sylvain2 + + To: + Sylvain' + 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: 16 + m_fontSizeBase: 16 + 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!222 &643353438 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 643353435} + m_CullTransparentMesh: 1 +--- !u!1 &687316358 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 687316359} + m_Layer: 0 + m_Name: Axe + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &687316359 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 687316358} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 611324539} + - {fileID: 1565587750} + - {fileID: 937196681} + - {fileID: 1745649891} + m_Father: {fileID: 2082184237} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &705507993 GameObject: m_ObjectHideFlags: 0 @@ -131,93 +1313,2288 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 705507995} - - component: {fileID: 705507994} + - component: {fileID: 705507995} + - component: {fileID: 705507994} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &705507994 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_Enabled: 1 + serializedVersion: 10 + m_Type: 1 + m_Shape: 0 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 1 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &705507995 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 705507993} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &713720968 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 713720969} + m_Layer: 0 + m_Name: a71ecb62-701a-4a9b-a642-7bcb7d6a5241 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &713720969 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 713720968} + m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 317113690} + - {fileID: 1416629344} + m_Father: {fileID: 24083084} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &725287312 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 725287313} + m_Layer: 0 + m_Name: 24d17ddf-c018-4ef8-bcfe-827880faf81f + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &725287313 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 725287312} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0.5, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1445481428} + - {fileID: 370169937} + m_Father: {fileID: 24083084} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &785029363 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 785029364} + - component: {fileID: 785029366} + - component: {fileID: 785029365} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &785029364 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 785029363} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 213762997} + 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.025} + m_SizeDelta: {x: 250, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &785029365 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 785029363} + 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: 'UUID: f1354663-1afa-484c-8c85-6d8df4537665 + + From: Sylvain2 + + To: + myAnchor_01' + 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: 16 + m_fontSizeBase: 16 + 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!222 &785029366 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 785029363} + m_CullTransparentMesh: 1 +--- !u!1 &919227458 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 919227459} + - component: {fileID: 919227462} + - component: {fileID: 919227461} + - component: {fileID: 919227460} + m_Layer: 0 + m_Name: Center + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &919227459 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 919227458} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1445481428} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &919227460 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 919227458} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &919227461 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 919227458} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: f453607d5281b9e4c88da6356ec54ddd, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &919227462 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 919227458} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &937196680 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 937196681} + - component: {fileID: 937196684} + - component: {fileID: 937196683} + - component: {fileID: 937196682} + m_Layer: 0 + m_Name: Y + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &937196681 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 937196680} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0.1, z: 0} + m_LocalScale: {x: 0.020000001, y: 0.05, z: 0.020000001} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 687316359} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!136 &937196682 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 937196680} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &937196683 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 937196680} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 19de5bd9483daf448a5fab21d3eecba3, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &937196684 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 937196680} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &963194225 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 963194228} + - component: {fileID: 963194227} + - component: {fileID: 963194226} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &963194226 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 +--- !u!20 &963194227 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &963194228 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 963194225} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1016589315 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1016589316} + - component: {fileID: 1016589319} + - component: {fileID: 1016589318} + - component: {fileID: 1016589317} + m_Layer: 0 + m_Name: Z + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1016589316 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1016589315} + m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 0.1} + m_LocalScale: {x: 0.020000001, y: 0.05000001, z: 0.019999998} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1772755038} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!136 &1016589317 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1016589315} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &1016589318 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1016589315} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 1b6b868784cd25c46a90fe7b882fddb2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1016589319 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1016589315} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1056454763 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1056454765} + - component: {fileID: 1056454764} + m_Layer: 0 + m_Name: World Storage Info + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1056454764 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1056454763} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 02da7adcc65f4694684d71e61d88070b, type: 3} + m_Name: + m_EditorClassIdentifier: + worldStorageServer: {fileID: 11400000, guid: 62e22250d4134d64ca319770717f0b43, type: 2} +--- !u!4 &1056454765 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1056454763} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1061641954 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1061641955} + - component: {fileID: 1061641958} + - component: {fileID: 1061641957} + - component: {fileID: 1061641956} + m_Layer: 0 + m_Name: X + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1061641955 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1061641954} + m_LocalRotation: {x: -0, y: -0, z: 0.7071068, w: 0.7071068} + m_LocalPosition: {x: 0.1, y: 0, z: 0} + m_LocalScale: {x: 0.019999998, y: 0.05000001, z: 0.020000001} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1772755038} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90} +--- !u!136 &1061641956 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1061641954} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &1061641957 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1061641954} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 0c6a9f85031693343a9e37c4a08627e9, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1061641958 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1061641954} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1073553023 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1073553024} + - component: {fileID: 1073553026} + - component: {fileID: 1073553025} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1073553024 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1073553023} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1339249641} + 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.025} + m_SizeDelta: {x: 250, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1073553025 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1073553023} + 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: 'Name: Sylvain2 + + UUID: a13f8da9-d7b0-4b26-9a72-b3381c04a538' + 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: 16 + m_fontSizeBase: 16 + 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!222 &1073553026 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1073553023} + m_CullTransparentMesh: 1 +--- !u!1 &1125603788 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1125603789} + - component: {fileID: 1125603792} + - component: {fileID: 1125603791} + - component: {fileID: 1125603790} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1125603789 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1125603788} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 353369396} + - {fileID: 20694662} + m_Father: {fileID: 2082184237} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0.1263, y: -0.1} + m_SizeDelta: {x: 640, y: 480} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1125603790 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1125603788} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1125603791 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1125603788} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 1 +--- !u!223 &1125603792 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1125603788} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!1 &1269067759 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1269067760} + - component: {fileID: 1269067763} + - component: {fileID: 1269067762} + - component: {fileID: 1269067761} + m_Layer: 0 + m_Name: Center + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1269067760 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1269067759} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 317113690} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1269067761 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1269067759} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1269067762 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1269067759} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: f453607d5281b9e4c88da6356ec54ddd, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1269067763 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1269067759} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1339249640 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1339249641} + - component: {fileID: 1339249644} + - component: {fileID: 1339249643} + - component: {fileID: 1339249642} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1339249641 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1339249640} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1538391455} + - {fileID: 1073553024} + m_Father: {fileID: 1919389732} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0.1263, y: -0.1} + m_SizeDelta: {x: 640, y: 480} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1339249642 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1339249640} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1339249643 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1339249640} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 1 +--- !u!223 &1339249644 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1339249640} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!1 &1416629343 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1416629344} + - component: {fileID: 1416629347} + - component: {fileID: 1416629346} + - component: {fileID: 1416629345} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1416629344 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1416629343} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1839302983} + - {fileID: 2001891524} + m_Father: {fileID: 713720969} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0.1263, y: -0.1} + m_SizeDelta: {x: 640, y: 480} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1416629345 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1416629343} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1416629346 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1416629343} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 1 +--- !u!223 &1416629347 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1416629343} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 2 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 25 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!1 &1421309255 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1421309256} + - component: {fileID: 1421309258} + - component: {fileID: 1421309257} + m_Layer: 5 + m_Name: Headline + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1421309256 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1421309255} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 213762997} + 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.02} + m_SizeDelta: {x: 250, y: 25} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1421309257 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1421309255} + 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: AR World Link + 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: 24 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + 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!222 &1421309258 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1421309255} + m_CullTransparentMesh: 1 +--- !u!1 &1445481427 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1445481428} + m_Layer: 0 + m_Name: Axe + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1445481428 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1445481427} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 919227459} + m_Father: {fileID: 725287313} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1538391454 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1538391455} + - component: {fileID: 1538391457} + - component: {fileID: 1538391456} + m_Layer: 5 + m_Name: Headline + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1538391455 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1538391454} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1339249641} + 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.02} + m_SizeDelta: {x: 250, y: 25} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1538391456 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1538391454} + 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: AR Trackable + 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: 24 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + 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!222 &1538391457 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1538391454} + m_CullTransparentMesh: 1 +--- !u!1 &1565587749 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1565587750} + - component: {fileID: 1565587753} + - component: {fileID: 1565587752} + - component: {fileID: 1565587751} + m_Layer: 0 + m_Name: X + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1565587750 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1565587749} + m_LocalRotation: {x: -0, y: -0, z: 0.7071068, w: 0.7071068} + m_LocalPosition: {x: 0.1, y: 0, z: 0} + m_LocalScale: {x: 0.019999998, y: 0.05000001, z: 0.020000001} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 687316359} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 90} +--- !u!136 &1565587751 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1565587749} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &1565587752 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1565587749} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 0c6a9f85031693343a9e37c4a08627e9, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1565587753 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1565587749} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1677265197 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1677265198} + m_Layer: 0 + m_Name: f1354663-1afa-484c-8c85-6d8df4537665 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1677265198 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1677265197} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.25, y: 0.25, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 210458807} + - {fileID: 213762997} + m_Father: {fileID: 24083084} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1745649890 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1745649891} + - component: {fileID: 1745649894} + - component: {fileID: 1745649893} + - component: {fileID: 1745649892} + m_Layer: 0 + m_Name: Z + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1745649891 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1745649890} + m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} + m_LocalPosition: {x: 0, y: 0, z: 0.1} + m_LocalScale: {x: 0.020000001, y: 0.05000001, z: 0.019999998} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 687316359} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 90, y: 0, z: 0} +--- !u!136 &1745649892 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1745649890} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &1745649893 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1745649890} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 1b6b868784cd25c46a90fe7b882fddb2, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1745649894 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1745649890} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1772755037 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1772755038} + m_Layer: 0 + m_Name: Axe + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1772755038 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1772755037} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1792939762} + - {fileID: 1061641955} + - {fileID: 1808663305} + - {fileID: 1016589316} + m_Father: {fileID: 1919389732} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1792939761 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1792939762} + - component: {fileID: 1792939765} + - component: {fileID: 1792939764} + - component: {fileID: 1792939763} + m_Layer: 0 + m_Name: Center + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1792939762 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1792939761} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1772755038} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1792939763 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1792939761} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + serializedVersion: 2 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1792939764 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1792939761} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: f453607d5281b9e4c88da6356ec54ddd, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1792939765 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1792939761} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1808663304 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1808663305} + - component: {fileID: 1808663308} + - component: {fileID: 1808663307} + - component: {fileID: 1808663306} + m_Layer: 0 + m_Name: Y + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1808663305 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1808663304} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0.1, z: 0} + m_LocalScale: {x: 0.020000001, y: 0.05, z: 0.020000001} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1772755038} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!136 &1808663306 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1808663304} + m_Material: {fileID: 0} + m_IsTrigger: 0 + m_Enabled: 1 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &1808663307 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1808663304} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 19de5bd9483daf448a5fab21d3eecba3, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1808663308 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1808663304} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &1839302982 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1839302983} + - component: {fileID: 1839302985} + - component: {fileID: 1839302984} + m_Layer: 5 + m_Name: Headline + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1839302983 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1839302982} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1416629344} + 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.02} + m_SizeDelta: {x: 250, y: 25} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1839302984 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1839302982} + 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: AR Trackable + 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: 24 + m_fontSizeBase: 24 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 1 + 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!222 &1839302985 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1839302982} + m_CullTransparentMesh: 1 +--- !u!1 &1919389731 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1919389732} m_Layer: 0 - m_Name: Directional Light + m_Name: a13f8da9-d7b0-4b26-9a72-b3381c04a538 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!108 &705507994 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 705507993} - m_Enabled: 1 - serializedVersion: 10 - m_Type: 1 - m_Shape: 0 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingLayerMask: 1 - m_Lightmapping: 1 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_UseViewFrustumForShadowCasterCull: 1 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &705507995 +--- !u!4 &1919389732 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 705507993} - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, z: 0} + m_GameObject: {fileID: 1919389731} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} + m_Children: + - {fileID: 1772755038} + - {fileID: 1339249641} + m_Father: {fileID: 24083084} m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!1 &763049753 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1987857290 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -225,37 +3602,52 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 763049757} - - component: {fileID: 763049756} - - component: {fileID: 763049755} - - component: {fileID: 763049754} + - component: {fileID: 1987857291} + - component: {fileID: 1987857294} + - component: {fileID: 1987857293} + - component: {fileID: 1987857292} m_Layer: 0 - m_Name: Cube + m_Name: Center m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!65 &763049754 +--- !u!4 &1987857291 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1987857290} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 210458807} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1987857292 BoxCollider: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 763049753} + m_GameObject: {fileID: 1987857290} m_Material: {fileID: 0} m_IsTrigger: 0 m_Enabled: 1 serializedVersion: 2 m_Size: {x: 1, y: 1, z: 1} m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &763049755 +--- !u!23 &1987857293 MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 763049753} + m_GameObject: {fileID: 1987857290} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 @@ -269,7 +3661,7 @@ MeshRenderer: m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 2100000, guid: f453607d5281b9e4c88da6356ec54ddd, type: 2} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -291,30 +3683,15 @@ MeshRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &763049756 +--- !u!33 &1987857294 MeshFilter: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 763049753} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &763049757 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 763049753} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &963194225 + m_GameObject: {fileID: 1987857290} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &2001891523 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -322,83 +3699,169 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 963194228} - - component: {fileID: 963194227} - - component: {fileID: 963194226} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera + - component: {fileID: 2001891524} + - component: {fileID: 2001891526} + - component: {fileID: 2001891525} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!81 &963194226 -AudioListener: +--- !u!224 &2001891524 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 963194225} - m_Enabled: 1 ---- !u!20 &963194227 -Camera: + m_GameObject: {fileID: 2001891523} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_ConstrainProportionsScale: 1 + m_Children: [] + m_Father: {fileID: 1416629344} + 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.025} + m_SizeDelta: {x: 250, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &2001891525 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 963194225} + m_GameObject: {fileID: 2001891523} m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: + 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: 'Name: Sylvain + + UUID: a71ecb62-701a-4a9b-a642-7bcb7d6a5241' + 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 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: + 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 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &963194228 + 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: 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!222 &2001891526 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2001891523} + m_CullTransparentMesh: 1 +--- !u!1 &2082184236 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2082184237} + m_Layer: 0 + m_Name: b0eca848-4716-4662-8dcf-73a62af6905b + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2082184237 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 963194225} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 1, z: -10} + m_GameObject: {fileID: 2082184236} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1.5, y: 0.5, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 + m_Children: + - {fileID: 687316359} + - {fileID: 1125603789} + m_Father: {fileID: 24083084} + m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1056454763 +--- !u!1 &2120796058 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -406,40 +3869,93 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1056454765} - - component: {fileID: 1056454764} + - component: {fileID: 2120796059} + - component: {fileID: 2120796062} + - component: {fileID: 2120796061} + - component: {fileID: 2120796060} m_Layer: 0 - m_Name: World Storage Info + m_Name: Y m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!114 &1056454764 -MonoBehaviour: +--- !u!4 &2120796059 +Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1056454763} + m_GameObject: {fileID: 2120796058} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0.1, z: 0} + m_LocalScale: {x: 0.020000001, y: 0.05, z: 0.020000001} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 317113690} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!136 &2120796060 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2120796058} + m_Material: {fileID: 0} + m_IsTrigger: 0 m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 02da7adcc65f4694684d71e61d88070b, type: 3} - m_Name: - m_EditorClassIdentifier: - worldStorageServer: {fileID: 11400000, guid: 62e22250d4134d64ca319770717f0b43, type: 2} ---- !u!4 &1056454765 -Transform: + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} +--- !u!23 &2120796061 +MeshRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1056454763} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_GameObject: {fileID: 2120796058} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 19de5bd9483daf448a5fab21d3eecba3, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &2120796062 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2120796058} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Assets/ETSI.ARF/ARF World Storage API/World Storage/NAME.asset b/Assets/ETSI.ARF/ARF World Storage API/World Storage/NAME.asset new file mode 100644 index 0000000..ad2e641 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/World Storage/NAME.asset @@ -0,0 +1,17 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8a1e3e7961eae84468e6ee20d5b09ffd, type: 3} + m_Name: NAME + m_EditorClassIdentifier: + userName: NAME + company: HHI + UUID: 5090fd9f-64bf-4e06-843f-26aaf2eb8e40 diff --git a/Assets/ETSI.ARF/ARF World Storage API/World Storage/NAME.asset.meta b/Assets/ETSI.ARF/ARF World Storage API/World Storage/NAME.asset.meta new file mode 100644 index 0000000..08ca9e2 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/World Storage/NAME.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 748585a50399fd64883147cd731ae0b7 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/ETSI.ARF/ARF World Storage API/World Storage/TEST.asset b/Assets/ETSI.ARF/ARF World Storage API/World Storage/TEST.asset new file mode 100644 index 0000000..4746e88 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/World Storage/TEST.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e4b7be4c33f68d0418c3b4e1a7053d91, type: 3} + m_Name: TEST + m_EditorClassIdentifier: + serverName: HHI + company: + basePath: http://172.17.132.19 + port: 8080 + currentUser: {fileID: 11400000, guid: 748585a50399fd64883147cd731ae0b7, type: 2} diff --git a/Assets/ETSI.ARF/ARF World Storage API/World Storage/TEST.asset.meta b/Assets/ETSI.ARF/ARF World Storage API/World Storage/TEST.asset.meta new file mode 100644 index 0000000..63dfdf3 --- /dev/null +++ b/Assets/ETSI.ARF/ARF World Storage API/World Storage/TEST.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 43336abb94a86b84cbb89e4a607dc12d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TextMesh Pro.meta b/Assets/TextMesh Pro.meta new file mode 100644 index 0000000..f9da8b5 --- /dev/null +++ b/Assets/TextMesh Pro.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f54d1bd14bd3ca042bd867b519fee8cc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TextMesh Pro/Documentation.meta b/Assets/TextMesh Pro/Documentation.meta new file mode 100644 index 0000000..afa527a --- /dev/null +++ b/Assets/TextMesh Pro/Documentation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8e7e8f5a82a3a134e91c54efd2274ea9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf b/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c2ea2d278785aa03d590f89fabdb0f30ad0976e9 GIT binary patch literal 694398 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 E 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

Phf_!`cm)mjg@=!xv_%(czrwmNh&_ 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