bien, je suis donc en train de code un petit exo de manipulation sur les VB/IB pour m´entrainer.
Je n´arive bien evidemment pas à le faire fonctionner...
Ce que je voudrais c´est : charger un mesh (.x), puis :
// Recuperer les infos sur les vertices:
1/ Recup VB et IB du mesh
2/ "extraire" les infos sur mes vertices de ce couple VB/IB, et les mettre dans un tableau (les indices et les vertex)
//Reconstruire à la main d´autres VB/IB
1/ A partir des tableaux construits créer VBbuild et IBbuild tout en respectant la géométrie initiale.
// Afficher en primitives
1/Donner à manger à ma carte graph mon VBbuild et mon IBbuild et dessiner en primitives, avec nbIndice/3 primitives.
Donc en clair je voudrais me compliquer le vie pour le plaisir, juste pour etre capable de mettre les mains dans les VB/IB.
Et pour l´instant, le code me génère une exception non rattrapée (Unhandled exception + adresse mémoire) et ca foire sur la ligne où je fais le DrawIndexedPrimitive().
Je poste le code, il est asser succint, j´en peu plus d´etre noob, faut que je comprenne une bonne fois pour toute !
/* code du chargement */
Map.Init(MyEngine.Device, "cube.x", NULL);
Map.SetPosition(D3DXVECTOR3(2.0f, 1.0f, 3.0f));
// On extrait les données
LPDIRECT3DVERTEXBUFFER9 vertexBuffer;
LPDIRECT3DINDEXBUFFER9 indexBuffer;
CUSTOMVERTEX* _vb;
WORD* _ib;
CUSTOMVERTEX* tableauVertex[20000];
int tableauVertex_size = 0;
WORD tableauIndices[60000];
int tableauIndices_size = 0;
Map.Mesh->GetVertexBuffer(&vertexBuffer);
Map.Mesh->GetIndexBuffer(&indexBuffer);
vertexBuffer->Lock(0, 0, (void**)&_vb, D3DLOCK_READONLY);
indexBuffer->Lock(0, 0, (void**)&_ib, D3DLOCK_READONLY);
int MaxVert = Map.Mesh->GetNumVertices();
int MaxInd = Map.Mesh->GetNumFaces() * 3;
for(int i=0; i<MaxInd; i++)
{
int Present = DejaPresent( _vb[ _ib[ i ] ], tableauVertex, tableauVertex_size);
if( Present == (-1) )
{
tableauVertex[tableauVertex_size] = &_vb[ _ib[i] ]; // _vb[] possede des elements de type CUSTOM et tableauVertex des pointeurs de CUSTOM, donc on prend l´adresse (&) !
tableauIndices[tableauIndices_size] = tableauVertex_size;
tableauVertex_size +=1;
tableauIndices_size +=1;
}
else
{
tableauIndices[tableauIndices_size] = Present;
tableauIndices_size +=1;
}
}
// On reconstruit les VB/IB
CUSTOMVERTEX* _vb_build = NULL;
WORD* _ib_build = NULL;
MyEngine.Device->CreateVertexBuffer(tableauVertex
_size * sizeof(CUSTOMVERTEX), D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &vertexBufferBuild, 0);
MyEngine.Device->CreateIndexBuffer(tableauIndices
_size * sizeof(WORD), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &indexBufferBuild, 0);
vertexBufferBuild->Lock(0, 0, (void**)&_vb_build, D3DLOCK_DISCARD);
indexBufferBuild->Lock(0, 0, (void**)&_ib_build, D3DLOCK_DISCARD);
for(int j=0; j<tableauVertex_size; j++)
{
_vb_build[j] = *tableauVertex[j]; // TableauVertex est un tableau de pointeurs : on déréference donc car _vb_build c´est un tableau de CUSTOM ! (type CUSTOMVERTEX* -> tableau de CUSTOM) !
}
for(int k=0; k<tableauIndices_size; k++)
{
_ib_build[k] = tableauIndices[k];
}
nbrVertex = tableauVertex_size;
nbrIndices = tableauIndices_size;
/* Fin du code de chargement */
/* code du dessin */
// On affiche les VB/IB construit en tant que primitives qui vont bien !
MyEngine.Device->SetStreamSource( 0, vertexBufferBuild, 0, 0);
MyEngine.Device->SetIndices(indexBufferBuild);
MyEngine.Device->SetFVF(D3DFVF_CUSTOMVERTEX);
MyEngine.Device->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, nbrVertex - 1, 0, static_cast<int> (nbrIndices / 3));
/* fin du code de dessin */
Et je précise que Map est une instance de ObjetStatic, qui possède une methode Init() qui s´occupe du chargement bete et mechant de mon mesh par D3DXLoadMeshFromX().
Dernier détail : ma fonction dejaPresent :
int DejaPresent(CUSTOMVERTEX vert, CUSTOMVERTEX* tableau[], int taille)
{
int DejaPresent = (-1);
for(int i=0; i< taille; i++)
{
if (( fabs(vert.x - tableau[i]->x ) < Epsilon )
&& ( fabs(vert.y - tableau[i]->y ) < Epsilon )
&& ( fabs(vert.z - tableau[i]->z ) < Epsilon )
&& ( fabs(vert.color - tableau[i]->color ) < Epsilon )
&& ( fabs(vert.tu - tableau[i]->tu ) < Epsilon )
&& ( fabs(vert.tv - tableau[i]->tv ) < Epsilon ))
{
DejaPresent = i;
break;
}
else
{
DejaPresent = (-1);
}
}
return(DejaPresent);
}
qui me permet de determiner si j´ai deja ajouté un vertex ds un tableau (-1 si ce n´est pas le cas) si c´est le cas, renvoit l´indice de ce vertex dans ce fameux tableau.
Ha oui, encore un truc, lorsque je piste l´évolution de mon programme sur un cube, tout beigne lors de "l´extraction" des données depuis mes VB/IB initiaux : j´ajoute bien 8 vertex dans mon tableau (donc ma fonction DejaPresent marche, sinon j´en ajouterais 36).
Je pige pas pourquoi la primitive n´est pas valide en fait.
Voila, j´espere que vous allez pouvoir eclairer mes lanternes eteintes !
Merci à tous et encore une fois pardon pour mes posts à ralonge...