Example #1
0
    public override int DetectedCode(Bounds bounds, SceneSeparateTreeType treeType)
    {
        RefreshBounds();
        int code = treeType == SceneSeparateTreeType.OcTree ? CalculateOcTreeBoundsCode(m_Bounds, bounds) : CalculateQuadBoundsCode(m_Bounds, bounds);

        return(code);
    }
Example #2
0
 /// <summary>
 /// 构造函数
 /// </summary>
 /// <param name="treeType">树类型</param>
 /// <param name="center">树中心</param>
 /// <param name="size">树区域大小</param>
 /// <param name="maxDepth">树最大深度</param>
 public SceneSeparateTree(SceneSeparateTreeType treeType, Vector3 center, Vector3 size, int maxDepth)
 {
     this.m_TreeType = treeType;
     this.m_MaxDepth = maxDepth;
     if (treeType == SceneSeparateTreeType.QuadTree)
     {
         this.m_Root = new SceneSeparateTreeNode <T>(new Bounds(center, size), 0, 4);
     }
     else
     {
         this.m_Root = new SceneSeparateTreeNode <T>(new Bounds(center, size), 0, 8);
     }
 }
Example #3
0
    public void Trigger(IDetector detector, SceneSeparateTreeType treeType, TriggerHandle <T> handle)
    {
        if (handle == null)
        {
            return;
        }

        int code = detector.DetectedCode(m_Bounds, treeType);

        for (int i = 0; i < m_ChildNodes.Length; i++)
        {
            var node = m_ChildNodes[i];
            if (node != null && (code & (1 << i)) != 0)
            {
                node.Trigger(detector, treeType, handle);
            }
        }

        //if (detector.IsDetected(m_Bounds))
        {
            var node = m_ObjectList.First;
            while (node != null)
            {
                if (detector.IsDetected(node.Value.Bounds))
                {
                    handle(node.Value);
                }
                node = node.Next;
            }
            //for (int i = 0; i < m_ObjectList.Count; i++)
            //{
            //    if (m_ObjectList[i] != null)
            //    {
            //        if (detector.IsDetected(m_ObjectList[i].Bounds))
            //            handle(m_ObjectList[i]);
            //    }
            //}
        }
    }
Example #4
0
 /// <summary>
 /// 初始化
 /// </summary>
 /// <param name="center">场景区域中心</param>
 /// <param name="size">场景区域大小</param>
 /// <param name="asyn">是否异步</param>
 public void Init(Vector3 center, Vector3 size, bool asyn, SceneSeparateTreeType treeType)
 {
     Init(center, size, asyn, 25, 15, 1, 5, treeType);
 }
Example #5
0
    /// <summary>
    /// 初始化
    /// </summary>
    /// <param name="center">场景区域中心</param>
    /// <param name="size">场景区域大小</param>
    /// <param name="asyn">是否异步</param>
    /// <param name="maxCreateCount">最大创建数量</param>
    /// <param name="minCreateCount">最小创建数量</param>
    /// <param name="maxRefreshTime">更新区域时间间隔</param>
    /// <param name="maxDestroyTime">检查销毁时间间隔</param>
    /// <param name="quadTreeDepth">四叉树深度</param>
    public void Init(Vector3 center, Vector3 size, bool asyn, int maxCreateCount, int minCreateCount, float maxRefreshTime, float maxDestroyTime, SceneSeparateTreeType treeType, int quadTreeDepth = 5)
    {
        if (m_IsInitialized)
        {
            return;
        }
        m_QuadTree         = new SceneSeparateTree <SceneObject>(treeType, center, size, quadTreeDepth);
        m_LoadedObjectList = new List <SceneObject>();
        //m_PreDestroyObjectQueue = new Queue<SceneObject>();
        m_PreDestroyObjectQueue = new PriorityQueue <SceneObject>(new SceneObjectWeightComparer());
        m_TriggerHandle         = new TriggerHandle <SceneObject>(this.TriggerHandle);

        m_MaxCreateCount = Mathf.Max(0, maxCreateCount);
        m_MinCreateCount = Mathf.Clamp(minCreateCount, 0, m_MaxCreateCount);
        m_MaxRefreshTime = maxRefreshTime;
        m_MaxDestroyTime = maxDestroyTime;
        m_Asyn           = asyn;

        m_IsInitialized = true;

        m_RefreshTime = maxRefreshTime;
    }
Example #6
0
 /// <summary>
 /// 初始化
 /// </summary>
 /// <param name="center">场景区域中心</param>
 /// <param name="size">场景区域大小</param>
 /// <param name="asyn">是否异步</param>
 /// <param name="maxCreateCount">更新区域时间间隔</param>
 /// <param name="minCreateCount">检查销毁时间间隔</param>
 public void Init(Vector3 center, Vector3 size, bool asyn, int maxCreateCount, int minCreateCount, SceneSeparateTreeType treeType)
 {
     Init(center, size, asyn, maxCreateCount, minCreateCount, 0.1f, 2, treeType);
 }
 /// <param name="center"></param>
 /// <param name="size"></param>
 public void Init(Vector3 center, Vector3 size, SceneSeparateTreeType treeType)
 {
     Init(center, size, 20, 15, 1, 1, treeType);
 }
Example #8
0
    public override int DetectedCode(Bounds bounds, SceneSeparateTreeType treeType)
    {
        if (m_Camera == null)
        {
            return(0);
        }
        Matrix4x4 matrix = m_Camera.projectionMatrix * m_Camera.worldToCameraMatrix;

        if (m_Codes == null || m_CurrentTreeType != treeType)
        {
            m_Codes           = new int[treeType == SceneSeparateTreeType.OcTree ? 27 : 18];
            m_CurrentTreeType = treeType;
        }

        int code  = 0;
        int index = 0;

        if (treeType == SceneSeparateTreeType.OcTree)
        {
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    for (int k = 0; k < 3; k++)
                    {
                        m_Codes[index] =
                            CalculateCullCode(
                                new Vector4(bounds.center.x + bounds.size.x * 0.5f * (i - 1),
                                            bounds.center.y + bounds.size.y * 0.5f * (k - 1),
                                            bounds.center.z + bounds.size.z * 0.5f * (j - 1), 1), matrix);
                        index += 1;
                    }
                }
            }


            code = CalculateOcTreeBoundsCullCode(code, 0, 1);
            code = CalculateOcTreeBoundsCullCode(code, 1, 2);
            code = CalculateOcTreeBoundsCullCode(code, 3, 4);
            code = CalculateOcTreeBoundsCullCode(code, 4, 8);
            code = CalculateOcTreeBoundsCullCode(code, 9, 16);
            code = CalculateOcTreeBoundsCullCode(code, 10, 32);
            code = CalculateOcTreeBoundsCullCode(code, 12, 64);
            code = CalculateOcTreeBoundsCullCode(code, 13, 128);
        }
        else
        {
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 3; j++)
                {
                    for (int k = -1; k < 2; k += 2)
                    {
                        m_Codes[index] =
                            CalculateCullCode(
                                new Vector4(bounds.center.x + bounds.size.x * 0.5f * (i - 1),
                                            bounds.center.y + bounds.size.y * 0.5f * k,
                                            bounds.center.z + bounds.size.z * 0.5f * (j - 1), 1), matrix);
                        index += 1;
                    }
                }
            }


            code = CalculateQuadTreeBoundsCullCode(code, 0, 1);
            code = CalculateQuadTreeBoundsCullCode(code, 2, 2);
            code = CalculateQuadTreeBoundsCullCode(code, 6, 4);
            code = CalculateQuadTreeBoundsCullCode(code, 8, 8);
        }

        return(code);
    }
Example #9
0
 public abstract int DetectedCode(Bounds bounds, SceneSeparateTreeType treeType);