﻿Shader "Mochie/Corruption" {
    Properties {
        [HDR]_Color("Color", Color) = (1,1,1,1)
        _StarBrightness("Brightness", Float) = 2
        _Rotation("Rotation", Range(0,360)) = 183
        _RotationSpeed("Rotation Speed", Float) = 1
        [NoScaleOffset]_StarTex("Star Tex", 2D) = "white" {}
        [NoScaleOffset]_CubemapTex("Cubemap Tex", CUBE) = "white" {}
        [Toggle(_CUBEMAP_ON)]_CubemapToggle("Cubemap Toggle", Int) = 0
        _CubemapRotation("Cubemap Rotation", Vector) = (0,0,0,0)
        _StarTexScale("Scale", Vector) = (4,4,0,0)
        [IntRange]_StarIterations("Star Iterations", Range(1,10)) = 4
        [Enum(Add,0, Multiplyx2,3, Overlay,4, Screen,5)]_TextureBlendMode("Texture Blend Mode", Int) = 0
        
        [HDR]_RimColor("Rim Color", Color) = (1,1,1,1)
        _RimBrightness("Brightness", Float) = 1
        _RimWidth("Rim Width", Float) = 2

        [Enum(tanoise,0, Simplex,1)]_NoiseMode("Noise Mode", Int) = 0
        _Radius("Radius", Float) = 25
        _SimplexScale("Noise Scale", Float) = 2.5
        [IntRange]_NoiseIterations("Noise Iterations", Range(1,6)) = 5
        _NoiseSpeed("Noise Speed", Float) = 1

        [HideInInspector]_NaNLmao("", Float) = 0.0
        [HideInInspector]_MainTex("", 2D) = "white" {}
        [HideInInspector]_Cutoff("", Range(0,1)) = 1
        [HideInInspector]_TANoiseTex ("TA Noise Tex", 2D) = "white" {}
    }
    SubShader {
        Tags {
            "RenderType"="Transparent" 
            "Queue"="Transparent"
            "VRCFallback"="Hidden"
            "DisableBatching"="True"
        }
        Cull Front
        ZWrite Off
        ZTest Always
        Blend SrcAlpha OneMinusSrcAlpha

        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma shader_feature_local _CUBEMAP_ON
            #pragma shader_feature_local _SIMPLEX_ON
            #pragma multi_compile_instancing
            #pragma target 5.0
            #include "UnityCG.cginc"
            #include "CorruptionDefines.cginc"

            v2f vert (appdata v){
                v2f o = (v2f)0;
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_TRANSFER_INSTANCE_ID(v, o);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
                o.objPos = mul(unity_ObjectToWorld, float4(0,0,0,1));
                o.worldPos = mul(unity_ObjectToWorld, v.vertex);
                o.pos = UnityObjectToClipPos(v.vertex);
                o.raycast = UnityObjectToViewPos(v.vertex).xyz * float3(-1,-1,1);
                o.uv = ComputeScreenPos(o.pos);
                return o;
            }

            float4 frag (v2f i) : SV_Target {
                
                UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);

                if (IsInMirror())
                    discard;

                GetDepth(i, wPos);
                float dist = distance(i.objPos, wPos);
                _Radius = max(0.002, _Radius*0.01);
                _RimWidth = clamp(_RimWidth*0.01, 0, _Radius-0.001);
                float noise = GetSimplex4DPool(wPos, _SimplexScale);
                float radius = smoothstep(_Radius+_RimWidth*0.5, _Radius-_RimWidth*0.5,  dist * noise);
                float4 col = 0;

                [branch]
                if (radius > 0){
                    #if defined(_CUBEMAP_ON)
                        float3 viewDir = -normalize(_WorldSpaceCameraPos.xyz - i.worldPos);
                        if (any(_CubemapRotation))
                            viewDir = Rotate3D(viewDir, _CubemapRotation * _Time.yyy);
                        col.rgb = texCUBE(_CubemapTex, viewDir);
                    #else
                        Ray cameraRay;
                        cameraRay.origin = _WorldSpaceCameraPos;
                        cameraRay.dir = normalize(wPos - _WorldSpaceCameraPos.xyz);
                        col.rgb = GetStars(i, cameraRay) * _StarBrightness;
                    #endif
                    col.a = radius;
                    col *= _Color;
                    float3 rim = (1-radius)*_RimBrightness*_RimColor.rgb*_RimColor.a*5;
                    col.rgb += rim;
                }
                else discard;

                return col;
            }
            ENDCG
        }
    }
    CustomEditor "Mochie.CorruptionEditor"
}