Difference between revisions of "Long wall error"

From DoomWiki.org

[checked revision][unchecked revision]
m
m (Technical)
Line 7: Line 7:
 
== Technical ==
 
== Technical ==
  
The effect is caused by loss of precision in calculations internal to the [[Doom rendering engine|rendering engine]]. Doom internally uses [[Wikipedia:Fixed-point arithmetic|fixed-point arithmetic]] to perform calculations, for speed. As these fixed-point numbers have a limited range, incredibly long walls can cause a loss of precision, leading to the wall being rendered at the wrong location.  In extreme cases (walls of greater than 10000+ units in length), collision detection stops, and [[thing]]s are able to pass right through a wall.
+
The effect is caused by a severe lack of precision in one of the engine's distance calculation functions. As part of the algorithm to determine the distance of a wall from the player, the engine tries to calculate the distance to one of the line's [[vertex|vertices]]. The engine does so in part by finding an angle to the vertice using an inverse-tangent operation. As this would be slow and difficult to calculate directly, the engine stores a lookup table with inverse tangent values. However, the table is [[inaccurate trigonometry table|only 2048 values long]]. This means the distance cannot be calculated with any precision as the distance to a vertice nears, or exceeds, 2048 units.
  
 
== Example ==
 
== Example ==

Revision as of 20:45, 27 January 2015

The long wall error in a custom WAD file. 2 sectors: Sector 0 is 32768 units long by 512 units wide and Sector 1 is a dummy sector with 91 equidistant units.
The long wall error in a custom WAD file. 2 sectors: Sector 0 is 32768 units long by 512 units wide and Sector 1 is a dummy sector with 91 equidistant units.

Long wall error refers to a bug which occurs when unusually long linedefs are present in a level. Such lines may appear to shift back and forward as the player moves relative to them.

The effect can only be seen on veritably long walls (greater than 1024 units) composed of a single linedef. Greater lengths accentuate the effect more. The problem can be avoided by breaking long walls into multiple linedefs.

Technical

The effect is caused by a severe lack of precision in one of the engine's distance calculation functions. As part of the algorithm to determine the distance of a wall from the player, the engine tries to calculate the distance to one of the line's vertices. The engine does so in part by finding an angle to the vertice using an inverse-tangent operation. As this would be slow and difficult to calculate directly, the engine stores a lookup table with inverse tangent values. However, the table is only 2048 values long. This means the distance cannot be calculated with any precision as the distance to a vertice nears, or exceeds, 2048 units.

Example

  • LOGO.WAD is a deathmatch PWAD from 1994 that consists of four large rooms modelled on the letters of the Doom logo. The leftmost wall of the letter D and the rightmost wall of the letter M exhibit the long wall error; the author mentions the bug in the WAD's text file.