trunk, as pertaining to q3map2. Some last-minute changes:
- EXPERIMENTAL_HIGH_PRECISION_MATH_Q3MAP2_FIXES, EXPERIMENTAL_SNAP_NORMAL_FIX,
and EXPERIMENTAL_SNAP_PLANE_FIX all set to 0 to make sure stuff in trunk
uses old "broken but stable" code, at least initially until there is further
testing done and/or some decision is made about which code to use.
- Fixing small typo in comment in PlaneEqual() in map.c.
- In comment to BaseWindingForPlane() function, describing why the old
function is broken as far as accuracy goes. This used to be a TODO.
- VectorIsOnAxialPlane() function comment fixed in mathlib.c.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@415 8a3a26a2-13c4-0310-b231-cf6edde360e5
code, etc.
- In CreateBrushWindings(), not going into FixWindingAccu() (in
EXPERIMENTAL_HIGH_PRECISION_MATH_Q3MAP2_FIXES code path) until a winding has
been chopped against all sides. I don't see any reason to do it the old way
of fixing the winding after each chop, especially since endpoints of the
winding may not naturally lie on integer endpoint at that point.
- In q3map2.h, setting normalEpsilon and distanceEpsilon based on
EXPERIMENTAL_SNAP_NORMAL_FIX and EXPERIMENTAL_HIGH_PRECISION_MATH_Q3MAP2_FIXES,
respectively. The epsilons are adjusted to compensate for the new nature
of the code.
- Removing unused "ourNormalEpsilon" in SnapNormal().
- In FindFloatPlane(), changing '>' to '>=' for comparison of distanceEpsilon
to be consistent with definition of epsilon and with other code.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@414 8a3a26a2-13c4-0310-b231-cf6edde360e5
to come up with this regression test, demonstrating the error, on my first
try.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@410 8a3a26a2-13c4-0310-b231-cf6edde360e5
- Improved comments on SnapWeldVectorAccu() and FixWindingAccu().
In particular, FixWindingAccu() has a new "protocol". The return value
now has a different meaning. qtrue means the winding was altered, qfalse
means it wasn't. The caller should check for degenerate windings (2 points
or less in winding). Also, input winding to FixWindingAccu() cannot be NULL,
otherwise error is raised. This is just cleaner in my opinion.
- In code that calls FixWindingAccu(), extra logic for handling NULL (which
now isn't allowed) and degenerate output winding (2 points or less).
- In ChopWindingInPlaceAccu() in polylib.c, factoring code a little bit to
reduce verbosity.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@409 8a3a26a2-13c4-0310-b231-cf6edde360e5
to be significantly broken, but I don't think it should be fixed at this point.
I'm beginning to think that FixWinding() should not be called during the
chop winding procedure.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@407 8a3a26a2-13c4-0310-b231-cf6edde360e5
parameters are NULL (instead of just returning). SnapWeldVectorAccu() is
going to be my next area of focus - much to be proofread there.
- Proofreading and changing FixWindingAccu(). Changes include for example if
a 3-pt winding is input, it always used to return valid. Now, it keeps
collapsing close points until there is just one point left. These changes
have not been tested yet.
- There was a bug in the original FixWinding() where if a dup point was at
the end of the winding, it didn't remove it properly. Fixed in
FixWindingAccu() (original function untouched).
- If any point is removed in FixWindingAccu(), the algorithm for removing
points is run from the beginning. This makes things more consistent.
So right now I have to test to see what happens if FixWindingAccu() returns
a winding that has less than 3 points. This could cause bad things to happen
such as segfault. I just don't know yet.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@406 8a3a26a2-13c4-0310-b231-cf6edde360e5
after there were unsaved buffers in emacs when I was quitting out of
everything. This is a comment in map.c related to USE_HASHING, and how we
should test points against the plane even if it's off. Speaking of which,
I should proofread the USE_HASHING hashing algorithm to make sure it's not
causing any problems.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@405 8a3a26a2-13c4-0310-b231-cf6edde360e5
- Removing redundant use of ourNormalEpsilon in SnapNormal(). The choice
for normalEpsilon is good for the long run in my opinion, even with the
change to SnapNormal().
- Adding "const" to function sig SnapPlaneImproved(), last arg.
- Adding function CopyWindingAccuIncreaseSizeAndFreeOld() in polylib.c,
needed by the chopping function.
- Tying up loose ends in ChopWindingInPlaceAccu() in polylib.c. Adding comment
related to duplicate plane. Chooseing maxpts more intelligently. If we
hit the maxpts bound, no problem! We dynamically increase the size of the
winding.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@404 8a3a26a2-13c4-0310-b231-cf6edde360e5
logic used '<=' in compare, new logic uses '<'. This was changed for two
reasons:
1. It adheres the the true meaning of epsilon, which is something along the
lines of "the minimum value that can be added to number X such that number X
takes on a new value after the addition" in computer science.
2. Other code that compares epsilons uses strict inequality, so I don't want
to have a case where to planes are reported equal but are not snapped
together, etc.
I still have to finish looking at where else PlaneEqual() is used and fix
related problems.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@403 8a3a26a2-13c4-0310-b231-cf6edde360e5
and SnapPlaneImprovedWithCenter(); SnapPlaneImproved() now takes a list of
points instead of the precomputed center.
- In FindFloatPlane(), using EXPERIMENTAL_SNAP_PLANE_FIX code even if
USE_HASHING is off.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@402 8a3a26a2-13c4-0310-b231-cf6edde360e5
- Adding EXPERIMENTAL_SNAP_PLANE_FIX #define to q3map2.h, it's now set to 1,
but will be set to 0 if and when we merge into trunk.
- SnapPlaneImproved() no longer takes the center argument but still
fixes the snap distance (only snap when normal is axial).
- Adding SnapPlaneImprovedWithCenter() that takes the center argument.
Basically renamed SnapPlaneImproved() from previous commit to
SnapPlaneImprovedWithCenter().
- Adding EXPERIMENTAL_SNAP_PLANE_FIX code block to FindFloatPlane() that
uses the experimental SnapPlane().
This is very much a work in progress, many more things to look at.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@401 8a3a26a2-13c4-0310-b231-cf6edde360e5
- Removing DIST_EPSILON #define from map.c. It's unused and only confuses
programmers.
- Adding new function SnapPlaneImproved() to map.c which is like
SnapPlane(), only it takes an additional argument which is the "center".
This new function is not being used anywhere yet.
- In mathlib, adding VectorIsOnAxis() and VectorIsOnAxialPlane(), two
convenience methods that will help make other code look more intuitive.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@400 8a3a26a2-13c4-0310-b231-cf6edde360e5
- Adding #define EXPERIMENTAL_SNAP_NORMAL_FIX to q3map2.h, it's now set to
1, but will be set to 0 if and when we merge to trunk.
- Removing NORMAL_EPSILON #define from map.c. It's not used and is
misleading.
- Adding EXPERIMENTAL_SNAP_NORMAL_FIX code block to SnapNormal() in map.c.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@398 8a3a26a2-13c4-0310-b231-cf6edde360e5
problem now after reading the code, and it's a horrid problem. Horrific.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@397 8a3a26a2-13c4-0310-b231-cf6edde360e5
to the code. This commit consists of some paragraphs of comments regarding
my thoughts about why SnapPlane() is broken.
Now that I understand how it's broken, it would be worthwhile to write some
regression tests that demonstrate the problems. I think I can do that now.
But so far hardly any bugs that I've experienced first-hand have been caused
by SnapPlane() issues. Now that I understand the theory behind it, I can
certainly expose some bugs with hand-crafted brushes.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@396 8a3a26a2-13c4-0310-b231-cf6edde360e5
- Setting EXPERIMENTAL_HIGH_PRECISION_MATH_Q3MAP2_FIXES to 1 (enabled). I'll
turn this off before merging into trunk.
- In function MapPlaneFromPoints() in map.c, doing a bit tighter math when
EXPERIMENTAL_HIGH_PRECISION_MATH_Q3MAP2_FIXES is on. This comes at the
expense of a few extra CPU cycles. The signature of the function remains
the same.
- In VectorNormalize() in mathlib.c, fixing a cast of the return value.
I did not see compile warnings or runtime errors, but it seems wrong the
way it was.
- Adding VectorNormalizeAccu() in mathlib.c, for normalizing vectors built on
the high resolution data type.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@395 8a3a26a2-13c4-0310-b231-cf6edde360e5
- Renaming CopyWindingAccuToNormal() to CopyWindingAccuToRegular() in order to
avoid confusing "normal" (as in "regular") with "normal" (as in the normal
to the plane).
- In mathlib.h/mathlib.c, breaking out all the *Accu() #define functions
into actual functions in mathlib.c. I think this is much safer for ensuring
that the correct types are passed in. Otherwise math might take place
in the 32 bit world without any warning.
- Adding VectorCopyAccuToRegular() and VectorCopyRegularToAccu() to mathlib.
- Improving comments on VEC_SMALLEST_EPSILON_AROUND_ONE and
VEC_ACCU_SMALLEST_EPSILON_AROUND_ONE.
- Had to "adjust" some code in polylib.c due to the change in functions
in mathlib (moving from #define to actual functions).
In case you're curious as to the correctness of this code at this point:
I was able to compile Icy Fantasy -bsp stage in the same amount of time that
it took in the original q3map2 (23 seconds to be exact), and there are no
more disappearing triangles. I'm almost positive the regression tests are
fixed at this point, but there is no hurry in testing them because I still
have to comb through quite a bit of code to ensure that things are being
done correctly with respect to math accuracy.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@394 8a3a26a2-13c4-0310-b231-cf6edde360e5
I really don't like how the prior operations were all done in 32 bit land.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@393 8a3a26a2-13c4-0310-b231-cf6edde360e5
(patch for regression test logging).
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@392 8a3a26a2-13c4-0310-b231-cf6edde360e5
EXPERIMENTAL_HIGH_PRECISION_MATH_Q3MAP2_FIXES code path.
Adding extra checks for NULL in the following functions:
- FreeWinding()
- FreeWindingAccu()
- CopyWinding()
- CopyWindingAccuToNormal()
If a NULL winding is passed to any of these functions, a graceful error will
result (as opposed to a segfault).
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@391 8a3a26a2-13c4-0310-b231-cf6edde360e5
Intead of #ifdef, now using #if.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@388 8a3a26a2-13c4-0310-b231-cf6edde360e5
Simplifying segmentation_fault and adding some random notes for regression
tests.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@387 8a3a26a2-13c4-0310-b231-cf6edde360e5
Fixing winding_logging.patch with some new code structure.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@385 8a3a26a2-13c4-0310-b231-cf6edde360e5
- Adding a bunch of *Accu() functions:
* SnapWeldVectorAccu() in brush.c (needs major proofread).
* FixWindingAccu() in brush.c (needs major proofread).
* CopyWindingAccuToNormal() in polylib.c.
* VectorLengthAccu() in mathlib.c.
* Q_rintAccu() in mathlib.h.
* FreeWindingAccu() declaration in polylib.h (was missing).
- Adding a #ifdef's for EXPERIMENTAL_HIGH_PRECISION_MATH_Q3MAP2_FIXES.
It's turned on now. Testing brush winding formation.
This code compiles on Linux, I have no idea if it works. About to test a
little, then going to bed.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@384 8a3a26a2-13c4-0310-b231-cf6edde360e5
- Added lengthy comment to describe the choice of smallestEpsilonAllowed
in polylib.c for the new 64 bit chopping code. I think that this comment
will allow us to make sure that we have the correct choice of epsilon.
- Tweaked comments around VEC_SMALLEST_EPSILON_AROUND_ONE and
VEC_ACCU_SMALLEST_EPSILON_AROUND_ONE (actually renamed them).
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@383 8a3a26a2-13c4-0310-b231-cf6edde360e5
- Adding new function ChopWindingInPlaceAccu() in polylib.c. This function is
just like ChopWindingInPlace() except that the winding input has the higher
vect_accu_t resolution. I actually did a deep massage of this code as well
(went over it with a fine-toothed comb). I still need to examine it at least
one more time when I'm fresh, and fix an issue related to choosing the value
for maxpts.
- In mathlib.h, defining VEC_SMALLEST_EPSILON and VEC_ACCU_SMALLEST_EPSILON
constants that will help determine suitable epsilons to use for certain
operations. Comments are provided detailing what these constants do.
- In mathlib.h, defining DotProductAccu() and VectorCopyAccu().
- Small comment in brush.c that has concerns about a certain use of
BaseWindingForPlane() in WriteBSPBrushMap().
State of this code is: compiles on Linux. May not compile on Windows. Not
tested (new functionality not used yet in any real code, only functions exist).
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@382 8a3a26a2-13c4-0310-b231-cf6edde360e5
- Adding new function BaseWindingForPlaneAccu() in polylib.c. Analogous to
original BaseWindingForPlane() only that the return value is a
winding_accu_t (new type w/ double precision). This function is not being
used yet.
- Restoring the original BaseWindingForPlane() function (pre-r371). Will keep
this as a reference. What I did exactly:
* Renamed BaseWindingForPlane() to BaseWindingForPlaneAccu(), changed stuff.
* Renamed _BaseWindingForPlane_orig_() to BaseWindingForPlane(), preserved.
- Adding things like vec_accu_t, vec3_accu_t, VectorSubtractAccu(),
VectorAddAccu(), VectorScaleAccu(), CrossProductAccu(), and
winding_accu_t. Also AllocWindingAccu() and FreeWindingAccu().
- Removing the recently added VectorSetLength() function because it is no
longer needed.
State of this code is: compiles, not tested (new functionality not used yet).
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@381 8a3a26a2-13c4-0310-b231-cf6edde360e5
starting out as a copy of trunk, revision 379. I may merge work done here
to trunk if the outcome is good.
This is going to be mostly for fixing the base winding accuracy issue.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/branches/Rambetter-math-fix-experiments@380 8a3a26a2-13c4-0310-b231-cf6edde360e5
commit). I have disovered the fundamental problem to the math error problems,
and although this commit (r377) is "correct", it fails to address the
fundamental problem. Therefore, I'd rather leave the code in a state that
has the exact same behavior as before until I get a chance to address the
fundamental issue.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/trunk@379 8a3a26a2-13c4-0310-b231-cf6edde360e5
be fixed for good until I look at the last bit of code that has not been
examined yet, which is the plane intersection code. I want the errors to be
much less than they are now, even though the disappearing_sliver* tests are
now working.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/trunk@378 8a3a26a2-13c4-0310-b231-cf6edde360e5
the approach that was committed in r375 (but was then backed out). I can't
believe my eyes, but I seem to be getting 0.000000% error in some of my
regression tests. The trick is to scale by a power of 2 and never do a
VectorNormalize().
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/trunk@377 8a3a26a2-13c4-0310-b231-cf6edde360e5
in BaseWindingForPlane(). This allows me to get rid of an extra call to
VectorSetLength() which contain floating point multiplications. Behavior
of BaseWindingForPlane() has been verified against base_winding regression
test (comparing output w/ logging patch).
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/trunk@375 8a3a26a2-13c4-0310-b231-cf6edde360e5
poking around at the numbers from disappearing_sliver2.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/trunk@374 8a3a26a2-13c4-0310-b231-cf6edde360e5
is totally unchanged, and I verified this by running extensive tests. The
only difference is that the math precision is much much better now.
Performance should be better as well (but that is not tested).
This is a major milestone because it fixes two regression tests:
disappearing_sliver2 and sparkly_seam.
Improvements to math precision is ongoing and more improvements can probably
be made even after this patch.
I will update the README.txt files in the regression tests in a separate
commit. This commit only includes the actual fixed code.
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant/trunk@371 8a3a26a2-13c4-0310-b231-cf6edde360e5