private RefinementMode DetermineRefinement(Dictionary <string, float> angleDict) { RefinementMode refmode = RefinementMode.NO; //if ((angleDict["left"] > 20f && angleDict["left"] < 90f) && (angleDict["right"] > 20f && angleDict["right"] < 90f)) if ((angleDict["left"] > 30f) && (angleDict["right"] > 30f)) { refmode = RefinementMode.LOOP; } return(refmode); }
// Update is called once per frame void Update() { Vector3 left_ctrl_pt = GameObject.Find("LeftHandAnchor").transform.position; Vector3 right_ctrl_pt = GameObject.Find("RightHandAnchor").transform.position; float dist_left_ctrl = (10.0f * (left_ctrl_pt - transform.position)).sqrMagnitude; float dist_right_ctrl = (10.0f * (right_ctrl_pt - transform.position)).sqrMagnitude; float sz = 0.1f + 0.9f / (Mathf.Min(dist_left_ctrl, dist_right_ctrl) + 1.0f); transform.localScale = new Vector3(sz, sz, sz); if (updateInFrame == Time.frameCount) { return; } if (activeControllers.Count == 1 && activeControllers[0] == this) { if (IsDragged) { if (ControlsManager.Instance.GetHandle(1) != null) { ControlsManager.Instance.ClearFaceHandlesAndEdges(); } Vector3 controllerPosInLocalSpace = transform.parent.worldToLocalMatrix.MultiplyPoint(_controllerCollider.transform.position); Vector3 targetPos = controllerPosInLocalSpace - initialControllerOffset; //targetPos.y = Mathf.Max(minDeltaY, targetPos.y); I don't know what this line was supposed to do, if something is broken in the futere maybe this is needed. transform.localPosition = targetPos; Extrudable.MoveVertexTo( AssociatedVertexID, transform.localPosition); GrabControl leftGrabControl = GameObject.Find("leftGrabControl").GetComponent <GrabControl>(); GrabControl rightGrabControl = GameObject.Find("rightGrabControl").GetComponent <GrabControl>(); //SBS if (leftGrabControl.collidedVertexHandle != null && leftGrabControl.HandState.ToString().Equals("TOUCHING") && !OVRInput.Get(OVRInput.Touch.Any, OVRInput.Controller.LTouch)) { Matrix4x4 LtoW = leftGrabControl.collidedVertexHandle.transform.localToWorldMatrix; Vector3 touchPoint = leftGrabControl.collidedVertexHandle.transform.localPosition; Vector3 distanceVector = initialPosition - touchPoint; Vector3 translationVector = new Vector3(0f, 0f, 0f); if (Mathf.Abs(distanceVector.x) >= Mathf.Abs(distanceVector.y) && Mathf.Abs(distanceVector.x) >= Mathf.Abs(distanceVector.z)) { translationVector = new Vector3(distanceVector.x, 0f, 0f); } else if (Mathf.Abs(distanceVector.y) >= Mathf.Abs(distanceVector.x) && Mathf.Abs(distanceVector.y) >= Mathf.Abs(distanceVector.z)) { translationVector = new Vector3(0f, distanceVector.y, 0f); } else if (Mathf.Abs(distanceVector.z) >= Mathf.Abs(distanceVector.x) && Mathf.Abs(distanceVector.z) >= Mathf.Abs(distanceVector.y)) { translationVector = new Vector3(0f, 0f, distanceVector.z); } Extrudable.MoveVertexTo( AssociatedVertexID, leftGrabControl.collidedVertexHandle.transform.localPosition + translationVector); Debug.Log(leftGrabControl.collidedVertexHandle.transform.position + " : " + leftGrabControl.collidedVertexHandle.transform.TransformPoint(touchPoint)); EnableSBSLine(leftGrabControl.collidedVertexHandle.transform.localPosition, translationVector, leftGrabControl.collidedVertexHandle.transform.root.localToWorldMatrix); } else if (rightGrabControl.collidedVertexHandle != null && rightGrabControl.HandState.ToString().Equals("TOUCHING") && !OVRInput.Get(OVRInput.Touch.Any, OVRInput.Controller.RTouch)) { Vector3 touchPoint = rightGrabControl.collidedVertexHandle.transform.localPosition; Vector3 distanceVector = initialPosition - touchPoint; Vector3 translationVector = new Vector3(0f, 0f, 0f); if (Mathf.Abs(distanceVector.x) >= Mathf.Abs(distanceVector.y) && Mathf.Abs(distanceVector.x) >= Mathf.Abs(distanceVector.z)) { translationVector = new Vector3(distanceVector.x, 0f, 0f); } else if (Mathf.Abs(distanceVector.y) >= Mathf.Abs(distanceVector.x) && Mathf.Abs(distanceVector.y) >= Mathf.Abs(distanceVector.z)) { translationVector = new Vector3(0f, distanceVector.y, 0f); } else if (Mathf.Abs(distanceVector.z) >= Mathf.Abs(distanceVector.x) && Mathf.Abs(distanceVector.z) >= Mathf.Abs(distanceVector.y)) { translationVector = new Vector3(0f, 0f, distanceVector.z); } Extrudable.MoveVertexTo( AssociatedVertexID, rightGrabControl.collidedVertexHandle.transform.localPosition + translationVector); EnableSBSLine(rightGrabControl.collidedVertexHandle.transform.localPosition, translationVector, leftGrabControl.collidedVertexHandle.transform.root.localToWorldMatrix); } else { DisableSBSLine(); } ControlsManager.Instance.Extrudable.rebuild = true; //ControlsManager.Instance.UpdateControls(); } } else { DisableSBSLine(); if (activeControllers.Count == 2 && refinementActive) { if (mode == InteractionMode.DUAL) { Dictionary <string, float> angleDict = new Dictionary <string, float>(); foreach (VertexHandleController v in activeControllers) { float angle = Mathf.Abs(v.interactingControllerCollider.transform.rotation.eulerAngles.z - v.initialControllerRotation.eulerAngles.z) % 180f; if (v.interactingControllerCollider.gameObject.name.StartsWith("right")) { angleDict["right"] = angle; } else if (v.interactingControllerCollider.gameObject.name.StartsWith("left")) { angleDict["left"] = angle; } } refinementMode = DetermineRefinement(angleDict); //Show what refinement would do if (refinementMode != lastRefinementMode) { if (refinementMode == RefinementMode.LOOP) { ShowRefinement(activeControllers[0].AssociatedVertexID, activeControllers[1].AssociatedVertexID); } else if (refinementMode == RefinementMode.NO) { GameObject refinePreview = GameObject.FindGameObjectWithTag("RefinePreview"); refinePreview.GetComponent <MeshRenderer>().enabled = false; } } lastRefinementMode = refinementMode; } } } }
public override void StopInteraction() { updateInFrame = Time.frameCount; //if (activeControllers.Count == 1) //{ // activeControllers[0].ChangeInteraction(InteractionMode.SINGLE); //} //else if (mode == InteractionMode.SINGLE) { activeControllers.Remove(this); if (IsDragged) { IsDragged = false; int collapsed = Extrudable.CollapseShortEdges(0.019f); if (collapsed > 0) { Extrudable.TriangulateAndDrawManifold(); if (Extrudable.isValidMesh()) { ControlsManager.Instance.DestroyInvalidObjects(); ControlsManager.Instance.Extrudable.rebuild = true; //ControlsManager.Instance.UpdateControls(); ControlsManager.FireUndoEndEvent(mesh, this, initialPosition, initialRotation); } else { Extrudable.ChangeManifold(initialManifold); } } else if (Extrudable.isValidMesh()) { ControlsManager.Instance.Extrudable.rebuild = true; //ControlsManager.Instance.UpdateControls(); ControlsManager.FireUndoEndEvent(mesh, this, initialPosition, initialRotation); } else { Extrudable.ChangeManifold(initialManifold); } } } else { if (mode == InteractionMode.DUAL && refinementActive) { if (refinementMode == RefinementMode.LOOP) { // This or TriangulateAndDraw + ControlsManager.Instance.the function that clears and updates //Extrudable._manifold = splitManifold; //Extrudable.UpdateMesh(); Extrudable.ChangeManifold(splitManifold); ControlsManager.FireUndoEndEvent(mesh, this, initialPosition, initialRotation); } if (activeControllers.Count == 2) { // Do the refinement and clear the splitManifold //ShowRefinement(activeControllers[0].AssociatedVertexID, activeControllers[1].AssociatedVertexID); activeControllers.Remove(this); activeControllers[0].ChangeInteraction(InteractionMode.SINGLE); activeControllers[0].EndHighlight(); activeControllers[0].IsDragged = false; activeControllers[0].StopInteraction(); } GameObject refinePreview = GameObject.FindGameObjectWithTag("RefinePreview"); refinePreview.GetComponent <MeshRenderer>().enabled = false; ChangeInteraction(InteractionMode.SINGLE); refinementMode = RefinementMode.NO; } } //ControlsManager.Instance.UpdateControls(); if (edgebar) { Destroy(edgebar); } DisableSBSLine(); }