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