Files
SoulliesOfficial ef7b479712 initial
2025-11-25 08:19:33 -05:00

107 lines
3.6 KiB
C#

/// ---------------------------------------------
/// Senses Pack for Behavior Designer Pro
/// Copyright (c) Opsive. All Rights Reserved.
/// https://www.opsive.com
/// ---------------------------------------------
namespace Opsive.BehaviorDesigner.AddOns.SensesPack.Runtime.Emitters
{
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// Manages all luminance emitters in the scene and provides methods to calculate total luminance at any point.
/// </summary>
public class LuminanceManager : MonoBehaviour
{
private static LuminanceManager s_Instance;
public static LuminanceManager Instance {
get {
if (s_Instance == null) {
s_Instance = new GameObject("LuminanceManager").AddComponent<LuminanceManager>();
}
return s_Instance;
}
}
[Tooltip("Should the ambient light be used in the luminance calculation?")]
[SerializeField] protected bool m_UseAmbientLight = true;
/// <summary>
/// List of all active luminance emitters in the scene.
/// </summary>
private List<LuminanceEmitter> m_LuminanceEmitters = new List<LuminanceEmitter>();
/// <summary>
/// Called when the object is enabled. Sets up the singleton instance.
/// </summary>
private void OnEnable()
{
s_Instance = this;
}
/// <summary>
/// Registers a new luminance emitter with the manager.
/// </summary>
/// <param name="emitter">The emitter to register.</param>
public void Register(LuminanceEmitter emitter)
{
if (emitter == null) {
return;
}
m_LuminanceEmitters.Add(emitter);
}
/// <summary>
/// Calculates the total luminance at a target's position from all registered emitters.
/// </summary>
/// <param name="target">The GameObject to calculate luminance for.</param>
/// <returns>The total luminance value at the target's position.</returns>
public float GetLuminance(GameObject target)
{
var luminance = m_UseAmbientLight ? RenderSettings.ambientIntensity : 0;
for (int i = 0; i < m_LuminanceEmitters.Count; ++i) {
luminance += m_LuminanceEmitters[i].GetLuminance(target);
}
return luminance;
}
/// <summary>
/// Unregisters a luminance emitter from the manager.
/// </summary>
/// <param name="emitter">The emitter to unregister.</param>
public static void Unregister(LuminanceEmitter emitter)
{
if (s_Instance == null) {
return;
}
Instance.UnregisterInternal(emitter);
}
/// <summary>
/// Unregisters a luminance emitter from the manager.
/// </summary>
/// <param name="emitter">The emitter to unregister.</param>
private void UnregisterInternal(LuminanceEmitter emitter)
{
m_LuminanceEmitters.Remove(emitter);
}
/// <summary>
/// Called when the object is disabled. Cleans up the singleton instance.
/// </summary>
private void OnDisable()
{
s_Instance = null;
}
/// <summary>
/// Reset the static variables for domain reloading.
/// </summary>
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
private static void DomainReset()
{
s_Instance = null;
}
}
}