class SurfaceData_BasePBR
{   
    precise float3 position;    //!< Position in world-space
    float3 normal;              //!< Normal in world-space
    float3 vertexNormal;        //!< Vertex normal in world-space
    float3 baseColor;           //!< Surface base color
    float metallic;             //!< Surface metallic property
    //! Sets albedo, base color, specularF0, and metallic properties using metallic workflow
    void SetAlbedoAndSpecularF0(float3 baseColor, float specularF0Factor, float metallic);
    
    float roughnessLinear;      //!< Perceptually linear roughness value authored by artists. Must be remapped to roughnessA before use
    float roughnessA;           //!< Actual roughness value ( a.k.a. "alpha roughness") to be used in microfacet calculations
    float roughnessA2;          //!< Alpha roughness ^ 2 (i.e. roughnessA * roughnessA), used in GGX, cached here for performance

    //! Surface lighting data
    float3 albedo;              //!< Albedo color of the non-metallic material, will be multiplied against the diffuse lighting value
    float3 specularF0;          //!< Fresnel f0 spectral value of the surface
};

interface ISpecRough
{
    //! Applies specular anti-aliasing to roughnessA2
    void ApplySpecularAA();

    //! Calculates roughnessA and roughnessA2 after roughness has been set
    void CalculateRoughnessA();
};

class SurfaceData_NewPBR : SurfaceData_BasePBR, ISpecRough
{
    float3 emissiveLighting;        //!< Emissive lighting
    float diffuseAmbientOcclusion;  //!< Diffuse ambient occlusion factor - [0, 1] :: [Dark, Bright]
    float specularOcclusion;        //!< Specular occlusion factor - [0, 1] :: [Dark, Bright]
    
    void ApplySpecularAA() {}
    void CalculateRoughnessA() {}
};


float4 PSMain(PSInput input) : SV_TARGET
{
    SurfaceData_NewPBR obj;
    obj.albedo.x = 1;
	return float4(obj.albedo, 1);
}