Files
ZHGD_Web/Assets/Art/Art Plugins/Horizon Based Ambient Occlusion/Editor/HBAOGaiaExtension.cs
2025-07-13 23:16:20 +08:00

141 lines
4.0 KiB
C#

#if GAIA_PRESENT && UNITY_EDITOR
using HorizonBasedAmbientOcclusion;
using UnityEditor;
using UnityEngine;
namespace Gaia.GX.MichaelJimenez
{
public class HBAOGaiaExtension : MonoBehaviour
{
#region Generic informational methods
/// <summary>
/// Returns the publisher name if provided.
/// This will override the publisher name in the namespace ie Gaia.GX.PublisherName
/// </summary>
/// <returns>Publisher name</returns>
public static string GetPublisherName()
{
return "Michael Jimenez";
}
/// <summary>
/// Returns the package name if provided
/// This will override the package name in the class name ie public class PackageName.
/// </summary>
/// <returns>Package name</returns>
public static string GetPackageName()
{
return "Horizon Based Ambient Occlusion";
}
#endregion
#region Methods exposed by Gaia as buttons must be prefixed with GX_
public static void GX_About()
{
EditorUtility.DisplayDialog("About Horizon Based Ambient Occlusion ", "HBAO is a post processing image effect to use in order to add realism to your scenes. It helps accentuating small surface details and reproduce light attenuation due to occlusion.\n\nNote: This Post FX should be the first in your effect stack.", "OK");
}
public static void GX_Presets_FastestPerformance()
{
HBAO hbao = StackPostFXOnTop();
if (hbao != null)
{
hbao.ApplyPreset(HBAO.Preset.FastestPerformance);
MarkDirty(hbao);
}
}
public static void GX_Presets_FastPerformance()
{
HBAO hbao = StackPostFXOnTop();
if (hbao != null)
{
hbao.ApplyPreset(HBAO.Preset.FastPerformance);
MarkDirty(hbao);
}
}
public static void GX_Presets_Normal()
{
HBAO hbao = StackPostFXOnTop();
if (hbao != null)
{
hbao.ApplyPreset(HBAO.Preset.Normal);
MarkDirty(hbao);
}
}
public static void GX_Presets_HighQuality()
{
HBAO hbao = StackPostFXOnTop();
if (hbao != null)
{
hbao.ApplyPreset(HBAO.Preset.HighQuality);
MarkDirty(hbao);
}
}
public static void GX_Presets_HighestQuality()
{
HBAO hbao = StackPostFXOnTop();
if (hbao != null)
{
hbao.ApplyPreset(HBAO.Preset.HighestQuality);
MarkDirty(hbao);
}
}
#endregion
#region Helper methods
private static HBAO StackPostFXOnTop()
{
Camera camera = Camera.main;
if (camera == null)
{
camera = FindObjectOfType<Camera>();
}
if (camera == null)
{
EditorUtility.DisplayDialog("OOPS!", "Could not find camera to add camera effects to. Please add a camera to your scene.", "OK");
return null;
}
// add HBAO to camera
HBAO hbao = camera.GetComponent<HBAO>();
if (hbao != null)
{
DestroyImmediate(hbao);
}
hbao = camera.gameObject.AddComponent<HBAO>();
// stack it on top
while (camera.GetComponents<MonoBehaviour>()[0] != hbao)
{
UnityEditorInternal.ComponentUtility.MoveComponentUp(hbao);
}
return hbao;
}
private static void MarkDirty(HBAO hbao)
{
EditorUtility.SetDirty(hbao);
if (!EditorApplication.isPlaying)
{
UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(UnityEngine.SceneManagement.SceneManager.GetActiveScene());
}
}
#endregion
}
}
#endif