Après de longues investigations le mois dernier, j’ai enfin porté mon choix sur une API de GUI simple et efficace : ImGUI.
Ce qui a guidé mon choix
J’ai décidé de conserver Cocoa pour l'éditeur, car il est déjà développé et requiert peu d’entretien (sauf quand Apple casse la compatibilité, mais c’est marginal). Pas de raison particulière de recoder l'éditeur, il fonctionne très bien comme ça.
Mais comme mon éditeur n’est accessible que sur OSX (pas sur iOS), il me fallait une solution de debug efficace sur les devices mobiles.
Première option : LibNUI
J’ai d’abord pensé à utiliser LibNUI, une belle librairie graphique créée par mon pote Sébastien Métrot.


Sa librairie est complête et embarque plein de tools intéressants. Elle permet de réaliser n’importe quelle application 2D, aussi complexe soit elle. L’intégralité du rendu est effectué en 3D. Elle est totalement cross-platform.
Mais elle est plutôt adaptée à des applications complexes et puissantes. Dans mon cas, je veux juste pouvoir debugger efficacement sur iOS, pas besoin de fioriture.
Seconde option : NanoGUI
Puis, j’ai testé NanoGUI basé sur NanoVG.
Un rendu vraiment très sexy !

Cette librairie est compacte (peu de fichiers à embarquer) et moins complexe à intégrer dans un moteur existant que LibNUI. Ça se rapprochait déjà plus de ce que je recherche.
J’ai commencé l’intégration de NanoGUI dans mon moteur, et j’ai déprimé sur le couplage avec OpenGL… Le coût de portage de librairie sur METAL n’est pas négligeable si on veut faire ça bien. Et je n’ai malheureusement pas de temps à consacrer à ça pour le moment.
Autre point négatif, c’est son emprunte CPU et GPU. Pour une librairie que j’utiliserai en debug, c’est cher payé.
Donc je la garde dans un coin de ma tête, pour plus tard.
Troisième option : ImGUI
Finalement, j’ai découvert ImGUI.
Je vais être très franc et peser mes mots :
- le rendu est vraiment spartiate (certains diront moche),
Mais cette lib est :
- tellement simple à utiliser,
- tellement facile à intégrer dans un moteur existant,
- tellement compacte dans son design et dans son implémentation,
- tellement légère en CPU et GPU,
- tellement lisible et modifiable
Qu’il est impossible d’y rester insensible !
Ça m’a pris une heure de l’intégrer dans mon moteur en METAL :
- quelques buffers GPU à créer,
- une seule texture,
- un seul shader,
- et une redirection d’input iOS/OSX.
Hop le tour est joué.
Et le rendu est parfaitement identique sur OSX et iOS.
Jouissif.
Voici quelques captures d'écran sur OSX avec un layout 3D d’iPhone 5. On y voit mes scènes de benchmark, la fenêtre de démo d’ImGUI, et une petite fenêtre de profiling créée en quelques minutes.


Et voici le shader ImGUI, vraiment gratos.
À gauche la version classique, et à droite la version préprocessée.

Enfantin.
Comme je le disais, certain peuvent rester bloquer sur l’aspect spartiate de la GUI. Mais n’oublions pas les objectifs initiaux : le debug et la perf.
Et qu’on se rassure, une nouvelle version poindra probablement bientôt le bout de son nez avec un design plus moderne. Espérons qu’elle conservera sa faible emprunte et restera aussi simple à utiliser.