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);
if ((textureType == GITextureType.BakedAlbedo || textureType == GITextureType.BakedEmissive) && LightmapEditorSettings.lightmapper == LightmapEditorSettings.Lightmapper.ProgressiveCPU)
{
lightmapTilingOffset = new Vector4(1f, 1f, 0f, 0f);
}
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);
}