Chargement des mesh

Dans decl_mesh.h on a le code suivant :

#include <d3dx9mesh.h>

_mesh_ *charge_mesh(char*, LPDIRECT3DDEVICE9 *);

Dans un nouveau fichier mesh.c on a le code suivant :

#include "mesh.h"
#include "decl_mesh.h"

_mesh_ *charge_mesh(char *fichier, LPDIRECT3DDEVICE9 *_obj_Direct3DDevice) {

_mesh_ *mtm = new _mesh_;

// charge le fichier Mesh
LPD3DXBUFFER Mat_buff = NULL; //matériaux du mesh buffeurisés
if(FAILED(D3DXLoadMeshFromX((const char*)fichier, D3DXMESH_SYSTEMMEM, *_obj_Direct3DDevice, NULL, &Mat_buff, NULL, &mtm->nbr_de_mat, &mtm->obj_mesh)))
return NULL;

// extraction des propriétés des matériaux
D3DXMATERIAL *Prop_Mat = (D3DXMATERIAL*)Mat_buff->GetBufferPointer();

mtm->Materiaux = new D3DMATERIAL9[mtm->nbr_de_mat];
mtm->Textures = new LPDIRECT3DTEXTURE9[mtm->nbr_de_mat];

for(unsigned int i = 0; i<mtm->nbr_de_mat; i++) {
mtm->Materiaux[i] = Prop_Mat[i].MatD3D; // copie des matériaux
mtm->Materiaux[i].Ambient = mtm->Materiaux[i].Diffuse; // definit la couleur ambiante du materiel

// création de la texture

if( Prop_Mat[i].pTextureFilename == NULL)
mtm->Textures[i]=NULL;
else
if(FAILED(D3DXCreateTextureFromFile(*_obj_Direct3DDevice, Prop_Mat[i].pTextureFilename, &(mtm->Textures[i]))))
mtm->Textures[i]=NULL;

}

// libération du mesh buffeurisé
if(Mat_buff)
Mat_buff->Release();

return mtm;

}

Il est nécessaire d'avoir un buffer de matériaux pour stocker l'ensemble des matériaux et des textures.
Le chargement du mesh est effectué grâce à la méthode D3DXLoadMeshFromX.

Le premier paramètre est le nom du fichier.
Le deuxième paramètre indique à Direct3D la façon de créer le mesh. D3DXMESH_SYSTEMMEM indique à Direct3D de mettre les coordonnées dans la mémoire centrale et non dans la carte vidéo.
Le troisième paramètre est l'objet périphérique Direct3D utilisé pour rendre le mesh.
Le quatrième paramètre est un objet de type ID3DXBuffer contenant les voisins entre chaque face. Ici il vaut NULL.
Le cinquième paramètre contient les matériaux du mesh ; il est du type ID3DXBuffer.
Le sixième paramètre contient le nombre de matériaux placés dans l'objet.

GetBufferPointeur permet de récupérer le buffer de matériaux.
Les nouveaux matériaux et les nouvelles textures sont alors créés.
Diffuse permet de définir la couleur ambiante.
D3DXCreateTextureFromFile permet de créer la texture.

La fonction est appelée dans le main ainsi :

#include <timer.h>
#include <effets.h>
#include <D3D_def.h>
#include <cam_mde.h>
#include <superbat.h>

#include "mesh.h"
#include "decl_mesh.h"


#define LONG_FENETRE 300
#define LARG_FENETRE 300

_mesh_ *mtm[8];

...

module2->position_cam.x = 0.0f;
module2->position_cam.y = 0.0f;
module2->position_cam.z = -70.0f;
module2->monde = identite();
module2->rot_cam = 0.0f;
module2->coef_rotation_module = 0.0f;
module2->coef_vitesse_module = 0.0f;
module2->coef_cam = 0.0f;
module2->module_rot = 0.0f;
module2->coord_0.x = 0.0f;
module2->coord_0.y = 0.0f;
module2->coord_0.z = -50.0f;
module2->rayon = 20.0f;
module2->coord_0.z = -50.0f;
module2->coord_0.x = 0.0f;
module2->collision = 0;
module2->missile = NULL;

// création des différents mesh

char chemin[4][10] = {"module.x", "module2.x", "laby.x", "missile.x"};

unsigned int i, k = 0;

for(i = 0; i<8; i+=2) {
mtm[i] = charge_mesh(chemin[k], &obj_Direct3DDevice);
if(mtm[i]==NULL)
return -1;

mtm[i+1] = charge_mesh(chemin[k], &obj_Direct3DDevice2);
if(mtm[i+1]==NULL)
return -1;
k++;
}

ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
...

IL ne peut y avoir qu'un seul mesh par périférique, donc un mesh labyrinthe pour le joueur 1 et un mesh labyrinthe différent pour le joueur 2.
Les mtm paires correspondent au joeur 1.
Les mtm impaires au joeur 2.

Ensuite, dans la fonction Cleanup, toujours dans le fichier principal .cpp, nous libérons la mémoire pour les matériaux, la texture et les mesh.

VOID Cleanup()
{
if( obj_Direct3DDevice != NULL) 
obj_Direct3DDevice->Release();

if( obj_Direct3D != NULL)
obj_Direct3D->Release();

if( obj_Direct3DDevice2 != NULL) 
obj_Direct3DDevice2->Release();

if( obj_Direct3D2 != NULL)
obj_Direct3D2->Release();

unsigned int i;
for (i = 0; i<8; i++) {
if (mtm[i]->Materiaux)
delete[] mtm[i]->Materiaux;

if (mtm[i]->Textures) {
for(unsigned int j=0; j<mtm[i]->nbr_de_mat; j++)
if (mtm[i]->Textures[j])
mtm[i]->Textures[j]->Release();
delete[] mtm[i]->Textures;
}

if(mtm[i]->obj_mesh)
mtm[i]->obj_mesh->Release();

}
}

Téléchargez la source, cliquez ci-dessous :