public static int Compare(_VertUnit lhs, _VertUnit rhs) { Vector3 l = lhs.pos; Vector3 r = rhs.pos; if (l.x < r.x) { return(-1); } else if (l.x > r.x) { return(1); } if (l.y < r.y) { return(-1); } else if (l.y > r.y) { return(1); } if (l.z < r.z) { return(-1); } else if (l.z > r.z) { return(1); } return(0); }
private void _FillVGroupCont(List <_VertUnit> vunits) { m_VGCont.Clear(); if (vunits.Count == 0) { return; } float sqrDistThres = m_VertDistThres * m_VertDistThres; _VertUnit guard = vunits[0]; for (int i = 1; i < vunits.Count; ++i) { _VertUnit one = vunits[i]; Vector3 diff = guard.pos - one.pos; //Dbg.Log("dist: {0}<->{1}, {2:F6}", guard.idx, one.idx, diff.magnitude); if (Vector3.SqrMagnitude(diff) < sqrDistThres) { VGroup grp = _ForceGetVGroup(guard); _AddToVGroup(one.idx, grp); //add `one' into grp } else { guard = one; //advance guard to `one' } } }
private VVert _ForceGetVVert(_VertUnit v) { int idx = v.idx; VVert vvert = null; if (!m_VVertCont.TryGetValue(idx, out vvert)) { vvert = new VVert(idx); m_VVertCont.Add(idx, vvert); } return(vvert); }
private VGroup _ForceGetVGroup(_VertUnit v) { int idx = v.idx; VGroup grp = null; if (!m_VGCont.TryGetValue(idx, out grp)) { grp = new VGroup(); grp.Add(idx); m_VGCont.Add(idx, grp); } return(grp); }
// private method #region "VVert table init" // "VVert table init" private void _InitVVertTable() { Vector3[] verts = m_RealMesh.vertices; List <_VertUnit> vunits = verts.Select((v, idx) => { return(new _VertUnit(v, idx)); }).ToList(); vunits.Sort(_VertUnit.Compare); m_VVertCont.Clear(); if (vunits.Count == 0) { return; } // init vVertCont List <VVert> vvertLst = new List <VVert>(); float sqrDistThres = DEF_SAME_VERT_DIST_THRES * DEF_SAME_VERT_DIST_THRES; _VertUnit guard = vunits[0]; VVert guardVV = _ForceGetVVert(guard); vvertLst.Add(guardVV); for (int i = 1; i < vunits.Count; ++i) { _VertUnit one = vunits[i]; Vector3 diff = guard.pos - one.pos; if (Vector3.SqrMagnitude(diff) < sqrDistThres) { _AddToVVert(one.idx, guardVV); } else { guard = one; //advance guard to 'one' guardVV = _ForceGetVVert(guard); vvertLst.Add(guardVV); } } // init m_VVertArr m_VVertArr = vvertLst.ToArray(); }