• 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écautionsmile


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


OptionsLiens officielsCaractéristiquesStatistiquesCommunauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1441 sujets
11339 messages
Dernier membre inscrit: Saidov17
74 invités en ligne
membre en ligne: -
RSS Feed