From d1d984f8a397955de23a92c3381f9ec79908b1bc Mon Sep 17 00:00:00 2001
From: "bocska.karina" <bocska.karina@hallgato.ppke.hu>
Date: Tue, 12 Nov 2024 14:06:47 +0100
Subject: [PATCH] use threading for point searching

---
 Assets/Scenes/SampleScene.unity               | 32 ++++----
 .../Controllers/SelectPointsController.cs     | 78 +++++++++++++------
 Assets/Scrips/Events/SpawnBlockEvent.cs       | 12 +--
 Assets/mesh.obj                               | 62 +++++++--------
 4 files changed, 106 insertions(+), 78 deletions(-)

diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity
index 5e0d37a..d0ef86e 100644
--- a/Assets/Scenes/SampleScene.unity
+++ b/Assets/Scenes/SampleScene.unity
@@ -4190,7 +4190,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 919132149155446097, guid: cbd9713bd330c064b8c327427eb068e1, type: 3}
       propertyPath: m_IsActive
-      value: 1
+      value: 0
       objectReference: {fileID: 0}
     m_RemovedComponents: []
     m_RemovedGameObjects: []
@@ -13258,11 +13258,11 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 4704240697808797663, guid: 048249d9a15aa3c459399751e860bde7, type: 3}
       propertyPath: m_SizeDelta.x
-      value: 0
+      value: 119.91
       objectReference: {fileID: 0}
     - target: {fileID: 4704240697808797663, guid: 048249d9a15aa3c459399751e860bde7, type: 3}
       propertyPath: m_SizeDelta.y
-      value: 0
+      value: 46
       objectReference: {fileID: 0}
     - target: {fileID: 4704240698125147208, guid: 048249d9a15aa3c459399751e860bde7, type: 3}
       propertyPath: m_text
@@ -13270,23 +13270,23 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 4704240698125147210, guid: 048249d9a15aa3c459399751e860bde7, type: 3}
       propertyPath: m_AnchorMax.y
-      value: 0
+      value: 1
       objectReference: {fileID: 0}
     - target: {fileID: 4704240698125147210, guid: 048249d9a15aa3c459399751e860bde7, type: 3}
       propertyPath: m_AnchorMin.y
-      value: 0
+      value: 1
       objectReference: {fileID: 0}
     - target: {fileID: 4704240698125147210, guid: 048249d9a15aa3c459399751e860bde7, type: 3}
       propertyPath: m_SizeDelta.x
-      value: 0
+      value: 91.91
       objectReference: {fileID: 0}
     - target: {fileID: 4704240698125147210, guid: 048249d9a15aa3c459399751e860bde7, type: 3}
       propertyPath: m_AnchoredPosition.x
-      value: 0
+      value: 59.955
       objectReference: {fileID: 0}
     - target: {fileID: 4704240698125147210, guid: 048249d9a15aa3c459399751e860bde7, type: 3}
       propertyPath: m_AnchoredPosition.y
-      value: 0
+      value: -23
       objectReference: {fileID: 0}
     - target: {fileID: 5043647495600119106, guid: 048249d9a15aa3c459399751e860bde7, type: 3}
       propertyPath: m_Layer
@@ -13310,7 +13310,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 7785151267686525225, guid: 048249d9a15aa3c459399751e860bde7, type: 3}
       propertyPath: m_IsActive
-      value: 1
+      value: 0
       objectReference: {fileID: 0}
     - target: {fileID: 7785151267686525226, guid: 048249d9a15aa3c459399751e860bde7, type: 3}
       propertyPath: m_RootOrder
@@ -21778,7 +21778,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 1984668758913251958, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3}
       propertyPath: m_AnchoredPosition.x
-      value: 0
+      value: 44.7
       objectReference: {fileID: 0}
     - target: {fileID: 1984668758913251958, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3}
       propertyPath: m_AnchoredPosition.y
@@ -21810,7 +21810,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 1984668759388320319, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3}
       propertyPath: m_AnchoredPosition.x
-      value: 0
+      value: 40
       objectReference: {fileID: 0}
     - target: {fileID: 1984668759388320319, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3}
       propertyPath: m_AnchoredPosition.y
@@ -21846,7 +21846,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 1984668759906836222, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3}
       propertyPath: m_AnchoredPosition.x
-      value: 0
+      value: 40
       objectReference: {fileID: 0}
     - target: {fileID: 1984668759906836222, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3}
       propertyPath: m_AnchoredPosition.y
@@ -21870,7 +21870,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 1984668759991436502, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3}
       propertyPath: m_AnchoredPosition.x
-      value: 0
+      value: 40
       objectReference: {fileID: 0}
     - target: {fileID: 1984668759991436502, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3}
       propertyPath: m_AnchoredPosition.y
@@ -21906,7 +21906,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 1984668760453204319, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3}
       propertyPath: m_AnchoredPosition.x
-      value: 0
+      value: 44.7
       objectReference: {fileID: 0}
     - target: {fileID: 1984668760453204319, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3}
       propertyPath: m_AnchoredPosition.y
@@ -21930,7 +21930,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 1984668760497519799, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3}
       propertyPath: m_AnchoredPosition.x
-      value: 0
+      value: 42.510002
       objectReference: {fileID: 0}
     - target: {fileID: 1984668760497519799, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3}
       propertyPath: m_AnchoredPosition.y
@@ -21958,7 +21958,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 1984668760711245992, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3}
       propertyPath: m_AnchoredPosition.x
-      value: 0
+      value: 40
       objectReference: {fileID: 0}
     - target: {fileID: 1984668760711245992, guid: 65eb6b98091a5734ba9d9ca871cef69a, type: 3}
       propertyPath: m_AnchoredPosition.y
diff --git a/Assets/Scrips/Controllers/SelectPointsController.cs b/Assets/Scrips/Controllers/SelectPointsController.cs
index 32344d4..fc839d2 100644
--- a/Assets/Scrips/Controllers/SelectPointsController.cs
+++ b/Assets/Scrips/Controllers/SelectPointsController.cs
@@ -7,6 +7,7 @@ using MathNet.Numerics.LinearAlgebra.Factorization;
 using MathNet.Numerics.LinearAlgebra;
 using Unity.Mathematics;
 using static PointCloudDataReader;
+using System.Threading.Tasks;
 
 public class SelectPointsController : MonoBehaviour
 {
@@ -44,32 +45,64 @@ public class SelectPointsController : MonoBehaviour
 
     private void SelectPointsHandler(InputAction.CallbackContext context)
     {
-        List<Vector3> selectedPoints = new();
-        foreach (GameObject cloud in pointClouds)
+        Vector3[] cloudPositions = new Vector3[pointClouds.Count];
+        Quaternion[] cloudRotations = new Quaternion[pointClouds.Count];
+        List<Point[]> points = new();
+        for (int i = 0; i < pointClouds.Count; i++)
         {
-            Transform cloudTransform = cloud.transform;
-            Point[] points = cloud.GetComponent<PointCloudDataReader>().PointData;
-            for (int i = 0; i < points.Length; i++)
+            cloudPositions[i] = pointClouds[i].transform.position;
+            cloudRotations[i] = pointClouds[i].transform.rotation;
+            points.Add(pointClouds[i].GetComponent<PointCloudDataReader>().PointData);
+        }
+        Bounds[] selectionBounds = new Bounds[_blockSelections.Count];
+        for (int i = 0; i < _blockSelections.Count; i++)
+        {
+            selectionBounds[i] = _blockSelections[i].GetComponent<MeshCollider>().bounds;
+        }
+        _ = FitPlaneToSelectedPointsAsync(cloudPositions, cloudRotations, points, selectionBounds);
+    }
+
+    private async Task FitPlaneToSelectedPointsAsync(Vector3[] cloudPositions, Quaternion[] cloudRotations, List<Point[]> cloudPoints, Bounds[] selectionBounds)
+    {
+        Debug.Log("task");
+        Task<List<Vector3>> task = Task.Run(() =>
+        {
+            Debug.Log("running task");
+            List<Vector3> selectedPoints = new();
+            for (int i1 = 0; i1 < cloudPoints.Count; i1++)
             {
-                Vector3 point = points[i].position;
-                point.x *= -1f;
-                foreach (GameObject blockSelection in _blockSelections)
+                // GameObject cloud = pointClouds[i1];
+                // Transform cloudTransform = cloud.transform;
+                // Point[] points = cloud.GetComponent<PointCloudDataReader>().PointData;
+                Point[] points = cloudPoints[i1];
+                for (int i = 0; i < points.Length; i++)
                 {
-                    MeshCollider collider = blockSelection.GetComponent<MeshCollider>();
-                    Vector3 ptGlobal = cloudTransform.rotation * point + cloudTransform.position;
-                    if (collider.bounds.Contains(ptGlobal))
+                    Vector3 point = points[i].position;
+                    point.x *= -1f;
+                    // foreach (GameObject blockSelection in _blockSelections)
+                    foreach (Bounds bound in selectionBounds)
                     {
-                        selectedPoints.Add(ptGlobal);
+                        // MeshCollider collider = blockSelection.GetComponent<MeshCollider>();
+                        // Vector3 ptGlobal = cloudTransform.rotation * point + cloudTransform.position;
+                        Vector3 ptGlobal = cloudRotations[i1] * point + cloudPositions[i1];
+                        // if (collider.bounds.Contains(ptGlobal))
+                        if (bound.Contains(ptGlobal))
+                        {
+                            selectedPoints.Add(ptGlobal);
+                        }
                     }
                 }
             }
-        }
-        CalculatePlane(selectedPoints);
+            Debug.Log("finished collecting points");
+            return selectedPoints;
+        });
+        CalculatePlane(await task);
     }
 
     // source: https://stackoverflow.com/questions/10900141/fast-plane-fitting-to-many-points
     private void CalculatePlane(List<Vector3> points)
     {
+        Debug.Log("calculating plane");
         if (points.Count < 3)
         {
             Debug.Log("not enough points to calculate plane");
@@ -116,17 +149,18 @@ public class SelectPointsController : MonoBehaviour
         Plane plane = new(planeNormal, -d);
         Debug.Log(plane);
 
-        _debugPoints.Clear();
-        for (int i = 0; i < 200; i++)
-        {
-            Vector3 randomPoint = new(UnityEngine.Random.Range(-8f, 8f), UnityEngine.Random.Range(-8f, 8f), UnityEngine.Random.Range(-8f, 8f));
-            _debugPoints.Add(ProjectPointOntoPlane(plane, randomPoint));
-        }
+        // _debugPoints.Clear();
+        // for (int i = 0; i < 200; i++)
+        // {
+        //     Vector3 randomPoint = new(UnityEngine.Random.Range(-8f, 8f), UnityEngine.Random.Range(-8f, 8f), UnityEngine.Random.Range(-8f, 8f));
+        //     _debugPoints.Add(ProjectPointOntoPlane(plane, randomPoint));
+        // }
 
         Vector<float> colAvg = G.ColumnSums();
         colAvg /= G.RowCount;
         Vector3 pointAvg = new(colAvg[0], colAvg[1], colAvg[2]);
         SpawnPlane(ProjectPointOntoPlane(plane, pointAvg), planeNormal);
+        UIController.Instance.NewStatusMessage("Plane calculation completed.");
     }
 
     public GameObject SpawnPlane(Vector3 pos, Vector3 normal)
@@ -193,8 +227,8 @@ public class SelectPointsController : MonoBehaviour
     {
         // CalculateRealPoints();
         EditState.Instance.RegisterListener(EditChangeHandler);
-        SpawnPlane(new Vector3(0, 0, 0), Vector3.left);
-        SpawnPlane(new Vector3(-1, 0, 0), Vector3.up);
+        // SpawnPlane(new Vector3(0, 0, 0), Vector3.left);
+        // SpawnPlane(new Vector3(-1, 0, 0), Vector3.up);
     }
 
     private void EditChangeHandler()
diff --git a/Assets/Scrips/Events/SpawnBlockEvent.cs b/Assets/Scrips/Events/SpawnBlockEvent.cs
index c73b21c..498d4b7 100644
--- a/Assets/Scrips/Events/SpawnBlockEvent.cs
+++ b/Assets/Scrips/Events/SpawnBlockEvent.cs
@@ -77,15 +77,15 @@ public class SpawnBlockEvent : MonoBehaviour
     // Start is called before the first frame update
     void Start()
     {
-        GameObject spawnedObject = Instantiate(spawnPrefab, new Vector3(-1.65f, 0.46f, -4.93f), Quaternion.identity);
-        Collider objectCollider = spawnedObject.GetComponent<Collider>();
-        Vector3 adjustment = Vector3.Scale(this.transform.up, objectCollider.bounds.size / 2);
-        spawnedObject.transform.position += adjustment;
-        spawnedObject.transform.parent = this.transform;
+        // GameObject spawnedObject = Instantiate(spawnPrefab, new Vector3(-1.65f, 0.46f, -4.93f), Quaternion.identity);
+        // Collider objectCollider = spawnedObject.GetComponent<Collider>();
+        // Vector3 adjustment = Vector3.Scale(this.transform.up, objectCollider.bounds.size / 2);
+        // spawnedObject.transform.position += adjustment;
+        // spawnedObject.transform.parent = this.transform;
 
         // _selectPointsController.AddSelection(spawnedObject);
         // spawnedObject.GetComponent<BlockSelect>().selectPointsController = _selectPointsController;
-        ProgramController.Instance.RegisterBlock(spawnedObject);
+        // ProgramController.Instance.RegisterBlock(spawnedObject);
     }
 
 }
diff --git a/Assets/mesh.obj b/Assets/mesh.obj
index c8b90c0..a2ebe60 100644
--- a/Assets/mesh.obj
+++ b/Assets/mesh.obj
@@ -1,27 +1,27 @@
-v -1.15 0.46 -4.43
-v -2.15 0.46 -4.43
-v -1.15 1.46 -4.43
-v -2.15 1.46 -4.43
-v -1.15 1.46 -5.43
-v -2.15 1.46 -5.43
-v -1.15 0.46 -5.43
-v -2.15 0.46 -5.43
-v -1.15 1.46 -4.43
-v -2.15 1.46 -4.43
-v -1.15 1.46 -5.43
-v -2.15 1.46 -5.43
-v -1.15 0.46 -5.43
-v -1.15 0.46 -4.43
-v -2.15 0.46 -4.43
-v -2.15 0.46 -5.43
-v -2.15 0.46 -4.43
-v -2.15 1.46 -4.43
-v -2.15 1.46 -5.43
-v -2.15 0.46 -5.43
-v -1.15 0.46 -5.43
-v -1.15 1.46 -5.43
-v -1.15 1.46 -4.43
-v -1.15 0.46 -4.43
+v 4.790933 0.0005001426 3.249483
+v 4.190578 0.0005001426 3.249483
+v 4.790933 5.129273 3.249483
+v 4.190578 5.129273 3.249483
+v 4.790933 5.129273 2.379545
+v 4.190578 5.129273 2.379545
+v 4.790933 0.0005001426 2.379545
+v 4.190578 0.0005001426 2.379545
+v 4.790933 5.129273 3.249483
+v 4.190578 5.129273 3.249483
+v 4.790933 5.129273 2.379545
+v 4.190578 5.129273 2.379545
+v 4.790933 0.0005001426 2.379545
+v 4.790933 0.0005001426 3.249483
+v 4.190578 0.0005001426 3.249483
+v 4.190578 0.0005001426 2.379545
+v 4.190578 0.0005001426 3.249483
+v 4.190578 5.129273 3.249483
+v 4.190578 5.129273 2.379545
+v 4.190578 0.0005001426 2.379545
+v 4.790933 0.0005001426 2.379545
+v 4.790933 5.129273 2.379545
+v 4.790933 5.129273 3.249483
+v 4.790933 0.0005001426 3.249483
 f 1 3 4
 f 1 4 2
 f 9 5 6
@@ -34,15 +34,9 @@ f 17 18 19
 f 17 19 20
 f 21 22 23
 f 21 23 24
-v 5.960464E-08 -0.5 -0.5000001
-v -5.960464E-08 -0.5 0.5000001
-v 5.960464E-08 0.5 -0.5000001
-v -5.960464E-08 0.5 0.5000001
+v 5.100156 -0.02601445 14.33806
+v 7.014131 0.03212595 14.30453
+v 5.094431 2.09043 14.34149
+v 6.875519 2.140711 14.31028
 f 25 28 26
 f 28 25 27
-v -1.5 5.960464E-08 0.5000001
-v -0.5 5.960464E-08 0.5000001
-v -1.5 -5.960464E-08 -0.5000001
-v -0.5 -5.960464E-08 -0.5000001
-f 29 32 30
-f 32 29 31
-- 
GitLab