1 /**
2  * Copyright:       Copyright (C) 2018 Gabriel Gheorghe, All Rights Reserved
3  * Authors:         $(Gabriel Gheorghe)
4  * License:         $(LINK2 https://www.gnu.org/licenses/gpl-3.0.txt, GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007)
5  * Source:          $(LINK2 https://github.com/GabyForceQ/LibertyEngine/blob/master/source/liberty/text/shader.d)
6  * Documentation:
7  * Coverage:
8 **/
9 module liberty.text.shader;
10 
11 version (none) :
12 
13 import liberty.math.vector;
14 import liberty.graphics.shader;
15 
16 /**
17  *
18 **/
19 final class TextShader : ShaderProgram {
20   private {
21     static immutable FONT_VERTEX = GFX_SHADER_CORE_VERSION ~ q{
22       layout (location = 0) in vec3 lPosition;
23       layout (location = 1) in vec2 lTexCoord;
24 
25       out vec2 tTexCoord;
26 
27       uniform vec2 uTranslation;
28 
29       void main() {
30         tTexCoord = lTexCoord;
31 
32         gl_Position = vec4(lPosition + vec3(uTranslation.x, uTranslation.y, 1.0)
33           * vec3(2.0, -2.0, 1.0), 1.0);
34       }
35     };
36 
37     static immutable FONT_FRAGMENT = GFX_SHADER_CORE_VERSION ~ q{
38       in vec2 tTexCoord;
39 
40       uniform vec3 uColor;
41       uniform sampler2D uFontAtlas;
42 
43       void main() {
44         gl_FragColor = vec4(uColor, texture(uFontAtlas, tTexCoord).a);
45       }
46     };
47   }
48 
49   /**
50    *
51   **/
52   this() {
53     this
54       .compileShaders(FONT_VERTEX, FONT_FRAGMENT)
55       .linkShaders()
56       .bindAttribute("lPosition")
57       .bindAttribute("lTexCoord")
58       .bind()
59       .addUniform("uTranslation")
60       .addUniform("uColor")
61       .addUniform("uFontAtlas")
62       .loadFontAtlas(0)
63       .unbind();
64   }
65 
66   /**
67    *
68    * Returns reference to this so it can be used in a stream.
69   **/
70   typeof(this) loadTranslation(Vector2F matrix) {
71     super.loadUniform("uTranslation", matrix);
72     return this;
73   }
74 
75   /**
76    *
77    * Returns reference to this so it can be used in a stream.
78   **/
79   typeof(this) loadColor(Vector3F matrix) {
80     super.loadUniform("uColor", matrix);
81     return this;
82   }
83 
84   /**
85    *
86    * Returns reference to this so it can be used in a stream.
87   **/
88   typeof(this) loadFontAtlas(int id) {
89     super.loadUniform("uFontAtlas", id);
90     return this;
91   }
92 }