1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
#include "main.h"
static int puissance2sup(int i)
{
double logbase2 = log(i) / log(2);
return round(pow(2.0, ceil(logbase2)));
}
bool Ctext::LoadFont(string police, int size, int R, int G, int B)
{
color.r=R;
color.g=G;
color.b=B;
font = TTF_OpenFont(police.c_str(), size);
if(font==NULL) {
return false;
}
rectsrc.x = 0;
rectsrc.y = 0;
rectsrc.w = 100;
rectsrc.h = 70;
return true;
}
bool Ctext::DrawText(string message)
{
if(message != this->message) {
if(this->message != "") {
glDeleteTextures(1,&surface);
}
this->message = message;
if(message != "") {
//Création de la texture du sprite
SDL_Surface *temp;
glGenTextures (1, & surface);
glBindTexture (GL_TEXTURE_2D, surface);
// Paramétrage de la texture.
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
temp = TTF_RenderText_Blended(font, message.c_str(), color);
if(temp != NULL) {
//Calcul de taille
int w = puissance2sup(temp->w);
int h = puissance2sup(temp->h);
SDL_Surface *temp2=SDL_CreateRGBSurface(
SDL_HWSURFACE,
w,
h,
32,
temp->format->Rmask,
temp->format->Gmask,
temp->format->Bmask,
temp->format->Amask);
if(temp2 == NULL) {
SDL_FreeSurface(temp);
return false;
}
maxx = temp->w;
maxx /= w;
maxy = temp->h;
maxy /= h;
SDL_BlitSurface(temp, NULL, temp2, &rectsrc);
// Jonction entre OpenGL et SDL.
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, temp2->w, temp2->h, 0,
GL_RGBA, GL_UNSIGNED_BYTE, temp2->pixels);
SDL_FreeSurface(temp);
SDL_FreeSurface(temp2);
}
else {
return false;
}
}
}
glEnable(GL_ALPHA_TEST);
glBlendFunc(GL_ONE,GL_ONE);
glEnable(GL_BLEND);
glAlphaFunc(GL_LESS,0.9);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2f (0, 0);
glVertex2f(rectdest.x, rectdest.y);
glTexCoord2f (0, maxy);
glVertex2f(rectdest.x, rectdest.y + rectsrc.h);
glTexCoord2f (maxx, maxy);
glVertex2f(rectdest.x + rectsrc.w, rectdest.y + rectsrc.h);
glTexCoord2f (maxx, 0);
glVertex2f(rectdest.x + rectsrc.w, rectdest.y);
glEnd();
}
void Ctext::SetPosition(int x, int y)
{
rectdest.x = x;
rectdest.y = y;
} |
Partager