gKit2 light

- Main Page
- Related Pages
- Modules
- Classes
- Files

- File List
- File Members

text.cpp
1
2 #include <ctype.h>
3 #include <cstdio>
4 #include <cstdarg>
5
6 #include "program.h"
7 #include "uniforms.h"
8 #include "image.h"
9 #include "image_io.h"
10 #include "texture.h"
11 #include "text.h"
12
13
14 Text create_text( )
15 {
16 Text text;
17
18 // charge la fonte
19 Image font= read_image("data/font.png");
20
21 // modifie la transparence du caractere de fond
22 for(unsigned int y= 0; y < 16; y++)
23 for(unsigned int x= 0; x < 8; x++)
24 {
25 unsigned int starty= 16 *7;
26 unsigned int startx= 8 *2;
27 Color color= font(startx + x, starty + y);
28 color.a= 0.6f;
29 font(startx + x, starty + y)= color;
30 }
31
32 // cree le curseur
33 for(unsigned int y= 0; y < 16; y++)
34 for(unsigned int x= 0; x < 8; x++)
35 {
36 unsigned int starty= 16 *7;
37 unsigned int startx= 8 *1;
38 Color color= (x > 1) ? Color(1, 1, 1, 0.6f) : Color(1, 1, 1, 1);
39 font(startx + x, starty + y)= color;
40 }
41
42 text.font= make_texture(0, font);
43 //~ release_image(font);
44
45 text.color= White();
46
47 // shader
48 text.program= read_program("data/shaders/text.glsl");
49 program_print_errors(text.program);
50
51 // associe l'uniform buffer a l'entree 0 / binding 0
52 GLint index= glGetUniformBlockIndex(text.program, "textData");
53 glUniformBlockBinding(text.program, index, 0);
54
55 clear(text);
56 glGenVertexArrays(1, &text.vao);
57 glGenBuffers(1, &text.ubo);
58 glBindBuffer(GL_UNIFORM_BUFFER, text.ubo);
59 glBufferData(GL_UNIFORM_BUFFER, sizeof(text.buffer), text.buffer, GL_STATIC_DRAW);
60
61 return text;
62 }
63
64 void release_text( Text& text )
65 {
66 release_program(text.program);
67 glDeleteVertexArrays(1, &text.vao);
68 glDeleteBuffers(1, &text.ubo);
69 glDeleteTextures(1, &text.font);
70 }
71
72 void clear( Text& text )
73 {
74 for(int y= 0; y < 24; y++)
75 for(int x= 0; x < 128; x++)
76 text.buffer[y][x]= ' ';
77 }
78
79
80 static
81 void print( Text& text, const int px, const int py, const int background, const char *message )
82 {
83 int x= px;
84 int y= 23 - py; // premiere ligne en haut...
85
86 for(int i= 0; message[i] != 0; i++)
87 {
88 unsigned char c= message[i];
89 if(x >= 128 || c == '\n')
90 {
91 y--;
92 x= px;
93 }
94 if(c == '\n') continue; // ne pas afficher le \n
95
96 if(x < 0 || y < 0) break;
97 if(x >= 128 || y >= 24) break;
98
99 //~ if(!isprint(c)) c= ' ';
100 text.buffer[y][x]= (int) c | (background << 8);
101 x++;
102 }
103 }
104
105
106 void print_background( Text& text, const int px, const int py, const int background, const char c )
107 {
108 int x= px;
109 int y= 23 - py; // premiere ligne en haut...
110 if(x < 0 || y < 0) return;
111 if(x >= 128 || y >= 24) return;
112 //~ if(!isprint(c)) return;
113
114 text.buffer[y][x]= (int) c | (background << 8);
115 }
116
117 void print_background( Text& text, const int px, const int py, const char *message )
118 {
119 print(text, px, py, 2, message);
120 }
121
122 void print( Text& text, const int px, const int py, const char *message )
123 {
124 print(text, px, py, 0, message);
125 }
126
127 void printf_background( Text& text, const int px, const int py, const char *format, ... )
128 {
129 char tmp[24*128+1] = { 0 };
130
131 va_list args;
132 va_start(args, format);
133 vsnprintf(tmp, sizeof(tmp), format, args);
134 va_end(args);
135
136 tmp[24*128]= 0;
137 print(text, px, py, 2, tmp);
138 }
139
140 void printf( Text& text, const int px, const int py, const char *format, ... )
141 {
142 char tmp[24*128+1] = { 0 };
143
144 va_list args;
145 va_start(args, format);
146 vsnprintf(tmp, sizeof(tmp), format, args);
147 va_end(args);
148
149 tmp[24*128]= 0;
150 print(text, px, py, 0, tmp);
151 }
152
153 void default_color( Text& text, const Color& color )
154 {
155 text.color= color;
156 }
157
158 void draw( const Text& text, const int width, const int height )
159 {
160 glBindVertexArray(text.vao);
161 glUseProgram(text.program);
162 program_use_texture(text.program, "font", 0, text.font);
163
164 program_uniform(text.program, "offset", height - 24*16);
165 program_uniform(text.program, "default_color", text.color);
166
167 // transfere le texte dans l'uniform buffer associe au binding 0, cf create_text()
168 glBindBufferBase(GL_UNIFORM_BUFFER, 0, text.ubo);
169 glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(text.buffer), text.buffer);
170
171 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
172 glEnable(GL_BLEND);
173 glDisable(GL_DEPTH_TEST);
174
175 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
176
177 glDisable(GL_BLEND);
178 glEnable(GL_DEPTH_TEST);
179 }
180
create_text
Text create_text()
cree une console. a detruire avec release_text( ).
Definition: text.cpp:14
uniforms.h
release_text
void release_text(Text &text)
detruit une console.
Definition: text.cpp:64
text.h
Color
representation d'une couleur (rgba) transparente ou opaque.
Definition: color.h:13
texture.h
make_texture
GLuint make_texture(const int unit, const Image &im, const GLenum texel_type)
Definition: texture.cpp:25
program.h
program_uniform
void program_uniform(const GLuint program, const char *uniform, const unsigned int v)
affecte une valeur a un uniform du shader program. uint.
Definition: uniforms.cpp:68
program_use_texture
void program_use_texture(const GLuint program, const char *uniform, const int unit, const GLuint texture, const GLuint sampler)
configure le pipeline et le shader program pour utiliser une texture, et des parametres de filtrages...
Definition: uniforms.cpp:118
Text::program
GLuint program
shader pour afficher le texte.
Definition: text.h:68
image.h
default_color
void default_color(Text &text, const Color &color)
choisit une couleur par defaut pour le texte.
Definition: text.cpp:153
White
Color White()
utilitaire. renvoie une couleur blanche.
Definition: color.cpp:10
program_print_errors
int program_print_errors(const GLuint program)
affiche les erreurs de compilation.
Definition: program.cpp:330
Text::color
Color color
couleur du texte.
Definition: text.h:66
read_program
GLuint read_program(const char *filename, const char *definitions)
Definition: program.cpp:150
Text
Definition: text.h:61
Text::font
GLuint font
texture contenant les caracteres.
Definition: text.h:67
read_image
Image read_image(const char *filename)
Definition: image_io.cpp:16
printf
void printf(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y. meme utilisation que printf().
Definition: text.cpp:140
draw
void draw(const Text &text, const int width, const int height)
dessine la console.
Definition: text.cpp:158
release_program
int release_program(const GLuint program)
detruit les shaders et le program.
Definition: program.cpp:157
Image
representation d'une image.
Definition: image.h:18
image_io.h
clear
void clear(Text &text)
efface le contenu de la console.
Definition: text.cpp:72
printf_background
void printf_background(Text &text, const int px, const int py, const char *format,...)
affiche un texte a la position x, y sur un fond par defaut.
Definition: text.cpp:127
print_background
void print_background(Text &text, const int px, const int py, const int background, const char c)
affiche un caractere c sur un fond background.
Definition: text.cpp:106
Text::ubo
GLuint ubo
uniform buffer object, pour transferrer le texte a afficher
Definition: text.h:70
print
void print(Text &text, const int px, const int py, const char *message)
affiche un texte a la position x, y.
Definition: text.cpp:122
Text::vao
GLuint vao
vertex array object.
Definition: text.h:69