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