# Id Tech 2

Le id Tech 2 est un moteur de jeu vidéo développé par id Software. Il succède à l'id Tech 1 utilisé pour le jeu Doom. Initié pour le jeu Quake (1996) et amélioré pour le jeu Quake II (1997). Il a selon son évolution successivement été désigné Quake engine, puis Quake II engine, et en 2007 id Software renomme sa gamme de moteurs, et cette version prend le nom définitif de id Tech 2. L'article traite des deux versions (pour Quake et Quake II), versions qui ont énormément de code en commun.

## Historique

Les bases du id Tech 2 ont été créées en 1996 avec le Quake engine pour le jeu Quake. John Carmack y réalisa la grosse partie du travail de programmation, avec l'aide de Michael Abrash, un spécialiste des optimisations algorithmiques et assembleur.
La même année, le code de la partie réseau, alors uniquement adaptée aux faibles latences des réseaux locaux, est entièrement revue pour fonctionner sur un réseau moins fiable et plus lent qu'est Internet. C'est la branche nommée QuakeWorld (décembre 1996), réalisée par John Carmack avec l'aide de John Cash et de Christian Antkow.
Le moteur initial de Quake réalise tout le rendu de manière logiciel. John Carmack expérimente plusieurs exécutables dédiés supportant différentes accélérations matérielles (par exemple VQuake, pour supporter la puce Vérité 1000 de Rendition de la carte 3D Blaster), puis en fin janvier 1997 réalise un support OpenGL générique (GLQuake), alors supporté par quelques cartes (dont la Voodoo de 3dfx).
Fin 1997, Quake II est publié. Le Quake II engine résulte principalement de la convergence du code des différentes branches. Des retouches structurelles sont apportées, dont la scission des différents aspects du moteur en plusieurs bibliothèques dynamiques séparant par exemple la logique propre au jeu du reste du moteur.
Les différentes versions sont libérées successivement sous GPL en 1999 (Quake engine), puis en 2001 (Quake 2 engine)$^,$.
En 2007, id Software renomme sa gamme de moteurs, et formellement le Quake II engine prend le nom de id Tech 2, et les autres versions intermédiaires depuis le Doom engine (id Tech 1) sont retirées de la gamme.

## Technique
### Software / hardware

L'id tech 2 propose deux modes de rendu de la 3d, soit via la carte vidéo, soit calculée par le processeur. Quake1 ne gérait, dans sa première version, que le rendu processeur.

### Arbre BSP

Les décors sont découpés selon un arbre BSP (Binary space partitioning) : une hiérarchie de plan subdivise l'espace en deux moitiés complètement séparées. Des plans sont également introduits le long des murs extérieurs de la carte. Les sous-zones ainsi définies par les plans sont appelées les Leaf : ce sont elles qui contiennent les objets de la carte. Les feuilles vides contiennent la surface visible (polygones) et les feuilles pleines contiennent les volumes rigides (brushes).
Il est facile de savoir récursivement de quel côté d'un plan un point (ici la caméra) est, et de trouver dans quel leaf elle se situe. On en récupère la liste des leafs visibles (voir pvs). En suivant les plans de l'arbre BSP découpant le monde, on peut avoir un tri parfait des leafs du plus proche au plus éloigné de la caméra. Ce z-ordering est nécessaire pour optimiser le rendu software.

### PVS ou Potentially Visible Set

Tandis que l'Id Tech 1 calcule entièrement l'occlusion en temps réel, l'Id Tech 2 précalcule l'occlusion des feuilles à l'aide de portails lors de la compilation de map. Chaque feuille contient une liste de feuilles visibles. Cela permet de limiter considérablement le rendu de géométrie cachée.

### Brush CollisionMap

Un assemblage de solides convexes (« brushes ») est stocké dans le bsp ainsi que dans les models dynamiques, et permet de calculer les collisions entre les personnages et l'architecture.

### Rendu par GEL

Cette technique finalise le calcul de l'occlusion au pixel près pour le mode rendu software.
Pour ne pas afficher les parties de murs cachées par un mur plus proche, une Globel Edge List est utilisée : elle stocke la liste des bords de tous les triangles déjà affichés, et chaque nouveau triangle est « clippé » (découpé) par ces segments : seuls les parties visibles de ces triangles sont ensuite affichées. Ce clipping est optimisé à l'aide d'un arbre bsp en 2d.
Cette méthode de clipping sera déclinée en rendu d'ombres pour l'id tech 4.

### Textures, Surface Cache

Les murs sont affichés avec une texture de base et une lightmap. Pour ne pas tout afficher deux fois, une Surface est générée en mélangeant la texture et la lightmap utilisées par un mur.
Les Surfaces sont stockées dans un cache, afin de réutiliser celles précédemment calculées, et de les libérer si elles ne sont plus utilisées.
Des Surfaces plus petites sont générées pour les murs plus lointains en utilisant les mipmaps des textures (les lightmaps étant déjà en basse résolution), afin d'économiser de la mémoire et d'éviter un phénomène de crénelage/pixelisation des textures vues de trop loin.

### ZBuffer et personnage

Pendant l'affichage des décors, un Z-buffer est également rempli. Il ne sert pas pendant le rendu du décor, mais pendant le rendu des personnages et autres objets 3D dynamiques, afin de les masquer par le décor quand nécessaire.
Vus de loin, les personnages ne sont pas affichés en 3D mais par un système de voxels : gros point dont la couleur, uniforme, vient de la texture du personnage.

### Éclairage dynamique

Les personnages sont éclairés uniformément, par une couleur qui dépend de leur position ; cette couleur provient d'une structure stockant l'éclairage ambiant en 3D. (="lightvol")

### Affichage des triangles en mode processeur

Le rendu bas niveau des triangles est écrit en assembleur. Il utilise la FPU pour tous les calculs de correction de perspective et d'interpolation des coordonnées de texture, à cause de la quantité limitée de registres entiers.

## Jeux notables

Liste de jeux notables utilisant le moteur, ou une version retouchée, du jeu Quake ou Quake II. Ne sont pas listés ici les mods, les versions du moteur ont suscité l'apparition de centaines de mods.
* Quake (1996, Quake engine)
* QuakeWorld (1996)
* Malice (Quake engine)
* Shrak (Quake engine)
* Quake Mission Pack 1: Scourge Of Armageddon (Quake engine)
* Quake Mission Pack 2: Disolution Of Eternity (Quake engine)
* X-Men: The Ravages of Apocalypse (Quake engine)
* Abyss of Pandemonium (Quake engine)
* Q!Zone for Quake (Quake engine)
* AfterShock for Quake (Quake engine)
* Dark Hour (Quake engine)
* Eternal War (Quake engine)
* Half-Life (1998, GoldSrc)
* Sin (1998, Quake II engine)
* Hexen II (1997, Quake II engine)
* Quake II (1997, Quake II engine)
* Daikatana (2000, Quake II engine)
* Anachronox (2001, Quake II engine)
* Soldier of Fortune (2000, Quake II engine)
* Nexuiz (2005-2009, DarkPlaces)
* UFO: Alien Invasion (2006-, Quake II engine)
* Sin: Wages of Sin (Quake II engine)
* Kingpin (Quake II engine)
* Xonotic (2010-, DarkPlaces)
* Wrath: Aeon of Ruin (2022, DarkPlaces)

## Moteurs libres dérivés

Le 21 décembre 1999, John Carmack de id Software libère le code source du moteur Quake sur Internet sous les termes de la licence publique générale GNU, permettant aux programmeurs de modifier le moteur et d'y ajouter de nouvelles fonctionnalités. Rapidement les premières versions modifiées du moteur ont commencé à circuler sur Internet.

### DarkPlaces

DarkPlaces est une modification du moteur qui améliore le code réseau (netcode), ajoute un support des cartes de Quake III, a un moteur de rendu complètement refait (éclairage et ombres calculées en temps réel, bump mapping, gestion des shaders OpenGL, etc.), un navigateur de serveur intégré et ajoute le support de l'Ogg Vorbis.
Il se base sur la version d'Id Tech 2 qui a été libéré par Id Software et est compatible Linux, macOS et Windows. Il est notamment utilisé par Nexuiz, puis Xonotic ainsi que Wrath: Aeon of Ruin.

### ezQuake

EzQuake est une version modifiée du moteur FuhQuake. Compatible MacOs et FreeBSD, il supporte le QuakeTV et le multiview, amène des options supplémentaires pour les serveurs, de nouveaux menus et intègre un lecteur mp3, un navigateur de serveurs et de parties enregistrées.

### ProQuake

ProQuake est basé sur le code libéré par Id. Ce mod, sous licence GPL, se focalise sur l'amélioration du mode multijoueur (précision des tirs, etc.) et de la protection anti-cheat.

### Telejano

Telejano est une modification dérivée du TomazQuake engine qui ajoute beaucoup de nouveaux éléments.

### Autres moteurs connus

* Tenebrae - un dérivé, le premier à ajouter un éclairage et des ombres calculées en temps réel sur le Quake engine.
* Tomaz Quake< - l'une des premières modification du moteur à se retrouver sur le net.
* Twilight Engine - le plus rapide des moteurs basé sur Quake engine, cette modification privilégie la performance sur les ajouts fonctionnels.

### D'autres moteurs

Il existe bien sûr bien d'autres modifications du moteur:
* ezQuake : Ajoute des effets de particules, d'eau, de brouillard, le support de la QuakeTV, un player MP3 intégré...
* FitzQuake: Principalement de la correction de bugs et de l'ajout d'effets (skyboxes, brouillard, lumières colorées)
* FuhQuake : basé sur ZQuake auquel il a ajouté le support des textures 24 bits, des lumières statiques, ainsi qu'un début de système anti-cheat.
* JoeQuake: basé sur ZQuake et FuhQuake, il se focalise principalement sur la lecture de demo. Il supporte les textures 32 bits, les animations douces et les lumières colorées.
* MacGLQuake: cherche à porter GLQuake et GLHexen 2 sur MacOS.
* Pocket Quake: est un portage de Quake sur Pocket PC.
* QuakeForge: Cherche à améliorer le jeu (par une protection anti-cheat) et à le rendre à accessible à un maximum de personnes.
* ZQuake: Se focalise sur l'amélioration des performances, de la stabilité et de la compatibilité et de rendre le gameplay plus fluide. Il est compatible avec NetQuake et QuakeWorld.