public static void InitializeColorGrading(ColorGradingSetting settings, ref ColorGradingData data, ComputeShader lut3dShader)
 {
     data.settings         = settings;
     data.enabledInUber    = false;
     data.m_Pixels         = new Color[k_Precision * 2];
     data.m_InternalLogLut = null;
     data.m_GradingCurves  = null;
     data.settings.hueVsHueCurve.value.Cache(Time.renderedFrameCount);
     data.settings.hueVsSatCurve.value.Cache(Time.renderedFrameCount);
     data.settings.satVsSatCurve.value.Cache(Time.renderedFrameCount);
     data.settings.lumVsSatCurve.value.Cache(Time.renderedFrameCount);
     data.kernel = lut3dShader.FindKernel("KGenLut3D_AcesTonemap");
 }
 public void Load(UnityEngine.Rendering.PostProcessing.ColorGrading layer)
 {
     if (layer != null)
     {
         enabled.Fill(layer.enabled);
         layer.active = layer.enabled.value;
         gradingMode.Fill(layer.gradingMode);
         mixerGreenOutGreenIn.Fill(layer.mixerGreenOutGreenIn);
         mixerGreenOutBlueIn.Fill(layer.mixerGreenOutBlueIn);
         mixerBlueOutRedIn.Fill(layer.mixerBlueOutRedIn);
         mixerBlueOutGreenIn.Fill(layer.mixerBlueOutGreenIn);
         mixerBlueOutBlueIn.Fill(layer.mixerBlueOutBlueIn);
         lift.Fill(layer.lift);
         gamma.Fill(layer.gamma);
         mixerGreenOutRedIn.Fill(layer.mixerGreenOutRedIn);
         gain.Fill(layer.gain);
         mixerRedOutBlueIn.Fill(layer.mixerRedOutBlueIn);
         mixerRedOutGreenIn.Fill(layer.mixerRedOutGreenIn);
         toneCurveToeStrength.Fill(layer.toneCurveToeStrength);
         toneCurveToeLength.Fill(layer.toneCurveToeLength);
         toneCurveShoulderStrength.Fill(layer.toneCurveShoulderStrength);
         toneCurveShoulderLength.Fill(layer.toneCurveShoulderLength);
         toneCurveShoulderAngle.Fill(layer.toneCurveShoulderAngle);
         toneCurveGamma.Fill(layer.toneCurveGamma);
         mixerRedOutRedIn.Fill(layer.mixerRedOutRedIn);
         tonemapper.Fill(layer.tonemapper);
         ldrLutContribution.Fill(layer.ldrLutContribution);
         tint.Fill(layer.tint);
         colorFilter.Fill(layer.colorFilter);
         hueShift.Fill(layer.hueShift);
         saturation.Fill(layer.saturation);
         brightness.Fill(layer.brightness);
         postExposure.Fill(layer.postExposure);
         contrast.Fill(layer.contrast);
         temperature.Fill(layer.temperature);
         layer.ldrLut.value         = AIGraphics.Instance.PostProcessingManager.LoadLUT(ldrLutIndex.value);
         layer.ldrLut.overrideState = ldrLutIndex.overrideState;
     }
 }
        public string           externalLutPath; // Formerly Texture.

        public void Save(UnityEngine.Rendering.PostProcessing.ColorGrading layer)
        {
            if (layer != null)
            {
                enabled              = new BoolValue(layer.enabled);
                gradingMode          = new GradingModeValue(layer.gradingMode);
                mixerGreenOutGreenIn = new FloatValue(layer.mixerGreenOutGreenIn);
                mixerGreenOutBlueIn  = new FloatValue(layer.mixerGreenOutBlueIn);
                mixerBlueOutRedIn    = new FloatValue(layer.mixerBlueOutRedIn);
                mixerBlueOutGreenIn  = new FloatValue(layer.mixerBlueOutGreenIn);
                mixerBlueOutBlueIn   = new FloatValue(layer.mixerBlueOutBlueIn);
                lift  = new Vector4Value(layer.lift);
                gamma = new Vector4Value(layer.gamma);
                mixerGreenOutRedIn = new FloatValue(layer.mixerGreenOutRedIn);
                gain = new Vector4Value(layer.gain);
                mixerRedOutBlueIn         = new FloatValue(layer.mixerRedOutBlueIn);
                mixerRedOutGreenIn        = new FloatValue(layer.mixerRedOutGreenIn);
                toneCurveToeStrength      = new FloatValue(layer.toneCurveToeStrength);
                toneCurveToeLength        = new FloatValue(layer.toneCurveToeLength);
                toneCurveShoulderStrength = new FloatValue(layer.toneCurveShoulderStrength);
                toneCurveShoulderLength   = new FloatValue(layer.toneCurveShoulderLength);
                toneCurveShoulderAngle    = new FloatValue(layer.toneCurveShoulderAngle);
                toneCurveGamma            = new FloatValue(layer.toneCurveGamma);
                mixerRedOutRedIn          = new FloatValue(layer.mixerRedOutRedIn);
                tonemapper         = new TonemapperValue(layer.tonemapper);
                ldrLutContribution = new FloatValue(layer.ldrLutContribution);
                tint         = new FloatValue(layer.tint);
                colorFilter  = new ColorValue(layer.colorFilter);
                hueShift     = new FloatValue(layer.hueShift);
                saturation   = new FloatValue(layer.saturation);
                brightness   = new FloatValue(layer.brightness);
                postExposure = new FloatValue(layer.postExposure);
                contrast     = new FloatValue(layer.contrast);
                temperature  = new FloatValue(layer.temperature);
                ldrLutIndex  = new IntValue(AIGraphics.Instance.PostProcessingManager.CurrentLUTIndex, layer.ldrLut.overrideState);
            }
        }
        internal static bool Prefix(ActiveEnvironment __instance, WeatherStateConfig wsA, WeatherStateConfig wsB, float weatherBlendFrac, TODBlendState todBlendState, float todBlendFrac, float todBlendBiased, bool isIndoors)
        {
            //   if ((Time.frameCount % 50) == 0)
            {
                ColorGradingSettings settings1A = null;
                ColorGradingSettings settings1B = null;
                ColorGradingSettings settings2A = null;
                ColorGradingSettings settings2B = null;

                Traverse       traverseA = Traverse.Create(__instance).Field("m_WorkA");
                TODStateConfig m_WorkA   = traverseA.GetValue <TODStateConfig>();
                Traverse       traverseB = Traverse.Create(__instance).Field("m_WorkB");
                TODStateConfig m_WorkB   = traverseB.GetValue <TODStateConfig>();

                TODStateConfig[] wsA_TodStates = { wsA.m_NightColors, wsA.m_DawnColors, wsA.m_MorningColors, wsA.m_MiddayColors, wsA.m_AfternoonColors, wsA.m_DuskColors, wsA.m_NightColors, wsA.m_NightColors };
                TODStateConfig[] wsB_TodStates = { wsB.m_NightColors, wsB.m_DawnColors, wsB.m_MorningColors, wsB.m_MiddayColors, wsB.m_AfternoonColors, wsB.m_DuskColors, wsB.m_NightColors, wsA.m_NightColors };

                bool flagtoAdd = false;

                int[] nightstates = { 1, 0, 0, 0, 0, 2, 3 };

                float[] keyangles = { Solstice_RV.dawndusk_angle, Solstice_RV.riseset_angle, Solstice_RV.mornaft_angle, Solstice_RV.getSunAngleAtUnitime(Mathf.Floor(Solstice_RV.unitime()) + 0.5f), Solstice_RV.mornaft_angle, Solstice_RV.riseset_angle, Solstice_RV.dawndusk_angle, Solstice_RV.getSunAngleAtUnitime(Mathf.Floor(Solstice_RV.unitime())) };

                if (GameManager.GetUniStorm().m_NormalizedTime > 1f)
                {
                    GameManager.GetUniStorm().SetNormalizedTime(GameManager.GetUniStorm().m_NormalizedTime - 1f);
                    flagtoAdd = true;
                }


                todBlendState = GameManager.GetUniStorm().GetTODBlendState();
                //   Debug.Log(todBlendState);


                int itod = (int)todBlendState;



                string debugtext;

                float zenith = Solstice_RV.getSunAngleAtUnitime(Mathf.Floor(Solstice_RV.unitime()) + 0.5f);
                float nadir  = Solstice_RV.getSunAngleAtUnitime(Mathf.Floor(Solstice_RV.unitime()) + 0.0f);

                float throughpcntzen;
                float throughpcntnad;

                TODStateConfig wsAStartblend;
                TODStateConfig wsAEndblend;
                TODStateConfig wsBStartblend;
                TODStateConfig wsBEndblend;

                TODStateConfig wsAZenblend;
                TODStateConfig wsANadblend;
                TODStateConfig wsBZenblend;
                TODStateConfig wsBNadblend;

                wsAStartblend = wsA_TodStates[itod];
                wsAEndblend   = wsA_TodStates[itod + 1];
                wsBStartblend = wsB_TodStates[itod];
                wsBEndblend   = wsB_TodStates[itod + 1];

                String namestartblend = Enum.GetNames(typeof(TODBlendState))[(int)todBlendState];
                String nameendblend   = Enum.GetNames(typeof(TODBlendState))[((int)todBlendState + 1) % 6];

                float st_ang = keyangles[itod];
                float en_ang = keyangles[itod + 1];

                throughpcntzen = (zenith - st_ang) / (en_ang - st_ang);

                debugtext = Solstice_RV.gggtime(Solstice_RV.unitime()) + " " + Enum.GetNames(typeof(TODBlendState))[(int)todBlendState];

                // do we need a new zen state
                if (throughpcntzen >= 0 && throughpcntzen <= 1)
                {
                    if (itod == (int)TODBlendState.MorningToMidday)// need to correct against game zenith of 45
                    {
                        throughpcntzen = Mathf.Clamp((zenith - st_ang) / (45f - st_ang), 0, 1);
                    }
                    if (itod == (int)TODBlendState.MiddayToAfternoon)// need to correct against game zenith of 45
                    {
                        throughpcntzen = Mathf.Clamp((zenith - 45f) / (en_ang - 45f), 0, 1);
                    }
                    //debugtext += " mc:" + throughpcntzen;
                    wsAZenblend = Solstice_RV.createNewMidPoint(wsA_TodStates[itod], wsA_TodStates[itod + 1], wsA_TodStates[6 - itod], wsA_TodStates[((5 - itod) % 8 + 8) % 8], throughpcntzen);
                    wsBZenblend = Solstice_RV.createNewMidPoint(wsB_TodStates[itod], wsB_TodStates[itod + 1], wsB_TodStates[6 - itod], wsB_TodStates[((5 - itod) % 8 + 8) % 8], throughpcntzen);
                    if (itod < 3)
                    {
                        en_ang       = zenith;
                        nameendblend = "Zen";
                        wsAEndblend  = wsAZenblend;
                        wsBEndblend  = wsBZenblend;
                    }
                    else
                    {
                        st_ang         = zenith;
                        namestartblend = "Zen";
                        wsAStartblend  = wsAZenblend;
                        wsBStartblend  = wsBZenblend;
                    }
                }

                throughpcntnad = (nadir - st_ang) / (en_ang - st_ang);

                if (throughpcntnad >= 0 && throughpcntnad <= 1)
                {
                    debugtext += " mc:" + throughpcntnad + "[" + itod + "][" + (itod + 1) + "][" + (6 - itod) + "][" + ((5 - itod) % 8 + 8) % 8 + "]";

                    wsANadblend = Solstice_RV.createNewMidPoint(wsA_TodStates[itod], wsA_TodStates[itod + 1], wsA_TodStates[6 - itod], wsA_TodStates[((5 - itod) % 8 + 8) % 8], throughpcntnad);
                    wsBNadblend = Solstice_RV.createNewMidPoint(wsB_TodStates[itod], wsB_TodStates[itod + 1], wsB_TodStates[6 - itod], wsB_TodStates[((5 - itod) % 8 + 8) % 8], throughpcntnad);

                    if (itod > 3)
                    {
                        en_ang       = nadir;
                        nameendblend = "Nad";
                        wsAEndblend  = wsANadblend;
                        wsBEndblend  = wsBNadblend;
                    }
                    else
                    {
                        st_ang         = nadir;
                        namestartblend = "Nad";
                        wsAStartblend  = wsANadblend;
                        wsBStartblend  = wsBNadblend;
                    }
                }



                float newtodBlendFrac = (Solstice_RV.getSunAngleAtUnitime(Solstice_RV.unitime()) - st_ang) / (en_ang - st_ang);
                debugtext += "(" + namestartblend + ":" + nameendblend + ")";
                debugtext += " s:" + st_ang + " e:" + en_ang + " c:" + string.Format("{0:0.00}", Solstice_RV.getSunAngleAtUnitime(Solstice_RV.unitime())) + " =:" + string.Format("{0:0.00}", newtodBlendFrac);

                m_WorkA.SetBlended(wsAStartblend, wsAEndblend, newtodBlendFrac, newtodBlendFrac, nightstates[itod]);
                m_WorkB.SetBlended(wsBStartblend, wsBEndblend, newtodBlendFrac, newtodBlendFrac, nightstates[itod]);

                settings1A = wsA_TodStates[(int)todBlendState].m_ColorGradingSettings;
                settings1B = wsA_TodStates[((int)todBlendState + 1) % 7].m_ColorGradingSettings;
                settings2A = wsB_TodStates[(int)todBlendState].m_ColorGradingSettings;
                settings2B = wsB_TodStates[((int)todBlendState + 1) % 7].m_ColorGradingSettings;

                __instance.m_TodState.SetBlended(m_WorkA, m_WorkB, weatherBlendFrac, weatherBlendFrac, 0);

                //if ((Time.frameCount % 1600) == 0) Debug.Log(debugtext);

                if (isIndoors)
                {
                    __instance.m_TodState.SetIndoors();
                }
                else
                {
                    UnityEngine.Rendering.PostProcessing.ColorGrading colorGrading = GameManager.GetCameraEffects().ColorGrading();
                    if (colorGrading != null)
                    {
                        //if ((Time.frameCount % 50) == 0) Debug.Log("[A"+ (int)todBlendState + "][A"+ ((int)todBlendState + 1) % 7 + "[B" + (int)todBlendState + "][B" + ((int)todBlendState + 1) % 7 + "],"+ newtodBlendFrac + ","+ weatherBlendFrac);
                        colorGrading.UpdateLutForTimeOfDay(settings1A, settings1B, settings2A, settings2B, newtodBlendFrac, newtodBlendFrac, weatherBlendFrac);
                        //colorGrading.UpdateLutForTimeOfDay(wsA.m_DawnColors.m_ColorGradingSettings, wsA.m_MorningColors.m_ColorGradingSettings, wsB.m_DawnColors.m_ColorGradingSettings, wsB.m_MorningColors.m_ColorGradingSettings, 0.5f,0.5f, 0.5f);
                    }
                }
                __instance.m_GrassTintScalar = Mathf.Lerp(wsA.m_GrassTintScalar, wsB.m_GrassTintScalar, weatherBlendFrac);

                if (flagtoAdd)
                {
                    GameManager.GetUniStorm().SetNormalizedTime(GameManager.GetUniStorm().m_NormalizedTime + 1f);
                }


                return(false);
            }
        }