+++ /dev/null
-DESCRIPTION OF PROBLEM:
-=======================
-
-This example map demonstrates what a relatively large value for plane distance
-epsilon can do as far as destroying draw surfaces. The plane distance
-epsilon was 0.01 at the time of this writing. This means that two planes
-with the same normal and a distance 0.00999 apart are considered to be the
-same plane.
-
-The recommended value of plane distance epsilon is more along the lines of
-0.001; however, we can't currently change this epsilon to that value due to
-lack of resolution in 32 bit floating point integers in the 2^16 number range.
-The smallest epsilon in 32 bit float land that can be added to 2^16 that
-results in a value greater than 2^16 is approximately 0.007, which is already
-practically the current default plane distance epsilon (0.01).
-
-Brush 0 in the example map is a 6-sided brush with red top face. The red top
-face is defined such in the .map file:
-
- ( -127 256 513 ) ( -127 384 513 ) ( 1 384 512 )
-
-During the -bsp stage,
-
- In ParseRawBrush() for brush 0
- Side 4:
- (-127.000000 256.000000 513.000000)
- (-127.000000 384.000000 513.000000)
- (1.000000 384.000000 512.000000)
- normal: (0.0078122616 0.0000000000 0.9999694824)
- dist: 511.9921875000
-
-Now brush 1, the 4-sided brush with the red top face, has the following
-defined as the red top face:
-
- ( -128 0 513 ) ( -128 128 513 ) ( 0 128 512 )
-
-It's almost the same plane, only off by a distance of about 0.01.
-
-During compiling:
-
- In ParseRawBrush() for brush 1
- Side 1:
- (-128.000000 0.000000 513.000000)
- (-128.000000 128.000000 513.000000)
- (0.000000 128.000000 512.000000)
- normal: (0.0078122616 0.0000000000 0.9999694824)
- dist: 511.9921875000
-
-Note that the normal and dist are identical to the plane above, even though
-the two are different. This leads to multiplying errors later on, when this
-side is intersected with the bottom green face. In particular, the blue face
-disappears from the map. The blue face:
-
- In CreateBrushWindings() for brush 1
- Handling side 2 on the brush
- Before clipping we have:
- (-262144.00000000 0.00000000 262144.00000000)
- (262144.00000000 0.00000000 262144.00000000)
- (262144.00000000 -0.00000000 -262144.00000000)
- (-262144.00000000 0.00000000 -262144.00000000)
- After clipping w/ side 0 we have:
- (-262144.00000000 0.00000000 262144.00000000)
- (262144.00000000 0.00000000 262144.00000000)
- (262144.00000000 0.00000000 -19977.00073172)
- (-262144.00000000 0.00000000 20983.00073758)
- After clipping w/ side 1 we have:
- (262144.00000000 0.00000000 -1535.99218726)
- (262144.00000000 0.00000000 -19977.00073172)
- (-128.11106773 0.00000000 513.00868046)
- After clipping w/ side 3 we have:
- (0.00000000 0.00000000 503.00000293)
- (-128.11106773 0.00000000 513.00868046)
- (-0.00000000 0.00000000 512.00781274)
-
-We see the error is greater than 0.1 in the X value -128.11106773. This
-causes the draw surface to be discarded in processing later on. We must
-not allow such a great error. An error greater than or equal to 0.1 is
-considered to be very bad.
-
-This disappearing blue triangle can be fixed simply by deleting brush 0,
-the 6-sided brush that causes the bad plane alias. I would suggest deleting
-this brush by editing the .map file manually (and then renumbering the brushes
-manually).
-
-After deleting this brush:
-
- In ParseRawBrush() for brush 0
- Side 1:
- (-128.000000 0.000000 513.000000)
- (-128.000000 128.000000 513.000000)
- (0.000000 128.000000 512.000000)
- normal: (0.0078122616 0.0000000000 0.9999694824)
- dist: 511.9843750000
-
- In CreateBrushWindings() for brush 0
- Handling side 1 on the brush
- Before clipping we have:
- (262132.00000000 262136.00000000 -1535.90625143)
- (262132.00000000 -262136.00000000 -1535.90625143)
- (-262124.00048828 -262136.00000000 2559.84375238)
- (-262124.00048828 262136.00000000 2559.84375238)
- After clipping w/ side 0 we have:
- (262132.00000000 262136.00000000 -1535.90625143)
- (262132.00000000 -262136.00000000 -1535.90625143)
- (-127.99993289 -262136.00000000 512.99999805)
- (-127.99993289 262136.00000000 512.99999805)
- After clipping w/ side 2 we have:
- (262132.00000000 262136.00000000 -1535.90625143)
- (262132.00000000 -0.00000000 -1535.90625143)
- (-127.99993289 -0.00000000 512.99999805)
- (-127.99993289 262136.00000000 512.99999805)
- After clipping w/ side 3 we have:
- (0.00000000 0.00000000 511.99999857)
- (-127.99993289 -0.00000000 512.99999805)
- (-127.99993289 127.99993289 512.99999805)
-
-Note that we're way more accurate now, and we're nowhere near to approaching
-the 0.1 error. All it took was the deletion of a seemintly unrelated brush.
-
-
-SOLUTION TO PROBLEM:
-====================
-
-The suggested fix is to increase the resolution of plane distance from 32 bit
-float to 64 bit float for the relevant brush processing operations. After that
-is done, decrease the default plane distance epsilon from 0.01 to 0.001. Note
-that even though plane distance epsilon can be specified on the command-line,
-it will do no good (even if set to 0) if the plane distance is close to
-2^16.