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