using System;
using UnityEngine.Assertions;

namespace UnityEngine.Rendering.PostProcessing
{
    [UnityEngine.Scripting.Preserve]
    [Serializable]
    internal sealed class Dithering
    {
        int m_NoiseTextureIndex = 0;
        System.Random m_Random = new System.Random(1234);

        internal void Render(PostProcessRenderContext context)
        {
            var blueNoise = context.resources.blueNoise64;
            Assert.IsTrue(blueNoise != null && blueNoise.Length > 0);

#if POSTFX_DEBUG_STATIC_DITHERING // Used by QA for automated testing
            m_NoiseTextureIndex = 0;
            float rndOffsetX = 0f;
            float rndOffsetY = 0f;
#else
            if (++m_NoiseTextureIndex >= blueNoise.Length)
                m_NoiseTextureIndex = 0;

            float rndOffsetX = (float)m_Random.NextDouble();
            float rndOffsetY = (float)m_Random.NextDouble();
#endif

            var noiseTex = blueNoise[m_NoiseTextureIndex];
            var uberSheet = context.uberSheet;

            uberSheet.properties.SetTexture(ShaderIDs.DitheringTex, noiseTex);
            uberSheet.properties.SetVector(ShaderIDs.Dithering_Coords, new Vector4(
                (float)context.screenWidth / (float)noiseTex.width,
                (float)context.screenHeight / (float)noiseTex.height,
                rndOffsetX,
                rndOffsetY
            ));
        }
    }
}
