public static bool IsMouseInRenderUnitMesh(Vector2 mousePos, apRenderUnit meshRenderUnit) { if (meshRenderUnit._meshTransform == null) { return(false); } if (meshRenderUnit._meshTransform._mesh == null || meshRenderUnit._renderVerts.Count == 0) { return(false); } apMesh targetMesh = meshRenderUnit._meshTransform._mesh; List <apRenderVertex> rVerts = meshRenderUnit._renderVerts; Vector2 mousePosW = apGL.GL2World(mousePos); apRenderVertex rVert0, rVert1, rVert2; List <apMeshPolygon> polygons = targetMesh._polygons; for (int iPoly = 0; iPoly < polygons.Count; iPoly++) { List <apMeshTri> tris = polygons[iPoly]._tris; for (int iTri = 0; iTri < tris.Count; iTri++) { apMeshTri tri = tris[iTri]; rVert0 = rVerts[tri._verts[0]._index]; rVert1 = rVerts[tri._verts[1]._index]; rVert2 = rVerts[tri._verts[2]._index]; if (apMeshTri.IsPointInTri(mousePosW, rVert0._pos_World, rVert1._pos_World, rVert2._pos_World)) { return(true); } } } return(false); }
public static bool IsMouseInMesh(Vector2 mousePos, apMesh targetMesh) { Vector2 mousePosW = apGL.GL2World(mousePos); Vector2 mousePosL = mousePosW + targetMesh._offsetPos; //<<이걸 추가해줘야 Local Pos가 된다. List <apMeshPolygon> polygons = targetMesh._polygons; for (int iPoly = 0; iPoly < polygons.Count; iPoly++) { List <apMeshTri> tris = polygons[iPoly]._tris; for (int iTri = 0; iTri < tris.Count; iTri++) { apMeshTri tri = tris[iTri]; if (tri.IsPointInTri(mousePosL)) { return(true); } } } return(false); }
public void Link(apMesh mesh) { //Mesh에 속한 Vert와 Edge는 초기화 후 ID와 연결해준다. //그 외에는 내부 Link를 호출한다. _verts.Clear(); _edges.Clear(); for (int i = 0; i < _vertIDs.Count; i++) { apVertex vert = mesh.GetVertexByUniqueID(_vertIDs[i]); if (vert != null) { _verts.Add(vert); } else { //?? 없는 Vert다. _vertIDs[i] = -1; } } _vertIDs.RemoveAll(delegate(int a) { return(a < 0); }); for (int i = 0; i < _edgeIDs.Count; i++) { apMeshEdge edge = mesh.GetEdgeByUniqueID(_edgeIDs[i]._ID1, _edgeIDs[i]._ID2); if (edge != null) { _edges.Add(edge); } else { _edgeIDs[i]._ID1 = -1; _edgeIDs[i]._ID2 = -1; } } _edgeIDs.RemoveAll(delegate(IDPair a) { return(a._ID1 < 0 || a._ID2 < 0); }); //나머지도 링크를 하자 for (int i = 0; i < _hidddenEdges.Count; i++) { apMeshEdge hiddenEdge = _hidddenEdges[i]; apVertex vert1 = mesh.GetVertexByUniqueID(hiddenEdge._vertID_1); apVertex vert2 = mesh.GetVertexByUniqueID(hiddenEdge._vertID_2); hiddenEdge.Link(vert1, vert2); } _hidddenEdges.RemoveAll(delegate(apMeshEdge a) { return(a._vert1 == null || a._vert2 == null); }); for (int i = 0; i < _tris.Count; i++) { apMeshTri tri = _tris[i]; apVertex vert1 = mesh.GetVertexByUniqueID(tri._vertIDs[0]); apVertex vert2 = mesh.GetVertexByUniqueID(tri._vertIDs[1]); apVertex vert3 = mesh.GetVertexByUniqueID(tri._vertIDs[2]); tri.Link(vert1, vert2, vert3); } _tris.RemoveAll(delegate(apMeshTri a) { return(a._verts[0] == null || a._verts[1] == null || a._verts[2] == null); }); }
public bool IsSameTri(apMeshTri tri) { //return IsSameTri(tri._edges[0], tri._edges[1], tri._edges[2]); return(IsSameTri(tri._verts[0], tri._verts[1], tri._verts[2])); }
public bool TurnHiddenEdge(apMeshEdge hiddenEdge) { if (!_hidddenEdges.Contains(hiddenEdge)) { Debug.LogError("Not Contains Hidden Edge"); return(false); } //List<apMeshEdge> allEdges = new List<apMeshEdge>(); //for (int i = 0; i < _edges.Count; i++) //{ // allEdges.Add(_edges[i]); //} //for (int i = 0; i < _hidddenEdges.Count; i++) //{ // allEdges.Add(_hidddenEdges[i]); //} List <apMeshTri> containTris = _tris.FindAll(delegate(apMeshTri a) { return(a.IsIncludeEdge(hiddenEdge)); }); if (containTris.Count != 2) { //회전이 불가능하다 Debug.LogError("Tri Count is Not 2 : " + containTris.Count); return(false); } apVertex[] newVerts = new apVertex[2]; for (int i = 0; i < 2; i++) { apMeshTri curTri = containTris[i]; if (curTri._verts[0] != hiddenEdge._vert1 && curTri._verts[0] != hiddenEdge._vert2) { newVerts[i] = curTri._verts[0]; } else if (curTri._verts[1] != hiddenEdge._vert1 && curTri._verts[1] != hiddenEdge._vert2) { newVerts[i] = curTri._verts[1]; } else if (curTri._verts[2] != hiddenEdge._vert1 && curTri._verts[2] != hiddenEdge._vert2) { newVerts[i] = curTri._verts[2]; } else { newVerts[i] = null; } } if (newVerts[0] != null && newVerts[1] != null && newVerts[0] != newVerts[1]) { //새로운 엣지를 넣고 apMeshEdge newHidden = new apMeshEdge(newVerts[0], newVerts[1]); newHidden._isHidden = true; _hidddenEdges.Add(newHidden); //Debug.LogWarning("Vertex Turn [" // + hiddenEdge._vert1._index + ", " + hiddenEdge._vert2._index + "] -> [" // + newHidden._vert1._index + ", " + newHidden._vert2._index + "]"); //현재 엣지를 지우자 _hidddenEdges.Remove(hiddenEdge); MakeTriangles(); } else { Debug.LogError("Vertex is Error"); } return(true); }
private void MakeTriangles() { _tris.Clear(); List <apMeshEdge> allEdges = new List <apMeshEdge>(); for (int i = 0; i < _edges.Count; i++) { allEdges.Add(_edges[i]); } for (int i = 0; i < _hidddenEdges.Count; i++) { allEdges.Add(_hidddenEdges[i]); } for (int iEdge = 0; iEdge < allEdges.Count; iEdge++) { apMeshEdge baseEdge = allEdges[iEdge]; if (!baseEdge._isHidden) { //Hidden이 아닌 경우 //한개의 Edge는 한개의 Tri에만 들어간다. bool isExistTri = _tris.Exists(delegate(apMeshTri a) { return(a.IsIncludeEdge(baseEdge)); }); if (isExistTri) { //이미 Tri 계산에 사용된 Edge이다. continue; } } //이제 여기에 연결된 Edge 하나를 찾는다. (두번째 Edge) //처음엔 "기본 Edge", 여기서 못찾으면 "Hidden Edge"에서 찾자 //한개의 Edge에 대해서 최대 2개의 Tri만 나온다. //2개를 만들면 더이상 처리하지 말자 int nCreatedTri = 0; for (int iNext = 0; iNext < allEdges.Count; iNext++) { apMeshEdge nextEdge = allEdges[iNext]; if (baseEdge == nextEdge) { //같은거다 continue; } if (!nextEdge.IsLinkedEdge(baseEdge)) { //연결되지 않았다. continue; } //이 둘을 연결할 선분은 있는지 체크 //공유하고 있지 않은 버텍스 두개를 구하자 apVertex[] noSharedVerts = apMeshEdge.GetNoSharedVertex(baseEdge, nextEdge); if (noSharedVerts == null) { continue; } //해당 Edge를 포함하는 Edge가 있는가 apMeshEdge thirdEdge = allEdges.Find(delegate(apMeshEdge a) { return(a.IsSameEdge(noSharedVerts[0], noSharedVerts[1])); }); if (thirdEdge == null) { continue; } apVertex[] allVerts = apMeshEdge.Get3VerticesOf2Edges(baseEdge, nextEdge); //base, next, third 완성 bool isExistTri = _tris.Exists(delegate(apMeshTri a) { return(a.IsSameTri(allVerts[0], allVerts[1], allVerts[2])); }); if (!isExistTri) { //겹치는 Tri가 없다. //만들자 apMeshTri newTri = new apMeshTri(); newTri.SetVertices(allVerts[0], allVerts[1], allVerts[2]); _tris.Add(newTri); nCreatedTri++; } if (nCreatedTri >= 2) { //처리 끝 break; } } //if (_tris.Count >= nNeedTri) //{ // //이미 이 폴리곤에서 만들 수 있는 최대의 Tri를 만들었다. // break; //} } //마지막에 Sort SortTriByDepth(); }