IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

"Interfaces nodales" : utilisation des graphes ?


Sujet :

Qt

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 145
    Points : 392
    Points
    392
    Par défaut "Interfaces nodales" : utilisation des graphes ?
    Bonsoir à tous !

    J'ai repris un projet perso qui consiste en une implémentation du concept de "vue nodale".

    En exemple je peux citer, le Node Graph du logiciel de compositing Nuke :
    http://www.fxguide.com/wp-content/up...uke_screen.jpg

    La partie graphique étant quasiment finie, je m'intéresse à la partie logique, aussi aurais-je voulu avoir quelques conseils, avis (si quelqu'un s'y connaît un peu)...

    J'ai touché rapidement à Nuke, au FlowGraph du CryEngine, ce qui en ressort :
    - une node représente un ensemble de propriétés
    - une connexion d'une node à une autre réalise une action précise : par exemple, relier un noeud "Image" à un noeud "Vue" aura pour effet d'afficher l'image dans la vue... ...merci capitaine évidence....

    Il me semble logique qu'il y aura une classe par type de node.

    Me conseilleriez-vous une solution plutôt qu'une autre pour "si tel noeud est relié à tel noeud, alors faire ceci" (pour chaque type de noeud donc) ?

    Devrais-je aller voir du côté de la théorie des graphes ?

    Merci

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 282
    Points : 939
    Points
    939
    Par défaut Terminologie
    De ce que je comprends, ton problème n'est pas de la théorie des graphes, dans le sens où tous les nœuds n'ont pas la même sémantique. Il s'agit plutôt d'actions. Je dirai plutôt que tu es dans le domaine des automates d'état finis, qui peuvent se modéliser par des tableaux ou des graphes : passer d'un nœud à un autre implique de faire certaines actions (bon, selon les littératures et points de vues, les actions sont soit dans les nœuds, soit dans les arcs/transitions).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 145
    Points : 392
    Points
    392
    Par défaut
    Merci pour ta réponse.

    Certains développeurs de ce genre de système disent que cela s'apparente à du scripting.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Août 2008
    Messages : 282
    Points : 939
    Points
    939
    Par défaut
    Je ne serai peut-être pas très utile pour ta solution (et je n'ai jamais erré du côté de Nuke).
    Si tu dis "scripting", je pense à une manière de coder : langage de script versus compilé. Cela ne change pas le problème de fond.
    Sois tu cherches un algorithme à programmer, et je peux peut-être avoir des idées, soit tu es franchement dans le domaine "Nuke" ou une bib spécifique, et il faudra poser la question dans la section "programmation jeux" de dvp ou d'un autre forum.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 145
    Points : 392
    Points
    392
    Par défaut
    De mémoire, l'éditeur nodal du CryEngine génère du LUA.

    En fait au final, mon souci est plus au niveau de la conception.

    J'avais pensé à une fonction virtuelle par classe "*Node", dans laquelle on devrait définir les actions à faire en cas de connexion avec tel node (donc à coups de cast ou de metaObject), mais je me demande s'il n'y a pas plus simple ou moins lourd.

    Conception, algorithme, je ne sais plus très bien

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 894
    Points : 219 533
    Points
    219 533
    Billets dans le blog
    124
    Par défaut
    Bonjour,

    Je pense actuellement aux éditeurs de matériels (Unreal Engine et autre 3DS Max).

    En fait, chaque noeud possède une méthode process (qui fait le traitement) et une ou plusieurs entrées et possiblement une (ou plusieurs) sortie.
    Le truc, c'est de genre un code assez générique pour avoir plusieurs entrées et sorties. Généralement, ça renvoie une données assez simple (une texture (donc un tableau 2D)), si vraiment on doit envoyer une données scalaire ou une texture, il faut aussi faire une surcouche (type de variant) pour envoyer et recevoir la données.
    Sinon, on peut aussi imaginer que pour chaque entrées (ou sorties) ont est une classe Socket, qui détermine la data attendue/renvoyée. Les connexions deviennent simple après.

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 617
    Points
    15 617
    Par défaut
    Citation Envoyé par GilbertLatranche Voir le message
    De mémoire, l'éditeur nodal du CryEngine génère du LUA.

    En fait au final, mon souci est plus au niveau de la conception.

    J'avais pensé à une fonction virtuelle par classe "*Node", dans laquelle on devrait définir les actions à faire en cas de connexion avec tel node (donc à coups de cast ou de metaObject), mais je me demande s'il n'y a pas plus simple ou moins lourd.

    Conception, algorithme, je ne sais plus très bien
    Si tu fais ça, tu pars sur des approches de double dispatching, c'est lourd.
    A mon avis, dans ce genre de script (représenté par un graph), les connexions ne sont pas des fonctionnalités. Elles connectent simplement un node avec un autre node, ce sont les nodes qui ont des fonctionnalités.
    Donc, c'est pas "si tel noeud est relié à tel noeud, alors faire ceci", mais "tel noeud fait ceci, tel noeud fait cela".

    Un exemple d'implémentation est d'avoir une classe pour les nodes, chaque entrée et sortie est une variable, et une classe connexion, qui relient 2 propriétés de 2 classes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    struct Node {
        // input
        int in_1;
        double in_2;
        // output
        image out_1
        string out_2;
     
        void run(); // lance le calcul
    };
     
    template<class T>
    struct Connect {
        Node* out;
        T* var_out;
        Node* in;
        T* var_int
    };

    Avec Qt, tu peux aussi utiliser le systèmes de propriétés et des signaux/slots : une variable de sortie est un signal, une variable d'entrée est un slot, et les properties sont les états internes des nodes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class Node : public QObject {
        Q_OBJECT
        Q_PROPERTY(int in_1 READ int_1 WRITE setIn_1 NOTIFY in_1Changed)
        Q_PROPERTY(double in_2 READ int_2 WRITE setIn_2 NOTIFY in_2Changed)
        Q_PROPERTY(image out_1 READ out_1 WRITE setOut_1 NOTIFY out_1Changed)
        Q_PROPERTY(image out_2 READ out_2 WRITE setOut_2 NOTIFY out_2Changed)
     
    public slots:
        void receiveIn_1(int);
        void receiveIn_2(double);
     
    signals:
        void sendOut_1(image const&)
        void sentOut_2(string const&)
    };
     
    // création d'une connexion
    QObject::connect(&node_1, SIGNAL(sendOut_3(image)), &node_2, SLOT(receive_In_1(image)));
    Avec cela, tu peux facilement exporter tes classes Node pour être utilisé dans le designer par exemple ou créer ton designer. Ou utiliser les scripts ou le QML de Qt

    Bon courage

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/06/2010, 16h36
  2. [MySQL] Pourquoi dois-je utiliser des "quotes penchées" dans mes requêtes?
    Par v4np13 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/02/2008, 23h23
  3. utilisation des quotes
    Par Henry9 dans le forum Oracle
    Réponses: 1
    Dernier message: 13/11/2006, 21h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo