Bonsoir,

J'ai encore un petit soucis lors de mon impl�mentation d'un syst�me d'octree. Je vais essayer d'�tre clair m�me si �a va �tre assez compliqu�.

En gros, l'octree est un arbre, et chaque noeud poss�de ses propres donn�es de type T (d�fini par l'argument template). Ici, j'y stocke des objets Spheres *, donc T = Spheres *. Afin que chaque objet Spheres * puisse savoir dans quel noeud il se trouve, d�s que j'ajoute un �l�ment dans un noeud, j'appelle la fonction membre AttachNode de la classe Spheres, comme ceci :

elementToAdd->AttachNode (this, numData++);

Et voici la fonction AttachNode, tr�s simple :

Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
void AttachNode (Octree<Sphere *> * octree, size_t objectID)
{
	octreeNode = octree;
	objID = objectID;
}
ou objID est un size_t, et octreeNode : Octree<Sphere *> * octreeNode;

A l'initialisation, aucun soucis, tout marche bien. Je peux ajouter autant d'�l�ment que je veux, cette fonction est bien appel�, octreeNode pointe bien vers le bon objet... Le probl�me survient lorsque les objets Spheres bougent et, potentiellement, peuvent changer de noeud. J'appelle tout simplement la fonction Update du noeud dans lequel l'objet se trouve :

octreeNode->UpdateElement (objID);

Je commence, dans cette fonction UpdateElement, � r�cup�rer un pointeur vers l'objet Spheres *, gr�ce � l'objID (en effet mes objets sont stock�s dans une map) :

// On r�cup�re en premier lieu un pointeur vers l'objet, gr�ce � l'ID pass� en
// param�tre
const ptrT element = myDataContener [elementID];

ou ptrT n'est qu'un typedef de T, donc = Spheres *. Et myDataContener est une map (dataContener myDataContener, ou dataContener == std::map <size_t, T>).

Dans cette fonction, je souhaite d�placer cet objet au noeud parent.
J'ai v�rifi�, le noeud parent est le bon, pas de soucis l�-dessus. Je me contente de faire un simple :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
 
parent->AddElementInThisNode (element); // On ajoute l'élément dans le noeud parent
 
// Puis on le supprime de la liste de ce noeud sans appeler le destructeur // (puisque le pointeur sera inséré dans un autre noeud)
myDataContener.erase (elementID);
Et enfin, voici la fonction :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
template <typename T>
void Octree<T>::AddElementInThisNode (const ptrT elementToAdd)
{
	elementToAdd->AttachNode (this, numData++);
	myDataContener.insert (std::pair<size_t, ptrT> (numData++, elementToAdd));
}
Les soucis commencent ici, lorsque je rappelle la fonction AttachNode. J'acc�de sans soucis � la fonction, ce qui prouve bien que elementToAdd est un pointeur valide vers un objet Spheres *, mais le soucis, c'est d�s que je veux r�actualiser le pointeur octreeNode :

Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
void AttachNode (Octree<Sphere *> * octree, size_t objectID)
{
	octreeNode = octree;
	objID = objectID;
}
Pour une raison que j'ignore, �a plante irr�m�diablement, alors que �a fonctionnait bien la premi�re fois que je l'appelle... Je ne sais pas d'o� �a vient. J'ai v�rifi� chaque pointeur, chaque �l�ment, ils pointent bien tous vers le bon �l�ment... Mais l� �a plante .

EDIT : Compris... Quand j'ins�rais une donn�e dans ma map, je faisais ocmme �a :

elementToAdd->AttachNode (this, numData++);
myDataContener.insert (std::pair<size_t, ptrT> (numData, elementToAdd));

r�sultat, l'ID attach� � l'objet �tait par exemple 3, tandis que celui associ� � la map pour cet objet, 4... En fait il fallait faire ++numData... Une erreur toute b�te, mais qui m'a g�ch� 2 heures...