Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: lxgui - "Lua and Xml Graphical User Interface"  (Lu 30130 fois)

0 Membres et 3 Invités sur ce sujet

Kalith

  • Jr. Member
  • **
  • Messages: 93
    • Voir le profil
Re : Re : lxgui - "Lua and Xml Graphical User Interface"
« Réponse #15 le: Mai 25, 2012, 03:41:48 pm »
Bref je ne veux pas t'embêter avec ça, c'était juste pour te dire de faire très attention avec les encodages, ça peut vite devenir l'enfer à gérer si tu n'es pas attentif. Souvent ça marche "out of the box" mais ce n'est qu'un coup de chance, et pas représentatif de ce qu'il faut faire pour rendre le code robuste.
C'est toujours gênant quand quelqu'un met le doigt sur une faille dans son code, c'est sûr, mais c'est pour la bonne cause. Ici, le tout est de savoir si je veux considérer ça comme un bug ou une fonctionnalité. Il faut que j'y réfléchisse. Merci en tout cas de me faire partager ton expérience sur le sujet ;)

Ah par contre pour le PNG, tu peux faire mieux à peu de frais : au lieu de libpng, tu peux utiliser ce que SFML utilise : stb_image. C'est totalement libre (domaine publique) et c'est un seul fichier intégrable directement dans ton code source ; donc pas une vraie dépendance. Et ça gère le png, tga, bmp, jpg, ...
Ça peut être intéressant... libpng fonctionne très bien, mais elle ajoute deux dépendances : libpng bien sûr, mais libz aussi. Après avoir regardé comment stb_image s'utilise dans ton code, je vois que le principe est relativement proche de libpng mais en plus simple.
Par contre c'est dommage d'avoir à faire une copie des pixels après avoir chargé l'image. Avec libpng, on peut les écrire directement dans le buffer final, en évitant la copie (~ on fournit à libpng le pointeur vers la zone mémoire pré-allouée où écrire les pixels, donc éventuellement dans un std::vector::data()). Si j'avais une critique à faire, c'était celle là. Sinon ça a l'air très bien !

Donc en gros, pour résumer, si SFML supporte l'alpha prémultiplié c'est tout bon pour toi ?
Ah, et j'avais oublié : il manquerait aussi la gestion non formatée de l'input pour le clavier.
« Modifié: Mai 25, 2012, 03:45:09 pm par Kalith »
Kal.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : lxgui - "Lua and Xml Graphical User Interface"
« Réponse #16 le: Mai 25, 2012, 05:27:56 pm »
Citer
Par contre c'est dommage d'avoir à faire une copie des pixels après avoir chargé l'image. Avec libpng, on peut les écrire directement dans le buffer final, en évitant la copie (~ on fournit à libpng le pointeur vers la zone mémoire pré-allouée où écrire les pixels, donc éventuellement dans un std::vector::data()). Si j'avais une critique à faire, c'était celle là.
En pratique c'est plus que négligeable, surtout dans ce contexte.

Citer
Ah, et j'avais oublié : il manquerait aussi la gestion non formatée de l'input pour le clavier.
Tu veux plutôt dire "corriger les bugs du système actuel" ? ;D
Laurent Gomila - SFML developer

Kalith

  • Jr. Member
  • **
  • Messages: 93
    • Voir le profil
Re : Re : lxgui - "Lua and Xml Graphical User Interface"
« Réponse #17 le: Mai 25, 2012, 08:29:21 pm »
En pratique c'est plus que négligeable, surtout dans ce contexte.
Moui, probablement. Ce sont principalement de petites images.

Tu veux plutôt dire "corriger les bugs du système actuel" ? ;D
C'est moins diplomatique ;)
Kal.

christophedlr

  • Full Member
  • ***
  • Messages: 153
    • Voir le profil
    • E-mail
Re : lxgui - "Lua and Xml Graphical User Interface"
« Réponse #18 le: Juin 18, 2012, 09:53:38 am »
Pour l'encodage, si vraiment il veut gérer de lui même l'XML, il peut utiliser la librairie libiconv (y a une version windows pour info), qui permet de détecter l'encodage et travailler avec.

Sinon pour faire plus simple : passe sur la librairie libxml2 (version windows existante). J'ai vu récemment comment l'utiliser et elle est simple, pratique et fiable.

Kalith

  • Jr. Member
  • **
  • Messages: 93
    • Voir le profil
Re : lxgui - "Lua and Xml Graphical User Interface"
« Réponse #19 le: Juillet 30, 2012, 02:36:34 am »
Bonjour Laurent,

J'ai pris le temps ces derniers jours d'adapter ma bibliothèque pour utiliser TextEntered. Ca marche super bien, et c'est bien plus simple à maintenir que ma solution originale "à la main" ! Par contre, je suis assez embêté par le fait qu'on ne peut récupérer cette information qu'en passant par les événements.

Si j'ai bien compris, j'ai l'heure actuelle deux méthodes différentes pour injecter cet événement dans ma bibliothèque :
  • soit je créé ma propre classe de fenêtre qui dérive de sf::Window, et je traite en interne l'événement pour le transférer à ma classe d'input. L'utilisateur doit alors utiliser ma classe de fenêtre au lieu de sf::Window, mais n'a pas d'autre manipulation à faire (je crois que c'est ce que font les autres bibliothèques de GUI que j'ai pu voir par ici).
  • soit je décharge la responsabilité à l'utilisateur entièrement, c'est à dire que c'est lui qui, dans sa boucle d'événement, va envoyer l'information à la classe d'input. La manipulation est un peu plus complexe (il ne faut pas se gourer dans l'ordre d'appel des fonctions : envoi de l'événement, mise à jour de la classe d'input, et l'utilisateur peut oublier de le faire), mais pas besoin d'utiliser une classe Window personnalisée.
Comme tu peux le constater, ces deux approches ont des inconvénients, et aucune des deux ne me satisfait vraiment.

Dans le premier cas, je trouve un peu stupide conceptuellement d'avoir une classe "gui::window". Ça donne l'impression que seul un GUI peut exister dans une même fenêtre (ce qui n'est pas le cas), et ça créé un couplage assez fort qui, je pense, n'a pas raison d'être. En effet, si l'utilisateur de ma bibliothèque souhaite utiliser une autre bibliothèque qui a elle aussi sa propre classe "other::window", que doit-il faire ? Créer lui-même son "my::window" qui hérite à la fois de "gui::window" et "other::window" ? :-\ Pour le coup, ça me semble de l'héritage un peu artificiel, conceptuellement bancal, et surtout pas très sympa pour l'utilisateur qui ne devrait pas avoir à se soucier du comportement interne des deux bibliothèques.

Dans le second cas, le problème est évident : je ne veux pas laisser tant de responsabilité à l'utilisateur (c'est pourtant la solution que j'ai choisie, par dépit pour le moment).

Dans tous les cas, je cherche aussi à rendre ma bibliothèque aussi peu invasive que possible (i.e. une fonction update() dans la boucle principale c'est très bien, mais imposer une structure particulière pour transférer un seul événement, c'est bof).

Pour régler mon problème, je te propose deux suggestions différentes :
  • intégrer un système de callback à sf::Window. Pour moi c'est l'idéal : je définis mon callback à la création de la classe d'input et c'est fini. C'est d'ailleurs la méthode qui a été retenue pour OIS. L'utilisateur ne voit rien, et tout fonctionne sans qu'il ait à modifier son code d'une quelconque manière. Maintenant, je crois comprendre que, de ton point de vue, soit on mise sur l'event polling (une boucle d'événement unique, et on se débrouille avec ça), soit on mise sur les callbacks, mais pas les deux à la fois. Je me trompe ? Je dois avouer être un peu allergique au concept de boucle d'événement "exclusive" : ça force à écrire du code intrusif et je n'aime pas ça.
  • étendre sf::Keyboard pour permettre une gestion "instantanée" (non basée sur les événements) en ajoutant une fonction du style getTextEntered(). L'inconvénient est qu'il faudra probablement ajouter aussi une fonction update() comme pour sf::Joystick (cf. code ci-dessous). Là aussi, je crois que tu n'aimes pas trop ça, vu que ce n'est pas vraiment dans la philosophie de l'input "instantané", et je comprends.
std::u32string Keyboard::getTextEntered() {
    return myTextEntered;
}

void Keyboard::update() {
    myTextEntered.clear();
    // remplir myTextEntered avec les nouveaux caractères qui auront été reçus depuis le dernier appel à update()
}

Qu'en penses-tu ? Y a-t-il de meilleures solutions auxquelles je n'aurais pas pensé ?

PS : dans le même ordre d'idée, on n'a pas accès aux informations sur la molette de la souris dans sf::Mouse. Il faut aussi passer par les événements, avec les mêmes soucis que ceux décrits ci-dessus. Dans ce cas précis tu peux conceptuellement traiter ça comme de l'input instantané en attribuant à la molette la position zéro absolu à l'initialisation, puis en incrémentant cette valeur au gré des mouvements de la molette. En soi cette valeur n'a pas tellement de sens, mais elle permet à quiconque de calculer le "delta" par rapport au dernier appel de la fonction de son côté.
Kal.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : lxgui - "Lua and Xml Graphical User Interface"
« Réponse #20 le: Juillet 30, 2012, 08:10:46 am »
La plupart des bibliothèques de GUI fonctionnent avec une fonction d'injection d'évènements que l'utilisateur doit appeler, ça ne me paraît pas si intrusif / dangereux que ça.
sf::Event event;
while (window.pollEvent(event))
{
    gui.injectEvent(event);

    // user specific handling of the event...
}

Mais bon, je comprends ta remarque, je préfèrerais aussi avoir un meilleur système de gestion des évènements. Le problème c'est que pour faire des callbacks il faut des choses qui ne sont pas dispo nativement en C++03 ; il faut soit boost soit tr1/C++11. De plus, ça compliquerait beaucoup l'écriture du binding C.

Quant à la gestion "real-time" du texte dans sf::Keyboard, ça n'est pas possible, ça ne colle pas avec le concept. Cette classe donne accès à l'état du clavier à un instant T ; que renverrais-tu dans une fonction getTextEntered ? Quand remettrais-tu à zéro ce qui est récupéré ? Comment ferais-tu pour que l'utilisateur ne voie qu'une et une seule fois tout nouveau caractère entré ? C'est juste pas possible.

Même remarque pour le delta de la molette, elle n'a pas de position absolue. Prendre la position initiale comme origine donnerait des valeurs complètement farfelues après de nombreuses utilisations, on pourrait facilement arriver à des valeurs à 3 chiffres dans un sens ou dans l'autre.
Laurent Gomila - SFML developer

Kalith

  • Jr. Member
  • **
  • Messages: 93
    • Voir le profil
Re : Re : lxgui - "Lua and Xml Graphical User Interface"
« Réponse #21 le: Juillet 30, 2012, 03:18:55 pm »
Citer
Mais bon, je comprends ta remarque, je préférerais aussi avoir un meilleur système de gestion des événements. Le problème c'est que pour faire des callbacks il faut des choses qui ne sont pas dispo nativement en C++03 ; il faut soit boost soit tr1/C++11. De plus, ça compliquerait beaucoup l'écriture du binding C.
Pourtant avec un pattern observateur ça se fait très bien en C++03 standard non ? Et ça n'a pas l'air si difficile que ça à implémenter en C (c'est moins joli, mais bon c'est du C).

Citer
Quant à la gestion "real-time" du texte dans sf::Keyboard, ça n'est pas possible, ça ne colle pas avec le concept. Cette classe donne accès à l'état du clavier à un instant T ; que renverrais-tu dans une fonction getTextEntered ? Quand remettrais-tu à zéro ce qui est récupéré ? Comment ferais-tu pour que l'utilisateur ne voie qu'une et une seule fois tout nouveau caractère entré ? C'est juste pas possible.
Ce que je proposais dans mon post précédent c'est une accumulation de TextEntered dans un std::u32string par exemple. Celui-ci serait vidé à chaque appel à Keyboard::update(), fonction qui ne devrait être appelée qu'une seule fois au début ou à la fin de la boucle d'événément par l'utilisateur. Mais bon, ça déplace la responsabilité de la "pollution de la boucle principale" à la SFML, donc j'avoue que ce n'est pas une solution idéale...

Citer
Même remarque pour le delta de la molette, elle n'a pas de position absolue. Prendre la position initiale comme origine donnerait des valeurs complètement farfelues après de nombreuses utilisations, on pourrait facilement arriver à des valeurs à 3 chiffres dans un sens ou dans l'autre.
Qu'est ce que ça change ? Dans tous les cas tu peux avoir 20 000 classes à la fois qui font :
void SomeClass::update() {
    float wheel = sf::Mouse::getWheelPosition();
    myWheelDelta = wheel - myOldWheel;
    myOldWheel = wheel;

    // ...
}
et qui auront toutes une valeur correcte pour myWheelDelta. Mais je préfère quand même une solution à base de callback, c'est plus propre (je suis d'accord : la valeur de retour de getWheelPosition() n'a pas trop de sens).

Tant que j'y suis sur l'input, voici une fonction issue de OIS qui est très utile et qui semble manquer à la SFML : obtenir une chaîne de caractère qui décrive le nom localisé d'une touche du clavier (différent de TextEntered : on peut avoir "Esc.", "Del.", "F1", les touches d'accent "^", etc.). On peut s'en servir entre autre pour afficher un écran de personnalisation des touches.
Sous linux, la fonction utilisée est XKeysymToString, et sous windows il me semble qu'ils utilisent DirectInput (mais il doit y avoir moyen de faire sans ?). De ce que j'ai pu voir dans les projets de jeu utilisant la SFML (par exemple dans M.A.R.S. qui semble bien abouti), les gens utilisent leur propre système de localisation pour obtenir cette information (comme ce que je faisait : un fichier contenant le texte associé à chaque touche pour différents langages). C'est un peu dommage.
Kal.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : lxgui - "Lua and Xml Graphical User Interface"
« Réponse #22 le: Juillet 30, 2012, 03:30:31 pm »
Citer
Pourtant avec un pattern observateur ça se fait très bien en C++03 standard non ?
Oui mais c'est beaucoup trop verbeux, il faut créer une classe qui dérive d'une base bien définie, et surdéfinir des fonctions bien définies. Si je fais ça j'aimerais qu'on puisse utiliser les objects-fonctions (std::function) et les lambdas, pour avoir une totale flexibilité.

Citer
Et ça n'a pas l'air si difficile que ça à implémenter en C (c'est moins joli, mais bon c'est du C).
Oui en effet, avec de bêtes pointeurs de fonction c'est tout aussi faisable, je me suis un peu trop avancé.

Citer
Ce que je proposais dans mon post précédent c'est une accumulation de TextEntered dans un std::u32string par exemple. Celui-ci serait vidé à chaque appel à Keyboard::update(), fonction qui ne devrait être appelée qu'une seule fois au début ou à la fin de la boucle d'événément par l'utilisateur. Mais bon, ça déplace la responsabilité de la "pollution de la boucle principale" à la SFML, donc j'avoue que ce n'est pas une solution idéale...
En effet :)

Citer
Tant que j'y suis sur l'input, voici une fonction issue de OIS qui est très utile et qui semble manquer à la SFML : obtenir une chaîne de caractère qui décrive le nom localisé d'une touche du clavier (différent de TextEntered : on peut avoir "Esc.", "Del.", "F1", les touches d'accent "^", etc.). On peut s'en servir entre autre pour afficher un écran de personnalisation des touches.
Sous linux, la fonction utilisée est XKeysymToString, et sous windows il me semble qu'ils utilisent DirectInput (mais il doit y avoir moyen de faire sans ?). De ce que j'ai pu voir dans les projets de jeu utilisant la SFML (par exemple dans M.A.R.S. qui semble bien abouti), les gens utilisent leur propre système de localisation pour obtenir cette information (comme ce que je faisait : un fichier contenant le texte associé à chaque touche pour différents langages). C'est un peu dommage.
C'est vrai. Mais pour le moment ce n'est pas dans mes priorités.
Laurent Gomila - SFML developer

Kalith

  • Jr. Member
  • **
  • Messages: 93
    • Voir le profil
Re : Re : lxgui - "Lua and Xml Graphical User Interface"
« Réponse #23 le: Juillet 30, 2012, 04:39:44 pm »
Oui mais c'est beaucoup trop verbeux, il faut créer une classe qui dérive d'une base bien définie, et surdéfinir des fonctions bien définies. Si je fais ça j'aimerais qu'on puisse utiliser les objects-fonctions (std::function) et les lambdas, pour avoir une totale flexibilité.
C'est vrai que le C++11 est une bénédiction : je l'utilise depuis qu'il est partiellement disponible sous gcc et c'est un vrai bonheur! Il me semble que pour ce qui est des lambda et des fonction objects, gcc et VC++ ont tous deux une implémentation stable. Tu préfères attendre un support total du C++11 par défaut dans les deux compilateurs ?
Dans tous les cas, je pense que tu n'auras jamais accès à un tel degré de confort en C, et qu'il faudra toujours se farcir les pointeurs sur fonction avec des structures adaptées.

C'est vrai. Mais pour le moment ce n'est pas dans mes priorités.
Dommage. Si je trouve le temps d'écrire un patch propre de mon côté, tu envisagerais de l'intégrer à la SFML ?
Kal.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : lxgui - "Lua and Xml Graphical User Interface"
« Réponse #24 le: Juillet 30, 2012, 04:57:04 pm »
Citer
Tu préfères attendre un support total du C++11 par défaut dans les deux compilateurs ?
Je ne peux pas me permettre ce genre de folie, il faut que n'importe quel compilateur pas trop préhistorique puisse compiler SFML. Du coup pour du C++11 only, il faudra attendre encore quelques années.

Citer
Dans tous les cas, je pense que tu n'auras jamais accès à un tel degré de confort en C, et qu'il faudra toujours se farcir les pointeurs sur fonction avec des structures adaptées.
Ca c'est pas trop grave, le binding C ne sert qu'à implémenter d'autres bindings, il n'a pas à être confortable :)

Citer
Dommage. Si je trouve le temps d'écrire un patch propre de mon côté, tu envisagerais de l'intégrer à la SFML ?
Pourquoi pas. Mais ça risque d'être compliqué, comme tout ce qui touche aux locales.
Laurent Gomila - SFML developer

Kalith

  • Jr. Member
  • **
  • Messages: 93
    • Voir le profil
Re : Re : lxgui - "Lua and Xml Graphical User Interface"
« Réponse #25 le: Juillet 30, 2012, 05:09:48 pm »
Pourquoi pas. Mais ça risque d'être compliqué, comme tout ce qui touche aux locales.
Eh bien j'ai trouvé GetKeyNameText dans l'API Windows qui a l'air d'être assez simple à utiliser. Je vais voir ce que je peux faire ;)
Kal.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : lxgui - "Lua and Xml Graphical User Interface"
« Réponse #26 le: Juillet 30, 2012, 07:11:29 pm »
Effectivement ça fait bien ce qu'on veut. Je ne pensait pas que ce genre de fonctions existait dans l'API Windows.
Laurent Gomila - SFML developer

Kalith

  • Jr. Member
  • **
  • Messages: 93
    • Voir le profil
Re : lxgui - "Lua and Xml Graphical User Interface"
« Réponse #27 le: Juillet 30, 2012, 10:53:14 pm »
Voilà le patch. J'ai pu tester la version linux (Ubuntu 12.04) et windows (Windows XP), mais je n'ai rien pour le Mac. Je pensais que le code pour ce dernier serait très similaire à celui pour linux, mais ça n'a clairement pas l'air d'être le cas. OIS ne propose pas d'implémentation, ce qui ne m'aide pas vraiment.
Peut être en utilisant IOHIDElementGetName? Je ne connaît vraiment rien en programmation Mac...

Sinon, pour windows les valeurs retournées sont assez jolies et correspondent en général à ce qu'on trouve écrit sur la touche du clavier (sauf pour les cas particuliers du style "1 (PAV. NUM.)" ou "ACCENT CIRCONFLEXE").

Pour linux c'est moins glorieux : le retour de XKeysymToString est pratiquement égal à l'identifier auquel on a retiré le "XK_" (i.e. "XK_Escape" devient "Escape"). L'inconvénient c'est que certains identifiers ont une casse incohérente ("XK_Escape" et "XK_space" par exemple). Les noms sont toujours en anglais quelle que soit la locale de l'ordinateur utilisé. Je pourrais ajouter un code "beautifier" pour rentre le tout plus joli (imposer une casse identique, etc.), ou est-ce qu'on devrait plutôt en laisser la responsabilité à l'utilisateur ?

J'en ai profité pour repérer deux problèmes : celui-ci sous linux (l'événement KeyPressed pour les touches numériques du haut du clavier en AZERTY donne un key.code == -1) auquel on peut rajouter les touches "^", "$", "ù", "*", ":" et "!" (toutes proches de la partie "AZERTY", pas sur le pavé numérique), et le même soucis sous windows pour la touche "!" seulement.
Serait-ce le "bug" de l'input dont tu parlais précédemment ?

[attachment deleted by admin]
Kal.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : lxgui - "Lua and Xml Graphical User Interface"
« Réponse #28 le: Juillet 31, 2012, 08:20:59 am »
Si on n'a que des noms en anglais sous Linux, ça n'a pas grand intérêt ;)

Le but est justement d'avoir des noms localisés, sinon un simple enum dans SFML ferait l'affaire.

En ce qui concerne les touches mal gérées, c'est un problème de longue date qui sera réglé dans une prochaine version.
Laurent Gomila - SFML developer

Hiura

  • SFML Team
  • Hero Member
  • *****
  • Messages: 4321
    • Voir le profil
    • E-mail
getKeyName
« Réponse #29 le: Juillet 31, 2012, 09:47:24 am »
Je ne connaît vraiment rien en programmation Mac...
Un conseil si tu veux garder tes cheveux : évite tout ce qui est bas niveau sur OS X.  :P

Cela dit, si Laurent décide d'ajouter cette tâche au tracker pour une version future de SFML, je m'en occuperai (ou du moins, je tenterais de m'en occuper!).
SFML / OS X developer