From a89f01351f9ee4d79de4b750235f6c6d0ca2e790 Mon Sep 17 00:00:00 2001
From: Santiago Lo Coco <se23m504@technikum-wien.at>
Date: Thu, 7 Nov 2024 23:40:38 +0100
Subject: [PATCH] Add center speech command

---
 .../MixedRealitySpeechCommandsProfile.asset   | 14 ++++-----
 Assets/Scenes/WebView.unity                   | 28 +++++++++++++++++
 Assets/Scripts/ConfigureOrbital.cs            | 31 +++++++++++++++++++
 3 files changed, 66 insertions(+), 7 deletions(-)

diff --git a/Assets/MixedRealityToolkit.Generated/CustomProfiles/MixedRealitySpeechCommandsProfile.asset b/Assets/MixedRealityToolkit.Generated/CustomProfiles/MixedRealitySpeechCommandsProfile.asset
index 6560884..d51e3b9 100644
--- a/Assets/MixedRealityToolkit.Generated/CustomProfiles/MixedRealitySpeechCommandsProfile.asset
+++ b/Assets/MixedRealityToolkit.Generated/CustomProfiles/MixedRealitySpeechCommandsProfile.asset
@@ -60,13 +60,13 @@ MonoBehaviour:
       axisConstraint: 0
   - localizationKey: 
     keyword: Rotate
-    keyCode: 273
-    action:
-      id: 0
-      description: None
-      axisConstraint: 0
-  - localizationKey: 
-    keyword: Unfollow
+    keyCode: 0
+    action:
+      id: 0
+      description: None
+      axisConstraint: 0
+  - localizationKey: 
+    keyword: Center
     keyCode: 0
     action:
       id: 0
diff --git a/Assets/Scenes/WebView.unity b/Assets/Scenes/WebView.unity
index dad5b17..ec05ba6 100644
--- a/Assets/Scenes/WebView.unity
+++ b/Assets/Scenes/WebView.unity
@@ -7681,6 +7681,34 @@ MonoBehaviour:
             m_StringArgument: 
             m_BoolArgument: 0
           m_CallState: 2
+  - keyword: Center
+    response:
+      m_PersistentCalls:
+        m_Calls:
+        - m_Target: {fileID: 1193822414}
+          m_TargetAssemblyTypeName: ConfigureOrbital, Assembly-CSharp
+          m_MethodName: CenterCanvasesToUser
+          m_Mode: 1
+          m_Arguments:
+            m_ObjectArgument: {fileID: 0}
+            m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+            m_IntArgument: 0
+            m_FloatArgument: 0
+            m_StringArgument: 
+            m_BoolArgument: 0
+          m_CallState: 2
+        - m_Target: {fileID: 2018722013}
+          m_TargetAssemblyTypeName: UnityEngine.AudioSource, UnityEngine
+          m_MethodName: PlayOneShot
+          m_Mode: 2
+          m_Arguments:
+            m_ObjectArgument: {fileID: 8300000, guid: 4075162bd7e8d9b4387ba77aeb751a0d, type: 3}
+            m_ObjectArgumentAssemblyTypeName: UnityEngine.AudioClip, UnityEngine
+            m_IntArgument: 0
+            m_FloatArgument: 0
+            m_StringArgument: 
+            m_BoolArgument: 0
+          m_CallState: 2
   persistentKeywords: 0
   speechConfirmationTooltipPrefab: {fileID: 8046114618238072051, guid: 271778f6c957b524981067a81d238394, type: 3}
 --- !u!82 &2018722013
diff --git a/Assets/Scripts/ConfigureOrbital.cs b/Assets/Scripts/ConfigureOrbital.cs
index c969f50..8475d06 100644
--- a/Assets/Scripts/ConfigureOrbital.cs
+++ b/Assets/Scripts/ConfigureOrbital.cs
@@ -55,4 +55,35 @@ public class ConfigureOrbital : MonoBehaviour
             canvas.transform.rotation = Quaternion.LookRotation(directionToCamera);
         }
     }
+
+    public void CenterCanvasesToUser()
+    {
+        List<GameObject> canvases = endpointLoader.GetInstantiatedItems();
+
+        Vector3 localOffset = new Vector3(-0.4f, 0.1f, 1f);
+
+        foreach (GameObject canvas in canvases)
+        {
+            Transform cameraTransform = Camera.main.transform;
+
+            canvas.transform.position = cameraTransform.position + cameraTransform.TransformDirection(localOffset);
+            // canvas.transform.rotation = Quaternion.LookRotation(canvas.transform.position - cameraTransform.position);
+            // canvas.transform.rotation = Quaternion.LookRotation(-cameraTransform.position);
+            // canvas.transform.rotation = Quaternion.Euler(0, cameraTransform.eulerAngles.y, 0);
+            canvas.transform.rotation = Quaternion.LookRotation(cameraTransform.forward, cameraTransform.up);
+
+            localOffset = new Vector3(localOffset.x + GetItemWidth(canvas), localOffset.y, localOffset.z);
+        }
+    }
+
+    private float GetItemWidth(GameObject item)
+    {
+        RectTransform rectTransform = item.GetComponent<RectTransform>();
+        if (rectTransform != null)
+        {
+            return rectTransform.rect.width * rectTransform.lossyScale.x + 0.2f;
+        }
+
+        return 0.8f;
+    }
 }