#0 

12-10-2013 09:39:27

Memorial76
Membre
Date d'inscription: 19-02-2010
Messages: 67

Bonjour,
j'ai une scène dans laquelle un EmptySceneNode d'identifiant 0 (zéro) a des SceneNode filles dont les identifiants vont de 0 à n

Lorsque je veux redessiner ces éléments j'appelle cette fonction:


void CDrawTactical::updateHexagone(int nId, bool bVegetation)
{
    scene::ISceneNode* pParent = m_pSceneMgr->getSceneNodeFromId(ID3D_CASE_PARENT);
    scene::ISceneNode* pNodeHex = m_pSceneMgr->getSceneNodeFromId(nId, pParent);
    createHexagone(pParent, nId, bVegetation);
    if( bVegetation )
        createHexagoneHighVegetation(nId);
    pNodeHex->remove();
}


dans l'ordre:
->stock le fameux EmptySceneNode d'identifiant 0 dans pParent, stock le SceneNode fille d'identifiant nId dans pNodeHex en commençant la recherche sur les enfants de pParent. (Pour info, les SceneNode sont des CustomSceneNode)
->crée un nouveau SceneNode par la fonction createHexagone(...)
->supprime l'ancien SceneNode (pNodeHex)

Tout fonctionne très bien SAUF pour le pNodeHex d'identifiant 0 où c'est (à priori pParent qui est supprimé) et non le pNodeHex d'identifiant 0 (avec pour résultat la suppression de tous les SceneNodes sauf 1: le nouveau SceneNode d'identifiant 0)

Je vois deux causes possibles soit un problème de pointeur qui ne pointe plus là où je pense, soit un problème de la fonction getSceneNodeFromId qui inclue dans sa recherche le node "pParent" qui est donc retourné en lieu et place du pNodeHex d'identifiant 0 voulu...

Merci d'avance à ceux qui pourront éclairer mes lanternes.

Hors ligne


#1 

12-10-2013 11:13:52

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Normal qu'il supprime ton parent. Il commence à pParent et celui-ci à son ID = 0.

Diriges toi plutôt vers ISceneNode::getChildren ()" qui te renvoie une liste des enfant de ton node.

Code c++ :


ISceneNode* getChildByID(ISceneNode* parent, u32 IDenfant)
{
    list<ISceneNode*> liste_enfants = nParent->getChildren();

    for(u32 a=0; a < liste_enfants.size(); a++)
        if(liste_enfants[a].getID() == IDenfant)
             return liste_enfants[a];

    return NULL;
}

core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#2 

12-10-2013 11:37:58

Memorial76
Membre
Date d'inscription: 19-02-2010
Messages: 67

Merci, cela pourrait être une solution mais j'aimerai éviter d'avoir à parcourir tous les Nodes Fils à chaque appel...

Hors ligne


#3 

12-10-2013 12:33:49

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Tu n'as pas d'autres choix que de parcourir les enfants (pas forcément tous car il s'arrête lorsque qu'il a trouvé l'enfant), c'est d'ailleurs ce que fait "getSceneNodeFromId". Il n'y a pas de miracle, pour trouver faut chercher dans la liste.
Maintenant, pourquoi ne fait tu pas un update de tous les enfants d'un node en un seul appel. Ce serait trop lourd?

Un truc du genre:

Code c++ :


list<ISceneNode*> liste_enfants = nParent->getChildren();
for(u32 a=0; a < liste_enfants.size(); a++)
    updateHexagone(liste_enfants[a], vegetation);

void CDrawTactical::updateHexagone(ISceneNode* pNodeHex, bool bVegetation) // remplacement de nID par le pointeur sur le node
{
    createHexagone(pParent, pNodeHex, bVegetation); // remplacement de nID par le pointeur sur le node
    if( bVegetation )
        createHexagoneHighVegetation(pNodeHex); // remplacement de nID par le pointeur sur le node
    pNodeHex->remove();
}


De cette façon, tu ne parcours qu'une fois la liste et tu envoies directement le pointeur sur le node au lieu de l'ID.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#4 

12-10-2013 12:42:07

Memorial76
Membre
Date d'inscription: 19-02-2010
Messages: 67

Ceci est en effet fait dans une autre fonction faisant appel à celle-ci.
Mais, dans le cs présent, le node est mis à jour à l'issue d'un clic dessus.

Je vais donc m'orienter vers ta solution

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
882 membres
1429 sujets
11119 messages
Dernier membre inscrit: LiseBuisson96
50 invités en ligne
Aucun membre connecté
RSS Feed