using System.Reflection; using UnityEditor; using UnityEngine; using UnityEngine.Rendering.HighDefinition; using UnityEngine.Rendering; #if UNITY_2020_2_OR_NEWER using UnityEditor.AssetImporters; #else using UnityEditor.Experimental.AssetImporters; #endif namespace UnityEditor.Rendering.HighDefinition { /// /// Class describing the logic for importer an IES file an generating the IESObject associated /// [CustomEditor(typeof(IESImporter))] public partial class HDIESImporterEditor : ScriptedImporterEditor { /// /// IES Importer Editor, common to Core and HDRP /// public UnityEditor.Rendering.IESImporterEditor iesImporterEditor = new UnityEditor.Rendering.IESImporterEditor(); internal void SetupRenderPipelinePreviewCamera(Camera camera) { HDAdditionalCameraData hdCamera = camera.gameObject.AddComponent(); hdCamera.clearDepth = true; hdCamera.clearColorMode = HDAdditionalCameraData.ClearColorMode.None; hdCamera.GetType().GetProperty("isEditorCameraPreview", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).SetValue(hdCamera, true, null); } internal void SetupRenderPipelinePreviewLight(Light light) { LightType lightType = (light.type == LightType.Point) ? LightType.Point : LightType.Spot; HDAdditionalLightData hdLight = GameObjectExtension.AddHDLight(light.gameObject, lightType); light.intensity = LightUnitUtils.ConvertIntensity(light, 20000f, LightUnit.Lumen, LightUnit.Candela); hdLight.affectDiffuse = true; hdLight.affectSpecular = false; hdLight.affectsVolumetric = false; } internal void SetupRenderPipelinePreviewWallRenderer(MeshRenderer wallRenderer) { wallRenderer.material = AssetDatabase.LoadAssetAtPath("Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipelineResources/Material/DefaultHDMaterial.mat"); } internal void SetupRenderPipelinePreviewFloorRenderer(MeshRenderer floorRenderer) { floorRenderer.material = AssetDatabase.LoadAssetAtPath("Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipelineResources/Material/DefaultHDMaterial.mat"); } internal void SetupRenderPipelinePreviewLightIntensity(Light light, SerializedProperty useIESMaximumIntensityProp, SerializedProperty iesMaximumIntensityUnitProp, SerializedProperty iesMaximumIntensityProp) { if (useIESMaximumIntensityProp.boolValue) { LightUnit lightUnit = (iesMaximumIntensityUnitProp.stringValue == "Lumens") ? LightUnit.Lumen : LightUnit.Candela; light.intensity = LightUnitUtils.ConvertIntensity(light, iesMaximumIntensityProp.floatValue, lightUnit, LightUnit.Candela); } else { light.intensity = LightUnitUtils.ConvertIntensity(light, 20000f, LightUnit.Lumen, LightUnit.Candela); } } /// /// Call back for ScriptedImporterEditor /// public override void OnEnable() { base.OnEnable(); PropertyFetcher entryPoint0 = new PropertyFetcher(serializedObject); SerializedProperty entryPoint1 = entryPoint0.Find(x => x.iesMetaData); //SerializedProperty entryPoint = entryPoint1.FindPropertyRelative("iesMetaData"); iesImporterEditor.CommonOnEnable(entryPoint1); } /// /// Call back for ScriptedImporterEditor /// public override void OnInspectorGUI() { iesImporterEditor.CommonOnInspectorGUI(this as ScriptedImporterEditor); base.ApplyRevertGUI(); } /// /// Call back for ScriptedImporterEditor /// protected override void Apply() { base.Apply(); iesImporterEditor.CommonApply(); } /// /// Call back for ScriptedImporterEditor /// /// If this importer has a preview or not public override bool HasPreviewGUI() { return iesImporterEditor.CommonHasPreviewGUI( delegate (Camera camera) { SetupRenderPipelinePreviewCamera(camera); }, delegate (Light light) { SetupRenderPipelinePreviewLight(light); }, delegate (MeshRenderer wallRenderer) { SetupRenderPipelinePreviewWallRenderer(wallRenderer); }, delegate (MeshRenderer floorRenderer) { SetupRenderPipelinePreviewFloorRenderer(floorRenderer); } ); } /// /// Call back for ScriptedImporterEditor /// /// The title of the Preview public override GUIContent GetPreviewTitle() { return iesImporterEditor.CommonGetPreviewTitle(); } /// /// Call back for ScriptedImporterEditor /// /// Rectangle of the preview. /// Style of the background of the preview. public override void OnPreviewGUI(Rect r, GUIStyle background) { iesImporterEditor.CommonOnPreviewGUI(r, background, target as IESImporter, delegate (Light light, SerializedProperty useIESMaximumIntensityProp, SerializedProperty iesMaximumIntensityUnitProp, SerializedProperty iesMaximumIntensityProp) { SetupRenderPipelinePreviewLightIntensity(light, useIESMaximumIntensityProp, iesMaximumIntensityUnitProp, iesMaximumIntensityProp); }); } /// /// Call back for ScriptedImporterEditor /// public override void OnDisable() { base.OnDisable(); iesImporterEditor.CommonOnDisable(); } } }