Forum de la communauté SFML

Général => Site web SFML => Discussion démarrée par: Cpl.Bator le Juillet 02, 2013, 11:05:04 pm

Titre: Les hiérarchies d'objets (scenegraph)
Posté par: Cpl.Bator 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
Titre: Re : Les hiérarchies d'objets (scenegraph)
Posté par: G. 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 ?
Titre: Re : Les hiérarchies d'objets (scenegraph)
Posté par: Cpl.Bator le Juillet 02, 2013, 11:21:36 pm
Fait un :

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

Ton compilo ne va pas laisser passer.
Titre: Re : Les hiérarchies d'objets (scenegraph)
Posté par: G. le Juillet 02, 2013, 11:24:30 pm
Ah ouai ! Node ne dérive pas de sf::Drawable
Titre: Re : Les hiérarchies d'objets (scenegraph)
Posté par: Cpl.Bator 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.
Titre: Re : Les hiérarchies d'objets (scenegraph)
Posté par: Laurent 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);
Titre: Re : Les hiérarchies d'objets (scenegraph)
Posté par: Cpl.Bator 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.
Titre: Re : Les hiérarchies d'objets (scenegraph)
Posté par: Cpl.Bator 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.
Titre: Re : Les hiérarchies d'objets (scenegraph)
Posté par: Laurent 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.
Titre: Re : Les hiérarchies d'objets (scenegraph)
Posté par: Cpl.Bator 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
Titre: Re : Les hiérarchies d'objets (scenegraph)
Posté par: Laurent 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);
Titre: Re : Re : Les hiérarchies d'objets (scenegraph)
Posté par: Cpl.Bator 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)
Titre: Re : Les hiérarchies d'objets (scenegraph)
Posté par: Laurent 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.