private void checkTwoPoints() { if (prevSet && currSet && _prevPoint != _currPoint) { currPoint.tag = "Untagged"; prevPoint.tag = "Untagged"; switch (thisPinType) { case pinType.polymaker: lineList.Add(GeoObjConstruction.dLineSegment(currPoint, prevPoint)); //if (_currPoint == pointList[0] && lineList.Count > 1 && pointsAreCoPlanar(pointList,lineList)) if (_currPoint == pointList[0] && lineList.Count > 1) { GeoObjConstruction.iPolygon(lineList, pointList); endInteraction(); } successfullyMade = true; break; case pinType.wireframe: lineList.Add(GeoObjConstruction.dLineSegment(currPoint, prevPoint)); successfullyMade = true; polyCut(); break; case pinType.solidmaker: Debug.Log("This isn't setup yet do not use! Object: " + gameObject.name); Destroy(gameObject, Time.fixedDeltaTime); break; default: break; } } }
/// <summary> /// On Gesture end /// </summary> /// <param name="maybeNullHand">Hand reference that ended the gesture</param> /// <param name="reason">reason the gesture was ended</param> protected override void WhenGestureDeactivated(Hand maybeNullHand, DeactivationReason reason) { this.thisLR.enabled = false; if (maybeNullHand != null) { switch (reason) { case DeactivationReason.FinishedGesture: playSuccessSound(); if (maybeNullHand.Fingers[0].IsExtended) { //thumb up is draw polygon if (prevSet && currSet && _prevPoint != _currPoint) { lineList.Add(GeoObjConstruction.dLineSegment(currPoint, prevPoint)); int idx = pointList.LastIndexOf(_currPoint); int idx2 = pointList.IndexOf(_currPoint); if (idx > idx2 && lineList.Count > 1) { List <AbstractPoint> p1 = pointList.GetRange(idx2, (idx) - idx2); List <AbstractLineSegment> l1 = lineList.Where(l => p1.Contains(l.GetComponent <DependentLineSegment>().point1) || p1.Contains(l.GetComponent <DependentLineSegment>().point2)).ToList(); //TODO: Point list is overpopulated. CodyCodyCodyCodyCodyCody GeoObjConstruction.iPolygon(l1, p1); endInteraction(); } } } else { //thumb down is draw wireframe if (prevSet && currSet && _prevPoint != _currPoint) { lineList.Add(GeoObjConstruction.dLineSegment(currPoint, prevPoint)); } } break; default: break; } Chirality chirality = Chirality.Right; if (maybeNullHand.IsLeft) { chirality = Chirality.Left; } handColourManager.setHandColorMode(chirality, handColourManager.handModes.none); } }
//[ContextMenu("Load from Save")] for debugging make public and uncomment private void xmlToMGO() { Dictionary <string, AbstractGeoObj> spawnedObjects = new Dictionary <string, AbstractGeoObj>(); foreach (GeoObj geo in GeoObjDB.list) { switch (geo.type) { case GeoObjType.point: AbstractGeoObj spawnedPoint = null; //initialzed as null so that cases that do not spawn still have it initialized but still fails a null check. switch (geo.definition) { case GeoObjDef.Abstract: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Dependent: spawnedPoint = GeoObjConstruction.dPoint(geo.position); break; case GeoObjDef.Interactable: spawnedPoint = GeoObjConstruction.iPoint(geo.position); break; case GeoObjDef.Static: spawnedPoint = GeoObjConstruction.sPoint(geo.position); break; case GeoObjDef.none: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; default: break; } if (spawnedPoint != null) { if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(spawnedPoint, geo.label); } spawnedObjects.Add(geo.figName, spawnedPoint); } break; case GeoObjType.line: AbstractGeoObj spawnedLine = null; //initialzed as null so that cases that do not spawn still have it initialized but still fails a null check. switch (geo.definition) { case GeoObjDef.Abstract: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Dependent: spawnedLine = GeoObjConstruction.dLineSegment(spawnedObjects[geo.dependencies[0]] as AbstractPoint, spawnedObjects[geo.dependencies[1]] as AbstractPoint); break; case GeoObjDef.Interactable: spawnedLine = GeoObjConstruction.iLineSegment(spawnedObjects[geo.dependencies[0]] as AbstractPoint, spawnedObjects[geo.dependencies[1]] as AbstractPoint); break; case GeoObjDef.Static: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.none: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; default: break; } if (spawnedLine != null) { if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(spawnedLine, geo.label); } spawnedObjects.Add(geo.figName, spawnedLine); } break; case GeoObjType.polygon: AbstractGeoObj spawnedPoly = null; //initialzed as null so that cases that do not spawn still have it initialized but still fails a null check. List <AbstractLineSegment> lineList; List <AbstractPoint> pointList; switch (geo.definition) { case GeoObjDef.Abstract: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Dependent: lineList = new List <AbstractLineSegment>(); geo.dependencies.Where(d => spawnedObjects[d].figType == GeoObjType.line).ToList().ForEach(l => lineList.Add(spawnedObjects[l] as AbstractLineSegment)); pointList = new List <AbstractPoint>(); geo.dependencies.Where(d => spawnedObjects[d].figType == GeoObjType.point).ToList().ForEach(p => pointList.Add(spawnedObjects[p] as AbstractPoint)); spawnedPoly = GeoObjConstruction.dPolygon(lineList, pointList); break; case GeoObjDef.Interactable: lineList = new List <AbstractLineSegment>(); geo.dependencies.Where(d => spawnedObjects[d].figType == GeoObjType.line).ToList().ForEach(l => lineList.Add(spawnedObjects[l] as AbstractLineSegment)); pointList = new List <AbstractPoint>(); geo.dependencies.Where(d => spawnedObjects[d].figType == GeoObjType.point).ToList().ForEach(p => pointList.Add(spawnedObjects[p] as AbstractPoint)); spawnedPoly = GeoObjConstruction.iPolygon(lineList, pointList); break; case GeoObjDef.Static: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.none: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; default: break; } if (spawnedPoly != null) { if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(spawnedPoly, geo.label); } spawnedObjects.Add(geo.figName, spawnedPoly); } break; case GeoObjType.prism: AbstractGeoObj spawnedPrism = null; //initialzed as null so that cases that do not spawn still have it initialized but still fails a null check. switch (geo.definition) { case GeoObjDef.Abstract: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Dependent: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Interactable: if (!(geo.prismData.bases.Count < 2 || geo.prismData.sides.Count < spawnedObjects[geo.prismData.bases[0]].GetComponent <AbstractPolygon>().pointList.Count)) { List <AbstractPolygon> bases = new List <AbstractPolygon>(); List <AbstractPolygon> sides = new List <AbstractPolygon>(); geo.prismData.bases.ForEach(b => bases.Add(spawnedObjects[b] as AbstractPolygon)); geo.prismData.sides.ForEach(s => sides.Add(spawnedObjects[s] as AbstractPolygon)); spawnedPrism = GeoObjConstruction.iPrism(bases, sides); } else { List <AbstractLineSegment> edges = new List <AbstractLineSegment>(); geo.prismData.edges.ForEach(e => edges.Add(spawnedObjects[e] as AbstractLineSegment)); spawnedPrism = GeoObjConstruction.iPrism(edges); } break; case GeoObjDef.Static: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.none: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; default: break; } if (spawnedPrism != null) { if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(spawnedPrism, geo.label); } spawnedObjects.Add(geo.figName, spawnedPrism); } break; case GeoObjType.pyramid: AbstractGeoObj spawnedPyramid = null; //initialzed as null so that cases that do not spawn still have it initialized but still fails a null check. switch (geo.definition) { case GeoObjDef.Abstract: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Dependent: spawnedPyramid = GeoObjConstruction.dPyramid(spawnedObjects[geo.dependencies[0]] as AbstractPolygon, spawnedObjects[geo.pyramidData.apexName] as AbstractPoint); break; case GeoObjDef.Interactable: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Static: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.none: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; default: break; } if (spawnedPyramid != null) { if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(spawnedPyramid, geo.label); } spawnedObjects.Add(geo.figName, spawnedPyramid); } break; case GeoObjType.circle: AbstractGeoObj spawnedCircle = null; //initialzed as null so that cases that do not spawn still have it initialized but still fails a null check. switch (geo.definition) { case GeoObjDef.Abstract: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Dependent: spawnedCircle = GeoObjConstruction.dCircle(spawnedObjects[geo.dependencies[0]] as AbstractPoint, spawnedObjects[geo.dependencies[1]] as AbstractPoint, geo.circleData.normDir); break; case GeoObjDef.Interactable: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Static: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.none: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; default: break; } if (spawnedCircle != null) { if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(spawnedCircle, geo.label); } spawnedObjects.Add(geo.figName, spawnedCircle); } break; case GeoObjType.sphere: AbstractGeoObj spawnedSphere = null; //initialzed as null so that cases that do not spawn still have it initialized but still fails a null check. switch (geo.definition) { case GeoObjDef.Abstract: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Dependent: spawnedSphere = GeoObjConstruction.dSphere(spawnedObjects[geo.dependencies[0]] as AbstractPoint, spawnedObjects[geo.dependencies[1]] as AbstractPoint); break; case GeoObjDef.Interactable: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Static: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.none: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; default: break; } if (spawnedSphere != null) { if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(spawnedSphere, geo.label); } spawnedObjects.Add(geo.figName, spawnedSphere); } break; case GeoObjType.revolvedsurface: AbstractGeoObj spawnedrevSurf = null; //initialzed as null so that cases that do not spawn still have it initialized but still fails a null check. switch (geo.definition) { case GeoObjDef.Abstract: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Dependent: spawnedrevSurf = GeoObjConstruction.dRevSurface(spawnedObjects[geo.dependencies[0]] as AbstractPoint, spawnedObjects[geo.dependencies[1]] as AbstractLineSegment, geo.revSurfData.normDir); spawnedrevSurf.transform.position = geo.position; spawnedrevSurf.transform.rotation = geo.rotation; break; case GeoObjDef.Interactable: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.Static: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; case GeoObjDef.none: Debug.Log(geo.figName + " was attempted to spawn but is not supported yet within XMLManager script! Add construction function in place of this log."); break; default: break; } if (spawnedrevSurf != null) { if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(spawnedrevSurf, geo.label); } spawnedObjects.Add(geo.figName, spawnedrevSurf); } break; case GeoObjType.torus: break; case GeoObjType.flatface: Transform flatface = flatfaceBehave.Constructor().transform; flatface.transform.position = geo.position; flatface.transform.rotation = geo.rotation; if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(flatface.GetComponent <flatfaceBehave>(), geo.label); } spawnedObjects.Add(geo.figName, flatface.GetComponent <AbstractGeoObj>()); break; case GeoObjType.straightedge: Transform straightEdge = straightEdgeBehave.Constructor().transform; straightEdge.transform.position = geo.position; straightEdge.transform.rotation = geo.rotation; if (!String.IsNullOrEmpty(geo.label)) { GeoObjConstruction.label(straightEdge.GetComponent <straightEdgeBehave>(), geo.label); } spawnedObjects.Add(geo.figName, straightEdge.GetComponent <AbstractGeoObj>()); break; default: break; } } }
// Use this for initialization private void Start() { volumeLineRenderer = GetComponentInChildren <LineRenderer>(); TMPro = GetComponentInChildren <TextMeshPro>(); myAudioSource = GetComponent <AudioSource>(); xLen = .1f; controllPoint = GeoObjConstruction.iPoint(this.transform.position); prismBase.Add(controllPoint); prismBase.Add(GeoObjConstruction.dPoint(controllPoint.Position3 + Vector3.right * (sideLength1 - 2 * xLen))); prismBase.Add(GeoObjConstruction.dPoint(controllPoint.Position3 + Vector3.right * (sideLength1 - 2 * xLen) + Vector3.forward * (sideLength2 - 2 * xLen))); prismBase.Add(GeoObjConstruction.dPoint(controllPoint.Position3 + Vector3.forward * (sideLength2 - 2 * xLen))); List <AbstractLineSegment> prismBaseLines = new List <AbstractLineSegment>(); for (int i = 0; i < 3; i++) { prismBaseLines.Add(GeoObjConstruction.dLineSegment(prismBase[i], prismBase[i + 1])); } prismBaseLines.Add(GeoObjConstruction.dLineSegment(prismBase[prismBase.Count - 1], prismBase[0])); prismBasePoly = GeoObjConstruction.dPolygon(prismBaseLines, prismBase); prism = GeoObjConstruction.dPrism(prismBasePoly, prismBasePoly.center + Vector3.up * xLen); prismTopPoly = prism.bases[1]; cutoutRectangle.Add(prismBase[0]); cutoutRectangle.Add(GeoObjConstruction.dPoint(prismBase[0].Position3 + Vector3.back * xLen)); cutoutRectangle.Add(GeoObjConstruction.dPoint(prismBase[1].Position3 + Vector3.back * xLen)); cutoutRectangle.Add(prismBase[1]); cutoutRectangle.Add(GeoObjConstruction.dPoint(prismBase[1].Position3 + Vector3.right * xLen)); cutoutRectangle.Add(GeoObjConstruction.dPoint(prismBase[2].Position3 + Vector3.right * xLen)); cutoutRectangle.Add(prismBase[2]); cutoutRectangle.Add(GeoObjConstruction.dPoint(prismBase[2].Position3 + Vector3.forward * xLen)); cutoutRectangle.Add(GeoObjConstruction.dPoint(prismBase[3].Position3 + Vector3.forward * xLen)); cutoutRectangle.Add(prismBase[3]); cutoutRectangle.Add(GeoObjConstruction.dPoint(prismBase[3].Position3 + Vector3.left * xLen)); cutoutRectangle.Add(GeoObjConstruction.dPoint(prismBase[0].Position3 + Vector3.left * xLen)); List <AbstractLineSegment> cutoutLines = new List <AbstractLineSegment>(); for (int i = 0; i < cutoutRectangle.Count - 1; i++) { cutoutLines.Add(GeoObjConstruction.dLineSegment(cutoutRectangle[i], cutoutRectangle[i + 1])); } cutoutLines.Add(GeoObjConstruction.dLineSegment(cutoutRectangle[0], cutoutRectangle[cutoutRectangle.Count - 1])); cutoutRectanglePoly = GeoObjConstruction.dPolygon(cutoutLines, cutoutRectangle); foreach (MasterGeoObj mgo in prism.transform.parent.GetComponentsInChildren <MasterGeoObj>()) { if (mgo != controllPoint) { mgo.LeapInteraction = false; } } controllPoint.GetComponent <Leap.Unity.Interaction.InteractionBehaviour>().OnGraspedMovement += updateDiagram; controllPoint.GetComponent <Leap.Unity.Interaction.InteractionBehaviour>().OnGraspEnd += updateDiagram; volumeLineRenderer.useWorldSpace = false; Color tmp = Color.blue; tmp.a = .5f; cutoutRectanglePoly.figColor = tmp; foreach (AbstractPolygon poly in prism.allfaces) { tmp = Color.red; tmp.a = .5f; poly.figColor = tmp; } prism.bases[0].figColor = Color.clear; }
private void polyCut() { List <AbstractPolygon> prevPointPolygons = new List <AbstractPolygon>(); List <AbstractPolygon> currPointPolygons = new List <AbstractPolygon>(); HW_GeoSolver.ins.geomanager.bidirectionalNeighborsOfNode(_prevPoint.figName) //all bidirectional neighbors .Where(d => HW_GeoSolver.ins.geomanager.findGraphNode(d.Value).mytransform.GetComponent <AbstractPolygon>() != null).ToList() // list of all abstractpolygons in prev list .ForEach(d => prevPointPolygons.Add(HW_GeoSolver.ins.geomanager.findGraphNode(d.Value).mytransform.GetComponent <AbstractPolygon>())); //foreach adds the polygon to final list HW_GeoSolver.ins.geomanager.bidirectionalNeighborsOfNode(_currPoint.figName) //same as above but with other point .Where(d => HW_GeoSolver.ins.geomanager.findGraphNode(d.Value).mytransform.GetComponent <AbstractPolygon>() != null).ToList() .ForEach(d => currPointPolygons.Add(HW_GeoSolver.ins.geomanager.findGraphNode(d.Value).mytransform.GetComponent <AbstractPolygon>())); //prevPointPolygons.ForEach(p => Debug.Log(_prevPoint.figName + " is in the following: " + p.figName)); //Debug.Log("_____+_____"); //currPointPolygons.ForEach(p => Debug.Log(_currPoint.figName + " is in the following: " + p.figName)); //Debug.Log("_____=_____"); List <AbstractPolygon> sharedPolygons; if (prevPointPolygons.Count > currPointPolygons.Count) { sharedPolygons = prevPointPolygons.Intersect(currPointPolygons).Where(poly => poly.lineList.Count > 3).ToList(); } else { sharedPolygons = currPointPolygons.Intersect(prevPointPolygons).Where(poly => poly.lineList.Count > 3).ToList(); } //sharedPolygons.ForEach(p => Debug.Log("Both are in the following: " + p.figName)); //list created from any duplicates from two prev lists that have more than 3 sides //Debug.Log(_prevPoint.figName + " and " + _currPoint.figName + " are both on " + sharedPolygons.Count + " together."); if (sharedPolygons.Count > 0) { DependentLineSegment cutLine = GeoObjConstruction.dLineSegment(_prevPoint, _currPoint); foreach (AbstractPolygon p in sharedPolygons) { List <AbstractPoint> currPointList = p.pointList; List <AbstractLineSegment> currLineList = p.lineList; if (Mathf.Abs(currPointList.IndexOf(_prevPoint) - currPointList.IndexOf(_currPoint)) > 1) { List <AbstractPoint> newPointList1 = newPointListGen(currPointList, currPointList.IndexOf(_prevPoint), currPointList.IndexOf(_currPoint)); List <AbstractPoint> newPointList2 = newPointListGen(currPointList, currPointList.IndexOf(_currPoint), currPointList.IndexOf(_prevPoint)); List <AbstractLineSegment> newLineList1 = new List <AbstractLineSegment>() { cutLine }; //creates list and adds the line created by the cut List <AbstractLineSegment> newLineList2 = new List <AbstractLineSegment>() { cutLine }; //creates list and adds the line created by the cut foreach (AbstractLineSegment currLine in currLineList //newLineList1 Generator .Where(cL => ((cL.GetComponent <InteractableLineSegment>() != null && //is interactable line segment and point1 or point2 is found in newPointList1 newPointList1.Any(point => point == cL.GetComponent <InteractableLineSegment>().point1 || point == cL.GetComponent <InteractableLineSegment>().point2)) || ((cL.GetComponent <DependentLineSegment>() != null && //is dependent line segment and point1 or point2 is found in newPointList1 newPointList1.Any(point => point == cL.GetComponent <DependentLineSegment>().point1 || point == cL.GetComponent <DependentLineSegment>().point2)))))) { newLineList1.Add(currLine); } foreach (AbstractLineSegment currLine in currLineList //newLineList2 Generator .Where(cL => ((cL.GetComponent <InteractableLineSegment>() != null && //is interactable line segment and point1 or point2 is found in newPointList1 newPointList2.Any(point => point == cL.GetComponent <InteractableLineSegment>().point1 || point == cL.GetComponent <InteractableLineSegment>().point2)) || ((cL.GetComponent <DependentLineSegment>() != null && //is dependent line segment and point1 or point2 is found in newPointList1 newPointList2.Any(point => point == cL.GetComponent <DependentLineSegment>().point1 || point == cL.GetComponent <DependentLineSegment>().point2)))))) { newLineList2.Add(currLine); } AbstractPolygon newPoly1 = GeoObjConstruction.iPolygon(newLineList1, newPointList1); AbstractPolygon newPoly2 = GeoObjConstruction.iPolygon(newLineList2, newPointList2); List <InteractablePrism> currPrismList = new List <InteractablePrism>(); HW_GeoSolver.ins.geomanager.bidirectionalNeighborsOfNode(p.figName) //all bidirectional neighbors .Where(d => HW_GeoSolver.ins.geomanager.findGraphNode(d.Value).mytransform.GetComponent <InteractablePrism>() != null).ToList().ForEach(prism => currPrismList.Add(prism.mytransform.GetComponent <InteractablePrism>())); foreach (InteractablePrism cPrism in currPrismList) { HW_GeoSolver.ins.AddDependence(newPoly1, cPrism); HW_GeoSolver.ins.AddDependence(newPoly2, cPrism); } HW_GeoSolver.ins.removeComponent(p); } } } }
internal void Start() { shearingLabManager labMan = FindObjectOfType <shearingLabManager>(); labMan.measurementDisplays.Add(areaModel.transform); labMan.measurementDisplays.Add(perimeterModel.transform); //labMan.measurementDisplays.Add(crossSectionModel.transform); labMan.disableDisplays(); areaModel.GetComponent <MeshRenderer>().materials[0].color = mgoColor; perimeterModel.GetComponent <LineRenderer>().materials[0].color = mgoColor; crossSectionModel.GetComponent <LineRenderer>().materials[0].color = mgoColor; line1 = parallelLines.Constructor(); parallelLines line2 = parallelLines.Constructor(); line1.Position3 = Vector3.ProjectOnPlane(this.transform.position, Vector3.up) + Vector3.up * height2; line2.Position3 = Vector3.ProjectOnPlane(this.transform.position, Vector3.up) + Vector3.up * height1; line1.otherLine = line2; line2.otherLine = line1; AbstractPoint p1 = GeoObjConstruction.iPoint(line1.Position3); AbstractPoint p2 = GeoObjConstruction.iPoint(line2.Position3); AbstractPoint p3 = GeoObjConstruction.iPoint(line2.Position3 + line2.normalDir * 0.3f); p1.GetComponent <InteractionBehaviour>().OnGraspedMovement += checkOutOfRange; p1.GetComponent <InteractionBehaviour>().OnGraspEnd += constantVelOutOfRange; labMan.addApexToList(p1); //line not on Parallel l1 = GeoObjConstruction.dLineSegment(p1, p2); //line not on parallel l2 = GeoObjConstruction.dLineSegment(p1, p3); //line on parallel AbstractLineSegment l3 = GeoObjConstruction.dLineSegment(p3, p2); line1.attachedObjs.Add(p1); line2.attachedObjs.Add(p2); line2.attachedObjs.Add(p3); points.Add(p1); points.Add(p2); points.Add(p3); lines.Add(l1); lines.Add(l2); lines.Add(l3); triangle = GeoObjConstruction.dPolygon(lines, points); foreach (AbstractLineSegment line in lines) { line.GetComponent <InteractionBehaviour>().enabled = false; } triangle.GetComponent <InteractionBehaviour>().enabled = false; myLR = GetComponent <LineRenderer>(); palmDetectors = GetComponentsInChildren <PalmDirectionDetector>(); for (int i = 0; i < palmDetectors.Length; i++) { PalmDirectionDetector palm = palmDetectors[i]; palm.OnActivate.AddListener(startUpdateMesh); palm.OnDeactivate.AddListener(endUpdateMesh); ExtendedFingerDetector finger = palm.GetComponent <ExtendedFingerDetector>(); finger.OnDeactivate.AddListener(endUpdateMesh); switch (i) { case 0: palm.HandModel = leapHandDataLogger.ins.currHands.Lhand_rigged; finger.HandModel = leapHandDataLogger.ins.currHands.Lhand_rigged; break; case 1: palm.HandModel = leapHandDataLogger.ins.currHands.RHand_rigged; finger.HandModel = leapHandDataLogger.ins.currHands.RHand_rigged; break; default: break; } //the extended finger detectors are set to enable/disable the respective PalmDirectionDetectors. } updateLR = updateLR_Routine(); if (overridePalmDetector) { startUpdateMesh(); } triangle.figColor = mgoColor; movePointOnLine = animatePoint(points[0]); }