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();
}