Example #1
0
        public void UpdateSnapEdgeGUIOnly(Vector2 mousePos, bool isShift, bool isCtrl, bool isPressed)
        {
            if (Vector2.SqrMagnitude(_isTmpEdgeWire_SnapCheck_MousePos - mousePos) > 1.0f ||
                _isTmpEdgeWire_SnapCheck_PrevShift != isShift ||
                _isTmpEdgeWire_SnapCheck_PrevCtrl != isCtrl)
            {
                _isTmpEdgeWire_SnapToEdge = false;
                _tmpEdgeWire_SnapToEdge   = Vector2.zero;

                //if (isShift && _mesh != null && !isCtrl && _curVertex == null)
                if (isShift && _mesh != null && !isCtrl && !isPressed)
                {
                    //추가
                    //가장 가까운 Edge의 점을 찾는다.
                    apMeshEdge nearestEdge = GetMeshNearestEdge(mousePos, _mesh, 3.0f);                    //<<기본적인 5가 아닌 3이다. 제한적임
                    if (nearestEdge != null)
                    {
                        _isTmpEdgeWire_SnapToEdge = true;
                        _tmpEdgeWire_SnapToEdge   = nearestEdge.GetNearestPosOnEdge(apGL.GL2World(mousePos) + _mesh._offsetPos);
                    }
                }

                //Debug.Log("UpdateSnapEdgeGUIOnly >> " + _isTmpEdgeWire_SnapToEdge);

                _isTmpEdgeWire_SnapCheck_MousePos  = mousePos;
                _isTmpEdgeWire_SnapCheck_PrevShift = isShift;
                _isTmpEdgeWire_SnapCheck_PrevCtrl  = isCtrl;
            }
            //_tmpEdgeWire_MousePos = mousePos;
        }
Example #2
0
        //----------------------------------------------------------------
        public void AddMirrorVertex(apVertex prevVert, apVertex addedVert, apMesh mesh, bool isAddEdge, bool isShift, bool isNewVert, bool isAddVertexWithSplit)
        {
            apVertex mirrorVert_Prev = null;
            apVertex mirrorVert_Next = null;

            //float mirrorOffset = _editor._meshTRSOption_MirrorOffset;
            //float clickableOffset = Mathf.Max(6.0f, mirrorOffset);//6은 기본 클릭 범위
            float clickableOffset = 6.0f;

            if (isNewVert)
            {
                //새로운 버텍스를 생성했다면 미러쪽도 새로 만드는 방향으로 해야한다.
                clickableOffset = 2.0f;
            }

            bool isSnap = _editor._meshTRSOption_MirrorSnapVertOnRuler;

            //추가된 버텍스가 있다 (각각 Prev, Next에 대해서 동일한 처리)
            //=> 1) 축에 있다면
            //		=> Snap 옵션이 켜졌다면 Mirror대신 축으로 위치를 보정한다. (미러 생성 안하고 mirrorVert를 이걸로 설정)
            //		=> Snap 옵션이 꺼졌다면 처리하지 않는다. (Mirror가 안됨)
            //=> 2) 미러 위치를 계산한다.
            //		=> 근처에 버텍스가 있다면 그걸 선택하고, 위치를 보정한다. (Prev와 Next는 같은 점을 공유할 수 없다.)
            //		=> 근처에 버텍스가 없다면 새로 생성한다.
            //=> isAddEdge가 True일 때, mirrorVert Prev, Next가 모두 있다면 Edge 생성. 단, 서로 교차된 경우는 생략한다.



            if (prevVert != null)
            {
                if (IsOnAxisByMesh(prevVert._pos, mesh))
                {
                    //1) 축에 있는가
                    if (isSnap)
                    {
                        //=> 위치만 보정한다.
                        mirrorVert_Prev      = prevVert;
                        mirrorVert_Prev._pos = GetAxisPosToSnap(prevVert._pos, mesh);
                    }
                    else
                    {
                        //=> 위치 보정 없이 그냥 선택한다.
                        mirrorVert_Prev = prevVert;
                    }
                }
                else
                {
                    //2) 축 바깥이라면 미러 위치를 계산한다.
                    Vector2 mirrorPos = GetMirrorPosByMesh(prevVert._pos, mesh);

                    //근처에 Vertex가 있는가
                    apVertex nearestVert = FindNearestVertex(mirrorPos, mesh, clickableOffset);
                    if (nearestVert != null)
                    {
                        //=> 이걸 선택하고 위치만 보정한다.
                        mirrorVert_Prev      = nearestVert;
                        mirrorVert_Prev._pos = mirrorPos;
                    }
                    else
                    {
                        //=> 새로 생성하자
                        mirrorVert_Prev = mesh.AddVertexAutoUV(mirrorPos);
                    }
                }
            }

            if (addedVert != null && prevVert != addedVert)
            {
                if (IsOnAxisByMesh(addedVert._pos, mesh))
                {
                    //1) 축에 있는가
                    if (isSnap)
                    {
                        //=> 위치만 보정한다.
                        mirrorVert_Next      = addedVert;
                        mirrorVert_Next._pos = GetAxisPosToSnap(addedVert._pos, mesh);
                    }
                    else
                    {
                        //=> 위치 보정 없이 그냥 선택한다.
                        mirrorVert_Next = addedVert;
                    }
                }
                else
                {
                    //2) 축 바깥이라면 미러 위치를 계산한다.
                    Vector2 mirrorPos = GetMirrorPosByMesh(addedVert._pos, mesh);

                    //근처에 Vertex가 있는가 + Prev와 다른 Vertex인가
                    apVertex nearestVert = FindNearestVertex(mirrorPos, mesh, clickableOffset);
                    if (nearestVert != null && mirrorVert_Prev != nearestVert)
                    {
                        //=> 이걸 선택하고 위치만 보정한다.
                        mirrorVert_Next      = nearestVert;
                        mirrorVert_Next._pos = mirrorPos;
                    }
                    else
                    {
                        //=> 새로 생성하자
                        if (isAddVertexWithSplit)
                        {
                            //만약 원 소스가 Edge를 Split하고 Vertex를 만든 거라면,
                            //Mirror도 주변의 Edge를 Split해야한다.
                            apMeshEdge nearestEdge = GetMeshNearestEdge(mirrorPos, mesh, 3.0f);
                            if (nearestEdge != null)
                            {
                                Vector2 splitPos = nearestEdge.GetNearestPosOnEdge(mirrorPos);
                                if (Mathf.Abs(splitPos.x - nearestEdge._vert1._pos.x) < 1 && Mathf.Abs(splitPos.y - nearestEdge._vert1._pos.y) < 1)
                                {
                                    //Vert1과 겹친다.
                                    mirrorVert_Next = nearestEdge._vert1;
                                }
                                else if (Mathf.Abs(splitPos.x - nearestEdge._vert2._pos.x) < 1 && Mathf.Abs(splitPos.y - nearestEdge._vert2._pos.y) < 1)
                                {
                                    //Vert2와 겹친다.
                                    mirrorVert_Next = nearestEdge._vert2;
                                }
                                else
                                {
                                    //겹치는게 없다.
                                    mirrorVert_Next = mesh.SplitEdge(nearestEdge, splitPos);
                                }
                            }
                        }
                        else
                        {
                            mirrorVert_Next = mesh.AddVertexAutoUV(mirrorPos);
                        }
                    }
                }
            }

            //if(!isAddEdge)
            //{
            //	Debug.LogError("Add Edge => False");
            //}
            if (isAddEdge && mirrorVert_Prev != null && mirrorVert_Next != null)
            {
                //Edge를 추가하자
                //단, 두개가 서로 Mirror된게 아니라면 생략
                if ((mirrorVert_Prev == prevVert && mirrorVert_Next == addedVert) ||
                    (mirrorVert_Next == prevVert && mirrorVert_Prev == addedVert))                       //<<또는 그 반대
                {
                    //새로 만드는거 실패.
                    //서로 교차되고 있었다.
                    //Shift 키를 누른 상태라면 => Mirror 위치에 중점을 만들자.
                    if (isShift && mirrorVert_Prev != mirrorVert_Next)
                    {
                        //Mirror의 양쪽에 위치한 경우
                        bool    isCounterSize = false;
                        Vector2 centerPos     = (mirrorVert_Prev._pos + mirrorVert_Next._pos) * 0.5f;
                        if (mesh._isMirrorX)
                        {
                            if ((mirrorVert_Prev._pos.x - mesh._mirrorAxis.x) * (mirrorVert_Next._pos.x - mesh._mirrorAxis.x) < 0.0f)
                            {
                                //축으로부터 X 변화량의 곱이 -1인 경우
                                isCounterSize = true;
                                centerPos.x   = mesh._mirrorAxis.x;
                            }
                        }
                        else
                        {
                            if ((mirrorVert_Prev._pos.y - mesh._mirrorAxis.y) * (mirrorVert_Next._pos.y - mesh._mirrorAxis.y) < 0.0f)
                            {
                                //축으로부터 Y 변화량의 곱이 -1인 경우
                                isCounterSize = true;
                                centerPos.y   = mesh._mirrorAxis.y;
                            }
                        }
                        if (isCounterSize)
                        {
                            apMeshEdge existEdge = mesh._edges.Find(delegate(apMeshEdge a)
                            {
                                return(a.IsSameEdge(mirrorVert_Prev, mirrorVert_Next));
                            });

                            if (existEdge != null)
                            {
                                //분할하자
                                mesh.SplitEdge(existEdge, centerPos);
                                //apVertex centerVert = mesh.AddVertexAutoUV(centerPos);
                                //mesh.RemoveEdge(existEdge);

                                //if (centerVert != null)
                                //{
                                //	mesh.MakeNewEdge(mirrorVert_Prev, centerVert, false);
                                //	mesh.MakeNewEdge(mirrorVert_Next, centerVert, false);
                                //}

                                //Debug.Log("Split Edge");
                            }
                        }
                    }
                }
                else
                {
                    //새로운 Mirror Vertex를 만들자.
                    mesh.MakeNewEdge(mirrorVert_Prev, mirrorVert_Next, isShift);

                    //Debug.Log("Add Mirror Edge : " + isShift);
                }
            }

            if (mirrorVert_Prev != null)
            {
                mesh.RefreshVertexAutoUV(mirrorVert_Prev);
            }
            if (mirrorVert_Next != null)
            {
                mesh.RefreshVertexAutoUV(mirrorVert_Next);
            }


            ClearMovedVertex();
        }