protected override void WhenGestureDeactivated(Hand maybeNullHand, DeactivationReason reason) { base.WhenGestureDeactivated(maybeNullHand, reason); if (maybeNullHand != null) { Chirality chirality = Chirality.Right; if (maybeNullHand.IsLeft) { chirality = Chirality.Left; } handColourManager.setHandColorMode(chirality, handColourManager.handModes.none); //erase. switch (reason) { case DeactivationReason.FinishedGesture: if (cancelLatticeLandPoint(maybeNullHand)) { foreach (LatticeLandPoint lp in GameObject.FindObjectsOfType <LatticeLandPoint>().Where(l => l.GetComponent <LineRenderer>() != null).ToList()) { //steal this from AbstractLineSegment Vector3 a = lp.GetComponent <LineRenderer>().GetPosition(0); Vector3 b = lp.GetComponent <LineRenderer>().GetPosition(1); Vector3 c = maybeNullHand.PalmPosition.ToVector3(); Vector3 result = Vector3.Dot(c - a, (b - a).normalized) * (b - a).normalized + a; if ((result - a).magnitude + (result - b).magnitude > (a - b).magnitude) { //the point is outside the endpoints, find closest endpoint instead. if ((result - a).magnitude < (result - b).magnitude) { result = a; } else { result = b; } } float distance = (maybeNullHand.PalmPosition.ToVector3() - result).magnitude; if (distance < maximumRangeToSelect && lp.whichHand != this.whichHand) { lp.endInteraction(); } } } else if (foundMGO(maybeNullHand)) { closestObj.DeleteGeoObj(); } break; case DeactivationReason.CancelledGesture: break; default: break; } } }
private void updateSphereLine(AbstractGeoObj mgo, AbstractGeoObj AbstractGeoObj1, AbstractGeoObj AbstractGeoObj2) { intersectionFigData data = IntersectionMath.SphereLineIntersection(AbstractGeoObj1.GetComponent <AbstractSphere>(), AbstractGeoObj2.GetComponent <straightEdgeBehave>()); if (data.figtype == mgo.figType) { //point or points; if (data.vectordata.Length > 1) { mgo.Position3 = data.vectordata[mgo.intersectionMultipleIDX]; } else { mgo.Position3 = data.vectordata[0]; } } else if (data.figtype == GeoObjType.none) { mgo.DeleteGeoObj(); } else { Debug.LogWarning("TYPE MISMATCH"); } }
private void updatePlanePlane(AbstractGeoObj mgo, AbstractGeoObj AbstractGeoObj1, AbstractGeoObj AbstractGeoObj2) { intersectionFigData data = IntersectionMath.PlanePlaneIntersection(AbstractGeoObj1.GetComponent <flatfaceBehave>(), AbstractGeoObj2.GetComponent <flatfaceBehave>()); if (data.figtype == mgo.figType) { //line only option mgo.Position3 = data.vectordata[0]; mgo.AddToRManager(); } else if (data.figtype == GeoObjType.none) { mgo.DeleteGeoObj(); } else { Debug.LogWarning("TYPE MISMATCH"); } }
private void updateCircleLine(AbstractGeoObj mgo, AbstractGeoObj AbstractGeoObj1, AbstractGeoObj AbstractGeoObj2) { intersectionFigData data = IntersectionMath.CircleLineIntersection(AbstractGeoObj1.GetComponent <AbstractCircle>(), AbstractGeoObj2.GetComponent <straightEdgeBehave>()); if (data.figtype == mgo.figType) { switch (data.figtype) { case GeoObjType.point: mgo.Position3 = data.vectordata[0]; mgo.AddToRManager(); break; case GeoObjType.circle: DependentCircle circle = mgo.GetComponent <DependentCircle>(); circle.centerPos = data.vectordata[0]; circle.normalDir = data.vectordata[1]; circle.center.Position3 = data.vectordata[0]; circle.edgePos = data.vectordata[2]; circle.edge.Position3 = data.vectordata[2]; circle.AddToRManager(); circle.edge.AddToRManager(); circle.center.AddToRManager(); break; default: break; } } else if (data.figtype == GeoObjType.none) { mgo.DeleteGeoObj(); } else { Debug.LogWarning("TYPE MISMATCH"); } }
private void updateCirclePlane(AbstractGeoObj mgo, AbstractGeoObj AbstractGeoObj1, AbstractGeoObj AbstractGeoObj2) { intersectionFigData data = IntersectionMath.CirclePlaneIntersection(AbstractGeoObj1.GetComponent <AbstractCircle>(), AbstractGeoObj2.GetComponent <flatfaceBehave>()); if (data.figtype == mgo.figType) { if (data.vectordata.Length > 1) { mgo.Position3 = data.vectordata[mgo.intersectionMultipleIDX]; } else { mgo.Position3 = data.vectordata[0]; } } else if (data.figtype == GeoObjType.none) { mgo.DeleteGeoObj(); } else { Debug.LogWarning("TYPE MISMATCH"); } }