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

Auteur Sujet: Les hiérarchies d'objets (scenegraph)  (Lu 3784 fois)

0 Membres et 1 Invité sur ce sujet

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Les hiérarchies d'objets (scenegraph)
« le: Juillet 02, 2013, 11:05:04 pm »
j'ai repris ce code dans les tutoriels : http://www.sfml-dev.org/tutorials/2.0/graphics-transform-fr.php

// la classe de base abstraite
class Node
{
public:

    // ... fonctions pour transformer le noeud

    // ... fonction pour gérer les enfants du noeud

    void draw(sf::RenderTarget& target, const sf::Transform& parentTransform) const
    {
        // on combine la transformation du parent avec la transformation du noeud
        sf::Transform combinedTransform = parentTransform * m_transform;

        // on laisse le noeud se dessiner
        onDraw(target, combinedTransform)

        // on dessine ses enfants
        for (std::size_t i = 0; i < m_children.size(); ++i)
            m_children[i]->draw(target, combinedTransform);
    }

private:

    virtual void onDraw(sf::RenderTarget& target, const sf::Transform& transform) const = 0;

    sf::Transform m_transform;
    std::vector<Node*> m_children;
};

// une classe dérivée simple : un noeud qui dessine un sprite
class SpriteNode : public Node
{
public:

    // .. fonctions pour paramétrer le sprite

private:

    virtual void onDraw(sf::RenderTarget& target, const sf::Transform& transform) const
    {
        target.draw(m_sprite, transform);
    }

    sf::Sprite m_sprite;
};

Il y a une coquille dans le code, il manque toute la partie dérivé de sf::Drawable , dans l'état actuel on ne peu rien afficher

G.

  • Hero Member
  • *****
  • Messages: 1396
    • Voir le profil
Re : Les hiérarchies d'objets (scenegraph)
« Réponse #1 le: Juillet 02, 2013, 11:18:36 pm »
Le draw de node appelle le onDraw de spriteNode non ? Du coup qu'est-ce qui manque ?

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Les hiérarchies d'objets (scenegraph)
« Réponse #2 le: Juillet 02, 2013, 11:21:36 pm »
Fait un :

SpriteNode monSpriteNode;
...
window.draw( monSpriteNode );

Ton compilo ne va pas laisser passer.

G.

  • Hero Member
  • *****
  • Messages: 1396
    • Voir le profil
Re : Les hiérarchies d'objets (scenegraph)
« Réponse #3 le: Juillet 02, 2013, 11:24:30 pm »
Ah ouai ! Node ne dérive pas de sf::Drawable

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Les hiérarchies d'objets (scenegraph)
« Réponse #4 le: Juillet 02, 2013, 11:32:31 pm »
Node ne devrais pas dérivé de sf::drawable , un noeud est un noeud , si ton noeud terminal est un son par exemple , tu est fin avec ton drawable qui va dessiner un son :D
C'est la classe spécialisé qui devrais dérivé , Node devrais juste dérivé de sf::Transformable je pense.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32124
    • Voir le profil
    • SFML's website
    • E-mail
Re : Les hiérarchies d'objets (scenegraph)
« Réponse #5 le: Juillet 02, 2013, 11:57:02 pm »
C'est juste un exemple. Pourquoi est-ce que ça devrait dériver de sf::Drawable ? Là j'ai (volontairement) choisi de montrer une interface 100% custom, plutôt que basée sur les interfaces SFML.

Ces classes ne sont donc bien entendu pas faites pour ça

window.draw(node);

mais plutôt pour ça

node.draw(window);
Laurent Gomila - SFML developer

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Les hiérarchies d'objets (scenegraph)
« Réponse #6 le: Juillet 03, 2013, 12:02:36 am »
L'exemple est ambigu , comme c'est fait , avec la méthode draw dans la classe node , on pense automatiquement à ce qu'elle doit dérivé de sf::Drawable.

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Les hiérarchies d'objets (scenegraph)
« Réponse #7 le: Juillet 03, 2013, 12:44:28 am »
J'ai voulu tenté d'écrire une classe node en la dérivant de sf::Transformable , je me suis cassé les dents
sf::Transformable n'a aucune méthode pour mettre à jour un sf::Transform (suite à une combinaison parent->enfants) , la solution pour faire du scenegraph sans passé par des sf::Drawable , c'est de réecrire complètement la classe sf::Transformable.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32124
    • Voir le profil
    • SFML's website
    • E-mail
Re : Les hiérarchies d'objets (scenegraph)
« Réponse #8 le: Juillet 03, 2013, 08:02:58 am »
Citer
L'exemple est ambigu , comme c'est fait , avec la méthode draw dans la classe node , on pense automatiquement à ce qu'elle doit dérivé de sf::Drawable.
Pourtant il est clair qu'elle n'en dérive pas, donc c'est pas si ambigü que ça :P

Citer
J'ai voulu tenté d'écrire une classe node en la dérivant de sf::Transformable , je me suis cassé les dents
sf::Transformable n'a aucune méthode pour mettre à jour un sf::Transform (suite à une combinaison parent->enfants) , la solution pour faire du scenegraph sans passé par des sf::Drawable , c'est de réecrire complètement la classe sf::Transformable.
Déjà, quel rapport entre Drawable et Transformable ? Les deux sont complètement indépendants.

Ensuite, je ne vois pas trop le problème. Tu as juste à remplacer m_transform par getTransform() dans le code du tutoriel, si tu fais hériter Node de sf::Transformable.
Laurent Gomila - SFML developer

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Les hiérarchies d'objets (scenegraph)
« Réponse #9 le: Juillet 03, 2013, 12:08:29 pm »
Je ne fait que lire ton article , reconnais quand même qu'il y a un problème ici précisément :
Citer
// une classe dérivée simple : un noeud qui dessine un sprite
class SpriteNode : public Node

Or , y a rien qui ce dessine , d'ou l’ambiguïté.  :P

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32124
    • Voir le profil
    • SFML's website
    • E-mail
Re : Les hiérarchies d'objets (scenegraph)
« Réponse #10 le: Juillet 03, 2013, 12:15:05 pm »
Citer
y a rien qui ce dessine
?? ???

Voilà la fonction qui dessine :
virtual void onDraw(sf::RenderTarget& target, const sf::Transform& transform) const
{
    target.draw(m_sprite, transform);
}

Et voilà comment dessiner un SpriteNode :
SpriteNode node;
...
node.draw(window, sf::Transform::Identity);
Laurent Gomila - SFML developer

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : Re : Les hiérarchies d'objets (scenegraph)
« Réponse #11 le: Juillet 03, 2013, 12:19:55 pm »
Et voilà comment dessiner un SpriteNode :
SpriteNode node;
...
node.draw(window, sf::Transform::Identity);

Et voilà ce qui manquait  :P
Le réflexe comme je l'ai dit plus haut , c'est de faire l'inverse : window.draw(node)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32124
    • Voir le profil
    • SFML's website
    • E-mail
Re : Les hiérarchies d'objets (scenegraph)
« Réponse #12 le: Juillet 03, 2013, 12:31:23 pm »
Il ne faut justement pas que ce soit un réflexe. Dériver de sf::Drawable est courant mais pas obligatoire, il faut aussi s'habituer à d'autres APIs de classes dessinables.
Laurent Gomila - SFML developer