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; }
//---------------------------------------------------------------- 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(); }