//pipelinedefine #define H_URP using System.Collections.Generic; using System.Linq; using HTraceWSGI.Scripts.Extensions; using HTraceWSGI.Scripts.Globals; using UnityEngine; using UnityEngine.Experimental.Rendering; using UnityEngine.Rendering; namespace HTraceWSGI.Scripts.Services.LightsCluster { internal sealed class LightService : IService { internal struct LightInfo { public Vector3 Position; } private static readonly int _MaxCookieResolution = Shader.PropertyToID("_MaxCookieResolution"); private static readonly int _LightPointCookies_Output = Shader.PropertyToID("_LightPointCookies_Output"); private static readonly int _LightSpotCookies_Output = Shader.PropertyToID("_LightSpotCookies_Output"); private static LightService _instance; public static LightService Instance { get { if (_instance == null) _instance = new LightService(); return _instance; } } private readonly Dictionary _lights = new Dictionary(10); private readonly List _lightsToRemove = new List(20); private readonly List _lightsToUpdate = new List(20); public void Initialize() { HPunctualLight[] findObjectsByType = Object.FindObjectsByType(FindObjectsSortMode.None); foreach (var light in findObjectsByType) { if (light.enabled == true) AddLight(light.Light); } } public void AddLight(Light light) { if (light == null || !light.enabled) return; if (light.type != LightType.Point && light.type != LightType.Spot) return; if (_lights.ContainsKey(light)) return; var lightInfo = new LightInfo { Position = light.transform.position, }; _lights[light] = lightInfo; } public void RemoveLight(Light light) { if (object.ReferenceEquals(light, null)) return; RemoveLightData(light); } private void RemoveLightData(Light light) { if (_lights.TryGetValue(light, out var info)) { _lights.Remove(light); } } public void LateUpdate() { _lightsToRemove.Clear(); foreach (var kvp in _lights) { var key = kvp.Key; if (!key || !key.enabled || (key.type != LightType.Point && key.type != LightType.Spot)) { _lightsToRemove.Add(key); } } for (int i = 0; i < _lightsToRemove.Count; i++) { RemoveLightData(_lightsToRemove[i]); } _lightsToUpdate.Clear(); foreach (var kvp in _lights) { _lightsToUpdate.Add(kvp.Key); } for (int i = 0; i < _lightsToUpdate.Count; i++) { var key = _lightsToUpdate[i]; var lightInfo = _lights[key]; lightInfo.Position = key.transform.position; _lights[key] = lightInfo; } //CleanupUnusedCookies(); } public IEnumerable GetLights(Camera camera) { if (camera == null) yield break; var cameraPosition = camera.transform.position; foreach (var kvp in _lights) { var light = kvp.Key; var lightInfo = kvp.Value; if (!light || !light.enabled) continue; { yield return lightInfo; } } } #if NONE public IEnumerable GetLights(Camera camera) { foreach (var kvp in _lights) { var light = kvp.Key; var lightInfo = kvp.Value; if (!light || !light.enabled) continue; yield return lightInfo; } } #endif public void Cleanup() { _lights.Clear(); } } }