1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
/* On fixe le plan qui va supporter les ombres */
shadow.setShadowedFloor(lePlan);
/* NB : le plan est un objet tout simple (un QUAD) */
/* Affecte le stencil buffer pour ce plan : */
shadow.initStencilForFloor();
// AFFICHAGE DU PLAN avec une texture
shadow.drawPlane(my_textures[0]);
/* AFFICHAGE DE LOMBRE */
float objectTranslation[3] = {-20,0,0} ;
glPushMatrix();
shadow.drawShadow(c,0.2,lightPosition, objectTranslation);
glPopMatrix();
// Affichage de l'objet qui cree lombre ......
//Maintenant, detaillons les focntions importantes de la classe ombre :
// (DANS LA CLASSE Shadow)
/* SIMPLEMENT : PLACE 1 dans le Stencil Buffer ou est tracé le plan (sans l'afficher) */
void Shadow::initStencilForFloor(){
/* The shadow will be bounded to the ground */
// Turn off writing to the Color Buffer and Depth Buffer
// We want to draw to the Stencil Buffer only
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
//glDepthMask(GL_FALSE);
glDisable(GL_DEPTH_TEST);
// Enable the Stencil Buffer
glEnable(GL_STENCIL_TEST);
// Set 1 into the stencil buffer
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
glStencilFunc(GL_ALWAYS, 1, 0xffffffff);
// Trace the floor only to set the stencil values to 1
//glCallList(thePlane);
glPushMatrix();
glRotated(-90,1,0,0);
plan.afficheGL();
glPopMatrix();
// Turn on Color Buffer and Depth Buffer
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
//glDepthMask(GL_TRUE);
glEnable(GL_DEPTH_TEST);
glDisable(GL_STENCIL_TEST);
}
/*
Prend un objet cube, une opacité pour l'ombre, la position de la lumiere, et le deplace de l'objet (eventuellement).
Cette fonction se contente de calculer l'objet ombre et de l'afficher.
ON L'affiche uniquement quand le Stencil = 1 (donc ca devrait marcher !!!!).
Or, ca l'affiche sur tout l'ecran. Miséricorde, help !!
*/
void Shadow::drawShadow(Cube c, float opacity, float lightPosition[4], float objectTranslation[4]){
glEnable(GL_STENCIL_TEST);
/* LE TEST QUI DEVRAIT TOUT FAIRE : */
glStencilFunc(GL_EQUAL,1,0x11111111f);
glStencilOp(GL_KEEP,GL_KEEP,GL_KEEP); // indique que le test réussi toujours
/* Ombre semie transparente */
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
/* Couleur de l'ombre */
glColor4f(.5,.5,.5,opacity);
glPushMatrix();
{
/* On se place ds un nveau repere avec la matrice de projection */
glMultMatrixf(matriceProjection(lightPosition));
/* Avoid Z Fighting */
glTranslated(0,0.025,0);
glTranslated(objectTranslation[0], objectTranslation[1], objectTranslation[2]);
/* Dessine l'ombre du cube (soit le cube dans le nveau repere */
c.afficheGL();
}
glPopMatrix();
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
glEnable(GL_LIGHTING);
glDisable(GL_STENCIL_TEST);
} |
Partager