{"TotalCount":4,"Files":[{"Ident":"fwotsoft.rotsoftlighting","Path":".obj/__compiler_extra.cs","FileName":"__compiler_extra.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":336536,"Code":"global using static Sandbox.Internal.GlobalGameNamespace;\r\nglobal using Microsoft.AspNetCore.Components;\r\nglobal using Microsoft.AspNetCore.Components.Rendering;\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022AddonTitle\u0022, \u0022Rotsoft Lighting\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022AddonIdent\u0022, \u0022rotsoftlighting\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022OrgIdent\u0022, \u0022fwotsoft\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022Ident\u0022, \u0022fwotsoft.rotsoftlighting\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022EngineVersion\u0022, \u002228\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022EngineMinorVersion\u0022, \u00221\u0022 )]\r\n\r\n[assembly: System.Runtime.Versioning.TargetFramework( \u0022.NETCoreApp,Version=v9.0\u0022, FrameworkDisplayName = \u0022.NET 9.0\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyMetadata( \u0022CompileTime\u0022, \u00222026-07-28T04:33:43.7494102Z\u0022 )]\r\n[assembly: global::System.Reflection.AssemblyVersion(\u00220.0.125.0\u0022)]\r\n[assembly: global::System.Reflection.AssemblyFileVersion(\u00220.0.125.0\u0022)]"},{"Ident":"fwotsoft.rotsoftlighting","Path":"Editor/KelvinSpotWidget.cs","FileName":"KelvinSpotWidget.cs","PackageType":"library","CodeKind":"Editor","AssetVersionId":336536,"Code":"using Editor;\r\nusing Sandbox;\r\nusing Sandbox.UI;\r\nusing System;\r\nnamespace RotSoft;\r\n\r\n[CustomEditor(typeof(float), WithAllAttributes = new[] { typeof(KelvinTemperatureAttribute) })]\r\npublic class KelvinTemperatureWidget : ControlWidget\r\n{\r\n    public override bool SupportsMultiEdit =\u003E false;\r\n    public override bool IncludeLabel =\u003E false;\r\n\r\n    public KelvinTemperatureWidget(SerializedProperty property) : base(property)\r\n    {\r\n        Layout = Layout.Column();\r\n        Layout.Spacing = 2;\r\n        Layout.Margin = new Margin(0, 0, 0, 20);\r\n\r\n        var bar = Layout.Add(new ClickableKelvinBar(this, property));\r\n        bar.FixedHeight = 44;\r\n    }\r\n\r\n    protected override void OnPaint() { }\r\n\r\n    internal class ClickableKelvinBar : Widget\r\n    {\r\n        SerializedProperty _prop;\r\n        bool _grabbed;\r\n\r\n        public ClickableKelvinBar(Widget parent, SerializedProperty prop) : base(parent)\r\n        {\r\n            _prop = prop;\r\n            Cursor = CursorShape.Finger;\r\n            HorizontalSizeMode = SizeMode.CanGrow;\r\n            FocusMode = FocusMode.Click;\r\n        }\r\n\r\n        protected override void OnPaint()\r\n        {\r\n            var rect = LocalRect.Shrink(0);\r\n            var gradientRect = new Rect(rect.Left, rect.Top, rect.Width, rect.Height - 16);\r\n            int steps = Math.Max((int)gradientRect.Width, 1);\r\n\r\n            Paint.ClearPen();\r\n\r\n            for (int i = 0; i \u003C steps; i\u002B\u002B)\r\n            {\r\n                float frac = (float)i / steps;\r\n                float kelvin = 1000f \u002B frac * 19000f;\r\n                Paint.SetBrush(KelvinSpot.KelvinToColor(kelvin));\r\n                Paint.DrawRect(new Rect(gradientRect.Left \u002B i, gradientRect.Top, 1f, gradientRect.Height));\r\n            }\r\n\r\n            if (_prop is null) return;\r\n\r\n            float t = _prop.GetValue\u003Cfloat\u003E();\r\n            float handleFrac = (t - 1000f) / 19000f;\r\n            float hx = gradientRect.Left \u002B handleFrac * gradientRect.Width;\r\n\r\n            Paint.ClearPen();\r\n            Paint.SetBrush(Color.Black.WithAlpha(0.35f));\r\n            Paint.DrawRect(new Rect(hx - 4, gradientRect.Top, 8, gradientRect.Height), 2f);\r\n            Paint.SetBrush(Color.White);\r\n            Paint.DrawRect(new Rect(hx - 3, gradientRect.Top \u002B 1, 6, gradientRect.Height - 2), 2f);\r\n\r\n            Paint.SetPen(Theme.Text);\r\n            Paint.SetDefaultFont();\r\n            Paint.DrawText(new Rect(rect.Left, gradientRect.Bottom, rect.Width, 16), $\u0022{t:0}K\u0022, TextFlag.Center | TextFlag.SingleLine);\r\n        }\r\n\r\n        protected override void OnMousePress(MouseEvent e)\r\n        {\r\n            base.OnMousePress(e);\r\n            _grabbed = true;\r\n            SetFromPosition(e.LocalPosition.x);\r\n            e.Accepted = true;\r\n        }\r\n\r\n        protected override void OnMouseReleased(MouseEvent e)\r\n        {\r\n            base.OnMouseReleased(e);\r\n            _grabbed = false;\r\n        }\r\n\r\n        protected override void OnMouseMove(MouseEvent e)\r\n        {\r\n            base.OnMouseMove(e);\r\n            if (!_grabbed) return;\r\n            SetFromPosition(e.LocalPosition.x);\r\n        }\r\n\r\n        void SetFromPosition(float localX)\r\n        {\r\n            if (_prop is null) return;\r\n            float frac = Math.Clamp(localX / Width, 0f, 1f);\r\n            _prop.SetValue(1000f \u002B frac * 19000f);\r\n        }\r\n    }\r\n}"},{"Ident":"fwotsoft.rotsoftlighting","Path":"KelvinSpot.cs","FileName":"KelvinSpot.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":336536,"Code":"using Sandbox;\r\nusing System;\r\n\r\nnamespace RotSoft;\r\n\r\n/// \u003Csummary\u003E\r\n/// A Spotlight with a kelvin temperature gradient bar.\r\n/// \u003C/summary\u003E\r\npublic class KelvinTemperatureAttribute : System.Attribute { }\r\n\r\npublic sealed class KelvinSpot : SpotLight\r\n{\r\n    public new Color LightColor\r\n    {\r\n        get =\u003E base.LightColor;\r\n        set =\u003E base.LightColor = value;\r\n    }\r\n\r\n    float _temperature = 5500f;\r\n\r\n    [Property, Range(1000f, 20000f), Step(10f), KelvinTemperature]\r\n    public float Temperature\r\n    {\r\n        get =\u003E _temperature;\r\n        set\r\n        {\r\n            if (_temperature == value) return;\r\n            _temperature = value;\r\n            ApplyColor();\r\n        }\r\n    }\r\n\r\n    float _brightness = 1f;\r\n\r\n    [Property, Range(0.1f, 100f), Step(0.1f), Title(\u0022Brightness\u0022)]\r\n    public float Range\r\n    {\r\n        get =\u003E _brightness;\r\n        set\r\n        {\r\n            if (_brightness == value) return;\r\n            _brightness = value;\r\n            ApplyColor();\r\n        }\r\n    }\r\n\r\n    void ApplyColor()\r\n    {\r\n        LightColor = KelvinToColor(_temperature) * _brightness;\r\n    }\r\n\r\n    /// \u003Csummary\u003E\r\n    /// Approximate kelvin \u2192 sRGB. Based on Tanner Helland\u0027s algorithm.\r\n    /// \u003C/summary\u003E\r\n    public static Color KelvinToColor(float kelvin)\r\n    {\r\n        float temp = kelvin / 100f;\r\n        float r, g, b;\r\n\r\n        if (temp \u003C= 66f)\r\n            r = 1f;\r\n        else\r\n            r = Math.Clamp(1.29293618606f * MathF.Pow(temp - 60f, -0.1332047592f), 0f, 1f);\r\n\r\n        if (temp \u003C= 66f)\r\n            g = Math.Clamp(0.390081578769f * MathF.Log(temp) - 0.63184144378f, 0f, 1f);\r\n        else\r\n            g = Math.Clamp(1.12989086369f * MathF.Pow(temp - 60f, -0.0755148492f), 0f, 1f);\r\n\r\n        if (temp \u003E= 66f)\r\n            b = 1f;\r\n        else if (temp \u003C= 19f)\r\n            b = 0f;\r\n        else\r\n            b = Math.Clamp(0.54320678911f * MathF.Log(temp - 10f) - 1.19625408914f, 0f, 1f);\r\n\r\n        return new Color(r, g, b);\r\n    }\r\n}\r\n"},{"Ident":"fwotsoft.rotsoftlighting","Path":"Code/KelvinSpot.cs","FileName":"KelvinSpot.cs","PackageType":"library","CodeKind":"Game","AssetVersionId":336536,"Code":"using Sandbox;\r\nusing System;\r\n\r\nnamespace RotSoft;\r\n\r\n/// \u003Csummary\u003E\r\n/// A Spotlight with a kelvin temperature gradient bar.\r\n/// \u003C/summary\u003E\r\npublic class KelvinTemperatureAttribute : System.Attribute { }\r\n\r\npublic sealed class KelvinSpot : SpotLight\r\n{\r\n    public new Color LightColor\r\n    {\r\n        get =\u003E base.LightColor;\r\n        set =\u003E base.LightColor = value;\r\n    }\r\n\r\n    float _temperature = 5500f;\r\n\r\n    [Property, Range(1000f, 20000f), Step(10f), KelvinTemperature]\r\n    public float Temperature\r\n    {\r\n        get =\u003E _temperature;\r\n        set\r\n        {\r\n            if (_temperature == value) return;\r\n            _temperature = value;\r\n            ApplyColor();\r\n        }\r\n    }\r\n\r\n    float _brightness = 1f;\r\n\r\n    [Property, Range(0.1f, 100f), Step(0.1f), Title(\u0022Brightness\u0022)]\r\n    public float Range\r\n    {\r\n        get =\u003E _brightness;\r\n        set\r\n        {\r\n            if (_brightness == value) return;\r\n            _brightness = value;\r\n            ApplyColor();\r\n        }\r\n    }\r\n\r\n    void ApplyColor()\r\n    {\r\n        LightColor = KelvinToColor(_temperature) * _brightness;\r\n    }\r\n\r\n    /// \u003Csummary\u003E\r\n    /// Approximate kelvin \u2192 sRGB. Based on Tanner Helland\u0027s algorithm.\r\n    /// \u003C/summary\u003E\r\n    public static Color KelvinToColor(float kelvin)\r\n    {\r\n        float temp = kelvin / 100f;\r\n        float r, g, b;\r\n\r\n        if (temp \u003C= 66f)\r\n            r = 1f;\r\n        else\r\n            r = Math.Clamp(1.29293618606f * MathF.Pow(temp - 60f, -0.1332047592f), 0f, 1f);\r\n\r\n        if (temp \u003C= 66f)\r\n            g = Math.Clamp(0.390081578769f * MathF.Log(temp) - 0.63184144378f, 0f, 1f);\r\n        else\r\n            g = Math.Clamp(1.12989086369f * MathF.Pow(temp - 60f, -0.0755148492f), 0f, 1f);\r\n\r\n        if (temp \u003E= 66f)\r\n            b = 1f;\r\n        else if (temp \u003C= 19f)\r\n            b = 0f;\r\n        else\r\n            b = Math.Clamp(0.54320678911f * MathF.Log(temp - 10f) - 1.19625408914f, 0f, 1f);\r\n\r\n        return new Color(r, g, b);\r\n    }\r\n}\r\n"}]}