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

Ogre Discussion :

CEGUI problème initialisation de arg


Sujet :

Ogre

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 72
    Points : 0
    Points
    0
    Par défaut CEGUI problème initialisation de arg
    Bonjour tous le monde,

    J'ai un petit problème avec CEGUI, J'ai suivit le tutoriel sur Ogre pour pouvoir bouger la souris voici le code de AppDemarrage.

    AppDemarrage.h

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #ifndef APPDEMARRAGE_H_INCLUDED
    #define APPDEMARRAGE_H_INCLUDED
     
    #include <Ogre.h>
    #include "InputListener.h"
    #include <OIS\OIS.h>
    #include <CEGUI.h>
    #include <RendererModules\Ogre\CEGUIOgreRenderer.h>
     
    class AppDemarrage
    {
    public:
        AppDemarrage();
        ~AppDemarrage();
     
        bool start();
     
    protected:
        CEGUI::OgreRenderer* mRenderer;
     
    private:
        void createFrameListener();
        void createScene();
        bool mouseMoved(const OIS::MouseEvent &arg);
        bool mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id);
        bool mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id);
        CEGUI::MouseButton convertButton(OIS::MouseButtonID buttonID);
     
        InputListener *mInputListener;
        Ogre::Root *mRoot;
        Ogre::Camera* mCamera;
        Ogre::SceneManager* mSceneMgr;
        Ogre::RenderWindow *mWindow;
    };
     
    #endif
    AppDemarrage.cpp

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #include "AppDemarrage.h"
     
    AppDemarrage::AppDemarrage() : mRoot(0), mSceneMgr(0), mWindow(0)
    {
        mRoot = new Ogre::Root("plugins.cfg", "ogre.cfg", "Ogre.log");
        mSceneMgr = mRoot->createSceneManager("DefaultSceneManager", "Mon Scene Manager");
    }
     
    bool AppDemarrage::start()
    {
    /...
        mRenderer = &CEGUI::OgreRenderer::bootstrapSystem();
        CEGUI::Imageset::setDefaultResourceGroup("Imagesets");
        CEGUI::Font::setDefaultResourceGroup("Fonts");
        CEGUI::Scheme::setDefaultResourceGroup("Schemes");
        CEGUI::WidgetLookManager::setDefaultResourceGroup("LookNFeel");
        CEGUI::WindowManager::setDefaultResourceGroup("Layouts");
        CEGUI::SchemeManager::getSingleton().create("OgreTray.scheme");
        CEGUI::System::getSingleton().setDefaultMouseCursor("OgreTrayImages", "MouseArrow");
        CEGUI::MouseCursor::getSingleton().setImage( CEGUI::System::getSingleton().getDefaultMouseCursor());
    /...
    }
     
    void AppDemarrage::createFrameListener()
    {
        mInputListener = new InputListener(mWindow, mCamera, mSceneMgr);
        mRoot->addFrameListener(mInputListener);
    }
     
    bool AppDemarrage::mouseMoved(const OIS::MouseEvent &arg)
    {
        CEGUI::System::getSingleton().injectMouseMove(arg.state.X.rel, arg.state.Y.rel);
        return true;
    }
     
    bool AppDemarrage::mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
    {
        CEGUI::System::getSingleton().injectMouseButtonDown(convertButton(id));
        return true;
    }
     
    bool AppDemarrage::mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id)
    {
        CEGUI::System::getSingleton().injectMouseButtonUp(convertButton(id));
        return true;
    }
     
    CEGUI::MouseButton AppDemarrage::convertButton(OIS::MouseButtonID buttonID)
    {
        switch (buttonID)
        {
        case OIS::MB_Left:
            return CEGUI::LeftButton;
     
        case OIS::MB_Right:
            return CEGUI::RightButton;
     
        case OIS::MB_Middle:
            return CEGUI::MiddleButton;
     
        default:
            return CEGUI::LeftButton;
        }
    }
     
    void AppDemarrage::createScene()
    {
     
    }
     
    AppDemarrage::~AppDemarrage()
    {
        OGRE_DELETE mRoot;
        OGRE_DELETE mCamera;
        OGRE_DELETE mSceneMgr;
        OGRE_DELETE mWindow;
        delete mInputListener;
        delete mRoot;
    }
    Le truck c'est qu'il faut que j'arrive a faire appeler les méthode mouseMoved(const OIS::MouseEvent &arg), mousePressed(const OIS::MouseEvent &arg, OIS::MouseButtonID id), mouseReleased(const OIS::MouseEvent &arg, OIS::MouseButtonID id), mais pour cela il faut que j'initialise arg, j'ai essayer de plein de façon mais je n'est jamais réussi.

    Je devine déjà une réponse (il faut mettre ceci dans InputListener) oui je c'est mais d'abord je voudrait trouver comment initialiser arg.

    Pouvez-vous m'aidez.

    Merci d'avance.

    Erwan28250

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 72
    Points : 0
    Points
    0
    Par défaut
    J'ai réussi a initialiser mais sa plante au démarrage du programme, je vais essayer c'est peut t'être le tutoriel qui est mal expliquer, je vais essayer de trouver un tutoriel d'installation de CEGUI ailleurs.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2009
    Messages : 132
    Points : 283
    Points
    283
    Par défaut
    Citation Envoyé par Erwan28250 Voir le message
    Je devine déjà une réponse (il faut mettre ceci dans InputListener) oui je c'est mais d'abord je voudrait trouver comment initialiser arg.
    Exact ! Il faut que ta classe InputListener hérite de OIS::MouseListener (dont tu trouveras la doc ICI). Comme tu peux le voir, c'est cette classe qui contient les méthodes virtuelles mouseMoved, mousePressed et mouseReleased.

    Surcharge ces méthodes dans ta classe InputListener, et n'oublie pas d'affecter ta classe de callback à la souris.
    Par exemple, mets dans le constructeur de InputListener :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mMouse->setEventCallback(this);
    Note : tu n'as pas à initialiser la variable arg, c'est un paramètre et ce paramètre est passé lors de l'appel à la méthode. En gros, lorsque un évènement de souris survient (par exemple la souris bouge), l'instance de OIS::Mouse (mMouse) va appeler la méthode correspondante (mouseMoved) sur le callback que tu lui as affecté.

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 72
    Points : 0
    Points
    0
    Par défaut
    OK j'ai fait ce que tu ma dit, mais maintenant j'ai un autre problème que j'avais déjà eu en activant le buffer il y a déjà un petit moment, c'est qu'en faite au moment ou je mes OIS::MouseListener la méthode createFrameListener() me met un message d'erreur :



    J'avais réussi a résoudre avec l'activation du buffer mais je ne me souvient plus.

    Pouvez-vous m'aidez.

    Merci d'avance.

    Erwan28250.

  5. #5
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2009
    Messages : 132
    Points : 283
    Points
    283
    Par défaut
    Tu ne comprends pas le message d'erreur ? Il est impossible d'instancier une classe abstraite, c'est-à-dire une classe qui contient des méthodes virtuelles pures, sans implémentation. Comme OIS::MouseListener est une classe abstraite, il faut que la classe qui en hérite (InputListener) implémente ses méthodes virtuelles pures si tu veux l'instancier.

    Je pense que tu as oublié de surcharger toutes les méthodes mouseMoved, mousePressed et mouseReleased dans InputListener !

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 72
    Points : 0
    Points
    0
    Par défaut
    OK, j'ai compris mon erreur, sa ne venait pas du fait quel était pas surcharger, c'est autre chose, bon j'ai un autre petit problème, Le programme s'ouvre mais la sourit ne bouge pas :

    Voici mon InputListener:

    InputListener.h

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #ifndef INPUTLISTENER_H_INCLUDED
    #define INPUTLISTENER_H_INCLUDED
     
    #include <Ogre.h>
    #include <OIS/OIS.h>
    #include <CEGUI.h>
    #include <RendererModules\Ogre\CEGUIOgreRenderer.h>
     
    class InputListener : public Ogre::FrameListener, public Ogre::WindowEventListener, public OIS::MouseListener
    {
    public:
    	InputListener(Ogre::RenderWindow *wnd, Ogre::Camera *camera, Ogre::SceneManager *sceneMgr);
    	~InputListener();
     
    protected:
        CEGUI::OgreRenderer* mRenderer;
    	virtual bool mouseMoved (const OIS::MouseEvent &arg);
    	virtual bool mousePressed (const OIS::MouseEvent &arg, OIS::MouseButtonID id);
    	virtual bool mouseReleased (const OIS::MouseEvent &arg, OIS::MouseButtonID id);
    	virtual CEGUI::MouseButton convertButton(OIS::MouseButtonID buttonID);
     
    private:
    	bool frameRenderingQueued(const Ogre::FrameEvent& evt);
    	void startOIS();
    	virtual void windowResized(Ogre::RenderWindow* rw);
    	virtual void windowClosed(Ogre::RenderWindow* rw);
    	Ogre::SceneManager *mSceneMgr;
        Ogre::RenderWindow* mWindow;
        Ogre::Camera*       mCamera;
     
    	bool mToucheAppuyer;
    	Ogre::Real mMouvement;
    	Ogre::Real mVitesse;
    	Ogre::Real mVitesseRotation;
     
    	Ogre::Radian mRotationX;
    	Ogre::Radian mRotationY;
     
        OIS::InputManager*  mInputManager;
        OIS::Mouse*         mMouse;
        OIS::Keyboard*      mKeyboard;
    };
     
    #endif
    InputListener.cpp

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    #include "InputListener.h"
     
    InputListener::InputListener(Ogre::RenderWindow *wnd, Ogre::Camera *camera, Ogre::SceneManager *sceneMgr)
    {
    	mSceneMgr = sceneMgr;
        mWindow = wnd;
        mCamera = camera;
     
    	mToucheAppuyer = false;
    	startOIS();
    	mMouse->setEventCallback(this);
    }
     
    bool InputListener::frameRenderingQueued(const Ogre::FrameEvent& evt)
    {
    	if(mWindow->isClosed())
            return false;
     
    	if(mMouse)
    		mKeyboard->capture();
    	if(mKeyboard)
    		mMouse->capture();
     
    	if(mKeyboard->isKeyDown(OIS::KC_ESCAPE))
            return false;
     
        return true;
    }
     
    void InputListener::startOIS()
    {
    	mRenderer = &CEGUI::OgreRenderer::bootstrapSystem();
    	CEGUI::Imageset::setDefaultResourceGroup("Imagesets");
    	CEGUI::Font::setDefaultResourceGroup("Fonts");
    	CEGUI::Scheme::setDefaultResourceGroup("Schemes");
    	CEGUI::WidgetLookManager::setDefaultResourceGroup("LookNFeel");
    	CEGUI::WindowManager::setDefaultResourceGroup("Layouts");
    	CEGUI::SchemeManager::getSingleton().create("OgreTray.scheme");
    	CEGUI::System::getSingleton().setDefaultMouseCursor("OgreTrayImages", "MouseArrow");
    	CEGUI::MouseCursor::getSingleton().setImage( CEGUI::System::getSingleton().getDefaultMouseCursor());
     
    	Ogre::LogManager::getSingletonPtr()->logMessage("*** Initializing OIS ***");
     
    	OIS::ParamList pl;
    	size_t windowHnd = 0;
    	std::ostringstream windowHndStr;
     
    	mWindow->getCustomAttribute("WINDOW", &windowHnd);
    	windowHndStr << windowHnd;
    	pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
     
    	mInputManager = OIS::InputManager::createInputSystem( pl );
    	mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject( OIS::OISMouse, false ));
    	mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject( OIS::OISKeyboard, false ));
     
    	windowResized(mWindow);
    	Ogre::WindowEventUtilities::removeWindowEventListener(mWindow, this);
    }
     
    bool InputListener::mouseMoved(const OIS::MouseEvent &arg)
    {
        CEGUI::System::getSingleton().injectMouseMove(arg.state.X.rel, arg.state.Y.rel);
        return true;
    }
     
    bool InputListener::mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
    {
        CEGUI::System::getSingleton().injectMouseButtonDown(convertButton(id));
        return true;
    }
     
    bool InputListener::mouseReleased( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
    {
        CEGUI::System::getSingleton().injectMouseButtonUp(convertButton(id));
        return true;
    }
     
    CEGUI::MouseButton InputListener::convertButton(OIS::MouseButtonID buttonID)
    {
        switch (buttonID)
        {
        case OIS::MB_Left:
            return CEGUI::LeftButton;
     
        case OIS::MB_Right:
            return CEGUI::RightButton;
     
        case OIS::MB_Middle:
            return CEGUI::MiddleButton;
     
        default:
            return CEGUI::LeftButton;
        }
    }
     
    void InputListener::windowResized(Ogre::RenderWindow* wnd)
    {
    	unsigned int width, height, depth;
    	int left, top;
    	wnd->getMetrics(width, height, depth, left, top);
     
    	const OIS::MouseState &ms = mMouse->getMouseState();
    	ms.width = width;
    	ms.width = height;
    }
     
    void InputListener::windowClosed(Ogre::RenderWindow* wnd)
    {
    	if( wnd == mWindow )
    	{
    		if( mInputManager )
    		{
    			mInputManager->destroyInputObject( mMouse );
    			mInputManager->destroyInputObject( mKeyboard );
     
    			OIS::InputManager::destroyInputSystem(mInputManager);
    			mInputManager = 0;
    		}
    	}
    }
     
    InputListener::~InputListener()
    {
    	Ogre::WindowEventUtilities::removeWindowEventListener(mWindow, this);
    	windowClosed(mWindow);
    }
    Je vais continuer mes recherche.

    et pour les ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	mRenderer = &CEGUI::OgreRenderer::bootstrapSystem();
    	CEGUI::Imageset::setDefaultResourceGroup("Imagesets");
    	CEGUI::Font::setDefaultResourceGroup("Fonts");
    	CEGUI::Scheme::setDefaultResourceGroup("Schemes");
    	CEGUI::WidgetLookManager::setDefaultResourceGroup("LookNFeel");
    	CEGUI::WindowManager::setDefaultResourceGroup("Layouts");
    	CEGUI::SchemeManager::getSingleton().create("OgreTray.scheme");
    	CEGUI::System::getSingleton().setDefaultMouseCursor("OgreTrayImages", "MouseArrow");
    	CEGUI::MouseCursor::getSingleton().setImage( CEGUI::System::getSingleton().getDefaultMouseCursor());
    je les est mise dans le InputListener car je me demandait si c'était pas si qui ne faisait pas marcher, mais je me suis rendu compte que non, mais ne vous inquiété pas je les est enlever de AppDemarrage .

    Erwan28250

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 72
    Points : 0
    Points
    0
    Par défaut
    J'ai ouvert le programme avec le débogueur en mettant un point d'arrêt au méthode :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    bool InputListener::mouseMoved(const OIS::MouseEvent &arg)
    {
        CEGUI::System::getSingleton().injectMouseMove(arg.state.X.rel, arg.state.Y.rel);
        return true;
    }
     
    bool InputListener::mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
    {
        CEGUI::System::getSingleton().injectMouseButtonDown(convertButton(id));
        return true;
    }
     
    bool InputListener::mouseReleased( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
    {
        CEGUI::System::getSingleton().injectMouseButtonUp(convertButton(id));
        return true;
    }
     
    CEGUI::MouseButton InputListener::convertButton(OIS::MouseButtonID buttonID)
    {
        switch (buttonID)
        {
        case OIS::MB_Left:
            return CEGUI::LeftButton;
     
        case OIS::MB_Right:
            return CEGUI::RightButton;
     
        case OIS::MB_Middle:
            return CEGUI::MiddleButton;
     
        default:
            return CEGUI::LeftButton;
        }
    }
    et j'ai remarquer que le programme ne s’arrêtaient jamais a ces endroit donc voila pourquoi sa ne marche pas, mais pourquoi j'en en sais rien.

  8. #8
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2009
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2009
    Messages : 132
    Points : 283
    Points
    283
    Par défaut
    Tu peux remarquer que l'objet mMouse ne semble pas écouter les évènements de la souris. Regarde donc l'initialisation de ton objet mMouse dans la méthode startOIS. La méthode createInputObject accepte un paramètre bufferMode (voir la DOC), qui est ici à false. En mettant à true, ça devrait activer le mode buffer, tu ne crois pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject( OIS::OISMouse, true ));

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 72
    Points : 0
    Points
    0
    Par défaut
    C'est bon, j'ai réussi avec cette petite ligne d'appeler les méthode, mais maintenant sa plante.

    le débogueur m'indique return 0; du fichier main. je pense que ça vient des méthode qui plante.

    C'est bon problème résolu, j'avais en faite fait une petite bêtise, mais c'est bon c'est résolut, la sourit bouge maintenant.

    Merci de m'avoir aidé.

    Erwan28250

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème initialisation fenêtre Windows
    Par trecks dans le forum Windows
    Réponses: 1
    Dernier message: 14/05/2007, 14h11
  2. [WASD5]problème initialisation log4j
    Par david06600 dans le forum Websphere
    Réponses: 1
    Dernier message: 29/08/2006, 13h51
  3. [WinDev 9] Problème initialisation requête
    Par Zipyz dans le forum WinDev
    Réponses: 5
    Dernier message: 27/07/2006, 09h17
  4. problème initialisation de la TAPI
    Par bel76 dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 05/05/2006, 23h13
  5. [Plugin] Problème initialisation plugin ResourcesPlugin
    Par Michael I. dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 06/02/2004, 13h27

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