diff --git a/regression_tests/q3map2/coarse_snap_normal/README.txt b/regression_tests/q3map2/coarse_snap_normal/README.txt new file mode 100644 index 00000000..6525380d --- /dev/null +++ b/regression_tests/q3map2/coarse_snap_normal/README.txt @@ -0,0 +1,16 @@ +DESCRIPTION OF PROBLEM: +======================= + +Because of the coarse nature of SnapNormal(), planes that are 0.25 degrees +away from being axial are "snapped" to be axial. The "normal epsilon" +is a very small value by default, and cannot go much smaller (without +running into limits of floating point numbers). The problem with +SnapNormal() is that we compare the components of the normal that are near +1, instead of comaring the components that are near 0. This leads to a very +coarse and inaccurate SnapNormal(). + +If you open the example map in Radiant, you can see that the red brick should +touch the middle checkered brick at the edge. However, once this map is +compiled, the edges are a significant distance apart. This is due to the +coarse and inaccurate nature of SnapNormal(). Likewise, the green brick should +be flush with the center tiled brick, but it's not. diff --git a/regression_tests/q3map2/coarse_snap_normal/maps/coarse_snap_normal.map b/regression_tests/q3map2/coarse_snap_normal/maps/coarse_snap_normal.map new file mode 100644 index 00000000..bc57098f --- /dev/null +++ b/regression_tests/q3map2/coarse_snap_normal/maps/coarse_snap_normal.map @@ -0,0 +1,96 @@ +// entity 0 +{ +"classname" "worldspawn" +// brush 0 +{ +( 544 312 -8 ) ( -584 312 -8 ) ( -584 -488 -8 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -576 -488 0 ) ( -576 312 0 ) ( 552 312 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -584 -512 8 ) ( 544 -512 8 ) ( 544 -512 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 -488 8 ) ( 512 312 8 ) ( 512 312 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 528 512 8 ) ( -600 512 8 ) ( -600 512 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -512 312 8 ) ( -512 -488 8 ) ( -512 -488 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 1 +{ +( 720 512 0 ) ( 512 512 0 ) ( 512 -512 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 -512 512 ) ( 512 512 512 ) ( 720 512 512 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 -512 512 ) ( 720 -512 512 ) ( 720 -512 -8 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 520 -512 520 ) ( 520 512 520 ) ( 520 512 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 720 512 512 ) ( 512 512 512 ) ( 512 512 -8 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 512 512 ) ( 512 -512 512 ) ( 512 -512 -8 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 2 +{ +( -512 512 0 ) ( -592 512 0 ) ( -592 -512 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -592 -512 512 ) ( -592 512 512 ) ( -512 512 512 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -592 -512 512 ) ( -512 -512 512 ) ( -512 -512 -8 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -512 -512 512 ) ( -512 512 512 ) ( -512 512 -8 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -512 512 512 ) ( -592 512 512 ) ( -592 512 -8 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -520 512 536 ) ( -520 -512 536 ) ( -520 -512 16 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 3 +{ +( 512 512 512 ) ( -512 512 512 ) ( -512 -512 512 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -488 -512 520 ) ( -488 512 520 ) ( 536 512 520 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -512 -512 664 ) ( 512 -512 664 ) ( 512 -512 512 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 -512 664 ) ( 512 512 664 ) ( 512 512 512 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 512 664 ) ( -512 512 664 ) ( -512 512 512 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -512 512 664 ) ( -512 -512 664 ) ( -512 -512 512 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 4 +{ +( 512 608 0 ) ( -512 608 0 ) ( -512 520 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -512 520 512 ) ( -512 608 512 ) ( 512 608 512 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -512 512 512 ) ( 512 512 512 ) ( 512 512 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( 512 520 512 ) ( 512 608 512 ) ( 512 608 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 520 520 ) ( -512 520 520 ) ( -512 520 8 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -512 608 512 ) ( -512 520 512 ) ( -512 520 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 5 +{ +( 512 -512 0 ) ( -512 -512 0 ) ( -512 -600 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -512 -600 512 ) ( -512 -512 512 ) ( 512 -512 512 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -512 -520 520 ) ( 512 -520 520 ) ( 512 -520 8 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 -600 512 ) ( 512 -512 512 ) ( 512 -512 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 -512 512 ) ( -512 -512 512 ) ( -512 -512 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -512 -512 512 ) ( -512 -600 512 ) ( -512 -600 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 6 +{ +( 512 72 64 ) ( -512 72 64 ) ( -512 -448 64 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -128 448 260 ) ( 192 448 260 ) ( 192 -448 256 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -512 -448 256 ) ( 512 -448 256 ) ( 512 -448 56 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( 192 -440 256 ) ( 192 80 256 ) ( 192 80 56 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( 192 448 260 ) ( -128 448 260 ) ( -128 448 64 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -128 56 256 ) ( -128 -464 256 ) ( -128 -464 56 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 7 +{ +( 192 -448 232 ) ( -128 -448 232 ) ( -128 -472 232 ) radiant_regression_tests/green 0 0 0 0.500000 0.500000 0 0 0 +( -128 -472 256 ) ( -128 -448 256 ) ( 192 -448 256 ) radiant_regression_tests/green 0 0 0 0.500000 0.500000 0 0 0 +( -128 -472 256 ) ( 192 -472 256 ) ( 192 -472 232 ) radiant_regression_tests/green 0 0 0 0.500000 0.500000 0 0 0 +( 192 -472 256 ) ( 192 -448 256 ) ( 192 -448 232 ) radiant_regression_tests/green 0 0 0 0.500000 0.500000 0 0 0 +( 192 -448 256 ) ( -128 -448 256 ) ( -128 -448 232 ) radiant_regression_tests/green 0 0 0 0.500000 0.500000 0 0 0 +( -128 -448 256 ) ( -128 -472 256 ) ( -128 -472 232 ) radiant_regression_tests/green 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 8 +{ +( 192 472 260 ) ( -128 472 260 ) ( -128 448 260 ) radiant_regression_tests/red 0 0 0 0.500000 0.500000 0 0 0 +( -128 448 280 ) ( -128 472 280 ) ( 192 472 280 ) radiant_regression_tests/red 0 0 0 0.500000 0.500000 0 0 0 +( -128 448 280 ) ( 192 448 280 ) ( 192 448 256 ) radiant_regression_tests/red 0 0 0 0.500000 0.500000 0 0 0 +( 192 448 280 ) ( 192 472 280 ) ( 192 472 256 ) radiant_regression_tests/red 0 0 0 0.500000 0.500000 0 0 0 +( 192 472 280 ) ( -128 472 280 ) ( -128 472 256 ) radiant_regression_tests/red 0 0 0 0.500000 0.500000 0 0 0 +( -128 472 280 ) ( -128 448 280 ) ( -128 448 256 ) radiant_regression_tests/red 0 0 0 0.500000 0.500000 0 0 0 +} +} +// entity 1 +{ +"light" "3000" +"origin" "0 0 384" +"classname" "light" +} +// entity 2 +{ +"origin" "0 -64 384" +"classname" "info_player_deathmatch" +} diff --git a/regression_tests/q3map2/coarse_snap_normal/textures/radiant_regression_tests/green.tga b/regression_tests/q3map2/coarse_snap_normal/textures/radiant_regression_tests/green.tga new file mode 100644 index 00000000..8f6d3a49 Binary files /dev/null and b/regression_tests/q3map2/coarse_snap_normal/textures/radiant_regression_tests/green.tga differ diff --git a/regression_tests/q3map2/coarse_snap_normal/textures/radiant_regression_tests/red.tga b/regression_tests/q3map2/coarse_snap_normal/textures/radiant_regression_tests/red.tga new file mode 100644 index 00000000..eec24b6a Binary files /dev/null and b/regression_tests/q3map2/coarse_snap_normal/textures/radiant_regression_tests/red.tga differ diff --git a/regression_tests/q3map2/coarse_snap_normal/textures/radiant_regression_tests/tile.tga b/regression_tests/q3map2/coarse_snap_normal/textures/radiant_regression_tests/tile.tga new file mode 100644 index 00000000..2154015f Binary files /dev/null and b/regression_tests/q3map2/coarse_snap_normal/textures/radiant_regression_tests/tile.tga differ diff --git a/regression_tests/q3map2/degenerate_winding/README.txt b/regression_tests/q3map2/degenerate_winding/README.txt new file mode 100644 index 00000000..b060d083 --- /dev/null +++ b/regression_tests/q3map2/degenerate_winding/README.txt @@ -0,0 +1,4 @@ +DESCRIPTION OF PROBLEM: +======================= + +I'm testing when windings become degenerate. diff --git a/regression_tests/q3map2/degenerate_winding/maps/degenerate_winding.map b/regression_tests/q3map2/degenerate_winding/maps/degenerate_winding.map new file mode 100644 index 00000000..def779b1 --- /dev/null +++ b/regression_tests/q3map2/degenerate_winding/maps/degenerate_winding.map @@ -0,0 +1,78 @@ +// entity 0 +{ +"classname" "worldspawn" +// brush 0 +{ +( 256 256 -8 ) ( -256 256 -8 ) ( -256 -264 -8 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 -264 0 ) ( -256 256 0 ) ( 256 256 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -256 -256 8 ) ( 256 -256 8 ) ( 256 -256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 -264 8 ) ( 256 256 8 ) ( 256 256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 256 8 ) ( -256 256 8 ) ( -256 256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 256 8 ) ( -256 -264 8 ) ( -256 -264 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 1 +{ +( 296 256 0 ) ( 256 256 0 ) ( 256 -256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 280 -256 512 ) ( 280 256 512 ) ( 320 256 512 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 -256 392 ) ( 296 -256 392 ) ( 296 -256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 264 -256 384 ) ( 264 256 384 ) ( 264 256 -8 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 296 256 392 ) ( 256 256 392 ) ( 256 256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 256 392 ) ( 256 -256 392 ) ( 256 -256 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 2 +{ +( -256 256 0 ) ( -320 256 0 ) ( -320 -256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -320 -256 512 ) ( -320 256 512 ) ( -256 256 512 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -320 -256 504 ) ( -256 -256 504 ) ( -256 -256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 -256 504 ) ( -256 256 504 ) ( -256 256 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -256 256 504 ) ( -320 256 504 ) ( -320 256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -264 256 496 ) ( -264 -256 496 ) ( -264 -256 -8 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 3 +{ +( 256 256 512 ) ( -256 256 512 ) ( -256 -256 512 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -224 -256 520 ) ( -224 256 520 ) ( 288 256 520 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 -256 584 ) ( 256 -256 584 ) ( 256 -256 512 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 -256 584 ) ( 256 256 584 ) ( 256 256 512 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 256 584 ) ( -256 256 584 ) ( -256 256 512 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 256 584 ) ( -256 -256 584 ) ( -256 -256 512 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 4 +{ +( 256 328 0 ) ( -256 328 0 ) ( -256 256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 256 512 ) ( -256 328 512 ) ( 256 328 512 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 256 512 ) ( 256 256 512 ) ( 256 256 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( 256 256 512 ) ( 256 328 512 ) ( 256 328 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 264 536 ) ( -256 264 536 ) ( -256 264 24 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 328 512 ) ( -256 256 512 ) ( -256 256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 5 +{ +( 256 -256 0 ) ( -256 -256 0 ) ( -256 -304 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 -304 512 ) ( -256 -256 512 ) ( 256 -256 512 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 -264 520 ) ( 256 -264 520 ) ( 256 -264 8 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 -304 512 ) ( 256 -256 512 ) ( 256 -256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 -256 512 ) ( -256 -256 512 ) ( -256 -256 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -256 -256 512 ) ( -256 -304 512 ) ( -256 -304 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 6 +{ +( 64 0 128 ) ( 8 0 128 ) ( 8 -8 128 ) radiant_regression_tests/red 0 0 0 0.500000 0.500000 0 0 0 +( 8 -8 464 ) ( 8 0 464 ) ( 64 0 464 ) radiant_regression_tests/red 0 0 0 0.500000 0.500000 0 0 0 +( -240 8 464 ) ( -240 0 464 ) ( -240 0 160 ) radiant_regression_tests/red 0 0 0 0.500000 0.500000 0 0 0 +( -240 24 128 ) ( 160 8 128 ) ( -240 24 464 ) radiant_regression_tests/green 0 0 0 0.500000 0.500000 0 0 0 +( 160 8 128 ) ( -240 0 128 ) ( 160 8 464 ) radiant_regression_tests/green 0 0 0 0.500000 0.500000 0 0 0 +( 159 11 128 ) ( 159 0 128 ) ( 159 11 464 ) radiant_regression_tests/red 0 0 0 0.500000 0.500000 0 0 0 +} +} +// entity 1 +{ +"light" "1000" +"origin" "-40 0 32" +"classname" "light" +} +// entity 2 +{ +"origin" "-40 128 96" +"classname" "info_player_deathmatch" +} diff --git a/regression_tests/q3map2/degenerate_winding/textures/radiant_regression_tests/green.tga b/regression_tests/q3map2/degenerate_winding/textures/radiant_regression_tests/green.tga new file mode 100644 index 00000000..8f6d3a49 Binary files /dev/null and b/regression_tests/q3map2/degenerate_winding/textures/radiant_regression_tests/green.tga differ diff --git a/regression_tests/q3map2/degenerate_winding/textures/radiant_regression_tests/red.tga b/regression_tests/q3map2/degenerate_winding/textures/radiant_regression_tests/red.tga new file mode 100644 index 00000000..eec24b6a Binary files /dev/null and b/regression_tests/q3map2/degenerate_winding/textures/radiant_regression_tests/red.tga differ diff --git a/regression_tests/q3map2/degenerate_winding/textures/radiant_regression_tests/tile.tga b/regression_tests/q3map2/degenerate_winding/textures/radiant_regression_tests/tile.tga new file mode 100644 index 00000000..2154015f Binary files /dev/null and b/regression_tests/q3map2/degenerate_winding/textures/radiant_regression_tests/tile.tga differ diff --git a/regression_tests/q3map2/disappearing_sliver/winding_logging.patch b/regression_tests/q3map2/disappearing_sliver/winding_logging.patch index c697eb92..a1babe91 100644 --- a/regression_tests/q3map2/disappearing_sliver/winding_logging.patch +++ b/regression_tests/q3map2/disappearing_sliver/winding_logging.patch @@ -1,18 +1,17 @@ Index: tools/quake3/q3map2/brush.c =================================================================== ---- tools/quake3/q3map2/brush.c (revision 371) +--- tools/quake3/q3map2/brush.c (revision 391) +++ tools/quake3/q3map2/brush.c (working copy) -@@ -356,17 +356,29 @@ - winding_t *w; +@@ -421,10 +421,16 @@ side_t *side; plane_t *plane; -+ + +- + static int brushord = -1; + brushord++; + + Sys_Printf("In CreateBrushWindings() for brush %i\n", brushord); - -- ++ /* walk the list of brush sides */ for( i = 0; i < brush->numsides; i++ ) { @@ -21,33 +20,46 @@ Index: tools/quake3/q3map2/brush.c /* get side and plane */ side = &brush->sides[ i ]; plane = &mapplanes[ side->planenum ]; - - /* make huge winding */ +@@ -435,7 +441,13 @@ + #else w = BaseWindingForPlane( plane->normal, plane->dist ); + #endif +- + + Sys_Printf(" Before clipping we have:\n"); + int z; + for (z = 0; z < w->numpoints; z++) { + Sys_Printf(" (%.8f %.8f %.8f)\n", w->p[z][0], w->p[z][1], w->p[z][2]); + } - ++ /* walk the list of brush sides */ for( j = 0; j < brush->numsides && w != NULL; j++ ) -@@ -379,6 +391,11 @@ - continue; - plane = &mapplanes[ brush->sides[ j ].planenum ^ 1 ]; + { +@@ -451,7 +463,20 @@ + #else ChopWindingInPlace( &w, plane->normal, plane->dist, 0 ); // CLIP_EPSILON ); + #endif +- + + Sys_Printf(" After clipping w/ side %i we have:\n", j); -+ for (z = 0; z < w->numpoints; z++) { -+ Sys_Printf(" (%.8f %.8f %.8f)\n", w->p[z][0], w->p[z][1], w->p[z][2]); ++ if (w) ++ { ++ for (z = 0; z < w->numpoints; z++) ++ { ++ Sys_Printf(" (%.8f %.8f %.8f)\n", w->p[z][0], w->p[z][1], w->p[z][2]); ++ } + } - ++ else ++ { ++ Sys_Printf(" winding is NULL\n"); ++ } ++ /* ydnar: fix broken windings that would generate trifans */ - FixWinding( w ); + #if EXPERIMENTAL_HIGH_PRECISION_MATH_Q3MAP2_FIXES + FixWindingAccu(w); Index: tools/quake3/q3map2/map.c =================================================================== ---- tools/quake3/q3map2/map.c (revision 371) +--- tools/quake3/q3map2/map.c (revision 391) +++ tools/quake3/q3map2/map.c (working copy) @@ -803,7 +803,11 @@ char shader[ MAX_QPATH ]; @@ -74,7 +86,7 @@ Index: tools/quake3/q3map2/map.c if( !GetToken( qtrue ) ) break; if( !strcmp( token, "}" ) ) -@@ -917,6 +924,10 @@ +@@ -917,7 +924,16 @@ } /* find the plane number */ @@ -83,5 +95,11 @@ Index: tools/quake3/q3map2/map.c + Sys_Printf(" (%f %f %f)\n", planePoints[1][0], planePoints[1][1], planePoints[1][2]); + Sys_Printf(" (%f %f %f)\n", planePoints[2][0], planePoints[2][1], planePoints[2][2]); planenum = MapPlaneFromPoints( planePoints ); ++ Sys_Printf(" normal: (%.10f %.10f %.10f)\n", ++ mapplanes[planenum].normal[0], ++ mapplanes[planenum].normal[1], ++ mapplanes[planenum].normal[2]); ++ Sys_Printf(" dist: %.10f\n", mapplanes[planenum].dist); side->planenum = planenum; + /* bp: get the texture mapping for this texturedef / plane combination */ diff --git a/regression_tests/q3map2/disappearing_sliver3/NOTES.txt b/regression_tests/q3map2/disappearing_sliver3/NOTES.txt new file mode 100644 index 00000000..aebd534f --- /dev/null +++ b/regression_tests/q3map2/disappearing_sliver3/NOTES.txt @@ -0,0 +1,36 @@ +Random notes for Rambetter, don't expect to understand this: +============================================================ + +Brush 0 is the problem. + +Side 0 is the problem (under surf tri). +Side 1 is the +y 4-face. +Side 2 is the -x 4-face. +Side 3 is the -y 4-face. +side 4 is the +z tri. + +(6144, 16122) -> (6784, 16241) +x "climb" of side 1 is 6784 - 6144 = 640. +y "climb" of side 1 is 16241 - 16122 = 119. + +x/y "climb rate" of side 1 is 640 / 119 = 5.378151261. + +After clipping side 0 against side 1, we get +************ +**** (-262144, -33762.8125) -> (262144, 63722) +************ +The slope of that is (262144 + 262144) / (63722 + 33762.8125) = 5.378150571. + +(-262144, y) -> (6784, 16241) +So (6784 + 262144) / (16241 - y) = 640 / 119 +So y = 16241 - ((119 * (6784 + 262144)) / 640) = -33762.8 + +(6144, 16122) -> (262144, y) +So (262144 - 6144) / (y - 16122) = 640 / 119 +So y = 16122 + ((119 * (262144 - 6144)) / 640) = 63722 + +After clipping side 0 against side 1 should have +************ +**** (-262144, -33762.8) -> (262144, 63722) +************ + diff --git a/regression_tests/q3map2/duplicate_plane/README.txt b/regression_tests/q3map2/duplicate_plane/README.txt new file mode 100644 index 00000000..8c2ef028 --- /dev/null +++ b/regression_tests/q3map2/duplicate_plane/README.txt @@ -0,0 +1,13 @@ +DESCRIPTION OF PROBLEM: +======================= + +The 4-sided brush in the middle of the room (brush 0) has a duplicate plane. +The last side (side 4) is a duplicate of the third side (side 2) with the +vertexes re-arranged. + +I wanted to make sure that ChopWindingInPlaceAccu() is doing the right thing +by setting a winding to NULL when all its points lie on the plane that the +winding is being chopped with. This seems to be the case. My concern was +that both windings for that duplicate plane will be NULL'ed out. + +Seems that some other code might be fixing duplicate planes. That's OK. diff --git a/regression_tests/q3map2/duplicate_plane/maps/duplicate_plane.map b/regression_tests/q3map2/duplicate_plane/maps/duplicate_plane.map new file mode 100644 index 00000000..029161a4 --- /dev/null +++ b/regression_tests/q3map2/duplicate_plane/maps/duplicate_plane.map @@ -0,0 +1,77 @@ +// entity 0 +{ +"classname" "worldspawn" +// brush 0 +{ +( 136 128 64 ) ( -128 128 64 ) ( -128 -192 64 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( 136 128 384 ) ( -128 128 384 ) ( -128 128 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( 128 -192 0 ) ( -128 128 0 ) ( 128 -192 384 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -128 128 256 ) ( 128 128 64 ) ( -128 -192 256 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( 128 -192 384 ) ( 128 -192 0 ) ( -128 128 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 1 +{ +( 256 256 -8 ) ( -256 256 -8 ) ( -256 -256 -8 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 -256 0 ) ( -256 256 0 ) ( 256 256 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -256 -256 8 ) ( 256 -256 8 ) ( 256 -256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 -256 8 ) ( 256 256 8 ) ( 256 256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 256 8 ) ( -256 256 8 ) ( -256 256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 256 8 ) ( -256 -256 8 ) ( -256 -256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 2 +{ +( -256 256 0 ) ( -280 256 0 ) ( -280 -256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -280 -256 384 ) ( -280 256 384 ) ( -256 256 384 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -280 -256 384 ) ( -256 -256 384 ) ( -256 -256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 -256 384 ) ( -256 256 384 ) ( -256 256 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -256 256 384 ) ( -280 256 384 ) ( -280 256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -264 256 392 ) ( -264 -256 392 ) ( -264 -256 8 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 3 +{ +( 280 256 0 ) ( 256 256 0 ) ( 256 -256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 -256 384 ) ( 256 256 384 ) ( 280 256 384 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 -256 384 ) ( 280 -256 384 ) ( 280 -256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 264 -256 384 ) ( 264 256 384 ) ( 264 256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 280 256 384 ) ( 256 256 384 ) ( 256 256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 256 384 ) ( 256 -256 384 ) ( 256 -256 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 4 +{ +( 256 256 384 ) ( -256 256 384 ) ( -256 -256 384 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -248 -256 392 ) ( -248 256 392 ) ( 264 256 392 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 -256 424 ) ( 256 -256 424 ) ( 256 -256 384 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 -256 424 ) ( 256 256 424 ) ( 256 256 384 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 256 424 ) ( -256 256 424 ) ( -256 256 384 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 256 424 ) ( -256 -256 424 ) ( -256 -256 384 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 5 +{ +( 256 296 0 ) ( -256 296 0 ) ( -256 256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 256 384 ) ( -256 296 384 ) ( 256 296 384 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 256 384 ) ( 256 256 384 ) ( 256 256 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( 256 256 384 ) ( 256 296 384 ) ( 256 296 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 264 392 ) ( -256 264 392 ) ( -256 264 8 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 296 384 ) ( -256 256 384 ) ( -256 256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 6 +{ +( 256 -256 0 ) ( -256 -256 0 ) ( -256 -296 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 -296 384 ) ( -256 -256 384 ) ( 256 -256 384 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -256 -264 392 ) ( 256 -264 392 ) ( 256 -264 8 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 -296 384 ) ( 256 -256 384 ) ( 256 -256 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 256 -256 384 ) ( -256 -256 384 ) ( -256 -256 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -256 -256 384 ) ( -256 -296 384 ) ( -256 -296 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +} +// entity 1 +{ +"origin" "-8 16 256" +"classname" "info_player_deathmatch" +} +// entity 2 +{ +"light" "1000" +"origin" "-32 -40 256" +"classname" "light" +} diff --git a/regression_tests/q3map2/duplicate_plane/textures/radiant_regression_tests/tile.tga b/regression_tests/q3map2/duplicate_plane/textures/radiant_regression_tests/tile.tga new file mode 100644 index 00000000..2154015f Binary files /dev/null and b/regression_tests/q3map2/duplicate_plane/textures/radiant_regression_tests/tile.tga differ diff --git a/regression_tests/q3map2/plane_aliasing/README.txt b/regression_tests/q3map2/plane_aliasing/README.txt new file mode 100644 index 00000000..c76d574f --- /dev/null +++ b/regression_tests/q3map2/plane_aliasing/README.txt @@ -0,0 +1,129 @@ +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. diff --git a/regression_tests/q3map2/plane_aliasing/maps/plane_aliasing.map b/regression_tests/q3map2/plane_aliasing/maps/plane_aliasing.map new file mode 100644 index 00000000..52885a58 --- /dev/null +++ b/regression_tests/q3map2/plane_aliasing/maps/plane_aliasing.map @@ -0,0 +1,85 @@ +// entity 0 +{ +"classname" "worldspawn" +// brush 0 +{ +( -127 384 513 ) ( -127 256 513 ) ( -127 256 384 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( 1 384 512 ) ( -127 384 512 ) ( -127 384 384 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( 1 256 512 ) ( 1 384 512 ) ( 1 384 384 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -127 256 512 ) ( 1 256 512 ) ( 1 256 384 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -127 256 513 ) ( -127 384 513 ) ( 1 384 512 ) radiant_regression_tests/red 0 0 0 0.500000 0.500000 0 0 0 +( 1 384 384 ) ( -127 384 384 ) ( -127 256 384 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 1 +{ +( 0 128 503 ) ( -128 128 513 ) ( 0 0 503 ) radiant_regression_tests/green 0 0 0 0.500000 0.500000 0 0 0 +( -128 0 513 ) ( -128 128 513 ) ( 0 128 512 ) radiant_regression_tests/red 0 0 0 0.500000 0.500000 0 0 0 +( -128 0 512 ) ( 0 0 512 ) ( 0 0 384 ) radiant_regression_tests/blue 0 0 0 0.500000 0.500000 0 0 0 +( -128 128 503 ) ( 0 0 503 ) ( -128 128 513 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 2 +{ +( -128 472 8 ) ( -128 320 8 ) ( -128 320 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -232 512 8 ) ( -416 512 8 ) ( -416 512 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 -304 8 ) ( 512 -152 8 ) ( 512 -152 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 48 -512 8 ) ( 232 -512 8 ) ( 232 -512 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -432 232 0 ) ( -432 384 0 ) ( -248 384 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -256 384 -8 ) ( -440 384 -8 ) ( -440 232 -8 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 3 +{ +( -136 512 1040 ) ( -136 -512 1040 ) ( -136 -512 8 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -512 512 1032 ) ( -520 512 1032 ) ( -520 512 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -128 -512 1032 ) ( -128 512 1032 ) ( -128 512 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -520 -512 1032 ) ( -512 -512 1032 ) ( -512 -512 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -520 -512 1024 ) ( -520 512 1024 ) ( -512 512 1024 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -512 512 0 ) ( -520 512 0 ) ( -520 -512 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 4 +{ +( 512 512 1024 ) ( 512 -512 1024 ) ( 512 -512 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( 592 512 1024 ) ( 512 512 1024 ) ( 512 512 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 520 -512 1000 ) ( 520 512 1000 ) ( 520 512 -24 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 -512 1024 ) ( 592 -512 1024 ) ( 592 -512 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 -512 1024 ) ( 512 512 1024 ) ( 592 512 1024 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 592 512 0 ) ( 512 512 0 ) ( 512 -512 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 5 +{ +( -128 512 1200 ) ( -128 -512 1200 ) ( -128 -512 1024 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 512 1200 ) ( -512 512 1200 ) ( -512 512 1024 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 -512 1200 ) ( 512 512 1200 ) ( 512 512 1024 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -512 -512 1200 ) ( 512 -512 1200 ) ( 512 -512 1024 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -456 -512 1032 ) ( -456 512 1032 ) ( 568 512 1032 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 512 1024 ) ( -512 512 1024 ) ( -512 -512 1024 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 6 +{ +( -128 712 1024 ) ( -128 512 1024 ) ( -128 512 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 520 1040 ) ( -512 520 1040 ) ( -512 520 16 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 512 1024 ) ( 512 712 1024 ) ( 512 712 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -512 512 1024 ) ( 512 512 1024 ) ( 512 512 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -512 512 1024 ) ( -512 712 1024 ) ( 512 712 1024 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 712 0 ) ( -512 712 0 ) ( -512 512 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 7 +{ +( -128 -512 1024 ) ( -128 -624 1024 ) ( -128 -624 56 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 -512 1024 ) ( -512 -512 1024 ) ( -512 -512 56 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( 512 -624 1024 ) ( 512 -512 1024 ) ( 512 -512 56 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -512 -520 1048 ) ( 512 -520 1048 ) ( 512 -520 80 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -512 -624 1024 ) ( -512 -512 1024 ) ( 512 -512 1024 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 512 -504 0 ) ( -512 -504 0 ) ( -512 -616 0 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +} +// entity 1 +{ +"classname" "light" +"origin" "192 64 640" +"light" "3000" +} +// entity 2 +{ +"classname" "info_player_deathmatch" +"origin" "-64 64 640" +} diff --git a/regression_tests/q3map2/plane_aliasing/textures/radiant_regression_tests/blue.tga b/regression_tests/q3map2/plane_aliasing/textures/radiant_regression_tests/blue.tga new file mode 100644 index 00000000..f6ad38a6 Binary files /dev/null and b/regression_tests/q3map2/plane_aliasing/textures/radiant_regression_tests/blue.tga differ diff --git a/regression_tests/q3map2/plane_aliasing/textures/radiant_regression_tests/green.tga b/regression_tests/q3map2/plane_aliasing/textures/radiant_regression_tests/green.tga new file mode 100644 index 00000000..8f6d3a49 Binary files /dev/null and b/regression_tests/q3map2/plane_aliasing/textures/radiant_regression_tests/green.tga differ diff --git a/regression_tests/q3map2/plane_aliasing/textures/radiant_regression_tests/red.tga b/regression_tests/q3map2/plane_aliasing/textures/radiant_regression_tests/red.tga new file mode 100644 index 00000000..eec24b6a Binary files /dev/null and b/regression_tests/q3map2/plane_aliasing/textures/radiant_regression_tests/red.tga differ diff --git a/regression_tests/q3map2/plane_aliasing/textures/radiant_regression_tests/tile.tga b/regression_tests/q3map2/plane_aliasing/textures/radiant_regression_tests/tile.tga new file mode 100644 index 00000000..2154015f Binary files /dev/null and b/regression_tests/q3map2/plane_aliasing/textures/radiant_regression_tests/tile.tga differ diff --git a/regression_tests/q3map2/segmentation_fault/README.txt b/regression_tests/q3map2/segmentation_fault/README.txt new file mode 100644 index 00000000..05f30d2f --- /dev/null +++ b/regression_tests/q3map2/segmentation_fault/README.txt @@ -0,0 +1,27 @@ +DESCRIPTION OF PROBLEM: +======================= + +The example map, maps/segmentation_fault.map, contains an example of this +bug. q3map2 might segfault while compiling this map. This sort of thing +might happen in certain intermediate versions of q3map2 while work is being +done on fixing the math accuracy. The bug may not have happened in older +version of q3map2, before the math accuracy issues were addressed. + +To trigger the bug, compile the map; you don't need -vis or -light. Only +-bsp (the first q3map2 stage) is necessary to trigger the bug. The only +entities in the map are a light and a info_player_deathmatch, so the map will +compile for any Q3 mod. + +Here is a description of the problem brush (brush #0): + + side 0: -z face + side 1: +z face + side 2: -y face + side 3: +x face + side 4: +y face + side 5: -x face + side 6: problem side "accidentally showed up" :-) + +Side 6 is actually a superfluous plane and will be NULL'ed out in the code. +If the code does not handle a NULL'ed out winding correctly, it will +segfault. diff --git a/regression_tests/q3map2/segmentation_fault/maps/segmentation_fault.map b/regression_tests/q3map2/segmentation_fault/maps/segmentation_fault.map new file mode 100644 index 00000000..6a0aecad --- /dev/null +++ b/regression_tests/q3map2/segmentation_fault/maps/segmentation_fault.map @@ -0,0 +1,79 @@ +// entity 0 +{ +"classname" "worldspawn" +// brush 0 +{ +( 10296 17600 -592 ) ( 10240 17600 -592 ) ( 10240 17472 -592 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 134217728 257 0 +( 10280 17472 -576 ) ( 10280 17600 -576 ) ( 10336 17600 -576 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 134217728 257 0 +( 10280 17472 -576 ) ( 10336 17472 -576 ) ( 10336 17472 -1600 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 134217728 257 0 +( 10367 17472 -576 ) ( 10367 17600 -576 ) ( 10367 17600 -1600 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 134217728 257 0 +( 10328 17727 -576 ) ( 10272 17727 -576 ) ( 10272 17727 -1600 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 134217728 257 0 +( 10240 17608 -576 ) ( 10240 17480 -576 ) ( 10240 17480 -1600 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 134217728 257 0 +( 10240 17727 -576 ) ( 10240 17726 -621 ) ( 10335 17727 -576 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 134217728 257 0 +} +// brush 1 +{ +( 10504 17800 -768 ) ( 10112 17800 -768 ) ( 10112 17792 -768 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10112 17792 -320 ) ( 10112 17800 -320 ) ( 10504 17800 -320 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10112 17792 -576 ) ( 10504 17792 -576 ) ( 10504 17792 -592 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( 10496 17792 -576 ) ( 10496 17800 -576 ) ( 10496 17800 -592 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10504 17800 -576 ) ( 10112 17800 -576 ) ( 10112 17800 -592 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10112 17800 -576 ) ( 10112 17792 -576 ) ( 10112 17792 -592 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 2 +{ +( 10496 17408 -768 ) ( 10112 17408 -768 ) ( 10112 17392 -768 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10112 17384 -320 ) ( 10112 17400 -320 ) ( 10496 17400 -320 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10112 17400 -544 ) ( 10496 17400 -544 ) ( 10496 17400 -768 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10496 17392 -544 ) ( 10496 17408 -544 ) ( 10496 17408 -768 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10496 17408 -544 ) ( 10112 17408 -544 ) ( 10112 17408 -768 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( 10112 17408 -544 ) ( 10112 17392 -544 ) ( 10112 17392 -768 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 3 +{ +( 10568 17784 -768 ) ( 10496 17784 -768 ) ( 10496 17408 -768 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10496 17408 -320 ) ( 10496 17784 -320 ) ( 10568 17784 -320 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10496 17408 -320 ) ( 10568 17408 -320 ) ( 10568 17408 -768 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10504 17400 -320 ) ( 10504 17776 -320 ) ( 10504 17776 -768 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10568 17792 -320 ) ( 10496 17792 -320 ) ( 10496 17792 -768 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10496 17784 -320 ) ( 10496 17408 -320 ) ( 10496 17408 -768 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 4 +{ +( 10112 17792 -768 ) ( 10072 17792 -768 ) ( 10072 17408 -768 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10072 17408 -320 ) ( 10072 17792 -320 ) ( 10112 17792 -320 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10072 17408 -320 ) ( 10112 17408 -320 ) ( 10112 17408 -768 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10112 17408 -320 ) ( 10112 17792 -320 ) ( 10112 17792 -768 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( 10112 17792 -320 ) ( 10072 17792 -320 ) ( 10072 17792 -768 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10104 17792 -320 ) ( 10104 17408 -320 ) ( 10104 17408 -768 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 5 +{ +( 10496 17792 -320 ) ( 10112 17792 -320 ) ( 10112 17408 -320 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( 10112 17408 -312 ) ( 10112 17792 -312 ) ( 10496 17792 -312 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10112 17408 -232 ) ( 10496 17408 -232 ) ( 10496 17408 -320 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10496 17408 -232 ) ( 10496 17792 -232 ) ( 10496 17792 -320 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10496 17792 -232 ) ( 10112 17792 -232 ) ( 10112 17792 -320 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10112 17792 -232 ) ( 10112 17408 -232 ) ( 10112 17408 -320 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 6 +{ +( 10496 17792 -776 ) ( 10112 17792 -776 ) ( 10112 17408 -776 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10112 17408 -768 ) ( 10112 17792 -768 ) ( 10496 17792 -768 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( 10112 17408 -768 ) ( 10496 17408 -768 ) ( 10496 17408 -856 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10496 17408 -768 ) ( 10496 17792 -768 ) ( 10496 17792 -856 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10496 17792 -768 ) ( 10112 17792 -768 ) ( 10112 17792 -856 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( 10112 17792 -768 ) ( 10112 17408 -768 ) ( 10112 17408 -856 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +} +// entity 1 +{ +"origin" "10312 17600 -480" +"classname" "info_player_deathmatch" +} +// entity 2 +{ +"light" "1000" +"origin" "10240 17608 -464" +"classname" "light" +} diff --git a/regression_tests/q3map2/segmentation_fault/textures/radiant_regression_tests/tile.tga b/regression_tests/q3map2/segmentation_fault/textures/radiant_regression_tests/tile.tga new file mode 100644 index 00000000..2154015f Binary files /dev/null and b/regression_tests/q3map2/segmentation_fault/textures/radiant_regression_tests/tile.tga differ diff --git a/regression_tests/q3map2/snap_plane/README.txt b/regression_tests/q3map2/snap_plane/README.txt new file mode 100644 index 00000000..d66196be --- /dev/null +++ b/regression_tests/q3map2/snap_plane/README.txt @@ -0,0 +1,45 @@ +DESCRIPTION OF PROBLEM: +======================= + +The example map, maps/snap_plane.map, contains an example of some bugs. +The green brush with the red face is transformed into something totally +unexpected. + +To trigger the bug, compile the map; you don't need -vis or -light. Only +-bsp (the first q3map2 stage) is necessary to trigger the bug. The only +entities in the map are a light and a info_player_deathmatch, so the map will +compile for any Q3 mod. + + +SOLUTION TO PROBLEM: +==================== + +I actually came up with this regression test after reading the code to +SnapPlane() and SnapNormal(). I decided to make this map as a test of +whether or not I understand how the code is broken. Sure enough, the map +is broken in the same way that I would expect it to be broken. + +The problem is that the red face of the green brush in the center of the room +is very close to being axially aligned, but not quite. This plane will +therefore be "snapped" to become axial. This is not the problem. The +problem is that after the snap, the plane will be shifted a great deal, +and the corner of the green brush will no longer come even close to meeting +the corner of the other cube brush next to it (the two corners of the two +brushes will drift apart a great deal). + +If you study the legacy SnapPlane() code, you will see that planes are +defined as a unit normal and distance from origin. Well, because +of the position of this brush on the side of the world extents (far from +the original), the snap will cause drastic effects on the points that the +plane was supposed to approximate. + +Another problem with SnapPlane() is that SnapNormal() snaps too liberally. +Once SnapNormal() is changed to only snap normals that are REALLY close +to axial (and not anything within 0.25 degrees), this bug will no longer +appear, but the SnapPlane() problem will still be present. So, this +regression test should be fixed BEFORE SnapNormal() is fixed, otherwise +create another regression test with a red face that is much much closer to +being axially aligned. We want to make sure that SnapPlane() is fixed when +things actually do get snapped. + +The code to address these issues is currently being worked on. diff --git a/regression_tests/q3map2/snap_plane/maps/snap_plane.map b/regression_tests/q3map2/snap_plane/maps/snap_plane.map new file mode 100644 index 00000000..e6d12389 --- /dev/null +++ b/regression_tests/q3map2/snap_plane/maps/snap_plane.map @@ -0,0 +1,89 @@ +// entity 0 +{ +"classname" "worldspawn" +// brush 0 +{ +( -54784 5760 -64 ) ( -54976 5760 -64 ) ( -54976 5632 -64 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -54976 5632 0 ) ( -54976 5760 0 ) ( -54784 5760 0 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -54976 5632 0 ) ( -54784 5632 0 ) ( -54784 5632 -64 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -54784 5632 0 ) ( -54784 5760 0 ) ( -54784 5760 -64 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -54784 5760 0 ) ( -54976 5760 0 ) ( -54976 5760 -64 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -54976 5760 0 ) ( -54976 5632 0 ) ( -54976 5632 -64 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 1 +{ +( -53808 5616 -64 ) ( -55064 5616 -64 ) ( -55064 4944 -64 ) radiant_regression_tests/green 0 0 0 0.500000 0.500000 0 0 0 +( -55072 4944 0 ) ( -55072 5616 0 ) ( -53816 5616 0 ) radiant_regression_tests/green 0 0 0 0.500000 0.500000 0 0 0 +( -55040 4096 8 ) ( -53784 4096 8 ) ( -53784 4096 0 ) radiant_regression_tests/green 0 0 0 0.500000 0.500000 0 0 0 +( -54272 4936 8 ) ( -54272 5608 8 ) ( -54272 5608 0 ) radiant_regression_tests/green 0 0 0 0.500000 0.500000 0 0 0 +( -53816 5632 8 ) ( -55072 5632 8 ) ( -55072 5632 0 ) radiant_regression_tests/green 0 0 0 0.500000 0.500000 0 0 0 +( -54784 5592 8 ) ( -54784 4920 8 ) ( -54784 4920 0 ) radiant_regression_tests/green 0 0 0 0.500000 0.500000 0 0 0 +( -54528 5632 -64 ) ( -54272 5631 -64 ) ( -54528 5632 0 ) radiant_regression_tests/red 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 2 +{ +( -54200 5904 -128 ) ( -55032 5904 -128 ) ( -55032 5824 -128 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -55024 5824 192 ) ( -55024 5904 192 ) ( -54192 5904 192 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -55040 5824 0 ) ( -54208 5824 0 ) ( -54208 5824 -64 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -54208 5824 0 ) ( -54208 5904 0 ) ( -54208 5904 -64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -54200 5832 0 ) ( -55032 5832 0 ) ( -55032 5832 -64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -55040 5904 0 ) ( -55040 5824 0 ) ( -55040 5824 -64 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 3 +{ +( -54144 5824 -128 ) ( -54208 5824 -128 ) ( -54208 5424 -128 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -54208 5424 192 ) ( -54208 5824 192 ) ( -54144 5824 192 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -54160 4032 192 ) ( -54096 4032 192 ) ( -54096 4032 -128 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -54200 5424 192 ) ( -54200 5824 192 ) ( -54200 5824 -128 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -54144 5824 192 ) ( -54208 5824 192 ) ( -54208 5824 -128 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -54208 5824 192 ) ( -54208 5424 192 ) ( -54208 5424 -128 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +} +// brush 4 +{ +( -54208 4032 -128 ) ( -54760 4032 -128 ) ( -54760 3944 -128 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -54760 3944 192 ) ( -54760 4032 192 ) ( -54208 4032 192 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -54752 4024 192 ) ( -54200 4024 192 ) ( -54200 4024 -128 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -54208 3944 192 ) ( -54208 4032 192 ) ( -54208 4032 -128 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -54208 4032 192 ) ( -54760 4032 192 ) ( -54760 4032 -128 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -55040 4016 192 ) ( -55040 3928 192 ) ( -55040 3928 -128 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 5 +{ +( -55040 5824 -128 ) ( -55256 5824 -128 ) ( -55256 5256 -128 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -55256 5256 192 ) ( -55256 5824 192 ) ( -55040 5824 192 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -55256 4032 192 ) ( -55040 4032 192 ) ( -55040 4032 -128 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -55040 5256 192 ) ( -55040 5824 192 ) ( -55040 5824 -128 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -55040 5824 192 ) ( -55256 5824 192 ) ( -55256 5824 -128 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -55048 5808 192 ) ( -55048 5240 192 ) ( -55048 5240 -128 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 6 +{ +( -54208 4032 192 ) ( -55040 4032 192 ) ( -55040 4024 192 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -55016 4024 200 ) ( -55016 4032 200 ) ( -54184 4032 200 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -55040 4032 296 ) ( -54208 4032 296 ) ( -54208 4032 192 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -54208 4024 296 ) ( -54208 4032 296 ) ( -54208 4032 192 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -54200 5824 296 ) ( -55032 5824 296 ) ( -55032 5824 192 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -55040 4032 296 ) ( -55040 4024 296 ) ( -55040 4024 192 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +// brush 7 +{ +( -54192 4560 -136 ) ( -55024 4560 -136 ) ( -55024 4552 -136 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -55040 4024 -128 ) ( -55040 4032 -128 ) ( -54208 4032 -128 ) radiant_regression_tests/tile 0 0 0 0.500000 0.500000 0 0 0 +( -55040 4032 -128 ) ( -54208 4032 -128 ) ( -54208 4032 -256 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -54208 4024 -128 ) ( -54208 4032 -128 ) ( -54208 4032 -256 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -54208 5824 -120 ) ( -55040 5824 -120 ) ( -55040 5824 -248 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +( -55040 4032 -128 ) ( -55040 4024 -128 ) ( -55040 4024 -256 ) common/caulk 0 0 0 0.500000 0.500000 0 4 0 +} +} +// entity 1 +{ +"light" "1000" +"origin" "-54664 5696 40" +"classname" "light" +} +// entity 2 +{ +"angle" "360" +"origin" "-54840 5696 88" +"classname" "info_player_deathmatch" +} diff --git a/regression_tests/q3map2/snap_plane/textures/radiant_regression_tests/green.tga b/regression_tests/q3map2/snap_plane/textures/radiant_regression_tests/green.tga new file mode 100644 index 00000000..8f6d3a49 Binary files /dev/null and b/regression_tests/q3map2/snap_plane/textures/radiant_regression_tests/green.tga differ diff --git a/regression_tests/q3map2/snap_plane/textures/radiant_regression_tests/red.tga b/regression_tests/q3map2/snap_plane/textures/radiant_regression_tests/red.tga new file mode 100644 index 00000000..eec24b6a Binary files /dev/null and b/regression_tests/q3map2/snap_plane/textures/radiant_regression_tests/red.tga differ diff --git a/regression_tests/q3map2/snap_plane/textures/radiant_regression_tests/tile.tga b/regression_tests/q3map2/snap_plane/textures/radiant_regression_tests/tile.tga new file mode 100644 index 00000000..2154015f Binary files /dev/null and b/regression_tests/q3map2/snap_plane/textures/radiant_regression_tests/tile.tga differ