// Copyright (c) 2023 Dominic Masters
// 
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT

#include "FontShader.hpp"
#include "display/mesh/QuadMesh.hpp"

using namespace Dawn;

void FontShader::compile() {
  #if DAWN_OPENGL_GLSL
    this->compileShader(
      {
        { "aPos", 0 },
        { "aTexCoord", 1 }
      },
      // Vertex Shader
      "#version 330 core\n"
      "layout (location = 0) in vec3 aPos;\n"
      "layout (location = 1) in vec2 aTexCoord;\n"
      
      "layout (std140) uniform ub_UICanvas {\n"
        "mat4 u_View;\n"
        "mat4 u_Projection;\n"
      "};"

      "struct FontShaderPart {\n"
        "vec4 color;\n"
      "};\n"

      "layout (std140) uniform ub_Font {\n"
        "FontShaderPart u_FontParts[" MACRO_STRINGIFY(FONT_SHADER_PARTS_MAX) "];\n"
        "int u_FontQuadParts[" MACRO_STRINGIFY(FONT_SHADER_QUADS_MAX) "];\n"
      "};\n"

      "uniform mat4 u_Model;\n"
      "out vec2 o_TextCoord;\n"
      "out vec4 o_VertColor;\n"

      "void main() {\n"
        "gl_Position = u_Projection * u_View * u_Model * vec4(aPos.xy, 0, 1.0);\n"
        "o_TextCoord = vec2(aTexCoord.x, aTexCoord.y);\n"
        "int quadIndex = gl_VertexID / " MACRO_STRINGIFY(QUAD_VERTICE_COUNT) ";\n"
        "int partIndex = u_FontQuadParts[quadIndex];\n"
        "o_VertColor = u_FontParts[partIndex].color;\n"
      "}",

      // Fragment Shader
      "#version 330 core\n"
      "in vec2 o_TextCoord;\n"
      "in vec4 o_VertColor;\n"
      "out vec4 o_Color;\n"

      "void main() {\n"
        "o_Color = o_VertColor;\n"
      "}\n"
    );
  #else
    #error Shader Type unknown
  #endif

  this->paramModel = this->getParameterByName("u_Model");
  this->bufferUiCanvas = this->getBufferLocationByName("ub_UICanvas");
  this->bufferFont = this->getBufferLocationByName("ub_Font");
}