Shader "Unlit/Volume"
{
    Properties
    {
        _Position("Position", Vector) = (0, 0, 0)
        _Scale("Scale", Vector) = (0, 0, 0)
    }

    SubShader
    {
        Tags{"RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline"}

        HLSLINCLUDE
        #include "Packages\com.unity.render-pipelines.universal\ShaderLibrary\Core.hlsl"

        #define SAMPLES 100
        #define MAX_DIST 100
        #define SURF_DIST 0.001

        CBUFFER_START(UnityPerMaterial)
        float3 _Position;
        float3 _Scale;
        CBUFFER_END

        struct VertexInput
        {
            float4 pos : POSITION;
            float2 uv : TEXCOORD0;
        };

        struct VertexOutput
        {
            float4 pos : SV_POSITION;
            float3 ro : TEXCOORD1;
            float hitPos : TEXCOORD2;
            float2 uv : TEXCOORD0;
        };
        ENDHLSL

        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            VertexOutput vert(VertexInput i)
            {
                VertexOutput o;

                o.pos = TransformObjectToHClip(i.pos.xyz);
                o.ro = _WorldSpaceCameraPos;
                o.hitPos = i.pos.xyz;
                o.uv = i.uv;

                return o;
            }

            float getDist(float3 p)
            {
                float d = length(p) - 0.5f;
                return d;
            }

            float raymarch(float3 ro, float3 rd)
            {
                float dO = 0;
                float dS;

                for(int i = 0; i < SAMPLES; i++)
                {
                    float3 p = ro + dO * rd;

                    dS = getDist(p);
                    dO += dS;

                    if(dS < SURF_DIST || dO > MAX_DIST)
                        break;
                }

                return dO;
            }

            float4 frag(VertexOutput i) : SV_Target
            {
                float2 uv = i.uv - 0.5f;
                float3 rayOrigin = i.ro;
                float3 rayDir = normalize(i.hitPos - rayOrigin);

                float d = raymarch(rayOrigin, rayDir);
                float4 col = 0;

                if(d < MAX_DIST)
                    col.r = 1;
                
                return col;
            }
            ENDHLSL
        }
    }
}