public override void Update() { RenderChain expr_07 = this.renderChain; bool flag = ((expr_07 != null) ? expr_07.device : null) == null; if (!flag) { using (UIRRepaintUpdater.s_MarkerDrawChain.Auto()) { this.renderChain.ProcessChanges(); PanelClearFlags clearFlags = base.panel.clearFlags; bool flag2 = clearFlags > PanelClearFlags.None; if (flag2) { GL.Clear((clearFlags & PanelClearFlags.Depth) > PanelClearFlags.None, (clearFlags & PanelClearFlags.Color) > PanelClearFlags.None, Color.clear, 0.99f); } this.renderChain.Render(); } } }
public override void Update() { if (renderChain?.device == null) { return; } using (s_MarkerDrawChain.Auto()) { renderChain.ProcessChanges(); PanelClearFlags clearFlags = panel.clearFlags; if (clearFlags != PanelClearFlags.None) { GL.Clear((clearFlags & PanelClearFlags.Depth) != 0, // Clearing may impact MVP (clearFlags & PanelClearFlags.Color) != 0, Color.clear, UIRUtility.k_ClearZ); } renderChain.Render(); } }
public void Render(Rect viewport, Matrix4x4 projection, PanelClearFlags clearFlags) { s_MarkerRender.Begin(); m_Stats = new ChainBuilderStats(); m_Stats.elementsAdded += m_StatsElementsAdded; m_Stats.elementsRemoved += m_StatsElementsRemoved; m_StatsElementsAdded = m_StatsElementsRemoved = 0; if (shaderInfoAllocator.isReleased) { RecreateDevice(); // The shader info texture was released, recreate the device to start fresh } if (OnPreRender != null) { OnPreRender(); } bool atlasWasReset = false; if (atlasManager?.RequiresReset() == true) { atlasManager.Reset(); // May cause a dirty repaint atlasWasReset = true; } if (vectorImageManager?.RequiresReset() == true) { vectorImageManager.Reset(); atlasWasReset = true; } // Although shaderInfoAllocator uses an atlas internally, it doesn't need to // reset it due to any of the current reasons that the atlas is reset for, thus we don't do it. if (atlasWasReset) { RepaintAtlassedElements(); } m_DirtyTracker.dirtyID++; var dirtyClass = (int)RenderDataDirtyTypeClasses.Clipping; var dirtyFlags = RenderDataDirtyTypes.Clipping | RenderDataDirtyTypes.ClippingHierarchy; var clearDirty = ~dirtyFlags; s_MarkerClipProcessing.Begin(); for (int depth = m_DirtyTracker.minDepths[dirtyClass]; depth <= m_DirtyTracker.maxDepths[dirtyClass]; depth++) { VisualElement ve = m_DirtyTracker.heads[depth]; while (ve != null) { VisualElement veNext = ve.renderChainData.nextDirty; if ((ve.renderChainData.dirtiedValues & dirtyFlags) != 0) { if (ve.renderChainData.isInChain && ve.renderChainData.dirtyID != m_DirtyTracker.dirtyID) { Implementation.RenderEvents.ProcessOnClippingChanged(this, ve, m_DirtyTracker.dirtyID, device, ref m_Stats); } m_DirtyTracker.ClearDirty(ve, clearDirty); } ve = veNext; } } s_MarkerClipProcessing.End(); m_DirtyTracker.dirtyID++; dirtyClass = (int)RenderDataDirtyTypeClasses.Opacity; dirtyFlags = RenderDataDirtyTypes.Opacity; clearDirty = ~dirtyFlags; s_MarkerOpacityProcessing.Begin(); for (int depth = m_DirtyTracker.minDepths[dirtyClass]; depth <= m_DirtyTracker.maxDepths[dirtyClass]; depth++) { VisualElement ve = m_DirtyTracker.heads[depth]; while (ve != null) { VisualElement veNext = ve.renderChainData.nextDirty; if ((ve.renderChainData.dirtiedValues & dirtyFlags) != 0) { if (ve.renderChainData.isInChain && ve.renderChainData.dirtyID != m_DirtyTracker.dirtyID) { Implementation.RenderEvents.ProcessOnOpacityChanged(this, ve, m_DirtyTracker.dirtyID, ref m_Stats); } m_DirtyTracker.ClearDirty(ve, clearDirty); } ve = veNext; } } s_MarkerOpacityProcessing.End(); m_DirtyTracker.dirtyID++; dirtyClass = (int)RenderDataDirtyTypeClasses.TransformSize; dirtyFlags = RenderDataDirtyTypes.Transform | RenderDataDirtyTypes.Size; clearDirty = ~dirtyFlags; s_MarkerTransformProcessing.Begin(); for (int depth = m_DirtyTracker.minDepths[dirtyClass]; depth <= m_DirtyTracker.maxDepths[dirtyClass]; depth++) { VisualElement ve = m_DirtyTracker.heads[depth]; while (ve != null) { VisualElement veNext = ve.renderChainData.nextDirty; if ((ve.renderChainData.dirtiedValues & dirtyFlags) != 0) { if (ve.renderChainData.isInChain && ve.renderChainData.dirtyID != m_DirtyTracker.dirtyID) { Implementation.RenderEvents.ProcessOnTransformOrSizeChanged(this, ve, m_DirtyTracker.dirtyID, device, ref m_Stats); } m_DirtyTracker.ClearDirty(ve, clearDirty); } ve = veNext; } } s_MarkerTransformProcessing.End(); m_BlockDirtyRegistration = true; // Processing visuals may call generateVisualContent, which must be restricted to the allowed operations m_DirtyTracker.dirtyID++; dirtyClass = (int)RenderDataDirtyTypeClasses.Visuals; dirtyFlags = RenderDataDirtyTypes.Visuals | RenderDataDirtyTypes.VisualsHierarchy; clearDirty = ~dirtyFlags; s_MarkerVisualsProcessing.Begin(); for (int depth = m_DirtyTracker.minDepths[dirtyClass]; depth <= m_DirtyTracker.maxDepths[dirtyClass]; depth++) { VisualElement ve = m_DirtyTracker.heads[depth]; while (ve != null) { VisualElement veNext = ve.renderChainData.nextDirty; if ((ve.renderChainData.dirtiedValues & dirtyFlags) != 0) { if (ve.renderChainData.isInChain && ve.renderChainData.dirtyID != m_DirtyTracker.dirtyID) { Implementation.RenderEvents.ProcessOnVisualsChanged(this, ve, m_DirtyTracker.dirtyID, ref m_Stats); } m_DirtyTracker.ClearDirty(ve, clearDirty); } ve = veNext; } } s_MarkerVisualsProcessing.End(); m_BlockDirtyRegistration = false; // Done with all dirtied elements m_DirtyTracker.Reset(); ProcessTextRegen(true); if (m_FontWasReset) { // We regenerate the text when the font texture was reset since we don't have any guarantees // the the glyphs are going to end up at the same spot in the texture. // Up to two passes may be necessary with time-slicing turned off to fully update the text. const int kMaxTextPasses = 2; for (int i = 0; i < kMaxTextPasses; ++i) { if (!m_FontWasReset) { break; } m_FontWasReset = false; ProcessTextRegen(false); } } // Commit new requests for atlases if any atlasManager?.Commit(); vectorImageManager?.Commit(); shaderInfoAllocator.IssuePendingAtlasBlits(); if (BeforeDrawChain != null) { BeforeDrawChain(device); } Exception immediateException = null; device.DrawChain(m_FirstCommand, viewport, projection, clearFlags, atlasManager?.atlas, vectorImageManager?.atlas, shaderInfoAllocator.atlas, (panel as BaseVisualElementPanel).scaledPixelsPerPoint, shaderInfoAllocator.transformConstants, shaderInfoAllocator.clipRectConstants, ref immediateException); s_MarkerRender.End(); if (immediateException != null) { throw immediateException; } if (drawStats) { DrawStats(); } }