Variables "program" renommées en "shader"
[1/2] Instance renommé en Object3D
[2/2] Renommage des fichiers

La détection des renommages de fichiers de Git ne supporte pas les trops gros changements.
Rechargement périodique des shaders

Comme le program est détruit avec glDeleteProgram, le gluint doit être changé partout où est utilisé le shader.
On est donc passé à des pointeurs vers les structures Shader contenues dans App.
Recharge le shader dès qu'il subit une sauvegarde

On vérifie la date de dernière écriture à intervalle fixe (200 ms) pour ne pas trop spammer et laisser les éditeurs avoir le temps d'écrire entre vérifications successives.
Correction de la détection des modifs de fichier

En utilisant que les champs heures/minutes/secondes et en testant la supériorité de la nouvelle valeur, une nouvelle modification faite le jour d'après mais à une h/min/sec inférieure, pouvait être incorrectement considérée comme antérieure.
Exemple:
	- Dernière modif à 18:52:13
	- Nouvelle modif à 14:13:47 (le lendemain)

Il suffit de tester la différence (!=) et non la supériorité (<).
Cela permet en plus le rechargement en cas de restauration d'une ancienne version d'un fichier.
On aurait aussi pu rajouter les champs jour/mois/année, il aurait peut-être fallu des long long int, c'était relativement moins trivial.

De plus on garde les dates des 2 fichiers séparément, le max() n'était pas sur de fonctionner.
Correction d'un crash par stack overflow

App est allouée sur la pile dans main.
10 000 Object3D alloués statiquement étaient beaucoup trop.
sizeof(App) renvoyait une grande valeur (par rapport aux limites de l'OS) et a été ramené à des valeurs raisonables après ce commit.
glProgramUniform permet d'envoyer des données sans glUseProgram pour activer le shader

Il semble que glProgramUniform nécessite OpenGL 4.x, à vérifier...
Libération des textures de la RAM une fois qu'elles ont étés envoyées sur la carte graphique.

Diminue énormément la conso mémoire du programme ~250 Mo -> ~30Mo
Première version des ombres
Réorgarnisation de l'architecture: ajout de Renderer, Scene, ShaderLibrary
La direction du soleil est maintenant extraite directement de sa matrice de vue
Correction des reflets des lumières directionnelles, optimisations et clarification des shaders

Les reflets utilisaient light.pos - surface pour calculer le vecteur de la surface vers la lumière.
Or pour une lumière directionnelle, on à déjà le vecteur, faire la soustraction rendait le résultat incorrect.
On calcule juste ce vecteur dans Light, pos est du coup inutile et est supprimé.
La condition sur le produit scalaire du vecteur surfaceToLight et la normale semblait une bonne optimisation pour éviter toutes les instructions suivantes mais en réalité, elle introduisait un "non-uniform flow control" qui pénalisait lourdement le rendu (~4-6 ms). Comme de plus elle était inutile, la condition à donc été enlevée.
Des normalisations en trop et des variables non-utilisées ont également été enlevées.
Début de refonte du code de rendu

Qui n'était jusque-la qu'un copier-coller de App_Draw()