Du texte sous OpenGL
Il s'agit ici d'expliquer rapidement les méthodes présentes dans la classe glTextOut:
Plus d'explications détaillées sur ce qu'il faut faire pour développer un code permettant d'afficher du texte seront données ici.
Charger une fonte
Nous allons donc commencer par la méthode de chargement d'une fonte nommée GLLoadFont
Elle attend différents paramètres qui sont:
GLLoadFont(HDC hDC, char *cFontName, int iWidth, int iHeight, int iEpaisseur, int iItalic)
Cette fonction est disponible pour GLUT, mais ne fait rien...
avec hDC qui est le contexte graphique pour windows. Inutilisé sous X Window
cFontName qui est le nom de la fonte à charger (courier, ...)
iWidth et iHeight pour la largeur et la hauteur
iEpaisseur, épaisseur de la police
iItalic à false ou true
Quelque soit le système, nous allons donc charger une fonte en mémoire.
Dans le cas de X Window, il y aura une première phase de recherche des fontes disponibles avec comme nom, un nom identique à celui passé en entrée. Lorsque cette liste est obtenue, nous allons rechercher la fonte se rapprochant le plus de la hauteur demandée en entrée.
Cette fonte chargée, nous allons utiliser les Display list ou listes d'affichage (pour MS Windows, ou X Window). Nous en créons 256 pour les 256 caractères. Puis nous déclenchons une fonction particulière qui va charger chaque caractère dans nos Display list:
- Sous Windows, elle se nomme wglUseFontBitmaps
- Sous XWindow, elle se nomme glXUseXFont
Positionner notre texte
Avant d'afficher un texte, nous allons nous positionner dans notre monde en 3D ! Mais comme il s'agit ici d'un texte d'information, nous nous limiterons à un positionnement 2D soit en X et Y de notre écran.
La fonction glRasterPos permet de positionner le système dans la fenêtre. Les opérations graphiques de type bitmap qui suivront se feront donc par rapport à cette position (voir glBitmap, glDrawPixels, and glCopyPixels). Or nous avons créé précédemment des bitmaps pour tous les caractères de notre fonte...
La méthode utilisant glRasterPos se nommera GLPosText(GLfloat x, GLfloat y).
Afficher notre texte
Nous utiliserons la méthode GLTextPrint (const char *fmt,...) pour afficher du texte.
Pour afficher du texte, je fais vieux jeu en créant cette fonction avec un nombre de paramètres variables (comme la fonction printf de C). Evidemment, ce n'est pas vraiment la solution que l'on employerait en C++...
Pour un peu plus d'explication sur la méthode utilisée pour définir cette fonction à paramètres variables, voyez les va_xxx utilisées.
Quant-à l'affichage, hors GLUT, il s'agit simplement de réutiliser nos display-list précédemment créées pour afficher les caractères correspondant aux paramètres passés.
Avec GLUT, on utilisera directement la fonction d'affichage de texte.
Il n'y a pas
de gestion de correspondance de taille entre les fontes X Window et MS Windows.
Le seul truc que j'ai fait, c'est de multiplier par 2 la hauteur de la police
Windows car les caractères d'une fonte "courier" affichés
à l'écran ont une taille (avant multiplication) entre 9 et 13
qui est proche entre les différents systèmes.
Autres méthodes
D'autres methodes peuvent être ajoutées, comme la récupération d'information sur la fonte, ...
Dans mon exemple, je retourne la hauteur de la fonte...