您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

180 行
5.9 KiB

using UnityEngine;
using UnityEditor;
using UnityEngine.Experimental.Rendering.HDPipeline;
[CustomEditorForRenderPipeline(typeof(Cubemap), typeof(HDRenderPipelineAsset))]
class HDCubemapInspector : Editor
{
private enum NavMode
{
None = 0,
Zooming = 1,
Rotating = 2
}
static GUIContent s_MipMapLow, s_MipMapHigh, s_ExposureHigh, s_ExposureLow, s_RGBMIcon;
static GUIStyle s_PreButton, s_PreSlider, s_PreSliderThumb, s_PreLabel;
static Mesh s_SphereMesh;
static Mesh sphereMesh
{
get { return s_SphereMesh ?? (s_SphereMesh = Resources.GetBuiltinResource(typeof(Mesh), "New-Sphere.fbx") as Mesh); }
}
Material m_ReflectiveMaterial;
PreviewRenderUtility m_PreviewUtility;
float m_CameraPhi = 0.75f;
float m_CameraTheta = 0.5f;
float m_CameraDistance = 2.0f;
NavMode m_NavMode = NavMode.None;
Vector2 m_PreviousMousePosition = Vector2.zero;
public float previewExposure = 0f;
public float mipLevelPreview = 0f;
void Awake()
{
m_ReflectiveMaterial = new Material(Shader.Find("Debug/ReflectionProbePreview"))
{
hideFlags = HideFlags.HideAndDontSave
};
}
void OnEnable()
{
if (m_PreviewUtility == null)
InitPreview();
if (s_MipMapLow == null)
InitIcons();
m_ReflectiveMaterial.SetTexture("_Cubemap", target as Texture);
}
void OnDisable()
{
if (m_PreviewUtility != null)
m_PreviewUtility.Cleanup();
}
public override bool HasPreviewGUI()
{
return true;
}
public override void OnPreviewGUI(Rect r, GUIStyle background)
{
if(m_ReflectiveMaterial != null)
{
m_ReflectiveMaterial.SetFloat("_Exposure", previewExposure);
m_ReflectiveMaterial.SetFloat("_MipLevel", mipLevelPreview);
}
if(m_PreviewUtility == null)
InitPreview();
UpdateCamera();
m_PreviewUtility.BeginPreview(r, GUIStyle.none);
m_PreviewUtility.DrawMesh(sphereMesh, Matrix4x4.identity, m_ReflectiveMaterial, 0);
m_PreviewUtility.camera.Render();
m_PreviewUtility.EndAndDrawPreview(r);
if (Event.current.type != EventType.Repaint)
{
if (HandleMouse(r))
Repaint();
}
}
public override void OnPreviewSettings()
{
var mipmapCount = 0;
var cubemap = target as Cubemap;
var rt = target as RenderTexture;
if (cubemap != null)
mipmapCount = cubemap.mipmapCount;
if (rt != null)
mipmapCount = rt.useMipMap
? (int)(Mathf.Log(Mathf.Max(rt.width, rt.height)) / Mathf.Log(2))
: 1;
GUI.enabled = true;
GUILayout.Box(s_ExposureLow, s_PreLabel, GUILayout.MaxWidth(20));
GUI.changed = false;
previewExposure = GUILayout.HorizontalSlider(previewExposure, -10f, 10f, GUILayout.MaxWidth(80));
GUILayout.Space(5);
GUILayout.Box(s_MipMapHigh, s_PreLabel, GUILayout.MaxWidth(20));
GUI.changed = false;
mipLevelPreview = GUILayout.HorizontalSlider(mipLevelPreview, 0, mipmapCount, GUILayout.MaxWidth(80));
GUILayout.Box(s_MipMapLow, s_PreLabel, GUILayout.MaxWidth(20));
}
void InitPreview()
{
m_PreviewUtility = new PreviewRenderUtility(false, true);
m_PreviewUtility.cameraFieldOfView = 50.0f;
m_PreviewUtility.camera.nearClipPlane = 0.01f;
m_PreviewUtility.camera.farClipPlane = 20.0f;
m_PreviewUtility.camera.transform.position = new Vector3(0, 0, 2);
m_PreviewUtility.camera.transform.LookAt(Vector3.zero);
}
bool HandleMouse(Rect Viewport)
{
var result = false;
if (Event.current.type == EventType.MouseDown)
{
if (Event.current.button == 0)
m_NavMode = NavMode.Rotating;
else if (Event.current.button == 1)
m_NavMode = NavMode.Zooming;
m_PreviousMousePosition = Event.current.mousePosition;
result = true;
}
if (Event.current.type == EventType.MouseUp || Event.current.rawType == EventType.MouseUp)
m_NavMode = NavMode.None;
if (m_NavMode != NavMode.None)
{
var mouseDelta = Event.current.mousePosition - m_PreviousMousePosition;
switch (m_NavMode)
{
case NavMode.Rotating:
m_CameraTheta = (m_CameraTheta - mouseDelta.x * 0.003f) % (Mathf.PI * 2);
m_CameraPhi = Mathf.Clamp(m_CameraPhi - mouseDelta.y * 0.003f, 0.2f, Mathf.PI - 0.2f);
break;
case NavMode.Zooming:
m_CameraDistance = Mathf.Clamp(mouseDelta.y * 0.01f + m_CameraDistance, 1, 10);
break;
}
result = true;
}
m_PreviousMousePosition = Event.current.mousePosition;
return result;
}
void UpdateCamera()
{
var pos = new Vector3(Mathf.Sin(m_CameraPhi) * Mathf.Cos(m_CameraTheta), Mathf.Cos(m_CameraPhi), Mathf.Sin(m_CameraPhi) * Mathf.Sin(m_CameraTheta)) * m_CameraDistance;
m_PreviewUtility.camera.transform.position = pos;
m_PreviewUtility.camera.transform.LookAt(Vector3.zero);
}
static void InitIcons()
{
s_MipMapLow = EditorGUIUtility.IconContent("PreTextureMipMapLow");
s_MipMapHigh = EditorGUIUtility.IconContent("PreTextureMipMapHigh");
s_ExposureHigh = EditorGUIUtility.IconContent("SceneViewLighting");
s_ExposureLow = EditorGUIUtility.IconContent("SceneViewLighting");
s_RGBMIcon = EditorGUIUtility.IconContent("PreMatLight1"); // TODO: proper icon for RGBM preview mode
s_PreButton = "preButton";
s_PreSlider = "preSlider";
s_PreSliderThumb = "preSliderThumb";
s_PreLabel = "preLabel";
}
}