# Doom Engine

Doom Engine (chiamato anche id Tech 1) è il motore grafico sviluppato per lo sparatutto in prima persona Doom, di id Software. In seguito è stato convertito sulla maggior parte delle console da gioco e sistemi operativi esistenti. Il codice sorgente del motore è stato reso disponibile al pubblico il 23 dicembre 1997 sotto una licenza che non ne permetteva l'utilizzo per produzioni commerciali; nel 1999 è stato di nuovo pubblicato sotto licenza GNU General Public License.

## Storia

Il Doom Engine è stato scritto principalmente da John Carmack, con parti di codice ausiliarie scritte da altri componenti di id, su sistema operativo NeXTSTEP; ed è basato, in contrapposizione al precedente Wolfenstein 3D engine, principalmente su linguaggio C con l'ausilio di solo 2 funzioni in assembly. John Carmack ammise che il Doom Engine avrebbe potuto essere scritto maggiormente in linguaggio assembly, ma che questo ne avrebbe potenziato la velocità di rendering di solo il 15%, ed ha poi abbandonato l'idea. Lo sviluppo del motore grafico è stato articolato grazie ad un programma CAD appositamente creato da id, chiamato DoomED, che permette di manipolare le pareti, i soffitti e i pavimenti dell'ambiente di gioco con estrema facilità.

## Tecnologia
### Caratteristiche maggiori e minori

Analogamente al Wolfenstein 3D engine, il Doom Engine, si basa in principio su una mappa bidimensionale (ovvero il gioco nella sua forma originale), che però in base alla posizione della visuale del giocatore restituisce un rendering 2.5D, simile al 3D reale. Il principio però, sebbene simile, non è identico a quello del ray casting di Wolfenstein 3D: in Doom, infatti, la visuale del giocatore stabilisce quale porzione di mondo vedere, ma non quale porzione di mondo (o livello) viene creata. La creazione del livello viene infatti affidata ad un sistema di partizione binaria dello spazio, che suddivide il mondo di gioco in substrati più piccoli (già pre-elaborati) ramificati con una struttura dati ad albero; dunque, in base allo spostamento del giocatore, il livello andrà via via sviluppandosi nello spazio in cui quest'ultimo si muove. La visuale del giocatore, tuttavia, seppure meno importante che in Wolfenstein 3D, decide attualmente ciò che la partizione binaria deve mostrare in tempo reale (indipendentemente dalla porzione di livello creata), modificandosi in maniera dinamica, ad ogni movimento della visuale. Inoltre, dovendo la partizione binaria mostrare solo ciò che il giocatore vede, è sorprendentemente in grado di rimuovere o non lavorare sulle sezioni che non vengono osservate dal giocatore (un punto cieco), potendo concentrarsi solo su ciò che viene realmente ed attualmente rendereizzato; consentendo velocità di elaborazione con prestazioni rapide e al di sopra della norma.
Il motore possiede comunque limitazioni: sviluppandosi sulla bidimensionalità, quindi con un singolo piano (piano XY), la visuale non può essere puntata verso l'asse verticale del sistema di riferimento cartesiano - è possibile infatti muovere il cono visivo solo da destra a sinistra o viceversa. Inoltre, sempre per via della mappatura bidimensionale, non è possibile applicare il room-over-room, ovvero la tecnica, tipica invece del reale 3D, che permette di sovrapporre due stanze, o porzioni di livello, l'una sopra all'altra.
Il Doom Engine è stato elaborato per sfruttare al meglio i processori Intel 80486, e restituisce, al suo massimo potenziale, un rendering VGA con risoluzione a 320×200 pixel e una profondità di colore a 256 livelli; supportando una frequenza d'aggiornamento a 35 hertz. Rispetto al vecchio Wolfenstein 3D engine è inoltre capace di applicare il texture mapping a pavimenti, soffitti e muri di gioco (quest'ultime, le walls-texture, possono anche essere animate o trasparenti); e vanta un rendering dell'illuminazione che può variare in base ai diversi settori di gioco.

### Struttura dei livelli

Essendo basato sulla bidimensionalità, il Doom Engine, è stato elaborato in modo da costruire il gioco, secondo l'uso di certi criteri ed elementi essenziali.
* Unità base:
L'unità di base è il vertice, che rappresenta un singolo punto. I vertici se uniti formano una linea (chiamata linedefs); ogni linea può avere due "facce" chiamate sidedefs; se ne possiede una sola formerà un muro solido, mentre se le possiede entrambe la linea sarà invisibile e valicabile (a meno che non sia dotata di texture o di proprietà bloccanti). Un poligono costituito da almeno tre sidedefs è detto sector (settore), cioè le parti che compongono i livelli di gioco.
* Sidedefs:
Le sidedefs possono essere utilizzate per mostrare le texture dei muri o, nel caso di texture dotate di trasparenza, grate e simili. È possibile utilizzarle per attivare degli eventi (come aprire delle porte se vengono varcate dal giocatore).
* Sectors:
Ogni settore possiede alcune proprietà: le principali e obbligatorie sono l'altezza, il tipo di texture del pavimento e del soffitto, e l'intensità della luce (da 0 a 255). Esistono anche proprietà opzionali: ad esempio, è possibile impostare una luce intermittente oppure fare in modo che il giocatore, percorrendo un determinato settore, subisca danni (utile per simulare pozze di lava o acido). Infine è possibile rendere i settori mobili, per creare ascensori, porte (che si aprono dal basso verso l'alto) e presse.
* Oggetti:
Tutti gli oggetti (mostri, armi, decorazioni ecc, noti come things) sono posizionati in un livello con una coordinata bidimensionale (come ad un vertice); è inoltre possibile indicare caratteristiche aggiuntive, ad esempio, la presenza di un oggetto solo come nel caso della modalità multigiocatore deathmatch.