Ejemplo n.º 1
0
        private void Update()
        {
            const float SNAP_DISTANCE = 0.04f;
            const float SNAP_ANGLE    = 20.0f;

            UpdateHandleSize();

            if (IsDragged)
            {
                if (!isExtruding && extrudingFaces.Count == 1)
                {
                    ControlsManager.Instance.updateAdjacentFaceHandles(AssociatedFaceID);
                }

                Vector3     controllerPosInLocalSpace = transform.parent.worldToLocalMatrix.MultiplyPoint(_controllerCollider.transform.position);
                var         move_from_initial_pos     = controllerPosInLocalSpace - initialControllerPosInLocalSpace;
                GrabControl gc = _controller as GrabControl;
                GrabControl leftGrabControl  = GameObject.Find("leftGrabControl").GetComponent <GrabControl>();
                GrabControl rightGrabControl = GameObject.Find("rightGrabControl").GetComponent <GrabControl>();

                //Check if left hand is sensing, if true do SBS
                if (leftGrabControl.collidedFaceHandle != null && leftGrabControl.HandState.ToString().Equals("TOUCHING") && !OVRInput.Get(OVRInput.Touch.Any, OVRInput.Controller.LTouch))
                {
                    hideMeasuringBands();
                    //destroyMeasuringBands();

                    Vector3 faceNormal = Extrudable._manifold.GetFaceNormal(leftGrabControl.collidedFaceHandle.AssociatedFaceID);
                    Vector3 facePoint  = Extrudable._manifold.GetCenter(leftGrabControl.collidedFaceHandle.AssociatedFaceID);

                    foreach (KeyValuePair <int, Vector3> vertex in Extrudable._manifold.GetVertexPositionsFromFace(AssociatedFaceID))
                    {
                        Extrudable.MoveVertexAlongVector(
                            vertex.Key,
                            pointToPlaneVector(faceNormal, facePoint, Extrudable._manifold.VertexPosition(vertex.Key)));
                    }
                    planeSnap = true;
                    ControlsManager.Instance.Extrudable.rebuild = true;
                    //Debug.Log("SBS");
                    EnableSBSPlane(facePoint, faceNormal);
                }
                //Check if right hand is sensing, if true do SBS
                else if (rightGrabControl.collidedFaceHandle != null && rightGrabControl.HandState.ToString().Equals("TOUCHING") && !OVRInput.Get(OVRInput.Touch.Any, OVRInput.Controller.RTouch))
                {
                    hideMeasuringBands();
                    //destroyMeasuringBands();

                    Vector3 faceNormal = Extrudable._manifold.GetFaceNormal(rightGrabControl.collidedFaceHandle.AssociatedFaceID);
                    Vector3 facePoint  = Extrudable._manifold.GetCenter(rightGrabControl.collidedFaceHandle.AssociatedFaceID);

                    foreach (KeyValuePair <int, Vector3> vertex in Extrudable._manifold.GetVertexPositionsFromFace(AssociatedFaceID))
                    {
                        Extrudable.MoveVertexAlongVector(
                            vertex.Key,
                            pointToPlaneVector(faceNormal, facePoint, Extrudable._manifold.VertexPosition(vertex.Key)));
                    }
                    planeSnap = true;
                    ControlsManager.Instance.Extrudable.rebuild = true;
                    Debug.Log("SBS");
                    EnableSBSPlane(facePoint, faceNormal);
                }
                else
                {
                    DisableSBSPlane();
                    planeSnap = false;
                    if (!isExtruding)
                    {
                        if (move_from_initial_pos.magnitude > SNAP_DISTANCE)
                        {
                            ControlsManager.Instance.SetVertexPositionsById(initialVertexPositions);
                            ControlsManager.Instance.updateAdjacentFaceHandles(AssociatedFaceID);
                            Extrudable.StartExtrusion(extrudingFaces.ToArray());
                            isExtruding = true;
                            //if (extrudingFaces.Count() == 1)  // multiple faces ???
                            //{
                            initializeMeasuringBands();
                            //extrudedVertexPositions = Extrudable._manifold.GetVertexPositionsFromFaces(new List<int> { AssociatedFaceID });
                            extrudedVertexPositions = Extrudable._manifold.GetVertexPositionsFromFaces(extrudingFaces);
                            //}

                            if (gc)
                            {
                                StartCoroutine(Buzz(gc.Controller));
                            }
                        }
                    }

                    //if (OVRInput.Get(OVRInput.NearTouch.PrimaryThumbButtons, gc.Controller) && extrudingFaces.Count() == 1)
                    //Measuring band
                    if (OVRInput.Get(OVRInput.Axis1D.PrimaryIndexTrigger, gc.Controller) > 0.2 || OVRInput.Get(OVRInput.NearTouch.PrimaryThumbButtons, gc.Controller))
                    {
                        tickState = true;
                    }
                    else
                    {
                        tickState = false;
                    }

                    transform.localPosition = controllerPosInLocalSpace - initialControllerOffset;
                    var translate_vector = transform.localPosition;

                    var norm = Extrudable.GetFaceNormal(AssociatedFaceID);

                    if (translateSnap && isExtruding && !tickState)
                    {
                        float d = Vector3.Dot(norm, move_from_initial_pos);
                        if ((move_from_initial_pos - d * norm).magnitude > SNAP_DISTANCE)
                        {
                            translateSnap = false;
                            destroyMeasuringBands();
                            // GrabControl gc = _controller as GrabControl;
                            if (gc)
                            {
                                StartCoroutine(Buzz(gc.Controller));
                            }
                        }
                    }

                    if (!isExtruding)
                    {
                        ControlsManager.Instance.SetVertexPositionsById(initialVertexPositions);
                    }
                    else if (extrudedVertexPositions != null)
                    {
                        ControlsManager.Instance.SetVertexPositionsById(extrudedVertexPositions);
                    }


                    Extrudable.MoveTo(
                        AssociatedFaceID,
                        extrudingFaces.ToArray(),
                        translate_vector, translateSnap && isExtruding, tickState && angleSnap);

                    //if (isExtruding && translateSnap && angleSnap && extrudingFaces.Count() == 1)
                    if (isExtruding && translateSnap && angleSnap)
                    {
                        if (tickState)
                        {
                            float extrusionLength = (Extrudable._manifold.GetCenter(AssociatedFaceID) - initialFaceCenter).magnitude;
                            updateMeasuringBands(Mathf.Round(extrusionLength * 50) / 50);
                        }
                        else
                        {
                            updateMeasuringBands(Vector3.Dot(move_from_initial_pos, norm));
                        }
                    }

                    // change between previous rotation and current rotation
                    var controllerRotInLocalSpace = GetControllerRotationInLocalSpace();
                    if (angleSnap && !tickState)
                    {
                        // Compute the rotation from the original controller orientation to the present.
                        // If that rotation is greater than 10 degrees, snapping is turned off, and the face orientation
                        // tracks the hand´s orientation.
                        var     fullRotation = controllerRotInLocalSpace * Quaternion.Inverse(firstRotation);
                        float   angle        = 0.0f;
                        Vector3 axis         = Vector3.zero;
                        fullRotation.ToAngleAxis(out angle, out axis);
                        if (angle > SNAP_ANGLE)
                        {
                            angleSnap = false;
                            destroyMeasuringBands();
                            //GrabControl gc = _controller as GrabControl;
                            if (gc)
                            {
                                StartCoroutine(Buzz(gc.Controller));
                            }
                        }
                    }

                    if (!angleSnap)
                    {
                        var deltaRotation = controllerRotInLocalSpace * Quaternion.Inverse(firstRotation);
                        Extrudable.RotateFaceAroundPoint(extrudingFaces.ToArray(),
                                                         transform.localPosition, deltaRotation);
                    }

                    //lastRotation = GetControllerRotationInLocalSpace();
                    ControlsManager.Instance.Extrudable.rebuild = true;

                    /*
                     * if (extrudingFaces.Count > 1)
                     * {
                     *  controlsManager.UpdateFacesAndSelectedEdges(new List<int> { AssociatedFaceID});
                     * }
                     */
                }
            }
        }
Ejemplo n.º 2
0
        // 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;
                    }
                }
            }
        }