• Accueil forums
  •  » Mesh
  •  » Comment modifier un IAnimatedMeshSceneNode à partir d'un ISceneNode ?
#1 

31-05-2008 09:31:45

nikska
Membres
Date d'inscription:
Messages: 36
IP: 82.239.138.147
Courriel

bonjour,
Alors à partir de l'exemple 7 sur les collisions, j'ai fait quelque petite modification :
lorsque je clique sur un objet, je récupère le IsceneNode seulement j'aimerai pouvoir accéder au méthodes de l'IAnimatedMeshSceneNode.
J'ai essayé plusieurs choses, mais malheureusement ça plante.

voici la code :

#include <irrlicht.h>
#include <iostream>


using namespace irr;

class MyEventReceiver : public irr::IEventReceiver
{

    public:
    MyEventReceiver( scene::ISceneManager* smgr, gui::ICursorControl* curseur)
    {
        //node=0;

        selectedSceneNode = 0;
        lastSelectedSceneNode = 0;
        m_smgr = smgr;
        m_curseur = curseur;

    }

    bool OnEvent(const SEvent& event)
    {

        if (event.EventType == EET_MOUSE_INPUT_EVENT && event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP)
        {
            core::line3d<f32> line;


            line.start = m_smgr->getActiveCamera()->getPosition();

            line.end = line.start + (m_smgr->getActiveCamera()->getTarget() - line.start).normalize() * 1000.0f;

            core::vector3df intersection;
            core::triangle3df tri;

            selectedSceneNode = m_smgr->getSceneCollisionManager()->getSceneNodeFromScreenCoordinatesBB(m_curseur->getPosition());


            if (lastSelectedSceneNode){
                lastSelectedSceneNode->setMaterialFlag(video::EMF_LIGHTING, true);
            }


            if (selectedSceneNode){
                selectedSceneNode->setMaterialFlag(video::EMF_LIGHTING, false);
                scene::IAnimatedMeshSceneNode* node=0;

                selectedSceneNode->addChild(node);   //essai1 avec addchild
                //node->setParent(selectedSceneNode);  //essai2 avec set parent
                std::cout<<"modifie animaion speed :"<<std::endl;
                node->setAnimationSpeed(5); //fait planter l'application
                std::cout<<"fin modifie :"<<std::endl;

                lastSelectedSceneNode = selectedSceneNode;

                /**
                Ici je voudrai acceder au methodes de l'AnimatedMeshSceneNode !!
                Par exemple : utiliser setAnimationSpeed(5);
                    ou  récupéré le nom du personnage pour une classe qui herite de AnimatedMeshSceneNode
                **/

            }
        }
    }

    protected:
        //scene::IAnimatedMeshSceneNode* node;
        scene::ISceneNode* selectedSceneNode;
        scene::ISceneNode* lastSelectedSceneNode;
        scene::ISceneManager* m_smgr;
        gui::ICursorControl* m_curseur;
};



int main()
{
    // create device

    IrrlichtDevice *device =
        createDevice(video::EDT_OPENGL, core::dimension2d<s32>(640, 480), 32, false);
    irr::gui::ICursorControl* monCurseur = device->getCursorControl();


    video::IVideoDriver* driver = device->getVideoDriver();
    scene::ISceneManager* smgr = device->getSceneManager();

    scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeMaya(0);
    camera->setPosition(core::vector3df(0, 0, 0));
    camera->setTarget(core::vector3df(-70,0,-20));


    video::SMaterial material;
    material.setTexture(0, driver->getTexture("../../media/faerie2.bmp"));
    material.Lighting = true;

    scene::IAnimatedMeshSceneNode* node = 0;
    scene::IAnimatedMesh* faerie = smgr->getMesh("../../media/faerie.md2");

    if (faerie)
    {
        scene::IAnimatedMeshSceneNode* node1 = smgr->addAnimatedMeshSceneNode(faerie);
        node1->setPosition(core::vector3df(-70,0,0));
        node1->setMD2Animation(scene::EMAT_RUN);
        node1->getMaterial(0) = material;
        std::cout<<(&node)<<std::endl;

        scene::IAnimatedMeshSceneNode* node2 = smgr->addAnimatedMeshSceneNode(faerie);
        node2->setPosition(core::vector3df(-70,0,-30));
        node2->setMD2Animation(scene::EMAT_SALUTE);
        node2->getMaterial(0) = material;
        std::cout<<(&node)<<std::endl;

        scene::IAnimatedMeshSceneNode* node3 = smgr->addAnimatedMeshSceneNode(faerie);
        node3->setPosition(core::vector3df(-70,0,-60));
        node3->setMD2Animation(scene::EMAT_JUMP);
        node3->getMaterial(0) = material;

    }

    material.setTexture(0, 0);
    material.Lighting = false;


    smgr->addLightSceneNode(0, core::vector3df(-60,100,400),
                            video::SColorf(1.0f,1.0f,1.0f,1.0f),
                            600.0f);


    MyEventReceiver receiver(smgr, monCurseur);
    device->setEventReceiver(&receiver);

    while (device->run())
        if (device->isWindowActive())
        {
            driver->beginScene(true, true, 0);

            smgr->drawAll();

            driver->endScene();


        }

    device->drop();

    return 0;
}


Hors ligne


#2 

31-05-2008 10:20:27

nikska
Membres
Date d'inscription:
Messages: 36
IP: 82.239.138.147
Courriel

lol bon je crois que j'ai trouvé la solution à mon problème :
Pour convertir : ((scene::IAnimatedMeshSceneNode*) unSceneNode)
Pour récupéré la pointeur de cette conversion : scene::IAnimatedMeshSceneNode* nouveauSceneNode = ((scene::IAnimatedMeshSceneNode*)selectedSceneNode);

Après on peut très bien utiliser les méthodes normalement : nouveauSceneNode->getFrameNr();

J'ai un peu de mal a comprendre comment la conversion peut récupéré les attributs de l'AnimatedMeshSceneNode mais bon au moins ca marche.


Hors ligne


#3 

31-05-2008 11:48:33

Perceval
Membres
Avatar de Perceval
Date d'inscription:
Messages: 105
IP: 90.32.236.187
Courriel

La classe IAnimatedMeshSceneNode dérive de la classe ISceneNode. Tu fais ce qu'on appelle un "cast" en C++, c'est-à-dire que tu dis au compilateur "cet objet est un IAnimatedMeshSceneNode", donc si ton objet est vraiment un IAnimatedMeshSceneNode , c'est normal que ca marche sans problème.
Par contre, si l'ISceneNode que tu récupères n'est pas aussi un IAnimatedMeshSceneNode , tu risques de te prendre des erreurs à l'exécution.
Le cast est donc très pratique, mais à manipuler avec précaution smile


Hors ligne


#4 

31-05-2008 12:36:14

nikska
Membres
Date d'inscription:
Messages: 36
IP: 82.239.138.147
Courriel

Ok merci pour ces précisions,
Je débute en c++, j'avais mit de coté le chapitre sur cette histoire de cast mais maintenant, je pense pouvoir les utiliser correctement grâce à cette exemple. Il y a encore pas mal de thème que je maitrise pas bien en c++ et irrlicht semble les utiliser tous lol.


Hors ligne


#5 

31-05-2008 15:09:21

Aranoth
Membres
Avatar de Aranoth
Date d'inscription:
Messages: 242
IP: 90.60.92.182
Courriel  Site web

lol bon je crois que j'ai trouvé la solution à mon problème :
Pour convertir : ((scene::IAnimatedMeshSceneNode*) unSceneNode)
Pour récupéré la pointeur de cette conversion : scene::IAnimatedMeshSceneNode* nouveauSceneNode = ((scene::IAnimatedMeshSceneNode*)selectedSceneNode);

Utilise plutôt les vrais casts du C++ :
IAnimatedMeshSceneNode* nouveauSceneNode = reinterpret_cast< IAnimatedMeshSceneNode* > ( selectedSceneNode );

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
200 invités en ligne
membre en ligne: -
RSS Feed