Esempio n. 1
0
    public void Trigger(IDetector detector, TriggerHandler handle)
    {
        if (handle == null)
        {
            return;
        }

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

        if (detector.IsDetected(mBounds))
        {
            var node = mEntities.First;
            while (node != null)
            {
                if (detector.IsDetected(node.Value.bounds))
                {
                    handle(node.Value);
                }

                node = node.Next;
            }
        }
    }
    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;
            }
        }
    }
Esempio n. 3
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);
            }
        }
    }
    /// <summary>
    /// Add objects into the quad tree
    /// </summary>
    /// <param name="obj"></param>
    public void AddSceneBlockObject(ISceneObject obj)
    {
        if (!m_IsInitialized)
        {
            return;
        }
        if (m_QuadTree == null)
        {
            return;
        }
        if (obj == null)
        {
            return;
        }

        SceneObject sbobj = new SceneObject(obj);

        m_QuadTree.Add(sbobj);
        // Create the object
        if (m_CurrentDetector != null && m_CurrentDetector.IsDetected(sbobj.Bounds))
        {
            // add to the object loaded list
            m_LoadedObjectList.Add(sbobj);
            // create the object
            CreateObject(sbobj);
        }
    }
Esempio n. 5
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);
 }
    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;
                }
            }
        }
    }
Esempio n. 7
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;
                }
            }
        }
 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);
     }
 }
Esempio n. 9
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]);
            //    }
            //}
        }
    }
Esempio n. 10
0
    /// <summary>
    /// 添加场景物体
    /// </summary>
    /// <param name="obj"></param>
    public void AddSceneBlockObject(ISceneObject obj)
    {
        if (!m_IsInitialized)
        {
            return;
        }
        if (m_QuadTree == null)
        {
            return;
        }
        if (obj == null)
        {
            return;
        }
        //使用SceneObject包装
        SceneObject sbobj = new SceneObject(obj);

        m_QuadTree.Add(sbobj);
        //如果当前触发器存在,直接物体是否可触发,如果可触发,则创建物体
        if (m_CurrentDetector != null && m_CurrentDetector.IsDetected(sbobj.Bounds))
        {
            DoCreateInternal(sbobj);
        }
    }
Esempio n. 11
0
    /// <summary>
    /// 添加场景物体
    /// </summary>
    /// <param name="obj"></param>
    public void AddSceneEntity(IEntity entity)
    {
        if (!mIsInitialized)
        {
            return;
        }
        if (mSeparateTree == null)
        {
            return;
        }
        if (entity == null)
        {
            return;
        }
        //使用SeparateEntity包装
        SeparateEntity se = new SeparateEntity(entity);

        mSeparateTree.Add(se);
        //如果当前触发器存在,直接物体是否可触发,如果可触发,则创建物体
        if (mDetector != null && mDetector.IsDetected(se.bounds))
        {
            CreateInternal(se);
        }
    }
Esempio n. 12
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,
                });
            }
        }
    }