diff --git a/Projet-Infographie/Projet-Infographie.vcxproj b/Projet-Infographie/Projet-Infographie.vcxproj
index d531761..f748df8 100644
--- a/Projet-Infographie/Projet-Infographie.vcxproj
+++ b/Projet-Infographie/Projet-Infographie.vcxproj
@@ -182,6 +182,7 @@
+
@@ -205,6 +206,7 @@
+
diff --git a/Projet-Infographie/Projet-Infographie.vcxproj.filters b/Projet-Infographie/Projet-Infographie.vcxproj.filters
index fe1d372..689af3d 100644
--- a/Projet-Infographie/Projet-Infographie.vcxproj.filters
+++ b/Projet-Infographie/Projet-Infographie.vcxproj.filters
@@ -7,6 +7,9 @@
src
+
+ src
+
src
@@ -125,6 +128,9 @@
src
+
+ src
+
src
diff --git a/Projet-Infographie/bin/data/export/serie-220310-222312-714.png b/Projet-Infographie/bin/data/export/serie-220310-222312-714.png
deleted file mode 100644
index eb4f27e..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220310-222312-714.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220310-222313-597.png b/Projet-Infographie/bin/data/export/serie-220310-222313-597.png
deleted file mode 100644
index 32b188b..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220310-222313-597.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220310-222314-474.png b/Projet-Infographie/bin/data/export/serie-220310-222314-474.png
deleted file mode 100644
index 4291707..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220310-222314-474.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220310-222315-349.png b/Projet-Infographie/bin/data/export/serie-220310-222315-349.png
deleted file mode 100644
index bd77320..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220310-222315-349.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220310-222316-226.png b/Projet-Infographie/bin/data/export/serie-220310-222316-226.png
deleted file mode 100644
index bfbac19..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220310-222316-226.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-161239-858.png b/Projet-Infographie/bin/data/export/serie-220403-161239-858.png
deleted file mode 100644
index b9d7ac8..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-161239-858.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-161240-025.png b/Projet-Infographie/bin/data/export/serie-220403-161240-025.png
deleted file mode 100644
index 709b771..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-161240-025.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-161240-192.png b/Projet-Infographie/bin/data/export/serie-220403-161240-192.png
deleted file mode 100644
index 990cec8..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-161240-192.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-161240-375.png b/Projet-Infographie/bin/data/export/serie-220403-161240-375.png
deleted file mode 100644
index 1bb1ff3..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-161240-375.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-161240-542.png b/Projet-Infographie/bin/data/export/serie-220403-161240-542.png
deleted file mode 100644
index 32f10db..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-161240-542.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164023-861.png b/Projet-Infographie/bin/data/export/serie-220403-164023-861.png
deleted file mode 100644
index fe5b39f..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164023-861.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164030-761.png b/Projet-Infographie/bin/data/export/serie-220403-164030-761.png
deleted file mode 100644
index 07bea7a..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164030-761.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164031-961.png b/Projet-Infographie/bin/data/export/serie-220403-164031-961.png
deleted file mode 100644
index 2ea5a44..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164031-961.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164349-262.png b/Projet-Infographie/bin/data/export/serie-220403-164349-262.png
deleted file mode 100644
index efc217a..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164349-262.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164349-380.png b/Projet-Infographie/bin/data/export/serie-220403-164349-380.png
deleted file mode 100644
index b36c1c8..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164349-380.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164349-495.png b/Projet-Infographie/bin/data/export/serie-220403-164349-495.png
deleted file mode 100644
index f1e63c1..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164349-495.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164349-614.png b/Projet-Infographie/bin/data/export/serie-220403-164349-614.png
deleted file mode 100644
index 1b9602d..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164349-614.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164349-729.png b/Projet-Infographie/bin/data/export/serie-220403-164349-729.png
deleted file mode 100644
index 0b3b65f..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164349-729.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164349-846.png b/Projet-Infographie/bin/data/export/serie-220403-164349-846.png
deleted file mode 100644
index 71d6477..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164349-846.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164349-962.png b/Projet-Infographie/bin/data/export/serie-220403-164349-962.png
deleted file mode 100644
index 20e9911..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164349-962.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164351-179.png b/Projet-Infographie/bin/data/export/serie-220403-164351-179.png
deleted file mode 100644
index 00728be..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164351-179.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164351-296.png b/Projet-Infographie/bin/data/export/serie-220403-164351-296.png
deleted file mode 100644
index 86ab57e..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164351-296.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164351-412.png b/Projet-Infographie/bin/data/export/serie-220403-164351-412.png
deleted file mode 100644
index ff3506f..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164351-412.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164351-529.png b/Projet-Infographie/bin/data/export/serie-220403-164351-529.png
deleted file mode 100644
index 525b293..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164351-529.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164351-646.png b/Projet-Infographie/bin/data/export/serie-220403-164351-646.png
deleted file mode 100644
index dfd3512..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164351-646.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164351-776.png b/Projet-Infographie/bin/data/export/serie-220403-164351-776.png
deleted file mode 100644
index d043229..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164351-776.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164351-896.png b/Projet-Infographie/bin/data/export/serie-220403-164351-896.png
deleted file mode 100644
index 6ed0a61..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164351-896.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164412-280.png b/Projet-Infographie/bin/data/export/serie-220403-164412-280.png
deleted file mode 100644
index 775115e..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164412-280.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164412-398.png b/Projet-Infographie/bin/data/export/serie-220403-164412-398.png
deleted file mode 100644
index 97a09d5..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164412-398.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164412-514.png b/Projet-Infographie/bin/data/export/serie-220403-164412-514.png
deleted file mode 100644
index 6bfccf6..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164412-514.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164412-631.png b/Projet-Infographie/bin/data/export/serie-220403-164412-631.png
deleted file mode 100644
index 2bea301..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164412-631.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164412-764.png b/Projet-Infographie/bin/data/export/serie-220403-164412-764.png
deleted file mode 100644
index 7165d84..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164412-764.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164412-880.png b/Projet-Infographie/bin/data/export/serie-220403-164412-880.png
deleted file mode 100644
index 0ee1a5e..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164412-880.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164412-997.png b/Projet-Infographie/bin/data/export/serie-220403-164412-997.png
deleted file mode 100644
index c20e00b..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164412-997.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164430-633.png b/Projet-Infographie/bin/data/export/serie-220403-164430-633.png
deleted file mode 100644
index a72dc18..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164430-633.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164430-767.png b/Projet-Infographie/bin/data/export/serie-220403-164430-767.png
deleted file mode 100644
index a133c98..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164430-767.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164430-900.png b/Projet-Infographie/bin/data/export/serie-220403-164430-900.png
deleted file mode 100644
index 52b4cf6..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164430-900.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164431-035.png b/Projet-Infographie/bin/data/export/serie-220403-164431-035.png
deleted file mode 100644
index a71b81a..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164431-035.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164431-167.png b/Projet-Infographie/bin/data/export/serie-220403-164431-167.png
deleted file mode 100644
index 44b6fa7..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164431-167.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164431-300.png b/Projet-Infographie/bin/data/export/serie-220403-164431-300.png
deleted file mode 100644
index 279e98e..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164431-300.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164431-434.png b/Projet-Infographie/bin/data/export/serie-220403-164431-434.png
deleted file mode 100644
index e814c05..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164431-434.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164432-390.png b/Projet-Infographie/bin/data/export/serie-220403-164432-390.png
deleted file mode 100644
index 970980b..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164432-390.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164432-517.png b/Projet-Infographie/bin/data/export/serie-220403-164432-517.png
deleted file mode 100644
index 4f0026b..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164432-517.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164432-650.png b/Projet-Infographie/bin/data/export/serie-220403-164432-650.png
deleted file mode 100644
index 7637fd5..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164432-650.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164432-784.png b/Projet-Infographie/bin/data/export/serie-220403-164432-784.png
deleted file mode 100644
index 4468aba..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164432-784.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164432-933.png b/Projet-Infographie/bin/data/export/serie-220403-164432-933.png
deleted file mode 100644
index 681eceb..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164432-933.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164433-067.png b/Projet-Infographie/bin/data/export/serie-220403-164433-067.png
deleted file mode 100644
index 75be19c..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164433-067.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164433-200.png b/Projet-Infographie/bin/data/export/serie-220403-164433-200.png
deleted file mode 100644
index 3496426..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164433-200.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164442-868.png b/Projet-Infographie/bin/data/export/serie-220403-164442-868.png
deleted file mode 100644
index ce9f581..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164442-868.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164443-001.png b/Projet-Infographie/bin/data/export/serie-220403-164443-001.png
deleted file mode 100644
index 367ac9d..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164443-001.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164443-151.png b/Projet-Infographie/bin/data/export/serie-220403-164443-151.png
deleted file mode 100644
index f185b4e..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164443-151.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164443-285.png b/Projet-Infographie/bin/data/export/serie-220403-164443-285.png
deleted file mode 100644
index 0cc6674..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164443-285.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164443-418.png b/Projet-Infographie/bin/data/export/serie-220403-164443-418.png
deleted file mode 100644
index 9a07347..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164443-418.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164443-551.png b/Projet-Infographie/bin/data/export/serie-220403-164443-551.png
deleted file mode 100644
index 9b4eb7a..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164443-551.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/export/serie-220403-164443-685.png b/Projet-Infographie/bin/data/export/serie-220403-164443-685.png
deleted file mode 100644
index a87631a..0000000
Binary files a/Projet-Infographie/bin/data/export/serie-220403-164443-685.png and /dev/null differ
diff --git a/Projet-Infographie/bin/data/shader/Ancien/blinn_phong_330_fs.glsl b/Projet-Infographie/bin/data/shader/Ancien/blinn_phong_330_fs.glsl
new file mode 100644
index 0000000..1099501
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/Ancien/blinn_phong_330_fs.glsl
@@ -0,0 +1,55 @@
+// IFT3100H22 ~ blinn_phong_330_fs.glsl
+
+#version 330
+
+// attributs interpolés à partir des valeurs en sortie du shader de sommet
+in vec3 surface_position;
+in vec3 surface_normal;
+
+// attribut en sortie
+out vec4 fragment_color;
+
+// couleurs de réflexion du matériau
+uniform vec3 color_ambient;
+uniform vec3 color_diffuse;
+uniform vec3 color_specular;
+
+// facteur de brillance spéculaire du matériau
+uniform float brightness;
+
+// position d'une source de lumière
+uniform vec3 light_position;
+
+void main()
+{
+ // re-normaliser la normale après interpolation
+ vec3 n = normalize(surface_normal);
+
+ // calculer la direction de la surface vers la lumière (l)
+ vec3 l = normalize(light_position - surface_position);
+
+ // calculer le niveau de réflexion diffuse (n • l)
+ float reflection_diffuse = max(dot(n, l), 0.0);
+
+ // réflexion spéculaire par défaut
+ float reflection_specular = 0.0;
+
+ // calculer la réflexion spéculaire seulement s'il y a réflexion diffuse
+ if (reflection_diffuse > 0.0)
+ {
+ // calculer la direction de la surface vers la caméra (v)
+ vec3 v = normalize(-surface_position);
+
+ // calculer la direction du demi-vecteur de réflection (h) en fonction du vecteur de vue (v) et de lumière (l)
+ vec3 h = normalize(v + l);
+
+ // calculer le niveau de réflexion spéculaire (n • h)
+ reflection_specular = pow(max(dot(n, h), 0.0), brightness);
+ }
+
+ // calculer la couleur du fragment
+ fragment_color = vec4(
+ color_ambient +
+ color_diffuse * reflection_diffuse +
+ color_specular * reflection_specular, 1.0);
+}
diff --git a/Projet-Infographie/bin/data/shader/Ancien/blinn_phong_330_vs.glsl b/Projet-Infographie/bin/data/shader/Ancien/blinn_phong_330_vs.glsl
new file mode 100644
index 0000000..0698cea
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/Ancien/blinn_phong_330_vs.glsl
@@ -0,0 +1,30 @@
+// IFT3100H22 ~ blinn_phong_330_vs.glsl
+
+#version 330
+
+// attributs de sommet
+in vec4 position;
+in vec4 normal;
+
+// attributs en sortie
+out vec3 surface_position;
+out vec3 surface_normal;
+
+// attributs uniformes
+uniform mat4x4 modelViewMatrix;
+uniform mat4x4 projectionMatrix;
+
+void main()
+{
+ // calculer la matrice normale
+ mat4x4 normalMatrix = transpose(inverse(modelViewMatrix));
+
+ // transformation de la normale du sommet dans l'espace de vue
+ surface_normal = vec3(normalMatrix * normal);
+
+ // transformation de la position du sommet dans l'espace de vue
+ surface_position = vec3(modelViewMatrix * position);
+
+ // transformation de la position du sommet par les matrices de modèle, vue et projection
+ gl_Position = projectionMatrix * modelViewMatrix * position;
+}
diff --git a/Projet-Infographie/bin/data/shader/Ancien/color_fill_330_fs.glsl b/Projet-Infographie/bin/data/shader/Ancien/color_fill_330_fs.glsl
new file mode 100644
index 0000000..4101d2f
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/Ancien/color_fill_330_fs.glsl
@@ -0,0 +1,14 @@
+// IFT3100H22 ~ color_fill_330_fs.glsl
+
+#version 330
+
+// couleur de remplissage du matériau
+uniform vec3 color;
+
+out vec4 fragment_color;
+
+void main()
+{
+ // déterminer la couleur du fragment
+ fragment_color = vec4(color, 1.0);
+}
diff --git a/Projet-Infographie/bin/data/shader/Ancien/color_fill_330_vs.glsl b/Projet-Infographie/bin/data/shader/Ancien/color_fill_330_vs.glsl
new file mode 100644
index 0000000..f977cc9
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/Ancien/color_fill_330_vs.glsl
@@ -0,0 +1,16 @@
+// IFT3100H22 ~ color_fill_330_vs.glsl
+
+#version 330
+
+// attribut de sommet
+in vec4 position;
+
+// attributs uniformes
+uniform mat4x4 modelViewMatrix;
+uniform mat4x4 projectionMatrix;
+
+void main()
+{
+ // transformation de la position du sommet par les matrices de modèle, vue et projection
+ gl_Position = projectionMatrix * modelViewMatrix * position;
+}
diff --git a/Projet-Infographie/bin/data/shader/Ancien/gouraud_330_fs.glsl b/Projet-Infographie/bin/data/shader/Ancien/gouraud_330_fs.glsl
new file mode 100644
index 0000000..33930dc
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/Ancien/gouraud_330_fs.glsl
@@ -0,0 +1,15 @@
+// IFT3100H22 ~ gouraud_330_fs.glsl
+
+#version 330
+
+// attribut interpolé à partir des valeurs en sortie du shader de sommet
+in vec3 surface_color;
+
+// attribut en sortie
+out vec4 fragment_color;
+
+void main()
+{
+ // calculer la couleur du fragment
+ fragment_color = vec4(surface_color, 1.0);
+}
diff --git a/Projet-Infographie/bin/data/shader/Ancien/gouraud_330_vs.glsl b/Projet-Infographie/bin/data/shader/Ancien/gouraud_330_vs.glsl
new file mode 100644
index 0000000..335d7ad
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/Ancien/gouraud_330_vs.glsl
@@ -0,0 +1,71 @@
+// IFT3100H22 ~ gouraud_330_vs.glsl
+
+#version 330
+
+// attributs de sommet
+in vec4 position;
+in vec4 normal;
+
+// attributs en sortie
+out vec3 surface_color;
+
+// attributs uniformes
+uniform mat4x4 modelViewMatrix;
+uniform mat4x4 projectionMatrix;
+
+// couleurs de réflexion du matériau
+uniform vec3 color_ambient;
+uniform vec3 color_diffuse;
+uniform vec3 color_specular;
+
+// facteur de brillance spéculaire du matériau
+uniform float brightness;
+
+// position d'une source de lumière
+uniform vec3 light_position;
+
+void main()
+{
+ // calculer la matrice normale
+ mat4x4 normalMatrix = transpose(inverse(modelViewMatrix));
+
+ // transformation de la normale du sommet dans l'espace de vue
+ vec3 surface_normal = vec3(normalMatrix * normal);
+
+ // transformation de la position du sommet dans l'espace de vue
+ vec3 surface_position = vec3(modelViewMatrix * position);
+
+ // re-normaliser la normale
+ vec3 n = normalize(surface_normal);
+
+ // calculer la direction de la surface vers la lumière (l)
+ vec3 l = normalize(light_position - surface_position);
+
+ // calculer le niveau de réflexion diffuse (n • l)
+ float reflection_diffuse = max(dot(n, l), 0.0);
+
+ // réflexion spéculaire par défaut
+ float reflection_specular = 0.0;
+
+ // calculer la réflexion spéculaire seulement s'il y a réflexion diffuse
+ if (reflection_diffuse > 0.0)
+ {
+ // calculer la direction de la surface vers la caméra (v)
+ vec3 v = normalize(-surface_position);
+
+ // calculer la direction de la réflection (v) du rayon incident (-l) en fonction de la normale (n)
+ vec3 r = reflect(-l, n);
+
+ // calculer le niveau de réflexion spéculaire (r • v)
+ reflection_specular = pow(max(dot(v, r), 0.0), brightness);
+ }
+
+ // calculer la couleur du fragment
+ surface_color = vec3(
+ color_ambient +
+ color_diffuse * reflection_diffuse +
+ color_specular * reflection_specular);
+
+ // transformation de la position du sommet par les matrices de modèle, vue et projection
+ gl_Position = projectionMatrix * modelViewMatrix * position;
+}
diff --git a/Projet-Infographie/bin/data/shader/Ancien/lambert_330_fs.glsl b/Projet-Infographie/bin/data/shader/Ancien/lambert_330_fs.glsl
new file mode 100644
index 0000000..45b5781
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/Ancien/lambert_330_fs.glsl
@@ -0,0 +1,32 @@
+// IFT3100H22 ~ lambert_330_fs.glsl
+
+#version 330
+
+// attributs interpolés à partir des valeurs en sortie du shader de sommets
+in vec3 surface_position;
+in vec3 surface_normal;
+
+// attribut en sortie
+out vec4 fragment_color;
+
+// couleurs de réflexion du matériau
+uniform vec3 color_ambient;
+uniform vec3 color_diffuse;
+
+// position d'une source de lumière
+uniform vec3 light_position;
+
+void main()
+{
+ // re-normaliser la normale après interpolation (n)
+ vec3 n = normalize(surface_normal);
+
+ // calculer la direction de la surface vers la lumière (l)
+ vec3 l = normalize(light_position - surface_position);
+
+ // calculer le niveau de réflexion diffuse (n • l)
+ float reflection_diffuse = max(dot(n, l), 0.0);
+
+ // déterminer la couleur du fragment
+ fragment_color = vec4(color_ambient + color_diffuse * reflection_diffuse, 1.0);
+}
diff --git a/Projet-Infographie/bin/data/shader/Ancien/lambert_330_vs.glsl b/Projet-Infographie/bin/data/shader/Ancien/lambert_330_vs.glsl
new file mode 100644
index 0000000..94eeb7f
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/Ancien/lambert_330_vs.glsl
@@ -0,0 +1,30 @@
+// IFT3100H22 ~ lambert_330_vs.glsl
+
+#version 330
+
+// attributs de sommet
+in vec4 position;
+in vec4 normal;
+
+// attributs en sortie
+out vec3 surface_position;
+out vec3 surface_normal;
+
+// attributs uniformes
+uniform mat4x4 modelViewMatrix;
+uniform mat4x4 projectionMatrix;
+
+void main()
+{
+ // calculer la matrice normale
+ mat4x4 normalMatrix = transpose(inverse(modelViewMatrix));
+
+ // transformation de la normale du sommet dans l'espace de vue
+ surface_normal = vec3(normalMatrix * normal);
+
+ // transformation de la position du sommet dans l'espace de vue
+ surface_position = vec3(modelViewMatrix * position);
+
+ // transformation de la position du sommet par les matrices de modèle, vue et projection
+ gl_Position = projectionMatrix * modelViewMatrix * position;
+}
diff --git a/Projet-Infographie/bin/data/shader/Ancien/phong_330_fs.glsl b/Projet-Infographie/bin/data/shader/Ancien/phong_330_fs.glsl
new file mode 100644
index 0000000..70d7e6f
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/Ancien/phong_330_fs.glsl
@@ -0,0 +1,55 @@
+// IFT3100H22 ~ phong_330_fs.glsl
+
+#version 330
+
+// attributs interpolés à partir des valeurs en sortie du shader de sommets
+in vec3 surface_position;
+in vec3 surface_normal;
+
+// attribut en sortie
+out vec4 fragment_color;
+
+// couleurs de réflexion du matériau
+uniform vec3 color_ambient;
+uniform vec3 color_diffuse;
+uniform vec3 color_specular;
+
+// facteur de brillance spéculaire du matériau
+uniform float brightness;
+
+// position d'une source de lumière
+uniform vec3 light_position;
+
+void main()
+{
+ // re-normaliser la normale après interpolation
+ vec3 n = normalize(surface_normal);
+
+ // calculer la direction de la surface vers la lumière (l)
+ vec3 l = normalize(light_position - surface_position);
+
+ // calculer le niveau de réflexion diffuse (n • l)
+ float reflection_diffuse = max(dot(n, l), 0.0);
+
+ // réflexion spéculaire par défaut
+ float reflection_specular = 0.0;
+
+ // calculer la réflexion spéculaire seulement s'il y a réflexion diffuse
+ if (reflection_diffuse > 0.0)
+ {
+ // calculer la direction de la surface vers la caméra (v)
+ vec3 v = normalize(-surface_position);
+
+ // calculer la direction de la réflection (r) du rayon incident (-l) en fonction de la normale (n)
+ vec3 r = reflect(-l, n);
+
+ // calculer le niveau de réflexion spéculaire (r • v)
+ reflection_specular = pow(max(dot(v, r), 0.0), brightness);
+ }
+
+ // calculer la couleur du fragment
+ fragment_color = vec4(
+ color_ambient +
+ color_diffuse * reflection_diffuse +
+ color_specular * reflection_specular, 1.0);
+}
diff --git a/Projet-Infographie/bin/data/shader/Ancien/phong_330_vs.glsl b/Projet-Infographie/bin/data/shader/Ancien/phong_330_vs.glsl
new file mode 100644
index 0000000..2dd90bd
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/Ancien/phong_330_vs.glsl
@@ -0,0 +1,30 @@
+// IFT3100H22 ~ phong_330_vs.glsl
+
+#version 330
+
+// attributs de sommet
+in vec4 position;
+in vec4 normal;
+
+// attributs en sortie
+out vec3 surface_position;
+out vec3 surface_normal;
+
+// attributs uniformes
+uniform mat4x4 modelViewMatrix;
+uniform mat4x4 projectionMatrix;
+
+void main()
+{
+ // calculer la matrice normale
+ mat4x4 normalMatrix = transpose(inverse(modelViewMatrix));
+
+ // transformation de la normale du sommet dans l'espace de vue
+ surface_normal = vec3(normalMatrix * normal);
+
+ // transformation de la position du sommet dans l'espace de vue
+ surface_position = vec3(modelViewMatrix * position);
+
+ // transformation de la position du sommet par les matrices de modèle, vue et projection
+ gl_Position = projectionMatrix * modelViewMatrix * position;
+}
diff --git a/Projet-Infographie/bin/data/shader/blinn_phong_420_fs.glsl b/Projet-Infographie/bin/data/shader/blinn_phong_420_fs.glsl
new file mode 100644
index 0000000..df4b3e9
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/blinn_phong_420_fs.glsl
@@ -0,0 +1,128 @@
+#version 420
+
+#define MAX_LIGHTS 25
+
+// attributs interpolés à partir des valeurs en sortie du shader de sommet
+in vec3 surface_position;
+in vec3 surface_normal;
+in vec2 surface_texcoord;
+
+// attribut en sortie
+out vec4 fragment_color;
+
+//uniform sampler2D diffuse;
+layout(binding = 0) uniform sampler2D diffuse;
+layout(binding = 1) uniform sampler2D reflection;
+
+// couleurs de réflexion du matériau
+uniform vec3 color_ambient;
+uniform vec3 color_diffuse;
+uniform vec3 color_specular;
+
+uniform vec4 ambientLights;
+
+uniform int nbOfPointLights;
+uniform vec3 pointLight_position[MAX_LIGHTS];
+uniform vec4 pointLightDiffuseColor[MAX_LIGHTS];
+uniform vec4 pointLightSpecularColor[MAX_LIGHTS];
+
+uniform int nbOfDirectionalLights;
+uniform vec4 directionalLightDiffuseColor[MAX_LIGHTS];
+uniform vec4 directionalLightSpecularColor[MAX_LIGHTS];
+uniform vec3 directionalLightOrientation[MAX_LIGHTS];
+
+uniform int nbOfSpotLights;
+uniform vec3 spotLight_position[MAX_LIGHTS];
+uniform vec4 spotLightDiffuseColor[MAX_LIGHTS];
+uniform vec4 spotLightSpecularColor[MAX_LIGHTS];
+uniform vec3 spotLightOrientation[MAX_LIGHTS];
+
+// facteur de brillance spéculaire du matériau
+uniform float shininess;
+
+float pointLightAttenuation(vec3 light_position, vec3 surface_position) {
+ float d = distance(light_position, surface_position) / 100.0f;
+ return 1.0f / (0.2f + d / 8.0f + pow(d, 2) / 64.0f);
+}
+
+float spotLightAttenuation(vec3 light_position, vec3 surface_position, vec3 i, int index) {
+ float d = distance(light_position, surface_position) / 100.0f;
+ int power = 5;
+ float attenuation = pow(max(dot(spotLightOrientation[index], i), 0.0f), power);
+ return attenuation / (0.2f + d / 8.0f + pow(d, 2) / 64.0f);;
+}
+
+void main()
+{
+ vec4 ambientColor = ambientLights * vec4(color_ambient, 1.0f);
+ vec4 diffuseColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);
+ vec4 specularColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);
+
+ vec3 n = normalize(surface_normal);
+
+ // Point lights
+ for(int i = 0; i < nbOfPointLights; i++) {
+ vec3 l = normalize(pointLight_position[i] - surface_position);
+
+ float reflection_diffuse = max(dot(n, l), 0.0f);
+
+ float reflection_specular = 0.0;
+ if (reflection_diffuse > 0.0)
+ {
+ vec3 v = normalize(-surface_position);
+ vec3 h = normalize(v + l);
+ reflection_specular = pow(max(dot(n, h), 0.0f), shininess);
+ }
+
+ float pointAttenuation = pointLightAttenuation(pointLight_position[i], surface_position);
+
+ diffuseColor += pointAttenuation * pointLightDiffuseColor[i] * vec4(color_diffuse, 1.0f) *
+ texture(diffuse, surface_texcoord) * reflection_diffuse;
+
+ specularColor += pointAttenuation * pointLightSpecularColor[i] * vec4(color_specular, 1.0f)
+ * texture(reflection, surface_texcoord) * reflection_specular;
+ }
+
+ // Directional lights
+ for(int i = 0; i < nbOfDirectionalLights; i++) {
+ float reflection_diffuse = max(dot(n, directionalLightOrientation[i]), 0.0f);
+
+ float reflection_specular = 0.0f;
+ if (reflection_diffuse > 0.0f)
+ {
+ vec3 v = normalize(-surface_position);
+ vec3 h = normalize(v + directionalLightOrientation[i]);
+ reflection_specular = pow(max(dot(n, h), 0.0f), shininess);
+ }
+
+ diffuseColor += directionalLightDiffuseColor[i] * vec4(color_diffuse, 1.0f) *
+ texture(diffuse, surface_texcoord) * reflection_diffuse;
+
+ specularColor += directionalLightSpecularColor[i] * vec4(color_specular, 1.0f)
+ * texture(reflection, surface_texcoord) * reflection_specular;
+ }
+
+ // Spot lights
+ for(int i = 0; i < nbOfSpotLights; i++) {
+ vec3 l = normalize(spotLight_position[i] - surface_position);
+ float reflection_diffuse = max(dot(n, l), 0.0f);
+
+ float reflection_specular = 0.0;
+ if (reflection_diffuse > 0.0)
+ {
+ vec3 v = normalize(-surface_position);
+ vec3 h = normalize(v + l);
+ reflection_specular = pow(max(dot(n, h), 0.0f), shininess);
+ }
+
+ float spotAttenuation = spotLightAttenuation(spotLight_position[i], surface_position, -l, i);
+
+ diffuseColor += spotAttenuation * spotLightDiffuseColor[i] * vec4(color_diffuse, 1.0f)
+ * texture(diffuse, surface_texcoord) * reflection_diffuse;
+
+ specularColor += spotAttenuation * spotLightSpecularColor[i] * vec4(color_specular, 1.0f)
+ * texture(reflection, surface_texcoord) * reflection_specular;
+ }
+
+ fragment_color = ambientColor + diffuseColor + specularColor;
+}
diff --git a/Projet-Infographie/bin/data/shader/blinn_phong_420_vs.glsl b/Projet-Infographie/bin/data/shader/blinn_phong_420_vs.glsl
new file mode 100644
index 0000000..6d29b0a
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/blinn_phong_420_vs.glsl
@@ -0,0 +1,31 @@
+#version 330
+
+// attributs de sommet
+in vec4 position;
+in vec4 normal;
+in vec2 texcoord;
+
+// attributs en sortie
+out vec3 surface_position;
+out vec3 surface_normal;
+out vec2 surface_texcoord;
+
+// attributs uniformes
+uniform mat4x4 modelview;
+uniform mat4x4 projection;
+
+void main()
+{
+ // calculer la matrice normale
+ mat4x4 normalMatrix = transpose(inverse(modelview));
+
+ // transformation de la normale du sommet dans l'espace de vue
+ surface_normal = vec3(normalMatrix * normal);
+
+ // transformation de la position du sommet dans l'espace de vue
+ surface_position = vec3(modelview * position);
+
+ // transformation de la position du sommet par les matrices de modèle, vue et projection
+ gl_Position = projection * modelview * position;
+ surface_texcoord = texcoord;
+}
\ No newline at end of file
diff --git a/Projet-Infographie/bin/data/shader/exploding_model_330_fs.glsl b/Projet-Infographie/bin/data/shader/exploding_model_330_fs.glsl
new file mode 100644
index 0000000..1e91c75
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/exploding_model_330_fs.glsl
@@ -0,0 +1,10 @@
+#version 330
+
+uniform vec4 color_diffuse;
+
+out vec4 fragment_color;
+
+void main()
+{
+ fragment_color = color_diffuse;
+}
\ No newline at end of file
diff --git a/Projet-Infographie/bin/data/shader/exploding_model_330_gs.glsl b/Projet-Infographie/bin/data/shader/exploding_model_330_gs.glsl
new file mode 100644
index 0000000..639c900
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/exploding_model_330_gs.glsl
@@ -0,0 +1,34 @@
+#version 330 core
+layout (triangles) in;
+layout (triangle_strip, max_vertices = 3) out;
+
+uniform float timeSinceStart;
+
+float getForce(float timeSinceStart) {
+ return (log(timeSinceStart * 0.03 + 1.0)) * 250.0;
+}
+
+vec4 explode(vec4 position, vec3 normal)
+{
+ vec3 direction = normal * getForce(timeSinceStart);
+ return position + vec4(direction, 0.0);
+}
+
+vec3 getNormal()
+{
+ vec3 a = vec3(gl_in[0].gl_Position) - vec3(gl_in[1].gl_Position);
+ vec3 b = vec3(gl_in[2].gl_Position) - vec3(gl_in[1].gl_Position);
+ return normalize(cross(a, b));
+}
+
+void main() {
+ vec3 normal = getNormal();
+
+ gl_Position = explode(gl_in[0].gl_Position, normal);
+ EmitVertex();
+ gl_Position = explode(gl_in[1].gl_Position, normal);
+ EmitVertex();
+ gl_Position = explode(gl_in[2].gl_Position, normal);
+ EmitVertex();
+ EndPrimitive();
+}
\ No newline at end of file
diff --git a/Projet-Infographie/bin/data/shader/exploding_model_330_vs.glsl b/Projet-Infographie/bin/data/shader/exploding_model_330_vs.glsl
new file mode 100644
index 0000000..c7b5f17
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/exploding_model_330_vs.glsl
@@ -0,0 +1,17 @@
+#version 330
+
+uniform mat4 model;
+uniform mat4 view;
+uniform mat4 projection;
+
+in vec4 position;
+in vec3 normal;
+
+out VS_OUT {
+ vec3 normal;
+} vs_out;
+
+void main()
+{
+ gl_Position = projection * view * model * position;
+}
diff --git a/Projet-Infographie/bin/data/shader/gouraud_420_fs.glsl b/Projet-Infographie/bin/data/shader/gouraud_420_fs.glsl
new file mode 100644
index 0000000..77465b4
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/gouraud_420_fs.glsl
@@ -0,0 +1,71 @@
+#version 420
+
+#define MAX_LIGHTS 5
+
+// attribut interpolé à partir des valeurs en sortie du shader de sommet
+in vec3 surface_color;
+in vec2 surface_texcoord;
+
+in float pointLightReflection_diffuse[MAX_LIGHTS];
+in float pointLightReflection_specular[MAX_LIGHTS];
+in float directionalLightReflection_diffuse[MAX_LIGHTS];
+in float directionalLightReflection_specular[MAX_LIGHTS];
+in float spotLightReflection_diffuse[MAX_LIGHTS];
+in float spotLightReflection_specular[MAX_LIGHTS];
+
+uniform int nbOfPointLights;
+uniform vec4 pointLightDiffuseColor[MAX_LIGHTS];
+uniform vec4 pointLightSpecularColor[MAX_LIGHTS];
+
+uniform int nbOfDirectionalLights;
+uniform vec4 directionalLightDiffuseColor[MAX_LIGHTS];
+uniform vec4 directionalLightSpecularColor[MAX_LIGHTS];
+
+uniform int nbOfSpotLights;
+uniform vec4 spotLightDiffuseColor[MAX_LIGHTS];
+uniform vec4 spotLightSpecularColor[MAX_LIGHTS];
+
+uniform vec3 color_ambient;
+uniform vec3 color_diffuse;
+uniform vec3 color_specular;
+
+uniform vec4 ambientLights;
+
+layout(binding = 0) uniform sampler2D diffuse;
+layout(binding = 1) uniform sampler2D reflection;
+
+// attribut en sortie
+out vec4 fragment_color;
+
+void main()
+{
+ vec4 ambientColor = ambientLights * vec4(color_ambient, 1.0f);
+ vec4 diffuseColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);
+ vec4 specularColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);
+
+ for(int i = 0; i < nbOfPointLights; i++) {
+ diffuseColor += pointLightDiffuseColor[i] * vec4(color_diffuse, 1.0f)
+ * texture(diffuse, surface_texcoord) * pointLightReflection_diffuse[i];
+
+ specularColor += pointLightSpecularColor[i] * vec4(color_specular, 1.0f)
+ * texture(reflection, surface_texcoord) * pointLightReflection_specular[i];
+ }
+
+ for(int i = 0; i < nbOfDirectionalLights; i++) {
+ diffuseColor += directionalLightDiffuseColor[i] * vec4(color_diffuse, 1.0f)
+ * texture(diffuse, surface_texcoord) * directionalLightReflection_diffuse[i];
+
+ specularColor += directionalLightSpecularColor[i] * vec4(color_specular, 1.0f)
+ * texture(reflection, surface_texcoord) * directionalLightReflection_specular[i];
+ }
+
+ for(int i = 0; i < nbOfSpotLights; i++) {
+ diffuseColor += spotLightDiffuseColor[i] * vec4(color_diffuse, 1.0f)
+ * texture(diffuse, surface_texcoord) * spotLightReflection_diffuse[i];
+
+ specularColor += spotLightSpecularColor[i] * vec4(color_specular, 1.0f)
+ * texture(reflection, surface_texcoord) * spotLightReflection_specular[i];
+ }
+
+ fragment_color = ambientColor + diffuseColor + specularColor;
+}
\ No newline at end of file
diff --git a/Projet-Infographie/bin/data/shader/gouraud_420_vs.glsl b/Projet-Infographie/bin/data/shader/gouraud_420_vs.glsl
new file mode 100644
index 0000000..14c0d10
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/gouraud_420_vs.glsl
@@ -0,0 +1,122 @@
+#version 420
+
+#define MAX_LIGHTS 5
+
+// attributs de sommet
+in vec4 position;
+in vec4 normal;
+in vec2 texcoord;
+
+// attributs en sortie
+out vec3 surface_color;
+out vec2 surface_texcoord;
+out float pointLightReflection_diffuse[MAX_LIGHTS];
+out float pointLightReflection_specular[MAX_LIGHTS];
+out float directionalLightReflection_diffuse[MAX_LIGHTS];
+out float directionalLightReflection_specular[MAX_LIGHTS];
+out float spotLightReflection_diffuse[MAX_LIGHTS];
+out float spotLightReflection_specular[MAX_LIGHTS];
+out vec3 surface_ambient;
+
+// attributs uniformes
+uniform mat4x4 modelview;
+uniform mat4x4 projection;
+
+uniform int nbOfPointLights;
+uniform vec3 pointLight_position[MAX_LIGHTS];
+
+uniform int nbOfDirectionalLights;
+uniform vec3 directionalLightOrientation[MAX_LIGHTS];
+
+uniform int nbOfSpotLights;
+uniform vec3 spotLight_position[MAX_LIGHTS];
+uniform vec3 spotLightOrientation[MAX_LIGHTS];
+
+// couleurs de réflexion du matériau
+uniform vec3 color_diffuse;
+uniform vec3 color_specular;
+
+// facteur de brillance spéculaire du matériau
+uniform float shininess;
+
+float pointLightAttenuation(vec3 light_position, vec3 surface_position) {
+ float d = distance(light_position, surface_position) / 100.0f;
+ return 1.0f / (0.2f + d / 8.0f + pow(d, 2) / 64.0f);
+}
+
+float spotLightAttenuation(vec3 light_position, vec3 surface_position, vec3 i, int index) {
+ float d = distance(light_position, surface_position) / 100.0f;
+ int power = 5;
+ float attenuation = pow(max(dot(spotLightOrientation[index], i), 0.0f), power);
+ return attenuation / (0.2f + d / 8.0f + pow(d, 2) / 64.0f);;
+}
+
+void main()
+{
+ // calculer la matrice normale
+ mat4x4 normalMatrix = transpose(inverse(modelview));
+
+ // transformation de la normale du sommet dans l'espace de vue
+ vec3 surface_normal = vec3(normalMatrix * normal);
+
+ // transformation de la position du sommet dans l'espace de vue
+ vec3 surface_position = vec3(modelview * position);
+
+ // re-normaliser la normale
+ vec3 n = normalize(surface_normal);
+
+ // Point lights
+ for(int i = 0; i < MAX_LIGHTS; i++) {
+ vec3 l = normalize(pointLight_position[i] - surface_position);
+
+ pointLightReflection_diffuse[i] = max(dot(n, l), 0.0f);
+
+ pointLightReflection_specular[i] = 0.0;
+ if (pointLightReflection_diffuse[i] > 0.0)
+ {
+ vec3 v = normalize(-surface_position);
+ vec3 r = reflect(-l, n);
+ pointLightReflection_specular[i] = pow(max(dot(v, r), 0.0), shininess);
+ }
+
+ float pointAttenuation = pointLightAttenuation(pointLight_position[i], surface_position);
+ pointLightReflection_diffuse[i] *= pointAttenuation;
+ pointLightReflection_specular[i] *= pointAttenuation;
+ }
+
+ // Directional lights
+ for(int i = 0; i < MAX_LIGHTS; i++) {
+ directionalLightReflection_diffuse[i] = max(dot(n, directionalLightOrientation[i]), 0.0f);
+
+ directionalLightReflection_specular[i] = 0.0f;
+ if (directionalLightReflection_diffuse[i] > 0.0f)
+ {
+ vec3 v = normalize(-surface_position);
+ vec3 r = reflect(-directionalLightOrientation[i], n);
+ directionalLightReflection_specular[i] = pow(max(dot(v, r), 0.0f), shininess);
+ }
+ }
+
+ // Spot lights
+ for(int i = 0; i < nbOfSpotLights; i++) {
+ vec3 l = normalize(spotLight_position[i] - surface_position);
+ spotLightReflection_diffuse[i] = max(dot(n, l), 0.0f);
+
+ spotLightReflection_specular[i] = 0.0;
+ if (spotLightReflection_diffuse[i] > 0.0)
+ {
+ vec3 v = normalize(-surface_position);
+ vec3 r = reflect(-l, n);
+ spotLightReflection_specular[i] = pow(max(dot(v, r), 0.0f), shininess);
+ }
+
+ float spotAttenuation = spotLightAttenuation(spotLight_position[i], surface_position, -l, i);
+
+ spotLightReflection_diffuse[i] *= spotAttenuation;
+ spotLightReflection_specular[i] *= spotAttenuation;
+ }
+
+ // transformation de la position du sommet par les matrices de modèle, vue et projection
+ gl_Position = projection * modelview * position;
+ surface_texcoord = texcoord;
+}
\ No newline at end of file
diff --git a/Projet-Infographie/bin/data/shader/imageSampling_330_fs.glsl b/Projet-Infographie/bin/data/shader/imageSampling_330_fs.glsl
new file mode 100644
index 0000000..b7f480f
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/imageSampling_330_fs.glsl
@@ -0,0 +1,14 @@
+#version 330
+
+uniform sampler2D image1;
+uniform sampler2D image2;
+
+in vec2 surface_texcoord;
+
+out vec4 fragment_color;
+
+void main()
+{
+ vec4 texture_sample = texture(image2, surface_texcoord);
+ fragment_color = texture_sample;
+}
diff --git a/Projet-Infographie/bin/data/shader/imageSampling_330_vs.glsl b/Projet-Infographie/bin/data/shader/imageSampling_330_vs.glsl
new file mode 100644
index 0000000..a391e1d
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/imageSampling_330_vs.glsl
@@ -0,0 +1,15 @@
+#version 330
+
+uniform mat4 modelview;
+uniform mat4 projection;
+
+in vec4 position;
+in vec2 texcoord;
+
+out vec2 surface_texcoord;
+
+void main()
+{
+ gl_Position = projection * modelview * position;
+ surface_texcoord = texcoord;
+}
diff --git a/Projet-Infographie/bin/data/shader/image_330_fs.glsl b/Projet-Infographie/bin/data/shader/image_330_fs.glsl
new file mode 100644
index 0000000..73c6446
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/image_330_fs.glsl
@@ -0,0 +1,18 @@
+#version 330
+
+uniform sampler2D image;
+uniform vec3 color;
+
+in vec2 surface_texcoord;
+
+out vec4 fragment_color;
+
+void main()
+{
+ vec4 texture_sample = texture(image, surface_texcoord);
+ texture_sample.x *= color.x;
+ texture_sample.y *= color.y;
+ texture_sample.z *= color.z;
+
+ fragment_color = texture_sample;
+}
diff --git a/Projet-Infographie/bin/data/shader/image_330_vs.glsl b/Projet-Infographie/bin/data/shader/image_330_vs.glsl
new file mode 100644
index 0000000..69f9613
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/image_330_vs.glsl
@@ -0,0 +1,16 @@
+#version 330
+
+uniform mat4 modelview;
+uniform mat4 projection;
+
+in vec4 position;
+in vec2 texcoord;
+
+out vec2 surface_texcoord;
+
+void main()
+{
+ gl_Position = projection * modelview * position;
+
+ surface_texcoord = texcoord;
+}
diff --git a/Projet-Infographie/bin/data/shader/lambert_330_fs.glsl b/Projet-Infographie/bin/data/shader/lambert_330_fs.glsl
index 45b5781..4b57e6d 100644
--- a/Projet-Infographie/bin/data/shader/lambert_330_fs.glsl
+++ b/Projet-Infographie/bin/data/shader/lambert_330_fs.glsl
@@ -1,4 +1,4 @@
-// IFT3100H22 ~ lambert_330_fs.glsl
+// IFT3100H21 ~ lambert_330_fs.glsl
#version 330
@@ -10,21 +10,21 @@ in vec3 surface_normal;
out vec4 fragment_color;
// couleurs de réflexion du matériau
-uniform vec3 color_ambient;
+vec3 color_ambient = vec3(1.0, 1.0, 1.0) * 0.1;
uniform vec3 color_diffuse;
// position d'une source de lumière
-uniform vec3 light_position;
+uniform vec3 light_position = vec3(0, 0, -1200);
void main()
{
- // re-normaliser la normale après interpolation (n)
+ // re-normaliser la normale après interpolation (N)
vec3 n = normalize(surface_normal);
- // calculer la direction de la surface vers la lumière (l)
+ // calculer la direction de la surface vers la lumière (L)
vec3 l = normalize(light_position - surface_position);
- // calculer le niveau de réflexion diffuse (n • l)
+ // calculer le niveau de réflexion diffuse (N • L)
float reflection_diffuse = max(dot(n, l), 0.0);
// déterminer la couleur du fragment
diff --git a/Projet-Infographie/bin/data/shader/lambert_330_vs.glsl b/Projet-Infographie/bin/data/shader/lambert_330_vs.glsl
index 94eeb7f..cf66307 100644
--- a/Projet-Infographie/bin/data/shader/lambert_330_vs.glsl
+++ b/Projet-Infographie/bin/data/shader/lambert_330_vs.glsl
@@ -1,4 +1,4 @@
-// IFT3100H22 ~ lambert_330_vs.glsl
+// IFT3100H21 ~ lambert_330_vs.glsl
#version 330
@@ -11,20 +11,20 @@ out vec3 surface_position;
out vec3 surface_normal;
// attributs uniformes
-uniform mat4x4 modelViewMatrix;
-uniform mat4x4 projectionMatrix;
+uniform mat4x4 modelview;
+uniform mat4x4 projection;
void main()
{
// calculer la matrice normale
- mat4x4 normalMatrix = transpose(inverse(modelViewMatrix));
+ mat4x4 normalMatrix = transpose(inverse(modelview));
// transformation de la normale du sommet dans l'espace de vue
surface_normal = vec3(normalMatrix * normal);
// transformation de la position du sommet dans l'espace de vue
- surface_position = vec3(modelViewMatrix * position);
+ surface_position = vec3(modelview * position);
// transformation de la position du sommet par les matrices de modèle, vue et projection
- gl_Position = projectionMatrix * modelViewMatrix * position;
+ gl_Position = projection * modelview * position;
}
diff --git a/Projet-Infographie/bin/data/shader/model_330_fs.glsl b/Projet-Infographie/bin/data/shader/model_330_fs.glsl
new file mode 100644
index 0000000..02c87cd
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/model_330_fs.glsl
@@ -0,0 +1,13 @@
+#version 330
+
+uniform sampler2D diffuse;
+uniform vec4 color_diffuse;
+
+in vec2 surface_texcoord;
+
+out vec4 fragment_color;
+
+void main()
+{
+ fragment_color = texture(diffuse, surface_texcoord) * color_diffuse;
+}
diff --git a/Projet-Infographie/bin/data/shader/model_330_vs.glsl b/Projet-Infographie/bin/data/shader/model_330_vs.glsl
new file mode 100644
index 0000000..a391e1d
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/model_330_vs.glsl
@@ -0,0 +1,15 @@
+#version 330
+
+uniform mat4 modelview;
+uniform mat4 projection;
+
+in vec4 position;
+in vec2 texcoord;
+
+out vec2 surface_texcoord;
+
+void main()
+{
+ gl_Position = projection * modelview * position;
+ surface_texcoord = texcoord;
+}
diff --git a/Projet-Infographie/bin/data/shader/model_diffuse_330_fs.glsl b/Projet-Infographie/bin/data/shader/model_diffuse_330_fs.glsl
new file mode 100644
index 0000000..e0841c2
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/model_diffuse_330_fs.glsl
@@ -0,0 +1,12 @@
+#version 330
+
+uniform vec3 color_diffuse;
+in vec4 vertex_color;
+
+out vec4 fragment_color;
+
+
+void main()
+{
+ fragment_color = vec4(color_diffuse, 1.0f);
+}
diff --git a/Projet-Infographie/bin/data/shader/model_diffuse_330_vs.glsl b/Projet-Infographie/bin/data/shader/model_diffuse_330_vs.glsl
new file mode 100644
index 0000000..7c45e41
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/model_diffuse_330_vs.glsl
@@ -0,0 +1,15 @@
+#version 330
+
+uniform mat4 modelview;
+uniform mat4 projection;
+
+in vec4 position;
+in vec4 color;
+
+out vec4 colorV;
+
+void main()
+{
+ gl_Position = projection * modelview * position;
+ colorV = color;
+}
diff --git a/Projet-Infographie/bin/data/shader/model_vertex_color_330_fs.glsl b/Projet-Infographie/bin/data/shader/model_vertex_color_330_fs.glsl
new file mode 100644
index 0000000..0e2ea86
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/model_vertex_color_330_fs.glsl
@@ -0,0 +1,10 @@
+#version 330
+
+in vec4 vertex_color;
+
+out vec4 fragment_color;
+
+void main()
+{
+ fragment_color = vertex_color;
+}
\ No newline at end of file
diff --git a/Projet-Infographie/bin/data/shader/model_vertex_color_330_vs.glsl b/Projet-Infographie/bin/data/shader/model_vertex_color_330_vs.glsl
new file mode 100644
index 0000000..deed5f2
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/model_vertex_color_330_vs.glsl
@@ -0,0 +1,15 @@
+#version 330
+
+uniform mat4 modelview;
+uniform mat4 projection;
+
+in vec4 position;
+in vec4 color;
+
+out vec4 vertex_color;
+
+void main()
+{
+ gl_Position = projection * modelview * position;
+ vertex_color = color;
+}
\ No newline at end of file
diff --git a/Projet-Infographie/bin/data/shader/normal_420_fs.glsl b/Projet-Infographie/bin/data/shader/normal_420_fs.glsl
new file mode 100644
index 0000000..65463be
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/normal_420_fs.glsl
@@ -0,0 +1,135 @@
+#version 420
+
+#define MAX_LIGHTS 25
+
+// attributs interpolés à partir des valeurs en sortie du shader de sommet
+in vec3 surface_position;
+in vec2 surface_texcoord;
+
+in mat3 TBN;
+
+// attribut en sortie
+out vec4 fragment_color;
+
+//uniform sampler2D diffuse;
+layout(binding = 0) uniform sampler2D diffuse;
+layout(binding = 1) uniform sampler2D reflection;
+layout(binding = 2) uniform sampler2D normalMap;
+
+uniform float tileX;
+uniform float tileY;
+
+// couleurs de réflexion du matériau
+uniform vec3 color_ambient;
+uniform vec3 color_diffuse;
+uniform vec3 color_specular;
+
+uniform vec4 ambientLights;
+
+uniform int nbOfPointLights;
+uniform vec3 pointLight_position[MAX_LIGHTS];
+uniform vec4 pointLightDiffuseColor[MAX_LIGHTS];
+uniform vec4 pointLightSpecularColor[MAX_LIGHTS];
+
+uniform int nbOfDirectionalLights;
+uniform vec4 directionalLightDiffuseColor[MAX_LIGHTS];
+uniform vec4 directionalLightSpecularColor[MAX_LIGHTS];
+uniform vec3 directionalLightOrientation[MAX_LIGHTS];
+
+uniform int nbOfSpotLights;
+uniform vec3 spotLight_position[MAX_LIGHTS];
+uniform vec4 spotLightDiffuseColor[MAX_LIGHTS];
+uniform vec4 spotLightSpecularColor[MAX_LIGHTS];
+uniform vec3 spotLightOrientation[MAX_LIGHTS];
+
+// facteur de brillance spéculaire du matériau
+uniform float shininess;
+
+float pointLightAttenuation(vec3 light_position, vec3 surface_position) {
+ float d = distance(light_position, surface_position) / 100.0f;
+ return 1.0f / (0.2f + d / 8.0f + pow(d, 2) / 64.0f);
+}
+
+float spotLightAttenuation(vec3 light_position, vec3 surface_position, vec3 i, int index) {
+ float d = distance(light_position, surface_position) / 100.0f;
+ int power = 5;
+ float attenuation = pow(max(dot(spotLightOrientation[index], i), 0.0f), power);
+ return attenuation / (0.2f + d / 8.0f + pow(d, 2) / 64.0f);;
+}
+
+void main()
+{
+ vec4 ambientColor = ambientLights * vec4(color_ambient, 1.0f);
+ vec4 diffuseColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);
+ vec4 specularColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);
+
+ vec2 texCoord = vec2(surface_texcoord.x * tileX, surface_texcoord.y * tileY);
+ vec3 n = 2.0 * texture(normalMap, texCoord).rgb - 1.0;
+ n = normalize(TBN * n);
+
+ // Point lights
+ for(int i = 0; i < nbOfPointLights; i++) {
+ vec3 l = normalize((pointLight_position[i]) - surface_position);
+
+ float reflection_diffuse = max(dot(n, l), 0.0f);
+
+ float reflection_specular = 0.0;
+ if (reflection_diffuse > 0.0)
+ {
+ vec3 v = normalize(-surface_position);
+ vec3 r = reflect(-l, n);
+ reflection_specular = pow(max(dot(v, r), 0.0f), shininess);
+ }
+
+ float pointAttenuation = pointLightAttenuation(pointLight_position[i], surface_position);
+
+ diffuseColor += pointAttenuation * pointLightDiffuseColor[i] * vec4(color_diffuse, 1.0f) *
+ texture(diffuse, texCoord) * reflection_diffuse;
+
+ specularColor += pointAttenuation * pointLightSpecularColor[i] * vec4(color_specular, 1.0f)
+ * texture(reflection, texCoord) * reflection_specular;
+ }
+
+ // Directional lights
+ for(int i = 0; i < nbOfDirectionalLights; i++) {
+ float reflection_diffuse = max(dot(n, directionalLightOrientation[i]), 0.0f);
+
+ float reflection_specular = 0.0f;
+ if (reflection_diffuse > 0.0f)
+ {
+ vec3 v = normalize(-surface_position);
+ vec3 r = reflect(-directionalLightOrientation[i], n);
+ reflection_specular = pow(max(dot(v, r), 0.0f), shininess);
+ }
+
+ diffuseColor += directionalLightDiffuseColor[i] * vec4(color_diffuse, 1.0f) *
+ texture(diffuse, texCoord) * reflection_diffuse;
+
+ specularColor += directionalLightSpecularColor[i] * vec4(color_specular, 1.0f)
+ * texture(reflection, texCoord) * reflection_specular;
+ }
+
+ // Spot lights
+ for(int i = 0; i < nbOfSpotLights; i++) {
+ vec3 l = normalize(spotLight_position[i] - surface_position);
+ float reflection_diffuse = max(dot(n, l), 0.0f);
+
+ float reflection_specular = 0.0;
+ if (reflection_diffuse > 0.0)
+ {
+ vec3 v = normalize(-surface_position);
+ vec3 r = reflect(-l, n);
+ reflection_specular = pow(max(dot(v, r), 0.0f), shininess);
+ }
+
+ float spotAttenuation = spotLightAttenuation(spotLight_position[i], surface_position, -l, i);
+
+ diffuseColor += spotAttenuation * spotLightDiffuseColor[i] * vec4(color_diffuse, 1.0f)
+ * texture(diffuse, texCoord) * reflection_diffuse;
+
+ specularColor += spotAttenuation * spotLightSpecularColor[i] * vec4(color_specular, 1.0f)
+ * texture(reflection, texCoord) * reflection_specular;
+ }
+
+ fragment_color = ambientColor + diffuseColor + specularColor;
+}
diff --git a/Projet-Infographie/bin/data/shader/normal_420_vs.glsl b/Projet-Infographie/bin/data/shader/normal_420_vs.glsl
new file mode 100644
index 0000000..9c27114
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/normal_420_vs.glsl
@@ -0,0 +1,43 @@
+#version 420
+
+#define MAX_LIGHTS 25
+
+// attributs de sommet
+in vec4 position;
+in vec4 normal;
+in vec2 texcoord;
+in vec4 color; // tangente
+
+// attributs en sortie
+out vec3 surface_position;
+out vec2 surface_texcoord;
+out mat3 TBN;
+
+// attributs uniformes
+uniform mat4x4 modelview;
+uniform mat4x4 model;
+uniform mat4x4 projection;
+
+void main()
+{
+ // calculer la matrice normale
+ mat4x4 normalMatrix = transpose(inverse(model));
+
+ // transformation de la normale du sommet dans l'espace de vue
+ vec3 surface_normal = vec3(normalMatrix * normal);
+ vec3 surface_tangent = vec3(normalMatrix * color);
+
+ vec3 N = normalize(surface_normal);
+ vec3 T = normalize(surface_tangent);
+ T = normalize(T - dot(T, N) * N);
+ vec3 B = cross(T, N);
+
+ TBN = mat3(T, B, N);
+
+ // transformation de la position du sommet dans l'espace de vue
+ surface_position = vec3(modelview * position);
+
+ // transformation de la position du sommet par les matrices de modèle, vue et projection
+ gl_Position = projection * modelview * position;
+ surface_texcoord = texcoord;
+}
\ No newline at end of file
diff --git a/Projet-Infographie/bin/data/shader/pbr_420_fs.glsl b/Projet-Infographie/bin/data/shader/pbr_420_fs.glsl
new file mode 100644
index 0000000..6064658
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/pbr_420_fs.glsl
@@ -0,0 +1,239 @@
+// IFT3100H22 ~ pbr_330_fs.glsl
+
+#version 420
+
+#define PI 3.14159265358979323846264338327950288
+
+// attributs de surface interpolés à partir des valeurs en sortie du shader de sommet
+in vec3 surface_position;
+in vec3 surface_normal;
+in vec2 surface_texcoord;
+
+in mat3 TBN;
+
+// attribut en sortie
+out vec4 fragment_color;
+
+// couleurs de réflexion du matériau
+uniform vec3 color_ambient;
+uniform vec3 color_diffuse;
+uniform vec3 color_specular;
+
+// facteur de brillance du matériau
+uniform float material_brightness;
+
+// facteur de métallicité du matériau
+uniform float material_metallic;
+
+// facteur de rugosité du matériau
+uniform float material_roughness;
+
+// facteur d'occlusion ambiante
+uniform float material_occlusion;
+
+// indice de réfraction de l'effet de fresnel;
+uniform vec3 material_fresnel_ior;
+
+// facteur d'exposition
+uniform float tone_mapping_exposure;
+
+// mode de mappage tonal (reinhard ou aces filmic)
+uniform bool tone_mapping_toggle;
+
+// facteur gamma
+uniform float tone_mapping_gamma;
+
+layout(binding = 0) uniform sampler2D texture_diffuse;
+layout(binding = 1) uniform sampler2D texture_metallic;
+layout(binding = 2) uniform sampler2D normalMap;
+layout(binding = 3) uniform sampler2D texture_roughness;
+layout(binding = 4) uniform sampler2D texture_occlusion;
+
+uniform float tileX;
+uniform float tileY;
+
+// position d'une source de lumière
+uniform vec3 light_position;
+
+// couleur de la source de lumière
+uniform vec3 light_color;
+
+// intensité de la source de lumière
+uniform float light_intensity;
+
+// fonction de distribution des microfacettes
+float trowbridge_reitz(vec3 n, vec3 h, float roughness)
+{
+ float a = roughness * roughness;
+ float a2 = a * a;
+ float ndh = max(dot(n, h), 0.0);
+ float ndh2 = ndh * ndh;
+ float numerator = a2;
+ float denominator = (ndh2 * (a2 - 1.0) + 1.0);
+ denominator = denominator * denominator * PI;
+ return numerator / denominator;
+}
+
+// fonction géométrique pour calculer l'impact de l'occlusion et de l'ombrage des microfacettes
+float schlick_beckmann(float costheta, float roughness)
+{
+ float r = (roughness + 1.0);
+ float k = (r * r) / 8.0;
+ float numerator = costheta;
+ float denominator = costheta * (1.0 - k) + k;
+ return numerator / denominator;
+}
+
+// fonction géométrique avec occlusion et ombrage combinés par la méthode de Smith
+float smith(vec3 n, vec3 l, vec3 v, float roughness)
+{
+ float ndl = max(dot(n, l), 0.0);
+ float ndv = max(dot(n, v), 0.0);
+ float shadow = schlick_beckmann(ndl, roughness);
+ float occlusion = schlick_beckmann(ndv, roughness);
+ return shadow * occlusion;
+}
+
+// fonction qui calcul l'effet de fresnel
+vec3 schlick_fresnel(float costheta, vec3 f0)
+{
+ return f0 + (1.0 - f0) * pow(1.0 - costheta, 5.0);
+}
+
+float pointLightAttenuation(vec3 light_position, vec3 surface_position) {
+ float d = distance(light_position, surface_position) / 100.0f;
+ return 1.0f / (0.2f + d / 8.0f + pow(d, 2) / 64.0f);
+}
+
+// mappage tonal de la couleur hdr vers ldr (reinhard tone mapping)
+vec3 tone_mapping_reinhard(vec3 x)
+{
+ return x / (x + vec3(1.0));
+}
+
+// mappage tonal de la couleur hdr vers ldr (approximation de la courbe du ACES filmic tone mapping)
+vec3 tone_mapping_aces_filmic(vec3 x)
+{
+ float a = 2.51f;
+ float b = 0.03f;
+ float c = 2.43f;
+ float d = 0.59f;
+ float e = 0.14f;
+ return clamp((x * (a * x + b)) / (x * (c * x + d) + e), 0.0, 1.0);
+}
+
+// fonction qui calcule un modèle d'illumination de type pbr avec brdf de cook-torrance
+vec3 brdf_cook_torrance(vec2 texCoord)
+{
+ vec3 n = 2.0 * texture(normalMap, texCoord).rgb - 1.0;
+ n = normalize(TBN * n);
+
+ // calculer la direction de la surface vers la lumière (l)
+ vec3 l = normalize(light_position - surface_position);
+
+ // calculer le niveau de réflexion diffuse (n • l)
+ float diffuse = max(dot(n, l), 0.0);
+
+ // calculer la direction de la surface vers la caméra (v)
+ vec3 v = normalize(-surface_position);
+
+ // calculer la direction du demi-vecteur de réflection (h) en fonction du vecteur de lumière (l) et de vue (v)
+ vec3 h = normalize(l + v);
+
+ // échantillonage de la texture diffuse
+ vec3 texture_sample_diffuse = texture(texture_diffuse, texCoord).rgb;
+
+ // conversion de l'échantillon de la texture diffuse de l'espace gamma vers l'espace linéaire
+ texture_sample_diffuse = pow(texture_sample_diffuse, vec3(tone_mapping_gamma));
+
+ // échantillonage de la texture de métallicité
+ float texture_sample_metallic = texture(texture_metallic, texCoord).r;
+
+ // échantillonage de la texture de rugosité
+ float texture_sample_roughness = texture(texture_roughness, texCoord).r;
+
+ // échantillonage de la texture d'occlusion
+ float texture_sample_occlusion = texture(texture_occlusion, texCoord).r;
+
+ // facteurs du matériau combinées avec les échantillons de couleur
+ float metallic = material_metallic * texture_sample_metallic;
+ float roughness = material_roughness * texture_sample_roughness;
+ float occlusion = material_occlusion * texture_sample_occlusion;
+
+ // combiner l'échantillon de la texture diffuse avec la couleur diffuse du matériau
+ vec3 albedo = color_diffuse * texture_sample_diffuse;
+
+ // calculer la réflexion ambiante
+ vec3 ambient = color_ambient * albedo * occlusion;
+
+ // reflexion de la surface avec un angle d'incidence nul
+ vec3 f0 = material_fresnel_ior;
+
+ // moduler l'effet de fresnel ave la couleur diffuse en fonction du facteur de métallicité
+ f0 = mix(f0, albedo, metallic);
+
+ // distance entre la position de la lumière et de la surface
+ float distance = length(l);
+
+ // calculer l'atténuation de l'intensité de la lumière en fonction de la distance
+ float attenuation = pointLightAttenuation(light_position, surface_position);
+
+ // calculer la radiance
+ vec3 radiance = light_color * light_intensity * attenuation;
+
+ // calculer la distribution des microfacettes
+ float d = trowbridge_reitz(n, h, roughness);
+
+ // calculer l'effet de fresnel
+ vec3 f = schlick_fresnel(max(dot(h, v), 0.0), f0);
+
+ // calculer la fonction géométrique
+ float g = smith(n, l, v, roughness);
+
+ // calculer le numérateur de l'équation (produit des fonctions d, f et g)
+ vec3 numerator = d * f * g;
+
+ // calculer le dénominateur de l'équation (facteur de normalisation)
+ float denominator = 4.0 * max(dot(n, v), 0.0) * diffuse;
+
+ // calculer la valeur de la fonction brdf de cook-torrance
+ vec3 specular = numerator / max(denominator, 0.001);
+
+ // mixer avec la couleur spéculaire du matériau
+ specular = specular * color_specular;
+
+ // contribution spéculaire de la lumière
+ vec3 ks = f;
+
+ // ratio de réfraction
+ vec3 kd = vec3(1.0) - ks;
+
+ // pondérer la réfraction selon le niveau de métallicité de la surface
+ kd *= 1.0 - metallic;
+
+ // calculer la réflectance
+ vec3 reflectance = (kd * albedo / PI + specular) * radiance * diffuse;
+
+ // mixer la couleur des composantes de réflexion
+ vec3 color = ambient + reflectance * material_brightness;
+
+ return color;
+}
+
+void main()
+{
+ vec2 texCoord = vec2(surface_texcoord.x * tileX, surface_texcoord.y * tileY);
+ // évaluation du modèle d'illumination
+ vec3 color = brdf_cook_torrance(texCoord);
+
+ // ajustement de la couleur en fonction du facteur d'exposition
+ color = vec3(1.0) - exp(-color * tone_mapping_exposure);
+
+ color = tone_mapping_aces_filmic(color);
+
+ // conversion de couleur de l'espace linéaire vers l'espace gamma
+ color = pow(color, vec3(1.0 / tone_mapping_gamma));
+
+ // couleur du fragment
+ fragment_color = vec4(color, 1.0);
+}
diff --git a/Projet-Infographie/bin/data/shader/pbr_420_vs.glsl b/Projet-Infographie/bin/data/shader/pbr_420_vs.glsl
new file mode 100644
index 0000000..2c20fb5
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/pbr_420_vs.glsl
@@ -0,0 +1,35 @@
+// IFT3100H22 ~ pbr_330_vs.glsl
+
+#version 420
+
+// attributs de sommet
+in vec4 position;
+in vec4 normal;
+in vec2 texcoord;
+
+// attributs en sortie
+out vec3 surface_position;
+out vec3 surface_normal;
+out vec2 surface_texcoord;
+
+// attributs uniformes
+uniform mat4x4 modelview;
+uniform mat4x4 projection;
+
+void main()
+{
+ // calculer la matrice normale
+ mat4x4 normalMatrix = transpose(inverse(modelview));
+
+ // transformation de la normale du sommet dans l'espace de vue
+ surface_normal = vec3(normalMatrix * normal);
+
+ // transformation de la position du sommet dans l'espace de vue
+ surface_position = vec3(modelview * position);
+
+ // passer les coordonnées de textures au shader de fragment
+ surface_texcoord = texcoord;
+
+ // transformation de la position du sommet par les matrices de modèle, vue et projection
+ gl_Position = projection * modelview * position;
+}
diff --git a/Projet-Infographie/bin/data/shader/phong_420_fs.glsl b/Projet-Infographie/bin/data/shader/phong_420_fs.glsl
new file mode 100644
index 0000000..c0a6f7a
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/phong_420_fs.glsl
@@ -0,0 +1,134 @@
+#version 420
+
+#define MAX_LIGHTS 25
+
+// attributs interpolés à partir des valeurs en sortie du shader de sommet
+in vec3 surface_position;
+in vec3 surface_normal;
+in vec2 surface_texcoord;
+in mat3 TBN;
+
+// attribut en sortie
+out vec4 fragment_color;
+
+//uniform sampler2D diffuse;
+layout(binding = 0) uniform sampler2D diffuse;
+layout(binding = 1) uniform sampler2D reflection;
+
+uniform float tileX;
+uniform float tileY;
+
+// couleurs de réflexion du matériau
+uniform vec3 color_ambient;
+uniform vec3 color_diffuse;
+uniform vec3 color_specular;
+
+uniform vec4 ambientLights;
+
+uniform int nbOfPointLights;
+uniform vec3 pointLight_position[MAX_LIGHTS];
+uniform vec4 pointLightDiffuseColor[MAX_LIGHTS];
+uniform vec4 pointLightSpecularColor[MAX_LIGHTS];
+
+uniform int nbOfDirectionalLights;
+uniform vec4 directionalLightDiffuseColor[MAX_LIGHTS];
+uniform vec4 directionalLightSpecularColor[MAX_LIGHTS];
+uniform vec3 directionalLightOrientation[MAX_LIGHTS];
+
+uniform int nbOfSpotLights;
+uniform vec3 spotLight_position[MAX_LIGHTS];
+uniform vec4 spotLightDiffuseColor[MAX_LIGHTS];
+uniform vec4 spotLightSpecularColor[MAX_LIGHTS];
+uniform vec3 spotLightOrientation[MAX_LIGHTS];
+
+// facteur de brillance spéculaire du matériau
+uniform float shininess;
+
+float pointLightAttenuation(vec3 light_position, vec3 surface_position) {
+ float d = distance(light_position, surface_position) / 100.0f;
+ return 1.0f / (0.2f + d / 8.0f + pow(d, 2) / 64.0f);
+}
+
+float spotLightAttenuation(vec3 light_position, vec3 surface_position, vec3 i, int index) {
+ float d = distance(light_position, surface_position) / 100.0f;
+ int power = 5;
+ float attenuation = pow(max(dot(spotLightOrientation[index], i), 0.0f), power);
+ return attenuation / (0.2f + d / 8.0f + pow(d, 2) / 64.0f);;
+}
+
+void main()
+{
+ vec4 ambientColor = ambientLights * vec4(color_ambient, 1.0f);
+ vec4 diffuseColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);
+ vec4 specularColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);
+
+ vec2 texCoord = vec2(surface_texcoord.x * tileX, surface_texcoord.y * tileY);
+
+ vec3 n = normalize(surface_normal);
+
+ // Point lights
+ for(int i = 0; i < nbOfPointLights; i++) {
+ vec3 l = normalize(pointLight_position[i] - surface_position);
+
+ float reflection_diffuse = max(dot(n, l), 0.0f);
+
+ float reflection_specular = 0.0;
+ if (reflection_diffuse > 0.0)
+ {
+ vec3 v = normalize(-surface_position);
+ vec3 r = reflect(-l, n);
+ reflection_specular = pow(max(dot(v, r), 0.0f), shininess);
+ }
+
+ float pointAttenuation = pointLightAttenuation(pointLight_position[i], surface_position);
+
+ diffuseColor += pointAttenuation * pointLightDiffuseColor[i] * vec4(color_diffuse, 1.0f) *
+ texture(diffuse, texCoord) * reflection_diffuse;
+
+ specularColor += pointAttenuation * pointLightSpecularColor[i] * vec4(color_specular, 1.0f)
+ * texture(reflection, texCoord) * reflection_specular;
+ }
+
+ // Directional lights
+ for(int i = 0; i < nbOfDirectionalLights; i++) {
+ float reflection_diffuse = max(dot(n, directionalLightOrientation[i]), 0.0f);
+
+ float reflection_specular = 0.0f;
+ if (reflection_diffuse > 0.0f)
+ {
+ vec3 v = normalize(-surface_position);
+ vec3 r = reflect(-directionalLightOrientation[i], n);
+ reflection_specular = pow(max(dot(v, r), 0.0f), shininess);
+ }
+
+ diffuseColor += directionalLightDiffuseColor[i] * vec4(color_diffuse, 1.0f) *
+ texture(diffuse, texCoord) * reflection_diffuse;
+
+ specularColor += directionalLightSpecularColor[i] * vec4(color_specular, 1.0f)
+ * texture(reflection, texCoord) * reflection_specular;
+ }
+
+ // Spot lights
+ for(int i = 0; i < nbOfSpotLights; i++) {
+ vec3 l = normalize(spotLight_position[i] - surface_position);
+ float reflection_diffuse = max(dot(n, l), 0.0f);
+
+ float reflection_specular = 0.0;
+ if (reflection_diffuse > 0.0)
+ {
+ vec3 v = normalize(-surface_position);
+ vec3 r = reflect(-l, n);
+ reflection_specular = pow(max(dot(v, r), 0.0f), shininess);
+ }
+
+ float spotAttenuation = spotLightAttenuation(spotLight_position[i], surface_position, -l, i);
+
+ diffuseColor += spotAttenuation * spotLightDiffuseColor[i] * vec4(color_diffuse, 1.0f)
+ * texture(diffuse, texCoord) * reflection_diffuse;
+
+ specularColor += spotAttenuation * spotLightSpecularColor[i] * vec4(color_specular, 1.0f)
+ * texture(reflection, texCoord) * reflection_specular;
+ }
+
+ fragment_color = ambientColor + diffuseColor + specularColor;
+}
diff --git a/Projet-Infographie/bin/data/shader/phong_420_vs.glsl b/Projet-Infographie/bin/data/shader/phong_420_vs.glsl
new file mode 100644
index 0000000..976774b
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/phong_420_vs.glsl
@@ -0,0 +1,31 @@
+#version 420
+
+// attributs de sommet
+in vec4 position;
+in vec4 normal;
+in vec2 texcoord;
+
+// attributs en sortie
+out vec3 surface_position;
+out vec3 surface_normal;
+out vec2 surface_texcoord;
+
+// attributs uniformes
+uniform mat4x4 modelview;
+uniform mat4x4 projection;
+
+void main()
+{
+ // calculer la matrice normale
+ mat4x4 normalMatrix = transpose(inverse(modelview));
+
+ // transformation de la normale du sommet dans l'espace de vue
+ surface_normal = vec3(normalMatrix * normal);
+
+ // transformation de la position du sommet dans l'espace de vue
+ surface_position = vec3(modelview * position);
+
+ // transformation de la position du sommet par les matrices de modèle, vue et projection
+ gl_Position = projection * modelview * position;
+ surface_texcoord = texcoord;
+}
\ No newline at end of file
diff --git a/Projet-Infographie/bin/data/shader/skybox_330_fs.glsl b/Projet-Infographie/bin/data/shader/skybox_330_fs.glsl
new file mode 100644
index 0000000..5d0e53e
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/skybox_330_fs.glsl
@@ -0,0 +1,11 @@
+#version 330 core
+out vec4 FragColor;
+
+in vec3 TexCoords;
+
+uniform samplerCube skybox;
+
+void main()
+{
+ FragColor = texture(skybox, TexCoords);
+}
\ No newline at end of file
diff --git a/Projet-Infographie/bin/data/shader/skybox_330_vs.glsl b/Projet-Infographie/bin/data/shader/skybox_330_vs.glsl
new file mode 100644
index 0000000..b7c2dfc
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/skybox_330_vs.glsl
@@ -0,0 +1,13 @@
+#version 330 core
+layout (location = 0) in vec3 aPos;
+
+out vec3 TexCoords;
+
+uniform mat4 projection;
+uniform mat4 view;
+
+void main()
+{
+ TexCoords = aPos;
+ gl_Position = projection * view * vec4(aPos, 1.0);
+}
\ No newline at end of file
diff --git a/Projet-Infographie/bin/data/shader/tone_mapping_330_fs.glsl b/Projet-Infographie/bin/data/shader/tone_mapping_330_fs.glsl
new file mode 100644
index 0000000..d1243d9
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/tone_mapping_330_fs.glsl
@@ -0,0 +1,39 @@
+#version 330
+
+in vec2 surface_texcoord;
+out vec4 fragment_color;
+
+uniform sampler2D diffuse;
+uniform float exposure;
+uniform bool toggle;
+uniform float gamma;
+
+vec3 reinhard(vec3 x) {
+ return x / (x + vec3(1.0));
+}
+
+vec3 ACESFilmic(vec3 x) {
+ float a = 2.51f;
+ float b = 0.03f;
+ float c = 2.43f;
+ float d = 0.59f;
+ float e = 0.14f;
+ return clamp((x * (a * x + b)) / (x * (c * x + d) + e), 0.0, 1.0);
+}
+
+void main() {
+ vec3 texture_sample = texture(diffuse, surface_texcoord).rgb;
+
+ texture_sample = pow(texture_sample, vec3(gamma));
+
+ texture_sample = vec3(1.0) - exp(-texture_sample * exposure);
+
+ if (toggle)
+ texture_sample = ACESFilmic(texture_sample);
+ else
+ texture_sample = reinhard(texture_sample);
+
+ texture_sample = pow(texture_sample, vec3(1.0 / gamma));
+
+ fragment_color = vec4(texture_sample, 1.0);
+}
diff --git a/Projet-Infographie/bin/data/shader/vertexColor_330_fs.glsl b/Projet-Infographie/bin/data/shader/vertexColor_330_fs.glsl
new file mode 100644
index 0000000..6a99661
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/vertexColor_330_fs.glsl
@@ -0,0 +1,10 @@
+#version 330
+
+uniform vec3 color_diffuse;
+in vec3 vertex_color;
+out vec4 fragment_color;
+
+void main()
+{
+ fragment_color = vec4(vertex_color, 1.0f);
+}
\ No newline at end of file
diff --git a/Projet-Infographie/bin/data/shader/vertexColor_330_vs.glsl b/Projet-Infographie/bin/data/shader/vertexColor_330_vs.glsl
new file mode 100644
index 0000000..d546c15
--- /dev/null
+++ b/Projet-Infographie/bin/data/shader/vertexColor_330_vs.glsl
@@ -0,0 +1,16 @@
+#version 330
+
+uniform mat4 modelview;
+uniform mat4 projection;
+uniform vec3 vertexColor;
+
+in vec4 position;
+in vec3 color;
+
+out vec3 vertex_color;
+
+void main()
+{
+ vertex_color = color;
+ gl_Position = projection * modelview * position;
+}
diff --git a/Projet-Infographie/bin/data/texture/metal.jpg b/Projet-Infographie/bin/data/texture/metal.jpg
new file mode 100644
index 0000000..db44700
Binary files /dev/null and b/Projet-Infographie/bin/data/texture/metal.jpg differ
diff --git a/Projet-Infographie/bin/data/texture/metal_rust.jpg b/Projet-Infographie/bin/data/texture/metal_rust.jpg
new file mode 100644
index 0000000..c9ee2f8
Binary files /dev/null and b/Projet-Infographie/bin/data/texture/metal_rust.jpg differ
diff --git a/Projet-Infographie/src/application.cpp b/Projet-Infographie/src/application.cpp
index 978268a..7ebb611 100644
--- a/Projet-Infographie/src/application.cpp
+++ b/Projet-Infographie/src/application.cpp
@@ -38,7 +38,7 @@ void ofApp::setup(){
guiLights.setPosition(ofGetWindowWidth() - guiLights.getWidth(), guiProperties3D.getHeight());
guiLights.add(labelLight.setup("Panel", "Lights"));
guiLights.add(newLight1.setup("Ambient Light"));
- guiLights.add(newLight2.setup("Pulsing Light"));
+ guiLights.add(newLight2.setup("Directional Light"));
guiLights.add(newLight3.setup("Cursor Light"));
guiLights.add(newLight4.setup("SpotLight"));
newLight1.addListener(this, &ofApp::addNewLight1);
@@ -59,6 +59,7 @@ void ofApp::setup(){
guiObjects3D.add(newGlassesButton.setup("glasses.3DS"));
guiObjects3D.add(newTVButton.setup("tv.fbx"));
guiObjects3D.add(newWolfButton.setup("Animated Wolf"));
+ guiObjects3D.add(newSurfaceButton.setup("Bezier surface"));
guiObjects3D.add(deleteButton.setup("Delete object"));
newObjectName.set("Name: ", "");
@@ -71,6 +72,7 @@ void ofApp::setup(){
newGlassesButton.addListener(this, &ofApp::addNewGlasses);
newTVButton.addListener(this, &ofApp::addNewTV);
newWolfButton.addListener(this, &ofApp::addAnimatedWolf);
+ newSurfaceButton.addListener(this, &ofApp::addBezierSurface);
deleteButton.addListener(this, &ofApp::deleteObject);
@@ -113,7 +115,20 @@ void ofApp::setup(){
guiObjects2D.add(newLineButton.setup("New Line"));
guiObjects2D.add(newStarButton.setup("New Star"));
guiObjects2D.add(newHouseButton.setup("New House"));
+ guiObjects2D.add(newBezierSplineButton.setup("New Bezier spline curve"));
+ guiObjects2D.add(newCRbutton.setup("New Catmull-Rom curve"));
guiObjects2D.add(deleteButton.setup("Delete object"));
+
+ //Panneau des points de controle
+ for (int i = 0; i < 7; i++) {
+ controlPoints.push_back(new ofxVec2Slider());
+ }
+ guiControlPoints.setup();
+ guiControlPoints.setPosition(0, ofGetWindowHeight() - guiControlPoints.getHeight());
+ for (int i = 1; i < 8; i++) {
+ string name = "Control point " + ofToString(i);
+ guiControlPoints.add(controlPoints[i - 1]->setup(name, ofVec2f(0, 0), ofVec2f(-1920, -1080), ofVec2f(1920, 1080)));
+ }
newObjectName.set("Name: ", "");
newRectangleButton.addListener(this, &ofApp::addNewRectangle);
@@ -123,7 +138,8 @@ void ofApp::setup(){
newLineButton.addListener(this, &ofApp::addNewLine);
newStarButton.addListener(this, &ofApp::addNewStar);
newHouseButton.addListener(this, &ofApp::addNewHouse);
-
+ newBezierSplineButton.addListener(this, &ofApp::addNewBezierSpline);
+ newCRbutton.addListener(this, &ofApp::addNewCR);
is_key_press_up = false;
is_key_press_down = false;
@@ -169,9 +185,8 @@ void ofApp::update(){
renderer.resizeCursorUpDown_enabled = false;
}
}
-
+ bool oneCurveSelected = false;
for (int i : selectedObjects) {
-
if (otherCursorInUse == false) {
renderer.crossCursor_enabled = true;
renderer.circleCursor_enabled = false;
@@ -189,6 +204,14 @@ void ofApp::update(){
newRotation = ofVec3f(rotationSlider);
}
else {
+ if (renderer.objects2D[i]->isCurve) {
+ oneCurveSelected = true;
+ for (int j = 0; j < 7; j++) {
+ ofVec2f slider(*controlPoints[j]);
+ ofVec3f newControlPoint(slider.x, slider.y, 0);
+ renderer.moveCurve(i, j, newControlPoint);
+ }
+ }
ofVec3f newProportion2D(proportionSlider2D);
newProportion = ofVec3f(newProportion2D.x, newProportion2D.y, 1);
newPosition = ofVec3f(positionSlider2D);
@@ -211,6 +234,12 @@ void ofApp::update(){
}
renderer.drawBoundingBox(i);
}
+ if (oneCurveSelected) {
+ curveSelected = true;
+ }
+ else {
+ curveSelected = false;
+ }
updateHierarchy();
renderer.update();
}
@@ -234,6 +263,12 @@ void ofApp::draw(){
ofDrawBitmapString("Press F4 to open TopLeft of an image, F5 for TopRight, F6 for DownLeft and F7 for DownRight.", guiHierarchy.getWidth(), 30);
guiProperties2D.draw();
guiObjects2D.draw();
+ if (curveSelected) {
+ guiControlPoints.draw();
+ }
+ else {
+ guiProperties2D.draw();
+ }
}
guiHierarchy.draw();
@@ -406,6 +441,12 @@ void ofApp::keyReleased(int key){
ofLog() << "";
break;
+ case 57351:
+ for (int o : selectedObjects) {
+ renderer.setTexture(o);
+
+ }
+
case 57350: //touche f7 pour rogner l'image
if (mode3D == false) {
string keypressed = "f7";
@@ -673,8 +714,8 @@ void ofApp::windowResized(int w, int h){
} else {
guiHierarchy.setPosition(0, 0);
guiProperties2D.setPosition(w - guiProperties2D.getWidth(), 0);
- //guiCamera3D.setPosition(0, ofGetWindowHeight() - guiCamera3D.getHeight());
guiObjects2D.setPosition(w - guiObjects2D.getWidth(), h - guiObjects2D.getHeight());
+ guiControlPoints.setPosition(0, h - guiControlPoints.getHeight());
}
}
@@ -751,6 +792,12 @@ void ofApp::addAnimatedWolf() {
newObjectName.set("");
}
+void ofApp::addBezierSurface() {
+ renderer.addNewSurface(newObjectName);
+ newToggleObject();
+ newObjectName.set("");
+}
+
void ofApp::deleteObject() {
for (int i = 0; i < selectedObjects.size(); i++) {
int index = selectedObjects[i];
@@ -797,12 +844,25 @@ void ofApp::toggleListener(bool& value) {
colorPicker = color;
}
else {
- ofVec3f proportion(renderer.objects2D[selectedObjects[0]]->getProportion());
- ofVec3f position(renderer.objects2D[selectedObjects[0]]->getPosition());
- ofVec3f rotation(renderer.objects2D[selectedObjects[0]]->getRotation());
- proportionSlider2D.setup("Proportion", ofVec2f(proportion.x, proportion.y), ofVec2f(0, 0), ofVec2f(100, 100));
- positionSlider2D.setup("Position", ofVec2f(position.x, position.y), ofVec2f(-1920, -1080), ofVec2f(1920, 1080));
- rotationSlider2D.setup("Rotation", ofVec2f(rotation.x, rotation.y), ofVec2f(0, 0), ofVec2f(360, 360));
+ ofLog() << "Test 2D";
+ if (renderer.objects2D[selectedObjects[0]]->isCurve) {
+ ofLog() << "Test curveSelected";
+; vector points(renderer.objects2D[selectedObjects[0]]->getPoints());
+ for (int i = 1; i < 8; i++) {
+ ofLog() << points[i - 1];
+ string name = "Control point " + ofToString(i);
+ controlPoints[i - 1]->setup(name, points[i-1], ofVec2f(-1920, -1080), ofVec2f(1920, 1080));
+ }
+ }
+ else {
+ ofVec3f proportion(renderer.objects2D[selectedObjects[0]]->getProportion());
+ ofVec3f position(renderer.objects2D[selectedObjects[0]]->getPosition());
+ ofVec3f rotation(renderer.objects2D[selectedObjects[0]]->getRotation());
+ proportionSlider2D.setup("Proportion", ofVec2f(proportion.x, proportion.y), ofVec2f(0, 0), ofVec2f(100, 100));
+ positionSlider2D.setup("Position", ofVec2f(position.x, position.y), ofVec2f(-1920, -1080), ofVec2f(1920, 1080));
+ rotationSlider2D.setup("Rotation", ofVec2f(rotation.x, rotation.y), ofVec2f(0, 0), ofVec2f(360, 360));
+ }
+
ofColor color = renderer.objects2D[selectedObjects[0]]->getColor();
colorPicker = color;
}
@@ -923,7 +983,6 @@ void ofApp::refreshProperties() {
guiProperties2D.add(labelProperties2D.setup("Panel", "Properties 2D"));
guiProperties2D.add(proportionSlider2D.setup("Proportion", ofVec2f(1, 1), ofVec2f(0, 0), ofVec2f(100, 100)));
guiProperties2D.add(positionSlider2D.setup("Position", ofVec2f(0, 0), ofVec2f(-1920, -1080), ofVec2f(1920, 1080)));
- //guiProperties2D.add(rotationSlider2D.setup("Rotation", ofVec2f(0, 0), ofVec2f(0, 0), ofVec2f(360, 360)));
guiProperties2D.add(colorPicker.set("Color", ofColor(myRGBColor), ofColor(0, 0), ofColor(255, 255)));
guiProperties2D.add(HSBDisplayButton.setup("HSB"));
guiProperties2D.add(intSliderTakes.setup("Nombre de prises", 1, 1, 24));
@@ -952,7 +1011,6 @@ void ofApp::refreshProperties() {
guiProperties2D.add(labelProperties2D.setup("Panel", "Properties 2D"));
guiProperties2D.add(proportionSlider2D.setup("Proportion", ofVec2f(1, 1), ofVec2f(0, 0), ofVec2f(100, 100)));
guiProperties2D.add(positionSlider2D.setup("Position", ofVec2f(0, 0), ofVec2f(-1920, -1080), ofVec2f(1920, 1080)));
- //guiProperties2D.add(rotationSlider2D.setup("Rotation", ofVec2f(0, 0), ofVec2f(0, 0), ofVec2f(360, 360)));
guiProperties2D.add(hsbColorPicker.setup("Color HSB", ofVec3f(h, s, b), ofVec3f(0, 0, 0), ofVec3f(360, 100, 100)));
guiProperties2D.add(HSBDisplayButton.setup("HSB"));
guiProperties2D.add(intSliderTakes.setup("Nombre de prises", 1, 1, 24));
@@ -1004,6 +1062,18 @@ void ofApp::addNewHouse() {
newObjectName.set("");
}
+void ofApp::addNewBezierSpline() {
+ renderer.addNewCurve(newObjectName, 1);
+ newToggleObject();
+ newObjectName.set("");
+}
+
+void ofApp::addNewCR() {
+ renderer.addNewCurve(newObjectName, 0);
+ newToggleObject();
+ newObjectName.set("");
+}
+
void ofApp::addNewLight1() {
renderer.addNewLight(1);
}
@@ -1021,5 +1091,3 @@ void ofApp::addNewLight4() {
}
-
-
diff --git a/Projet-Infographie/src/application.h b/Projet-Infographie/src/application.h
index e657510..82a385e 100644
--- a/Projet-Infographie/src/application.h
+++ b/Projet-Infographie/src/application.h
@@ -34,6 +34,7 @@ class ofApp : public ofBaseApp {
ofxButton newGlassesButton;
ofxButton newTVButton;
ofxButton newWolfButton;
+ ofxButton newSurfaceButton;
//Lumières
ofxButton newLight1;
@@ -47,6 +48,7 @@ class ofApp : public ofBaseApp {
ofxPanel guiProperties2D;
ofxPanel guiObjects2D;
ofxPanel guiCamera2D;
+ ofxPanel guiControlPoints;
ofxButton newCircleButton;
ofxButton newSquareButton;
@@ -56,6 +58,12 @@ class ofApp : public ofBaseApp {
ofxButton newLineButton;
ofxButton newStarButton;
ofxButton newHouseButton;
+ ofxButton newBezierSplineButton;
+ ofxButton newCRbutton;
+
+ vector controlPoints;
+
+ bool curveSelected = false;
//___________________________
@@ -149,6 +157,7 @@ class ofApp : public ofBaseApp {
void addNewGlasses();
void addNewTV();
void addAnimatedWolf();
+ void addBezierSurface();
void deleteObject();
void cameraLookAt();
void switchProjectionMode();
@@ -171,6 +180,8 @@ class ofApp : public ofBaseApp {
void addNewLine();
void addNewStar();
void addNewHouse();
+ void addNewBezierSpline();
+ void addNewCR();
void openFileSelection(ofFileDialogResult openFileResult);
diff --git a/Projet-Infographie/src/bezierSurface.cpp b/Projet-Infographie/src/bezierSurface.cpp
new file mode 100644
index 0000000..527ef9c
--- /dev/null
+++ b/Projet-Infographie/src/bezierSurface.cpp
@@ -0,0 +1,401 @@
+#include "bezierSurface.h"
+
+void ofxBezierSurface::setup(int w, int h, int dim, int res) {
+ width = w;
+ height = h;
+ cx = dim - 1;
+ cy = dim - 1;
+ rx = res;
+ ry = res;
+
+ int i, j;
+
+ bHasListener = false;
+
+ // create point vectors
+ for (i = 0; i <= cx; i++) {
+ inp.push_back(vector());
+ for (j = 0; j <= cy; j++) {
+ inp[i].push_back(ofVec3f());
+ }
+ }
+ for (i = 0; i < rx; i++) {
+ outp.push_back(vector());
+ for (j = 0; j < ry; j++) {
+ outp[i].push_back(ofVec3f());
+ }
+ }
+
+ // load default points
+ for (i = 0; i <= cx; i++) {
+ for (j = 0; j <= cy; j++) {
+ inp[i][j].x = ofMap(i, 0, cx, 0, width);
+ inp[i][j].y = ofMap(j, 0, cy, 0, height);
+ inp[i][j].z = 0;
+ }
+ }
+
+ // create default surface
+ mesh = ofMesh::plane(width, height, rx, ry, OF_PRIMITIVE_TRIANGLES);
+ createSurface();
+
+ vector verts = mesh.getVertices();
+ for (i = 0; i < verts.size(); i++) {
+ mesh.setTexCoord(i, ofVec2f(verts[i].x, verts[i].y));
+ }
+
+ // interface
+ updateSurface = false;
+ ctrlPntSize = 10;
+ up = false;
+ down = false;
+ left = false;
+ right = false;
+ found = false;
+}
+
+void ofxBezierSurface::draw() {
+ mesh.draw();
+}
+
+void ofxBezierSurface::drawWireframe() {
+ mesh.drawWireframe();
+}
+
+void ofxBezierSurface::update() {
+ if (updateSurface) {
+ createSurface();
+ updateSurface = false;
+ }
+}
+
+void ofxBezierSurface::drawControls() {
+ for (int i = 0; i <= cx; i++) {
+ for (int j = 0; j <= cy; j++) {
+
+ for (int k = 0; k < selectedPnts.size(); k++) {
+ if (selectedPnts[k].x == i && selectedPnts[k].y == j) {
+ ofSetColor(200, 200, 0);
+ break;
+ }
+ else
+ ofSetColor(200, 200, 200);
+ }
+ ofPoint temp_inP(inp[i][j].x, inp[i][j].y, inp[i][j].z);
+ ofPoint temp_outP(outp[i][j].x, outp[i][j].y, outp[i][j].z);
+
+ ofDrawCircle(temp_inP, ctrlPntSize);
+
+
+ ofSetColor(0, 0, 200);
+ ofDrawCircle(temp_outP, ctrlPntSize / 2);
+ ofSetColor(255);
+ ofDrawLine(temp_inP, temp_outP);
+
+ }
+ }
+}
+
+
+//vector ofxBezierSurface::getVertices(){
+// return mesh.getVertices();
+//}
+
+vector ofxBezierSurface::getVertices() {
+ return mesh.getVertices();
+}
+
+void ofxBezierSurface::setVertices(vector& verts) {
+ for (int i = 0; i < verts.size(); i++) {
+ mesh.setVertex(i, verts[i]);
+ }
+}
+
+vector ofxBezierSurface::getControlPnts() {
+ vector vec;
+ for (int i = 0; i <= cx; i++) {
+ for (int j = 0; j <= cy; j++) {
+ vec.push_back(inp[i][j]);
+ }
+ }
+ return vec;
+}
+void ofxBezierSurface::setControlPnts(vector vec) {
+ int c = 0;
+ for (int i = 0; i <= cx; i++) {
+ for (int j = 0; j <= cy; j++) {
+ inp[i][j] = vec[c];
+ c++;
+ }
+ }
+ createSurface();
+}
+
+int ofxBezierSurface::getControlPntDim() {
+ return cx + 1;
+}
+
+void ofxBezierSurface::setControlPntDim(int dim) {
+ int oldcx = cx;
+ int oldcy = cy;
+
+ cx = dim - 1;
+ cy = dim - 1;
+
+ vector< vector > oldInp;
+
+ for (int i = 0; i <= oldcx; i++) {
+ oldInp.push_back(vector());
+
+ for (int j = 0; j <= oldcy; j++) {
+ oldInp[i].push_back(ofVec3f());
+ oldInp[i][j].x = inp[i][j].x;
+ oldInp[i][j].y = inp[i][j].y;
+ oldInp[i][j].z = inp[i][j].z;
+ }
+ }
+
+
+ inp.clear();
+
+ for (int i = 0; i <= cx; i++) {
+ inp.push_back(vector());
+ for (int j = 0; j <= cy; j++) {
+ inp[i].push_back(ofVec3f());
+ }
+ }
+
+
+ // load default points
+ for (int i = 0; i <= cx; i++) {
+ for (int j = 0; j <= cy; j++) {
+ inp[i][j].x = ofMap(i, 0, cx, 0, width);
+ inp[i][j].y = ofMap(j, 0, cy, 0, height);
+ inp[i][j].z = 0;
+ }
+ }
+
+ inp = calculateSurface(oldInp, inp, oldcx, oldcy, cx + 1, cy + 1);
+
+ createSurface();
+}
+
+void ofxBezierSurface::reset() {
+ // load default points
+ for (int i = 0; i <= cx; i++) {
+ for (int j = 0; j <= cy; j++) {
+ inp[i][j].x = ofMap(i, 0, cx, 0, width);
+ inp[i][j].y = ofMap(j, 0, cy, 0, height);
+ inp[i][j].z = 0;
+ }
+ }
+ createSurface();
+}
+
+void ofxBezierSurface::addListeners() {
+
+ bHasListener = true;
+
+ ofAddListener(ofEvents().mousePressed, this, &ofxBezierSurface::mousePressed);
+ ofAddListener(ofEvents().mouseDragged, this, &ofxBezierSurface::mouseDragged);
+ ofAddListener(ofEvents().mouseReleased, this, &ofxBezierSurface::mouseReleased);
+ ofAddListener(ofEvents().keyPressed, this, &ofxBezierSurface::keyPressed);
+ ofAddListener(ofEvents().keyReleased, this, &ofxBezierSurface::keyReleased);
+}
+void ofxBezierSurface::removeListeners() {
+ bHasListener = false;
+ ofRemoveListener(ofEvents().mousePressed, this, &ofxBezierSurface::mousePressed);
+ ofRemoveListener(ofEvents().mouseDragged, this, &ofxBezierSurface::mouseDragged);
+ ofRemoveListener(ofEvents().mouseReleased, this, &ofxBezierSurface::mouseReleased);
+ ofRemoveListener(ofEvents().keyPressed, this, &ofxBezierSurface::keyPressed);
+ ofRemoveListener(ofEvents().keyReleased, this, &ofxBezierSurface::keyReleased);
+}
+
+
+//----------------------------------------------------- interaction.
+void ofxBezierSurface::mousePressed(ofMouseEventArgs& mouseArgs) {
+ float distance = 0;
+ ofPoint tmp;
+ bool missing = true;
+
+ tmp.set(findPoint(mouseArgs));
+
+ if (!ofGetKeyPressed(OF_KEY_SHIFT)) {
+ selectedPnts.clear();
+ }
+
+ for (int i = 0; i < selectedPnts.size(); i++) {
+ if (selectedPnts[i].x == tmp.x && selectedPnts[i].y == tmp.y)
+ missing = false;
+ }
+
+ if (missing)
+ selectedPnts.push_back(tmp);
+
+ lastMouse = ofPoint(mouseArgs.x, mouseArgs.y);
+}
+
+ofPoint ofxBezierSurface::findPoint(ofMouseEventArgs mouseArgs) {
+ ofPoint pnt;
+ float distance = 0;
+ float nearest = -1;
+
+
+ for (int i = 0; i <= cx; i++) {
+ for (int j = 0; j <= cy; j++) {
+ distance = ofDist(inp[i][j].x, inp[i][j].y, mouseArgs.x, mouseArgs.y);
+ if (nearest == -1)
+ nearest = distance;
+ if (distance < nearest) {
+ pnt.set(i, j);
+ nearest = distance;
+ }
+ }
+ }
+ return pnt;
+}
+
+void ofxBezierSurface::mouseDragged(ofMouseEventArgs& mouseArgs) {
+ if (selectedPnts.size() > 0) {
+ ofPoint mouse = ofPoint(mouseArgs.x, mouseArgs.y);
+ ofPoint d = ofPoint(mouse.x - lastMouse.x, mouse.y - lastMouse.y);
+ for (int i = 0; i < selectedPnts.size(); i++) {
+ inp[selectedPnts[i].x][selectedPnts[i].y].x += d.x;
+ inp[selectedPnts[i].x][selectedPnts[i].y].y += d.y;
+ }
+ updateSurface = true;
+ lastMouse = mouse;
+ }
+}
+
+void ofxBezierSurface::mouseReleased(ofMouseEventArgs& mouseArgs) {
+}
+
+void ofxBezierSurface::keyPressed(ofKeyEventArgs& keyArgs) {
+ int key = keyArgs.key;
+
+ float dx = 0;
+ float dy = 0;
+ if (key == OF_KEY_UP || key == OF_KEY_DOWN || key == OF_KEY_LEFT || key == OF_KEY_RIGHT) {
+ if (key == OF_KEY_UP) up = true;
+ else if (key == OF_KEY_DOWN) down = true;
+ else if (key == OF_KEY_LEFT) left = true;
+ else if (key == OF_KEY_RIGHT) right = true;
+
+ if (up) dy = -1;
+ if (down) dy = 1;
+ if (left) dx = -1;
+ if (right) dx = 1;
+
+ if (selectedPnts.size() > 0) {
+ for (int i = 0; i < selectedPnts.size(); i++) {
+ inp[selectedPnts[i].x][selectedPnts[i].y].x += dx;
+ inp[selectedPnts[i].x][selectedPnts[i].y].y += dy;
+ }
+ updateSurface = true;
+ }
+ }
+
+}
+
+void ofxBezierSurface::keyReleased(ofKeyEventArgs& keyArgs) {
+ int key = keyArgs.key;
+ if (!ofGetKeyPressed(OF_KEY_SHIFT)) {
+ if (key == OF_KEY_UP) up = false;
+ else if (key == OF_KEY_DOWN) down = false;
+ else if (key == OF_KEY_LEFT) left = false;
+ else if (key == OF_KEY_RIGHT) right = false;
+ }
+}
+
+//----------------------------------------------------- bezier.
+void ofxBezierSurface::createSurface() {
+ outp = calculateSurface(inp, outp, cx, cy, rx, ry);
+
+ int i, j;
+ int cnt;
+ vector verts;
+ for (i = 0; i < rx; i++) {
+ for (j = 0; j < ry; j++) {
+ verts.push_back(outp[i][j]);
+ }
+ }
+ for (i = 0; i < verts.size(); i++) {
+ mesh.setVertex(i, verts[i]);
+ }
+}
+
+vector< vector > ofxBezierSurface::calculateSurface(vector< vector > ip, vector< vector > op,
+ int cpx, int cpy, int rpx, int rpy) {
+ double mui, muj;
+ double bi, bj;
+ float x, y, z;
+
+ // calculate bezier surface
+ for (int i = 0; i < rpx; i++) {
+ mui = i / (double)(rpx - 1);
+ for (int j = 0; j < rpy; j++) {
+ muj = j / (double)(rpy - 1);
+
+ op[i][j].x = 0;
+ op[i][j].y = 0;
+ op[i][j].z = 0;
+
+ for (int ki = 0; ki <= cpx; ki++) {
+ bi = bezierBlend(ki, mui, cpx);
+ for (int kj = 0; kj <= cpy; kj++) {
+ bj = bezierBlend(kj, muj, cpy);
+ op[i][j].x += (ip[ki][kj].x * bi * bj);
+ op[i][j].y += (ip[ki][kj].y * bi * bj);
+ op[i][j].z += (ip[ki][kj].z * bi * bj);
+ }
+ }
+ }
+ }
+
+ return op;
+}
+
+double ofxBezierSurface::bezierBlend(int k, double mu, int n) {
+ int nn, kn, nkn;
+ double blend = 1;
+
+ nn = n;
+ kn = k;
+ nkn = n - k;
+
+ while (nn >= 1) {
+ blend *= nn;
+ nn--;
+ if (kn > 1) {
+ blend /= (double)kn;
+ kn--;
+ }
+ if (nkn > 1) {
+ blend /= (double)nkn;
+ nkn--;
+ }
+ }
+ if (k > 0)
+ blend *= pow(mu, (double)k);
+ if (n - k > 0)
+ blend *= pow(1 - mu, (double)(n - k));
+
+ return(blend);
+}
+
+void ofxBezierSurface::setPosition(ofVec3f newPosition) {
+ position = newPosition;
+}
+
+void ofxBezierSurface::setProportion(ofVec3f newProportion) {
+ proportion = newProportion;
+}
+
+ofVec3f ofxBezierSurface::getPosition() {
+ return position;
+}
+
+ofVec3f ofxBezierSurface::getProportion() {
+ return proportion;
+}
\ No newline at end of file
diff --git a/Projet-Infographie/src/bezierSurface.h b/Projet-Infographie/src/bezierSurface.h
new file mode 100644
index 0000000..7477849
--- /dev/null
+++ b/Projet-Infographie/src/bezierSurface.h
@@ -0,0 +1,61 @@
+#pragma once
+
+#include "ofVboMesh.h"
+#include "ofMain.h"
+
+class ofxBezierSurface {
+public:
+ ofxBezierSurface() {};
+ void setup(int w, int h, int dim, int res);
+ void update();
+ void draw();
+ void drawWireframe();
+ void drawControls();
+ void reset();
+ void setPosition(ofVec3f newPosition);
+ void setProportion(ofVec3f newProportion);
+ ofVec3f getPosition();
+ ofVec3f getProportion();
+ vector getVertices();
+ void setVertices(vector& verts);
+ vector getControlPnts();
+ void setControlPnts(vector);
+ void setControlPntDim(int dim);
+ int getControlPntDim();
+ void mousePressed(ofMouseEventArgs& mouseArgs);
+ void mouseDragged(ofMouseEventArgs& mouseArgs);
+ void mouseReleased(ofMouseEventArgs& mouseArgs);
+ void keyPressed(ofKeyEventArgs& keyArgs);
+ void keyReleased(ofKeyEventArgs& keyArgs);
+ void addListeners();
+ void removeListeners();
+ float ctrlPntSize;
+
+ bool bHasListener;
+private:
+ int width;
+ int height;
+ int cx;
+ int cy;
+ int rx;
+ int ry;
+ vector< vector > inp;
+ vector< vector > outp;
+ void createSurface();
+ vector< vector > calculateSurface(vector< vector > ip, vector< vector > op,
+ int cpx, int cpy, int rpx, int rpy);
+ double bezierBlend(int k, double mu, int n);
+ ofPoint findPoint(ofMouseEventArgs mouseArgs);
+
+ ofVboMesh mesh;
+ ofVec3f position;
+ ofVec3f proportion;
+ vector selectedPnts;
+ bool updateSurface;
+ ofPoint lastMouse;
+ bool up;
+ bool down;
+ bool left;
+ bool right;
+ bool found;
+};
diff --git a/Projet-Infographie/src/object2D.cpp b/Projet-Infographie/src/object2D.cpp
index 822eb5c..e7a5bf2 100644
--- a/Projet-Infographie/src/object2D.cpp
+++ b/Projet-Infographie/src/object2D.cpp
@@ -52,6 +52,13 @@ ofColor Object2D::getColor() {
return color;
}
+void Object2D::movePoint(int pointIndex, glm::vec3 newPosition) {
+}
+
+vector Object2D::getPoints() {
+ return vector();
+}
+
Object2D::~Object2D()
{
@@ -350,6 +357,268 @@ void House2D::draw()
ofEndShape();
}
+//--------------------------------------------------------------------------------------
+//
+//Curve2D
+
+Curve2D::Curve2D(int curveType) {
+ isCurve = true;
+ cps.push_back(glm::vec3(400.0, 150.0, 0.0));
+ cps.push_back(glm::vec3(200.0, 900.0, 0.0));
+ cps.push_back(glm::vec3(300.0, 650.0, 0.0));
+ cps.push_back(glm::vec3(450.0, 400.0, 0.0));
+ cps.push_back(glm::vec3(500.0, 750.0, 0.0));
+ cps.push_back(glm::vec3(700.0, 222.0, 0.0));
+ cps.push_back(glm::vec3(800.0, 500.0, 0.0));
+
+ switch (curveType) {
+ case 0:
+ isBezier = false;
+ line = evalCR(cps, 1000);
+ break;
+ case 1:
+ isBezier = true;
+ line = evalBspline(cps, 1000);
+ break;
+ }
+}
+
+Curve Curve2D::coreBezier(glm::vec3& p0,
+ glm::vec3& p1,
+ glm::vec3& p2,
+ glm::vec3& p3,
+ unsigned steps) {
+ Curve R(steps + 1);
+
+ //Basis Matrix.
+ glm::mat4 B;
+
+ glm::vec4 x = glm::vec4(1, 0, 0, 0);
+ glm::vec4 y = glm::vec4(-3, 3, 0, 0);
+ glm::vec4 z = glm::vec4(3, -6, 3, 0);
+ glm::vec4 w = glm::vec4(-1, 3, -3, 1);
+
+
+ B = glm::mat4(x, y, z, w);
+
+ //Control Points;
+ glm::mat4 controlPoints;
+
+ glm::vec4 cx = glm::vec4(p0.x, p0.y, p0.z, 1);
+ glm::vec4 cy = glm::vec4(p1.x, p1.y, p1.z, 1);
+ glm::vec4 cz = glm::vec4(p2.x, p2.y, p2.z, 1);
+ glm::vec4 cw = glm::vec4(p3.x, p3.y, p3.z, 1);
+
+ controlPoints = glm::mat4(cx, cy, cz, cw);
+
+ for (unsigned i = 0; i <= steps; ++i) {
+ // ...
+ float t = float(i) / float(steps);
+
+ glm::vec4 tempVertex = controlPoints * B * glm::vec4(1, t, pow(t, 2), pow(t, 3));
+ R[i] = glm::vec3(tempVertex);
+
+ }
+ return R;
+}
+
+Curve Curve2D::evalBezier(vector &P, unsigned steps) {
+ bool run;
+
+ if (P.size() < 4 || P.size() % 3 != 1) {
+ cout << "Error: evalBezier must be called with 3n + 1 control points" << endl;
+ run = false;
+ }
+ else {
+ run = true;
+ }
+
+ Curve bezier;
+
+ if (run) {
+ for (unsigned i = 0; i < P.size() - 3; ++i) {
+ Curve smallBez = coreBezier(P[3 * i], P[3 * i + 1], P[3 * i + 2], P[3 * i + 3], steps);
+ bezier.insert(bezier.end(), smallBez.begin(), smallBez.end());
+ }
+ }
+
+ return bezier;
+}
+
+Curve Curve2D::evalBspline(vector& P, unsigned steps) {
+ bool run;
+
+ if (P.size() < 4 || P.size() % 3 != 1) {
+ cout << "Error: evalBspline must be called with 3n + 1 control points" << endl;
+ run = false;
+ }
+ else {
+ run = true;
+ }
+
+ Curve bSpline;
+
+ if (run) {
+ for (unsigned i = 0; i < P.size() - 3; ++i) {
+
+ //Control Points
+ glm::mat4 cPoint;
+
+ glm::vec4 cx = glm::vec4(P[i].x, P[i].y, P[i].z, 1);
+ glm::vec4 cy = glm::vec4(P[i + 1].x, P[i + 1].y, P[i + 1].z, 1);
+ glm::vec4 cz = glm::vec4(P[i + 2].x, P[i + 2].y, P[i + 2].z, 1);
+ glm::vec4 cw = glm::vec4(P[i + 3].x, P[i + 3].y, P[i + 3].z, 1);
+
+ cPoint = glm::mat4(cx, cy, cz, cw);
+
+ //Basis Matrix for Bspline
+ glm::mat4 bSplineB;
+
+ glm::vec4 basisbx = glm::vec4(1.0, 4.0, 1.0, 0.0);
+ glm::vec4 basisby = glm::vec4(-3.0, 0.0, 3.0, 0.0);
+ glm::vec4 basisbz = glm::vec4(3.0, -6.0, 3.0, 0.0);
+ glm::vec4 basisbw = glm::vec4(-1.0, 3.0, -3.0, 1.0);
+
+ bSplineB = glm::mat4(basisbx, basisby, basisbz, basisbw);
+
+ bSplineB = bSplineB / float(6);
+
+ //Basis Matrix of Bezier
+ glm::mat4 B;
+
+ glm::vec4 x = glm::vec4(1, 0, 0, 0);
+ glm::vec4 y = glm::vec4(-3, 3, 0, 0);
+ glm::vec4 z = glm::vec4(3, -6, 3, 0);
+ glm::vec4 w = glm::vec4(-1, 3, -3, 1);
+
+ B = glm::mat4(x, y, z, w);
+
+ //Matrix Conversion
+ glm::mat4 newPointsM;
+
+ newPointsM = cPoint * bSplineB * glm::inverse(B);
+
+ glm::vec4 p0_4 = newPointsM[0];
+ glm::vec4 p1_4 = newPointsM[1];
+ glm::vec4 p2_4 = newPointsM[2];
+ glm::vec4 p3_4 = newPointsM[3];
+
+ glm::vec3 p0 = glm::vec3(p0_4);
+ glm::vec3 p1 = glm::vec3(p1_4);
+ glm::vec3 p2 = glm::vec3(p2_4);
+ glm::vec3 p3 = glm::vec3(p3_4);
+
+ vector newPoints;
+
+ newPoints.push_back(p0); newPoints.push_back(p1); newPoints.push_back(p2); newPoints.push_back(p3);
+ Curve smallbSpline = evalBezier(newPoints, steps);
+
+ bSpline.insert(bSpline.end(), smallbSpline.begin(), smallbSpline.end());
+ }
+ }
+ return bSpline;
+}
+
+Curve Curve2D::evalCR(vector& P, unsigned steps) {
+ bool run;
+
+ if (P.size() < 4 || P.size() % 3 != 1) {
+ cout << "Error: evalCRmust be called with 3n + 1 control points" << endl;
+ run = false;
+ }
+ else {
+ run = true;
+ }
+
+ Curve Cr;
+
+ if (run) {
+ for (unsigned i = 0; i < P.size() - 1; ++i) {
+
+ //Control Points
+ glm::mat4 cPoint;
+
+ glm::vec4 cx = glm::vec4(P[(i - 1) % P.size()].x, P[(i - 1) % P.size()].y, P[(i - 2) % P.size()].z, 1);
+ glm::vec4 cy = glm::vec4(P[(i) % P.size()].x, P[(i) % P.size()].y, P[(i) % P.size()].z, 1);
+ glm::vec4 cz = glm::vec4(P[(i + 1) % P.size()].x, P[(i + 1) % P.size()].y, P[(i + 1) % P.size()].z, 1);
+ glm::vec4 cw = glm::vec4(P[(i + 2) % P.size()].x, P[(i + 2) % P.size()].y, P[(i + 2) % P.size()].z, 1);
+
+ cPoint = glm::mat4(cx, cy, cz, cw);
+
+ //Catmull-Rom Basis Matrix
+ glm::mat4 CR;
+
+ glm::vec4 crx = glm::vec4(0.0, 2.0, 0.0, 0.0);
+ glm::vec4 cry = glm::vec4(-1.0, 0.0, 1.0, 0.0);
+ glm::vec4 crz = glm::vec4(2.0, -5.0, 4.0, -1.0);
+ glm::vec4 crw = glm::vec4(-1.0, 3.0, -3.0, 1.0);
+
+ CR = glm::mat4(crx, cry, crz, crw);
+
+ CR = CR / float(2);
+
+ //Basis Matrix of Bezier
+ glm::mat4 B;
+
+ glm::vec4 x = glm::vec4(1, 0, 0, 0);
+ glm::vec4 y = glm::vec4(-3, 3, 0, 0);
+ glm::vec4 z = glm::vec4(3, -6, 3, 0);
+ glm::vec4 w = glm::vec4(-1, 3, -3, 1);
+
+ B = glm::mat4(x, y, z, w);
+
+ //Matrix Conversion
+ glm::mat4 newPointsM;
+
+ newPointsM = cPoint * CR * glm::inverse(B);
+
+ glm::vec4 p0_4 = newPointsM[0];
+ glm::vec4 p1_4 = newPointsM[1];
+ glm::vec4 p2_4 = newPointsM[2];
+ glm::vec4 p3_4 = newPointsM[3];
+
+ glm::vec3 p0 = glm::vec3(p0_4);
+ glm::vec3 p1 = glm::vec3(p1_4);
+ glm::vec3 p2 = glm::vec3(p2_4);
+ glm::vec3 p3 = glm::vec3(p3_4);
+
+ vector newPoints;
+
+ newPoints.push_back(p0); newPoints.push_back(p1); newPoints.push_back(p2); newPoints.push_back(p3);
+ Curve smallCr = evalBezier(newPoints, steps);
+
+ Cr.insert(Cr.end(), smallCr.begin(), smallCr.end());
+ }
+ }
+
+ return Cr;
+}
+
+void Curve2D::draw() {
+ ofSetColor(getColor());
+ for (int i = 0; i < line.size(); i++) {
+ ofDrawCircle(line[i], 2);
+ }
+}
+
+void Curve2D::movePoint(int pointIndex, glm::vec3 newPosition) {
+ cps[pointIndex] = newPosition;
+ if (isBezier)
+ line = evalBspline(cps, 1000);
+ else
+ line = evalCR(cps, 1000);
+}
+
+vector Curve2D::getPoints() {
+ vector result;
+ for (int i = 0; i < 7; i++) {
+ ofVec2f v(cps[i].x, cps[i].y);
+ result.push_back(v);
+ }
+ return result;
+}
+//----------------------------------------------------------------------
+
// Class gestionImage
//----------------------------------------------------------------------
GestionImages::GestionImages() {
diff --git a/Projet-Infographie/src/object2D.h b/Projet-Infographie/src/object2D.h
index 49c82cf..608b7fb 100644
--- a/Projet-Infographie/src/object2D.h
+++ b/Projet-Infographie/src/object2D.h
@@ -13,6 +13,8 @@ class Object2D
virtual string getName();
virtual void setName(string newObjectName);
+ virtual void movePoint(int pointIndex, glm::vec3 newPosition);
+ virtual vector getPoints();
ofVec3f getPosition();
ofVec3f getRotation();
@@ -23,7 +25,7 @@ class Object2D
void setPosition(ofVec3f newPosition);
void setRotation(ofVec3f newRotation);
void setProportion(ofVec3f newProportion);
-
+ bool isCurve = false;
virtual void draw()=0;
@@ -193,6 +195,33 @@ class House2D : public Object2D
};
+typedef vector Curve;
+
+class Curve2D : public Object2D {
+public:
+ vector cps;
+ vector line;
+ bool isBezier;
+ Curve2D(int curveType);
+
+ Curve coreBezier(glm::vec3& p0,
+ glm::vec3& p1,
+ glm::vec3& p2,
+ glm::vec3& p3,
+ unsigned steps);
+
+ Curve evalBezier(vector& P, unsigned steps);
+
+ Curve evalBspline(vector& P, unsigned steps);
+
+ Curve evalCR(vector& P, unsigned steps);
+
+ void movePoint(int pointIndex, glm::vec3 newPosition);
+ vector getPoints();
+
+ void draw();
+};
+
class GestionImages : public Object2D
{
public:
diff --git a/Projet-Infographie/src/object3D.cpp b/Projet-Infographie/src/object3D.cpp
index afcd2c8..91c21aa 100644
--- a/Projet-Infographie/src/object3D.cpp
+++ b/Projet-Infographie/src/object3D.cpp
@@ -26,7 +26,7 @@ object3D::object3D(string p_name) {
"shader/blinn_phong_330_vs.glsl",
"shader/blinn_phong_330_fs.glsl");
- shader = shader_lambert;
+
}
@@ -57,6 +57,11 @@ object3D::object3D(string p_name, int type) {
cone = ofConePrimitive();
objectType = cone3d;
break;
+ case 6:
+ surface = ofxBezierSurface();
+ objectType = surfaceBezier;
+ surface.setup(50, 50, 6, 6);
+ break;
default:
ofLog() << "Invalid type.";
}
@@ -84,15 +89,22 @@ object3D::object3D(string p_name, int type) {
shader = shader_lambert;
setColor(ofColor(200, 200, 200));
+ materialNumber = 1;
+
+
+ ofDisableArbTex();
+ //ofLoadImage(texture1, "texture/metal_rust.jpg");
+
+
}
object3D::object3D(string p_name, string fileName) {
name = p_name;
objectType = importation;
objectImport.loadModel(fileName);
- //Évite que le modèle apparaissent à l'envers
+ //Évite que le modèle apparaissent à l'envers
objectImport.setRotation(0, 180, 1, 0, 0);
- //Enlève les matériaux de base pour faire marcher le shader
+ //Enlève les matériaux de base pour faire marcher le shader
objectImport.disableMaterials();
//Chargement du shader
@@ -119,6 +131,7 @@ object3D::object3D(string p_name, string fileName) {
setColor(ofColor(200, 200, 200));
+ materialNumber = 1;
}
@@ -257,7 +270,7 @@ void object3D::setRotation(ofVec3f newRotation) {
sphere.setOrientation(newRotation);
}
else if(objectType == importation) {
- //Permet de faire la rotation des modèle 3D
+ //Permet de faire la rotation des modèle 3D
objectImport.setRotation(0, newRotation.x, 1, 0, 0);
objectImport.setRotation(1, newRotation.y, 0, 1, 0);
objectImport.setRotation(2, newRotation.z, 0, 0, 1);
@@ -352,10 +365,16 @@ void object3D::changeShader(string type) {
void object3D::draw() {
- ofPushMatrix();
+
+
//shader.begin();
material1.begin();
+ //material1.
+
+ texture1.bind();
+
+ cout << shader_name;
if (objectType == primitive3d) {
primitive.draw(OF_MESH_WIREFRAME);
@@ -423,15 +442,23 @@ void object3D::draw() {
}
toggleBoundingBox = false;
}
+
+
+ else if (objectType == surfaceBezier) {
+ surface.drawWireframe();
+
+ }
+ //texture1.unbind();
material1.end();
- //shader.end();
+
+ shader.end();
ofPopMatrix();
}
void object3D::updateShader(ofLight light) {
- //Vieux code pu utilisé
+ //Vieux code pu utilisé
oscillation_amplitude = 32.0f;
oscillation_frequency = 7500.0f;
float oscillation = oscillate(5124, oscillation_frequency, oscillation_amplitude) + oscillation_amplitude;
@@ -453,11 +480,19 @@ void object3D::updateShader(ofLight light) {
}
void object3D::updateMaterial() {
- material1.setAmbientColor(ofColor(63, 63, 63));
- material1.setDiffuseColor(ofColor(200,200,200));
- material1.setEmissiveColor(ofColor(color.r, color.g, color.b));
- material1.setSpecularColor(ofColor(127, 127, 127));
- material1.setShininess(16.0f);
+
+ material1.setAmbientColor(ofColor(63, 63, 63));
+ material1.setDiffuseColor(ofColor(200, 200, 200));
+ material1.setEmissiveColor(ofColor(color.r, color.g, color.b));
+ material1.setSpecularColor(ofColor(127, 127, 127));
+ material1.setShininess(16.0f);
+
+
+
+}
+
+void object3D::setTexture(ofFileDialogResult openFileResult) {
+ ofLoadImage(texture1, openFileResult.getPath());
}
// fonction d'oscillation
diff --git a/Projet-Infographie/src/object3D.h b/Projet-Infographie/src/object3D.h
index 7cdc115..113ea03 100644
--- a/Projet-Infographie/src/object3D.h
+++ b/Projet-Infographie/src/object3D.h
@@ -1,9 +1,10 @@
#include "ofMain.h"
#include "ofxAssimpModelLoader.h"
+#include "bezierSurface.h"
#pragma once
-enum ObjectType { importation, primitive3d, sphere3d, box3d, cylinder3d, cone3d };
+enum ObjectType { importation, primitive3d, sphere3d, box3d, cylinder3d, cone3d, surfaceBezier };
// énumération des types de shader
enum class ShaderType { color_fill, lambert, gouraud, phong, blinn_phong };
@@ -30,8 +31,11 @@ class object3D
void setColor(ofColor newColor);
void setName(string newName);
void setAnimation();
+ void setTexture(ofFileDialogResult openFileResult);
void updateShader(ofLight light);
+ //Materiel test
+
void updateMaterial();
void toggleRotation();
@@ -62,6 +66,7 @@ class object3D
ofBoxPrimitive box;
ofCylinderPrimitive cylinder;
ofConePrimitive cone;
+ ofxBezierSurface surface;
string shader_name;
@@ -71,6 +76,7 @@ class object3D
ofShader shader_phong;
ofShader shader_blinn_phong;
ofShader shader;
+ ofShader test;
ofLight light;
float oscillation;
float oscillation_frequency;
@@ -80,6 +86,11 @@ class object3D
ofMaterial material2;
ofMaterial material3;
ofMaterial material4;
+ int materialNumber;
+ ofTexture texture1;
+ ofPoint points[4];
+ int cornerIndex = 0;
+ bool textureOn;
};
diff --git a/Projet-Infographie/src/renderer.cpp b/Projet-Infographie/src/renderer.cpp
index 00c0967..b2da66b 100644
--- a/Projet-Infographie/src/renderer.cpp
+++ b/Projet-Infographie/src/renderer.cpp
@@ -118,16 +118,16 @@ void Renderer::update()
}
//Code pour envoyer lumière sur shader
- //light.setPointLight();
- //light.setDiffuseColor(255);
- //light.setGlobalPosition(center_x, center_y, 255.0f);
- //
- //
- //if (isMode3D) {
- // for (object3D* object : objects3d) {
- // object->updateShader(light);
- // }
- //}
+ light.setPointLight();
+ light.setDiffuseColor(255);
+ light.setGlobalPosition(center_x, center_y, 255.0f);
+
+
+ if (isMode3D) {
+ for (object3D* object : objects3d) {
+ object->updateShader(light);
+ }
+ }
}
@@ -198,8 +198,7 @@ void Renderer::draw_HandCursor(float x, float y) const
{
int cursor_width = 32;
int cursor_height = 32;
-
-
+
ofImage handCursor;
handCursor.load("handCursor.png");
@@ -397,6 +396,18 @@ void Renderer::addNewHouse(string name) {
objects2D.push_back(house);
}
+void Renderer::addNewCurve(string name, int type) {
+ if (nameAlreadyExists(name)) {
+ return;
+ }
+ if (name == "") {
+ name = "Curve " + to_string(objects2D.size());
+ }
+ Curve2D* curve = new Curve2D(type);
+ curve->setName(name);
+ objects2D.push_back(curve);
+}
+
void Renderer::addNew3dObject(string name) {
if (nameAlreadyExists(name)) {
return;
@@ -456,6 +467,17 @@ void Renderer::addNewCone(string name) {
objects3d.push_back(cone);
}
+void Renderer::addNewSurface(string name) {
+ if (nameAlreadyExists(name)) {
+ return;
+ }
+ if (name == "") {
+ name = "Surface " + to_string(objects3d.size());
+ }
+ object3D* surface = new object3D(name, 6);
+ objects3d.push_back(surface);
+}
+
void Renderer::import3dModel(std::string file_name) {
string name = file_name + to_string(objects3d.size());
@@ -511,6 +533,11 @@ void Renderer::setObjectColor(int index, ofColor newColor) {
}
}
+void Renderer::moveCurve(int index, int pointIndex, ofVec3f newPosition) {
+ glm::vec3 newPos(newPosition.x, newPosition.y, 0);
+ objects2D[index]->movePoint(pointIndex, newPos);
+}
+
void Renderer::image_export(const string name, const string extension) const
{
ofImage image;
@@ -582,6 +609,14 @@ void Renderer::drawBoundingBox(int index) {
}
}
+void Renderer::setTexture(int index) {
+ if (isMode3D) {
+
+ ofFileDialogResult openFileResult = ofSystemLoadDialog("choisir une texture");
+ objects3d[index]->setTexture(openFileResult);
+ }
+}
+
//Camera
void Renderer::cameraLookAt(int index) {
diff --git a/Projet-Infographie/src/renderer.h b/Projet-Infographie/src/renderer.h
index 43a3ee0..c2768fc 100644
--- a/Projet-Infographie/src/renderer.h
+++ b/Projet-Infographie/src/renderer.h
@@ -91,6 +91,7 @@ class Renderer
void addNewBox(string name);
void addNewCylinder(string name);
void addNewCone(string name);
+ void addNewSurface(string name);
void deleteObject(int index);
void proportionateObject(int index, ofVec3f newProportion);
void moveObject(int index, ofVec3f newPosition);
@@ -100,6 +101,8 @@ class Renderer
void cameraLookAt(int index);
void switchProjectionMode();
void setObjectColor(int index, ofColor newColor);
+
+
string getObject3dName(int index);
string getObject2dName(int index);
void setAnimation(int index);
@@ -108,6 +111,7 @@ class Renderer
void addNewLight(int index);
void lightingOn();
void lightingOff();
+ void setTexture(int index);
//2D
@@ -118,7 +122,8 @@ class Renderer
void addNewEllipse(string name);
void addNewStar(string name);
void addNewHouse(string name);
-
+ void addNewCurve(string name, int type);
+ void moveCurve(int index, int pointIndex, ofVec3f newPosition);
void shaderActive(int index, string type);
void addNewImage(string name, string keypressed);
diff --git a/addons/ofxAssimpModelLoader/src/ofxAssimpAnimation.obj b/addons/ofxAssimpModelLoader/src/ofxAssimpAnimation.obj
index 7e304b4..3f2fbd6 100644
Binary files a/addons/ofxAssimpModelLoader/src/ofxAssimpAnimation.obj and b/addons/ofxAssimpModelLoader/src/ofxAssimpAnimation.obj differ
diff --git a/addons/ofxAssimpModelLoader/src/ofxAssimpMeshHelper.obj b/addons/ofxAssimpModelLoader/src/ofxAssimpMeshHelper.obj
index 5425a73..39e1f47 100644
Binary files a/addons/ofxAssimpModelLoader/src/ofxAssimpMeshHelper.obj and b/addons/ofxAssimpModelLoader/src/ofxAssimpMeshHelper.obj differ
diff --git a/addons/ofxAssimpModelLoader/src/ofxAssimpModelLoader.obj b/addons/ofxAssimpModelLoader/src/ofxAssimpModelLoader.obj
index 7ffa660..e1fe048 100644
Binary files a/addons/ofxAssimpModelLoader/src/ofxAssimpModelLoader.obj and b/addons/ofxAssimpModelLoader/src/ofxAssimpModelLoader.obj differ
diff --git a/addons/ofxAssimpModelLoader/src/ofxAssimpTexture.obj b/addons/ofxAssimpModelLoader/src/ofxAssimpTexture.obj
index 36932f4..2a8a6f6 100644
Binary files a/addons/ofxAssimpModelLoader/src/ofxAssimpTexture.obj and b/addons/ofxAssimpModelLoader/src/ofxAssimpTexture.obj differ
diff --git a/addons/ofxBezierSurface/src/ofxBezierSurface.obj b/addons/ofxBezierSurface/src/ofxBezierSurface.obj
new file mode 100644
index 0000000..bd69e99
Binary files /dev/null and b/addons/ofxBezierSurface/src/ofxBezierSurface.obj differ
diff --git a/addons/ofxGui/src/ofxBaseGui.obj b/addons/ofxGui/src/ofxBaseGui.obj
index 56f3d6b..bb69ba9 100644
Binary files a/addons/ofxGui/src/ofxBaseGui.obj and b/addons/ofxGui/src/ofxBaseGui.obj differ
diff --git a/addons/ofxGui/src/ofxButton.obj b/addons/ofxGui/src/ofxButton.obj
index 6a96f35..d1e4588 100644
Binary files a/addons/ofxGui/src/ofxButton.obj and b/addons/ofxGui/src/ofxButton.obj differ
diff --git a/addons/ofxGui/src/ofxColorPicker.obj b/addons/ofxGui/src/ofxColorPicker.obj
index b226499..c630dba 100644
Binary files a/addons/ofxGui/src/ofxColorPicker.obj and b/addons/ofxGui/src/ofxColorPicker.obj differ
diff --git a/addons/ofxGui/src/ofxGuiGroup.obj b/addons/ofxGui/src/ofxGuiGroup.obj
index e015ff5..2d1f6b6 100644
Binary files a/addons/ofxGui/src/ofxGuiGroup.obj and b/addons/ofxGui/src/ofxGuiGroup.obj differ
diff --git a/addons/ofxGui/src/ofxInputField.obj b/addons/ofxGui/src/ofxInputField.obj
index 05bc31f..4f7ba2a 100644
Binary files a/addons/ofxGui/src/ofxInputField.obj and b/addons/ofxGui/src/ofxInputField.obj differ
diff --git a/addons/ofxGui/src/ofxLabel.obj b/addons/ofxGui/src/ofxLabel.obj
index 5b532e4..908394b 100644
Binary files a/addons/ofxGui/src/ofxLabel.obj and b/addons/ofxGui/src/ofxLabel.obj differ
diff --git a/addons/ofxGui/src/ofxPanel.obj b/addons/ofxGui/src/ofxPanel.obj
index 02b7798..03a5a22 100644
Binary files a/addons/ofxGui/src/ofxPanel.obj and b/addons/ofxGui/src/ofxPanel.obj differ
diff --git a/addons/ofxGui/src/ofxSlider.obj b/addons/ofxGui/src/ofxSlider.obj
index 568cc64..6345bc1 100644
Binary files a/addons/ofxGui/src/ofxSlider.obj and b/addons/ofxGui/src/ofxSlider.obj differ
diff --git a/addons/ofxGui/src/ofxSliderGroup.obj b/addons/ofxGui/src/ofxSliderGroup.obj
index b4fd8f6..81c99b7 100644
Binary files a/addons/ofxGui/src/ofxSliderGroup.obj and b/addons/ofxGui/src/ofxSliderGroup.obj differ
diff --git a/addons/ofxGui/src/ofxToggle.obj b/addons/ofxGui/src/ofxToggle.obj
index 59961b0..f1691a8 100644
Binary files a/addons/ofxGui/src/ofxToggle.obj and b/addons/ofxGui/src/ofxToggle.obj differ
diff --git a/addons/ofxVectorGraphics/libs/CreEPS.obj b/addons/ofxVectorGraphics/libs/CreEPS.obj
index feca16c..80f6c56 100644
Binary files a/addons/ofxVectorGraphics/libs/CreEPS.obj and b/addons/ofxVectorGraphics/libs/CreEPS.obj differ
diff --git a/addons/ofxVectorGraphics/src/ofxVectorGraphics.obj b/addons/ofxVectorGraphics/src/ofxVectorGraphics.obj
index 10e966f..2c618c5 100644
Binary files a/addons/ofxVectorGraphics/src/ofxVectorGraphics.obj and b/addons/ofxVectorGraphics/src/ofxVectorGraphics.obj differ