Beispiel #1
0
 // Clear cached renderers
 private void ClearRenderers()
 {
     for (int i = highlightableRenderers.Count - 1; i >= 0; i--)
     {
         HighlighterRenderer renderer = highlightableRenderers[i];
         renderer.SetState(false);
     }
     highlightableRenderers.Clear();
 }
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);
                }
            }
        }