//
        private void FillBufferInternal(CommandBuffer buffer)
        {
            // Set cachedOverlay if changed
            bool overlayToUse = mode == HighlighterMode.Overlay || mode == HighlighterMode.Occluder;

            if (cachedOverlay != overlayToUse)
            {
                cachedOverlay = overlayToUse;

                opaqueMaterial.SetKeyword(keywordOverlay, cachedOverlay);
                for (int i = 0; i < highlightableRenderers.Count; i++)
                {
                    highlightableRenderers[i].SetOverlay(cachedOverlay);
                }
            }

            // Set cachedColor if changed
            Color colorToUse = mode != HighlighterMode.Occluder ? color : occluderColor;

            if (cachedColor != colorToUse)
            {
                cachedColor = colorToUse;

                // Apply color
                opaqueMaterial.SetColor(ShaderPropertyID._HighlightingColor, cachedColor);
                for (int i = 0; i < highlightableRenderers.Count; i++)
                {
                    highlightableRenderers[i].SetColor(cachedColor);
                }
            }

            // Fill CommandBuffer with this highlighter rendering commands
            for (int i = highlightableRenderers.Count - 1; i >= 0; i--)
            {
                // To avoid null-reference exceptions when cached renderer has been removed but SetDirty() wasn't been called
                HighlighterRenderer renderer = highlightableRenderers[i];
                if (renderer == null)
                {
                    highlightableRenderers.RemoveAt(i);
                }
                else if (!renderer.IsValid())
                {
                    highlightableRenderers.RemoveAt(i);
                    renderer.isAlive = false;
                }
                else
                {
                    // Check if renderer is visible for the currently rendering camera.
                    // (Last camera called OnWillRenderObject on HighlighterRenderer instance is the same camera for which we're currently filling CommandBuffer)
                    if (HighlightingBase.GetVisible(renderer) || forceRender)
                    {
                        renderer.FillBuffer(buffer);
                    }
                }
            }
        }
Beispiel #2
0
        //
        private void FillBufferInternal(CommandBuffer buffer, Mode m, bool depthAvailable)
        {
            UpdateRenderers();

            bool isHighlighter = once || flashing || (transitionValue > 0f);
            bool isOccluder    = occluder && (seeThrough || !depthAvailable);

            // Update mode
            mode = Mode.None;
            if (isHighlighter)
            {
                mode = seeThrough ? Mode.HighlighterSeeThrough : Mode.Highlighter;
            }
            else if (isOccluder)
            {
                mode = seeThrough ? Mode.OccluderSeeThrough : Mode.Occluder;
            }

            if (mode == Mode.None || mode != m)
            {
                return;
            }

            if (isHighlighter)
            {
                // ZTest = (seeThrough ? Always : LEqual), StencilRef = 1
                UpdateShaderParams(seeThrough, true);
            }
            else if (isOccluder)
            {
                // ZTest = LEqual, StencilRef = seeThrough ? 1 : 0
                UpdateShaderParams(false, seeThrough);
            }
            UpdateColors();

            // Fill CommandBuffer with this highlighter rendering commands
            for (int i = highlightableRenderers.Count - 1; i >= 0; i--)
            {
                // To avoid null-reference exceptions when cached renderer has been removed but ReinitMaterials wasn't been called
                HighlighterRenderer renderer = highlightableRenderers[i];
                if (renderer == null)
                {
                    highlightableRenderers.RemoveAt(i);
                }
                // Try to fill buffer
                else if (!renderer.FillBuffer(buffer))
                {
                    highlightableRenderers.RemoveAt(i);
                    renderer.SetState(false);
                }
            }
        }
Beispiel #3
0
        //
        private void FillBufferInternal(CommandBuffer buffer, Mode m)
        {
            UpdateRenderers();

            // Update mode
            mode = Mode.None;
            // Highlighter
            if (once || flashing || (transitionValue > 0f))
            {
                mode = seeThrough ? Mode.HighlighterSeeThrough : Mode.Highlighter;
            }
            // Occluder
            else if (occluder && seeThrough)
            {
                mode = Mode.OccluderSeeThrough;
            }

            if (mode == Mode.None || mode != m)
            {
                return;
            }

            // Update shader property if changed
            if (cachedSeeThrough != seeThrough)
            {
                cachedSeeThrough = seeThrough;

                if (cachedSeeThrough)
                {
                    _opaqueMaterial.EnableKeyword(keywordSeeThrough);
                }
                else
                {
                    _opaqueMaterial.DisableKeyword(keywordSeeThrough);
                }

                for (int i = 0; i < highlightableRenderers.Count; i++)
                {
                    highlightableRenderers[i].SetSeeThroughForTransparent(seeThrough);
                }
            }

            UpdateColors();

            // Fill CommandBuffer with this highlighter rendering commands
            for (int i = highlightableRenderers.Count - 1; i >= 0; i--)
            {
                // To avoid null-reference exceptions when cached renderer has been removed but ReinitMaterials wasn't been called
                HighlighterRenderer renderer = highlightableRenderers[i];
                if (renderer == null)
                {
                    highlightableRenderers.RemoveAt(i);
                }
                // Try to fill buffer
                else if (!renderer.FillBuffer(buffer, forceRender))
                {
                    highlightableRenderers.RemoveAt(i);
                    renderer.SetState(false);
                }
            }
        }