Fact-checked by Grok 2 weeks ago

Doom engine

The Doom engine, also known as id Tech 1, is a pioneering game engine developed primarily by programmer at for the 1993 video game Doom. It introduced efficient rendering techniques, including (BSP) trees to organize level geometry and determine visibility, enabling fast, texture-mapped visuals on contemporary PC hardware without full 3D polygons. The engine separates game logic from assets stored in WAD files, facilitating and ports, and includes components for multiplayer networking over IPX and a sound system with positional audio. Originally compiled for using Watcom C, it powered Doom (1993), : Hell on Earth (1994), and licensed titles like Heretic (1994), : Beyond Heretic (1995), and Strife (1996), establishing foundational standards for the genre with its speed, scalability, and distribution model. Its was publicly released on December 23, 1997, under a non-commercial license by Carmack, who noted its outdated aspects like fixed-point math and polar clipping while encouraging community enhancements for features such as slopes and transparency; it was later relicensed under the GNU GPL in 1999, spawning hundreds of source ports for modern platforms. Despite limitations like no true vertical aiming or overhanging geometry due to its 2D map structure, the engine's innovations in real-time rendering and level design influenced subsequent id Tech iterations and the broader industry.

History and Development

Origins and Creation

The Doom engine originated in late 1992 at , when lead programmer conceived it as a significant advancement over the raycasting technology used in the company's previous title, . Carmack's vision was driven by the need to address 's restrictive flat-world design, which limited environments to uniform floor and ceiling heights without variations or multi-level structures. This evolution aimed to enable pseudo-3D spaces with dynamic height differences, textured ceilings, and more immersive level geometries, transforming gameplay into a more architecturally complex experience. Initial prototype development began shortly after 's release, with Carmack focusing on optimizing performance for the era's hardware. The engine was written primarily in , with performance-critical sections in to leverage the speed of 386 processors, and compiled using the Watcom C compiler, targeting as the primary platform to ensure broad accessibility on consumer PCs. This low-level approach allowed for efficient rendering of the ambitious features, building on techniques Carmack had refined during porting efforts for to other systems like the SNES. Key milestones marked steady progress through 1993, culminating in the core engine's completion by late that year, just ahead of Doom's release on December 10. During this phase, the engine integrated with early level editing tools—precursors to modern Doom builders—enabling designers to construct and iterate on multi-height sectors efficiently. To enhance rendering efficiency amid growing level complexity, Carmack later introduced during development.

Key Developers and Innovations

The Doom engine was primarily architected by lead programmer at , who handled the core technical implementation, including the rendering and spatial partitioning systems. Collaborating closely were project leader and designer , who influenced level integration and gameplay flow, and graphic artist (no relation to John), who focused on integrating visual assets into the engine's rendering pipeline. This division of labor allowed for rapid iteration, with Carmack's programming expertise complemented by the artistic and design contributions that ensured seamless asset loading and visual coherence. A major innovation was the first widespread adoption of (BSP) trees in a , pioneered by to efficiently partition static worlds and resolve during rendering. This offline preprocessing technique divided levels into convex subspaces, enabling fast traversal and front-to-back drawing without a full z-buffer, which dramatically improved performance on 1993 hardware. Complementing this, Carmack implemented column-based for walls and sprites, storing assets vertically to match the engine's per-column rendering approach, which minimized memory access and maximized cache efficiency on era-specific CPUs lacking floating-point units. Similarly, artist Kevin Cloud worked on asset pipelines alongside , creating and optimizing textures, sprites, and environmental elements to fit the engine's constraints, ensuring high-quality visuals without compromising speed. Another breakthrough was the introduction of variable height sectors, allowing floors and ceilings to differ in elevation within the same level, which enabled multi-story environments like overhanging balconies and staircases—a leap beyond the uniform-height raycasting of predecessors like . This feature, implemented by Carmack, supported vertical gameplay tactics while maintaining the engine's architecture of horizontal flats and vertical walls.

Source Code Release and Licensing

On December 23, 1997, id Software released the source code for the Linux version of the Doom engine (version 1.10) under the DOOM Source License, a restrictive non-commercial agreement that permitted non-profit use to encourage community-driven ports and modifications while protecting commercial interests. This release, spearheaded by , provided developers with access to the engine's core without the proprietary game data, explicitly requiring users to possess legitimate Doom binaries for compatibility. The initial impact was immediate and widespread, enabling the rapid development of source ports that extended the engine to new platforms while maintaining binary compatibility with original Doom WAD files. For instance, DOSDoom emerged within a day of the release as the first DOS-targeted port, followed by WinDoom, which adapted the code for Windows environments with features like TCP/IP networking. These early ports preserved the engine's performance on legacy hardware and facilitated , ensuring Doom's longevity beyond its original ecosystem. Subsequent licensing evolutions broadened the code's accessibility; on October 3, 1999, granted permission for re-release under the GNU General Public License version 2 (GPLv2) or later, transitioning from the initial non-profit restrictions to full open-source terms that allowed derivative works and commercial redistribution of modifications. This change spurred advanced derivatives, such as ZDoom, initially released on March 6, 1998, which introduced enhancements like dynamic lighting and improved scripting under the GPLv2. Legally, id Software retained copyright over the proprietary assets, including WAD files containing levels, textures, sounds, and sprites, which remained separate from the open-sourced engine code and required separate licensing for use. This distinction prevented unauthorized distribution of complete games while empowering the community to innovate on the engine itself, with modern ownership under (via ) upholding these separations.

Core Architecture

Game World Fundamentals

The Doom engine utilizes a pseudo-3D architecture, often described as , which constructs immersive environments from fundamentally 2D maps augmented with height attributes rather than employing full geometry. This approach allows for efficient rendering on hardware by projecting flat sectors into a perspective view, simulating depth through variable heights for floors and ceilings while maintaining all structural elements in a horizontal plane. Unlike contemporary true engines, it eschews complex polygonal models or arbitrary surface orientations, prioritizing speed and simplicity in level design and traversal. The operates on a fixed in the X-Y plane, where vertices defining the map's layout are placed at positions ranging from -32,768 to 32,767 units. These coordinates form the backbone of the 2D , with Z-axis values introduced solely for vertical offsets in sectors and movable entities, enabling stacked rooms and elevation changes without intersecting geometry. Player and object positions are computed using 32-bit (16.16 format), providing sub-unit precision for smooth movement and within this grid-based framework. World scale in the map editor aligns directly with map units, which the engine interprets with fixed-point for enhanced , effectively treating each editor as 65,536 internal subunits to handle fractional movements accurately. This ensures consistent proportions, where typical gameplay elements like doorways span 128 units wide, establishing a human-scale without requiring floating-point operations. The automap , when enabled, visually represents 64 units per square for mapper , reinforcing the engine's -aligned . Fundamental constraints shape the engine's world model, notably the absence of dynamic lighting, which relies instead on static light levels assigned per sector to modulate brightness uniformly across enclosed areas. culling is limited to the (BSP) tree, which determines rendering order but does not incorporate advanced techniques like portal visibility or runtime shadowing. These limitations, including the prohibition of sloped surfaces—all floors and ceilings remain perfectly horizontal—stem from the engine's foundational structure, preventing overlaps or non-planar geometry while optimizing for performance on limited processors. Sectors serve as the primary building blocks, encapsulating these attributes into discrete, enclosed volumes.

Level Data Structure

The Doom engine stores level data in WAD (Where's All the Data) files, which use a lump-based archive format consisting of a 12-byte header identifying the file type (IWAD for internal game data or PWAD for patches), the number of lumps, and an offset to the directory; followed by a directory of 16-byte entries for each lump specifying its offset, size, and 8-character name; and the raw data lumps themselves in arbitrary order. Levels are encapsulated within map-specific lumps prefixed by a marker like E1M1, containing the core geometry and entity data required for the game world. Core level components begin with vertices, defined as 4-byte records storing fixed-point X and Y coordinates (16.16 format) to represent 2D points in the grid, serving as endpoints for structural lines. Linedefs connect pairs of vertices in 14-byte records, including indices to start and end vertices, flags for properties like impassability or two-sided rendering, a special type for effects (e.g., teleporters), a tag for sector triggers, and indices to one or two sidedefs; these define the boundaries and behaviors of walls and portals. Sidedefs, in 30-byte records, attach to linedefs and specify texture mappings with X and Y offsets for alignment, names for upper, lower, and middle (padded to 8 bytes, with "-" indicating ), and a reference to the adjacent sector for spatial context. Sectors enclose areas bounded by linedefs in 26-byte records, detailing floor and ceiling heights (in map units), texture names for flats, level (0-255), special types (e.g., damage floors or secrets), and a tag linking to linedef triggers for dynamic effects. Object placement occurs via the THINGS lump, where each 10-byte record positions entities as sprites with X and Y coordinates, facing angle (in 0-359 degrees, multiples of 45), type identifier (e.g., 1 for player start, 7 for spider demon, 5 for blue key), and flags for skill levels, multiplayer spawning, or behavior (deaf monsters). These define interactive elements like enemies, items, and lights without inherent orientation beyond angle and height inheritance from sectors. During loading, the engine reads these raw lumps and preprocesses the geometry by generating segments (SEGS) from linedefs, subdividing sectors into convex subsectors (SSECTORS) for efficient partitioning, and building a binary space partitioning (BSP) node tree (NODES) to organize the map for traversal and rendering, enabling hidden surface removal without per-frame calculations. This BSP integration allows rapid occlusion queries during gameplay, with subsector segmentation ensuring convex polygons for texture projection.
LumpSize per EntryKey FieldsPurpose
VERTEXES4 bytesX, Y coordinates2D map points for geometry.
LINEDEFS14 bytesVertex indices, flags, type, tag, sidedef indicesWall connections and properties.
SIDEDEFS30 bytesTexture offsets, upper/lower/middle textures, sectorWall texturing and adjacency.
SECTORS26 bytesFloor/ceiling heights, flat textures, light, type, tagEnclosed areas and effects.
THINGS10 bytesX/Y position, angle, type, flagsEntity placement and attributes.

Binary Space Partitioning

The (BSP) tree in the Doom engine organizes the 2D level geometry into a hierarchical structure of subspaces, enabling efficient visibility determination and rendering without a full z-buffer. This approach, adapted by from earlier research, partitions the map using lines extended from linedefs as hyperplanes, ensuring all resulting regions (subsectors) are polygons that simplify and occlusion checks. The tree is precomputed offline during level compilation, transforming the raw map data into a where each node represents a partitioning line, and leaf nodes correspond to visible subsectors. BSP tree construction begins with the entire map as the initial region and proceeds recursively: a suitable linedef is selected as the splitter, extended infinitely in both directions to form a partitioning , and the map is divided into two half-spaces containing the remaining geometry. Any linedefs intersected by the splitter are split at the intersection point to avoid crossing partitions, increasing the total number of segments while ensuring convexity. The selection of the splitter aims to balance the tree by minimizing the difference in subtree sizes, often using heuristics to evaluate potential lines based on the number of affected segments and overall balance, as outlined in methods for generating efficient partitioning trees. This recursive process continues until all subregions are small convex subsectors, typically bounded by 4 to 20 segments, resulting in a with depth proportional to the map's complexity. The original Doom node builder, iBSP, implemented this in on , taking seconds to minutes per level depending on size. During rendering, the BSP tree is traversed from the root node using the player's viewpoint to classify and prioritize subsectors for . The function R_RenderBSPNode recursively visits nodes, computing the viewpoint's position relative to each partitioning plane to determine if it lies in the front (positive side), back (negative side), or on the plane. Subtrees on the opposite side of the viewpoint are early, while visible portions are sorted front-to-back to allow natural —closer walls obscure farther ones without depth testing. Bounding boxes around subtrees provide additional coarse , discarding entire branches if they fall outside the view . This traversal identifies active subsectors, which are then rendered by their bounding segments (segs) as walls, ensuring only visible is processed and maintaining consistent on 1993 hardware. Central to both construction and traversal is the side-classification mathematics, which uses vector cross products to evaluate point positions relative to lines. For a point P = (x_0, y_0) and a line defined by points A = (x_1, y_1) and B = (x_2, y_2), the signed value d = (x_2 - x_1)(y_1 - y_0) - (x_1 - x_0)(y_2 - y_1) indicates the side: d > 0 for one half-space (front), d < 0 for the other (back), and d = 0 for collinearity, used in splitting to find intersection points along the line. During tree building, this formula identifies intersections for segment splits; in rendering, it drives the recursive decisions for viewpoint navigation. This efficient 2D computation, requiring only multiplications and subtractions, aligns with the engine's fixed-point arithmetic for speed.

Rendering Pipeline

Wall and Surface Drawing

The Doom engine renders vertical walls and surfaces through a column-based technique that transforms into a view on the screen. Wall segments, known as segs, are projected by converting their endpoint vertices into angular positions using Binary Angular Measurement (BAM) and a (viewangletox) to determine corresponding screen x-coordinates. The vertical extent of each column is calculated based on the segment's distance from the player and the sector's ceiling and floor heights, ensuring perspective scaling where closer walls appear taller. This process avoids full ray tracing by relying on pre-partitioned geometry, drawing one column at a time across the screen width. Texture application occurs via vertical strips extracted from wall textures, which are stored rotated 90 degrees counterclockwise to optimize access during rendering. Each column's coordinate is to align with the wall's position in the , and the strip is scaled vertically by the projected height; upper and lower s fill from to mid-point and mid-point to floor, respectively. Mid-textures, applied to the middle portion of segs, handle features like and windows, with support for transparency in specific cases such as switch animations. Shading is applied using fixed-point light level calculations per column, diminishing with distance. To manage overlaps and occlusion, segs are processed in front-to-back order as dictated by the (BSP) tree traversal, clipping each new segment against previously drawn ones using a span occlusion array (solidsegs). Backface culling eliminates invisible sides by checking if the angle between segment endpoints exceeds 180 degrees from the view. This painter's algorithm approach ensures distant walls are obscured without a depth buffer, limiting the engine to convex rooms but enabling efficient rendering on 1993 hardware. Special effects for walls include through cycling, where textures switch based on elapsed time and predefined sequences defined in the level . Transparent or masked mid-textures, such as those for fences or switches, are rendered in a separate (R_DrawMasked) after walls to composite semi-transparent elements correctly. These effects are constrained to avoid overhead, with no support for arbitrary on full walls.

Floor and Ceiling Texturing

In the Doom engine, floors and ceilings are rendered as horizontal planes textured with low-resolution , which are 64x64 images lacking the vertical seams found in wall textures. These flats are projected onto the screen using an inverse perspective transformation to simulate depth, with the divided into horizontal spans bounded by the vertical walls already drawn in the scene. The rendering process begins after walls are processed, using data from wall column projections to define the visible areas for each flat. Floor and ceiling heights are computed relative to the player's eye position and the sector's predefined floor and ceiling elevations. Calculations employ 16.16 for precision, determining the screen-space y-coordinates where the flat intersects the view ; for instance, the floor Z is derived as the difference between player height and sector height, scaled by distance from the viewpoint. Since sectors are strictly flat with no support for slopes or varying heights within a single plane, this results in uniform Z-levels per sector, simplifying the projection but limiting geometric variety. Performance is enhanced through visplanes, data structures that aggregate and deduplicate rendering of identical flats across the scene. Each visplane captures a unique combination of height, texture index, light level, and screen x-extent, with top and bottom y-boundary arrays defining discontinuous horizontal segments for drawing. The engine precomputes up to 128 visplanes per frame by merging subsectors sharing the same flat properties, avoiding redundant texture mapping and column draws; this hashing-based lookup (later improved in ports) significantly reduces overdraw in open areas. Exceeding the visplane limit in dense levels triggers errors, as seen in the classic "no more visplanes" overflow. Variants handle special environmental effects without altering the core flat system. Sky sectors use a dedicated infinite ceiling flat, mapped with cylindrical texture coordinates that pan based on yaw to create parallax scrolling, rendering behind all other elements. Water and sludge effects rely on sector special types that dynamically adjust floor height with sinusoidal bobbing tied to player movement, combined with lowered light levels and optional transparency via overlaid walls, to evoke liquid surfaces. Span boundaries for these flats are determined by occlusion from previously rendered walls.

Sprite and Entity Rendering

The Doom engine renders interactive elements, such as enemies, items, and projectiles, as sprites that employ billboarding to always face the player's viewpoint. These consist of pre-rendered images stored in the game's WAD files in a column-based format, mirroring the structure used for wall textures to enable shared rendering functions. During rendering, the engine calculates the sprite's orientation by aligning it perpendicular to the from the player, effectively rotating the 2D image in the while keeping it upright in the vertical . Scaling is applied based on the from the player to the sprite's position, with closer sprites appearing larger and farther ones smaller, creating a sense of depth in the pseudo-3D environment. To manage visibility and depth, sprites are collected during the BSP traversal and sorted by their distance from the player, drawn in back-to-front order to handle overlaps correctly among themselves. Occlusion against the world geometry is achieved by clipping sprite columns against the segments (segs) of the BSP subsectors that have already been rendered, ensuring sprites do not pierce walls or floors. This clipping uses the z-buffer equivalent provided by the ordered BSP drawing, where only visible spans of each sprite column are plotted onto the screen buffer, minimizing overdraw and maintaining performance on 1993-era hardware. Animations for entities are driven by frame sequences defined in the WAD lumps, where each sprite type (e.g., for a specific ) includes multiple named systematically, such as "TROOA0" for the first of a trooper. These are selected via state machines in the engine's system, which update states each (1/35th of a second) based on behaviors like walking, attacking, or dying, transitioning to the next or lump as needed. This approach allows for simple yet effective animations without requiring complex skeletal systems. Sprite lighting employs a palette-based shading system with 32 discrete levels, applied uniformly across the but modulated by the ambient light level of the enclosing sector and a distance-based falloff from the . Rather than per-pixel dynamic lights, the engine shifts the sprite's color indices in the 256-color palette toward darker equivalents (e.g., from full to shadowed versions) based on these factors, with farther sprites receiving progressively dimmer to simulate . This method, computed per sprite during drawing, avoids costly real-time calculations while providing visual depth cues.

Audio and Input Systems

Sound Engine Mechanics

The Doom engine's sound effects are stored as raw (PCM) data within WAD files, consisting of unsigned 8-bit samples typically sampled at 11025 Hz to ensure compatibility with contemporary PC sound hardware such as the Sound Blaster. These PCM lumps are loaded into memory via the WAD caching system during initialization, allowing quick access for playback without on-the-fly decompression. Positional audio in the engine employs a straightforward stereo panning mechanism, where the left-right balance is determined by the relative angle to the sound source, calculated from the differences in both X and Y coordinates, scaled through a separation parameter ranging from approximately 32 to 224. attenuation is calculated based on the approximate to the source, using a fast integer approximation for efficiency; sounds are clipped beyond a maximum of 1200 units (in fixed-point FRACUNIT scaling) and reach full volume within 160 units. This approach provides basic spatial cues without true spatialization, relying on hardware output for immersion. Sound mixing supports up to 32 concurrent channels in the engine's design, though practical limits often cap at around 16 due to constraints of the , with allocation managed through a priority system defined in the sfxinfo structure. Higher-priority sounds, such as weapon fire, preempt lower-priority ones like ambient effects when channels are saturated, ensuring critical remains audible; channel reuse occurs dynamically via the S_getChannel to minimize interruptions. The mixing process updates positional volumes frame-by-frame, applying lookup tables for left/right channel scaling to simulate directionality. Music playback utilizes files converted to a format, handled through the sound library developed by Paul Radek for compatibility, which synthesizes tracks via or MIDI-compatible hardware. Level music loops continuously by restarting the track upon completion, invoked via S_ChangeMusic with the looping flag enabled, providing uninterrupted atmospheric scoring without interrupting sound effects. The library interfaces with the engine's I_SetMusicVolume and related functions to maintain separate volume controls for music and effects, preventing overlap in the audio output stream.

Input Handling and Controls

The Doom engine processes user inputs through an event-driven polling mechanism synchronized to the game's fixed 35 Hz rate, ensuring consistent across varying speeds. During each , approximately 1/35th of a second, the system collects discrete inputs from the , , and , translating them into deltas and orientation changes for the player entity. This approach applies vectors based on input states—such as forward up to approximately 3.125 units per for running—before applying friction and clipping speeds to a maximum of 30 units per per axis. Delta-based then resolves these changes relative to the previous position, enabling smooth navigation within the environment. Standard controls rely on the for directional movement (forward, backward, strafe left/right) and turning, with the for running and spacebar for actions like opening or firing weapons. Mouse input handles relative aiming and turning, where horizontal movement adjusts the player's view angle, and sensitivity can be tweaked via in-game menus or files to the per of mouse displacement—ranging from subtle adjustments for precision to higher values for faster sweeps. support, implemented through direct polling of the PC's analog , maps the stick's X and Y axes to turning and forward/backward movement, respectively, with up to four buttons bound to fire, use, and strafe functions, serving as a precursor to modern input APIs like . Collision detection integrates seamlessly with input processing by validating proposed movement deltas against the level geometry using axis-aligned bounding box () checks, where the player occupies a fixed 32x32 . These checks test intersections with linedefs (sector boundaries defining walls and floors) and things (other entities like monsters), rejecting or the movement vector if a collision occurs—large deltas exceeding 15 units are subdivided into smaller steps for accuracy, allowing the player to slide along walls without sticking. This ensures responsive navigation while respecting the engine's spatial constraints. Input configuration is managed through a plain-text file generated by the setup utility (setup.exe), which stores key bindings as hexadecimal scancodes mapped to actions, enabling remapping of and inputs without recompiling the engine. sensitivity and other parameters, such as turning speed multipliers, are also persisted here, with defaults favoring on period . For , the engine incorporates autoaim on projectile weapons, which scans for valid targets within an angular tolerance of approximately ±5.6 degrees off-center (ANG26 in engine units) and a maximum range, automatically pitching or yawing shots toward the nearest enemy to simulate intuitive targeting in the absence of full aiming.

Limitations and Optimizations

Performance Constraints

The Doom engine targeted a frame rate of 35 frames per second on an Intel 80386 processor running at 33 MHz, with rendering synchronized to the monitor's vertical sync (V-sync) to prevent and ensure consistent playback across networked multiplayer sessions. Memory constraints reflected 1993 hardware realities, capping total system support at 8 MB while imposing strict level design limits, such as a maximum of 32,767 sectors per map, to fit within conventional and allocations under . The engine operated as a fully single-threaded application in a non-preemptive DOS environment, lacking any multitasking support and blocking execution during I/O operations like disk reads or network packets; this design choice also precluded features such as sloped floors or recursive portals, which would have exceeded the computational budget of contemporary CPUs. Another key rendering limitation was the 128 visplane cap, which could cause visual artifacts like missing textures or "fuzzy" walls in maps with highly complex floor/ceiling variations. Performance optimizations centered on efficiency for low-end , utilizing fixed-point mathematics for all spatial and trigonometric computations to bypass the slow or absent floating-point units in 386 , and employing column-based caching in the renderer to reuse precomputed vertical spans and alleviate CPU bottlenecks during scene traversal.

Hardware Dependencies

The Doom engine was developed primarily for the operating system running on PC-compatible computers, targeting hardware prevalent in 1993. It required a minimum of an Intel 80386 operating at 33 MHz and 4 MB of to load and execute the game effectively, as the engine's real-time rendering and level loading demanded efficient and CPU cycles. output was constrained to VGA mode at a of 320×200 pixels with 256 colors, leveraging the VGA found in most PCs of the era without any dedicated . To enhance user experience on this platform, the engine supported optional peripherals for audio and input. Sound output relied on devices such as the Sound Blaster card for high-fidelity digitized effects and music via , while basic support provided fallback audio. Input handling was optimized for keyboard and combinations, with compatibility for the joystick to enable analog control in a time when digital pads were common but not universal. The absence of GPU hardware meant all rendering, including and occlusion culling, was performed entirely in software using highly optimized code tailored to the 386 . Early ports to consoles in 1995, such as the Super NES and , highlighted the engine's tight coupling to PC hardware, necessitating major adaptations to accommodate limited processing power, memory, and graphics capabilities. For the Super NES release in September 1995, developers created a custom Reality Engine that diverged significantly from the original, stripping complex features like the tree to fit within the console's 128 KB and reliance on the Super FX-2 for polygon-like rendering. The PlayStation port, arriving later that year, retained more of the core engine structure but required modifications for the console's 2 MB and geometry transformation hardware, including simplified map data from the version to reduce computational overhead. These changes ensured playability but often resulted in reduced visual fidelity and frame rates compared to the PC original.

Legacy and Derivatives

Official Expansions and Ports

The Doom engine powered several official titles developed or published by , beginning with the seminal Doom, released on December 10, 1993, for , which established the engine's capabilities for fast-paced 3D rendering and multiplayer gameplay. This was followed by Doom II: Hell on Earth in 1994, which expanded the engine's features with new enemy behaviors, weapon types, and larger level designs while maintaining compatibility with the original's architecture. These core games formed the foundation for subsequent official content, including expansions that introduced additional levels without altering the engine's core mechanics. Official expansions included Master Levels for Doom II, released on December 26, 1995, which added 21 new single-player maps curated by from community submissions, providing extended gameplay within the Doom II framework. Final Doom, published by in 1996, comprised two distinct episode packs—TNT: Evilution developed by Team TNT and The Plutonia Experiment by the Casali brothers—each featuring 32 levels designed for Doom II, emphasizing increased difficulty and environmental variety while adhering to the engine's level format constraints. Early console ports extended the engine's reach, such as the version of Doom released on November 28, 1994, which adapted the PC original for hardware with limited resources, supporting up to four-player multiplayer via link cable. Licensed variants of the Doom engine enabled commercial derivatives by other studios under id Software's oversight. Raven Software's Heretic, released on December 29, 1994, modified the engine for a fantasy setting, introducing inventory-based magic systems and flying mechanics while preserving the sector-based rendering and handling. This was succeeded by Hexen: Beyond Heretic in 1995, which further evolved the engine with hub-world progression, class-based characters, and puzzle elements, enhancing scripting for more complex interactions. A notable later official release was in 1997, developed by under supervision for the , featuring a customized engine variant with enhancements like colored sector lighting—allowing up to five dynamic colored lights per area for atmospheric effects—and new particle systems for fog and animations, alongside 32 original levels.

Community Modifications and Forks

Following the release of the Doom engine on December 23, 1997, under a non-commercial and its relicensing under the GNU GPL on October 3, 1999, the community rapidly developed modifications and forks that extended the engine's capabilities while preserving its core gameplay. These efforts transformed the engine into a highly flexible platform for modern hardware, enabling enhanced rendering, modding tools, and compatibility with new features without altering the original game's essence. One of the earliest influential source ports was Boom, released in 1998 by TeamTNT (Jim Flynn, Stan Gula, Ty Halderman, Lee Killough, and Rand Phares). Boom focused on limit removal to address vanilla Doom's hardcoded restrictions, such as the visplane overflow that limited map complexity, introducing generalized limits that allowed for more intricate level designs with higher numbers of sectors, lines, and vertices. It also added editing-friendly features like generalized linedef and sector types, enabling adjustable parameters for effects such as friction, wind, and scrolling—often referred to as "sliders" for fine-tuning map behaviors—while maintaining compatibility with original Doom maps and demos. Boom's conservative approach ensured it ran on DOS hardware of the era, fixing numerous bugs and serving as a foundation for subsequent ports. ZDoom, initially released on March 6, 1998, by Marisa Heit (), emerged as another pivotal , merging elements from earlier projects like ATB Doom and NTDOOM to support Windows, , and other platforms. It introduced advanced support through DECORATE for actor definitions and later ZScript (added in version 2.3.0 in 2010), a full scripting language that allowed developers to create complex behaviors, custom weapons, and interactive elements beyond vanilla capabilities. ZDoom also pioneered true rendering, enabling angled floors and ceilings for more dynamic environments, along with uncapped framerates and improved z-clipping to handle vertical . Its derivative, GZDoom (maintained by Christoph Oelckers since 2005 and ongoing as of 2025), expanded on this with hardware-accelerated rendering for dynamic lighting, models, and high-resolution textures, while retaining software rendering options for compatibility. GZDoom's ongoing development has made it the de facto standard for mod-heavy playthroughs. In November 2025, UZDoom was announced as a successor project to GZDoom, building on its features with further optimizations for contemporary systems. In the 2020s, specialized ports continued to evolve the engine for niche uses. DSDA-Doom, forked from PrBoom+ in November 2020 by the Doom Speed Demos Archive team, emphasizes competitive play with robust demo recording, playback, and timing tools, supporting MBF21 features like arch-vile revives and silent teleports while enforcing strict vanilla-like behavior for fair speedrunning. It includes an in-game console, scripting via Lua, and compatibility with Heretic, Hexen, and UDMF maps, making it essential for archival and tournament-grade Doom. Similarly, the Eternity Engine, originally based on SMMU and actively developed since 2007 by James Pugh and others, provides "vanilla+" enhancements such as extended scripting with ACS extensions, skybox support, and randomized map elements, all while prioritizing demo compatibility and limit-removing features to augment classic experiences without requiring UDMF. The engine's modularity, particularly through WAD file format support, fostered a vibrant ecosystem that leverages these ports for gameplay overhauls and total conversions. Brutal Doom, released in 2010 by Marcos Abenante (Sergeant Mark IV), exemplifies this flexibility as a GZDoom-compatible WAD that amplifies combat intensity with interactive gore, new weapons, and third-person views, which has garnered significant popularity within the community by enhancing the engine's sprite-based rendering without engine modifications. Earlier, (1997) demonstrated total conversion potential as a non-violent promotional WAD by Digital Café, replacing demons with "Flemoids" and weapons with zappers in a cereal-branded adventure, proving the engine's adaptability for family-friendly reinterpretations while using vanilla Doom assets. These mods, enabled by the source ports' , have sustained a community producing thousands of WADs annually. As of 2025, community efforts focus on modernizing the engine for contemporary hardware, with ports like GZDoom integrating renderers alongside for high-resolution support up to and beyond, improving performance on multi-core systems and enabling features like true high-dynamic-range lighting. Experimental community projects, such as neural network-based texture upscaling in forks like those derived from Doomsday Engine, apply to enhance original low-res assets to 4x or 8x resolutions while preserving fidelity, though these remain niche due to challenges. This ongoing ensures the Doom engine's relevance nearly three decades after its debut.

References

  1. [1]
    Doom engine - The Doom Wiki at DoomWiki.org
    Various versions of the engine were released by id Software for the DOS ... Note that id sometimes officially refers to the Doom engine as id Tech 1 in ...
  2. [2]
    How Much of a Genius-Level Move Was Using Binary Space ...
    Nov 6, 2019 · A technique called “binary space partitioning,” never before used in a video game, that dramatically sped up the Doom engine.
  3. [3]
    id-Software/DOOM: DOOM Open Source Release - GitHub
    Here it is, at long last. The DOOM source code is released for your non-profit use. You still need real DOOM data to work with this code.
  4. [4]
    Doom rendering engine - The Doom Wiki at DoomWiki.org
    The Doom rendering engine is the core of the game engine that powers Doom and its sequels, and that is used as a base to power other games by id Software ...Level structure · Node building · Development history · Rendering
  5. [5]
    A graphical history of id Tech: Three decades of cutting-edge ...
    May 30, 2025 · For id Software's 1993 follow-up, the seminal Doom, Carmack created an improved rendering algorithm he developed for the SNES version of ...
  6. [6]
    Monsters from the Id: The Making of Doom - Game Developer
    It was actually Id's previous game, Wolfenstein 3D ... Lead programmer John Carmack is clearly the main reason behind the technical superiority of Id's games.<|control11|><|separator|>
  7. [7]
    Doom Engine source code review - Fabien Sanglard
    Jan 13, 2010 · The size of a column is determined by the distance from the player POV, the Y position of a column via the height relative to the played. The ...From Designer Screen To... · Binary Space Partition... · Flats (ceiling And Floor) Or...Missing: 3D Tutorial
  8. [8]
    The Making of Quake, Part 1: We are the Wind | Shacknews
    Jun 4, 2021 · McGee came in as game tester before proving his worth as a level designer and contributing maps to Doom 2. Adrian Carmack and Kevin Cloud ...
  9. [9]
    The Shareware Scene, Part 4: DOOM | The Digital Antiquarian
    Jun 5, 2020 · John Carmack switched virtually all development to these $10,000 machines in the wake of Wolfenstein 3D's success, despite their tiny market ...
  10. [10]
    Doomworld -- 10 Years of Doom
    The first source port was Linux DOOM v1.10. DosDOOM v0.2 was the first to use the term "source port," and many ports trace their heritage to it.
  11. [11]
    WinDoom - The Doom Wiki at DoomWiki.org
    WinDoom is a Windows source port of Doom, created by Bruce A. Lewis and continued by Dean Wiley, with features like TCP/IP networking.
  12. [12]
    Doom source code, under the GNU GPL
    Rating 4.8 (239) Filename : linuxdoom-1.10.src.tgz. Release date : October 3rd 1999 (relicensed by John Carmack) Author : id Software Email Address : johnc@idsoftware.com
  13. [13]
    ZDoom - The Doom Wiki at DoomWiki.org
    ZDoom ; Initial release, 1.11 (1998-03-06, 27 years ago) ; Latest release, 2.8.1 (2016-02-22, 9 years ago) ; Development status, Discontinued ; Written in, C++.
  14. [14]
    Which parts of Doom (1993) are open source and which are not?
    Mar 25, 2020 · Doom is divided into two components: The game engine. The game data. Of these, the source code which was released is for the game engine only, ...
  15. [15]
    If this is open source, how is it being sold? - Steam Community
    Jan 28, 2025 · the doom source code was released under GPL. GPL doesnt prohibit from selling the software, just prohibits users of the source code from not ...
  16. [16]
    WAD Format - ModdingWiki
    Feb 18, 2024 · The WAD ("Where's All the Data") Format is an archive file used by Doom and Rise of the Triad, as well as Doom engine games such as Hexen, Heretic and StrifeFile format · Signature · File entry · Lumps
  17. [17]
    CHAPTER [4]: The Maps, The Levels - Games
    Each level needs eleven resources/directory entries: E[x]M[y], THINGS, LINEDEFS, SIDEDEFS, VERTEXES, SEGS, SSECTORS, NODES, SECTORS, REJECT, and BLOCKMAP. In ...
  18. [18]
  19. [19]
    Sprites – magnushoff.com
    Mar 21, 2019 · Sprites in Doom are stored in a custom format, tailor made for the rendering engine and in a sense even for the final output medium.
  20. [20]
    None
    ### Key Constants and Functions for Sound Format, Initialization, DMX Interface, and Channel Management
  21. [21]
    None
    ### Summary of Key Sound Mechanics in s_sound.c
  22. [22]
    The Doom Movement Bible - Doomworld
    Apr 9, 2016 · The engine largely treats monster movement identically to player movement - it tracks the monster's TAP, and then uses that TAP to test a ...
  23. [23]
    DOOM/linuxdoom-1.10/d_event.h at master · id-Software/DOOM
    - **Insufficient relevant content**: The provided content does not include the full text of `d_event.h` from the specified GitHub repository. It only contains navigation, metadata, and footer information, with no code, constants, or comments related to `BASETICRATE`, frame rate, or performance.
  24. [24]
    [PDF] John Carmack Archive - .plan (1997) - Fabien Sanglard
    Mar 18, 2007 · modifications to the bsp file, now is the time to let me know. 5.4. BAD NEWS. (MAY 22, 1997). Page 31. Chapter 6. June. 6.1 I'm pretty damn ...
  25. [25]
    Doom, Doom 2, Ultimate Doom, and Final Doom Games
    Jun 14, 2025 · Operating System: MS-DOS 5.0 ; Processor: Intel 386DX 33 MHz ; Memory: 4MB RAM ; Graphics Card: VGA graphics capable.
  26. [26]
    Doom - DOS Days
    System Requirements, 80386 CPU. 4 MB RAM required. Graphics support for VGA only (320x200). Audio support for PC Speaker, Ad Lib, Pro Audio Spectrum, PAS16 ( ...
  27. [27]
    DF Retro: we play every single Doom console conversion
    Dec 10, 2018 · Following SNES, we quickly saw the best and worst Doom ports of the era: PlayStation 1 and 3DO, both arriving in the holiday 1995 window.
  28. [28]
    The polygons of DOOM: PSX - Fabien Sanglard
    Mar 26, 2020 · Both plane and walls are rendered on a per-subsector basis thanks to a new concept called "leaves". This "true 3D" approach is made possible by ...
  29. [29]
    Doom (1993) - MobyGames
    Doom popularized multiplayer in the genre with two different modes: Cooperative allows players to move through the single-player game together, while Deathmatch ...Doom credits (DOS · Doom · Covers · Screenshots
  30. [30]
  31. [31]
  32. [32]
  33. [33]
  34. [34]
  35. [35]
    Boom - The Doom Wiki at DoomWiki.org
    Boom is a source port created by TeamTNT to fix bugs and add editing features while maintaining the original Doom feel. It is a conservative port.Features · Derived source ports
  36. [36]
    About ZDoom
    ZDoom is a family of enhanced ports of the Doom engine for running on modern operating systems. It runs on Windows, Linux, and OS X, and adds new features
  37. [37]
    kraflab/dsda-doom: This is a successor of prboom+ with ... - GitHub
    This is a successor of prboom+ with many new features, including: Heretic, Hexen, MBF21, Doom-in-Hexen, UDMF, and MAPINFO support; In-game console and scripting ...Missing: 2020s | Show results with:2020s
  38. [38]
    DSDA-Doom - The Doom Wiki at DoomWiki.org
    DSDA-Doom is a source port based on PrBoom+um, focused on speedrunning, with demo recording and playback, and is not a direct successor to PrBoom+.Missing: 2020s | Show results with:2020s
  39. [39]
    Eternity Engine - Eternity Wiki
    The Eternity Engine is an advanced Doom source port, a versatile feature port with new level design and modding capabilities, and demo compatibility.History · Getting started · Major Features · ReleasesMissing: vanilla+ | Show results with:vanilla+
  40. [40]
    Brutal Doom mod - ModDB
    Feb 27, 2012 · Brütal Doom takes Doom into a whole new level. It makes the game much more violent than before. There's much more blood, plus it adds unique gibs, death ...Files · Brutal Doom v21 · Brutal Doom Platinum · Doom Metal Soundtrack Mod
  41. [41]
    Brutal Doom - The Doom Wiki at DoomWiki.org
    Feb 10, 2024 · Brutal Doom (also stylized as Brütal Doom) is a gameplay mod for GZDoom and Zandronum, created by Marcos Abenante (Sergeant Mark IV).
  42. [42]
    Downloads - ZDoom
    ZDoom now comes in multiple flavours! The primary port, GZDoom, sports advanced hardware (OpenGL) and enhanced software rendering capabilities.Of /files/gzdoom · ZDL · Installation and execution · IWAD
  43. [43]
    Vulkan Renderer Bugs - Welcome to the ZDoom Forums!
    Vulkan Renderer Bugs ; glitching effect on Steam Deck tied to mouse use? · booper · Wed Jun 25, 2025 8:44 pm. 7 Replies: 372 Views ; "Very Fatal Error".
  44. [44]
    New Neural Upscale Project - Doomsday Engine Forums
    May 20, 2020 · The project scales patches and flats by 4x, wall textures by 8x, using pre-trained models, and is raw output with minimal editing.Missing: DoomRL | Show results with:DoomRL