using System; using System.IO; using System.Collections.Generic; using UnityEditor.Rendering.Universal.Converters; using UnityEngine; using UnityEngine.Rendering.Universal; using UnityEditor.SceneManagement; namespace UnityEditor.Rendering.Universal { internal sealed class ParametricToFreeformLightUpgrader : RenderPipelineConverter { const float k_EnscribedSquareDiagonalLength = 0.70710678118654752440084436210485f; public override string name => "Parametric to Freeform Light Upgrade"; public override string info => "This will upgrade all parametric lights to freeform lights."; public override int priority => -1000; public override Type container => typeof(UpgradeURP2DAssetsContainer); List m_AssetsToConvert = new List(); string m_Light2DId; public static void UpgradeParametricLight(Light2D light) { if (light.lightType == (Light2D.LightType)Light2D.DeprecatedLightType.Parametric) { light.lightType = Light2D.LightType.Freeform; // Parametric radius has to be > 0 in order mesh tessellation to be valid if (light.shapeLightParametricRadius == 0) light.shapeLightParametricRadius = 0.01f; float radius = light.shapeLightParametricRadius; float angle = light.shapeLightParametricAngleOffset; int sides = light.shapeLightParametricSides; var angleOffset = Mathf.PI / 2.0f + Mathf.Deg2Rad * angle; if (sides < 3) { radius = k_EnscribedSquareDiagonalLength * radius; sides = 4; } if (sides == 4) { angleOffset = Mathf.PI / 4.0f + Mathf.Deg2Rad * angle; } var radiansPerSide = 2 * Mathf.PI / sides; var min = new Vector3(float.MaxValue, float.MaxValue, 0); var max = new Vector3(float.MinValue, float.MinValue, 0); Vector3[] shapePath = new Vector3[sides]; for (var i = 0; i < sides; i++) { var endAngle = (i + 1) * radiansPerSide; var extrudeDir = new Vector3(Mathf.Cos(endAngle + angleOffset), Mathf.Sin(endAngle + angleOffset), 0); var endPoint = radius * extrudeDir; shapePath[i] = endPoint; } light.shapePath = shapePath; light.UpdateMesh(); EditorSceneManager.MarkSceneDirty(light.gameObject.scene); } } void UpgradeGameObject(GameObject go) { Light2D[] lights = go.GetComponentsInChildren(); foreach (Light2D light in lights) { if (light.lightType == Light2D.LightType.Parametric && !PrefabUtility.IsPartOfPrefabInstance(light)) UpgradeParametricLight(light); } } public override void OnInitialize(InitializeConverterContext context, Action callback) { string[] allAssetPaths = AssetDatabase.GetAllAssetPaths(); foreach (string path in allAssetPaths) { if (URP2DConverterUtility.IsPrefabOrScenePath(path, "m_LightType: 0")) { ConverterItemDescriptor desc = new ConverterItemDescriptor() { name = Path.GetFileNameWithoutExtension(path), info = path, warningMessage = String.Empty, helpLink = String.Empty }; // Each converter needs to add this info using this API. m_AssetsToConvert.Add(path); context.AddAssetToConvert(desc); } } callback.Invoke(); } public override void OnRun(ref RunItemContext context) { string result = string.Empty; string ext = Path.GetExtension(context.item.descriptor.info); if (ext == ".prefab") result = URP2DConverterUtility.UpgradePrefab(context.item.descriptor.info, UpgradeGameObject); else if (ext == ".unity") URP2DConverterUtility.UpgradeScene(context.item.descriptor.info, UpgradeGameObject); if (result != string.Empty) { context.didFail = true; context.info = result; } else { context.hasConverted = true; } } public override void OnClicked(int index) { EditorGUIUtility.PingObject(AssetDatabase.LoadAssetAtPath(m_AssetsToConvert[index])); } public override void OnPostRun() { Resources.UnloadUnusedAssets(); } } }