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");
            }
        }