#ifndef _PC_STYLIZATION_VERTEX_SHADER_GRADIENT_H_
#define _PC_STYLIZATION_VERTEX_SHADER_GRADIENT_H_

#include "Gradient.h"
#include "VertexShader.h"


float4 ComputeGradientColor(float val, inout float discardFlag,float4 trueColor)
{
    float4 color = GetGradientColorLinear(val, trueColor);

    if (DiscardGradient(color.a))
        discardFlag = 2.0f;
	
    return color;
}

PixelInput PointCloudHeightRamp_VS(VertexInput In)
{
    VertexOutput output;
    
     // get true color
    float4 trueColor = GetColor(In);
    
    // set point size
    SetPointSize(output.PSIZE_PROP);
    
    // set position and discard flag.
    float4 regionColor;
    
    //set position  
    SetAllPositions(In, output.HPos, output.WPos);     

#if (LIMITBOX_ENABLE || LIGHTING_ENABLE)
     // set discard flag
    SetDiscardFlag(In, output.WPos, output.DISCARD_PROP, regionColor);
#else
    // set discard flag
    SetDiscardFlag(In, output.DISCARD_PROP, regionColor);
#endif

    // get normal color    
    float4 color = ComputeGradientColor(output.WPos.z + gLocale.z, output.DISCARD_PROP, trueColor);  

    // set color
#if (LIMITBOX_ENABLE || LIGHTING_ENABLE)
    color = GetVertexColor(In, output.WPos, output.DISCARD_PROP, color, regionColor);
#else
    color = GetVertexColor(color, regionColor);
#endif

    // fill output structure.
    PixelInput ps_output;
    
    ps_output.HPos = output.HPos;
    ps_output.Color = float4(color.xyz, 1.0);
    ps_output.Discard = output.DISCARD_PROP;
    ps_output.PointSize = output.PSIZE_PROP;

    return ps_output;
}

PixelInput PointCloudIntensityRamp_VS(VertexInput In)
{
    VertexOutput output;
    
    // get true color
    float4 trueColor = GetColor(In);
    
    // set point size
    SetPointSize(output.PSIZE_PROP);
    
    // set position and discard flag.
    float4 regionColor;
#if (LIMITBOX_ENABLE || LIGHTING_ENABLE)
    SetVertexProperties(In, output.HPos, output.WPos, output.DISCARD_PROP, regionColor);
#else
    SetVertexProperties(In, output.HPos, output.DISCARD_PROP, regionColor);
#endif

    // get gradient color
    float4 color = ComputeGradientColor(trueColor.a, output.DISCARD_PROP, trueColor);  

    // set color
#if (LIMITBOX_ENABLE || LIGHTING_ENABLE)
    color = GetVertexColor(In, output.WPos, output.DISCARD_PROP, color, regionColor);
#else
    color = GetVertexColor(color, regionColor);
#endif

    // fill output structure.
    PixelInput ps_output;
    
    ps_output.HPos = output.HPos;
    ps_output.Color = float4(color.xyz, 1.0);
    ps_output.Discard = output.DISCARD_PROP;
    ps_output.PointSize = output.PSIZE_PROP;

    return ps_output;
}

PixelInput PointCloudClassificationRamp_VS(VertexInput In)
{
    VertexOutput output;

    // get true color
    float4 trueColor = GetColor(In);
    
    // set point size
    SetPointSize(output.PSIZE_PROP);

    // set position and discard flag.
    float4 regionColor;
#if (LIMITBOX_ENABLE || LIGHTING_ENABLE)
    SetVertexProperties(In, output.HPos, output.WPos, output.DISCARD_PROP, regionColor);
#else
    SetVertexProperties(In, output.HPos, output.DISCARD_PROP, regionColor);
#endif

    // get gradient color
    int    IN_CLASSID = 0;

#if LIDAR_FORMAT_ENABLE
    IN_CLASSID = GetClassID(In);
#endif

    float4 color = ComputeGradientColor((float)IN_CLASSID+0.5f, output.DISCARD_PROP, trueColor);  
    
    // set color
#if (LIMITBOX_ENABLE || LIGHTING_ENABLE)
    color = GetVertexColor(In, output.WPos, output.DISCARD_PROP, color, regionColor);
#else
    color = GetVertexColor(color, regionColor);
#endif

    // fill output structure.
    PixelInput ps_output;
   
    ps_output.HPos = output.HPos;
    ps_output.Color = float4(color.xyz, 1.0);
    ps_output.Discard = output.DISCARD_PROP;
    ps_output.PointSize = output.PSIZE_PROP;

    return ps_output;
}



#endif
