private void DrawPreview(Rect r) { if (r.height <= 0) { return; } if (m_ZoomablePreview == null) { m_ZoomablePreview = new ZoomableArea(true); m_ZoomablePreview.hRangeMin = 0.0f; m_ZoomablePreview.vRangeMin = 0.0f; m_ZoomablePreview.hRangeMax = 1.0f; m_ZoomablePreview.vRangeMax = 1.0f; m_ZoomablePreview.SetShownHRange(0, 1); m_ZoomablePreview.SetShownVRange(0, 1); m_ZoomablePreview.uniformScale = true; m_ZoomablePreview.scaleWithWindow = true; } m_ZoomablePreview.rect = r; m_ZoomablePreview.BeginViewGUI(); m_ZoomablePreview.hSlider = m_ZoomablePreview.shownArea.width < 1; m_ZoomablePreview.vSlider = m_ZoomablePreview.shownArea.height < 1; Rect drawableArea = m_ZoomablePreview.drawRect; GITextureType textureType = GetSelectedTextureType(); UpdateCachedTexture(textureType); if (m_CachedTexture.textureAvailability == GITextureAvailability.GITextureNotAvailable || m_CachedTexture.textureAvailability == GITextureAvailability.GITextureUnknown) { if (!isRealtimeLightmap) { if (!LightmapVisualizationUtility.IsAtlasTextureType(textureType) && isIndexBased) { GUI.Label(drawableArea, Styles.TextureNotAvailableBakedAlbedoEmissive, Styles.PreviewLabel); } else if (textureType == GITextureType.BakedShadowMask) { GUI.Label(drawableArea, Styles.TextureNotAvailableBakedShadowmask, Styles.PreviewLabel); } else { GUI.Label(drawableArea, Styles.TextureNotAvailableBaked, Styles.PreviewLabel); } } else { GUI.Label(drawableArea, Styles.TextureNotAvailableRealtime, Styles.PreviewLabel); } return; } if (m_CachedTexture.textureAvailability == GITextureAvailability.GITextureLoading && m_CachedTexture.texture == null) { GUI.Label(drawableArea, Styles.TextureLoading, Styles.PreviewLabel); return; } LightmapType lightmapType = LightmapVisualizationUtility.GetLightmapType(textureType); switch (Event.current.type) { // 'F' will zoom to uv bounds case EventType.ValidateCommand: case EventType.ExecuteCommand: if (Event.current.commandName == EventCommandNames.FrameSelected && IsSelectedObjectInLightmap(textureType)) { // There are instance based baked textures where we don't get any STs and can't do the framing if (!isRealtimeLightmap && !LightmapVisualizationUtility.IsAtlasTextureType(textureType)) { break; } Vector4 lightmapTilingOffset = LightmapVisualizationUtility.GetLightmapTilingOffset(lightmapType); Vector2 min = new Vector2(lightmapTilingOffset.z, lightmapTilingOffset.w); Vector2 max = min + new Vector2(lightmapTilingOffset.x, lightmapTilingOffset.y); min = Vector2.Max(min, Vector2.zero); max = Vector2.Min(max, Vector2.one); Texture2D texture = m_CachedTexture.texture; Rect textureRect = new Rect(r.x, r.y, texture.width, texture.height); textureRect = ResizeRectToFit(textureRect, drawableArea); float offsetX = 0.0f, offsetY = 0.0f; if (textureRect.height == drawableArea.height) { offsetX = (drawableArea.width - textureRect.width) / drawableArea.width; } else { offsetY = (drawableArea.height - textureRect.height) / drawableArea.height; } // Make sure that the focus rectangle is a even square Rect rect = new Rect(min.x, min.y, max.x - min.x, max.y - min.y); rect.width = rect.height = Mathf.Max(rect.width, rect.height); rect.x -= (offsetX * min.x); rect.y += (offsetY * (1 - max.y)); m_ZoomablePreview.shownArea = rect; Event.current.Use(); } break; // Scale and draw texture and uv's case EventType.Repaint: { Texture2D texture = m_CachedTexture.texture; if (texture) { Rect textureRect = new Rect(r.x, r.y, texture.width, texture.height); textureRect = ResizeRectToFit(textureRect, drawableArea); textureRect = ScaleRectByZoomableArea(textureRect, m_ZoomablePreview); const int padding = 5; textureRect.x += padding; textureRect.width -= padding * 2; textureRect.height -= padding; // Texture shouldn't be filtered since it will make previewing really blurry FilterMode prevMode = texture.filterMode; texture.filterMode = FilterMode.Point; LightmapVisualizationUtility.DrawTextureWithUVOverlay(texture, (m_ShowUVOverlay && IsSelectedObjectInLightmap(textureType)) ? Selection.activeGameObject : null, m_ShowUVOverlay ? m_CachedTextureObjects : new GameObject[] {}, drawableArea, textureRect, textureType, exposure); texture.filterMode = prevMode; } } break; } m_ZoomablePreview.EndViewGUI(); }
public void ObjectPreview(Rect r) { if (r.height <= 0) { return; } if (m_ZoomablePreview == null) { m_ZoomablePreview = new ZoomableArea(true); m_ZoomablePreview.hRangeMin = 0.0f; m_ZoomablePreview.vRangeMin = 0.0f; m_ZoomablePreview.hRangeMax = 1.0f; m_ZoomablePreview.vRangeMax = 1.0f; m_ZoomablePreview.SetShownHRange(0, 1); m_ZoomablePreview.SetShownVRange(0, 1); m_ZoomablePreview.uniformScale = true; m_ZoomablePreview.scaleWithWindow = true; } // Draw background GUI.Box(r, "", "PreBackground"); // Top menu rect Rect menuRect = new Rect(r); menuRect.y += 1; menuRect.height = 18; GUI.Box(menuRect, "", EditorStyles.toolbar); // Top menu dropdown Rect dropRect = new Rect(r); dropRect.y += 1; dropRect.height = 18; dropRect.width = 120; // Drawable area Rect drawableArea = new Rect(r); drawableArea.yMin += dropRect.height; drawableArea.yMax -= 14; drawableArea.width -= 11; int index = Array.IndexOf(Styles.ObjectPreviewTextureOptions, m_SelectedObjectPreviewTexture); if (index < 0 || !LightmapVisualizationUtility.IsTextureTypeEnabled(kObjectPreviewTextureTypes[index])) { index = 0; m_SelectedObjectPreviewTexture = Styles.ObjectPreviewTextureOptions[index]; } if (EditorGUI.DropdownButton(dropRect, m_SelectedObjectPreviewTexture, FocusType.Passive, EditorStyles.toolbarPopup)) { GenericMenu menu = new GenericMenu(); for (int i = 0; i < Styles.ObjectPreviewTextureOptions.Length; i++) { if (LightmapVisualizationUtility.IsTextureTypeEnabled(kObjectPreviewTextureTypes[i])) { menu.AddItem(Styles.ObjectPreviewTextureOptions[i], index == i, SelectPreviewTextureOption, Styles.ObjectPreviewTextureOptions.ElementAt(i)); } else { menu.AddDisabledItem(Styles.ObjectPreviewTextureOptions.ElementAt(i)); } } menu.DropDown(dropRect); } GITextureType textureType = kObjectPreviewTextureTypes[Array.IndexOf(Styles.ObjectPreviewTextureOptions, m_SelectedObjectPreviewTexture)]; if (m_CachedTexture.type != textureType || m_CachedTexture.contentHash != LightmapVisualizationUtility.GetSelectedObjectGITextureHash(textureType) || m_CachedTexture.contentHash == new Hash128()) { m_CachedTexture = LightmapVisualizationUtility.GetSelectedObjectGITexture(textureType); } if (m_CachedTexture.textureAvailability == GITextureAvailability.GITextureNotAvailable || m_CachedTexture.textureAvailability == GITextureAvailability.GITextureUnknown) { if (LightmapVisualizationUtility.IsBakedTextureType(textureType)) { if (textureType == GITextureType.BakedShadowMask) { GUI.Label(drawableArea, Styles.TextureNotAvailableBakedShadowmask); } else { GUI.Label(drawableArea, Styles.TextureNotAvailableBaked); } } else { GUI.Label(drawableArea, Styles.TextureNotAvailableRealtime); } return; } if (m_CachedTexture.textureAvailability == GITextureAvailability.GITextureLoading && m_CachedTexture.texture == null) { GUI.Label(drawableArea, Styles.TextureLoading); return; } LightmapType lightmapType = LightmapVisualizationUtility.GetLightmapType(textureType); // Framing and drawing var evt = Event.current; switch (evt.type) { // 'F' will zoom to uv bounds case EventType.ValidateCommand: case EventType.ExecuteCommand: if (Event.current.commandName == EventCommandNames.FrameSelected) { Vector4 lightmapTilingOffset = LightmapVisualizationUtility.GetLightmapTilingOffset(lightmapType); Vector2 min = new Vector2(lightmapTilingOffset.z, lightmapTilingOffset.w); Vector2 max = min + new Vector2(lightmapTilingOffset.x, lightmapTilingOffset.y); min = Vector2.Max(min, Vector2.zero); max = Vector2.Min(max, Vector2.one); float swap = 1f - min.y; min.y = 1f - max.y; max.y = swap; // Make sure that the focus rectangle is a even square Rect rect = new Rect(min.x, min.y, max.x - min.x, max.y - min.y); rect.x -= Mathf.Clamp(rect.height - rect.width, 0, float.MaxValue) / 2; rect.y -= Mathf.Clamp(rect.width - rect.height, 0, float.MaxValue) / 2; rect.width = rect.height = Mathf.Max(rect.width, rect.height); m_ZoomablePreview.shownArea = rect; Event.current.Use(); } break; // Scale and draw texture and uv's case EventType.Repaint: Texture2D texture = m_CachedTexture.texture; if (texture && Event.current.type == EventType.Repaint) { Rect textureRect = new Rect(0, 0, texture.width, texture.height); textureRect = ResizeRectToFit(textureRect, drawableArea); //textureRect.x = -textureRect.width / 2; //textureRect.y = -textureRect.height / 2; textureRect = CenterToRect(textureRect, drawableArea); textureRect = ScaleRectByZoomableArea(textureRect, m_ZoomablePreview); // Draw texture and UV Rect uvRect = new Rect(textureRect); uvRect.x += 3; uvRect.y += drawableArea.y + 20; Rect clipRect = new Rect(drawableArea); clipRect.y += dropRect.height + 3; // fix 635838 - We need to offset the rects for rendering. { float offset = clipRect.y - 14; uvRect.y -= offset; clipRect.y -= offset; } // Texture shouldn't be filtered since it will make previewing really blurry FilterMode prevMode = texture.filterMode; texture.filterMode = FilterMode.Point; LightmapVisualizationUtility.DrawTextureWithUVOverlay(texture, Selection.activeGameObject, clipRect, uvRect, textureType); texture.filterMode = prevMode; } break; } // Reset zoom if selection is changed if (m_PreviousSelection != Selection.activeInstanceID) { m_PreviousSelection = Selection.activeInstanceID; m_ZoomablePreview.SetShownHRange(0, 1); m_ZoomablePreview.SetShownVRange(0, 1); } // Handle zoomable area Rect zoomRect = new Rect(r); zoomRect.yMin += dropRect.height; m_ZoomablePreview.rect = zoomRect; m_ZoomablePreview.BeginViewGUI(); m_ZoomablePreview.EndViewGUI(); GUILayoutUtility.GetRect(r.width, r.height); }
private void InitIfNeeded(IProfilerWindowController win) { if (m_ZoomablePreview != null) { return; } m_ZoomablePreview = new ZoomableArea(true, false) { hRangeMin = 0.0f, vRangeMin = 0.0f, hRangeMax = 1.0f, vRangeMax = 1.0f }; m_ZoomablePreview.SetShownHRange(0, 1); m_ZoomablePreview.SetShownVRange(0, 1); m_ZoomablePreview.uniformScale = true; m_ZoomablePreview.scaleWithWindow = true; var initwidth = 100; var maxWidth = 200; m_MulticolumnHeaderState = new MultiColumnHeaderState(new[] { new MultiColumnHeaderState.Column { headerContent = EditorGUIUtility.TrTextContent("Object"), width = 220, maxWidth = 400, canSort = true }, new MultiColumnHeaderState.Column { headerContent = EditorGUIUtility.TrTextContent("Self Batch Count"), width = initwidth, maxWidth = maxWidth }, new MultiColumnHeaderState.Column { headerContent = EditorGUIUtility.TrTextContent("Cumulative Batch Count"), width = initwidth, maxWidth = maxWidth }, new MultiColumnHeaderState.Column { headerContent = EditorGUIUtility.TrTextContent("Self Vertex Count"), width = initwidth, maxWidth = maxWidth }, new MultiColumnHeaderState.Column { headerContent = EditorGUIUtility.TrTextContent("Cumulative Vertex Count"), width = initwidth, maxWidth = maxWidth }, new MultiColumnHeaderState.Column { headerContent = EditorGUIUtility.TrTextContent("Batch Breaking Reason"), width = 220, maxWidth = 400, canSort = false }, new MultiColumnHeaderState.Column { headerContent = EditorGUIUtility.TrTextContent("GameObject Count"), width = initwidth, maxWidth = 400 }, new MultiColumnHeaderState.Column { headerContent = EditorGUIUtility.TrTextContent("GameObjects"), width = 150, maxWidth = 400, canSort = false }, }); foreach (var column in m_MulticolumnHeaderState.columns) { column.sortingArrowAlignment = TextAlignment.Right; } m_UGUIProfilerTreeViewState = new UISystemProfilerTreeView.State { profilerWindow = win }; var multiColumnHeader = new Headers(m_MulticolumnHeaderState) { canSort = true, height = 21 }; multiColumnHeader.sortingChanged += header => { m_TreeViewControl.Reload(); }; m_TreeViewControl = new UISystemProfilerTreeView(m_UGUIProfilerTreeViewState, multiColumnHeader); m_TreeViewControl.Reload(); }