From fe9328a8f6218548ad6b4f494438c8dca5eddf74 Mon Sep 17 00:00:00 2001 From: unknown <john.schihada@hotmail.com> Date: Sun, 15 Dec 2019 20:10:47 +0100 Subject: [PATCH] Refactoring completed --- Assets/FactManager.cs | 217 ++++++++---------- .../InteractionEngine/CommunicationEvents.cs | 26 ++- Assets/InteractionEngine/Fact.cs | 5 +- Assets/InteractionEngine/FactSpawner.cs | 13 +- Assets/InteractionEngine/ShinyThings.cs | 67 +++--- Assets/InteractionEngine/WorldCursor.cs | 25 +- 6 files changed, 177 insertions(+), 176 deletions(-) diff --git a/Assets/FactManager.cs b/Assets/FactManager.cs index 5f7d12e8..2d8a685f 100644 --- a/Assets/FactManager.cs +++ b/Assets/FactManager.cs @@ -5,57 +5,68 @@ using static CommunicationEvents; public class FactManager : MonoBehaviour { - - - public GameObject SmartMenu; private Stack<int> NextEmptyStack = new Stack<int>(); + //Variable for LineMode distinction + public bool lineModeFirstPointSelected = false; + public Fact firstPointSelected = null; + // Start is called before the first frame update void Start() { CommunicationEvents.ToolModeChangedEvent.AddListener(OnToolModeChanged); CommunicationEvents.TriggerEvent.AddListener(OnHit); - CommunicationEvents.RemoveFactEvent.AddListener(DeleteFact);//we also need the listener here at the moment so we can react to UI delete events + //We also need the listener here at the moment so we can react to UI delete events in ExtraMode -> Delete-Button + CommunicationEvents.RemoveFactEvent.AddListener(DeleteFact); NextEmptyStack.Push(0); } + // Update is called once per frame + void Update() + { + + } - void AddLineFact(int pid1, int pid2, int id) + PointFact AddPointFact(RaycastHit hit, int id) { - Facts.Insert(id, new LineFact + + Facts.Insert(id, new PointFact { Id = id, - Pid1 = pid1, - Pid2 = pid2 + Point = hit.point, + Normal = hit.normal }); + + return Facts[id] as PointFact; } - void AddAngleFact(int pid1, int pid2, int pid3, int id) + LineFact AddLineFact(int pid1, int pid2, int id) { - Facts.Insert(id, new AngleFact + Facts.Insert(id, new LineFact { Id = id, Pid1 = pid1, - Pid2 = pid2, - Pid3 = pid3 + Pid2 = pid2 }); - } + return Facts[id] as LineFact; + } - PointFact AddPointFact(RaycastHit hit, int id) + AngleFact AddAngleFact(int pid1, int pid2, int pid3, int id) { - - Facts.Insert(id, new PointFact + Facts.Insert(id, new AngleFact { Id = id, - Point = hit.point + Pid1 = pid1, + Pid2 = pid2, + Pid3 = pid3 }); - return Facts[id] as PointFact; + return Facts[id] as AngleFact; } void DeleteFact(Fact fact) @@ -63,78 +74,9 @@ void DeleteFact(Fact fact) NextEmptyStack.Push(fact.Id); Facts.RemoveAt(fact.Id); + CommunicationEvents.RemoveFactEvent.Invoke(fact); } - - // Update is called once per frame - void Update() - { - - - //Je nachdem ob erster oder der zweite Punkt angeklickt wurde behandeln - - //Wenn erster Punkt einen Point-Collider erwischt hat: - //Linie aktivieren und Cursor folgen - //Wenn erster Punkt keinen Point-Collider erwischt hat: - //Nichts tun -> Evtl Hint einblenden - - //Wenn zweiter Punkt einen Point-Collider erwischt hat: - //Event senden um GameObject-Line zu erzeugen - //Wenn zweiter Punkt keinen Point-Collider erwischt hat: - //Linie deaktivieren -> Evtl Hint einblenden - - //LayerMask for Points - int layerMask = 1 << LayerMask.NameToLayer("Point"); //only hit Point - /* - //Wenn bereits der erste Punkt markiert wurde - if (this.lineRendererActivated) //instead: bool variable.... - { - //If a second Point was Hit - if (Physics.Raycast(ray, out Hit, 30f, layerMask)) //instead: another hitevent, refer to OnHit - { - //Event for Creating the Line - Vector3 point1 = this.linePositions[0]; - Vector3 point2 = Hit.transform.gameObject.transform.position; - this.DeactivateLineRenderer(); - CommunicationEvents.AddLineEvent.Invoke(point1, point2); - break; - } - //If no Point was hit - else - { - //TODO: Hint that only a line can be drawn between already existing points - this.DeactivateLineRenderer(); - } - } - //Wenn der erste Punkt noch nicht markiert wurde - else - { - //Check if a Point was hit - if (Physics.Raycast(ray, out Hit, 30f, layerMask)) - { - //Set LineRenderer activated - this.lineRendererActivated = true; - //Add the position of the hit Point for the start of the Line - Vector3 temp = Hit.transform.gameObject.transform.position; - //temp += Vector3.up; - - linePositions.Add(temp); - //The second point is the same point at the moment - linePositions.Add(temp); - this.lineRenderer.SetPosition(0, linePositions[0]); - this.lineRenderer.SetPosition(1, linePositions[1]); - } - else - { - //TODO: Hint that only a line can be drawn between already existing points - } - } - - */ - - } - - public int GetFirstEmptyID() { @@ -157,6 +99,7 @@ public int GetFirstEmptyID() public void OnToolModeChanged(ToolMode ActiveToolMode) { + switch (ActiveToolMode) { case ToolMode.MarkPointMode: @@ -210,45 +153,89 @@ public void OnToolModeChanged(ToolMode ActiveToolMode) } break; case ToolMode.ExtraMode: - foreach (Fact fact in Facts) + /*foreach (Fact fact in Facts) { } + */ break; - - - } } public void OnHit(RaycastHit hit) { - Debug.Log(CommunicationEvents.ActiveToolMode); - if (hit.transform.gameObject.layer == LayerMask.NameToLayer("Point")) - { - //hit existing point, so delete it - if (CommunicationEvents.ActiveToolMode == ToolMode.ExtraMode) - { - var menu = GameObject.Instantiate(SmartMenu); - menu.GetComponent<Canvas>().worldCamera = Camera.main; - menu.transform.SetParent(hit.transform); - menu.transform.localPosition = Vector3.up - Camera.main.transform.forward; - } - else - { - char letter = hit.transform.gameObject.GetComponentInChildren<TextMeshPro>().text.ToCharArray()[0]; - int id = letter - 65; - CommunicationEvents.RemoveFactEvent.Invoke(Facts[id]); - } - } - else + switch (ActiveToolMode) { - PointFact fact = AddPointFact(hit, GetFirstEmptyID()); - CommunicationEvents.AddFactEvent.Invoke(fact); - } - } + //If Left-Mouse-Button was pressed in MarkPointMode + case ToolMode.MarkPointMode: + CommunicationEvents.AddFactEvent.Invoke(this.AddPointFact(hit, this.GetFirstEmptyID())); + break; + //If Left-Mouse-Button was pressed in CreateLineMode + case ToolMode.CreateLineMode: + //Check if an existing Point was hit + if (hit.transform.gameObject.layer == LayerMask.NameToLayer("Point")) + { + Fact tempFact = Facts[hit.transform.GetComponent<FactObject>().Id]; + if (this.lineModeFirstPointSelected) + { + //Event for end of line-rendering in "ShinyThings" + CommunicationEvents.StopLineRendererEvent.Invoke(null); + //Create LineFact + CommunicationEvents.AddFactEvent.Invoke(this.AddLineFact(this.firstPointSelected.Id, tempFact.Id, this.GetFirstEmptyID())); + this.lineModeFirstPointSelected = false; + this.firstPointSelected = null; + } + else { + //Activate LineRenderer for preview + this.lineModeFirstPointSelected = true; + this.firstPointSelected = tempFact; + //Event for start line-rendering in "ShinyThings" + CommunicationEvents.StartLineRendererEvent.Invoke(this.firstPointSelected); + } + } + //If no Point was hit + else { + if (this.lineModeFirstPointSelected) + { + //Deactivate LineRendering and first point selection + this.lineModeFirstPointSelected = false; + this.firstPointSelected = null; + //Event for end of line-rendering in "ShinyThings" + CommunicationEvents.StopLineRendererEvent.Invoke(null); + } + //TODO: Hint that only a line can be drawn between already existing points + } + break; + //If Left-Mouse-Button was pressed in CreateAngleMode + case ToolMode.CreateAngleMode: + break; + //If Left-Mouse-Button was pressed in DeleteMode + case ToolMode.DeleteMode: + //Search for the Fact that was hit + //If the hit GameObject was a Point/Line/Angle + if (hit.transform.gameObject.layer == LayerMask.NameToLayer("Point") || hit.transform.gameObject.layer == LayerMask.NameToLayer("Line") || hit.transform.gameObject.layer == LayerMask.NameToLayer("Angle")){ + //Search for the suitable fact from the List + this.DeleteFact(Facts[hit.transform.GetComponent<FactObject>().Id]); + } + break; + //If Left-Mouse-Button was pressed in ExtraMode + case ToolMode.ExtraMode: + if (hit.transform.gameObject.layer == LayerMask.NameToLayer("Point")) { + var menu = GameObject.Instantiate(SmartMenu); + menu.GetComponent<Canvas>().worldCamera = Camera.main; + menu.transform.SetParent(hit.transform); + menu.transform.localPosition = Vector3.up - Camera.main.transform.forward; + } + else + { + PointFact fact = AddPointFact(hit, GetFirstEmptyID()); + CommunicationEvents.AddFactEvent.Invoke(fact); + } + break; + } + } } diff --git a/Assets/InteractionEngine/CommunicationEvents.cs b/Assets/InteractionEngine/CommunicationEvents.cs index 717e0732..b5cdd342 100644 --- a/Assets/InteractionEngine/CommunicationEvents.cs +++ b/Assets/InteractionEngine/CommunicationEvents.cs @@ -29,9 +29,6 @@ public class FactEvent : UnityEvent<Fact> { } - - - public class MouseOverFactEvent : UnityEvent<Transform> { @@ -41,6 +38,13 @@ public class ToolModeEvent : UnityEvent<ToolMode> { } + public class ShinyEvent : UnityEvent<Fact> { + + } + + + + public static HitEvent TriggerEvent = new HitEvent(); public static ToolModeEvent ToolModeChangedEvent = new ToolModeEvent(); @@ -52,11 +56,21 @@ public class ToolModeEvent : UnityEvent<ToolMode> { public static FactEvent AddFactEvent = new FactEvent(); public static FactEvent RemoveFactEvent = new FactEvent(); + //public static MouseOverFactEvent HighlightEvent = new MouseOverFactEvent(); + //public static MouseOverFactEvent EndHighlightEvent = new MouseOverFactEvent(); + + public static ShinyEvent StartLineRendererEvent = new ShinyEvent(); + public static ShinyEvent StopLineRendererEvent = new ShinyEvent(); + + + + + //------------------------------------------------------------------------------------ + //-------------------------------Global Variables------------------------------------- + //Global ActiveToolMode public static ToolMode ActiveToolMode { get; set; } + //Global List of Facts public static List<Fact> Facts = new List<Fact>(); - // public static MouseOverFactEvent HighlightEvent = new MouseOverFactEvent(); - //public static MouseOverFactEvent EndHighlightEvent = new MouseOverFactEvent(); - } diff --git a/Assets/InteractionEngine/Fact.cs b/Assets/InteractionEngine/Fact.cs index c3434a99..b0733931 100644 --- a/Assets/InteractionEngine/Fact.cs +++ b/Assets/InteractionEngine/Fact.cs @@ -1,6 +1,6 @@ using UnityEngine; -public class Fact +public abstract class Fact { public int Id; public GameObject Representation; @@ -14,14 +14,17 @@ public class PointFact : Fact } public class LineFact : Fact { + //Id's of the 2 Point-Facts that are connected public int Pid1, Pid2; } public class AngleFact : Fact { + //Id's of the 3 Point-Facts, where Pid2 is the point, where the angle is public int Pid1, Pid2, Pid3; } public class OnLineFact : Fact { + //Id's of the 3 Point-Facs that are on one line public int Pid1, Pid2, Pid3; } diff --git a/Assets/InteractionEngine/FactSpawner.cs b/Assets/InteractionEngine/FactSpawner.cs index dde6a215..e92eb9ec 100644 --- a/Assets/InteractionEngine/FactSpawner.cs +++ b/Assets/InteractionEngine/FactSpawner.cs @@ -38,18 +38,16 @@ public void FactAction(Fact fact) public void SpawnPoint(PointFact fact) { - - PointFact pointFact = fact; this.FactRepresentation = (GameObject)Resources.Load("Prefabs/Sphere", typeof(GameObject)); GameObject point = GameObject.Instantiate(FactRepresentation); - point.transform.position = pointFact.Point; - point.transform.up = pointFact.Normal; + point.transform.position = fact.Point; + point.transform.up = fact.Normal; string letter = ((Char)(64+fact.Id+1)).ToString(); point.GetComponentInChildren<TextMeshPro>().text = letter; point.GetComponent<FactObject>().Id = fact.Id; - pointFact.Representation = point; + fact.Representation = point; //If a new Point was spawned -> We are in MarkPointMode -> Then we want the collider to be disabled //Hint: Thats why by now, if we mark a Point in an other mode than MarkPointMode, the @@ -63,14 +61,13 @@ public void SpawnPoint(PointFact fact) public void DeleteObject(Fact fact) { Debug.Log("delete obj"); - GameObject point = fact.Representation; - GameObject.Destroy(point); + GameObject factRepresentation = fact.Representation; + GameObject.Destroy(factRepresentation); } public void SpawnLine(LineFact lineFact) { - Vector3 point1 = (Facts[lineFact.Pid1] as PointFact).Point; Vector3 point2 = (Facts[lineFact.Pid2] as PointFact).Point; //Change FactRepresentation to Line diff --git a/Assets/InteractionEngine/ShinyThings.cs b/Assets/InteractionEngine/ShinyThings.cs index 95e15361..19b64a2b 100644 --- a/Assets/InteractionEngine/ShinyThings.cs +++ b/Assets/InteractionEngine/ShinyThings.cs @@ -17,18 +17,17 @@ public class ShinyThings : MonoBehaviour public LineRenderer lineRenderer; private List<Vector3> linePositions = new List<Vector3>(); private bool lineRendererActivated; - //Visual helpers // Start is called before the first frame update - void Start() + public void Start() { if(Cursor == null)Cursor = GetComponent<WorldCursor>(); - // CommunicationEvents.HighlightEvent.AddListener(OnMouseOverFact); - // CommunicationEvents.EndHighlightEvent.AddListener(OnMouseOverFactEnd); + CommunicationEvents.StartLineRendererEvent.AddListener(ActivateLineRenderer); + CommunicationEvents.StopLineRendererEvent.AddListener(DeactivateLineRenderer); } // Update is called once per frame - void Update() + public void Update() { //SELECTION-HIGHLIGHTING-PART //Check if a Fact was Hit @@ -57,12 +56,27 @@ void Update() OnMouseOverFact(lastFactSelection); } //SELECTION-HIGHLIGHTING-PART-END + + //LineRendering-Part + if (this.lineRendererActivated) + UpdateLineRenderer(Hit.point); } } - + public void OnMouseOverFact(Transform selection) + { + Renderer selectionRenderer; + + selectionRenderer = selection.GetComponent<Renderer>(); + if (selectionRenderer != null) + { + //Set the Material of the Fact, where the mouse is over, to a special one + selectionRenderer.material = highlightMaterial; + } + } + public void OnMouseOverFactEnd(Transform selection) { Renderer selectionRenderer; @@ -78,20 +92,28 @@ public void OnMouseOverFactEnd(Transform selection) } } - public void OnMouseOverFact(Transform selection) - { - Renderer selectionRenderer; + public void ActivateLineRenderer(Fact startFact) { + //Set LineRenderer activated + this.lineRendererActivated = true; + //Add the position of the Fact for the start of the Line + linePositions.Add(startFact.Representation.transform.position); + //The second point is the same point at the moment + linePositions.Add(startFact.Representation.transform.position); + + this.lineRenderer.SetPosition(0, linePositions[0]); + this.lineRenderer.SetPosition(1, linePositions[1]); - selectionRenderer = selection.GetComponent<Renderer>(); - if (selectionRenderer != null) - { - //Set the Material of the Fact, where the mouse is over, to a special one - selectionRenderer.material = highlightMaterial; - } } + //Updates the second-point of the Line when First Point was selected in LineMode + public void UpdateLineRenderer(Vector3 currentPosition) + { + this.linePositions[1] = currentPosition; + this.lineRenderer.SetPosition(1, this.linePositions[1]); + } - void DeactivateLineRenderer() + //Deactivate LineRenderer so that no Line gets drawn when Cursor changes + public void DeactivateLineRenderer(Fact startFact) { //Reset the first points this.lineRenderer.SetPosition(0, Vector3.zero); @@ -100,17 +122,4 @@ void DeactivateLineRenderer() this.linePositions.Clear(); this.lineRendererActivated = false; } - //Updates the second-point of the Line when First Point was selected in LineMode - void UpdateLineRenderer(Vector3 currentPosition) - { - // if (this.ActiveToolMode == ToolMode.CreateLineMode) - { - if (this.lineRendererActivated) - { - this.linePositions[1] = currentPosition; - this.lineRenderer.SetPosition(1, this.linePositions[1]); - } - } - } - } diff --git a/Assets/InteractionEngine/WorldCursor.cs b/Assets/InteractionEngine/WorldCursor.cs index 9c676296..437a3d1c 100644 --- a/Assets/InteractionEngine/WorldCursor.cs +++ b/Assets/InteractionEngine/WorldCursor.cs @@ -4,25 +4,20 @@ using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; +using static CommunicationEvents; public class WorldCursor : MonoBehaviour { public RaycastHit Hit; private Camera Cam; - private ToolMode ActiveToolMode{get; set;} - - void Start() { Cam = Camera.main; //Set MarkPointMode as the default ActiveToolMode - this.ActiveToolMode = ToolMode.ExtraMode;//ToolMode.MarkPointMode; - CommunicationEvents.ToolModeChangedEvent.Invoke(this.ActiveToolMode); - //TODO: we probably can configure these things to automatically trigger when the variable is changed... - CommunicationEvents.ActiveToolMode = this.ActiveToolMode; - //redundant for now, but we probably want to have the activetool mode available globally + ActiveToolMode = ToolMode.ExtraMode;//ToolMode.MarkPointMode; + CommunicationEvents.ToolModeChangedEvent.Invoke(ActiveToolMode); } // Update is called once per frame @@ -55,9 +50,6 @@ void Update() } - //Deactivate LineRenderer so that no Line gets drawn when Cursor changes - - //Check if left Mouse-Button was pressed and handle it void CheckMouseButtons(Ray ray) { @@ -71,20 +63,19 @@ void CheckMouseButtons(Ray ray) } } - + //Checks if the ToolMode was switched by User, and handle it void CheckToolModeSelection() { if (Input.GetButtonDown("ToolMode")) { //Change the ActiveToolMode dependent on which Mode was selected - if ((int)this.ActiveToolMode == Enum.GetNames(typeof(ToolMode)).Length - 1) + if ((int)ActiveToolMode == Enum.GetNames(typeof(ToolMode)).Length - 1) { - this.ActiveToolMode = 0; + ActiveToolMode = 0; } else { - this.ActiveToolMode++; + ActiveToolMode++; } - CommunicationEvents.ActiveToolMode = this.ActiveToolMode; //Invoke the Handler for the Facts - CommunicationEvents.ToolModeChangedEvent.Invoke(this.ActiveToolMode); + CommunicationEvents.ToolModeChangedEvent.Invoke(ActiveToolMode); } } -- GitLab