Exemplo n.º 1
0
        // private method

        private void _PrepareEdgeIndices()
        {
            VMesh vmesh = VMesh.Instance;

            VVert[] allVVerts = vmesh.GetAllVVerts();
            VEdge[] allVEdges = vmesh.GetAllVActiveEdges();

            Dictionary <VVert, int> vert2idx = new Dictionary <VVert, int>();

            for (int i = 0; i < allVVerts.Length; ++i)
            {
                VVert v = allVVerts[i];
                vert2idx[v] = i;
            }

            m_EdgeIndices = new int[allVEdges.Length * 2];

            for (int i = 0; i < allVEdges.Length; i++)
            {
                VEdge e     = allVEdges[i];
                VVert v0    = e.GetVVert(0);
                VVert v1    = e.GetVVert(1);
                int   vidx0 = vert2idx[v0];
                int   vidx1 = vert2idx[v1];

                m_EdgeIndices[i * 2]     = vidx0;
                m_EdgeIndices[i * 2 + 1] = vidx1;
            }
        }
Exemplo n.º 2
0
            /// <summary>
            /// given two real tri indices,
            /// put the VVerts into the allocated 4-elem array,
            /// 0 for triIdx0, 1-2 for vedge, 3 for triIdx1
            /// </summary>
            private void _GetAsQuadVerts(int triIdx0, int triIdx1, VEdge vedge, VVert[] tmpVertArr)
            {
                VVert ev0 = vedge.GetVVert(0);
                VVert ev1 = vedge.GetVVert(1);

                GetVVertsFromRTri(triIdx0, out tmpVertArr[0], out tmpVertArr[1], out tmpVertArr[2]);
                // put the non-edge vert at idx-0
                for (int specialVertIdx = 0; specialVertIdx < 3; ++specialVertIdx)
                {
                    if (tmpVertArr[specialVertIdx] != ev0 && tmpVertArr[specialVertIdx] != ev1)
                    {
                        var tmp = tmpVertArr[0];
                        tmpVertArr[0] = tmpVertArr[specialVertIdx];
                        tmpVertArr[specialVertIdx] = tmp;
                        break;
                    }
                }

                GetVVertsFromRTri(triIdx1, out tmpVertArr[1], out tmpVertArr[2], out tmpVertArr[3]);
                // put the non-edge vert at idx-3
                for (int specialVertIdx = 1; specialVertIdx < 4; ++specialVertIdx)
                {
                    if (tmpVertArr[specialVertIdx] != ev0 && tmpVertArr[specialVertIdx] != ev1)
                    {
                        var tmp = tmpVertArr[3];
                        tmpVertArr[3] = tmpVertArr[specialVertIdx];
                        tmpVertArr[specialVertIdx] = tmp;
                        break;
                    }
                }
            }
Exemplo n.º 3
0
            /// <summary>
            /// given an edge, and select the edge loop based on that
            /// </summary>
            public void Execute(VEdge vedge, Op op)
            {
                VVert v0 = vedge.GetVVert(0);
                VVert v1 = vedge.GetVVert(1);

                Execute(v0, v1, op);
            }
Exemplo n.º 4
0
            /// <summary>
            /// given world pos 'pt', find out the dist to given edge
            /// </summary>
            public static float DistPointToVEdge(Vector3 pt, VEdge vEdge)
            {
                Vector3 pos0 = vEdge.GetVVert(0).GetWorldPos();
                Vector3 pos1 = vEdge.GetVVert(1).GetWorldPos();

                return(GeoUtil.DistPointToLine(pt, pos0, pos1));
            }
Exemplo n.º 5
0
            // private method

            /// <summary>
            /// try to process v2 if possible (under given op)
            /// [v0 ==> v1 == v2] in this order
            /// </summary>
            private void _WalkSelect(VVert v0, VVert v1, Op op)
            {
                //////////////////////////////////////////////////
                // 1. if v1 doesn't have exactly 4 vedges, return;
                // 2. take the vedge E that doesn't share VFace with vedge(v0,v1)
                // 3. select the other vvert v2 of E;
                // 4. iterate as _WalkSelect(v1, v2, op)
                //////////////////////////////////////////////////

                VEdge thisEdge = v0.GetVEdge(v1);

                thisEdge.GetVFaces(m_tmpVFaces1);

                while (true)
                {
                    // step 1
                    VELst veLst = v1.GetActiveVEdges();
                    if (veLst.Count != GOOD_EDGE_CNT)
                    {
                        //Dbg.Log("_WalkSelect: {0}=>{1}, veLst.Count not 4, is {2}", v0, v1, veLst.Count);
                        break; //END
                    }

                    // step 2
                    VEdge thatEdge = null;
                    for (int i = 0; i < GOOD_EDGE_CNT; ++i)
                    {
                        VEdge rhs = veLst[i];
                        if (rhs == thisEdge)
                        {
                            continue;
                        }

                        rhs.GetVFaces(m_tmpVFaces2);
                        if (!_HasIntersect(m_tmpVFaces1, m_tmpVFaces2))
                        {
                            thatEdge = rhs;
                            break; //just out of edge loop
                        }
                    }

                    // step 3
                    VVert v2 = null;
                    if (thatEdge != null)
                    {
                        v2 = thatEdge.GetVVert(0);
                        if (v2 == v1)
                        {
                            v2 = thatEdge.GetVVert(1);
                        }

                        // check for inf loop
                        VEdge newEdge = v1.GetVEdge(v2);
                        if (m_EdgeSet.Contains(newEdge))
                        {
                            break; //END
                        }
                        m_EdgeSet.Add(newEdge);

                        // modify selection
                        if (op == Op.Add)
                        {
                            m_Selection.AddVVert(v2);
                        }
                        else
                        {
                            m_Selection.DelVVert(v2);
                        }

                        // step 4
                        v0       = v1;
                        v1       = v2;
                        thisEdge = thatEdge;
                        Misc.Swap(ref m_tmpVFaces1, ref m_tmpVFaces2);
                    }
                    else
                    {
                        //Dbg.Log("_WalkSelect: {0}=>{1}, not found thatEdge", v0, v1);
                        break; //END
                    }
                } // end of while(true)
            }