From bacdce81a54abd3b6dad0914041bcaac4474b4d9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tobias=20Sch=C3=B6ner?= <tobias.stonehead@gmail.com>
Date: Fri, 10 Jun 2022 14:13:27 +0200
Subject: [PATCH] Added snapping to circle

---
 .../Scripts/InteractionEngine/WorldCursor.cs  | 25 ++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/Assets/Scripts/InteractionEngine/WorldCursor.cs b/Assets/Scripts/InteractionEngine/WorldCursor.cs
index 659b0f45..742bb160 100644
--- a/Assets/Scripts/InteractionEngine/WorldCursor.cs
+++ b/Assets/Scripts/InteractionEngine/WorldCursor.cs
@@ -166,7 +166,6 @@ void Update()
             else if (multipleHits[i].collider.gameObject.layer == LayerMask.NameToLayer("Ring"))
             {
                 #region Ring
-                Debug.Log("PRINT");
                 var id = multipleHits[i].transform.GetComponent<FactObject>().URI;
                 CircleFact circleFact = StageStatic.stage.factState[id] as CircleFact;
                 Vector3 middlePoint = ((PointFact)StageStatic.stage.factState[circleFact.Pid1]).Point;
@@ -192,6 +191,7 @@ void Update()
                     var direction = (pPlane - middlePoint).normalized;
                     multipleHits[i].point = middlePoint + direction * radius;
                 }
+
                 // cursor orientation should match circle orientation; dont face downwards
                 if (normal.y < 0) // if normal faces downwards use inverted normal instead
                     multipleHits[i].normal = -normal;
@@ -199,6 +199,29 @@ void Update()
                     multipleHits[i].normal = normal;
                 #endregion Ring
             }
+            else if (multipleHits[i].collider.gameObject.layer == LayerMask.NameToLayer("Circle"))
+            {
+                #region Circle
+                var id = multipleHits[i].transform.GetComponent<FactObject>().URI;
+                CircleFact circleFact = StageStatic.stage.factState[id] as CircleFact;
+                Vector3 middlePoint = ((PointFact)StageStatic.stage.factState[circleFact.Pid1]).Point;
+                Vector3 edgePoint = ((PointFact)StageStatic.stage.factState[circleFact.Pid2]).Point;
+                var normal = circleFact.normal;
+                var radius = circleFact.radius;
+
+                // project p on circlePlane
+                var q = multipleHits[i].point - middlePoint;
+                var dist = Vector3.Dot(q, normal);
+                var pPlane = multipleHits[i].point - (normal * dist); // p on circlePlane
+                multipleHits[i].point = pPlane;
+
+                // cursor orientation should match circle orientation; dont face downwards
+                if (normal.y < 0) // if normal faces downwards use inverted normal instead
+                    multipleHits[i].normal = -normal;
+                else
+                    multipleHits[i].normal = normal;
+                #endregion Circle
+            }
             else
             {
                 multipleHits[i].point = multipleHits[i].collider.transform.position;
-- 
GitLab