diff --git a/lab3/.DS_Store b/lab3/.DS_Store
index c1089f55cc2382a3ea2ca9c13934628f963253b8..6a589efbddcf5c56c9cdd997da7ebe603cd0d1e5 100644
Binary files a/lab3/.DS_Store and b/lab3/.DS_Store differ
diff --git a/lab3/src/lab3.html b/lab3/src/lab3.html
index 1ee517265bb34cb56495561336e72dc847582ffa..e4e5f26d70f77a45f1d0d6fc69d146bcbbdb0873 100644
--- a/lab3/src/lab3.html
+++ b/lab3/src/lab3.html
@@ -7,8 +7,9 @@
 <body onload="main()">
 
 
-  <input type="radio" name="myRadios" onclick="handleClick(this);" value="0" checked /> Directionnelle 
+  <input type="radio" name="myRadios" onclick="handleClick(this);" value="0" /> Directionnelle 
   <input type="radio" name="myRadios" onclick="handleClick(this);" value="1" /> Ponctuelle <br/>
+  <input type="radio" name="myRadios" onclick="handleClick(this);" value="2" checked  /> Directionnelle sans effect spectaculaire <br/>
   
        <input type="checkbox" id="camx" name="camx" onclick="getCamera();"value="camx" />Cam X  
         <input type="checkbox" id="camy" name="camy" 
diff --git a/lab3/src/lab3.js b/lab3/src/lab3.js
index 1e0e6f6c25d40572ff2951ddb04985e177129aea..58c2956ede8f3a41b5b867b3be0b2204dde2997e 100644
--- a/lab3/src/lab3.js
+++ b/lab3/src/lab3.js
@@ -5,14 +5,54 @@ var VSHADER_SOURCE =
   'attribute vec4 a_Color;\n' +
   'attribute vec4 a_Normal;\n' +
   'uniform mat4 u_MvpMatrix;\n' +
-  'uniform mat4 u_PlanMatrix;\n' +
   'uniform mat4 u_NormalMatrix;\n' +
   'uniform vec3 u_LightDirection;\n' +
   'varying vec4 v_Color;\n' +
   'void main() {\n' +
+  'vec3 to_light;\n' +
+  'vec3 vertex_normal;\n' +
+  'vec3 reflection;\n' +
+  'float cos_angle;\n' +
+  'vec3 specular_color;\n' +
+  'vec3 object_color;\n' +
+
   '  gl_Position = u_MvpMatrix * a_Position ;\n' +
   '  vec4 normal = u_NormalMatrix * a_Normal;\n' +
   '  float nDotL = max(dot(u_LightDirection, normalize(normal.xyz)), 0.0);\n' +
+  '  vec3 lightDirection = normalize (vec3(u_LightDirection));\n' +
+  '  vec3 normalref = normalize(vec3(u_NormalMatrix * a_Normal));\n' +
+  'reflection =2.0 * dot(normalref,lightDirection) * normalref - lightDirection;\n' +
+  'reflection=normalize(reflection);\n' +
+  'cos_angle=dot(reflection,lightDirection);\n' +
+  'cos_angle=clamp(cos_angle,0.0,1.0);\n' +
+
+  'if (cos_angle > 0.0) {\n' +
+
+  'specular_color=vec3(1.0,1.0,1.0) * cos_angle;\n' +
+  '} else {\n' +
+  'specular_color=vec3(0.0,0.0,0.0); }\n' +
+
+  '  v_Color = vec4(a_Color.xyz * nDotL +specular_color , a_Color.a);\n' +
+  '}\n';
+
+
+var VSHADER_D =
+  'attribute vec4 a_Position;\n' +
+  'attribute vec4 a_Color;\n' +
+  'attribute vec4 a_Normal;\n' +
+  'uniform mat4 u_MvpMatrix;\n' +
+  'uniform mat4 u_NormalMatrix;\n' +
+  'uniform vec3 u_LightDirection;\n' +
+  'varying vec4 v_Color;\n' +
+  'void main() {\n' +
+
+
+  '  gl_Position = u_MvpMatrix * a_Position ;\n' +
+  '  vec4 normal = u_NormalMatrix * a_Normal;\n' +
+  '  float nDotL = max(dot(u_LightDirection, normalize(normal.xyz)), 0.0);\n' +
+  '  vec3 lightDirection = normalize (vec3(u_LightDirection));\n' +
+  '  vec3 normalref = normalize(vec3(u_NormalMatrix * a_Normal));\n' +
+
   '  v_Color = vec4(a_Color.xyz * nDotL, a_Color.a);\n' +
   '}\n';
 
@@ -57,21 +97,38 @@ var PONCTVERT =
   'uniform vec3 u_AmbientLight;\n' +   // Ambient light color
   'varying vec4 v_Color;\n' +
   'void main() {\n' +
+
+  'vec3 to_light;\n' +
+  'vec3 vertex_normal;\n' +
+  'vec3 reflection;\n' +
+  'float cos_angle;\n' +
+  'vec3 specular_color;\n' +
+  'vec3 object_color;\n' +
+
   '  gl_Position = u_MvpMatrix * a_Position;\n' +
-  // Recalculate the normal based on the model matrix and make its length 1.
   '  vec3 normal = normalize(vec3(u_NormalMatrix * a_Normal));\n' +
-  // Calculate world coordinate of vertex
   '  vec4 vertexPosition = u_ModelMatrix * a_Position;\n' +
-  // Calculate the light direction and make it 1.0 in length
   '  vec3 lightDirection = normalize(u_LightPosition - vec3(vertexPosition));\n' +
-  // Calculate the dot product of the normal and light direction
   '  float nDotL = max(dot(normal, lightDirection), 0.0);\n' +
-  // Calculate the color due to diffuse reflection
   '  vec3 diffuse = u_LightColor * a_Color.rgb * nDotL;\n' +
-  // Calculate the color due to ambient reflection
   '  vec3 ambient = u_AmbientLight * a_Color.rgb;\n' +
-  // Add the surface colors due to diffuse reflection and ambient reflection
-  '  v_Color = vec4(diffuse + ambient, a_Color.a);\n' +
+
+  'reflection =2.0 * dot(normal,lightDirection) * normal - lightDirection;\n' +
+  'reflection=normalize(reflection);\n' +
+
+  'cos_angle=dot(reflection,lightDirection);\n' +
+  'cos_angle=clamp(cos_angle,0.0,1.0);\n' +
+
+
+
+  'if (cos_angle > 0.0) {\n' +
+  'specular_color=u_LightColor * cos_angle;\n' +
+  'diffuse=diffuse * (1.0 -cos_angle );\n' +
+
+  '} else {\n' +
+  'specular_color=vec3(0.0,0.0,0.0); }\n' +
+
+  '  v_Color = vec4(diffuse + ambient + specular_color , a_Color.a);\n' +
   '}\n';
 
 // Fragment shader program
@@ -79,27 +136,35 @@ var PONCFRAG =
   '#ifdef GL_ES\n' +
   'precision mediump float;\n' +
   '#endif\n' +
+  'uniform vec3 u_Light_position;\n' +
+  'uniform vec3 u_Light_color;\n' +
+  'uniform float u_Shininess;\n' +
+  'varying vec3 v_Vertex;\n' +
+  'varying vec3 v_Normal;\n' +
   'varying vec4 v_Color;\n' +
   'void main() {\n' +
+
+
   '  gl_FragColor = v_Color;\n' +
   '}\n';
 
 var normalsBas = new Float32Array([    // Normal Bas
-  0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0,  // v0-v1-v2-v3 front
-  1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,  // v0-v3-v4-v5 right
-  0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,  // v0-v5-v6-v1 up
-  -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0,  // v1-v6-v7-v2 left
-  0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0,  // v7-v4-v3-v2 down
-  0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0   // v4-v7-v6-v5 back
+  0.5, 0.2, 0.5, 0, 0.2, 0.5, -0.5, -1.0, 1.0, 1.0, -1.0, 1.0, //font
+  0.5, 0.2, 0.5, 1.0, -1.0, 1.0, 1.0, -1.0, -0.5, 0.5, 0.2, 0,     //right
+  0.5, 0.2, 0.5, 0.5, 0.2, 0, 0, 0.2, 0, 0, 0.2, 0.5,                 //up
+  -0.5, 0.2, 0.5, -1, 0.2, 0, -1, -1.0, -0.5, -0.5, -1.0, 1.0,     //left 
+  -0.5, -1.0, -1, 1.0, -1.0, -0.5, 1.0, -1.0, 1.0, -0.5, -1.0, 1.0,   //down
+  1.0, -1.0, -0.5, -0.5, -0.5, -0.5, 0, 0.1, -1.0, 0.5, 0.2, -1.0     //back
 ]);
 
 var normalsHaut = new Float32Array([    // Normal Haut
-  0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0,  // v0-v1-v2-v3 front
-  -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0,  // v0-v3-v4-v5 right
-  0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,  // v0-v5-v6-v1 up
-  1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,  // v1-v6-v7-v2 left
-  0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0,  // v7-v4-v3-v2 down
-  0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0   // v4-v7-v6-v5 back
+  0.5, 0.2, 0.5, 0, 0.2, 0.5, -0.5, -1.0, 1.0, 1.0, -1.0, 1.0, //font
+  0.5, 0.2, 0.5, 1.0, -1.0, 1.0, 1.0, -1.0, -0.5, 0.5, 0.2, 0,     //right
+  -0.5, -1.0, -1, 1.0, -1.0, -0.5, 1.0, -1.0, 1.0, -0.5, -1.0, 1.0,   //down
+  -0.5, 0.2, 0.5, -1, 0.2, 0, -1, -1.0, -0.5, -0.5, -1.0, 1.0,     //left 
+  0.5, 0.2, 0.5, 0.5, 0.2, 0, 0, 0.2, 0, 0, 0.2, 0.5,                 //up
+  1.0, -1.0, -0.5, -0.5, -0.5, -0.5, 0, 0.1, -1.0, 0.5, 0.2, -1.0     //back
+
 ]);
 
 // Retrieve <canvas> element
@@ -110,7 +175,7 @@ var camZ = 0;
 var lumPosX = 0;
 var lumPosY = 0;
 var lumPosZ = 1;
-var mode = 0;
+var mode = 2;
 function main() {
   handleClick;
   draw();
@@ -118,8 +183,11 @@ function main() {
 
 }
 
+
 function draw() {
 
+
+
   // Get the rendering context for WebGL
   var gl = getWebGLContext(canvas);
   if (!gl) {
@@ -137,6 +205,7 @@ function draw() {
     return;
   }
 
+  // dicrectionnelle
   var sabProgram = createProgram(gl, VSHADER_SOURCE, FSHADER_SOURCE);
   sabProgram.a_Position = gl.getAttribLocation(sabProgram, 'a_Position');
   sabProgram.a_Color = gl.getAttribLocation(sabProgram, 'a_Color');
@@ -145,6 +214,15 @@ function draw() {
   sabProgram.u_LightDirection = gl.getUniformLocation(sabProgram, 'u_LightDirection');
 
 
+  // directionnelle sans effect spectaculaire
+  var sabSanSpect = createProgram(gl, VSHADER_D, FSHADER_SOURCE);
+  sabSanSpect.a_Position = gl.getAttribLocation(sabSanSpect, 'a_Position');
+  sabSanSpect.a_Color = gl.getAttribLocation(sabSanSpect, 'a_Color');
+  sabSanSpect.u_MvpMatrix = gl.getUniformLocation(sabSanSpect, 'u_MvpMatrix');
+  sabSanSpect.u_NormalMatrix = gl.getUniformLocation(sabSanSpect, 'u_NormalMatrix');
+  sabSanSpect.u_LightDirection = gl.getUniformLocation(sabSanSpect, 'u_LightDirection');
+
+
   // POINCTUEL
   var poncProgram = createProgram(gl, PONCTVERT, PONCFRAG);
   poncProgram.a_Position = gl.getAttribLocation(poncProgram, 'a_Position');
@@ -176,16 +254,21 @@ function draw() {
     if (mode == 1) {
       prog = poncProgram
       gl.useProgram(poncProgram);
-      gl.uniform3f(poncProgram.u_LightColor, 1, 1, 1);
+      gl.uniform3f(poncProgram.u_LightColor, 1.0, 1.0, 1.0);
       gl.uniform3fv(poncProgram.u_LightPosition, lightDirection.elements);
-      gl.uniform3f(poncProgram.u_AmbientLight, 0.2, 0.2, 0.2);
+      gl.uniform3f(poncProgram.u_AmbientLight, 0.5, 0.5, 0.5);
 
     }
-    else {
+    else if (mode == 0) {
       prog = sabProgram;
       gl.useProgram(sabProgram);
       gl.uniform3fv(sabProgram.u_LightDirection, lightDirection.elements);
     }
+    else if (mode == 2) {
+      prog = sabSanSpect;
+      gl.useProgram(sabSanSpect);
+      gl.uniform3fv(sabSanSpect.u_LightDirection, lightDirection.elements);
+    }
 
     getCamera()
 
@@ -198,15 +281,15 @@ function draw() {
     planMatrix.lookAt(0, 1, 12, 0, 0, 1, 0, 1, 0);
     gl.uniformMatrix4fv(planProgram.u_MvpMatrix, false, planMatrix.elements);
     gl.drawElements(gl.TRIANGLES, nPlan, gl.UNSIGNED_BYTE, 0);
-    
+
     //pyramide haut
     gl.useProgram(prog);
     var n = initVertexBuffers(gl, normalsBas, prog);
     model.setPerspective(50, 1, 1, 100);
-    model.lookAt(3, 3, 7, 0, 0, 0, 0, 1, 0);
+    model.lookAt(0, 0, 7, 0, 0, 0, 0, 1, 0);
     mvpMatrix.set(model);
 
-    angle = animate(angle); 
+    angle = animate(angle);
     if (camX == 1 || camY == 1 || camZ == 1)
       rotMatrixBas.setRotate(angle, camX, camY, camZ);
     mvpMatrix.multiply(rotMatrixBas);
@@ -217,30 +300,22 @@ function draw() {
     gl.drawElements(gl.TRIANGLES, n, gl.UNSIGNED_BYTE, 0);
 
 
-    //pyramide bas
-
-    lightDirection = new Vector3([-lumPosX, lumPosY, lumPosZ]);
-    lightDirection.normalize();
-    if (mode == 1) {
-      gl.useProgram(poncProgram);
-      gl.uniform3fv(prog.u_LightPosition, lightDirection.elements);
-    }
-    else {
-      gl.useProgram(sabProgram);
-      gl.uniform3fv(prog.u_LightDirection, lightDirection.elements);
-    }
+    //pyramide haut
 
     if (camX == 1 || camY == 1 || camZ == 1)
-    rotMatrixHaut.setRotate(angle, camX, camY, camZ);
+      rotMatrixHaut.setRotate(angle, camX, camY, camZ);
     rotateMatrix.setRotate(180, 1, 0, 0);
-    tranMatrix.setTranslate(0, 0.4, 0.5);
+    tranMatrix.setTranslate(0, 0.4, 0.5); //(0, 0.4, 0.5);
+
+    initVertexBuffers(gl, normalsHaut, prog);
+
     mvpMatrix.setPerspective(50, 1, 1, 100);
-    mvpMatrix.lookAt(3, 3, 7, 0, 0, 0, 0, 1, 0);
+    mvpMatrix.lookAt(0, 0, 7, 0, 0, 0, 0, 1, 0);
     mvpMatrix.multiply(rotMatrixHaut).multiply(tranMatrix).multiply(rotateMatrix);
-    normalMatrix.setInverseOf(rotMatrixHaut);
-    normalMatrix.multiply(rotateMatrix);
+    //normalMatrix.setInverseOf(rotMatrixHaut);
+    normalMatrix.multiply(tranMatrix).multiply(rotateMatrix);
     normalMatrix.transpose();
-    initVertexBuffers(gl, normalsHaut, prog);
+
     gl.uniformMatrix4fv(prog.u_MvpMatrix, false, mvpMatrix.elements);
     gl.uniformMatrix4fv(prog.u_NormalMatrix, false, normalMatrix.elements);
     gl.drawElements(gl.TRIANGLES, n, gl.UNSIGNED_BYTE, 0);