Exemplo n.º 1
0
 void Awake()
 {
     Instance          = this;
     _faceHandles      = new Dictionary <int, FaceHandleController>();
     _edgeHandles      = new Dictionary <int, EdgeHandleController>();
     _vertexHandles    = new Dictionary <int, VertexHandleController>();
     _closedEdgeBackup = new List <KeyValuePair <int, int> >();
 }
Exemplo n.º 2
0
        public override void Interact()
        {
            // pointToPlaneVectorTest

            /*
             * Vector3 nTest = new Vector3(1f, 1f, 0f);
             * Vector3 pvTest = new Vector3(2f, 2f, 0f);
             *
             * Vector3 pointTest = new Vector3(1f, 5f, 0f);
             * Vector3 pointTest2 = new Vector3(1f, 5f, 1f);
             * Vector3 pointTest3 = new Vector3(6f, 3f, 0f);
             * Vector3 pointTest4 = new Vector3(6f, 3f, 1f);
             *
             * Debug.Log(pointToPlaneVector(nTest, pvTest, pointTest).ToVector3f().ToString());
             * Debug.Log(pointToPlaneVector(nTest, pvTest, pointTest2).ToVector3f().ToString());
             * Debug.Log(pointToPlaneVector(nTest, pvTest, pointTest3).ToVector3f().ToString());
             * Debug.Log(pointToPlaneVector(nTest, pvTest, pointTest4).ToVector3f().ToString());
             */

            initialPosition   = transform.localPosition;
            initialRotation   = transform.localRotation;
            initialFaceCenter = Extrudable._manifold.GetCenter(AssociatedFaceID);
            initialManifold   = Extrudable._manifold.Copy();

            selectedFaceList = GetAdjacentLockedFaces(AssociatedFaceID, new List <AdjacentLockedFaces>());

            extrudingFaces = selectedFaceList.ConvertAll(pair => pair.faceid);
            ControlsManager.Instance.RemoveLatches(extrudingFaces);
            initialVertexPositions = ControlsManager.Instance.GetVertexPositionsFromFaces(extrudingFaces);
            isExtruding            = false;

            var worldToLocal = transform.parent.worldToLocalMatrix;

            initialControllerPosInLocalSpace = worldToLocal.MultiplyPoint(_controllerCollider.transform.position);
            initialControllerOffset          = initialControllerPosInLocalSpace - transform.localPosition;
            IsDragged = true;

            lastRotation  = GetControllerRotationInLocalSpace();
            firstRotation = lastRotation;
            angleSnap     = true;
            translateSnap = true;

            ControlsManager.Instance.Extrudable.rebuild = true;
            if (extrudingFaces.Count > 1)
            {
                ControlsManager.Instance.DeleteControlsExceptSelectedFaces(new List <int> {
                    AssociatedFaceID
                });
            }
            else
            {
                //ControlsManager.Instance.DeleteControlsExceptSelectedFaces(extrudingFaces);
                //ControlsManager.Instance.DeleteControlsExceptFaces(initialManifold.GetAdjacentFaceIdsAndEdgeCenters(AssociatedFaceID).faceId, AssociatedFaceID);
                ControlsManager.Instance.DeleteControlsExceptFaces(new int[0], AssociatedFaceID);
            }

            ControlsManager.FireUndoStartEvent(mesh, this, initialPosition, initialRotation);
        }
Exemplo n.º 3
0
        void Awake()
        {
            _hoverHighlight = GetComponent <HoverHighlight>();
            var meshFilter = GetComponent <MeshFilter>();

            mesh            = meshFilter.sharedMesh;
            controlsManager = FindObjectOfType <ControlsManager>();
            loadedSBSPlane  = Resources.Load("Prefabs/SBS_Plane_indicator");
        }
Exemplo n.º 4
0
        public override void Interact()
        {
            //Debug.Log(AssociatedVertexID);
            interactingControllerCollider = _controllerCollider.transform;
            activeControllers.Add(this);

            //splitManifold = Extrudable._manifold.Copy();
            initialManifold = Extrudable._manifold.Copy();

            //Debug.Log(Extrudable._manifold.)
            adjacentVertices = AdjacentVertices();

            if (activeControllers.Count == 1)
            {
                ChangeInteraction(InteractionMode.SINGLE);
                IsDragged = true;

                initialPosition = transform.localPosition;
                initialRotation = transform.localRotation;

                Vector3 controllerPosInLocalSpace = transform.parent.worldToLocalMatrix.MultiplyPoint(_controllerCollider.transform.position);
                initialControllerOffset = controllerPosInLocalSpace - transform.localPosition;
                ControlsManager.Instance.Extrudable.rebuild = true;
                ControlsManager.FireUndoStartEvent(mesh, this, initialPosition, initialRotation);
                if (ControlsManager.Instance.turntable)
                {
                    minDeltaY = transform.parent.InverseTransformPoint(Vector3.one * ControlsManager.Instance.turntable.GetMaxYWithBounds()).y;
                }
                else
                {
                    minDeltaY = -100f;
                }

                // Display two handed options
            }
            else if (activeControllers.Count == 2 && refinementActive && adjacentVertices.ContainsKey(activeControllers[0].AssociatedVertexID) && adjacentVertices.ContainsKey(activeControllers[1].AssociatedVertexID))
            {
                activeControllers[0].ChangeInteraction(InteractionMode.DUAL);
                ChangeInteraction(InteractionMode.DUAL);
                Extrudable.MoveVertexTo(activeControllers[0].AssociatedVertexID, activeControllers[0].transform.localPosition);
                Extrudable.rebuild = true;
                initialRotation    = transform.localRotation;
                AddEdgeBarSignifier();
            }

            ControlsManager.Instance.DestroyFacesAndEdgeHandles();
        }
Exemplo n.º 5
0
        public override void StopInteraction()
        {
            if (IsDragged)
            {
                destroyMeasuringBands();
                IsDragged = false;

                if (collision == false && !planeSnap)
                {
                    Extrudable.MoveTo(
                        AssociatedFaceID,
                        extrudingFaces.ToArray(),
                        transform.localPosition, translateSnap && isExtruding, tickState);
                }
                else if (!planeSnap)
                //else if (extrudingFaces.Count == 1) // yes/no maybe
                {
                    Debug.Log("Attempting face bridging");
                    if (true)//(hasDistinctAdjacentFaces(collidedFaceHandle))
                    {
                        //collidedFaceHandleVertexPositions = controlsManager.GetVertexPositionsFromFaces(new List<int> { collidedFaceID });
                        collidedFaceHandleVertexPositions = initialManifold.GetVertexPositionsFromFace(collidedFaceID);

                        if (collidedFaceHandleVertexPositions.Count() == initialVertexPositions.Count() && extrudingFaces.Count == 1)
                        {
                            var matches = faceBridgingVertexAssignment(initialVertexPositions, collidedFaceHandleVertexPositions);

                            if (/*facingFaces(matches, AssociatedFaceID, initialVertexPositions, collidedFaceID, collidedFaceHandleVertexPositions)*/ true)
                            {
                                Extrudable.ChangeManifold(initialManifold.Copy());
                                Debug.Log("Applying face bridging");
                                if (matches.Length == 6)
                                {
                                    Extrudable.bridgeFaces(AssociatedFaceID, collidedFaceID, new int[] { matches[0], matches[1], matches[2] }, new int[] { matches[3], matches[4], matches[5] }, 3);
                                    ControlsManager.Instance.UpdateControls();
                                }
                                else if (matches.Length == 8)
                                {
                                    Extrudable.bridgeFaces(AssociatedFaceID, collidedFaceID, new int[] { matches[0], matches[1], matches[2], matches[3] }, new int[] { matches[4], matches[5], matches[6], matches[7] }, 4);
                                    ControlsManager.Instance.UpdateControls();
                                }
                            }
                        }
                    }
                    collidedFaceHandleVertexPositions = null;
                }


                MergeWithCollidingFaces(); //Merge extrusion if done up against other faces.

                //Check if mesh is valid
                extrudingFaces = new List <int>(); // create new list (may be referenced by other hand)

                int collapsed = Extrudable.CollapseShortEdges(0.019f);
                Extrudable.TriangulateAndDrawManifold(); // needed for collision detection in isValidMesh



                if (Extrudable.isValidMesh())
                {
                    ControlsManager.Instance.DestroyInvalidObjects();
                    ControlsManager.Instance.Extrudable.rebuild = true;
                    //ControlsManager.Instance.UpdateControls();
                    ControlsManager.FireUndoEndEvent(mesh, this, initialPosition, initialRotation);
                }
                else
                {
                    Extrudable.ChangeManifold(initialManifold);
                }

/*
 *              if (collapsed > 0)
 *              {
 *
 *              }
 *              else if (Extrudable.isValidMesh())
 *              {
 *                  //ControlsManager.Instance.DestroyInvalidObjects();
 *                  ControlsManager.Instance.Extrudable.rebuild = true;
 *                  //ControlsManager.Instance.UpdateControls();
 *                  ControlsManager.FireUndoEndEvent(mesh, this, initialPosition, initialRotation);
 *
 *
 *
 *
 *              }
 *              else
 *              {
 *                  Extrudable.ChangeManifold(initialManifold);
 *              }*/
                DisableSBSPlane();
            }
        }
Exemplo n.º 6
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();
        }
Exemplo n.º 7
0
 void Awake()
 {
     _hoverHighlight = GetComponent <HoverHighlight>();
     controlsManager = FindObjectOfType <ControlsManager>();
 }
Exemplo n.º 8
0
 // Use this for initialization
 void Awake()
 {
     controlsManager = FindObjectOfType <ControlsManager>();
 }