Esempio n. 1
0
 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;
 }
Esempio n. 2
0
 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);
 }
Esempio n. 3
0
    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);
    }
Esempio n. 4
0
 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> >();
 }