Les effets de lumière

La fonction lumiere permet de créer une lumière dans la scène. Il en existe trois types : la lumière diffusée par un point, le spot et la lumière directionnelle.

La variable ID correspond au numéro d'identifiant de la lumière
Les variables r, v et b permettent de définir la couleur de la lumière
Le vecteur direction, est le vecteur indiquant la direction d'émission

Init_lumiere permet d'initialiser les lumières.
Et allumer_lum permet d'activer la lumière désirée à partir de son numéro d'identifiant.

Ici on aura une lumiere directionnelle émise à partir de l'arrière du module qui éclairera la scène. Le vecteur directionnel à pour norme 1 puisque
         ________
N = \/ x² +y² +z² = 1

avec vect_ = ( x, y; z )

x = 0
y = - racine carrée de 1/2
z = racine carrée de 1/2

#include "decl_effets.h"

void lumiere(unsigned char ID, unsigned char typ, unsigned int r, unsigned int v, unsigned int b, D3DVECTOR direction, float distance, LPDIRECT3DDEVICE9 *_obj_Direct3DDevice) {

D3DLIGHT9 lumiere;
ZeroMemory(&lumiere, sizeof(D3DLIGHT9));

switch(typ) {

case 0:
lumiere.Type = D3DLIGHT_POINT;
break;
case 1:
lumiere.Type = D3DLIGHT_SPOT;
break;
case 2:
lumiere.Type = D3DLIGHT_DIRECTIONAL;
break;
default :
lumiere.Type = D3DLIGHT_DIRECTIONAL;
break;
}

lumiere.Diffuse.r = r;
lumiere.Diffuse.g = v;
lumiere.Diffuse.b = b;

lumiere.Direction.x = direction.x;
lumiere.Direction.y = direction.y;
lumiere.Direction.z = direction.z;

lumiere.Range = distance;

(*_obj_Direct3DDevice)->SetLight(ID, &lumiere);

}

void Init_lumiere(LPDIRECT3DDEVICE9 *_obj_Direct3DDevice) {

//indique d'inclure la lumière dans le rendu total de la scène
(*_obj_Direct3DDevice)->SetRenderState(D3DRS_LIGHTING, TRUE);

//activation de la lumière ambiante
(*_obj_Direct3DDevice)->SetRenderState(D3DRS_AMBIENT, 0x00202020);

}

void allumer_lum(unsigned char ID, LPDIRECT3DDEVICE9 *_obj_Direct3DDevice) {

(*_obj_Direct3DDevice)->LightEnable(ID, TRUE);
}

Ces fonctions sont à rajouter dans effets.cpp

Dans decl_effets.h on aura

#include <d3d9.h>

void lumiere(unsigned char, unsigned char, unsigned int, unsigned int, unsigned int, D3DVECTOR, float, LPDIRECT3DDEVICE9*);
void Init_lumiere(LPDIRECT3DDEVICE9*);
void allumer_lum(unsigned char, LPDIRECT3DDEVICE9*);

Dans la fonction rendu du fichier principal .cpp on aura :

VOID Rendu(unsigned int param, LPDIRECT3DDEVICE9 *D3DD, _module_ *rp, _module_ *rp2, _mesh_ *mtm_modulea, _mesh_ *mtm_laby, _mesh_ *mtm_missile, _mesh_ *mtm_moduleb, clavier *etm)
{

D3DVECTOR vect_ = {0.0f, -.707f, .707f};
...

obj2device_dessin_mesh(mtm_modulea->nbr_de_mat, mtm_modulea, &(*D3DD), &mtm_modulea->obj_mesh);

Init_lumiere(&(*D3DD));
lumiere(0, 2, 1, 1, 1, vect_, 1000.0f, &(*D3DD));
allumer_lum(0, &(*D3DD));

// fin de la scène
(*D3DD)->EndScene();

Maintenant si vous compilez et si vous exécutez vous devriez pouvoir apercevoir les deux modules

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