Ejemplo n.º 1
0
    private void TriggerToNode(IDetector detector, TriggerHandle <T> handle, int depth, float centerx, float centerz, float sizex,
                               float sizez)
    {
        if (depth == m_MaxDepth)
        {
            uint m = Morton2FromWorldPos(centerx, centerz);
            if (m_Nodes.ContainsKey(m) && m_Nodes[m] != null)
            {
                m_Nodes[m].Trigger(detector, handle);
            }
        }
        else
        {
            int colider = detector.GetDetectedCode(centerx, m_Bounds.center.y, centerz, true);

            float sx = sizex * 0.5f, sz = sizez * 0.5f;

            if ((colider & 1) != 0)
            {
                TriggerToNode(detector, handle, depth + 1, centerx - sx * 0.5f, centerz - sz * 0.5f, sx, sz);
            }
            if ((colider & 2) != 0)
            {
                TriggerToNode(detector, handle, depth + 1, centerx - sx * 0.5f, centerz + sz * 0.5f, sx, sz);
            }
            if ((colider & 4) != 0)
            {
                TriggerToNode(detector, handle, depth + 1, centerx + sx * 0.5f, centerz - sz * 0.5f, sx, sz);
            }
            if ((colider & 8) != 0)
            {
                TriggerToNode(detector, handle, depth + 1, centerx + sx * 0.5f, centerz + sz * 0.5f, sx, sz);
            }
        }
    }
Ejemplo n.º 2
0
        private void TriggerDetectorNearToFar(IDetector detector, TriggerHandle <T> handle)
        {
            uint  row    = (uint)Mathf.FloorToInt((detector.Position.x - m_Bounds.min.x) / m_DeltaWidth);
            uint  col    = (uint)Mathf.FloorToInt((detector.Position.z - m_Bounds.min.z) / m_DeltaHeight);
            uint  maxcol = (uint)Mathf.Pow(2, m_MaxDepth);
            float bias   = Mathf.Cos(22.5f * Mathf.Deg2Rad);
            int   direct = 1;

            if (detector.Rotation != null)
            {
                direct = Mathf.FloorToInt(((detector.Rotation.y + 360.0f) % 360.0f + 22.5f) / 45.0f) + 1;
            }
            //完整遍历的最大N
            int circleN = (int)Mathf.Min(maxcol - row, maxcol - col, row, col);

            TriggerOneCircleNodes(detector, (int)row, (int)col, 0, direct, (int)maxcol, handle);

            /*
             * if (row <= maxcol && col <= maxcol)
             * {
             *   uint m = MortonCodeUtil.EncodeMorton2(row, col);
             *   if (m_Nodes.ContainsKey(m) && m_Nodes[m] != null)
             *   {
             *       m_Nodes[m].Trigger(detector, handle);
             *   }
             * }
             * for (int i = 1; i < 9; i++)
             * {
             *   uint nrow = row + (uint)directs[i].x;
             *   uint ncol = col + (uint)directs[i].y;
             *   TriggerOneNode(detector, nrow, ncol, i, maxcol, handle);
             * }*/
        }
Ejemplo n.º 3
0
    public void Trigger(IDetector detector, TriggerHandle <T> handle)
    {
        if (handle == null)
        {
            return;
        }

        for (int i = 0; i < m_ChildNodes.Length; i++)
        {
            var node = m_ChildNodes[i];
            if (node != null)
            {
                node.Trigger(detector, 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;
            }
        }
    }
Ejemplo n.º 4
0
    public void Trigger(IDetector detector, TriggerHandle <T> handle)
    {
        if (handle == null)
        {
            return;
        }

        //bool isInView = false;
        if (!detector.IsDetected(m_Bounds))
        {
            return;
        }
        //触发当前节点下的所有物体
        var node = m_ObjectList.First;

        while (node != null)
        {
            //如果是最大节点, 就不检测了,直接触发
            if (m_CurrentDepth == m_MaxDepth || detector.IsDetected(node.Value.Bounds))
            {
                handle(node.Value);
            }
            node = node.Next;
        }

        for (int i = 0; i < m_ChildNodes.Length; i++)
        {
            if (m_ChildNodes[i] != null)
            {
                m_ChildNodes[i].Trigger(detector, handle);
            }
        }
    }
Ejemplo n.º 5
0
 public void ResetAllData()
 {
     StopAllCoroutines();
     if (m_QuadTree)
     {
         m_QuadTree.Clear();
     }
     m_QuadTree = null;
     if (m_ProcessTaskQueue != null)
     {
         m_ProcessTaskQueue.Clear();
     }
     if (m_LoadedObjectList != null)
     {
         foreach (var item in m_LoadedObjectList)
         {
             DestroyObject(item, false);
         }
         m_LoadedObjectList.Clear();
     }
     m_ProcessTaskQueue = null;
     m_LoadedObjectList = null;
     m_TriggerHandle    = null;
     m_IsInitialized    = false;
 }
Ejemplo n.º 6
0
    /// <summary>
    /// create and attach instance
    /// </summary>
    /// <param name="target"></param>
    /// <param name="time"></param>
    /// <param name="timeOffset"></param>
    /// <param name="GoFunction"></param>
    public static void Construct(GameObject target, float time, float timeOffset, TriggerHandle GoFunction)
    {
        var tt = target.transform.GetOrAddComponent <TriggerTimer>();

        tt._time             = time;
        tt._timeOffset       = timeOffset;
        tt.GoFunctionExecute = GoFunction;
    }
Ejemplo n.º 7
0
 public void Trigger(IDetector detector, TriggerHandle <T> handle)
 {
     if (handle == null)
     {
         return;
     }
     m_Root.Trigger(detector, handle);
 }
Ejemplo n.º 8
0
        private void TriggeLeafNode(IDetector detector, uint row, uint col, TriggerHandle <T> handle)
        {
            uint m = MortonCodeUtil.EncodeMorton2((uint)row, (uint)col);

            if (m_Nodes.ContainsKey(m) && m_Nodes[m] != null)
            {
                m_Nodes[m].Trigger(detector, handle);
            }
        }
Ejemplo n.º 9
0
    /// <summary>
    /// Create and Attach Instance
    /// </summary>
    /// <param name="switchObject"></param>
    /// <param name="GoFunction"></param>
    public static void Construct(Object switchObject, TriggerHandle GoFunction)
    {
        var objectAsGO = switchObject as GameObject;

        if (objectAsGO != null)
        {
            var ts = ApplyAsGameObject(objectAsGO);
            ts.GoFunctionsExecute += GoFunction;
        }
    }
Ejemplo n.º 10
0
 public void Trigger(IDetector detector, TriggerHandle <T> handle)
 {
     if (handle == null)
     {
         return;
     }
     if (detector.IsDetected(m_Root.Bounds) == false)
     {
         return;
     }
     m_Root.Trigger(detector, m_TreeType, handle);
 }
Ejemplo n.º 11
0
 public void EditorInit()
 {
     CreateTree(data.bounds.center, data.bounds.size, data.treeType, data.treeDepth);
     m_LoadedObjectLinkedList = new LinkedList <SceneObject>();
     m_PreDestroyObjectQueue  = new PriorityQueue <SceneObject>(new SceneObjectWeightComparer());
     m_TriggerHandle          = new TriggerHandle <SceneObject>(this.TriggerHandle);
     m_MaxCreateCount         = Mathf.Max(0, data.maxCreateCount);
     m_MinCreateCount         = Mathf.Clamp(data.minCreateCount, 0, data.maxCreateCount);
     m_MaxRefreshTime         = data.maxRefreshTime;
     m_MaxDestroyTime         = data.maxDestroyTime;
     m_Asyn        = data.asyn;
     m_RefreshTime = data.maxRefreshTime;
 }
    void OnDestroy()
    {
        if (m_QuadTree)
        {
            m_QuadTree.Clear();
        }
        m_QuadTree = null;

        if (m_LoadedObjectList != null)
        {
            m_LoadedObjectList.Clear();
        }

        m_LoadedObjectList = null;
        m_TriggerHandle    = null;
    }
Ejemplo n.º 13
0
    public void Trigger(IDetector detector, TriggerHandle <T> handle)
    {
        if (handle == null)
        {
            return;
        }

        if (detector.UseCameraCulling)
        {
            TreeCullingCode code = new TreeCullingCode()
            {
                leftbottomback     = detector.GetDetectedCode(m_Bounds.min.x, m_Bounds.min.y, m_Bounds.min.z, true),
                leftbottomforward  = detector.GetDetectedCode(m_Bounds.min.x, m_Bounds.min.y, m_Bounds.max.z, true),
                lefttopback        = detector.GetDetectedCode(m_Bounds.min.x, m_Bounds.max.y, m_Bounds.min.z, true),
                lefttopforward     = detector.GetDetectedCode(m_Bounds.min.x, m_Bounds.max.y, m_Bounds.max.z, true),
                rightbottomback    = detector.GetDetectedCode(m_Bounds.max.x, m_Bounds.min.y, m_Bounds.min.z, true),
                rightbottomforward = detector.GetDetectedCode(m_Bounds.max.x, m_Bounds.min.y, m_Bounds.max.z, true),
                righttopback       = detector.GetDetectedCode(m_Bounds.max.x, m_Bounds.max.y, m_Bounds.min.z, true),
                righttopforward    = detector.GetDetectedCode(m_Bounds.max.x, m_Bounds.max.y, m_Bounds.max.z, true),
            };
            TriggerByCamera(detector, handle, code);
        }
        else
        {
            int code = detector.GetDetectedCode(m_Bounds.center.x, m_Bounds.center.y, m_Bounds.center.z, m_ChildCount == 4);
            for (int i = 0; i < m_ChildNodes.Length; i++)
            {
                var node = m_ChildNodes[i];
                if (node != null && (code & (1 << i)) != 0)
                {
                    node.Trigger(detector, handle);
                }
            }

            {
                var node = m_ObjectList.First;
                while (node != null)
                {
                    if (detector.IsDetected(node.Value.Bounds))
                    {
                        handle(node.Value);
                    }
                    node = node.Next;
                }
            }
        }
    }
Ejemplo n.º 14
0
        public void Trigger(IDetector detector, TriggerHandle <T> handle)
        {
            if (handle != null)
            {
                LinkedListNode <T> node = m_DataList.First;

                while (node != null)
                {
                    if (detector.IsDetected(node.Value.Bounds))
                    {
                        handle(node.Value);
                    }

                    node = node.Next;
                }
            }
        }
Ejemplo n.º 15
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, TreeType treeType, int quadTreeDepth = 5)
    {
        if (m_IsInitialized)
        {
            return;
        }

        switch (treeType)
        {
        case TreeType.LinearOcTree:
            m_Tree = new LinearSceneOcTree <SceneObject>(center, size, quadTreeDepth);
            break;

        case TreeType.LinearQuadTree:
            m_Tree = new LinearSceneQuadTree <SceneObject>(center, size, quadTreeDepth);
            break;

        case TreeType.OcTree:
            m_Tree = new SceneTree <SceneObject>(center, size, quadTreeDepth, true);
            break;

        case TreeType.QuadTree:
            m_Tree = new SceneTree <SceneObject>(center, size, quadTreeDepth, false);
            break;

        default:
            m_Tree = new LinearSceneQuadTree <SceneObject>(center, size, quadTreeDepth);
            break;
        }

        m_LoadedObjectLinkedList = new LinkedList <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;
    }
Ejemplo n.º 16
0
 public void Trigger(IDetector detector, TriggerHandle <T> handle)
 {
     if (handle == null)
     {
         return;
     }
     if (detector.UseCameraCulling)
     {
         m_Root.Trigger(detector, handle);
     }
     else
     {
         if (detector.IsDetected(Bounds) == false)
         {
             return;
         }
         m_Root.Trigger(detector, handle);
     }
 }
Ejemplo n.º 17
0
 void OnDestroy()
 {
     if (m_Tree != null)
     {
         m_Tree.Clear();
     }
     m_Tree = null;
     if (m_ProcessTaskQueue != null)
     {
         m_ProcessTaskQueue.Clear();
     }
     if (m_LoadedObjectLinkedList != null)
     {
         m_LoadedObjectLinkedList.Clear();
     }
     m_ProcessTaskQueue       = null;
     m_LoadedObjectLinkedList = null;
     m_TriggerHandle          = null;
 }
Ejemplo n.º 18
0
 public override void Trigger(IDetector detector, TriggerHandle <T> handle)
 {
     if (handle == null)
     {
         return;
     }
     if (detector.UseCameraCulling)
     {
         TreeCullingCode code = new TreeCullingCode()
         {
             leftbottomback     = detector.GetDetectedCode(m_Bounds.min.x, m_Bounds.min.y, m_Bounds.min.z, true),
             leftbottomforward  = detector.GetDetectedCode(m_Bounds.min.x, m_Bounds.min.y, m_Bounds.max.z, true),
             lefttopback        = detector.GetDetectedCode(m_Bounds.min.x, m_Bounds.max.y, m_Bounds.min.z, true),
             lefttopforward     = detector.GetDetectedCode(m_Bounds.min.x, m_Bounds.max.y, m_Bounds.max.z, true),
             rightbottomback    = detector.GetDetectedCode(m_Bounds.max.x, m_Bounds.min.y, m_Bounds.min.z, true),
             rightbottomforward = detector.GetDetectedCode(m_Bounds.max.x, m_Bounds.min.y, m_Bounds.max.z, true),
             righttopback       = detector.GetDetectedCode(m_Bounds.max.x, m_Bounds.max.y, m_Bounds.min.z, true),
             righttopforward    = detector.GetDetectedCode(m_Bounds.max.x, m_Bounds.max.y, m_Bounds.max.z, true),
         };
         TriggerToNodeByCamera(detector, handle, 0, code, m_Bounds.center.x, m_Bounds.center.z, m_Bounds.size.x,
                               m_Bounds.size.z);
     }
     else if (detector.IsRebuild)
     {
         TriggerDetectorNearToFar(detector, handle);
     }
     else
     {
         if (m_MaxDepth == 0)
         {
             if (m_Nodes.ContainsKey(0) && m_Nodes[0] != null)
             {
                 m_Nodes[0].Trigger(detector, handle);
             }
         }
         else
         {
             TriggerToNode(detector, handle, 0, m_Bounds.center.x, m_Bounds.center.z, m_Bounds.size.x, m_Bounds.size.z);
         }
     }
 }
Ejemplo n.º 19
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;
    }
Ejemplo n.º 20
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]);
            //    }
            //}
        }
    }
Ejemplo n.º 21
0
 public void EventHook(TriggerHandle chu)
 {
     TriggerEvent -= chu;
     TriggerEvent += chu;
     _subscribers++;
 }
Ejemplo n.º 22
0
 public void SetHandle(TriggerHandle handle)
 {
     mainTriggerHandle = handle;
 }
Ejemplo n.º 23
0
        private void MoveOneStep(IDetector detector, int row, int col, ref int stepx, ref int stepy, int maxcol, ref Vector2 speed, int direct, int depth, ref int count, TriggerHandle <T> handle)
        {
            if (count >= 4 * depth - 1)
            {
                return;
            }
            int  a               = (direct % 2) == 0 ? 2 * depth : depth;
            int  nextCornerX     = stepx + (int)speed.x * a;
            int  nextCornerY     = stepy + (int)speed.y * a;
            bool nextCorInRegion = nextCornerX < maxcol && nextCornerY < maxcol && nextCornerX >= 0 && nextCornerY >= 0;

            //移动一步
            int nextx = stepx + (int)speed.x;
            int nexty = stepy + (int)speed.y;
            //下一个点在不在区域内
            bool nextIn = (nextx < maxcol && nexty < maxcol && nextx >= 0 && nexty >= 0);

            if (nextIn)
            {
                stepx  = nextx;
                stepy  = nexty;
                count += 1;
                TriggeLeafNode(detector, (uint)stepx, (uint)stepy, handle);
            }
            else
            {
                //下一个拐点不在区域内
                if (!nextCorInRegion)
                {
                    //跳到拐点修改速度
                    stepx    = nextCornerX;
                    stepy    = nextCornerY;
                    speed.x -= (int)Mathf.Sign(nextCornerX);
                    speed.y -= (int)Mathf.Sign(nextCornerY);
                    count   += 2 * depth;
                }
                else//求交点跳到交点
                {
                    int stepx2 = stepx == nextCornerX ? stepx:(stepx * nextCornerX < 0?0:maxcol - 1);
                    int stepy2 = stepy == nextCornerY ? stepy : (stepy * nextCornerY < 0 ? 0 : maxcol - 1);
                    count += Mathf.Abs(stepx2 - stepx + stepy2 - stepy);
                }
            }
            MoveOneStep(detector, row, col, ref stepx, ref stepy, maxcol, ref speed, direct, depth, ref count, handle);

            /*
             * //沿速度方向走一格
             * stepx += (int)speed.x;
             * stepy += (int)speed.y;
             * //是否在范围内
             * if (stepx < maxcol && stepy < maxcol && stepx >= 0 && stepy >= 0)
             * {
             *  TriggeLeafNode(detector, (uint)stepx, (uint)stepy, handle);
             * }
             * //查看是否在拐点 在拐点修改速度
             * int s1 = (stepx - row) / depth;
             * int s2 = (stepy - col) / depth;
             * if (Mathf.Abs(s1) == 1 && Mathf.Abs(s2) == 1)
             * {
             *  speed.x -= s1;
             *  speed.y -= s2;
             * }*/
        }
Ejemplo n.º 24
0
        //广度遍历
        private void TriggerOneCircleNodes(IDetector detector, int row, int col, int n, int direct, int maxcol, TriggerHandle <T> handle)
        {
            if (n > maxcol)
            {
                return;
            }
            //遍历一周 距离中心距离是n 行列的周期是n 值域是 -n到n
            Vector2 dir    = directs[direct];
            Vector2 speed1 = Vector2.zero;
            Vector2 speed2 = Vector2.zero;

            //计算初始速度
            if (Mathf.Abs(dir.x) == 1 && Mathf.Abs(dir.y) == 1)
            {
                speed1.x = (int)dir.x * (-1);
                speed2.y = (int)dir.y * (-1);
            }
            else if (dir.x == 0)
            {
                speed1.x = -1;
                speed2.x = 1;
            }
            else if (dir.y == 0)
            {
                speed1.y = -1;
                speed2.y = 1;
            }
            //起始点
            int beginrow = row + n * (int)dir.x;
            int begincol = col + n * (int)dir.y;

            int endrow = row - n * (int)dir.x;
            int endcol = col - n * (int)dir.y;

            bool beginInRegion = beginrow < maxcol && begincol < maxcol && beginrow >= 0 && begincol >= 0;

            //起始点判断
            if (beginInRegion)
            {
                TriggeLeafNode(detector, (uint)beginrow, (uint)begincol, handle);
            }
            int step1x = beginrow;
            int step1y = begincol;
            int step2x = beginrow;
            int step2y = begincol;

            //顺时针和逆时针各走半个周长
            //for (int i = 1; i < 4 * n - 1; i++)
            {
                int count1 = 0;
                int count2 = 0;
                MoveOneStep(detector, row, col, ref step1x, ref step1y, maxcol, ref speed1, direct, n, ref count1, handle);
                MoveOneStep(detector, row, col, ref step2x, ref step2y, maxcol, ref speed2, direct, n, ref count2, handle);
            }

            //终点判断
            if (endrow < maxcol && endcol < maxcol && endrow >= 0 && endcol >= 0)
            {
                TriggeLeafNode(detector, (uint)endrow, (uint)endcol, handle);
            }

            TriggerOneCircleNodes(detector, row, col, n + 1, direct, maxcol, handle);
        }
Ejemplo n.º 25
0
    private void TriggerToNodeByCamera(IDetector detector, TriggerHandle <T> handle, int depth, TreeCullingCode cullingCode, float centerx, float centerz, float sizex,
                                       float sizez)
    {
        if (cullingCode.IsCulled())
        {
            return;
        }
        if (depth == m_MaxDepth)
        {
            uint m = Morton2FromWorldPos(centerx, centerz);
            if (m_Nodes.ContainsKey(m) && m_Nodes[m] != null)
            {
                m_Nodes[m].Trigger(detector, handle);
            }
        }
        else
        {
            float sx = sizex * 0.5f, sz = sizez * 0.5f;
            int   leftbottommiddle    = detector.GetDetectedCode(centerx - sx, m_Bounds.min.y, centerz, true);
            int   middlebottommiddle  = detector.GetDetectedCode(centerx, m_Bounds.min.y, centerz, true);
            int   rightbottommiddle   = detector.GetDetectedCode(centerx + sx, m_Bounds.min.y, centerz, true);
            int   middlebottomback    = detector.GetDetectedCode(centerx, m_Bounds.min.y, centerz - sz, true);
            int   middlebottomforward = detector.GetDetectedCode(centerx, m_Bounds.min.y, centerz + sz, true);

            int lefttopmiddle         = detector.GetDetectedCode(centerx - sx, m_Bounds.max.y, centerz, true);
            int middletopmiddle       = detector.GetDetectedCode(centerx, m_Bounds.max.y, centerz, true);
            int righttopmiddle        = detector.GetDetectedCode(centerx + sx, m_Bounds.max.y, centerz, true);
            int middletopback         = detector.GetDetectedCode(centerx, m_Bounds.max.y, centerz - sz, true);
            int middletopforward      = detector.GetDetectedCode(centerx, m_Bounds.max.y, centerz + sz, true);

            TriggerToNodeByCamera(detector, handle, depth + 1, new TreeCullingCode()
            {
                leftbottomback     = cullingCode.leftbottomback,
                leftbottomforward  = leftbottommiddle,
                lefttopback        = cullingCode.lefttopback,
                lefttopforward     = lefttopmiddle,
                rightbottomback    = middlebottomback,
                rightbottomforward = middlebottommiddle,
                righttopback       = middletopback,
                righttopforward    = middletopmiddle,
            }, centerx - sx * 0.5f, centerz - sz * 0.5f, sx, sz);
            TriggerToNodeByCamera(detector, handle, depth + 1, new TreeCullingCode()
            {
                leftbottomback     = leftbottommiddle,
                leftbottomforward  = cullingCode.leftbottomforward,
                lefttopback        = lefttopmiddle,
                lefttopforward     = cullingCode.lefttopforward,
                rightbottomback    = middlebottommiddle,
                rightbottomforward = middlebottomforward,
                righttopback       = middletopmiddle,
                righttopforward    = middletopforward,
            }, centerx - sx * 0.5f, centerz + sz * 0.5f, sx, sz);
            TriggerToNodeByCamera(detector, handle, depth + 1, new TreeCullingCode()
            {
                leftbottomback     = middlebottomback,
                leftbottomforward  = middlebottommiddle,
                lefttopback        = middletopback,
                lefttopforward     = middletopmiddle,
                rightbottomback    = cullingCode.rightbottomback,
                rightbottomforward = rightbottommiddle,
                righttopback       = cullingCode.righttopback,
                righttopforward    = righttopmiddle,
            }, centerx + sx * 0.5f, centerz - sz * 0.5f, sx, sz);
            TriggerToNodeByCamera(detector, handle, depth + 1, new TreeCullingCode()
            {
                leftbottomback     = middlebottommiddle,
                leftbottomforward  = middlebottomforward,
                lefttopback        = middletopmiddle,
                lefttopforward     = middletopforward,
                rightbottomback    = rightbottommiddle,
                rightbottomforward = cullingCode.rightbottomforward,
                righttopback       = righttopmiddle,
                righttopforward    = cullingCode.righttopforward,
            }, centerx + sx * 0.5f, centerz + sz * 0.5f, sx, sz);
        }
    }
Ejemplo n.º 26
0
 public abstract void Trigger(IDetector detector, TriggerHandle <T> handle);
Ejemplo n.º 27
0
        //深度遍历
        private void TriggerOneNode(IDetector detector, uint row, uint col, int direct, uint maxcol, TriggerHandle <T> handle)
        {
            if (row < maxcol && col < maxcol)
            {
                TriggeLeafNode(detector, row, col, handle);

                int[] nextDirs = DirectParams[direct];
                for (int i = 0; i < nextDirs.Length; i++)
                {
                    uint nrow = row + (uint)directs[nextDirs[i]].x;
                    uint ncol = col + (uint)directs[nextDirs[i]].y;
                    TriggerOneNode(detector, nrow, ncol, nextDirs[i], maxcol, handle);
                }
            }
        }
Ejemplo n.º 28
0
 public void Trigger(IDetector detector, TriggerHandle <T> handle)
 {
     m_Root.Trigger(detector, handle);
 }
Ejemplo n.º 29
0
    private void TriggerByCamera(IDetector detector, TriggerHandle <T> handle, TreeCullingCode code)
    {
        if (code.IsCulled())
        {
            return;
        }

        var node = m_ObjectList.First;

        while (node != null)
        {
            if (detector.IsDetected(node.Value.Bounds))
            {
                handle(node.Value);
            }
            node = node.Next;
        }


        float centerx = m_Bounds.center.x, centery = m_Bounds.center.y, centerz = m_Bounds.center.z;
        float sx = m_Bounds.size.x * 0.5f, sy = m_Bounds.size.y * 0.5f, sz = m_Bounds.size.z * 0.5f;
        int   leftbottommiddle    = detector.GetDetectedCode(centerx - sx, centery - sy, centerz, true);
        int   middlebottommiddle  = detector.GetDetectedCode(centerx, centery - sy, centerz, true);
        int   rightbottommiddle   = detector.GetDetectedCode(centerx + sx, centery - sy, centerz, true);
        int   middlebottomback    = detector.GetDetectedCode(centerx, centery - sy, centerz - sz, true);
        int   middlebottomforward = detector.GetDetectedCode(centerx, centery - sy, centerz + sz, true);

        int lefttopmiddle    = detector.GetDetectedCode(centerx - sx, centery + sy, centerz, true);
        int middletopmiddle  = detector.GetDetectedCode(centerx, centery + sy, centerz, true);
        int righttopmiddle   = detector.GetDetectedCode(centerx + sx, centery + sy, centerz, true);
        int middletopback    = detector.GetDetectedCode(centerx, centery + sy, centerz - sz, true);
        int middletopforward = detector.GetDetectedCode(centerx, centery + sy, centerz + sz, true);

        if (m_ChildCount == 8)
        {
            int leftmiddleback      = detector.GetDetectedCode(centerx - sx, centery, centerz - sz, true);
            int leftmiddlemiddle    = detector.GetDetectedCode(centerx - sx, centery, centerz, true);
            int leftmiddleforward   = detector.GetDetectedCode(centerx - sx, centery, centerz + sz, true);
            int middlemiddleback    = detector.GetDetectedCode(centerx, centery, centerz - sz, true);
            int middlemiddlemiddle  = detector.GetDetectedCode(centerx, centery, centerz, true);
            int middlemiddleforward = detector.GetDetectedCode(centerx, centery, centerz + sz, true);
            int rightmiddleback     = detector.GetDetectedCode(centerx + sx, centery, centerz - sz, true);
            int rightmiddlemiddle   = detector.GetDetectedCode(centerx + sx, centery, centerz, true);
            int rightmiddleforward  = detector.GetDetectedCode(centerx + sx, centery, centerz + sz, true);

            if (m_ChildNodes.Length > 0 && m_ChildNodes[0] != null)
            {
                m_ChildNodes[0].TriggerByCamera(detector, handle, new TreeCullingCode()
                {
                    leftbottomback     = code.leftbottomback,
                    leftbottomforward  = leftbottommiddle,
                    lefttopback        = leftmiddleback,
                    lefttopforward     = leftmiddlemiddle,
                    rightbottomback    = middlebottomback,
                    rightbottomforward = middlebottommiddle,
                    righttopback       = middlemiddleback,
                    righttopforward    = middlemiddlemiddle,
                });
            }
            if (m_ChildNodes.Length > 1 && m_ChildNodes[1] != null)
            {
                m_ChildNodes[1].TriggerByCamera(detector, handle, new TreeCullingCode()
                {
                    leftbottomback     = leftbottommiddle,
                    leftbottomforward  = code.leftbottomforward,
                    lefttopback        = leftmiddlemiddle,
                    lefttopforward     = leftmiddleforward,
                    rightbottomback    = middlebottommiddle,
                    rightbottomforward = middlebottomforward,
                    righttopback       = middlemiddlemiddle,
                    righttopforward    = middlemiddleforward,
                });
            }
            if (m_ChildNodes.Length > 2 && m_ChildNodes[2] != null)
            {
                m_ChildNodes[2].TriggerByCamera(detector, handle, new TreeCullingCode()
                {
                    leftbottomback     = leftmiddleback,
                    leftbottomforward  = leftmiddlemiddle,
                    lefttopback        = code.lefttopback,
                    lefttopforward     = lefttopmiddle,
                    rightbottomback    = middlemiddleback,
                    rightbottomforward = middlemiddlemiddle,
                    righttopback       = middletopback,
                    righttopforward    = middletopmiddle,
                });
            }
            if (m_ChildNodes.Length > 3 && m_ChildNodes[3] != null)
            {
                m_ChildNodes[3].TriggerByCamera(detector, handle, new TreeCullingCode()
                {
                    leftbottomback     = leftmiddlemiddle,
                    leftbottomforward  = leftmiddleforward,
                    lefttopback        = lefttopmiddle,
                    lefttopforward     = code.lefttopforward,
                    rightbottomback    = middlemiddlemiddle,
                    rightbottomforward = middlemiddleforward,
                    righttopback       = middletopmiddle,
                    righttopforward    = middletopforward,
                });
            }

            if (m_ChildNodes.Length > 4 && m_ChildNodes[4] != null)
            {
                m_ChildNodes[4].TriggerByCamera(detector, handle, new TreeCullingCode()
                {
                    leftbottomback     = middlebottomback,
                    leftbottomforward  = middlebottommiddle,
                    lefttopback        = middlemiddleback,
                    lefttopforward     = middlemiddlemiddle,
                    rightbottomback    = code.rightbottomback,
                    rightbottomforward = rightbottommiddle,
                    righttopback       = rightmiddleback,
                    righttopforward    = rightmiddlemiddle,
                });
            }
            if (m_ChildNodes.Length > 5 && m_ChildNodes[5] != null)
            {
                m_ChildNodes[5].TriggerByCamera(detector, handle, new TreeCullingCode()
                {
                    leftbottomback     = middlebottommiddle,
                    leftbottomforward  = middlebottomforward,
                    lefttopback        = middlemiddlemiddle,
                    lefttopforward     = middlemiddleforward,
                    rightbottomback    = rightbottommiddle,
                    rightbottomforward = code.rightbottomforward,
                    righttopback       = rightmiddlemiddle,
                    righttopforward    = rightmiddleforward,
                });
            }
            if (m_ChildNodes.Length > 6 && m_ChildNodes[6] != null)
            {
                m_ChildNodes[6].TriggerByCamera(detector, handle, new TreeCullingCode()
                {
                    leftbottomback     = middlemiddleback,
                    leftbottomforward  = middlemiddlemiddle,
                    lefttopback        = middletopback,
                    lefttopforward     = middletopmiddle,
                    rightbottomback    = rightmiddleback,
                    rightbottomforward = rightmiddlemiddle,
                    righttopback       = code.righttopback,
                    righttopforward    = righttopmiddle,
                });
            }
            if (m_ChildNodes.Length > 7 && m_ChildNodes[7] != null)
            {
                m_ChildNodes[7].TriggerByCamera(detector, handle, new TreeCullingCode()
                {
                    leftbottomback     = middlemiddlemiddle,
                    leftbottomforward  = middlemiddleforward,
                    lefttopback        = middletopmiddle,
                    lefttopforward     = middletopforward,
                    rightbottomback    = rightmiddlemiddle,
                    rightbottomforward = rightmiddleforward,
                    righttopback       = righttopmiddle,
                    righttopforward    = code.righttopforward,
                });
            }
        }
        else
        {
            if (m_ChildNodes.Length > 0 && m_ChildNodes[0] != null)
            {
                m_ChildNodes[0].TriggerByCamera(detector, handle, new TreeCullingCode()
                {
                    leftbottomback     = code.leftbottomback,
                    leftbottomforward  = leftbottommiddle,
                    lefttopback        = code.lefttopback,
                    lefttopforward     = lefttopmiddle,
                    rightbottomback    = middlebottomback,
                    rightbottomforward = middlebottommiddle,
                    righttopback       = middletopback,
                    righttopforward    = middletopmiddle,
                });
            }
            if (m_ChildNodes.Length > 1 && m_ChildNodes[1] != null)
            {
                m_ChildNodes[1].TriggerByCamera(detector, handle, new TreeCullingCode()
                {
                    leftbottomback     = leftbottommiddle,
                    leftbottomforward  = code.leftbottomforward,
                    lefttopback        = lefttopmiddle,
                    lefttopforward     = code.lefttopforward,
                    rightbottomback    = middlebottommiddle,
                    rightbottomforward = middlebottomforward,
                    righttopback       = middletopmiddle,
                    righttopforward    = middletopforward,
                });
            }
            if (m_ChildNodes.Length > 2 && m_ChildNodes[2] != null)
            {
                m_ChildNodes[2].TriggerByCamera(detector, handle, new TreeCullingCode()
                {
                    leftbottomback     = middlebottomback,
                    leftbottomforward  = middlebottommiddle,
                    lefttopback        = middletopback,
                    lefttopforward     = middletopmiddle,
                    rightbottomback    = code.rightbottomback,
                    rightbottomforward = rightbottommiddle,
                    righttopback       = code.righttopback,
                    righttopforward    = righttopmiddle,
                });
            }
            if (m_ChildNodes.Length > 3 && m_ChildNodes[3] != null)
            {
                m_ChildNodes[3].TriggerByCamera(detector, handle, new TreeCullingCode()
                {
                    leftbottomback     = middlebottommiddle,
                    leftbottomforward  = middlebottomforward,
                    lefttopback        = middletopmiddle,
                    lefttopforward     = middletopforward,
                    rightbottomback    = rightbottommiddle,
                    rightbottomforward = code.rightbottomforward,
                    righttopback       = righttopmiddle,
                    righttopforward    = code.righttopforward,
                });
            }
        }
    }