public static void DrawHandles(HDAdditionalLightData additionalData, Editor owner) { Light light = additionalData.legacyLight; Color wireframeColorAbove = (owner as HDLightEditor).legacyLightColor; Color handleColorAbove = CoreLightEditorUtilities.GetLightHandleColor(wireframeColorAbove); Color wireframeColorBehind = CoreLightEditorUtilities.GetLightBehindObjectWireframeColor(wireframeColorAbove); Color handleColorBehind = CoreLightEditorUtilities.GetLightHandleColor(wireframeColorBehind); switch (additionalData.lightTypeExtent) { case LightTypeExtent.Punctual: switch (light.type) { case LightType.Directional: case LightType.Point: //use legacy handles for those cases: //See HDLightEditor break; case LightType.Spot: switch (additionalData.spotLightShape) { case SpotLightShape.Cone: using (new Handles.DrawingScope(Matrix4x4.TRS(light.transform.position, light.transform.rotation, Vector3.one))) { Vector3 outterAngleInnerAngleRange = new Vector3(light.spotAngle, light.spotAngle * additionalData.GetInnerSpotPercent01(), light.range); Handles.zTest = UnityEngine.Rendering.CompareFunction.Greater; Handles.color = wireframeColorBehind; CoreLightEditorUtilities.DrawSpotlightWireframe(outterAngleInnerAngleRange, additionalData.shadowNearPlane); Handles.zTest = UnityEngine.Rendering.CompareFunction.LessEqual; Handles.color = wireframeColorAbove; CoreLightEditorUtilities.DrawSpotlightWireframe(outterAngleInnerAngleRange, additionalData.shadowNearPlane); EditorGUI.BeginChangeCheck(); Handles.zTest = UnityEngine.Rendering.CompareFunction.Greater; Handles.color = handleColorBehind; outterAngleInnerAngleRange = CoreLightEditorUtilities.DrawSpotlightHandle(outterAngleInnerAngleRange); Handles.zTest = UnityEngine.Rendering.CompareFunction.LessEqual; Handles.color = handleColorAbove; outterAngleInnerAngleRange = CoreLightEditorUtilities.DrawSpotlightHandle(outterAngleInnerAngleRange); if (EditorGUI.EndChangeCheck()) { Undo.RecordObjects(new UnityEngine.Object[] { light, additionalData }, "Adjust Cone Spot Light"); additionalData.m_InnerSpotPercent = 100f * outterAngleInnerAngleRange.y / Mathf.Max(0.1f, outterAngleInnerAngleRange.x); light.spotAngle = outterAngleInnerAngleRange.x; light.range = outterAngleInnerAngleRange.z; } // Handles.color reseted at end of scope } break; case SpotLightShape.Pyramid: using (new Handles.DrawingScope(Matrix4x4.TRS(light.transform.position, light.transform.rotation, Vector3.one))) { Vector4 aspectFovMaxRangeMinRange = new Vector4(additionalData.aspectRatio, light.spotAngle, light.range); Handles.zTest = UnityEngine.Rendering.CompareFunction.Greater; Handles.color = wireframeColorBehind; CoreLightEditorUtilities.DrawSpherePortionWireframe(aspectFovMaxRangeMinRange, additionalData.shadowNearPlane); Handles.zTest = UnityEngine.Rendering.CompareFunction.LessEqual; Handles.color = wireframeColorAbove; CoreLightEditorUtilities.DrawSpherePortionWireframe(aspectFovMaxRangeMinRange, additionalData.shadowNearPlane); EditorGUI.BeginChangeCheck(); Handles.zTest = UnityEngine.Rendering.CompareFunction.Greater; Handles.color = handleColorBehind; aspectFovMaxRangeMinRange = CoreLightEditorUtilities.DrawSpherePortionHandle(aspectFovMaxRangeMinRange, false); Handles.zTest = UnityEngine.Rendering.CompareFunction.LessEqual; Handles.color = handleColorAbove; aspectFovMaxRangeMinRange = CoreLightEditorUtilities.DrawSpherePortionHandle(aspectFovMaxRangeMinRange, false); if (EditorGUI.EndChangeCheck()) { Undo.RecordObjects(new UnityEngine.Object[] { light, additionalData }, "Adjust Pyramid Spot Light"); additionalData.aspectRatio = aspectFovMaxRangeMinRange.x; light.spotAngle = aspectFovMaxRangeMinRange.y; light.range = aspectFovMaxRangeMinRange.z; } // Handles.color reseted at end of scope } break; case SpotLightShape.Box: using (new Handles.DrawingScope(Matrix4x4.TRS(light.transform.position, light.transform.rotation, Vector3.one))) { Vector4 widthHeightMaxRangeMinRange = new Vector4(additionalData.shapeWidth, additionalData.shapeHeight, light.range); Handles.zTest = UnityEngine.Rendering.CompareFunction.Greater; Handles.color = wireframeColorBehind; CoreLightEditorUtilities.DrawOrthoFrustumWireframe(widthHeightMaxRangeMinRange, additionalData.shadowNearPlane); Handles.zTest = UnityEngine.Rendering.CompareFunction.LessEqual; Handles.color = wireframeColorAbove; CoreLightEditorUtilities.DrawOrthoFrustumWireframe(widthHeightMaxRangeMinRange, additionalData.shadowNearPlane); EditorGUI.BeginChangeCheck(); Handles.zTest = UnityEngine.Rendering.CompareFunction.Greater; Handles.color = handleColorBehind; widthHeightMaxRangeMinRange = CoreLightEditorUtilities.DrawOrthoFrustumHandle(widthHeightMaxRangeMinRange, false); Handles.zTest = UnityEngine.Rendering.CompareFunction.LessEqual; Handles.color = handleColorAbove; widthHeightMaxRangeMinRange = CoreLightEditorUtilities.DrawOrthoFrustumHandle(widthHeightMaxRangeMinRange, false); if (EditorGUI.EndChangeCheck()) { Undo.RecordObjects(new UnityEngine.Object[] { light, additionalData }, "Adjust Box Spot Light"); additionalData.shapeWidth = widthHeightMaxRangeMinRange.x; additionalData.shapeHeight = widthHeightMaxRangeMinRange.y; light.range = widthHeightMaxRangeMinRange.z; } // Handles.color reseted at end of scope } break; } break; } break; case LightTypeExtent.Rectangle: case LightTypeExtent.Tube: bool withYAxis = additionalData.lightTypeExtent == LightTypeExtent.Rectangle; using (new Handles.DrawingScope(Matrix4x4.TRS(light.transform.position, light.transform.rotation, Vector3.one))) { Vector2 widthHeight = new Vector4(additionalData.shapeWidth, withYAxis ? additionalData.shapeHeight : 0f); float range = light.range; EditorGUI.BeginChangeCheck(); Handles.zTest = UnityEngine.Rendering.CompareFunction.Greater; Handles.color = wireframeColorBehind; CoreLightEditorUtilities.DrawAreaLightWireframe(widthHeight); range = Handles.RadiusHandle(Quaternion.identity, Vector3.zero, range); //also draw handles Handles.zTest = UnityEngine.Rendering.CompareFunction.LessEqual; Handles.color = wireframeColorAbove; CoreLightEditorUtilities.DrawAreaLightWireframe(widthHeight); range = Handles.RadiusHandle(Quaternion.identity, Vector3.zero, range); //also draw handles Handles.zTest = UnityEngine.Rendering.CompareFunction.Greater; Handles.color = handleColorBehind; widthHeight = CoreLightEditorUtilities.DrawAreaLightHandle(widthHeight, withYAxis); Handles.zTest = UnityEngine.Rendering.CompareFunction.LessEqual; Handles.color = handleColorAbove; widthHeight = CoreLightEditorUtilities.DrawAreaLightHandle(widthHeight, withYAxis); widthHeight = Vector2.Max(Vector2.one * k_MinLightSize, widthHeight); if (EditorGUI.EndChangeCheck()) { Undo.RecordObjects(new UnityEngine.Object[] { light, additionalData }, withYAxis ? "Adjust Area Rectangle Light" : "Adjust Area Tube Light"); additionalData.shapeWidth = widthHeight.x; if (withYAxis) { additionalData.shapeHeight = widthHeight.y; } light.range = range; } // Handles.color reseted at end of scope } break; } }