#include<hgl/shadergen/MaterialCreateInfo.h>

using namespace hgl;
using namespace hgl::graph;
using namespace hgl::shadergen;

bool PureColor2DMaterial()
{
    MaterialCreateInfo mc("PureColor2D",1,false);                            //一个新材质，1个RT输出，默认使用Vertex/Fragment shader

    //vertex部分
    {
        ShaderCreateInfoVertex *vsc=mc.GetVS();                //获取vertex shader creater

        //以下代码会被展开为
        /*
            layout(location=?) in vec3 Position;            //位置属性
        */
        vsc->AddInput("vec2","Position");                   //添加一个vec3类型的position属性输入

        vsc->SetShaderCodes(R"(
void main()
{
    gl_Position=vec4(Position,0,1);
})");
    }

    //添加一个名称为ColorMaterial的UBO定义,其内部有一个vec4 color的属性
    //该代码会被展开为
    /*
        struct ColorMaterial
        {
            vec4 color;
        };
     */
    mc.AddStruct("ColorMaterial","vec4 color;");

    //添加一个UBO，该代码会被展开为
    /*
        layout(set=?,binding=?) uniform ColorMaterial mtl;
    */
    mc.AddUBO(  VK_SHADER_STAGE_FRAGMENT_BIT,               //这个UBO出现在fragment shader
                DescriptorSetType::PerMaterial,             //它属于材质合集
                "ColorMaterial",                            //UBO名称为ColorMaterial
                "mtl");                                     //UBO变量名称为mtl

    //fragment部分
    {
        ShaderCreateInfoFragment *fsc=mc.GetFS();              //获取fragment shader creater

        //以下代码会被展开为
        /*
            layout(location=?) out vec4 Color;              //颜色输出
        */
        fsc->AddOutput("vec4","Color");                     //添加一个vec4类型的color属性输出

        fsc->SetShaderCodes(R"(
void main()
{
    Color=mtl.color;
})");
    }

    mc.CreateShader();

    return(true);
}

bool VertexColor2DMaterial()
{
    MaterialCreateInfo mc("VertexColor2D",1,false);

    //vertex部分
    {
        ShaderCreateInfoVertex *vsc=mc.GetVS();

        vsc->AddInput("vec2","Position");
        vsc->AddInput("vec4","Color");

        vsc->AddOutput("vec4","Color");

        vsc->SetShaderCodes(R"(
void main()
{
    Output.Color=Color;

    gl_Position=vec4(Position,0,1);
})");
    }

    //fragment部分
    {
        ShaderCreateInfoFragment *fsc=mc.GetFS();

        fsc->AddOutput("vec4","Color");

        fsc->SetShaderCodes(R"(
void main()
{
    Color=Input.Color;
})");
    }

    mc.CreateShader();

    return(true);
}

namespace glsl_compiler
{
    bool Init();
    void Close();
}//namespace glsl_compiler

int main()
{
    if(!glsl_compiler::Init())
        return -1;

    PureColor2DMaterial();
    VertexColor2DMaterial();

    glsl_compiler::Close();

    return 0;
}
