Création d'un Mesh sous Directx [Résolu]

Itsuki2 13 Messages postés jeudi 24 mars 2005Date d'inscription 23 juin 2007 Dernière intervention - 30 mars 2006 à 23:04 - Dernière réponse : Itsuki2 13 Messages postés jeudi 24 mars 2005Date d'inscription 23 juin 2007 Dernière intervention
- 31 juil. 2006 à 23:19
Bonjour,
Je cherche à créer un Mesh et non pas à en charger un à partir d'un .x
Comme j'ai un peu de mal avec l'anglais, et que la doc fourni dans le SDK est en anglais....
J'ai mon vertex buffer et mon index buffer et l'Attribute Table
J'ai initialisé une Mesh avec 'D3DXCreateMeshFVF'.
Je rempli la Mesh avec le VB, et l'IB.
Je passe par 'SetAttributeTable' pour l'attribute table et ... rien
Mon DrawSubset(0) n'affiche rien.
J'ai cru comprendre qu'il faut passer par Optimize pour créer l'Attribute Buffer... Si quelqu'un connait la solution... Ci dessous mon pitoyable code:

Mesh->LockVertexBuffer(0, &VerticesTmp);
memcpy(VerticesTmp, Vertex.Vertices, sizeof(Vertex.Vertices));
Mesh->UnlockVertexBuffer();
Mesh->LockIndexBuffer(0, &VerticesTmp);
memcpy(VerticesTmp, Index.Vertices, sizeof(Vertex.Vertices));
Mesh->UnlockVertexBuffer();
D3DXATTRIBUTERANGE AttributeTable;
//J'initialise l'Attribute Table etc ...
Et puis
Mesh->SetAttributeTable(&AttributeTable, 1);
Afficher la suite 

Votre réponse

5 réponses

Itsuki2 13 Messages postés jeudi 24 mars 2005Date d'inscription 23 juin 2007 Dernière intervention - 31 juil. 2006 à 23:19
+3
Utile
http://www.codesampler.com/dx9src/dx9src_11.htm#dx9_mesh_attributes



Ouf    :)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Itsuki2
cali70 71 Messages postés mercredi 29 septembre 2004Date d'inscription 19 mars 2008 Dernière intervention - 3 avril 2006 à 11:45
0
Utile
C'est normal, la fonction DrawSubset ne fonctionne qu'avec les objets Mesh implémentés par DirectX chargé depuis un fichier x ou non... Dans ton cas tu dois utiliser une fonction de type DrawPrimitive car j'imagine que tu as crée toi même ton type de Mesh.
Commenter la réponse de cali70
Itsuki2 13 Messages postés jeudi 24 mars 2005Date d'inscription 23 juin 2007 Dernière intervention - 4 avril 2006 à 23:50
0
Utile
Re,
Merci d'avoir répondu si rapidement,
En fait, afficher la mesh, c'était pour savoir si j'avais bien initialisé la mesh à partir du vertex et index buffer.

J'ai besoin de créer un Mesh car D3DXIntersect/D3DXIntersectSub prend en parametre un LPD3DXMESH. (Apres tu me dira, il existe aussi D3DXIntersectTri ..., mais là je vais pas m'amuser à passer tout les triangles à cette fonction.)
En gros, c'est pour me faire un petit "Bounding Mesh".

A noter que DX10 ne propose plus que 'D3DXIntersectTri ', D3DXIntersect est passé aux oubliettes.

Plus têtu que moi y'a pas, mais c'est comme ca que j'avance. Je continue à chercher dans mon coin mais si quelqu'un sait comment faire...
Commenter la réponse de Itsuki2
cali70 71 Messages postés mercredi 29 septembre 2004Date d'inscription 19 mars 2008 Dernière intervention - 5 avril 2006 à 14:19
0
Utile
Ta manipulation des vertex et index buffer ne me semble pas tout à fait correct... pour mieux t'éclairer voici un exemple de code :


// format de sommets


typedef struct { D3DVECTOR Pts; } VERTEX;


// tableau de sommets et d’indices à recopier dans les buffers


D3DVECTOR P0={-.3f,-.3f,-.3f}, P1={0.f,1.f,0.f}, P2={1.f,0.f,0.f}, P3={0.f,0.f,1.f};


VERTEX vbuf[4] = { {P0}, {P1}, {P2}, {P3} };


USHORT ibuf[4*3] = {0,1,2, 0,3,1, 0,2,3, 1,3,2};


// création du mesh


LPD3DXMESH pMSH;


D3DXCreateMeshFVF(4, 4, D3DXMESH_MANAGED, D3DFVF_XYZ, pDEV, pMSH);


void *p;


// remplissage du vertex buffer


pMSH->LockVertexBuffer(0, (void**)&p);


memcpy(p,(void *)vbuf, 4*sizeof(VERTEX) );


pMSH->UnlockVertexBuffer();


// remplissage du index buffer


pMSH->LockIndexBuffer(0, (void**)&p);


memcpy(p,(void *)ibuf, 4*3*sizeof(USHORT) );


pMSH->UnlockIndexBuffer();


// remplissage du attribute buffer


pMSH->LockAttributeBuffer(0, (DWORD **)&p);


memset(p,0,4*sizeof(DWORD)); // on met toutes les valeurs à 0


pMSH->UnlockAttributeBuffer();
Commenter la réponse de cali70
Itsuki2 13 Messages postés jeudi 24 mars 2005Date d'inscription 23 juin 2007 Dernière intervention - 5 avril 2006 à 18:48
0
Utile
Encore merci,
Là comme j'ai installé DX10 sdk et que j'ai pas Windows vista mais 2000 Pro... mon SDK ne marche pas du tout lol. Pas pu programmer de la semaine
Si je regarde ton exemple, tu proposerai de faire un ZeroMemory sur l'attribute Buffer ? Je testerai :)
Quant à mon bout de code... ce sont des classes que j'ai initialisé auparavant.
Donc c'est normal que ca te semble bizarre étant donné que tu avais pas tout les elements
template <class TYPE_BUFFER, class STRUCT_FVF> class PRIMITIVE_BUFFER // IDirect3DVertexBuffer9, IDirect3DIndexBuffer9
{
public:
void Init_Vertex_Buffer(IDirect3DDevice9* , DWORD La_FVF, int Taille_Du_Vertex_Buffer);
void Fill_Vertex_Buffer(void);
void Draw_Vertex_Buffer(IDirect3DDevice9 *Device9, D3DPRIMITIVETYPE Style, int Nb_Vertex,
IDirect3DIndexBuffer9 *Index_Buffer, int Nb_Triangle);
void Init_Index_Buffer(IDirect3DDevice9 *Device9, int Nb_Vertex);
void Release(void);
STRUCT_FVF *Vertices; // est initialisé avec Init_Vertex_Buffer etc ...
int Size;
DWORD FVF;
TYPE_BUFFER *Primitive_Buffer;
PRIMITIVE_BUFFER<TYPE_BUFFER, STRUCT_FVF>()
{
Vertices = NULL;
Size = 0;
FVF = NULL;
}
};
Par contre je viens de voir qu'il y a des problèmes dans mon code ...hum...
memcpy(VerticesTmp, Index.Vertices, sizeof(Index.Vertices));
Ca m'énerve, de pas pouvoir le tester !!!
Je posterai dés que j'aurai réinstaller DX9.
Encore Merci cali70 :) Si tu as des souci, j'espère pouvoir te venir en aide aussi
Commenter la réponse de Itsuki2

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.