Exemple #1
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);
        }
    }
    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,
                });
            }
        }
    }