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 :