Newer
Older
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using static CommunicationEvents;
public static Fact AddFactIfNotFound(Fact fact, out bool exists, bool samestep)
return LevelFacts[LevelFacts.Add(fact, out exists, samestep)];
public PointFact AddPointFact(RaycastHit hit, bool samestep = false)
return (PointFact) AddFactIfNotFound(new PointFact(hit.point, hit.normal, LevelFacts), out bool obsolete, samestep);
public PointFact AddPointFact(Vector3 point, Vector3 normal, bool samestep = false)
return (PointFact) AddFactIfNotFound(new PointFact(point, normal, LevelFacts), out bool obsolete, samestep);
public OnLineFact AddOnLineFact(string pid, string lid, bool samestep = false)
Marco Zimmer
committed
{
return (OnLineFact)AddFactIfNotFound(new OnLineFact(pid, lid, LevelFacts), out bool obsolete, samestep);
Marco Zimmer
committed
}
public LineFact AddLineFact(string pid1, string pid2, bool samestep = false)
Marco Zimmer
committed
{
return (LineFact)AddFactIfNotFound(new LineFact(pid1, pid2, LevelFacts), out bool obsolete, samestep);
Marco Zimmer
committed
}
public RayFact AddRayFact(string pid1, string pid2, bool samestep = false)
Marco Zimmer
committed
{
RayFact rayFact = (RayFact)AddFactIfNotFound(new RayFact(pid1, pid2, LevelFacts), out bool exists, samestep);
Marco Zimmer
committed
if (exists)
return rayFact;
Marco Zimmer
committed
//Add all PointFacts on Ray as OnLineFacts
PointFact rayP1 = (PointFact)LevelFacts[rayFact.Pid1];
PointFact rayP2 = (PointFact)LevelFacts[rayFact.Pid2];
Marco Zimmer
committed
int layerMask = LayerMask.GetMask("Point");
RaycastHit[] hitsA = Physics.RaycastAll(rayP1.Point, rayFact.Dir, Mathf.Infinity, layerMask);
RaycastHit[] hitsB = Physics.RaycastAll(rayP2.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>().URI, rayFact.Id, true);
Marco Zimmer
committed
}
Marco Zimmer
committed
foreach (RaycastHit hit in hitsA)
AddHitIfOnLine(hit);
Marco Zimmer
committed
foreach (RaycastHit hit in hitsB)
AddHitIfOnLine(hit);
// for good measure
Marco Zimmer
committed
AddOnLineFact(rayFact.Pid1, rayFact.Id, true);
AddOnLineFact(rayFact.Pid2, rayFact.Id, true);
Marco Zimmer
committed
return rayFact;
public AngleFact AddAngleFact(string pid1, string pid2, string pid3, bool samestep = false)
return (AngleFact)AddFactIfNotFound(new AngleFact(pid1, pid2, pid3, LevelFacts), out bool obsolete, samestep);