コード例 #1
0
        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);
        }
コード例 #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;
                    }
                }
            }
        }
コード例 #3
0
        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();
        }