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

Made hints from rendered scroll working

parent 10f9e5bc
No related branches found
No related tags found
No related merge requests found
......@@ -65,8 +65,9 @@ public class AnimationEventWithUris : UnityEvent<List<string>>
//TODO: Remove this event after CompletionsDemo isn't necessary anymore
public static AnimationEventWithUri parameterDisplayHint = new AnimationEventWithUri();
public static AnimationEvent CompletionsHintEvent = new AnimationEvent();
public static AnimationEvent ScrollFactHintEvent = new AnimationEvent();
public static FactEvent AnimateExistingFactEvent = new FactEvent();
public static FactEvent AnimateNonExistingFactEvent = new FactEvent();
public static AnimationEventWithUris HintAvailableEvent = new AnimationEventWithUris();
......
......@@ -9,7 +9,9 @@ public class ParsingDictionary {
public static Dictionary<string, Func<Scroll.ScrollFact, Fact>> parseFactDictionary = new Dictionary<string, Func<Scroll.ScrollFact, Fact>>() {
{MMTURIs.Point, PointFact.parseFact},
{MMTURIs.Metric, LineFact.parseFact},
{MMTURIs.Angle, AngleFact.parseFact}
{MMTURIs.Angle, AngleFact.parseFact},
//90Degree-Angle
{MMTURIs.Ded, AngleFact.parseFact}
};
}
......@@ -36,6 +38,15 @@ public string format(float t)
{
return t.ToString("0.0000").Replace(',', '.');
}
//If FactType depends on other Facts, e.g. AngleFacts depend on 3 PointFacts
public abstract Boolean hasDependentFacts();
public abstract int[] getDependentFactIds();
public abstract override bool Equals(System.Object obj);
public abstract override int GetHashCode();
}
public abstract class DirectedFact : Fact
......@@ -122,12 +133,45 @@ public PointFact(float a, float b, float c, string uri)
public static PointFact parseFact(Scroll.ScrollFact fact) {
String uri = fact.@ref.uri;
float a = (float) ((OMF)((OMA)((Scroll.ScrollSymbolFact)fact).df).arguments[0]).f;
float b = (float) ((OMF)((OMA)((Scroll.ScrollSymbolFact)fact).df).arguments[1]).f;
float c = (float) ((OMF)((OMA)((Scroll.ScrollSymbolFact)fact).df).arguments[2]).f;
return new PointFact(a, b, c, uri);
OMA df = (OMA)((Scroll.ScrollSymbolFact)fact).df;
if (df != null)
{
float a = (float)((OMF)df.arguments[0]).f;
float b = (float)((OMF)df.arguments[1]).f;
float c = (float)((OMF)df.arguments[2]).f;
return new PointFact(a, b, c, uri);
}
else {
return null;
}
}
public override Boolean hasDependentFacts() {
return false;
}
public override int[] getDependentFactIds() {
return null;
}
public override bool Equals(System.Object obj)
{
//Check for null and compare run-time types.
if ((obj == null) || !this.GetType().Equals(obj.GetType()))
{
return false;
}
else
{
PointFact p = (PointFact)obj;
return this.Point.Equals(p.Point) && this.Normal.Equals(p.Normal);
}
}
public override int GetHashCode()
{
return this.Point.GetHashCode() ^ this.Normal.GetHashCode();
}
}
public class LineFact : DirectedFact
......@@ -186,9 +230,46 @@ public static LineFact parseFact(Scroll.ScrollFact fact)
String uri = fact.@ref.uri;
String pointAUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).uri;
String pointBUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[1]).uri;
int pid1 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointAUri)).Id;
int pid2 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointBUri)).Id;
return new LineFact(pid1, pid2, uri);
if (CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointAUri)) &&
CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointBUri)))
{
int pid1 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointAUri)).Id;
int pid2 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointBUri)).Id;
return new LineFact(pid1, pid2, uri);
}
//If dependent facts do not exist return null
else {
return null;
}
}
public override Boolean hasDependentFacts()
{
return true;
}
public override int[] getDependentFactIds()
{
return new int[] { Pid1, Pid2 };
}
public override bool Equals(System.Object obj)
{
//Check for null and compare run-time types.
if ((obj == null) || !this.GetType().Equals(obj.GetType()))
{
return false;
}
else
{
LineFact l = (LineFact)obj;
return this.Pid1.Equals(l.Pid1) && this.Pid2.Equals(l.Pid2);
}
}
public override int GetHashCode()
{
return this.Pid1 ^ this.Pid2;
}
}
......@@ -197,6 +278,35 @@ public class OpenLineFact : Fact
//R: this is called RayFact for now (see below), feel free to change
//an infinite Line through the Points Pid1 and Pid2
public int Pid1, Pid2;
public override Boolean hasDependentFacts()
{
return true;
}
public override int[] getDependentFactIds()
{
return new int[] { Pid1, Pid2 };
}
public override bool Equals(System.Object obj)
{
//Check for null and compare run-time types.
if ((obj == null) || !this.GetType().Equals(obj.GetType()))
{
return false;
}
else
{
OpenLineFact o = (OpenLineFact)obj;
return this.Pid1.Equals(o.Pid1) && this.Pid2.Equals(o.Pid2);
}
}
public override int GetHashCode()
{
return this.Pid1 ^ this.Pid2;
}
}
public class RayFact : Fact
......@@ -232,7 +342,34 @@ public RayFact(int i, int pid1, int pid2, string uri, string valuri)
this.backendValueURI = valuri;
}
public override Boolean hasDependentFacts()
{
return true;
}
public override int[] getDependentFactIds()
{
return new int[] { Pid1, Pid2 };
}
public override bool Equals(System.Object obj)
{
//Check for null and compare run-time types.
if ((obj == null) || !this.GetType().Equals(obj.GetType()))
{
return false;
}
else
{
RayFact r = (RayFact)obj;
return this.Pid1.Equals(r.Pid1) && this.Pid2.Equals(r.Pid2);
}
}
public override int GetHashCode()
{
return this.Pid1 ^ this.Pid2;
}
}
......@@ -257,7 +394,34 @@ public OnLineFact(int i, int pid, int lid)
Debug.Log("created onLine" + this.backendURI + " " + this.backendValueURI);
}
public override Boolean hasDependentFacts()
{
return true;
}
public override int[] getDependentFactIds()
{
return new int[] { Pid, Lid };
}
public override bool Equals(System.Object obj)
{
//Check for null and compare run-time types.
if ((obj == null) || !this.GetType().Equals(obj.GetType()))
{
return false;
}
else
{
OnLineFact o = (OnLineFact)obj;
return this.Pid.Equals(o.Pid) && this.Lid.Equals(o.Lid);
}
}
public override int GetHashCode()
{
return this.Pid ^ this.Lid;
}
}
......@@ -322,13 +486,52 @@ public AngleFact(int Pid1, int Pid2, int Pid3, string backendURI)
public static AngleFact parseFact(Scroll.ScrollFact fact)
{
String uri = fact.@ref.uri;
String pointAUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).uri;
String pointBUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[1]).uri;
String pointCUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[2]).uri;
int pid1 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointAUri)).Id;
int pid2 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointBUri)).Id;
int pid3 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointCUri)).Id;
String uri;
String pointAUri;
String pointBUri;
String pointCUri;
int pid1;
int pid2;
int pid3;
//If angle is not a 90Degree-Angle
if (fact.GetType().Equals(typeof(Scroll.ScrollValueFact)))
{
uri = fact.@ref.uri;
pointAUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[0]).uri;
pointBUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[1]).uri;
pointCUri = ((OMS)((OMA)((Scroll.ScrollValueFact)fact).lhs).arguments[2]).uri;
//If dependent facts do not exist return null
if (!CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointAUri)) |
!CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointBUri)) |
!CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointCUri)))
{
return null;
}
pid1 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointAUri)).Id;
pid2 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointBUri)).Id;
pid3 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointCUri)).Id;
}
//If angle is a 90Degree-Angle
else {
uri = fact.@ref.uri;
pointAUri = ((OMS)((OMA)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).arguments[0]).uri;
pointBUri = ((OMS)((OMA)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).arguments[1]).uri;
pointCUri = ((OMS)((OMA)((OMA)((OMA)((Scroll.ScrollSymbolFact)fact).tp).arguments[0]).arguments[1]).arguments[2]).uri;
//If dependent facts do not exist return null
if (!CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointAUri)) |
!CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointBUri)) |
!CommunicationEvents.Facts.Exists(x => x.backendURI.Equals(pointCUri)))
{
return null;
}
pid1 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointAUri)).Id;
pid2 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointBUri)).Id;
pid3 = CommunicationEvents.Facts.Find(x => x.backendURI.Equals(pointCUri)).Id;
}
return new AngleFact(pid1, pid2, pid3, uri);
}
......@@ -373,6 +576,35 @@ private MMTDeclaration generateNot90DegreeAngleDeclaration(float val, string p1U
return new MMTValueDeclaration(this.Label, lhs, valueTp, value);
}
public override Boolean hasDependentFacts()
{
return true;
}
public override int[] getDependentFactIds()
{
return new int[] { Pid1, Pid2, Pid3 };
}
public override bool Equals(System.Object obj)
{
//Check for null and compare run-time types.
if ((obj == null) || !this.GetType().Equals(obj.GetType()))
{
return false;
}
else
{
AngleFact a = (AngleFact)obj;
return this.Pid1.Equals(a.Pid1) && this.Pid2.Equals(a.Pid2) && this.Pid3.Equals(a.Pid3);
}
}
public override int GetHashCode()
{
return this.Pid1 ^ this.Pid2 ^ this.Pid3;
}
}
......@@ -15,36 +15,38 @@ void Start()
AddFactEvent.AddListener(FactAction);
RemoveFactEvent.AddListener(DeleteObject);
AnimateNonExistingFactEvent.AddListener(animateNonExistingFactTrigger);
//Default FactRepresenation = Sphere-Prefab for Points
this.FactRepresentation = (GameObject) Resources.Load("Prefabs/Sphere", typeof(GameObject));
}
public void FactAction(Fact fact)
public void FactAction(Fact fact) {
getAction(fact)?.Invoke(fact);
}
public Func<Fact, Fact> getAction(Fact fact)
{
switch (fact)
{
case PointFact pointFact:
SpawnPoint(pointFact);
break;
return SpawnPoint;
case LineFact lineFact:
SpawnLine(lineFact);
break;
return SpawnLine;
case AngleFact angleFact:
SpawnAngle(angleFact);
break;
return SpawnAngle;
case RayFact rayFact:
SpawnRay(rayFact);
break;
return SpawnRay;
default:
return null;
}
}
public void SpawnPoint(PointFact fact)
public Fact SpawnPoint(Fact pointFact)
{
PointFact fact = ((PointFact)pointFact);
this.FactRepresentation = (GameObject)Resources.Load("Prefabs/Sphere", typeof(GameObject));
GameObject point = GameObject.Instantiate(FactRepresentation);
......@@ -54,10 +56,13 @@ public void SpawnPoint(PointFact fact)
point.GetComponentInChildren<TextMeshPro>().text = letter;
point.GetComponent<FactObject>().Id = fact.Id;
fact.Representation = point;
return fact;
}
public void SpawnLine(LineFact lineFact)
public Fact SpawnLine(Fact fact)
{
LineFact lineFact = ((LineFact)fact);
PointFact pointFact1 = (Facts[lineFact.Pid1] as PointFact);
PointFact pointFact2 = (Facts[lineFact.Pid2] as PointFact);
Vector3 point1 = pointFact1.Point;
......@@ -87,13 +92,16 @@ public void SpawnLine(LineFact lineFact)
line.GetComponentInChildren<TextMeshPro>().text += " = " + Math.Round((point1-point2).magnitude, 2) + " m";
line.GetComponentInChildren<FactObject>().Id = lineFact.Id;
lineFact.Representation = line;
return lineFact;
}
public void SpawnRay(RayFact lineFact)
public Fact SpawnRay(Fact fact)
{
PointFact pointFact1 = (Facts[lineFact.Pid1] as PointFact);
PointFact pointFact2 = (Facts[lineFact.Pid2] as PointFact);
RayFact rayFact = ((RayFact)fact);
PointFact pointFact1 = (Facts[rayFact.Pid1] as PointFact);
PointFact pointFact2 = (Facts[rayFact.Pid2] as PointFact);
Vector3 point1 = pointFact1.Point;
......@@ -123,16 +131,18 @@ public void SpawnRay(RayFact lineFact)
line.transform.GetChild(0).localScale = v3T;
line.transform.GetChild(0).rotation = Quaternion.FromToRotation(Vector3.right, point2 - point1);
string letter = ((Char)(64 + lineFact.Id + 1)).ToString();
string letter = ((Char)(64 + rayFact.Id + 1)).ToString();
line.GetComponentInChildren<TextMeshPro>().text = letter;
line.GetComponentInChildren<FactObject>().Id = lineFact.Id;
lineFact.Representation = line;
line.GetComponentInChildren<FactObject>().Id = rayFact.Id;
rayFact.Representation = line;
return rayFact;
}
//Spawn an angle: point with id = angleFact.Pid2 is the point where the angle gets applied
public void SpawnAngle(AngleFact angleFact)
public Fact SpawnAngle(Fact fact)
{
AngleFact angleFact = (AngleFact)fact;
Vector3 point1 = (Facts[angleFact.Pid1] as PointFact).Point;
Vector3 point2 = (Facts[angleFact.Pid2] as PointFact).Point;
......@@ -215,6 +225,7 @@ public void SpawnAngle(AngleFact angleFact)
angle.GetComponentInChildren<FactObject>().Id = angleFact.Id;
angleFact.Representation = angle;
return angleFact;
}
public void DeleteObject(Fact fact)
......@@ -222,6 +233,22 @@ public void DeleteObject(Fact fact)
Debug.Log("delete obj of "+ fact.Id);
GameObject factRepresentation = fact.Representation;
GameObject.Destroy(factRepresentation);
}
public void animateNonExistingFactTrigger(Fact fact) {
StartCoroutine(animateNonExistingFact(fact));
}
public IEnumerator animateNonExistingFact(Fact fact) {
Fact returnedFact = getAction(fact)?.Invoke(fact);
if (returnedFact != null)
{
Animator animator = returnedFact.Representation.GetComponentInChildren<Animator>();
animator.SetTrigger("animateHint");
yield return new WaitForSeconds(7);
GameObject.Destroy(returnedFact.Representation);
}
}
}
......@@ -33,7 +33,7 @@ void Start()
}
public void OnClickHintButton() {
CompletionsHintEvent.Invoke(this.ScrollParameterObject, factUri);
ScrollFactHintEvent.Invoke(this.ScrollParameterObject, factUri);
}
public void OnHintAvailable(List<string> uris) {
......
......@@ -74,6 +74,8 @@ public class ScrollSymbolFact : ScrollFact
public override String getType() {
if (this.tp is OMS)
return ((OMS)this.tp).uri;
else if (this.tp is OMA)
return ((OMS)((OMA)this.tp).applicant).uri;
else
return null;
}
......
......@@ -18,6 +18,7 @@ public class ScrollDetails : MonoBehaviour
public static List<GameObject> ParameterDisplays;
private static List<Scroll.ScrollAssignment> LatestCompletions;
private static List<Fact> LatestRenderedHints;
public string currentMmtAnswer;
......@@ -32,7 +33,7 @@ void Start()
if (cursor == null) cursor = GameObject.FindObjectOfType<WorldCursor>();
parameterDisplayHint.AddListener(animateScrollParameter);
CompletionsHintEvent.AddListener(animateCompletionsHint);
ScrollFactHintEvent.AddListener(animateHint);
NewAssignmentEvent.AddListener(newAssignmentTrigger);
}
......@@ -159,11 +160,17 @@ private void readPushout(List<Scroll.ScrollFact> pushoutFacts)
for (int i = 0; i < pushoutFacts.Count; i++)
{
Fact newFact = ParsingDictionary.parseFactDictionary[pushoutFacts[i].getType()].Invoke(pushoutFacts[i]);
int id = factManager.GetFirstEmptyID();
newFact.Id = id;
Facts.Insert(id, newFact);
AddFactEvent.Invoke(newFact);
PushoutFactEvent.Invoke(newFact);
if (newFact != null)
{
int id = factManager.GetFirstEmptyID();
newFact.Id = id;
Facts.Insert(id, newFact);
AddFactEvent.Invoke(newFact);
PushoutFactEvent.Invoke(newFact);
}
else {
Debug.Log("Parsing on pushout-fact returned null -> One of the dependent facts does not exist");
}
}
}
......@@ -174,35 +181,60 @@ public void processScrollDynamicInfo(Scroll.ScrollDynamicInfo scrollDynamicInfo)
else
LatestCompletions = new List<Scroll.ScrollAssignment>();
List<string> completionUris = new List<string>();
LatestRenderedHints = new List<Fact>();
List<string> hintUris = new List<string>();
foreach (Scroll.ScrollAssignment currentCompletion in LatestCompletions) {
completionUris.Add(currentCompletion.fact.uri);
hintUris.Add(currentCompletion.fact.uri);
}
//Show that Hint is available for ScrollParameter
HintAvailableEvent.Invoke(completionUris);
//Update Scroll, process data for later hints and update Uri-List for which hints are available
hintUris = processRenderedScroll(scrollDynamicInfo.rendered, hintUris);
updateRenderedScroll(scrollDynamicInfo.rendered);
//Show that Hint is available for ScrollParameter
HintAvailableEvent.Invoke(hintUris);
}
public void updateRenderedScroll(Scroll rendered)
public List<string> processRenderedScroll(Scroll rendered, List<string> hintUris)
{
Transform scroll = gameObject.transform.GetChild(1).transform;
//Update scroll-description
scroll.GetChild(0).GetComponent<TextMeshProUGUI>().text = rendered.description;
for (int i = 0; i < rendered.requiredFacts.Count; i++)
{
//Update ScrollParameter label
var obj = ParameterDisplays.Find(x => x.transform.GetChild(0).GetComponent<RenderedScrollFact>().factUri.Equals(rendered.requiredFacts[i].@ref.uri));
obj.transform.GetChild(0).GetComponent<RenderedScrollFact>().Label = rendered.requiredFacts[i].label;
//Check Hint Informations
//If ScrollFact is assigned -> No Hint
if (obj.transform.GetChild(0).GetComponent<DropHandling>().currentFact == null) {
Fact currentFact = ParsingDictionary.parseFactDictionary[rendered.requiredFacts[i].getType()].Invoke(rendered.requiredFacts[i]);
//If the fact could not be parsed -> Therefore not all dependent Facts exist -> No Hint
//AND if fact has no dependent facts -> No Hint
if (currentFact != null && currentFact.hasDependentFacts())
{
//Hint available for abstract-problem uri
hintUris.Add(currentFact.backendURI);
LatestRenderedHints.Add(currentFact);
}
}
}
return hintUris;
}
public void animateCompletionsHint(GameObject scrollParameter, string scrollParameterUri) {
public void animateHint(GameObject scrollParameter, string scrollParameterUri) {
Scroll.ScrollAssignment suitableCompletion = LatestCompletions.Find(x => x.fact.uri.Equals(scrollParameterUri) );
Fact fact;
if (suitableCompletion != null) {
Fact fact = Facts.Find(x => x.backendURI.Equals(suitableCompletion.assignment.uri));
if (fact != null) {
if (suitableCompletion != null)
{
fact = Facts.Find(x => x.backendURI.Equals(suitableCompletion.assignment.uri));
if (fact != null)
{
//Animate ScrollParameter
scrollParameter.GetComponentInChildren<Animator>().SetTrigger("animateHint");
//Animate Fact in FactPanel
......@@ -211,6 +243,30 @@ public void animateCompletionsHint(GameObject scrollParameter, string scrollPara
fact.Representation.GetComponentInChildren<Animator>().SetTrigger("animateHint");
}
}
else if (LatestRenderedHints.Exists(x => x.backendURI.Equals(scrollParameterUri))) {
fact = LatestRenderedHints.Find(x => x.backendURI.Equals(scrollParameterUri));
//If there is an equal existing fact -> Animate that fact AND ScrollParameter
if (Facts.Exists(x => x.Equals(fact)))
{
Fact existingFact = Facts.Find(x => x.Equals(fact));
//Animate ScrollParameter
scrollParameter.GetComponentInChildren<Animator>().SetTrigger("animateHint");
//Animate Fact in FactPanel
AnimateExistingFactEvent.Invoke(existingFact);
//Animate factRepresentation in game
existingFact.Representation.GetComponentInChildren<Animator>().SetTrigger("animateHint");
}
//If not -> Generate a Fact-Representation with such dependent facts
else
{
//Animate ScrollParameter
scrollParameter.GetComponentInChildren<Animator>().SetTrigger("animateHint");
//Generate new FactRepresentation and animate it
AnimateNonExistingFactEvent.Invoke(fact);
}
}
}
public void animateScrollParameter(string label)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment