Newer
Older
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using static CommunicationEvents;
public class FactManager : MonoBehaviour
{
public GameObject SmartMenu;
private List<int> NextEmpties = new List<int>();
Richard Marcus
committed
// Start is called before the first frame update
void Start()
{
//We dont want to have this here anymore...
//CommunicationEvents.RemoveFactEvent.AddListener(DeleteFact);
NextEmpties.Add(0);
}
// Update is called once per frame
void Update()
{
}
Marco Zimmer
committed
public static bool findFact(Fact search, out Fact found)
Marco Zimmer
committed
foreach (Fact f in CommunicationEvents.Facts)
{
if (f.GetType() == search.GetType() && f.Equivalent(search))
{
found = f;
return true;
}
}
found = search;
return false;
Marco Zimmer
committed
public static void addFact(int id, Fact fact)
Marco Zimmer
committed
CommunicationEvents.Facts.Insert(id, fact);
//TODO (alt): insert in MMT if needed here/ on Invoke()
//TODO: remove Inovkes() elsewhere
CommunicationEvents.AddFactEvent.Invoke(fact);
Marco Zimmer
committed
public static Fact AddFactIfNotFound(int id, Fact fact, out bool exists)
{
if (exists = findFact(fact, out Fact res))
{
//TODO: del 'fact' in MMT (alt.: s.TODO in addFact)
return res;
}
else
{
addFact(id, fact);
return fact;
}
}
Marco Zimmer
committed
public PointFact AddPointFact(RaycastHit hit, int id)
{
return (PointFact) AddFactIfNotFound(id, new PointFact(id, hit.point, hit.normal), out bool obsolete);
}
Marco Zimmer
committed
public PointFact AddPointFact(int id, Vector3 point, Vector3 normal)
{
return (PointFact) AddFactIfNotFound(id, new PointFact(id, point, normal), out bool obsolete);
}
Marco Zimmer
committed
public OnLineFact AddOnLineFact(int pid, int lid, int id)
{
return (OnLineFact)AddFactIfNotFound(id, new OnLineFact(id, pid, lid), out bool obsolete);
}
Marco Zimmer
committed
public LineFact AddLineFact(int pid1, int pid2, int id)
{
return (LineFact)AddFactIfNotFound(id, new LineFact(id, pid1, pid2), out bool obsolete);
}
Marco Zimmer
committed
public RayFact AddRayFact(int pid1, int pid2, int id)
{
RayFact rayFact = (RayFact)AddFactIfNotFound(id, new RayFact(id, pid1, pid2), out bool exists);
if (exists)
return rayFact;
Marco Zimmer
committed
//Add all PointFacts on Ray as OnLineFacts
PointFact rayP1 = (PointFact)Facts[rayFact.Pid1];
int layerMask = LayerMask.GetMask("Point");
RaycastHit[] hitsA = Physics.RaycastAll(rayP1.Point, rayFact.Dir, Mathf.Infinity, layerMask);
RaycastHit[] hitsB = Physics.RaycastAll(rayP1.Point, -rayFact.Dir, Mathf.Infinity, layerMask);
Marco Zimmer
committed
void AddHitIfOnLine(RaycastHit hit)
Marco Zimmer
committed
if (Math3d.IsPointApproximatelyOnLine(rayP1.Point, rayFact.Dir, hit.transform.position))
Marco Zimmer
committed
AddOnLineFact(hit.transform.gameObject.GetComponent<FactObject>().Id, rayFact.Id, GetFirstEmptyID());
Marco Zimmer
committed
}
Marco Zimmer
committed
foreach (RaycastHit hit in hitsA)
AddHitIfOnLine(hit);
Marco Zimmer
committed
foreach (RaycastHit hit in hitsB)
AddHitIfOnLine(hit);
Marco Zimmer
committed
return rayFact;
}
public AngleFact AddAngleFact(int pid1, int pid2, int pid3, int id)
{
Marco Zimmer
committed
return (AngleFact)AddFactIfNotFound(id, new AngleFact(id, pid1, pid2, pid3), out bool obsolete);
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
}
public void DeleteFact(Fact fact)
{
if (Facts.Contains(fact)) {
NextEmpties.Add(fact.Id);
//Facts.RemoveAt(fact.Id);
Facts.Remove(Facts.Find(x => x.Id == fact.Id));
CommunicationEvents.RemoveFactEvent.Invoke(fact);
}
}
public int GetFirstEmptyID()
{
NextEmpties.Sort();
int id = NextEmpties[0];
NextEmpties.RemoveAt(0);
if (NextEmpties.Count == 0)
NextEmpties.Add(id + 1);
Debug.Log("place fact at " + id);
return id;
}
}