Skip to content
Snippets Groups Projects
Commit de96bbb8 authored by John Schihada's avatar John Schihada
Browse files

Refactored AngleTool, adjusted LineTool/Tape

parent b87a7e01
No related branches found
No related tags found
No related merge requests found
...@@ -6,80 +6,186 @@ ...@@ -6,80 +6,186 @@
public class AngleTool : Gadget public class AngleTool : Gadget
{ {
//Variables for AngleMode distinction
private bool angleModeIsFirstPointSelected = false;
private PointFact angleModeFirstPointSelected = null;
private bool angleModeIsSecondPointSelected = false;
private PointFact angleModeSecondPointSelected = null;
//Attributes for simulating the drawing of a curve
private bool curveDrawingActivated;
public WorldCursor Cursor;
public LineRenderer lineRenderer;
private List<Vector3> linePositions = new List<Vector3>();
public Material anglePreviewMaterial;
//Vertices for the Curve
private int curveDrawingVertexCount = 36;
private Vector3 curveEndPoint;
private Vector3 angleMiddlePoint;
private float curveRadius;
//Initialize Gadget when enabled AND activated
void OnEnable()
{
this.ResetGadget();
}
void Start()
{
if (FactManager == null) FactManager = GameObject.FindObjectOfType<FactManager>();
CommunicationEvents.TriggerEvent.AddListener(OnHit);
if (this.Cursor == null) this.Cursor = GameObject.FindObjectOfType<WorldCursor>();
}
public override void OnHit(RaycastHit hit) public override void OnHit(RaycastHit hit)
{ {
if (!this.isActiveAndEnabled) return; if (!this.isActiveAndEnabled) return;
if (hit.transform.gameObject.layer == LayerMask.NameToLayer("Point")) if (hit.transform.gameObject.layer == LayerMask.NameToLayer("Point"))
{ {
Fact tempFact = Facts[hit.transform.GetComponent<FactObject>().Id]; PointFact tempFact = (PointFact)Facts[hit.transform.GetComponent<FactObject>().Id];
//If two points were already selected and now the third point got selected //If two points were already selected and now the third point got selected
if (FactManager.angleModeIsFirstPointSelected && FactManager.angleModeIsSecondPointSelected) if (this.angleModeIsFirstPointSelected && this.angleModeIsSecondPointSelected)
{ {
//Event for end of curve-drawing in "ShinyThings"
CommunicationEvents.StopCurveDrawingEvent.Invoke(null);
//Create AngleFact //Create AngleFact
//Check if new Point is equal to one of the previous points -> if true -> cancel //Check if new Point is equal to one of the previous points -> if true -> cancel
if (!(FactManager.angleModeFirstPointSelected.Id == tempFact.Id || FactManager.angleModeSecondPointSelected.Id == tempFact.Id)) if (!(this.angleModeFirstPointSelected.Id == tempFact.Id || this.angleModeSecondPointSelected.Id == tempFact.Id))
{ {
//Check if exactly the same angle already exists //Check if exactly the same angle already exists
if (!FactManager.factAlreadyExists(new int[] { ((PointFact)FactManager.angleModeFirstPointSelected).Id, ((PointFact)FactManager.angleModeSecondPointSelected).Id, ((PointFact)tempFact).Id })) if (!FactManager.factAlreadyExists(new int[] { ((PointFact)this.angleModeFirstPointSelected).Id, ((PointFact)this.angleModeSecondPointSelected).Id, ((PointFact)tempFact).Id }))
CommunicationEvents.AddFactEvent.Invoke(FactManager.AddAngleFact(((PointFact)FactManager.angleModeFirstPointSelected).Id, ((PointFact)FactManager.angleModeSecondPointSelected).Id, ((PointFact)tempFact).Id, FactManager.GetFirstEmptyID())); CommunicationEvents.AddFactEvent.Invoke(FactManager.AddAngleFact(((PointFact)this.angleModeFirstPointSelected).Id, ((PointFact)this.angleModeSecondPointSelected).Id, ((PointFact)tempFact).Id, FactManager.GetFirstEmptyID()));
} }
FactManager.angleModeIsFirstPointSelected = false; ResetGadget();
FactManager.angleModeFirstPointSelected = null;
FactManager.angleModeIsSecondPointSelected = false;
FactManager.angleModeSecondPointSelected = null;
} }
//If only one point was already selected //If only one point was already selected
else if (FactManager.angleModeIsFirstPointSelected && !FactManager.angleModeIsSecondPointSelected) else if (this.angleModeIsFirstPointSelected && !this.angleModeIsSecondPointSelected)
{ {
//Check if the 2 selected points are the same: If not //Check if the 2 selected points are the same: If not
if (FactManager.angleModeFirstPointSelected.Id != tempFact.Id) if (this.angleModeFirstPointSelected.Id != tempFact.Id)
{ {
FactManager.angleModeIsSecondPointSelected = true; this.angleModeIsSecondPointSelected = true;
FactManager.angleModeSecondPointSelected = tempFact; this.angleModeSecondPointSelected = tempFact;
//Event for start of curve-drawing in "ShinyThings" ActivateCurveDrawing();
//Create new LineFact with the 2 points
LineFact tempLineFact = new LineFact();
tempLineFact.Pid1 = FactManager.angleModeFirstPointSelected.Id;
tempLineFact.Pid2 = FactManager.angleModeSecondPointSelected.Id;
CommunicationEvents.StartCurveDrawingEvent.Invoke(tempLineFact);
} }
else else
{ {
FactManager.angleModeFirstPointSelected = null; this.angleModeFirstPointSelected = null;
FactManager.angleModeIsFirstPointSelected = false; this.angleModeIsFirstPointSelected = false;
} }
} }
//If no point was selected before //If no point was selected before
else else
{ {
//Save the first point selected //Save the first point selected
FactManager.angleModeIsFirstPointSelected = true; this.angleModeIsFirstPointSelected = true;
FactManager.angleModeFirstPointSelected = tempFact; this.angleModeFirstPointSelected = tempFact;
} }
} }
//No point was hit //No point was hit
else else
{ {
if (FactManager.angleModeIsFirstPointSelected && FactManager.angleModeIsSecondPointSelected) ResetGadget();
//TODO: Hint that only an angle can be created between 3 already existing points
}
}
void Update()
{ {
//Event for end of curve-drawing in "ShinyThings" if (!this.isActiveAndEnabled) return;
CommunicationEvents.StopCurveDrawingEvent.Invoke(null); if (this.curveDrawingActivated)
UpdateCurveDrawing(this.Cursor.transform.position);
} }
//Reset Angle-Preview-Attributes private void ResetGadget()
FactManager.angleModeIsFirstPointSelected = false; {
FactManager.angleModeFirstPointSelected = null; this.angleModeIsFirstPointSelected = false;
FactManager.angleModeIsSecondPointSelected = false; this.angleModeFirstPointSelected = null;
FactManager.angleModeSecondPointSelected = null; this.angleModeIsSecondPointSelected = false;
this.angleModeSecondPointSelected = null;
DeactivateCurveDrawing();
}
//TODO: Hint that only an angle can be created between 3 already existing points //Expect a LineFact here, where Line.Pid2 will be the Basis-Point of the angle
public void ActivateCurveDrawing()
{
//In AngleMode with 3 Points we want to draw nearly a rectangle so we add a startPoint and an Endpoint to this preview
this.lineRenderer.positionCount = curveDrawingVertexCount + 2;
this.lineRenderer.material = this.anglePreviewMaterial;
lineRenderer.startWidth = 0.05f;
lineRenderer.endWidth = 0.05f;
//Set CurveDrawing activated
this.curveDrawingActivated = true;
//curveEndPoint is a point on the Line selected, with some distance from point2
curveEndPoint = angleModeSecondPointSelected.Point + 0.3f * (angleModeFirstPointSelected.Point - angleModeSecondPointSelected.Point).magnitude * (angleModeFirstPointSelected.Point - angleModeSecondPointSelected.Point).normalized;
angleMiddlePoint = angleModeSecondPointSelected.Point;
curveRadius = (curveEndPoint - angleModeSecondPointSelected.Point).magnitude;
} }
public void UpdateCurveDrawing(Vector3 currentPosition)
{
//Find the nearest of all potential third points
PointFact nearestPoint = null;
foreach (Fact fact in Facts)
{
if (fact is PointFact && fact.Id != angleModeFirstPointSelected.Id && fact.Id != angleModeSecondPointSelected.Id && nearestPoint == null)
nearestPoint = (PointFact)fact;
else if (fact is PointFact && fact.Id != angleModeFirstPointSelected.Id && fact.Id != angleModeSecondPointSelected.Id && (nearestPoint.Point - currentPosition).magnitude > (((PointFact)fact).Point - currentPosition).magnitude)
nearestPoint = (PointFact)fact;
}
Vector3 startPoint = new Vector3(0, 0, 0);
if (nearestPoint != null)
{
Vector3 planePoint = Vector3.ProjectOnPlane(currentPosition, Vector3.Cross((nearestPoint.Point - angleMiddlePoint), (curveEndPoint - angleMiddlePoint)));
//Determine the Start-Point for the nearest third-point
startPoint = angleMiddlePoint + curveRadius * (planePoint - angleMiddlePoint).normalized;
}
else
{
//Determine the Start-Point
startPoint = angleMiddlePoint + curveRadius * (currentPosition - angleMiddlePoint).normalized;
} }
//Determine the Center of Start-Point and End-Point
Vector3 tempCenterPoint = Vector3.Lerp(startPoint, curveEndPoint, 0.5f);
Vector3 curveMiddlePoint = angleMiddlePoint + curveRadius * (tempCenterPoint - angleMiddlePoint).normalized;
linePositions = new List<Vector3>();
//Start: AngleMiddlePoint -> FirstPoint of Curve
linePositions.Add(angleModeSecondPointSelected.Point);
for (float ratio = 0; ratio <= 1; ratio += 1.0f / this.curveDrawingVertexCount)
{
var tangentLineVertex1 = Vector3.Lerp(startPoint, curveMiddlePoint, ratio);
var tangentLineVertex2 = Vector3.Lerp(curveMiddlePoint, curveEndPoint, ratio);
var bezierPoint = Vector3.Lerp(tangentLineVertex1, tangentLineVertex2, ratio);
linePositions.Add(bezierPoint);
}
//End: LastPoint of Curve -> AngleMiddlePoint
linePositions.Add(angleModeSecondPointSelected.Point);
lineRenderer.positionCount = linePositions.Count;
lineRenderer.SetPositions(linePositions.ToArray());
}
public void DeactivateCurveDrawing()
{
this.lineRenderer.positionCount = 0;
this.linePositions = new List<Vector3>();
this.curveDrawingActivated = false;
}
} }
...@@ -9,12 +9,6 @@ public class FactManager : MonoBehaviour ...@@ -9,12 +9,6 @@ public class FactManager : MonoBehaviour
public GameObject SmartMenu; public GameObject SmartMenu;
private List<int> NextEmpties = new List<int>(); private List<int> NextEmpties = new List<int>();
//Variables for AngleMode distinction
public bool angleModeIsFirstPointSelected = false;
public Fact angleModeFirstPointSelected = null;
public bool angleModeIsSecondPointSelected = false;
public Fact angleModeSecondPointSelected = null;
//Solving game parameters //Solving game parameters
public GameObject snapZoneTop; public GameObject snapZoneTop;
public GameObject snapZoneBottom; public GameObject snapZoneBottom;
......
...@@ -14,20 +14,6 @@ public class ShinyThings : MonoBehaviour ...@@ -14,20 +14,6 @@ public class ShinyThings : MonoBehaviour
public Material defaultMaterial; public Material defaultMaterial;
public Material highlightMaterial; public Material highlightMaterial;
//Attributes for simulating the drawing of a line/curve
public LineRenderer lineRenderer;
private List<Vector3> linePositions = new List<Vector3>();
public Material anglePreviewMaterial;
private bool curveDrawingActivated;
//These are only the vertices for the Curve
private int curveDrawingVertexCount = 36;
private LineFact curveDrawingStartLine;
private Vector3 curveEndPoint;
private Vector3 angleMiddlePoint;
private float curveRadius;
//Variables for Pushout-Highlighting //Variables for Pushout-Highlighting
private Fact highlightedPushoutFact; private Fact highlightedPushoutFact;
private GameObject extraHighlight; private GameObject extraHighlight;
...@@ -53,9 +39,6 @@ public class ShinyThings : MonoBehaviour ...@@ -53,9 +39,6 @@ public class ShinyThings : MonoBehaviour
public void Start() public void Start()
{ {
if (Cursor == null) Cursor = GetComponent<WorldCursor>(); if (Cursor == null) Cursor = GetComponent<WorldCursor>();
CommunicationEvents.StartCurveDrawingEvent.AddListener(ActivateCurveDrawing);
CommunicationEvents.StopCurveDrawingEvent.AddListener(DeactivateCurveDrawing);
CommunicationEvents.StopPreviewsEvent.AddListener(StopPreviews);
CommunicationEvents.PushoutFactEvent.AddListener(StartPushoutFactHighlighting); CommunicationEvents.PushoutFactEvent.AddListener(StartPushoutFactHighlighting);
CommunicationEvents.PushoutFactFailEvent.AddListener(StartPushoutFactFailHighlighting); CommunicationEvents.PushoutFactFailEvent.AddListener(StartPushoutFactFailHighlighting);
speedSlowDown = timerDurationEnd * 10; speedSlowDown = timerDurationEnd * 10;
...@@ -85,9 +68,6 @@ public void Update() ...@@ -85,9 +68,6 @@ public void Update()
//Debug.Log(this.transform.position); //Debug.Log(this.transform.position);
if (this.curveDrawingActivated)
UpdateCurveDrawing(this.transform.position);
//If the Timer is Active, check Pushout-Highlighting //If the Timer is Active, check Pushout-Highlighting
if (this.timerActive) if (this.timerActive)
{ {
...@@ -365,92 +345,4 @@ public void slowDownAnimation(ParticleSystem main1, ParticleSystem main2) { ...@@ -365,92 +345,4 @@ public void slowDownAnimation(ParticleSystem main1, ParticleSystem main2) {
} }
} }
} }
//Expect a LineFact here, where Line.Pid2 will be the Basis-Point of the angle
public void ActivateCurveDrawing(Fact startFact)
{
//In AngleMode with 3 Points we want to draw nearly a rectangle so we add a startPoint and an Endpoint to this preview
this.lineRenderer.positionCount = curveDrawingVertexCount + 2;
this.lineRenderer.material = this.anglePreviewMaterial;
lineRenderer.startWidth = 0.05f;
lineRenderer.endWidth = 0.05f;
//Set CurveDrawing activated
this.curveDrawingActivated = true;
curveDrawingStartLine = (LineFact)startFact;
PointFact curveDrawingPoint1 = (PointFact)Facts.Find(x => x.Id == curveDrawingStartLine.Pid1);
PointFact curveDrawingPoint2 = (PointFact)Facts.Find(x => x.Id == curveDrawingStartLine.Pid2);
//curveEndPoint is a point on the Line selected, with some distance from point2
curveEndPoint = curveDrawingPoint2.Point + 0.3f * (curveDrawingPoint1.Point - curveDrawingPoint2.Point).magnitude * (curveDrawingPoint1.Point - curveDrawingPoint2.Point).normalized;
angleMiddlePoint = curveDrawingPoint2.Point;
curveRadius = (curveEndPoint - curveDrawingPoint2.Point).magnitude;
}
public void UpdateCurveDrawing(Vector3 currentPosition)
{
//Find the nearest of all potential third points
PointFact nearestPoint = null;
foreach (Fact fact in Facts) {
if (fact is PointFact && fact.Id != curveDrawingStartLine.Pid1 && fact.Id != curveDrawingStartLine.Pid2 && nearestPoint == null)
nearestPoint = (PointFact)fact;
else if (fact is PointFact && fact.Id != curveDrawingStartLine.Pid1 && fact.Id != curveDrawingStartLine.Pid2 && (nearestPoint.Point - currentPosition).magnitude > (((PointFact)fact).Point - currentPosition).magnitude)
nearestPoint = (PointFact)fact;
}
Vector3 startPoint = new Vector3(0,0,0);
if (nearestPoint != null)
{
Vector3 planePoint = Vector3.ProjectOnPlane(currentPosition, Vector3.Cross((nearestPoint.Point-angleMiddlePoint), (curveEndPoint-angleMiddlePoint)));
//Determine the Start-Point for the nearest third-point
startPoint = angleMiddlePoint + curveRadius * (planePoint - angleMiddlePoint).normalized;
}
else
{
//Determine the Start-Point
startPoint = angleMiddlePoint + curveRadius * (currentPosition - angleMiddlePoint).normalized;
}
//Determine the Center of Start-Point and End-Point
Vector3 tempCenterPoint = Vector3.Lerp(startPoint, curveEndPoint, 0.5f);
Vector3 curveMiddlePoint = angleMiddlePoint + curveRadius * (tempCenterPoint - angleMiddlePoint).normalized;
linePositions = new List<Vector3>();
//Start: AngleMiddlePoint -> FirstPoint of Curve
linePositions.Add(((PointFact)Facts.Find(x => x.Id == curveDrawingStartLine.Pid2)).Point);
for (float ratio = 0; ratio <= 1; ratio += 1.0f / this.curveDrawingVertexCount)
{
var tangentLineVertex1 = Vector3.Lerp(startPoint, curveMiddlePoint, ratio);
var tangentLineVertex2 = Vector3.Lerp(curveMiddlePoint, curveEndPoint, ratio);
var bezierPoint = Vector3.Lerp(tangentLineVertex1, tangentLineVertex2, ratio);
linePositions.Add(bezierPoint);
}
//End: LastPoint of Curve -> AngleMiddlePoint
linePositions.Add(((PointFact)Facts.Find(x => x.Id == curveDrawingStartLine.Pid2)).Point);
lineRenderer.positionCount = linePositions.Count;
lineRenderer.SetPositions(linePositions.ToArray());
}
public void DeactivateCurveDrawing(Fact startFact)
{
this.lineRenderer.positionCount = 0;
this.linePositions = new List<Vector3>();
this.curveDrawingActivated = false;
}
public void StopPreviews(Fact startFact) {
if (curveDrawingActivated)
DeactivateCurveDrawing(null);
}
} }
...@@ -43,7 +43,6 @@ public override void OnHit(RaycastHit hit) ...@@ -43,7 +43,6 @@ public override void OnHit(RaycastHit hit)
//If first point was already selected AND second point != first point //If first point was already selected AND second point != first point
if (this.LineModeIsFirstPointSelected && this.LineModeFirstPointSelected.Id != tempFact.Id) if (this.LineModeIsFirstPointSelected && this.LineModeFirstPointSelected.Id != tempFact.Id)
{ {
this.DeactivateLineDrawing();
//Create LineFact //Create LineFact
//Check if exactly the same line/distance already exists //Check if exactly the same line/distance already exists
if (!FactManager.factAlreadyExists(new int[] { this.LineModeFirstPointSelected.Id, tempFact.Id })) if (!FactManager.factAlreadyExists(new int[] { this.LineModeFirstPointSelected.Id, tempFact.Id }))
...@@ -110,7 +109,6 @@ public override void OnHit(RaycastHit hit) ...@@ -110,7 +109,6 @@ public override void OnHit(RaycastHit hit)
{ {
//Deactivate LineDrawing and first point selection //Deactivate LineDrawing and first point selection
this.ResetGadget(); this.ResetGadget();
this.DeactivateLineDrawing();
} }
//TODO: Hint that only a line can be drawn between already existing points //TODO: Hint that only a line can be drawn between already existing points
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
public class Tape : Gadget public class Tape : Gadget
{ {
//Variables for LineMode distinction //Variables for TapeMode distinction
private bool TapeModeIsFirstPointSelected = false; private bool TapeModeIsFirstPointSelected = false;
private Fact TapeModeFirstPointSelected = null; private Fact TapeModeFirstPointSelected = null;
...@@ -43,7 +43,6 @@ public override void OnHit(RaycastHit hit) ...@@ -43,7 +43,6 @@ public override void OnHit(RaycastHit hit)
//If first point was already selected AND second point != first point //If first point was already selected AND second point != first point
if (this.TapeModeIsFirstPointSelected && this.TapeModeFirstPointSelected.Id != tempFact.Id) if (this.TapeModeIsFirstPointSelected && this.TapeModeFirstPointSelected.Id != tempFact.Id)
{ {
this.DeactivateLineDrawing();
//Create LineFact //Create LineFact
//Check if exactly the same line/distance already exists //Check if exactly the same line/distance already exists
if (!FactManager.factAlreadyExists(new int[] { this.TapeModeFirstPointSelected.Id, tempFact.Id })) if (!FactManager.factAlreadyExists(new int[] { this.TapeModeFirstPointSelected.Id, tempFact.Id }))
...@@ -110,7 +109,6 @@ public override void OnHit(RaycastHit hit) ...@@ -110,7 +109,6 @@ public override void OnHit(RaycastHit hit)
{ {
//Deactivate LineDrawing and first point selection //Deactivate LineDrawing and first point selection
this.ResetGadget(); this.ResetGadget();
this.DeactivateLineDrawing();
} }
//TODO: Hint that only a line can be drawn between already existing points //TODO: Hint that only a line can be drawn between already existing points
......
...@@ -31463,9 +31463,6 @@ MonoBehaviour: ...@@ -31463,9 +31463,6 @@ MonoBehaviour:
Cursor: {fileID: 1661088666} Cursor: {fileID: 1661088666}
defaultMaterial: {fileID: 2100000, guid: 8ae9adf4dc782964387385c1e8c0eb72, type: 2} defaultMaterial: {fileID: 2100000, guid: 8ae9adf4dc782964387385c1e8c0eb72, type: 2}
highlightMaterial: {fileID: 2100000, guid: c7daa82e15f0cf04d92d0f41ce84f9df, type: 2} highlightMaterial: {fileID: 2100000, guid: c7daa82e15f0cf04d92d0f41ce84f9df, type: 2}
lineRenderer: {fileID: 1661088668}
anglePreviewMaterial: {fileID: 2100000, guid: 8a28cccde2536794c97ec91954e34e90,
type: 2}
directionalLight: {fileID: 138245305} directionalLight: {fileID: 138245305}
pushoutMaterial: {fileID: 2100000, guid: d9c43ce51f1a01d41a18fae03c0d406c, type: 2} pushoutMaterial: {fileID: 2100000, guid: d9c43ce51f1a01d41a18fae03c0d406c, type: 2}
--- !u!114 &1661088670 --- !u!114 &1661088670
...@@ -31482,8 +31479,6 @@ MonoBehaviour: ...@@ -31482,8 +31479,6 @@ MonoBehaviour:
m_EditorClassIdentifier: m_EditorClassIdentifier:
SmartMenu: {fileID: 5601740127768851631, guid: e693bf633c633d243b0254d117ec3893, SmartMenu: {fileID: 5601740127768851631, guid: e693bf633c633d243b0254d117ec3893,
type: 3} type: 3}
angleModeIsFirstPointSelected: 0
angleModeIsSecondPointSelected: 0
snapZoneTop: {fileID: 1563243733} snapZoneTop: {fileID: 1563243733}
snapZoneBottom: {fileID: 1009368148} snapZoneBottom: {fileID: 1009368148}
--- !u!23 &1661088671 stripped --- !u!23 &1661088671 stripped
...@@ -40476,6 +40471,18 @@ PrefabInstance: ...@@ -40476,6 +40471,18 @@ PrefabInstance:
m_Modification: m_Modification:
m_TransformParent: {fileID: 0} m_TransformParent: {fileID: 0}
m_Modifications: m_Modifications:
- target: {fileID: 729203331, guid: 2ba8d552442ba664e8e567adee683a11, type: 3}
propertyPath: Cursor
value:
objectReference: {fileID: 1661088666}
- target: {fileID: 729203331, guid: 2ba8d552442ba664e8e567adee683a11, type: 3}
propertyPath: lineRenderer
value:
objectReference: {fileID: 1661088668}
- target: {fileID: 729203331, guid: 2ba8d552442ba664e8e567adee683a11, type: 3}
propertyPath: anglePreviewMaterial
value:
objectReference: {fileID: 2100000, guid: 8a28cccde2536794c97ec91954e34e90, type: 2}
- target: {fileID: 1085307962, guid: 2ba8d552442ba664e8e567adee683a11, type: 3} - target: {fileID: 1085307962, guid: 2ba8d552442ba664e8e567adee683a11, type: 3}
propertyPath: GadgetUI propertyPath: GadgetUI
value: value:
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment