public void FinishBuild() { foreach (var node in m_buildCtx.m_contex.Keys) { var lst = m_buildCtx.m_contex[node]; node.SetObjs(lst.ToArray()); } m_buildCtx = null; }
void insertIntoChild(int childIdx, Vector3 childCenter, BuildContex <T> buildCtx, Vector3 objCenter, float objRadius, T obj) { if (m_children == null) { m_children = new TreeNodeRT <T> [4]; } if (m_children[childIdx] == null) { m_children[childIdx] = new TreeNodeRT <T>(childCenter, m_fRadius / 2); } m_children[childIdx].Insert(buildCtx, objCenter, objRadius, obj); }
public void Insert(BuildContex <T> buildCtx, Vector3 objCenter, float objRadius, T obj) { bool isLeaf = m_fRadius < buildCtx.m_fMinRadius; if (isLeaf) { buildCtx.AddObj(this, obj); } int nearestChildIdx = -1; Vector3 nearestChildCenter = new Vector3(); Vector3 childCenter = new Vector3(); float minDist = 1e20f; for (int i = 0; i < 4; ++i) { if (isInChildRange(objCenter, objRadius, ChildIdx2X[i], ChildIdx2Z[i], ref childCenter)) { insertIntoChild(i, childCenter, buildCtx, objCenter, objRadius, obj); return; } var sqrDist = (objCenter.x - childCenter.x) * (objCenter.x - childCenter.x) + (objCenter.z - childCenter.z) * (objCenter.z - childCenter.z); if (sqrDist < minDist) { nearestChildIdx = i; minDist = sqrDist; nearestChildCenter.x = objCenter.x; nearestChildCenter.y = objCenter.y; nearestChildCenter.z = objCenter.z; } } if (nearestChildIdx >= 0 && objRadius < m_fRadius) { insertIntoChild(nearestChildIdx, nearestChildCenter, buildCtx, objCenter, objRadius, obj); return; } buildCtx.AddObj(this, obj); }
public void StartBuild(float minRadius) { m_buildCtx = new BuildContex <T>(); m_buildCtx.m_fMinRadius = minRadius; m_buildCtx.m_contex = new Dictionary <TreeNodeRT <T>, List <T> >(); }